xref: /kvm-unit-tests/lib/x86/desc.h (revision 67961d185ad2860dd35ac2e3c17a8644c18da8b3)
1 #ifndef __IDT_TEST__
2 #define __IDT_TEST__
3 
4 void setup_idt(void);
5 #ifndef __x86_64__
6 void setup_gdt(void);
7 void setup_tss32(void);
8 #else
9 static inline void setup_gdt(void){}
10 static inline void setup_tss32(void){}
11 #endif
12 
13 struct ex_regs {
14     unsigned long rax, rcx, rdx, rbx;
15     unsigned long dummy, rbp, rsi, rdi;
16 #ifdef __x86_64__
17     unsigned long r8, r9, r10, r11;
18     unsigned long r12, r13, r14, r15;
19 #endif
20     unsigned long vector;
21     unsigned long error_code;
22     unsigned long rip;
23     unsigned long cs;
24     unsigned long rflags;
25 };
26 
27 typedef struct {
28 	u16 prev;
29 	u16 res1;
30 	u32 esp0;
31 	u16 ss0;
32 	u16 res2;
33 	u32 esp1;
34 	u16 ss1;
35 	u16 res3;
36 	u32 esp2;
37 	u16 ss2;
38 	u16 res4;
39 	u32 cr3;
40 	u32 eip;
41 	u32 eflags;
42 	u32 eax, ecx, edx, ebx, esp, ebp, esi, edi;
43 	u16 es;
44 	u16 res5;
45 	u16 cs;
46 	u16 res6;
47 	u16 ss;
48 	u16 res7;
49 	u16 ds;
50 	u16 res8;
51 	u16 fs;
52 	u16 res9;
53 	u16 gs;
54 	u16 res10;
55 	u16 ldt;
56 	u16 res11;
57 	u16 t:1;
58 	u16 res12:15;
59 	u16 iomap_base;
60 } tss32_t;
61 
62 #define ASM_TRY(catch)                                  \
63     "movl $0, %%gs:4 \n\t"                              \
64     ".pushsection .data.ex \n\t"                        \
65     ".quad 1111f, " catch "\n\t"                        \
66     ".popsection \n\t"                                  \
67     "1111:"
68 
69 #define DB_VECTOR   1
70 #define BP_VECTOR   3
71 #define UD_VECTOR   6
72 #define GP_VECTOR   13
73 
74 #define KERNEL_CS 0x08
75 #define KERNEL_DS 0x10
76 #define NP_SEL 0x18
77 #define TSS_MAIN 0x20
78 #define TSS_INTR 0x28
79 #define FIRST_SPARE_SEL 0x30
80 
81 unsigned exception_vector(void);
82 unsigned exception_error_code(void);
83 void set_idt_entry(int vec, void *addr, int dpl);
84 void set_idt_sel(int vec, u16 sel);
85 void set_gdt_entry(int sel, u32 base,  u32 limit, u8 access, u8 gran);
86 void set_idt_task_gate(int vec, u16 sel);
87 void set_intr_task_gate(int e, void *fn);
88 void print_current_tss_info(void);
89 void handle_exception(u8 v, void (*func)(struct ex_regs *regs));
90 
91 bool test_for_exception(unsigned int ex, void (*trigger_func)(void *data),
92 			void *data);
93 void set_exception_return(void *addr);
94 
95 #endif
96