aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv')
-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;