X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Famd64-fbsd-tdep.c;h=7c3e33644e1083a11c03cfb83eb9bb96e90da78b;hb=581bea2c99751391fc49d104d5eacb85bfb63c96;hp=0047e2ce24efc7012850f556833a0d24e2cc39d6;hpb=481695ed5f6e0a8a9c9c50bfac1cdd2b3151e6c9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c index 0047e2ce24..7c3e33644e 100644 --- a/gdb/amd64-fbsd-tdep.c +++ b/gdb/amd64-fbsd-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for FreeBSD/amd64. - Copyright (C) 2003-2017 Free Software Foundation, Inc. + Copyright (C) 2003-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -25,11 +25,12 @@ #include "osabi.h" #include "regset.h" #include "i386-fbsd-tdep.h" -#include "x86-xstate.h" +#include "gdbsupport/x86-xstate.h" #include "amd64-tdep.h" #include "fbsd-tdep.h" #include "solib-svr4.h" +#include "inferior.h" /* Support for signal handlers. */ @@ -156,7 +157,7 @@ amd64fbsd_core_read_description (struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd) { - return amd64_target_description (i386fbsd_core_read_xcr0 (abfd)); + return amd64_target_description (i386fbsd_core_read_xcr0 (abfd), true); } /* Similar to amd64_supply_fpregset, but use XSAVE extended state. */ @@ -196,12 +197,35 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch, { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - cb (".reg", tdep->sizeof_gregset, &i386_gregset, NULL, cb_data); - cb (".reg2", tdep->sizeof_fpregset, &amd64_fpregset, NULL, cb_data); - cb (".reg-xstate", X86_XSTATE_SIZE(tdep->xcr0), + cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL, + cb_data); + cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &amd64_fpregset, + NULL, cb_data); + cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), X86_XSTATE_SIZE (tdep->xcr0), &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 (current_inferior ()->process_target (), + 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) { @@ -218,7 +242,7 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->sizeof_gregset = 22 * 8; amd64_init_abi (info, gdbarch, - amd64_target_description (X86_XSTATE_SSE_MASK)); + amd64_target_description (X86_XSTATE_SSE_MASK, true)); tdep->sigtramp_p = amd64fbsd_sigtramp_p; tdep->sigtramp_start = amd64fbsd_sigtramp_start_addr; @@ -239,10 +263,16 @@ 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 _initialize_amd64fbsd_tdep (); void -_initialize_amd64fbsd_tdep (void) +_initialize_amd64fbsd_tdep () { gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, GDB_OSABI_FREEBSD, amd64fbsd_init_abi);