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_gdt_entry(int sel, u32 base, u32 limit, u8 access, u8 gran); 151 void set_intr_alt_stack(int e, void *fn); 152 void print_current_tss_info(void); 153 void handle_exception(u8 v, void (*func)(struct ex_regs *regs)); 154 155 bool test_for_exception(unsigned int ex, void (*trigger_func)(void *data), 156 void *data); 157 void set_exception_return(void *addr); 158 159 #endif 160