static int ioapic_handler(struct int_context *context, struct kernel_dispatch_info *kdi) { // kprintf("IO APIC Interrupt Vector %d, IRQ %d\n", context->vector, vector_map[context->vector].irq); u32 result = 1; int irq = vector_map[context->vector].irq; // Disable IRQ ioapic_disable_irq(irq); // Dispatch kdi->dispatch_type = kdisp_interrupt; kdi->interrupt.irq = irq; kdi->interrupt.vector = context->vector; switch (irq) { case 0: //result = hal_interrupt_handler_global_timer(); break; case 1: result = keyboard_interrupt_handler(context, kdi); break; default: break; } // Enable IRQ lapic_eoi(); ioapic_enable_irq(irq); return result; }
extern void interrupt_dispatcher(const unsigned long interrupt_number) { /* Select a handler based on interrupt source. */ switch(interrupt_number) { case 32: { timer_interrupt_handler(); break; } case 33: { keyboard_interrupt_handler(); break; } case 39: { /* Spurious interrupt occurred. This could happen if we spend too long time with interrupts disabled. */ break; } default: { kprints("Unknown interrupt. Vector:"); kprinthex(interrupt_number); kprints("\n"); while(1) { outw(0x8a00, 0x8a00); outw(0x8a00, 0x8ae0); } } } /* Acknowledge interrupt so that new interrupts can be sent to the CPU. */ if (interrupt_number < 48) { if (interrupt_number >= 40) { outb(0xa0, 0x20); } outb(0x20, 0x20); } }