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 TSS_INTR 0x20 76 #define FIRST_SPARE_SEL 0x28 77 #define TSS_MAIN 0x80 78 79 typedef struct { 80 unsigned short offset0; 81 unsigned short selector; 82 unsigned short ist : 3; 83 unsigned short : 5; 84 unsigned short type : 4; 85 unsigned short : 1; 86 unsigned short dpl : 2; 87 unsigned short p : 1; 88 unsigned short offset1; 89 #ifdef __x86_64__ 90 unsigned offset2; 91 unsigned reserved; 92 #endif 93 } idt_entry_t; 94 95 typedef struct { 96 u16 limit_low; 97 u16 base_low; 98 u8 base_middle; 99 u8 access; 100 u8 granularity; 101 u8 base_high; 102 } gdt_entry_t; 103 104 extern idt_entry_t boot_idt[256]; 105 106 #ifndef __x86_64__ 107 extern gdt_entry_t gdt32[]; 108 extern tss32_t tss; 109 extern tss32_t tss_intr; 110 #endif 111 112 unsigned exception_vector(void); 113 unsigned exception_error_code(void); 114 void set_idt_entry(int vec, void *addr, int dpl); 115 void set_idt_sel(int vec, u16 sel); 116 void set_gdt_entry(int sel, u32 base, u32 limit, u8 access, u8 gran); 117 void set_gdt_task_gate(u16 tss_sel, u16 sel); 118 void set_idt_task_gate(int vec, u16 sel); 119 void set_intr_task_gate(int e, void *fn); 120 void print_current_tss_info(void); 121 void handle_exception(u8 v, void (*func)(struct ex_regs *regs)); 122 123 bool test_for_exception(unsigned int ex, void (*trigger_func)(void *data), 124 void *data); 125 void set_exception_return(void *addr); 126 127 #endif 128