Home | History | Annotate | Download | only in asm
      1 #ifndef _UAPI_ASM_X86_SIGCONTEXT_H
      2 #define _UAPI_ASM_X86_SIGCONTEXT_H
      3 
      4 #include <linux/compiler.h>
      5 #include <linux/types.h>
      6 
      7 #define FP_XSTATE_MAGIC1	0x46505853U
      8 #define FP_XSTATE_MAGIC2	0x46505845U
      9 #define FP_XSTATE_MAGIC2_SIZE	sizeof(FP_XSTATE_MAGIC2)
     10 
     11 /*
     12  * bytes 464..511 in the current 512byte layout of fxsave/fxrstor frame
     13  * are reserved for SW usage. On cpu's supporting xsave/xrstor, these bytes
     14  * are used to extended the fpstate pointer in the sigcontext, which now
     15  * includes the extended state information along with fpstate information.
     16  *
     17  * Presence of FP_XSTATE_MAGIC1 at the beginning of this SW reserved
     18  * area and FP_XSTATE_MAGIC2 at the end of memory layout
     19  * (extended_size - FP_XSTATE_MAGIC2_SIZE) indicates the presence of the
     20  * extended state information in the memory layout pointed by the fpstate
     21  * pointer in sigcontext.
     22  */
     23 struct _fpx_sw_bytes {
     24 	__u32 magic1;		/* FP_XSTATE_MAGIC1 */
     25 	__u32 extended_size;	/* total size of the layout referred by
     26 				 * fpstate pointer in the sigcontext.
     27 				 */
     28 	__u64 xstate_bv;
     29 				/* feature bit mask (including fp/sse/extended
     30 				 * state) that is present in the memory
     31 				 * layout.
     32 				 */
     33 	__u32 xstate_size;	/* actual xsave state size, based on the
     34 				 * features saved in the layout.
     35 				 * 'extended_size' will be greater than
     36 				 * 'xstate_size'.
     37 				 */
     38 	__u32 padding[7];	/*  for future use. */
     39 };
     40 
     41 #ifdef __i386__
     42 /*
     43  * As documented in the iBCS2 standard..
     44  *
     45  * The first part of "struct _fpstate" is just the normal i387
     46  * hardware setup, the extra "status" word is used to save the
     47  * coprocessor status word before entering the handler.
     48  *
     49  * Pentium III FXSR, SSE support
     50  *	Gareth Hughes <gareth (at) valinux.com>, May 2000
     51  *
     52  * The FPU state data structure has had to grow to accommodate the
     53  * extended FPU state required by the Streaming SIMD Extensions.
     54  * There is no documented standard to accomplish this at the moment.
     55  */
     56 struct _fpreg {
     57 	unsigned short significand[4];
     58 	unsigned short exponent;
     59 };
     60 
     61 struct _fpxreg {
     62 	unsigned short significand[4];
     63 	unsigned short exponent;
     64 	unsigned short padding[3];
     65 };
     66 
     67 struct _xmmreg {
     68 	unsigned long element[4];
     69 };
     70 
     71 struct _fpstate {
     72 	/* Regular FPU environment */
     73 	unsigned long	cw;
     74 	unsigned long	sw;
     75 	unsigned long	tag;
     76 	unsigned long	ipoff;
     77 	unsigned long	cssel;
     78 	unsigned long	dataoff;
     79 	unsigned long	datasel;
     80 	struct _fpreg	_st[8];
     81 	unsigned short	status;
     82 	unsigned short	magic;		/* 0xffff = regular FPU data only */
     83 
     84 	/* FXSR FPU environment */
     85 	unsigned long	_fxsr_env[6];	/* FXSR FPU env is ignored */
     86 	unsigned long	mxcsr;
     87 	unsigned long	reserved;
     88 	struct _fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
     89 	struct _xmmreg	_xmm[8];
     90 	unsigned long	padding1[44];
     91 
     92 	union {
     93 		unsigned long	padding2[12];
     94 		struct _fpx_sw_bytes sw_reserved; /* represents the extended
     95 						   * state info */
     96 	};
     97 };
     98 
     99 #define X86_FXSR_MAGIC		0x0000
    100 
    101 #ifndef __KERNEL__
    102 /*
    103  * User-space might still rely on the old definition:
    104  */
    105 struct sigcontext {
    106 	unsigned short gs, __gsh;
    107 	unsigned short fs, __fsh;
    108 	unsigned short es, __esh;
    109 	unsigned short ds, __dsh;
    110 	unsigned long edi;
    111 	unsigned long esi;
    112 	unsigned long ebp;
    113 	unsigned long esp;
    114 	unsigned long ebx;
    115 	unsigned long edx;
    116 	unsigned long ecx;
    117 	unsigned long eax;
    118 	unsigned long trapno;
    119 	unsigned long err;
    120 	unsigned long eip;
    121 	unsigned short cs, __csh;
    122 	unsigned long eflags;
    123 	unsigned long esp_at_signal;
    124 	unsigned short ss, __ssh;
    125 	struct _fpstate __user *fpstate;
    126 	unsigned long oldmask;
    127 	unsigned long cr2;
    128 };
    129 #endif /* !__KERNEL__ */
    130 
    131 #else /* __i386__ */
    132 
    133 /* FXSAVE frame */
    134 /* Note: reserved1/2 may someday contain valuable data. Always save/restore
    135    them when you change signal frames. */
    136 struct _fpstate {
    137 	__u16	cwd;
    138 	__u16	swd;
    139 	__u16	twd;		/* Note this is not the same as the
    140 				   32bit/x87/FSAVE twd */
    141 	__u16	fop;
    142 	__u64	rip;
    143 	__u64	rdp;
    144 	__u32	mxcsr;
    145 	__u32	mxcsr_mask;
    146 	__u32	st_space[32];	/* 8*16 bytes for each FP-reg */
    147 	__u32	xmm_space[64];	/* 16*16 bytes for each XMM-reg  */
    148 	__u32	reserved2[12];
    149 	union {
    150 		__u32	reserved3[12];
    151 		struct _fpx_sw_bytes sw_reserved; /* represents the extended
    152 						   * state information */
    153 	};
    154 };
    155 
    156 #ifndef __KERNEL__
    157 /*
    158  * User-space might still rely on the old definition:
    159  */
    160 struct sigcontext {
    161 	__u64 r8;
    162 	__u64 r9;
    163 	__u64 r10;
    164 	__u64 r11;
    165 	__u64 r12;
    166 	__u64 r13;
    167 	__u64 r14;
    168 	__u64 r15;
    169 	__u64 rdi;
    170 	__u64 rsi;
    171 	__u64 rbp;
    172 	__u64 rbx;
    173 	__u64 rdx;
    174 	__u64 rax;
    175 	__u64 rcx;
    176 	__u64 rsp;
    177 	__u64 rip;
    178 	__u64 eflags;		/* RFLAGS */
    179 	__u16 cs;
    180 	__u16 gs;
    181 	__u16 fs;
    182 	__u16 __pad0;
    183 	__u64 err;
    184 	__u64 trapno;
    185 	__u64 oldmask;
    186 	__u64 cr2;
    187 	struct _fpstate __user *fpstate;	/* zero when no FPU context */
    188 #ifdef __ILP32__
    189 	__u32 __fpstate_pad;
    190 #endif
    191 	__u64 reserved1[8];
    192 };
    193 #endif /* !__KERNEL__ */
    194 
    195 #endif /* !__i386__ */
    196 
    197 struct _xsave_hdr {
    198 	__u64 xstate_bv;
    199 	__u64 reserved1[2];
    200 	__u64 reserved2[5];
    201 };
    202 
    203 struct _ymmh_state {
    204 	/* 16 * 16 bytes for each YMMH-reg */
    205 	__u32 ymmh_space[64];
    206 };
    207 
    208 /*
    209  * Extended state pointed by the fpstate pointer in the sigcontext.
    210  * In addition to the fpstate, information encoded in the xstate_hdr
    211  * indicates the presence of other extended state information
    212  * supported by the processor and OS.
    213  */
    214 struct _xstate {
    215 	struct _fpstate fpstate;
    216 	struct _xsave_hdr xstate_hdr;
    217 	struct _ymmh_state ymmh;
    218 	/* new processor state extensions go here */
    219 };
    220 
    221 #endif /* _UAPI_ASM_X86_SIGCONTEXT_H */
    222