idt.c (1180B)
1 #include "oxytoxin.h" 2 3 static idt_entry_t idt[256]; 4 static idtr_t idtr; 5 6 void excp_handler() { 7 tty_write("IDT: exception handled\n", 23); 8 asm volatile ("cli; hlt"); 9 } 10 11 void pic_remap() { 12 asm volatile ("cli"); 13 14 outb(pic_1_comm, icw_1); io_wait(); 15 outb(pic_2_comm, icw_1); io_wait(); 16 17 outb(pic_1_data, irq_0); io_wait(); 18 outb(pic_2_data, irq_8); io_wait(); 19 20 outb(pic_1_data, 0x01); io_wait(); 21 outb(pic_2_data, 0x01); io_wait(); 22 23 outb(pic_1_data, 0b11111101); io_wait(); 24 outb(pic_2_data, 0xff); io_wait(); 25 } 26 27 void idt_load() { 28 int idt_row_count; 29 30 idt_row_count = sizeof(idt) / sizeof(idt[0]); 31 idtr.base = (unsigned int)(&idt[0]); 32 idtr.limit = (sizeof(idt_entry_t) * idt_row_count) - 1; 33 asm volatile ("lidt %0" : : "m" (idtr)); 34 } 35 36 void idt_register(unsigned char vec, int_handler handler) { 37 unsigned int addr; 38 39 addr = (unsigned int) handler; 40 idt[vec].isr_low = addr & 0xffffffff; 41 idt[vec].kernel_cs = 0x08; 42 idt[vec].reserved = 0; 43 idt[vec].attr = 0x8e; 44 idt[vec].isr_high = addr >> 16; 45 } 46 47 void idt_init(void) { 48 asm volatile ("cli"); 49 for (int i = 0; i < 256; i++) { 50 idt_register(i, excp_handler); 51 } 52 53 pic_remap(); 54 idt_load(); 55 }