aboutsummaryrefslogtreecommitdiff
path: root/sys/x86/include/reg.h
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2022-03-24 18:36:19 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2022-03-24 18:36:19 +0000
commit931983ee0864079c5f1be0a6b3b9ef097d84ffba (patch)
tree2a3445586ca45c1853374d197e8fd672256bb296 /sys/x86/include/reg.h
parent196cfd0b2eb640a63d007a7e9c3a74e4256255f3 (diff)
downloadsrc-931983ee0864079c5f1be0a6b3b9ef097d84ffba.tar.gz
src-931983ee0864079c5f1be0a6b3b9ef097d84ffba.zip
x86: Add a NT_X86_SEGBASES register set.
This register set contains the values of the fsbase and gsbase registers. Note that these registers can already be controlled individually via ptrace(2) via MD operations, so the main reason for adding this is to include these register values in core dumps. In particular, this will enable looking up the value of TLS variables from core dumps in gdb. The value of NT_X86_SEGBASES was chosen to match the value of NT_386_TLS on Linux. The notes serve similar purposes, but FreeBSD will never dump a note equivalent to NT_386_TLS (which dumps a single segment descriptor rather than a pair of addresses) and picking a currently-unused value in the NT_X86_* range could result in a future conflict. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D34650
Diffstat (limited to 'sys/x86/include/reg.h')
-rw-r--r--sys/x86/include/reg.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/x86/include/reg.h b/sys/x86/include/reg.h
index 7be3e24850c3..e237b080be1c 100644
--- a/sys/x86/include/reg.h
+++ b/sys/x86/include/reg.h
@@ -86,6 +86,7 @@
#define __reg32 reg
#define __fpreg32 fpreg
#define __dbreg32 dbreg
+#define __segbasereg32 segbasereg
#else
#define __reg32 reg32
#define __reg64 reg
@@ -93,6 +94,8 @@
#define __fpreg64 fpreg
#define __dbreg32 dbreg32
#define __dbreg64 dbreg
+#define __segbasereg32 segbasereg32
+#define __segbasereg64 segbasereg
#define __HAVE_REG32
#endif
@@ -236,12 +239,27 @@ struct __dbreg64 {
#define DBREG_DRX(d,x) ((d)->dr[(x)]) /* reference dr0 - dr7 by
register number */
+/*
+ * Register set accessible via NT_X86_SEGBASES.
+ */
+struct __segbasereg32 {
+ __uint32_t r_fsbase;
+ __uint32_t r_gsbase;
+};
+
+struct __segbasereg64 {
+ __uint64_t r_fsbase;
+ __uint64_t r_gsbase;
+};
+
#undef __reg32
#undef __reg64
#undef __fpreg32
#undef __fpreg64
#undef __dbreg32
#undef __dbreg64
+#undef __segbasereg32
+#undef __segbasereg64
#ifdef _KERNEL
/*