Xen Test Framework
lib.h
Go to the documentation of this file.
1#ifndef XTF_X86_LIB_H
2#define XTF_X86_LIB_H
3
4#include <xtf/types.h>
5#include <xtf/extable.h>
6#include <xen/arch-x86/xen.h>
7#include <arch/desc.h>
8#include <arch/msr.h>
9
10static inline void cpuid(uint32_t leaf,
11 uint32_t *eax, uint32_t *ebx,
12 uint32_t *ecx, uint32_t *edx)
13{
14 asm volatile ("cpuid"
15 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
16 : "0" (leaf));
17}
18
19static inline uint32_t cpuid_eax(uint32_t leaf)
20{
21 uint32_t eax, tmp;
22
23 cpuid(leaf, &eax, &tmp, &tmp, &tmp);
24
25 return eax;
26}
27
28static inline uint32_t cpuid_ebx(uint32_t leaf)
29{
30 uint32_t ebx, tmp;
31
32 cpuid(leaf, &tmp, &ebx, &tmp, &tmp);
33
34 return ebx;
35}
36
37static inline uint32_t cpuid_ecx(uint32_t leaf)
38{
39 uint32_t ecx, tmp;
40
41 cpuid(leaf, &tmp, &tmp, &ecx, &tmp);
42
43 return ecx;
44}
45
46static inline uint32_t cpuid_edx(uint32_t leaf)
47{
48 uint32_t edx, tmp;
49
50 cpuid(leaf, &tmp, &tmp, &tmp, &edx);
51
52 return edx;
53}
54
55static inline void pv_cpuid(uint32_t leaf,
56 uint32_t *eax, uint32_t *ebx,
57 uint32_t *ecx, uint32_t *edx)
58{
59 asm volatile (_ASM_XEN_FEP "cpuid"
60 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
61 : "0" (leaf));
62}
63
64static inline void cpuid_count(uint32_t leaf, uint32_t subleaf,
65 uint32_t *eax, uint32_t *ebx,
66 uint32_t *ecx, uint32_t *edx)
67{
68 asm volatile ("cpuid"
69 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
70 : "0" (leaf), "2" (subleaf));
71}
72
73static inline void pv_cpuid_count(uint32_t leaf, uint32_t subleaf,
74 uint32_t *eax, uint32_t *ebx,
75 uint32_t *ecx, uint32_t *edx)
76{
77 asm volatile (_ASM_XEN_FEP "cpuid"
78 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
79 : "0" (leaf), "2" (subleaf));
80}
81
82static inline uint8_t inb(uint16_t port)
83{
84 uint8_t val;
85
86 asm volatile("inb %w1, %b0": "=a" (val): "Nd" (port));
87
88 return val;
89}
90
91static inline uint16_t inw(uint16_t port)
92{
93 uint16_t val;
94
95 asm volatile("inw %w1, %w0": "=a" (val): "Nd" (port));
96
97 return val;
98}
99
100static inline uint32_t inl(uint16_t port)
101{
102 uint32_t val;
103
104 asm volatile("inl %w1, %k0": "=a" (val): "Nd" (port));
105
106 return val;
107}
108
109static inline void outb(uint8_t val, uint16_t port)
110{
111 asm volatile("outb %b0, %w1": : "a" (val), "Nd" (port));
112}
113
114static inline void outw(uint16_t val, uint16_t port)
115{
116 asm volatile("outw %w0, %w1": : "a" (val), "Nd" (port));
117}
118
119static inline void outl(uint32_t val, uint16_t port)
120{
121 asm volatile("outl %k0, %w1": : "a" (val), "Nd" (port));
122}
123
124static inline void rep_outsb(const char *buf, size_t len, uint16_t port)
125{
126 asm volatile ("rep outsb"
127 : "+S" (buf), "+c" (len)
128 : "d" (port) );
129}
130
131static inline unsigned int read_cs(void)
132{
133 unsigned int cs;
134
135 asm volatile ("mov %%cs, %0" : "=rm" (cs));
136
137 return cs;
138}
139
140static inline unsigned int read_ds(void)
141{
142 unsigned int ds;
143
144 asm volatile ("mov %%ds, %0" : "=rm" (ds));
145
146 return ds;
147}
148
149static inline unsigned int read_es(void)
150{
151 unsigned int es;
152
153 asm volatile ("mov %%es, %0" : "=rm" (es));
154
155 return es;
156}
157
158static inline unsigned int read_fs(void)
159{
160 unsigned int fs;
161
162 asm volatile ("mov %%fs, %0" : "=rm" (fs));
163
164 return fs;
165}
166
167static inline unsigned int read_gs(void)
168{
169 unsigned int gs;
170
171 asm volatile ("mov %%gs, %0" : "=rm" (gs));
172
173 return gs;
174}
175
176static inline unsigned int read_ss(void)
177{
178 unsigned int ss;
179
180 asm volatile ("mov %%ss, %0" : "=rm" (ss));
181
182 return ss;
183}
184
185static inline void write_cs(unsigned long cs)
186{
187 asm volatile ("push %0;"
188 "push $1f;"
189 __ASM_SEL(lretl, lretq) "; 1:"
190 :: "rme" (cs));
191}
192
193static inline void write_ds(unsigned int ds)
194{
195 asm volatile ("mov %0, %%ds" :: "rm" (ds));
196}
197
198static inline void write_es(unsigned int es)
199{
200 asm volatile ("mov %0, %%es" :: "rm" (es));
201}
202
203static inline void write_fs(unsigned int fs)
204{
205 asm volatile ("mov %0, %%fs" :: "rm" (fs));
206}
207
208static inline void write_gs(unsigned int gs)
209{
210 asm volatile ("mov %0, %%gs" :: "rm" (gs));
211}
212
213static inline void write_ss(unsigned int ss)
214{
215 asm volatile ("mov %0, %%ss" :: "rm" (ss));
216}
217
218static inline unsigned long read_flags(void)
219{
220 unsigned long flags;
221
222 asm volatile ("pushf; pop %0" : "=rm" (flags));
223
224 return flags;
225}
226
227static inline void write_flags(unsigned long flags)
228{
229 asm volatile ("push %0; popf" :: "rme" (flags));
230}
231
232static inline unsigned long read_cr0(void)
233{
234 unsigned long cr0;
235
236 asm volatile ("mov %%cr0, %0" : "=r" (cr0));
237
238 return cr0;
239}
240
241static inline unsigned long read_cr2(void)
242{
243 unsigned long cr2;
244
245 asm volatile ("mov %%cr2, %0" : "=r" (cr2));
246
247 return cr2;
248}
249
250static inline unsigned long read_cr3(void)
251{
252 unsigned long cr3;
253
254 asm volatile ("mov %%cr3, %0" : "=r" (cr3));
255
256 return cr3;
257}
258
259static inline unsigned long read_cr4(void)
260{
261 unsigned long cr4;
262
263 asm volatile ("mov %%cr4, %0" : "=r" (cr4));
264
265 return cr4;
266}
267
268static inline unsigned long read_cr8(void)
269{
270 unsigned long cr8;
271
272 asm volatile ("mov %%cr8, %0" : "=r" (cr8));
273
274 return cr8;
275}
276
277static inline void write_cr0(unsigned long cr0)
278{
279 asm volatile ("mov %0, %%cr0" :: "r" (cr0));
280}
281
282static inline void write_cr2(unsigned long cr2)
283{
284 asm volatile ("mov %0, %%cr2" :: "r" (cr2));
285}
286
287static inline void write_cr3(unsigned long cr3)
288{
289 asm volatile ("mov %0, %%cr3" :: "r" (cr3));
290}
291
292static inline void write_cr4(unsigned long cr4)
293{
294 asm volatile ("mov %0, %%cr4" :: "r" (cr4));
295}
296
297static inline bool write_cr4_safe(unsigned long cr4)
298{
299 exinfo_t fault = 0;
300
301 asm volatile ("1: mov %[cr4], %%cr4; 2:"
302 _ASM_EXTABLE_HANDLER(1b, 2b, %P[rec])
303 : "+D" (fault)
304 : [cr4] "r" (cr4),
305 [rec] "p" (ex_record_fault_edi));
306
307 return fault;
308}
309
310static inline void write_cr8(unsigned long cr8)
311{
312 asm volatile ("mov %0, %%cr8" :: "r" (cr8));
313}
314
315static inline uint32_t read_mxcsr(void)
316{
317 uint32_t mxcsr;
318
319 asm volatile ("stmxcsr %0" : "=m" (mxcsr));
320
321 return mxcsr;
322}
323
324static inline void write_mxcsr(uint32_t mxcsr)
325{
326 asm volatile ("ldmxcsr %0" :: "m" (mxcsr));
327}
328
329static inline void invlpg(const void *va)
330{
331 asm volatile ("invlpg (%0)" :: "r" (va));
332}
333
334static inline void lgdt(const desc_ptr *gdtr)
335{
336 asm volatile ("lgdt %0" :: "m" (*gdtr));
337}
338
339static inline void lidt(const desc_ptr *idtr)
340{
341 asm volatile ("lidt %0" :: "m" (*idtr));
342}
343
344static inline void lldt(unsigned int sel)
345{
346 asm volatile ("lldt %w0" :: "rm" (sel));
347}
348
349static inline void ltr(unsigned int sel)
350{
351 asm volatile ("ltr %w0" :: "rm" (sel));
352}
353
354static inline void sgdt(desc_ptr *gdtr)
355{
356 asm volatile ("sgdt %0" : "=m" (*gdtr));
357}
358
359static inline void sidt(desc_ptr *idtr)
360{
361 asm volatile ("sidt %0" : "=m" (*idtr));
362}
363
364static inline unsigned int sldt(void)
365{
366 unsigned int sel;
367
368 asm volatile ("sldt %0" : "=r" (sel));
369
370 return sel;
371}
372
373static inline unsigned int str(void)
374{
375 unsigned int sel;
376
377 asm volatile ("str %0" : "=r" (sel));
378
379 return sel;
380}
381
382static inline uint64_t xgetbv(uint32_t index)
383{
384 uint32_t feat_lo, feat_hi;
385
386 asm volatile ("xgetbv" : "=a" (feat_lo), "=d" (feat_hi)
387 : "c" (index) );
388
389 return feat_lo | ((uint64_t)feat_hi << 32);
390}
391
392static inline void xsetbv(uint32_t index, uint64_t value)
393{
394 asm volatile ("xsetbv" :: "a" ((uint32_t)value),
395 "d" ((uint32_t)(value >> 32)),
396 "c" (index) );
397}
398
399static inline uint64_t read_xcr0(void)
400{
401 return xgetbv(0);
402}
403
404static inline void write_xcr0(uint64_t xcr0)
405{
406 xsetbv(0, xcr0);
407}
408
409static inline void clflush(const void *ptr)
410{
411 asm volatile ("clflush %0" :: "m" (*(const char *)ptr));
412}
413
414static inline void flush_tlb(void)
415{
417}
418
419#endif /* XTF_X86_LIB_H */
420
421/*
422 * Local variables:
423 * mode: C
424 * c-file-style: "BSD"
425 * c-basic-offset: 4
426 * tab-width: 4
427 * indent-tabs-mode: nil
428 * End:
429 */
#define _ASM_XEN_FEP
Xen Forced Emulation Prefix.
Definition: xen.h:150
bool ex_record_fault_edi(struct cpu_regs *regs, const struct extable_entry *ex)
Record the current fault in %edi.
Definition: extable.c:16
#define __ASM_SEL(c, l)
Definition: asm_macros.h:25
static uint32_t read_mxcsr(void)
Definition: lib.h:315
static void write_xcr0(uint64_t xcr0)
Definition: lib.h:404
static uint8_t inb(uint16_t port)
Definition: lib.h:82
static void write_cs(unsigned long cs)
Definition: lib.h:185
static void write_mxcsr(uint32_t mxcsr)
Definition: lib.h:324
static void write_ss(unsigned int ss)
Definition: lib.h:213
static uint32_t cpuid_ebx(uint32_t leaf)
Definition: lib.h:28
static void write_ds(unsigned int ds)
Definition: lib.h:193
static void rep_outsb(const char *buf, size_t len, uint16_t port)
Definition: lib.h:124
static void write_cr3(unsigned long cr3)
Definition: lib.h:287
static void lidt(const desc_ptr *idtr)
Definition: lib.h:339
static uint32_t cpuid_ecx(uint32_t leaf)
Definition: lib.h:37
static void invlpg(const void *va)
Definition: lib.h:329
static unsigned long read_cr3(void)
Definition: lib.h:250
static void flush_tlb(void)
Definition: lib.h:414
static unsigned int read_cs(void)
Definition: lib.h:131
static uint32_t cpuid_eax(uint32_t leaf)
Definition: lib.h:19
static unsigned long read_cr4(void)
Definition: lib.h:259
static void write_fs(unsigned int fs)
Definition: lib.h:203
static unsigned long read_cr2(void)
Definition: lib.h:241
static void write_cr2(unsigned long cr2)
Definition: lib.h:282
static void outb(uint8_t val, uint16_t port)
Definition: lib.h:109
static void write_cr8(unsigned long cr8)
Definition: lib.h:310
static unsigned int sldt(void)
Definition: lib.h:364
static unsigned long read_flags(void)
Definition: lib.h:218
static bool write_cr4_safe(unsigned long cr4)
Definition: lib.h:297
static void write_cr0(unsigned long cr0)
Definition: lib.h:277
static void cpuid_count(uint32_t leaf, uint32_t subleaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
Definition: lib.h:64
static void clflush(const void *ptr)
Definition: lib.h:409
static unsigned long read_cr8(void)
Definition: lib.h:268
static void sgdt(desc_ptr *gdtr)
Definition: lib.h:354
static uint32_t inl(uint16_t port)
Definition: lib.h:100
static void sidt(desc_ptr *idtr)
Definition: lib.h:359
static void pv_cpuid_count(uint32_t leaf, uint32_t subleaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
Definition: lib.h:73
static void lldt(unsigned int sel)
Definition: lib.h:344
static unsigned int str(void)
Definition: lib.h:373
static unsigned int read_es(void)
Definition: lib.h:149
static unsigned int read_ds(void)
Definition: lib.h:140
static uint16_t inw(uint16_t port)
Definition: lib.h:91
static void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
Definition: lib.h:10
static void write_cr4(unsigned long cr4)
Definition: lib.h:292
static unsigned int read_fs(void)
Definition: lib.h:158
static void ltr(unsigned int sel)
Definition: lib.h:349
static unsigned long read_cr0(void)
Definition: lib.h:232
static void write_flags(unsigned long flags)
Definition: lib.h:227
static void outw(uint16_t val, uint16_t port)
Definition: lib.h:114
static uint32_t cpuid_edx(uint32_t leaf)
Definition: lib.h:46
static void pv_cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
Definition: lib.h:55
static void lgdt(const desc_ptr *gdtr)
Definition: lib.h:334
static void xsetbv(uint32_t index, uint64_t value)
Definition: lib.h:392
static unsigned int read_ss(void)
Definition: lib.h:176
static uint64_t read_xcr0(void)
Definition: lib.h:399
static void write_es(unsigned int es)
Definition: lib.h:198
static void write_gs(unsigned int gs)
Definition: lib.h:208
static uint64_t xgetbv(uint32_t index)
Definition: lib.h:382
static void outl(uint32_t val, uint16_t port)
Definition: lib.h:119
static unsigned int read_gs(void)
Definition: lib.h:167
x86 segment descriptor infrastructure.
unsigned int exinfo_t
Packed exception and error code information.
Definition: exinfo.h:19
Exception table support.
#define _ASM_EXTABLE_HANDLER(fault, fixup, handler)
Create an exception table entry with custom handler.
Definition: extable.h:38
Model Specific Register mnemonics and bit definitions.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:16
__UINT64_TYPE__ uint64_t
Definition: stdint.h:17
__UINT8_TYPE__ uint8_t
Definition: stdint.h:14
__UINT16_TYPE__ uint16_t
Definition: stdint.h:15
Common declarations for all tests.