diff options
Diffstat (limited to 'gdb/amd64-linux-nat.c')
-rw-r--r-- | gdb/amd64-linux-nat.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c index 75e63c6..4b23fd9 100644 --- a/gdb/amd64-linux-nat.c +++ b/gdb/amd64-linux-nat.c @@ -32,6 +32,7 @@ #include "amd64-tdep.h" #include "amd64-linux-tdep.h" #include "i386-linux-tdep.h" +#include "x86-tdep.h" #include "gdbsupport/x86-xstate.h" #include "x86-linux-nat.h" @@ -86,6 +87,8 @@ static int amd64_linux_gregset32_reg_offset[] = -1, -1, -1, -1, -1, -1, -1, -1, /* k0 ... k7 (AVX512) */ -1, -1, -1, -1, -1, -1, -1, -1, /* zmm0 ... zmm7 (AVX512) */ -1, /* PKEYS register PKRU */ + -1, /* SSP register. */ + -1, -1, /* fs/gs base registers. */ ORIG_RAX * 8 /* "orig_eax" */ }; @@ -237,6 +240,14 @@ amd64_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum) if (have_ptrace_getregset == TRIBOOL_TRUE) { + if ((regnum == -1 && tdep->ssp_regnum != -1) + || (regnum != -1 && regnum == tdep->ssp_regnum)) + { + x86_linux_fetch_ssp (regcache, tid); + if (regnum != -1) + return; + } + /* Pre-4.14 kernels have a bug (fixed by commit 0852b374173b "x86/fpu: Add FPU state copying quirk to handle XRSTOR failure on Intel Skylake CPUs") that sometimes causes the mxcsr location in @@ -302,6 +313,14 @@ amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum) if (have_ptrace_getregset == TRIBOOL_TRUE) { gdb::byte_vector xstateregs (tdep->xsave_layout.sizeof_xsave); + if ((regnum == -1 && tdep->ssp_regnum != -1) + || (regnum != -1 && regnum == tdep->ssp_regnum)) + { + x86_linux_store_ssp (regcache, tid); + if (regnum != -1) + return; + } + struct iovec iov; iov.iov_base = xstateregs.data (); @@ -424,9 +443,7 @@ amd64_linux_nat_target::low_siginfo_fixup (siginfo_t *ptrace, return false; } -void _initialize_amd64_linux_nat (); -void -_initialize_amd64_linux_nat () +INIT_GDB_FILE (amd64_linux_nat) { amd64_native_gregset32_reg_offset = amd64_linux_gregset32_reg_offset; amd64_native_gregset32_num_regs = I386_LINUX_NUM_REGS; |