#include "interrupts.h" #include "kpanic.h" #include "kprintf.h" #include "power.h" #include "utils.h" #include #include const char *faults[] = { "division by zero", "debugger", "NMI", "breakpoint", "overflow", "bounds", "invalid opcode", "coprocessor not available", "double fault", "coprocessor segement overrun", "invalid task state segment", "segment not present", "stack fault", "general protection fault", "page fault", "reserved", "math fault", "alignment check", "machine check", "SIMD floating point exception", }; static isr_t interrupt_handlers[16]; void isr_handler(struct registers *regs) { uint8_t i = 0; while (i < ARRAY_SIZE(faults)) { if (i == regs->int_no) kpanic("interrupt: %s\n", faults[i]); i++; } kprintf(KERN_ERR "interrupt triggered with no matching code\n"); } void register_interrupt_handler(int i, isr_t handler) { interrupt_handlers[i] = handler; } void irq_handler(struct registers *regs) { if (regs->int_no != 0) { isr_t handler = interrupt_handlers[regs->int_no - 32]; handler(regs); } pic_send_eoi(regs->int_no); }