2008-06-18 19:08:48 +04:00
# ifndef ASM_X86__SIGCONTEXT_H
# define ASM_X86__SIGCONTEXT_H
2007-10-24 00:37:24 +04:00
# include <linux/compiler.h>
# include <asm/types.h>
2008-07-29 21:29:24 +04:00
# 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 512 byte 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. */
} ;
2007-10-24 00:37:24 +04:00
# 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 ] ;
2008-07-29 21:29:24 +04:00
unsigned long padding1 [ 44 ] ;
union {
unsigned long padding2 [ 12 ] ;
struct _fpx_sw_bytes sw_reserved ; /* represents the extended
* state info */
} ;
2007-10-24 00:37:24 +04:00
} ;
# define X86_FXSR_MAGIC 0x0000
2008-02-13 18:20:35 +03:00
# ifdef __KERNEL__
2007-10-24 00:37:24 +04:00
struct sigcontext {
unsigned short gs , __gsh ;
unsigned short fs , __fsh ;
unsigned short es , __esh ;
unsigned short ds , __dsh ;
2008-01-30 15:30:56 +03:00
unsigned long di ;
unsigned long si ;
unsigned long bp ;
unsigned long sp ;
unsigned long bx ;
unsigned long dx ;
unsigned long cx ;
unsigned long ax ;
2007-10-24 00:37:24 +04:00
unsigned long trapno ;
unsigned long err ;
2008-01-30 15:30:56 +03:00
unsigned long ip ;
2007-10-24 00:37:24 +04:00
unsigned short cs , __csh ;
2008-01-30 15:30:56 +03:00
unsigned long flags ;
unsigned long sp_at_signal ;
2007-10-24 00:37:24 +04:00
unsigned short ss , __ssh ;
2008-07-29 21:29:24 +04:00
/*
* 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 defintion of
* ( struct _fpx_sw_bytes )
*/
void __user * fpstate ; /* zero when no FPU/extended context */
2007-10-24 00:37:24 +04:00
unsigned long oldmask ;
unsigned long cr2 ;
} ;
2008-02-13 18:20:35 +03:00
# 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 ;
2008-03-23 11:03:27 +03:00
struct _fpstate __user * fpstate ;
2008-02-13 18:20:35 +03:00
unsigned long oldmask ;
unsigned long cr2 ;
} ;
# endif /* !__KERNEL__ */
2007-10-24 00:37:24 +04:00
# 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 ;
2008-03-23 11:03:27 +03:00
__u16 twd ; /* Note this is not the same as the
32 bit / x87 / FSAVE twd */
2007-10-24 00:37:24 +04:00
__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 */
2008-07-29 21:29:24 +04:00
__u32 reserved2 [ 12 ] ;
union {
__u32 reserved3 [ 12 ] ;
struct _fpx_sw_bytes sw_reserved ; /* represents the extended
* state information */
} ;
2007-10-24 00:37:24 +04:00
} ;
2008-02-13 18:20:35 +03:00
# ifdef __KERNEL__
2007-10-24 00:37:24 +04:00
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 ;
2008-01-30 15:30:56 +03:00
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 ;
2007-10-24 00:37:24 +04:00
unsigned short cs ;
unsigned short gs ;
unsigned short fs ;
unsigned short __pad0 ;
unsigned long err ;
unsigned long trapno ;
unsigned long oldmask ;
unsigned long cr2 ;
2008-07-29 21:29:24 +04:00
/*
* 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 defintion of
* ( struct _fpx_sw_bytes )
*/
void __user * fpstate ; /* zero when no FPU/extended context */
2007-10-24 00:37:24 +04:00
unsigned long reserved1 [ 8 ] ;
} ;
2008-02-13 18:20:35 +03:00
# 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__ */
2007-10-24 00:37:24 +04:00
# endif /* !__i386__ */
2008-07-29 21:29:24 +04:00
struct _xsave_hdr {
2008-08-13 14:46:26 +04:00
__u64 xstate_bv ;
__u64 reserved1 [ 2 ] ;
__u64 reserved2 [ 5 ] ;
2008-07-29 21:29:24 +04:00
} ;
/*
* 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 ;
/* new processor state extensions go here */
} ;
2008-06-18 19:08:48 +04:00
# endif /* ASM_X86__SIGCONTEXT_H */