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