1
#ifndef _ASM_X86_SIGCONTEXT_H
2
#define _ASM_X86_SIGCONTEXT_H
4
#include <linux/compiler.h>
5
#include <linux/types.h>
7
#define FP_XSTATE_MAGIC1 0x46505853U
8
#define FP_XSTATE_MAGIC2 0x46505845U
9
#define FP_XSTATE_MAGIC2_SIZE sizeof(FP_XSTATE_MAGIC2)
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.
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.
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.
29
/* feature bit mask (including fp/sse/extended
30
* state) that is present in the memory
33
__u32 xstate_size; /* actual xsave state size, based on the
34
* features saved in the layout.
35
* 'extended_size' will be greater than
38
__u32 padding[7]; /* for future use. */
43
* As documented in the iBCS2 standard..
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.
49
* Pentium III FXSR, SSE support
50
* Gareth Hughes <gareth@valinux.com>, May 2000
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.
57
unsigned short significand[4];
58
unsigned short exponent;
62
unsigned short significand[4];
63
unsigned short exponent;
64
unsigned short padding[3];
68
unsigned long element[4];
72
/* Regular FPU environment */
78
unsigned long dataoff;
79
unsigned long datasel;
81
unsigned short status;
82
unsigned short magic; /* 0xffff = regular FPU data only */
84
/* FXSR FPU environment */
85
unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */
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];
93
unsigned long padding2[12];
94
struct _fpx_sw_bytes sw_reserved; /* represents the extended
99
#define X86_FXSR_MAGIC 0x0000
103
unsigned short gs, __gsh;
104
unsigned short fs, __fsh;
105
unsigned short es, __esh;
106
unsigned short ds, __dsh;
115
unsigned long trapno;
118
unsigned short cs, __csh;
120
unsigned long sp_at_signal;
121
unsigned short ss, __ssh;
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)
130
void __user *fpstate; /* zero when no FPU/extended context */
131
unsigned long oldmask;
134
#else /* __KERNEL__ */
136
* User-space might still rely on the old definition:
139
unsigned short gs, __gsh;
140
unsigned short fs, __fsh;
141
unsigned short es, __esh;
142
unsigned short ds, __dsh;
151
unsigned long trapno;
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;
162
#endif /* !__KERNEL__ */
167
/* Note: reserved1/2 may someday contain valuable data. Always save/restore
168
them when you change signal frames. */
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 */
184
struct _fpx_sw_bytes sw_reserved; /* represents the extended
185
* state information */
212
unsigned short __pad0;
214
unsigned long trapno;
215
unsigned long oldmask;
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)
225
void __user *fpstate; /* zero when no FPU/extended context */
226
unsigned long reserved1[8];
228
#else /* __KERNEL__ */
230
* User-space might still rely on the old definition:
250
unsigned long eflags; /* RFLAGS */
254
unsigned short __pad0;
256
unsigned long trapno;
257
unsigned long oldmask;
259
struct _fpstate __user *fpstate; /* zero when no FPU context */
260
unsigned long reserved1[8];
262
#endif /* !__KERNEL__ */
264
#endif /* !__i386__ */
273
/* 16 * 16 bytes for each YMMH-reg */
274
__u32 ymmh_space[64];
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.
284
struct _fpstate fpstate;
285
struct _xsave_hdr xstate_hdr;
286
struct _ymmh_state ymmh;
287
/* new processor state extensions go here */
290
#endif /* _ASM_X86_SIGCONTEXT_H */