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