1 #ifndef _ASM_X86_SIGCONTEXT_H 2 #define _ASM_X86_SIGCONTEXT_H 3 4 #include <asm/types.h> 5 6 #ifdef __i386__ 7 /* 8 * As documented in the iBCS2 standard.. 9 * 10 * The first part of "struct _fpstate" is just the normal i387 11 * hardware setup, the extra "status" word is used to save the 12 * coprocessor status word before entering the handler. 13 * 14 * Pentium III FXSR, SSE support 15 * Gareth Hughes <gareth (at) valinux.com>, May 2000 16 * 17 * The FPU state data structure has had to grow to accommodate the 18 * extended FPU state required by the Streaming SIMD Extensions. 19 * There is no documented standard to accomplish this at the moment. 20 */ 21 struct _fpreg { 22 unsigned short significand[4]; 23 unsigned short exponent; 24 }; 25 26 struct _fpxreg { 27 unsigned short significand[4]; 28 unsigned short exponent; 29 unsigned short padding[3]; 30 }; 31 32 struct _xmmreg { 33 unsigned long element[4]; 34 }; 35 36 struct _fpstate { 37 /* Regular FPU environment */ 38 unsigned long cw; 39 unsigned long sw; 40 unsigned long tag; 41 unsigned long ipoff; 42 unsigned long cssel; 43 unsigned long dataoff; 44 unsigned long datasel; 45 struct _fpreg _st[8]; 46 unsigned short status; 47 unsigned short magic; /* 0xffff = regular FPU data only */ 48 49 /* FXSR FPU environment */ 50 unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */ 51 unsigned long mxcsr; 52 unsigned long reserved; 53 struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ 54 struct _xmmreg _xmm[8]; 55 unsigned long padding[56]; 56 }; 57 58 #define X86_FXSR_MAGIC 0x0000 59 60 struct sigcontext { 61 unsigned short gs, __gsh; 62 unsigned short fs, __fsh; 63 unsigned short es, __esh; 64 unsigned short ds, __dsh; 65 unsigned long edi; 66 unsigned long esi; 67 unsigned long ebp; 68 unsigned long esp; 69 unsigned long ebx; 70 unsigned long edx; 71 unsigned long ecx; 72 unsigned long eax; 73 unsigned long trapno; 74 unsigned long err; 75 unsigned long eip; 76 unsigned short cs, __csh; 77 unsigned long eflags; 78 unsigned long esp_at_signal; 79 unsigned short ss, __ssh; 80 struct _fpstate * fpstate; 81 unsigned long oldmask; 82 unsigned long cr2; 83 }; 84 85 #else /* __i386__ */ 86 87 /* FXSAVE frame */ 88 /* Note: reserved1/2 may someday contain valuable data. Always save/restore 89 them when you change signal frames. */ 90 struct _fpstate { 91 __u16 cwd; 92 __u16 swd; 93 __u16 twd; /* Note this is not the same as the 32bit/x87/FSAVE twd */ 94 __u16 fop; 95 __u64 rip; 96 __u64 rdp; 97 __u32 mxcsr; 98 __u32 mxcsr_mask; 99 __u32 st_space[32]; /* 8*16 bytes for each FP-reg */ 100 __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */ 101 __u32 reserved2[24]; 102 }; 103 104 struct sigcontext { 105 unsigned long r8; 106 unsigned long r9; 107 unsigned long r10; 108 unsigned long r11; 109 unsigned long r12; 110 unsigned long r13; 111 unsigned long r14; 112 unsigned long r15; 113 unsigned long rdi; 114 unsigned long rsi; 115 unsigned long rbp; 116 unsigned long rbx; 117 unsigned long rdx; 118 unsigned long rax; 119 unsigned long rcx; 120 unsigned long rsp; 121 unsigned long rip; 122 unsigned long eflags; /* RFLAGS */ 123 unsigned short cs; 124 unsigned short gs; 125 unsigned short fs; 126 unsigned short __pad0; 127 unsigned long err; 128 unsigned long trapno; 129 unsigned long oldmask; 130 unsigned long cr2; 131 struct _fpstate *fpstate; /* zero when no FPU context */ 132 unsigned long reserved1[8]; 133 }; 134 135 #endif /* !__i386__ */ 136 137 #endif 138