xref: /kvm-unit-tests/lib/x86/desc.h (revision af11bd880742db7098e9e966f83e68d5625c03c2)
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 #define ASM_TRY(catch)                                  \
28     "movl $0, %%gs:4 \n\t"                              \
29     ".pushsection .data.ex \n\t"                        \
30     ".quad 1111f, " catch "\n\t"                        \
31     ".popsection \n\t"                                  \
32     "1111:"
33 
34 #define UD_VECTOR   6
35 #define GP_VECTOR   13
36 
37 #define TSS_MAIN 0x20
38 #define TSS_INTR 0x28
39 
40 unsigned exception_vector(void);
41 unsigned exception_error_code(void);
42 void set_idt_entry(int vec, void *addr, int dpl);
43 void set_gdt_entry(int num, u32 base,  u32 limit, u8 access, u8 gran);
44 void set_intr_task_gate(int e, void *fn);
45 void print_current_tss_info(void);
46 void handle_exception(u8 v, void (*func)(struct ex_regs *regs));
47 
48 #endif
49