2007-10-24 00:37:24 +04:00
# 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
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 ;
struct _fpstate __user * fpstate ;
unsigned long oldmask ;
unsigned long cr2 ;
} ;
# 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 ] ;
} ;
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 ;
struct _fpstate __user * fpstate ; /* zero when no FPU context */
unsigned long reserved1 [ 8 ] ;
} ;
# endif /* !__i386__ */
2007-10-11 13:20:03 +04:00
# endif