Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sigcontext.h
Go to the documentation of this file.
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  */
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 <[email protected]>, 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 {
172  __u16 twd; /* Note this is not the same as the
173  32bit/x87/FSAVE twd */
179  __u32 st_space[32]; /* 8*16 bytes for each FP-reg */
180  __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */
182  union {
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 {
250  __u64 eflags; /* RFLAGS */
259  struct _fpstate __user *fpstate; /* zero when no FPU context */
260 #ifdef __ILP32__
261  __u32 __fpstate_pad;
262 #endif
264 };
265 #endif /* !__KERNEL__ */
266 
267 #endif /* !__i386__ */
268 
269 struct _xsave_hdr {
273 };
274 
275 struct _ymmh_state {
276  /* 16 * 16 bytes for each YMMH-reg */
278 };
279 
280 /*
281  * Extended state pointed by the fpstate pointer in the sigcontext.
282  * In addition to the fpstate, information encoded in the xstate_hdr
283  * indicates the presence of other extended state information
284  * supported by the processor and OS.
285  */
286 struct _xstate {
290  /* new processor state extensions go here */
291 };
292 
293 #endif /* _ASM_X86_SIGCONTEXT_H */