From c85b97abeedbcc7d20655530a4494d0a013ce197 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 2 Feb 2023 15:52:06 +0200 Subject: [PATCH] Kernel: fix some of i368 IDT. This was really broken --- kernel/arch/i386/IDT.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/kernel/arch/i386/IDT.cpp b/kernel/arch/i386/IDT.cpp index 426ca869..23045380 100644 --- a/kernel/arch/i386/IDT.cpp +++ b/kernel/arch/i386/IDT.cpp @@ -74,7 +74,7 @@ namespace IDT static IDTR s_idtr; static GateDescriptor* s_idt = nullptr; - static void(**s_irq_handlers)(); + static void(*s_irq_handlers[16])() { nullptr }; INTERRUPT_HANDLER____(0x00, "Division Error") INTERRUPT_HANDLER____(0x01, "Debug") @@ -111,22 +111,19 @@ namespace IDT extern "C" void handle_irq() { - uint8_t irq = 0; - for (uint32_t i = 0; i <= 0xFF; i++) + uint8_t irq; + for (uint32_t i = 0; i < 16; i++) { if (InterruptController::get().is_in_service(i)) { irq = i; - break; + goto found; } } - if (irq == 0) - { - dprintln("Spurious irq"); - return; - } - + dprintln("Spurious irq"); + return; +found: if (s_irq_handlers[irq]) s_irq_handlers[irq](); else @@ -171,7 +168,7 @@ namespace IDT void register_irq_handler(uint8_t irq, void(*f)()) { - s_irq_handlers[IRQ_VECTOR_BASE + irq] = f; + s_irq_handlers[irq] = f; register_interrupt_handler(IRQ_VECTOR_BASE + irq, handle_irq_common); flush_idt(); } @@ -183,15 +180,9 @@ namespace IDT s_idt = (GateDescriptor*)kmalloc_eternal(idt_size); memset(s_idt, 0x00, idt_size); - s_irq_handlers = (void(**)())kmalloc_eternal(0x100 * sizeof(void(*)())); - memset(s_irq_handlers, 0x00, 0x100 * sizeof(void(*)())); - s_idtr.offset = s_idt; s_idtr.size = idt_size - 1; - for (uint8_t i = 0x00; i <= 0xFF - IRQ_VECTOR_BASE; i++) - register_irq_handler(i, nullptr); - REGISTER_HANDLER(0x00); REGISTER_HANDLER(0x01); REGISTER_HANDLER(0x02);