16dc4e8a2cd34845042445915f9e9d74d90546c6
[kvmfornfv.git] / kernel / arch / x86 / include / uapi / asm / sigcontext.h
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@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
181         /*
182          * Prior to 2.5.64 ("[PATCH] x86-64 updates for 2.5.64-bk3"),
183          * Linux saved and restored fs and gs in these slots.  This
184          * was counterproductive, as fsbase and gsbase were never
185          * saved, so arch_prctl was presumably unreliable.
186          *
187          * If these slots are ever needed for any other purpose, there
188          * is some risk that very old 64-bit binaries could get
189          * confused.  I doubt that many such binaries still work,
190          * though, since the same patch in 2.5.64 also removed the
191          * 64-bit set_thread_area syscall, so it appears that there is
192          * no TLS API that works in both pre- and post-2.5.64 kernels.
193          */
194         __u16 __pad2;           /* Was gs. */
195         __u16 __pad1;           /* Was fs. */
196
197         __u16 ss;
198         __u64 err;
199         __u64 trapno;
200         __u64 oldmask;
201         __u64 cr2;
202         struct _fpstate __user *fpstate;        /* zero when no FPU context */
203 #ifdef __ILP32__
204         __u32 __fpstate_pad;
205 #endif
206         __u64 reserved1[8];
207 };
208 #endif /* !__KERNEL__ */
209
210 #endif /* !__i386__ */
211
212 struct _xsave_hdr {
213         __u64 xstate_bv;
214         __u64 reserved1[2];
215         __u64 reserved2[5];
216 };
217
218 struct _ymmh_state {
219         /* 16 * 16 bytes for each YMMH-reg */
220         __u32 ymmh_space[64];
221 };
222
223 /*
224  * Extended state pointed by the fpstate pointer in the sigcontext.
225  * In addition to the fpstate, information encoded in the xstate_hdr
226  * indicates the presence of other extended state information
227  * supported by the processor and OS.
228  */
229 struct _xstate {
230         struct _fpstate fpstate;
231         struct _xsave_hdr xstate_hdr;
232         struct _ymmh_state ymmh;
233         /* new processor state extensions go here */
234 };
235
236 #endif /* _UAPI_ASM_X86_SIGCONTEXT_H */