svn commit: r190616 - in head/sys: amd64/include compat/ia32 i386/include

Konstantin Belousov kib at FreeBSD.org
Wed Apr 1 05:44:18 PDT 2009


Author: kib
Date: Wed Apr  1 12:44:17 2009
New Revision: 190616
URL: http://svn.freebsd.org/changeset/base/190616

Log:
  Add all segment registers for the amd64 CPU to struct reg and mcontext.
  To keep these structures ABI-compatible, half the size of r_trapno,
  r_err, mc_trapno, mc_flags.
  
  Add fsbase and gsbase to mcontext on both amd64 and i386.
  Add flags to amd64 mcontext to indicate that it contains valid segments
  or bases.
  
  In collaboration with:	pho
  Discussed with:	peter
  Reviewed by:	jhb

Modified:
  head/sys/amd64/include/reg.h
  head/sys/amd64/include/ucontext.h
  head/sys/compat/ia32/ia32_signal.h
  head/sys/i386/include/ucontext.h

Modified: head/sys/amd64/include/reg.h
==============================================================================
--- head/sys/amd64/include/reg.h	Wed Apr  1 12:31:04 2009	(r190615)
+++ head/sys/amd64/include/reg.h	Wed Apr  1 12:44:17 2009	(r190616)
@@ -56,8 +56,12 @@ struct reg {
 	register_t	r_rdx;
 	register_t	r_rcx;
 	register_t	r_rax;
-	register_t	r_trapno;
-	register_t	r_err;
+	uint32_t	r_trapno;
+	uint16_t	r_fs;
+	uint16_t	r_gs;
+	uint32_t	r_err;
+	uint16_t	r_es;
+	uint16_t	r_ds;
 	register_t	r_rip;
 	register_t	r_cs;
 	register_t	r_rflags;

Modified: head/sys/amd64/include/ucontext.h
==============================================================================
--- head/sys/amd64/include/ucontext.h	Wed Apr  1 12:31:04 2009	(r190615)
+++ head/sys/amd64/include/ucontext.h	Wed Apr  1 12:44:17 2009	(r190616)
@@ -32,9 +32,16 @@
 #ifndef _MACHINE_UCONTEXT_H_
 #define	_MACHINE_UCONTEXT_H_
 
+/*
+ * mc_trapno bits. Shall be in sync with TF_XXX.
+ */
+#define	_MC_HASSEGS	0x1
+#define	_MC_HASBASES	0x2
+#define	_MC_FLAG_MASK	(_MC_HASSEGS | _MC_HASBASES)
+
 typedef struct __mcontext {
 	/*
-	 * The first 20 fields must match the definition of
+	 * The first 24 fields must match the definition of
 	 * sigcontext. So that we can support sigcontext
 	 * and ucontext_t at the same time.
 	 */
@@ -54,9 +61,13 @@ typedef struct __mcontext {
 	__register_t	mc_r13;
 	__register_t	mc_r14;
 	__register_t	mc_r15;
-	__register_t	mc_trapno;
+	__uint32_t	mc_trapno;
+	__uint16_t	mc_fs;
+	__uint16_t	mc_gs;
 	__register_t	mc_addr;
-	__register_t	mc_flags;
+	__uint32_t	mc_flags;
+	__uint16_t	mc_es;
+	__uint16_t	mc_ds;
 	__register_t	mc_err;
 	__register_t	mc_rip;
 	__register_t	mc_cs;
@@ -65,6 +76,7 @@ typedef struct __mcontext {
 	__register_t	mc_ss;
 
 	long	mc_len;			/* sizeof(mcontext_t) */
+
 #define	_MC_FPFMT_NODEV		0x10000	/* device not present or configured */
 #define	_MC_FPFMT_XMM		0x10002
 	long	mc_fpformat;
@@ -76,7 +88,11 @@ typedef struct __mcontext {
 	 * See <machine/fpu.h> for the internals of mc_fpstate[].
 	 */
 	long	mc_fpstate[64] __aligned(16);
-	long	mc_spare[8];
+
+	__register_t	mc_fsbase;
+	__register_t	mc_gsbase;
+
+	long	mc_spare[6];
 } mcontext_t;
 
 #endif /* !_MACHINE_UCONTEXT_H_ */

Modified: head/sys/compat/ia32/ia32_signal.h
==============================================================================
--- head/sys/compat/ia32/ia32_signal.h	Wed Apr  1 12:31:04 2009	(r190615)
+++ head/sys/compat/ia32/ia32_signal.h	Wed Apr  1 12:44:17 2009	(r190616)
@@ -59,7 +59,9 @@ struct ia32_mcontext {
 	 * See <i386/include/npx.h> for the internals of mc_fpstate[].
 	 */
 	u_int32_t	mc_fpstate[128] __aligned(16);
-	u_int32_t	mc_spare2[8];
+	u_int32_t	mc_fsbase;
+	u_int32_t	mc_gsbase;
+	u_int32_t	mc_spare2[6];
 };
 
 struct ia32_ucontext {

Modified: head/sys/i386/include/ucontext.h
==============================================================================
--- head/sys/i386/include/ucontext.h	Wed Apr  1 12:31:04 2009	(r190615)
+++ head/sys/i386/include/ucontext.h	Wed Apr  1 12:44:17 2009	(r190616)
@@ -72,10 +72,15 @@ typedef struct __mcontext {
 	 * See <machine/npx.h> for the internals of mc_fpstate[].
 	 */
 	int	mc_fpstate[128] __aligned(16);
-	int	mc_spare2[8];
+
+	__register_t mc_fsbase;
+	__register_t mc_gsbase;
+
+	int	mc_spare2[6];
 } mcontext_t;
 
 #if defined(_KERNEL) && defined(COMPAT_FREEBSD4)
+
 struct mcontext4 {
 	__register_t	mc_onstack;	/* XXX - sigcontext compat. */
 	__register_t	mc_gs;		/* machine state (struct trapframe) */


More information about the svn-src-head mailing list