#include #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); extern void int21h(); extern void default_handler(); void int21h_handler(void) { vprintl("Keyboard pressed\n"); outb(0x20, 0x20); } void default_int_handler(void) { /* Ack the Interrupt */ outb(0x20, 0x20); } 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) { int i; memset(int_table, 0, sizeof(int_table)); idtr_descriptor.limit = sizeof(int_table) - 1; idtr_descriptor.base = (uint32_t) int_table; for (i = 0; i < TOTAL_INTERRUPTS; i++) idt_set(i, default_handler); idt_set(0, idt_zero); idt_set(0x21, int21h); idt_load(&idtr_descriptor); }