about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h28
1 files changed, 21 insertions, 7 deletions
diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h b/sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h
index 3426d8c47e..3ebb271973 100644
--- a/sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h
+++ b/sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h
@@ -43,9 +43,10 @@ struct _xmmreg
   __uint32_t	element[4];
 };
 
-/* This is FXSAVE layout without 64bit prefix thus 32bit
-   compatible. This means that the IP and DPs are only 32bit and are
-   not useful in 64bit space.  */
+
+
+#if __WORDSIZE == 32
+
 struct _fpstate
 {
   /* Regular FPU environment.  */
@@ -65,13 +66,10 @@ struct _fpstate
   __uint32_t		mxcsr;
   __uint32_t		reserved;
   struct _fpxreg _fxsr_st[8];
-  struct _xmmreg _xmm[8];	/* It's actually 16 for x86-64.	 */
+  struct _xmmreg _xmm[8];
   __uint32_t		padding[56];
 };
 
-
-#if __WORDSIZE == 32
-
 struct sigcontext
 {
   unsigned short gs, __gsh;
@@ -100,6 +98,22 @@ struct sigcontext
 
 #else
 
+struct _fpstate
+{
+  /* Regular FPU environment.  */
+  __uint16_t		cwd;
+  __uint16_t		swd;
+  __uint16_t		twd;
+  __uint16_t		fop;
+  __uint64_t		rip;
+  __uint64_t		rdp;
+  __uint32_t		mxcsr;
+  __uint32_t		mxcr_mask;
+  __uint32_t 		st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
+  __uint32_t		xmm_space[64];  /* 16*16 bytes for each XMM-reg = 128 bytes */
+  __uint32_t		padding[24];
+};
+
 struct sigcontext
 {
   unsigned short gs, __gsh;