| #ifndef _ASM_X86_SIGCONTEXT_H |
| #define _ASM_X86_SIGCONTEXT_H |
| |
| #include <linux/compiler.h> |
| #include <linux/types.h> |
| |
| #define FP_XSTATE_MAGIC1 0x46505853U |
| #define FP_XSTATE_MAGIC2 0x46505845U |
| #define FP_XSTATE_MAGIC2_SIZE sizeof(FP_XSTATE_MAGIC2) |
| |
| /* |
| * bytes 464..511 in the current 512byte layout of fxsave/fxrstor frame |
| * are reserved for SW usage. On cpu's supporting xsave/xrstor, these bytes |
| * are used to extended the fpstate pointer in the sigcontext, which now |
| * includes the extended state information along with fpstate information. |
| * |
| * Presence of FP_XSTATE_MAGIC1 at the beginning of this SW reserved |
| * area and FP_XSTATE_MAGIC2 at the end of memory layout |
| * (extended_size - FP_XSTATE_MAGIC2_SIZE) indicates the presence of the |
| * extended state information in the memory layout pointed by the fpstate |
| * pointer in sigcontext. |
| */ |
| struct _fpx_sw_bytes { |
| __u32 magic1; /* FP_XSTATE_MAGIC1 */ |
| __u32 extended_size; /* total size of the layout referred by |
| * fpstate pointer in the sigcontext. |
| */ |
| __u64 xstate_bv; |
| /* feature bit mask (including fp/sse/extended |
| * state) that is present in the memory |
| * layout. |
| */ |
| __u32 xstate_size; /* actual xsave state size, based on the |
| * features saved in the layout. |
| * 'extended_size' will be greater than |
| * 'xstate_size'. |
| */ |
| __u32 padding[7]; /* for future use. */ |
| }; |
| |
| #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 padding1[44]; |
| |
| union { |
| unsigned long padding2[12]; |
| struct _fpx_sw_bytes sw_reserved; /* represents the extended |
| * state info */ |
| }; |
| }; |
| |
| #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; |
| |
| /* |
| * fpstate is really (struct _fpstate *) or (struct _xstate *) |
| * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved |
| * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end |
| * of extended memory layout. See comments at the definition of |
| * (struct _fpx_sw_bytes) |
| */ |
| void __user *fpstate; /* zero when no FPU/extended context */ |
| 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[12]; |
| union { |
| __u32 reserved3[12]; |
| struct _fpx_sw_bytes sw_reserved; /* represents the extended |
| * state information */ |
| }; |
| }; |
| |
| #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; |
| |
| /* |
| * fpstate is really (struct _fpstate *) or (struct _xstate *) |
| * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved |
| * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end |
| * of extended memory layout. See comments at the definition of |
| * (struct _fpx_sw_bytes) |
| */ |
| void __user *fpstate; /* zero when no FPU/extended context */ |
| unsigned long reserved1[8]; |
| }; |
| #else /* __KERNEL__ */ |
| /* |
| * User-space might still rely on the old definition: |
| */ |
| struct sigcontext { |
| __u64 r8; |
| __u64 r9; |
| __u64 r10; |
| __u64 r11; |
| __u64 r12; |
| __u64 r13; |
| __u64 r14; |
| __u64 r15; |
| __u64 rdi; |
| __u64 rsi; |
| __u64 rbp; |
| __u64 rbx; |
| __u64 rdx; |
| __u64 rax; |
| __u64 rcx; |
| __u64 rsp; |
| __u64 rip; |
| __u64 eflags; /* RFLAGS */ |
| __u16 cs; |
| __u16 gs; |
| __u16 fs; |
| __u16 __pad0; |
| __u64 err; |
| __u64 trapno; |
| __u64 oldmask; |
| __u64 cr2; |
| struct _fpstate __user *fpstate; /* zero when no FPU context */ |
| #ifndef __LP64__ |
| __u32 __fpstate_pad; |
| #endif |
| __u64 reserved1[8]; |
| }; |
| #endif /* !__KERNEL__ */ |
| |
| #endif /* !__i386__ */ |
| |
| struct _xsave_hdr { |
| __u64 xstate_bv; |
| __u64 reserved1[2]; |
| __u64 reserved2[5]; |
| }; |
| |
| struct _ymmh_state { |
| /* 16 * 16 bytes for each YMMH-reg */ |
| __u32 ymmh_space[64]; |
| }; |
| |
| /* |
| * Extended state pointed by the fpstate pointer in the sigcontext. |
| * In addition to the fpstate, information encoded in the xstate_hdr |
| * indicates the presence of other extended state information |
| * supported by the processor and OS. |
| */ |
| struct _xstate { |
| struct _fpstate fpstate; |
| struct _xsave_hdr xstate_hdr; |
| struct _ymmh_state ymmh; |
| /* new processor state extensions go here */ |
| }; |
| |
| #endif /* _ASM_X86_SIGCONTEXT_H */ |