From 8ed5a71c45098d85b6e4fb9a2327899ab86eeb3f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 13 Aug 2025 18:27:12 +0300 Subject: [PATCH] Kernel: Register IDT handlers from a vector This drops code size by a lot :D --- kernel/kernel/IDT.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index f4f7b466..516546cf 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -433,19 +433,28 @@ namespace Kernel memset(idt->m_idt.data(), 0x00, 0x100 * sizeof(GateDescriptor)); -#define X(num) idt->register_interrupt_handler(num, isr ## num); - ISR_LIST_X +#define X(num) &isr##num, + static constexpr void (*isr_handlers[])() { + ISR_LIST_X + }; #undef X +#define X(num) &irq##num, + static constexpr void (*irq_handlers[])() { + IRQ_LIST_X + }; +#undef X + + for (size_t i = 0; i < sizeof(isr_handlers) / sizeof(*isr_handlers); i++) + idt->register_interrupt_handler(i, isr_handlers[i]); + for (size_t i = 0; i < sizeof(irq_handlers) / sizeof(*irq_handlers); i++) + idt->register_interrupt_handler(IRQ_VECTOR_BASE + i, irq_handlers[i]); + #if ARCH(x86_64) idt->register_interrupt_handler(DoubleFault, isr8, 1); static_assert(DoubleFault == 8); #endif -#define X(num) idt->register_interrupt_handler(IRQ_VECTOR_BASE + num, irq ## num); - IRQ_LIST_X -#undef X - idt->register_interrupt_handler(IRQ_YIELD, asm_yield_handler); idt->register_interrupt_handler(IRQ_IPI, asm_ipi_handler); idt->register_interrupt_handler(IRQ_TIMER, asm_timer_handler);