| #ifndef _ASM_X86_SIGCONTEXT_H | |
| #define _ASM_X86_SIGCONTEXT_H | |
| #include <linux/compiler.h> | |
| #include <asm/types.h> | |
| #ifdef __i386__ | |
| /* | |
| * As documented in the iBCS2 standard.. | |
| * | |
| * The first part of "struct _fpstate" is just the normal i387 | |
| * hardware setup, the extra "status" word is used to save the | |
| * coprocessor status word before entering the handler. | |
| * | |
| * Pentium III FXSR, SSE support | |
| * Gareth Hughes <gareth@valinux.com>, May 2000 | |
| * | |
| * The FPU state data structure has had to grow to accommodate the | |
| * extended FPU state required by the Streaming SIMD Extensions. | |
| * There is no documented standard to accomplish this at the moment. | |
| */ | |
| struct _fpreg { | |
| unsigned short significand[4]; | |
| unsigned short exponent; | |
| }; | |
| struct _fpxreg { | |
| unsigned short significand[4]; | |
| unsigned short exponent; | |
| unsigned short padding[3]; | |
| }; | |
| struct _xmmreg { | |
| unsigned long element[4]; | |
| }; | |
| struct _fpstate { | |
| /* Regular FPU environment */ | |
| unsigned long cw; | |
| unsigned long sw; | |
| unsigned long tag; | |
| unsigned long ipoff; | |
| unsigned long cssel; | |
| unsigned long dataoff; | |
| unsigned long datasel; | |
| struct _fpreg _st[8]; | |
| unsigned short status; | |
| unsigned short magic; /* 0xffff = regular FPU data only */ | |
| /* FXSR FPU environment */ | |
| unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */ | |
| unsigned long mxcsr; | |
| unsigned long reserved; | |
| struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ | |
| struct _xmmreg _xmm[8]; | |
| unsigned long padding[56]; | |
| }; | |
| #define X86_FXSR_MAGIC 0x0000 | |
| #ifdef __KERNEL__ | |
| struct sigcontext { | |
| unsigned short gs, __gsh; | |
| unsigned short fs, __fsh; | |
| unsigned short es, __esh; | |
| unsigned short ds, __dsh; | |
| unsigned long di; | |
| unsigned long si; | |
| unsigned long bp; | |
| unsigned long sp; | |
| unsigned long bx; | |
| unsigned long dx; | |
| unsigned long cx; | |
| unsigned long ax; | |
| unsigned long trapno; | |
| unsigned long err; | |
| unsigned long ip; | |
| unsigned short cs, __csh; | |
| unsigned long flags; | |
| unsigned long sp_at_signal; | |
| unsigned short ss, __ssh; | |
| struct _fpstate __user *fpstate; | |
| unsigned long oldmask; | |
| unsigned long cr2; | |
| }; | |
| #else /* __KERNEL__ */ | |
| /* | |
| * User-space might still rely on the old definition: | |
| */ | |
| struct sigcontext { | |
| unsigned short gs, __gsh; | |
| unsigned short fs, __fsh; | |
| unsigned short es, __esh; | |
| unsigned short ds, __dsh; | |
| unsigned long edi; | |
| unsigned long esi; | |
| unsigned long ebp; | |
| unsigned long esp; | |
| unsigned long ebx; | |
| unsigned long edx; | |
| unsigned long ecx; | |
| unsigned long eax; | |
| unsigned long trapno; | |
| unsigned long err; | |
| unsigned long eip; | |
| unsigned short cs, __csh; | |
| unsigned long eflags; | |
| unsigned long esp_at_signal; | |
| unsigned short ss, __ssh; | |
| struct _fpstate __user *fpstate; | |
| unsigned long oldmask; | |
| unsigned long cr2; | |
| }; | |
| #endif /* !__KERNEL__ */ | |
| #else /* __i386__ */ | |
| /* FXSAVE frame */ | |
| /* Note: reserved1/2 may someday contain valuable data. Always save/restore | |
| them when you change signal frames. */ | |
| struct _fpstate { | |
| __u16 cwd; | |
| __u16 swd; | |
| __u16 twd; /* Note this is not the same as the | |
| 32bit/x87/FSAVE twd */ | |
| __u16 fop; | |
| __u64 rip; | |
| __u64 rdp; | |
| __u32 mxcsr; | |
| __u32 mxcsr_mask; | |
| __u32 st_space[32]; /* 8*16 bytes for each FP-reg */ | |
| __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */ | |
| __u32 reserved2[24]; | |
| }; | |
| #ifdef __KERNEL__ | |
| struct sigcontext { | |
| unsigned long r8; | |
| unsigned long r9; | |
| unsigned long r10; | |
| unsigned long r11; | |
| unsigned long r12; | |
| unsigned long r13; | |
| unsigned long r14; | |
| unsigned long r15; | |
| unsigned long di; | |
| unsigned long si; | |
| unsigned long bp; | |
| unsigned long bx; | |
| unsigned long dx; | |
| unsigned long ax; | |
| unsigned long cx; | |
| unsigned long sp; | |
| unsigned long ip; | |
| unsigned long flags; | |
| unsigned short cs; | |
| unsigned short gs; | |
| unsigned short fs; | |
| unsigned short __pad0; | |
| unsigned long err; | |
| unsigned long trapno; | |
| unsigned long oldmask; | |
| unsigned long cr2; | |
| struct _fpstate __user *fpstate; /* zero when no FPU context */ | |
| unsigned long reserved1[8]; | |
| }; | |
| #else /* __KERNEL__ */ | |
| /* | |
| * User-space might still rely on the old definition: | |
| */ | |
| struct sigcontext { | |
| unsigned long r8; | |
| unsigned long r9; | |
| unsigned long r10; | |
| unsigned long r11; | |
| unsigned long r12; | |
| unsigned long r13; | |
| unsigned long r14; | |
| unsigned long r15; | |
| unsigned long rdi; | |
| unsigned long rsi; | |
| unsigned long rbp; | |
| unsigned long rbx; | |
| unsigned long rdx; | |
| unsigned long rax; | |
| unsigned long rcx; | |
| unsigned long rsp; | |
| unsigned long rip; | |
| unsigned long eflags; /* RFLAGS */ | |
| unsigned short cs; | |
| unsigned short gs; | |
| unsigned short fs; | |
| unsigned short __pad0; | |
| unsigned long err; | |
| unsigned long trapno; | |
| unsigned long oldmask; | |
| unsigned long cr2; | |
| struct _fpstate __user *fpstate; /* zero when no FPU context */ | |
| unsigned long reserved1[8]; | |
| }; | |
| #endif /* !__KERNEL__ */ | |
| #endif /* !__i386__ */ | |
| #endif |