summaryrefslogtreecommitdiff
path: root/devel/gdb/files/commit-f5424cfa7e
diff options
context:
space:
mode:
Diffstat (limited to 'devel/gdb/files/commit-f5424cfa7e')
-rw-r--r--devel/gdb/files/commit-f5424cfa7e63
1 files changed, 63 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-f5424cfa7e b/devel/gdb/files/commit-f5424cfa7e
new file mode 100644
index 000000000000..2dc05f554234
--- /dev/null
+++ b/devel/gdb/files/commit-f5424cfa7e
@@ -0,0 +1,63 @@
+commit f5424cfa7e9337a6cb02a1f83c9feea0995c5350
+Author: John Baldwin <jhb@FreeBSD.org>
+Date: Tue Mar 12 13:39:02 2019 -0700
+
+ Support TLS variables on FreeBSD/amd64.
+
+ Use the fs_base register to fetch the address of a thread's tcb and
+ calculate the address of the DTV array. This value is then passed to
+ fbsd_get_thread_local_address to compute the final variable address.
+
+ Note that fs_base is currently only available via the native target as
+ core dumps on FreeBSD do not store the value of fs_base.
+
+ gdb/ChangeLog:
+
+ * amd64-fbsd-tdep.c (amd64fbsd_get_thread_local_address): New.
+ (amd64fbsd_init_abi): Install gdbarch
+ "fetch_tls_load_module_address" and "get_thread_local_address"
+ methods.
+
+diff --git gdb/amd64-fbsd-tdep.c gdb/amd64-fbsd-tdep.c
+index 403e65022d..7e2e9edf21 100644
+--- gdb/amd64-fbsd-tdep.c
++++ gdb/amd64-fbsd-tdep.c
+@@ -204,6 +204,26 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
+ &amd64fbsd_xstateregset, "XSAVE extended state", cb_data);
+ }
+
++/* Implement the get_thread_local_address gdbarch method. */
++
++static CORE_ADDR
++amd64fbsd_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, AMD64_FSBASE_REGNUM);
++
++ ULONGEST fsbase;
++ if (regcache->cooked_read (AMD64_FSBASE_REGNUM, &fsbase) != REG_VALID)
++ error (_("Unable to fetch %%fsbase"));
++
++ CORE_ADDR dtv_addr = fsbase + gdbarch_ptr_bit (gdbarch) / 8;
++ return fbsd_get_thread_local_address (gdbarch, dtv_addr, lm_addr, offset);
++}
++
+ static void
+ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ {
+@@ -241,6 +261,11 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ /* FreeBSD uses SVR4-style shared libraries. */
+ set_solib_svr4_fetch_link_map_offsets
+ (gdbarch, svr4_lp64_fetch_link_map_offsets);
++
++ set_gdbarch_fetch_tls_load_module_address (gdbarch,
++ svr4_fetch_objfile_link_map);
++ set_gdbarch_get_thread_local_address (gdbarch,
++ amd64fbsd_get_thread_local_address);
+ }
+
+ void