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 */
23struct _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@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 */
56struct _fpreg {
57	unsigned short significand[4];
58	unsigned short exponent;
59};
60
61struct _fpxreg {
62	unsigned short significand[4];
63	unsigned short exponent;
64	unsigned short padding[3];
65};
66
67struct _xmmreg {
68	unsigned long element[4];
69};
70
71struct _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 */
105struct 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. */
136struct _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 */
160struct 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
197struct _xsave_hdr {
198	__u64 xstate_bv;
199	__u64 reserved1[2];
200	__u64 reserved2[5];
201};
202
203struct _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 */
214struct _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