Merge branch 's3c24xx-updates' of git://git.fluff.org/bjdooks/linux
[sfrench/cifs-2.6.git] / arch / x86 / include / asm / sigcontext.h
1 #ifndef _ASM_X86_SIGCONTEXT_H
2 #define _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@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 #ifdef __KERNEL__
102 struct sigcontext {
103         unsigned short gs, __gsh;
104         unsigned short fs, __fsh;
105         unsigned short es, __esh;
106         unsigned short ds, __dsh;
107         unsigned long di;
108         unsigned long si;
109         unsigned long bp;
110         unsigned long sp;
111         unsigned long bx;
112         unsigned long dx;
113         unsigned long cx;
114         unsigned long ax;
115         unsigned long trapno;
116         unsigned long err;
117         unsigned long ip;
118         unsigned short cs, __csh;
119         unsigned long flags;
120         unsigned long sp_at_signal;
121         unsigned short ss, __ssh;
122
123         /*
124          * fpstate is really (struct _fpstate *) or (struct _xstate *)
125          * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
126          * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
127          * of extended memory layout. See comments at the definition of
128          * (struct _fpx_sw_bytes)
129          */
130         void __user *fpstate;           /* zero when no FPU/extended context */
131         unsigned long oldmask;
132         unsigned long cr2;
133 };
134 #else /* __KERNEL__ */
135 /*
136  * User-space might still rely on the old definition:
137  */
138 struct sigcontext {
139         unsigned short gs, __gsh;
140         unsigned short fs, __fsh;
141         unsigned short es, __esh;
142         unsigned short ds, __dsh;
143         unsigned long edi;
144         unsigned long esi;
145         unsigned long ebp;
146         unsigned long esp;
147         unsigned long ebx;
148         unsigned long edx;
149         unsigned long ecx;
150         unsigned long eax;
151         unsigned long trapno;
152         unsigned long err;
153         unsigned long eip;
154         unsigned short cs, __csh;
155         unsigned long eflags;
156         unsigned long esp_at_signal;
157         unsigned short ss, __ssh;
158         struct _fpstate __user *fpstate;
159         unsigned long oldmask;
160         unsigned long cr2;
161 };
162 #endif /* !__KERNEL__ */
163
164 #else /* __i386__ */
165
166 /* FXSAVE frame */
167 /* Note: reserved1/2 may someday contain valuable data. Always save/restore
168    them when you change signal frames. */
169 struct _fpstate {
170         __u16   cwd;
171         __u16   swd;
172         __u16   twd;            /* Note this is not the same as the
173                                    32bit/x87/FSAVE twd */
174         __u16   fop;
175         __u64   rip;
176         __u64   rdp;
177         __u32   mxcsr;
178         __u32   mxcsr_mask;
179         __u32   st_space[32];   /* 8*16 bytes for each FP-reg */
180         __u32   xmm_space[64];  /* 16*16 bytes for each XMM-reg  */
181         __u32   reserved2[12];
182         union {
183                 __u32   reserved3[12];
184                 struct _fpx_sw_bytes sw_reserved; /* represents the extended
185                                                    * state information */
186         };
187 };
188
189 #ifdef __KERNEL__
190 struct sigcontext {
191         unsigned long r8;
192         unsigned long r9;
193         unsigned long r10;
194         unsigned long r11;
195         unsigned long r12;
196         unsigned long r13;
197         unsigned long r14;
198         unsigned long r15;
199         unsigned long di;
200         unsigned long si;
201         unsigned long bp;
202         unsigned long bx;
203         unsigned long dx;
204         unsigned long ax;
205         unsigned long cx;
206         unsigned long sp;
207         unsigned long ip;
208         unsigned long flags;
209         unsigned short cs;
210         unsigned short gs;
211         unsigned short fs;
212         unsigned short __pad0;
213         unsigned long err;
214         unsigned long trapno;
215         unsigned long oldmask;
216         unsigned long cr2;
217
218         /*
219          * fpstate is really (struct _fpstate *) or (struct _xstate *)
220          * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
221          * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
222          * of extended memory layout. See comments at the definition of
223          * (struct _fpx_sw_bytes)
224          */
225         void __user *fpstate;           /* zero when no FPU/extended context */
226         unsigned long reserved1[8];
227 };
228 #else /* __KERNEL__ */
229 /*
230  * User-space might still rely on the old definition:
231  */
232 struct sigcontext {
233         unsigned long r8;
234         unsigned long r9;
235         unsigned long r10;
236         unsigned long r11;
237         unsigned long r12;
238         unsigned long r13;
239         unsigned long r14;
240         unsigned long r15;
241         unsigned long rdi;
242         unsigned long rsi;
243         unsigned long rbp;
244         unsigned long rbx;
245         unsigned long rdx;
246         unsigned long rax;
247         unsigned long rcx;
248         unsigned long rsp;
249         unsigned long rip;
250         unsigned long eflags;           /* RFLAGS */
251         unsigned short cs;
252         unsigned short gs;
253         unsigned short fs;
254         unsigned short __pad0;
255         unsigned long err;
256         unsigned long trapno;
257         unsigned long oldmask;
258         unsigned long cr2;
259         struct _fpstate __user *fpstate;        /* zero when no FPU context */
260         unsigned long reserved1[8];
261 };
262 #endif /* !__KERNEL__ */
263
264 #endif /* !__i386__ */
265
266 struct _xsave_hdr {
267         __u64 xstate_bv;
268         __u64 reserved1[2];
269         __u64 reserved2[5];
270 };
271
272 struct _ymmh_state {
273         /* 16 * 16 bytes for each YMMH-reg */
274         __u32 ymmh_space[64];
275 };
276
277 /*
278  * Extended state pointed by the fpstate pointer in the sigcontext.
279  * In addition to the fpstate, information encoded in the xstate_hdr
280  * indicates the presence of other extended state information
281  * supported by the processor and OS.
282  */
283 struct _xstate {
284         struct _fpstate fpstate;
285         struct _xsave_hdr xstate_hdr;
286         struct _ymmh_state ymmh;
287         /* new processor state extensions go here */
288 };
289
290 #endif /* _ASM_X86_SIGCONTEXT_H */