diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h')
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h | 28 |
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; |