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