#include #include #include #include #include struct int_descriptor int_table[TOTAL_INTERRUPTS]; struct int_reg_descriptor idtr_descriptor; extern void idt_load(struct int_reg_descriptor *desc); static void idt_zero() { vprintl("Illegal operation: Divide by zero\n"); } static void idt_set(int int_num, void *addr) { struct int_descriptor *desc = &int_table[int_num]; desc->offset_low = (uint32_t) addr & 0x0000FFFF; desc->selector = KERNEL_CODE_SELECTOR; desc->reserved = 0x00; desc->type_attr = TOXIC_INT_ATTR; desc->offset_high = (uint32_t) addr >> 16; } void interrupts_init(void) { memset(int_table, 0, sizeof(int_table)); idtr_descriptor.limit = sizeof(int_table) - 1; idtr_descriptor.base = (uint32_t) int_table; idt_set(0, idt_zero); idt_load(&idtr_descriptor); }