From b0f87ed032bb68a9965de81cbf9fd676a83b9174 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 12 Mar 2019 13:39:02 -0700 Subject: [PATCH] Support TLS variables on FreeBSD/riscv. Derive the pointer to the DTV array from the tp register. gdb/ChangeLog: * riscv-fbsd-tdep.c (riscv_fbsd_get_thread_local_address): New. (riscv_fbsd_init_abi): Install gdbarch "fetch_tls_load_module_address" and "get_thread_local_address" methods. --- gdb/ChangeLog | 7 +++++++ gdb/riscv-fbsd-tdep.c | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b26f554e47d..741799d8b3e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2019-03-12 John Baldwin + + * riscv-fbsd-tdep.c (riscv_fbsd_get_thread_local_address): New. + (riscv_fbsd_init_abi): Install gdbarch + "fetch_tls_load_module_address" and "get_thread_local_address" + methods. + 2019-03-12 John Baldwin * i386-fbsd-tdep.c (i386fbsd_get_thread_local_address): New. diff --git a/gdb/riscv-fbsd-tdep.c b/gdb/riscv-fbsd-tdep.c index 97ad28f59ae..3125a2285e1 100644 --- a/gdb/riscv-fbsd-tdep.c +++ b/gdb/riscv-fbsd-tdep.c @@ -174,6 +174,28 @@ static const struct tramp_frame riscv_fbsd_sigframe = riscv_fbsd_sigframe_init }; +/* Implement the "get_thread_local_address" gdbarch method. */ + +static CORE_ADDR +riscv_fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid, + CORE_ADDR lm_addr, CORE_ADDR offset) +{ + struct regcache *regcache; + + regcache = get_thread_arch_regcache (ptid, gdbarch); + + target_fetch_registers (regcache, RISCV_TP_REGNUM); + + ULONGEST tp; + if (regcache->cooked_read (RISCV_TP_REGNUM, &tp) != REG_VALID) + error (_("Unable to fetch %%tp")); + + /* %tp points to the end of the TCB which contains two pointers. + The first pointer in the TCB points to the DTV array. */ + CORE_ADDR dtv_addr = tp - (gdbarch_ptr_bit (gdbarch) / 8) * 2; + return fbsd_get_thread_local_address (gdbarch, dtv_addr, lm_addr, offset); +} + /* Implement the 'init_osabi' method of struct gdb_osabi_handler. */ static void @@ -193,6 +215,11 @@ riscv_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_iterate_over_regset_sections (gdbarch, riscv_fbsd_iterate_over_regset_sections); + + set_gdbarch_fetch_tls_load_module_address (gdbarch, + svr4_fetch_objfile_link_map); + set_gdbarch_get_thread_local_address (gdbarch, + riscv_fbsd_get_thread_local_address); } void -- 2.30.2