diff options
Diffstat (limited to 'kernel/cpu/idt.c')
-rw-r--r-- | kernel/cpu/idt.c | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/kernel/cpu/idt.c b/kernel/cpu/idt.c index d381990..823cc2a 100644 --- a/kernel/cpu/idt.c +++ b/kernel/cpu/idt.c @@ -39,11 +39,6 @@ void format_descriptor(u32 offset, u16 code_segment, u8 type_attribute, descriptor->zero = 0; } -void install_handler(void (*handler_function)(), u16 type_attribute, u8 entry) { - format_descriptor((u32)handler_function, KERNEL_CODE_SEGMENT_OFFSET, - type_attribute, &IDT_Entry[entry]); -} - __attribute__((no_caller_saved_registers)) void EOI(u8 irq) { if (irq > 7) outb(SLAVE_PIC_COMMAND_PORT, 0x20); @@ -51,7 +46,7 @@ __attribute__((no_caller_saved_registers)) void EOI(u8 irq) { outb(MASTER_PIC_COMMAND_PORT, 0x20); } -__attribute__((interrupt)) void general_protection_fault(registers_t *regs) { +void general_protection_fault(reg_t *regs) { klog("General Protetion Fault", 0x1); kprintf(" Error Code: %x\n", regs->error_code); kprintf("Instruction Pointer: %x\n", regs->eip); @@ -62,7 +57,7 @@ __attribute__((interrupt)) void general_protection_fault(registers_t *regs) { EOI(0xD - 8); } -__attribute__((interrupt)) void double_fault(registers_t *regs) { +void double_fault(registers_t *regs) { (void)regs; klog("DOUBLE FAULT", LOG_ERROR); asm("hlt"); @@ -77,7 +72,7 @@ void jump_process(const process_t *p) { void none_save_switch(void); extern PageDirectory *active_directory; -__attribute__((interrupt)) void page_fault(registers_t *regs) { +void page_fault(reg_t *regs) { volatile uint32_t cr2; asm volatile("mov %%cr2, %0" : "=r"(cr2)); kprintf("CR2: %x\n", cr2); @@ -190,7 +185,56 @@ void IRQ_clear_mask(unsigned char IRQline) { outb(port, value); } +// TODO: Maybe lay these out using assembly, macro or via a linker +// script? +void *isr_list[] = { + isr0, isr1, isr2, isr3, isr4, isr5, isr6, isr7, isr8, + isr9, isr10, isr11, isr12, isr13, isr14, isr15, isr16, isr17, + isr18, isr19, isr20, isr21, isr22, isr23, isr24, isr25, isr26, + isr27, isr28, isr29, isr30, isr31, isr32, isr33, isr34, isr35, + isr36, isr37, isr38, isr39, isr40, isr41, isr42, isr43, isr44, + isr45, isr46, isr47, isr48, isr49, isr50, isr51, isr52, isr53, + isr54, isr55, isr56, isr57, isr58, isr59, isr60, isr61, isr62, + isr63, isr64, isr65, isr66, isr67, isr68, isr69, isr70, isr71, + isr72, isr73, isr74, isr75, isr76, isr77, isr78, isr79, isr80, + isr81, isr82, isr83, isr84, isr85, isr86, isr87, isr88, isr89, + isr90, isr91, isr92, isr93, isr94, isr95, isr96, isr97, isr98, + isr99, isr100, isr101, isr102, isr103, isr104, isr105, isr106, isr107, + isr108, isr109, isr110, isr111, isr112, isr113, isr114, isr115, isr116, + isr117, isr118, isr119, isr120, isr121, isr122, isr123, isr124, isr125, + isr126, isr127, isr128, isr129, isr130, isr131, isr132, isr133, isr134, + isr135, isr136, isr137, isr138, isr139, isr140, isr141, isr142, isr143, + isr144, isr145, isr146, isr147, isr148, isr149, isr150, isr151, isr152, + isr153, isr154, isr155, isr156, isr157, isr158, isr159, isr160, isr161, + isr162, isr163, isr164, isr165, isr166, isr167, isr168, isr169, isr170, + isr171, isr172, isr173, isr174, isr175, isr176, isr177, isr178, isr179, + isr180, isr181, isr182, isr183, isr184, isr185, isr186, isr187, isr188, + isr189, isr190, isr191, isr192, isr193, isr194, isr195, isr196, isr197, + isr198, isr199, isr200, isr201, isr202, isr203, isr204, isr205, isr206, + isr207, isr208, isr209, isr210, isr211, isr212, isr213, isr214, isr215, + isr216, isr217, isr218, isr219, isr220, isr221, isr222, isr223, isr224, + isr225, isr226, isr227, isr228, isr229, isr230, isr231, isr232, isr233, + isr234, isr235, isr236, isr237, isr238, isr239, isr240, isr241, isr242, + isr243, isr244, isr245, isr246, isr247, isr248, isr249, isr250, isr251, + isr252, isr253, isr254, isr255, +}; + +void (*list_of_handlers[256])(reg_t *); + +void int_handler(reg_t *r) { + list_of_handlers[r->int_no](r); +} + +void install_handler(void (*handler_function)(), u16 type_attribute, u8 entry) { + format_descriptor((u32)isr_list[entry], KERNEL_CODE_SEGMENT_OFFSET, + type_attribute, &IDT_Entry[entry]); + list_of_handlers[entry] = handler_function; +} + void idt_init(void) { + // list_of_handlers = kcalloc(sizeof(void *), 128); + memset(list_of_handlers, 0, sizeof(void *) * 256); + install_handler(page_fault, INT_32_INTERRUPT_GATE(0x0), 0xE); install_handler(double_fault, INT_32_INTERRUPT_GATE(0x0), 0x8); install_handler(general_protection_fault, INT_32_INTERRUPT_GATE(0x0), 0xD); |