X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Famd64-fbsd-tdep.c;h=493e630974d46e4bfbad0c310021b28c688f54b0;hb=3cb5a3a16af2cae1a5059b7571c514b3fa575df9;hp=bd591af6f9ab6be2a241cad4d8b21550ebbf7571;hpb=1736a7bd96e8927c3f889a35f9153df4fd19d833;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/amd64-fbsd-tdep.c b/gdb/amd64-fbsd-tdep.c index bd591af6f9..493e630974 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-2016 Free Software Foundation, Inc. + Copyright (C) 2003-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -25,10 +25,9 @@ #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 "bsd-uthread.h" #include "fbsd-tdep.h" #include "solib-svr4.h" @@ -150,28 +149,6 @@ int amd64fbsd_sc_reg_offset[] = -1 /* %gs */ }; -/* From /usr/src/lib/libc/amd64/gen/_setjmp.S. */ -static int amd64fbsd_jmp_buf_reg_offset[] = -{ - -1, /* %rax */ - 1 * 8, /* %rbx */ - -1, /* %rcx */ - -1, /* %rdx */ - -1, /* %rsi */ - -1, /* %rdi */ - 3 * 8, /* %rbp */ - 2 * 8, /* %rsp */ - -1, /* %r8 ... */ - -1, - -1, - -1, /* ... %r11 */ - 4 * 8, /* %r12 ... */ - 5 * 8, - 6 * 8, - 7 * 8, /* ... %r15 */ - 0 * 8 /* %rip */ -}; - /* Implement the core_read_description gdbarch method. */ static const struct target_desc * @@ -179,7 +156,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. */ @@ -219,50 +196,32 @@ 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); } -static void -amd64fbsd_supply_uthread (struct regcache *regcache, - int regnum, CORE_ADDR addr) -{ - gdb_byte buf[8]; - int i; - - gdb_assert (regnum >= -1); - - for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++) - { - if (amd64fbsd_jmp_buf_reg_offset[i] != -1 - && (regnum == -1 || regnum == i)) - { - read_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8); - regcache_raw_supply (regcache, i, buf); - } - } -} +/* Implement the get_thread_local_address gdbarch method. */ -static void -amd64fbsd_collect_uthread (const struct regcache *regcache, - int regnum, CORE_ADDR addr) +static CORE_ADDR +amd64fbsd_get_thread_local_address (struct gdbarch *gdbarch, ptid_t ptid, + CORE_ADDR lm_addr, CORE_ADDR offset) { - gdb_byte buf[8]; - int i; - - gdb_assert (regnum >= -1); - - for (i = 0; i < ARRAY_SIZE (amd64fbsd_jmp_buf_reg_offset); i++) - { - if (amd64fbsd_jmp_buf_reg_offset[i] != -1 - && (regnum == -1 || regnum == i)) - { - regcache_raw_collect (regcache, i, buf); - write_memory (addr + amd64fbsd_jmp_buf_reg_offset[i], buf, 8); - } - } + 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 @@ -280,7 +239,8 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->gregset_num_regs = ARRAY_SIZE (amd64fbsd_r_reg_offset); tdep->sizeof_gregset = 22 * 8; - amd64_init_abi (info, gdbarch); + amd64_init_abi (info, gdbarch, + amd64_target_description (X86_XSTATE_SSE_MASK, true)); tdep->sigtramp_p = amd64fbsd_sigtramp_p; tdep->sigtramp_start = amd64fbsd_sigtramp_start_addr; @@ -298,18 +258,15 @@ amd64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_core_read_description (gdbarch, amd64fbsd_core_read_description); - /* FreeBSD provides a user-level threads implementation. */ - bsd_uthread_set_supply_uthread (gdbarch, amd64fbsd_supply_uthread); - bsd_uthread_set_collect_uthread (gdbarch, amd64fbsd_collect_uthread); - /* FreeBSD uses SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); -} - -/* Provide a prototype to silence -Wmissing-prototypes. */ -void _initialize_amd64fbsd_tdep (void); + 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)