xref: /kvm-unit-tests/lib/x86/desc.h (revision 69d8fe0e084027a0eabd051f38a126eadb565fd0)
1 #ifndef __IDT_TEST__
2 #define __IDT_TEST__
3 
4 void setup_idt(void);
5 #ifndef __x86_64__
6 void setup_tss32(void);
7 #else
8 static inline void setup_tss32(void){}
9 #endif
10 
11 struct ex_regs {
12     unsigned long rax, rcx, rdx, rbx;
13     unsigned long dummy, rbp, rsi, rdi;
14 #ifdef __x86_64__
15     unsigned long r8, r9, r10, r11;
16     unsigned long r12, r13, r14, r15;
17 #endif
18     unsigned long vector;
19     unsigned long error_code;
20     unsigned long rip;
21     unsigned long cs;
22     unsigned long rflags;
23 };
24 
25 typedef struct {
26 	u16 prev;
27 	u16 res1;
28 	u32 esp0;
29 	u16 ss0;
30 	u16 res2;
31 	u32 esp1;
32 	u16 ss1;
33 	u16 res3;
34 	u32 esp2;
35 	u16 ss2;
36 	u16 res4;
37 	u32 cr3;
38 	u32 eip;
39 	u32 eflags;
40 	u32 eax, ecx, edx, ebx, esp, ebp, esi, edi;
41 	u16 es;
42 	u16 res5;
43 	u16 cs;
44 	u16 res6;
45 	u16 ss;
46 	u16 res7;
47 	u16 ds;
48 	u16 res8;
49 	u16 fs;
50 	u16 res9;
51 	u16 gs;
52 	u16 res10;
53 	u16 ldt;
54 	u16 res11;
55 	u16 t:1;
56 	u16 res12:15;
57 	u16 iomap_base;
58 } tss32_t;
59 
60 #define ASM_TRY(catch)                                  \
61     "movl $0, %%gs:4 \n\t"                              \
62     ".pushsection .data.ex \n\t"                        \
63     ".quad 1111f, " catch "\n\t"                        \
64     ".popsection \n\t"                                  \
65     "1111:"
66 
67 #define DB_VECTOR   1
68 #define BP_VECTOR   3
69 #define UD_VECTOR   6
70 #define GP_VECTOR   13
71 
72 #define KERNEL_CS 0x08
73 #define KERNEL_DS 0x10
74 #define NP_SEL 0x18
75 #define USER_CS 0x23
76 #define USER_DS 0x2b
77 #define TSS_INTR 0x30
78 #define FIRST_SPARE_SEL 0x38
79 #define TSS_MAIN 0x80
80 
81 typedef struct {
82     unsigned short offset0;
83     unsigned short selector;
84     unsigned short ist : 3;
85     unsigned short : 5;
86     unsigned short type : 4;
87     unsigned short : 1;
88     unsigned short dpl : 2;
89     unsigned short p : 1;
90     unsigned short offset1;
91 #ifdef __x86_64__
92     unsigned offset2;
93     unsigned reserved;
94 #endif
95 } idt_entry_t;
96 
97 typedef struct {
98 	u16 limit_low;
99 	u16 base_low;
100 	u8 base_middle;
101 	u8 access;
102 	u8 granularity;
103 	u8 base_high;
104 } gdt_entry_t;
105 
106 extern idt_entry_t boot_idt[256];
107 
108 #ifndef __x86_64__
109 extern gdt_entry_t gdt32[];
110 extern tss32_t tss;
111 extern tss32_t tss_intr;
112 #endif
113 
114 unsigned exception_vector(void);
115 unsigned exception_error_code(void);
116 void set_idt_entry(int vec, void *addr, int dpl);
117 void set_idt_sel(int vec, u16 sel);
118 void set_gdt_entry(int sel, u32 base,  u32 limit, u8 access, u8 gran);
119 void set_gdt_task_gate(u16 tss_sel, u16 sel);
120 void set_idt_task_gate(int vec, u16 sel);
121 void set_intr_task_gate(int e, void *fn);
122 void print_current_tss_info(void);
123 void handle_exception(u8 v, void (*func)(struct ex_regs *regs));
124 
125 bool test_for_exception(unsigned int ex, void (*trigger_func)(void *data),
126 			void *data);
127 void set_exception_return(void *addr);
128 
129 #endif
130