1
2
3
4
5#ifndef _ASM_X86_FPU_H
6#define _ASM_X86_FPU_H
7
8
9
10
11
12struct fregs_state {
13 u32 cwd;
14 u32 swd;
15 u32 twd;
16 u32 fip;
17 u32 fcs;
18 u32 foo;
19 u32 fos;
20
21
22 u32 st_space[20];
23
24
25 u32 status;
26};
27
28
29
30
31
32
33
34struct fxregs_state {
35 u16 cwd;
36 u16 swd;
37 u16 twd;
38 u16 fop;
39 union {
40 struct {
41 u64 rip;
42 u64 rdp;
43 };
44 struct {
45 u32 fip;
46 u32 fcs;
47 u32 foo;
48 u32 fos;
49 };
50 };
51 u32 mxcsr;
52 u32 mxcsr_mask;
53
54
55 u32 st_space[32];
56
57
58 u32 xmm_space[64];
59
60 u32 padding[12];
61
62 union {
63 u32 padding1[12];
64 u32 sw_reserved[12];
65 };
66
67} __attribute__((aligned(16)));
68
69
70#define MXCSR_DEFAULT 0x1f80
71
72
73#define MXCSR_AND_FLAGS_SIZE sizeof(u64)
74
75
76
77
78
79struct swregs_state {
80 u32 cwd;
81 u32 swd;
82 u32 twd;
83 u32 fip;
84 u32 fcs;
85 u32 foo;
86 u32 fos;
87
88 u32 st_space[20];
89 u8 ftop;
90 u8 changed;
91 u8 lookahead;
92 u8 no_update;
93 u8 rm;
94 u8 alimit;
95 struct math_emu_info *info;
96 u32 entry_eip;
97};
98
99
100
101
102enum xfeature {
103 XFEATURE_FP,
104 XFEATURE_SSE,
105
106
107
108
109 XFEATURE_YMM,
110 XFEATURE_BNDREGS,
111 XFEATURE_BNDCSR,
112 XFEATURE_OPMASK,
113 XFEATURE_ZMM_Hi256,
114 XFEATURE_Hi16_ZMM,
115 XFEATURE_PT_UNIMPLEMENTED_SO_FAR,
116 XFEATURE_PKRU,
117 XFEATURE_PASID,
118 XFEATURE_RSRVD_COMP_11,
119 XFEATURE_RSRVD_COMP_12,
120 XFEATURE_RSRVD_COMP_13,
121 XFEATURE_RSRVD_COMP_14,
122 XFEATURE_LBR,
123
124 XFEATURE_MAX,
125};
126
127#define XFEATURE_MASK_FP (1 << XFEATURE_FP)
128#define XFEATURE_MASK_SSE (1 << XFEATURE_SSE)
129#define XFEATURE_MASK_YMM (1 << XFEATURE_YMM)
130#define XFEATURE_MASK_BNDREGS (1 << XFEATURE_BNDREGS)
131#define XFEATURE_MASK_BNDCSR (1 << XFEATURE_BNDCSR)
132#define XFEATURE_MASK_OPMASK (1 << XFEATURE_OPMASK)
133#define XFEATURE_MASK_ZMM_Hi256 (1 << XFEATURE_ZMM_Hi256)
134#define XFEATURE_MASK_Hi16_ZMM (1 << XFEATURE_Hi16_ZMM)
135#define XFEATURE_MASK_PT (1 << XFEATURE_PT_UNIMPLEMENTED_SO_FAR)
136#define XFEATURE_MASK_PKRU (1 << XFEATURE_PKRU)
137#define XFEATURE_MASK_PASID (1 << XFEATURE_PASID)
138#define XFEATURE_MASK_LBR (1 << XFEATURE_LBR)
139
140#define XFEATURE_MASK_FPSSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE)
141#define XFEATURE_MASK_AVX512 (XFEATURE_MASK_OPMASK \
142 | XFEATURE_MASK_ZMM_Hi256 \
143 | XFEATURE_MASK_Hi16_ZMM)
144
145#define FIRST_EXTENDED_XFEATURE XFEATURE_YMM
146
147struct reg_128_bit {
148 u8 regbytes[128/8];
149};
150struct reg_256_bit {
151 u8 regbytes[256/8];
152};
153struct reg_512_bit {
154 u8 regbytes[512/8];
155};
156
157
158
159
160
161
162
163
164
165
166
167struct ymmh_struct {
168 struct reg_128_bit hi_ymm[16];
169} __packed;
170
171
172
173struct mpx_bndreg {
174 u64 lower_bound;
175 u64 upper_bound;
176} __packed;
177
178
179
180struct mpx_bndreg_state {
181 struct mpx_bndreg bndreg[4];
182} __packed;
183
184
185
186
187
188
189struct mpx_bndcsr {
190 u64 bndcfgu;
191 u64 bndstatus;
192} __packed;
193
194
195
196
197struct mpx_bndcsr_state {
198 union {
199 struct mpx_bndcsr bndcsr;
200 u8 pad_to_64_bytes[64];
201 };
202} __packed;
203
204
205
206
207
208
209
210struct avx_512_opmask_state {
211 u64 opmask_reg[8];
212} __packed;
213
214
215
216
217
218
219struct avx_512_zmm_uppers_state {
220 struct reg_256_bit zmm_upper[16];
221} __packed;
222
223
224
225
226
227struct avx_512_hi16_state {
228 struct reg_512_bit hi16_zmm[16];
229} __packed;
230
231
232
233
234
235struct pkru_state {
236 u32 pkru;
237 u32 pad;
238} __packed;
239
240
241
242
243
244
245struct lbr_entry {
246 u64 from;
247 u64 to;
248 u64 info;
249};
250
251struct arch_lbr_state {
252 u64 lbr_ctl;
253 u64 lbr_depth;
254 u64 ler_from;
255 u64 ler_to;
256 u64 ler_info;
257 struct lbr_entry entries[];
258} __packed;
259
260
261
262
263
264struct ia32_pasid_state {
265 u64 pasid;
266} __packed;
267
268struct xstate_header {
269 u64 xfeatures;
270 u64 xcomp_bv;
271 u64 reserved[6];
272} __attribute__((packed));
273
274
275
276
277
278#define XCOMP_BV_COMPACTED_FORMAT ((u64)1 << 63)
279
280
281
282
283
284
285
286
287
288
289struct xregs_state {
290 struct fxregs_state i387;
291 struct xstate_header header;
292 u8 extended_state_area[0];
293} __attribute__ ((packed, aligned (64)));
294
295
296
297
298
299
300
301
302
303
304union fpregs_state {
305 struct fregs_state fsave;
306 struct fxregs_state fxsave;
307 struct swregs_state soft;
308 struct xregs_state xsave;
309 u8 __padding[PAGE_SIZE];
310};
311
312
313
314
315
316
317struct fpu {
318
319
320
321
322
323
324
325
326
327
328
329
330 unsigned int last_cpu;
331
332
333
334
335
336
337 unsigned long avx512_timestamp;
338
339
340
341
342
343
344
345
346
347
348 union fpregs_state state;
349
350
351
352
353};
354
355#endif
356