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