diff options
author | John Baldwin <jhb@FreeBSD.org> | 2023-08-28 14:18:19 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2023-08-28 14:18:19 -0700 |
commit | 24ef2641d917695470fb2d43dabb133e3ee6678f (patch) | |
tree | e2c1d0a8672860555ec19964967dfebddb9a090e /gdb/amd64-fbsd-nat.c | |
parent | 22ca5c10279903a221ba4580afef71af0c639704 (diff) | |
download | binutils-24ef2641d917695470fb2d43dabb133e3ee6678f.zip binutils-24ef2641d917695470fb2d43dabb133e3ee6678f.tar.gz binutils-24ef2641d917695470fb2d43dabb133e3ee6678f.tar.bz2 |
gdb: Support XSAVE layouts for the current host in the FreeBSD x86 targets.
Use the CPUID instruction to fetch the offsets of supported state
components.
Approved-By: Simon Marchi <simon.marchi@efficios.com>
Diffstat (limited to 'gdb/amd64-fbsd-nat.c')
-rw-r--r-- | gdb/amd64-fbsd-nat.c | 40 |
1 files changed, 10 insertions, 30 deletions
diff --git a/gdb/amd64-fbsd-nat.c b/gdb/amd64-fbsd-nat.c index 43e83ff..5821d94 100644 --- a/gdb/amd64-fbsd-nat.c +++ b/gdb/amd64-fbsd-nat.c @@ -31,9 +31,9 @@ #include "amd64-tdep.h" #include "amd64-fbsd-tdep.h" +#include "i387-tdep.h" #include "amd64-nat.h" #include "x86-nat.h" -#include "gdbsupport/x86-xstate.h" #include "x86-fbsd-nat.h" class amd64_fbsd_nat_target final : public x86_fbsd_nat_target @@ -47,10 +47,6 @@ public: static amd64_fbsd_nat_target the_amd64_fbsd_nat_target; -#ifdef PT_GETXSTATE_INFO -static size_t xsave_len; -#endif - /* This is a layout of the amd64 'struct reg' but with i386 registers. */ @@ -146,9 +142,9 @@ amd64_fbsd_nat_target::fetch_registers (struct regcache *regcache, int regnum) fetching the FPU/XSAVE state unnecessarily. */ #ifdef PT_GETXSTATE_INFO - if (xsave_len != 0) + if (m_xsave_info.xsave_len != 0) { - void *xstateregs = alloca (xsave_len); + void *xstateregs = alloca (m_xsave_info.xsave_len); if (ptrace (PT_GETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); @@ -223,9 +219,9 @@ amd64_fbsd_nat_target::store_registers (struct regcache *regcache, int regnum) fetching the FPU/XSAVE state unnecessarily. */ #ifdef PT_GETXSTATE_INFO - if (xsave_len != 0) + if (m_xsave_info.xsave_len != 0) { - void *xstateregs = alloca (xsave_len); + void *xstateregs = alloca (m_xsave_info.xsave_len); if (ptrace (PT_GETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) perror_with_name (_("Couldn't get extended state status")); @@ -233,7 +229,7 @@ amd64_fbsd_nat_target::store_registers (struct regcache *regcache, int regnum) amd64_collect_xsave (regcache, regnum, xstateregs, 0); if (ptrace (PT_SETXSTATE, pid, (PTRACE_TYPE_ARG3) xstateregs, - xsave_len) == -1) + m_xsave_info.xsave_len) == -1) perror_with_name (_("Couldn't write extended state status")); return; } @@ -303,10 +299,6 @@ amd64fbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) const struct target_desc * amd64_fbsd_nat_target::read_description () { -#ifdef PT_GETXSTATE_INFO - static int xsave_probed; - static uint64_t xcr0; -#endif struct reg regs; int is64; @@ -318,25 +310,13 @@ amd64_fbsd_nat_target::read_description () perror_with_name (_("Couldn't get registers")); is64 = (regs.r_cs == GSEL (GUCODE_SEL, SEL_UPL)); #ifdef PT_GETXSTATE_INFO - if (!xsave_probed) - { - struct ptrace_xstate_info info; - - if (ptrace (PT_GETXSTATE_INFO, inferior_ptid.pid (), - (PTRACE_TYPE_ARG3) &info, sizeof (info)) == 0) - { - xsave_len = info.xsave_len; - xcr0 = info.xsave_mask; - } - xsave_probed = 1; - } - - if (xsave_len != 0) + probe_xsave_layout (inferior_ptid.pid ()); + if (m_xsave_info.xsave_len != 0) { if (is64) - return amd64_target_description (xcr0, true); + return amd64_target_description (m_xsave_info.xsave_mask, true); else - return i386_target_description (xcr0, true); + return i386_target_description (m_xsave_info.xsave_mask, true); } #endif if (is64) |