x86: support fs_base and gs_base for 32-bit inferiors on 64-bit kernels

On Linux 64-bit kernels provide fs_base and gs_base also for 32-bit
inferiors.  Add support for those registers.

Also check for HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE consistently.

Signed-off-by: Markus Metzger  <markus.t.metzger@intel.com>

gdb/
	* amd64-linux-nat.c (amd64_linux_gregset32_reg_offset): Add FS_BASE
	and GS_BASE offsets.
	* amd64-linux-tdep.c (amd64_linux_gregset_reg_offset): Check
	HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE.
	(amd64_linux_read_description): Enable segments if
	HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE.
	* i386-linux-tdep.c (i386_linux_gregset_reg_offset): Add -1 for
	FS_BASE and GS_BASE offsets.
	(i386_linux_read_description): Enable segments if
	HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE.
	* i386-linux-tdep.h (I386_LINUX_ORIG_EAX_REGNUM): Update.

Change-Id: I030b500a7a5b087452a78c3e0545d6e6e65146aa
This commit is contained in:
Markus Metzger
2019-11-22 16:55:14 +01:00
parent 9db9f4a7a1
commit 3e7fa952aa
4 changed files with 25 additions and 3 deletions

View File

@@ -85,6 +85,11 @@ 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 */
#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
FS_BASE * 8, GS_BASE * 8, /* fs_base and gs_base */
#else
-1, -1, /* fs_base and gs_base */
#endif
ORIG_RAX * 8 /* "orig_eax" */
};

View File

@@ -98,7 +98,11 @@ int amd64_linux_gregset_reg_offset[] =
-1, /* PKEYS register pkru */
/* End of hardware registers */
#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
21 * 8, 22 * 8, /* fs_base and gs_base. */
#else
-1, -1, /* fs_base and gs_base. */
#endif
15 * 8 /* "orig_rax" */
};
@@ -1593,9 +1597,15 @@ amd64_linux_read_description (uint64_t xcr0_features_bit, bool is_x32)
[(xcr0_features_bit & X86_XSTATE_PKRU) ? 1 : 0];
}
#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
const bool segment = true;
#else
const bool segment = false;
#endif
if (*tdesc == NULL)
*tdesc = amd64_create_target_description (xcr0_features_bit, is_x32,
true, true);
true, segment);
return *tdesc;
}

View File

@@ -609,6 +609,7 @@ int i386_linux_gregset_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, /* PKRU register */
-1, -1, /* fs_base and gs_base. */
11 * 4, /* "orig_eax" */
};
@@ -692,8 +693,14 @@ i386_linux_read_description (uint64_t xcr0)
[(xcr0 & X86_XSTATE_AVX512) ? 1 : 0]
[(xcr0 & X86_XSTATE_PKRU) ? 1 : 0];
#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
const bool segment = true;
#else
const bool segment = false;
#endif
if (*tdesc == NULL)
*tdesc = i386_create_target_description (xcr0, true, false);
*tdesc = i386_create_target_description (xcr0, true, segment);
return *tdesc;
}

View File

@@ -29,7 +29,7 @@
/* Register number for the "orig_eax" pseudo-register. If this
pseudo-register contains a value >= 0 it is interpreted as the
system call number that the kernel is supposed to restart. */
#define I386_LINUX_ORIG_EAX_REGNUM (I386_PKRU_REGNUM + 1)
#define I386_LINUX_ORIG_EAX_REGNUM (I386_GSBASE_REGNUM + 1)
/* Total number of registers for GNU/Linux. */
#define I386_LINUX_NUM_REGS (I386_LINUX_ORIG_EAX_REGNUM + 1)