diff --git a/kernel/idt.cpp b/kernel/idt.cpp index e02b131..d825eb0 100644 --- a/kernel/idt.cpp +++ b/kernel/idt.cpp @@ -37,7 +37,9 @@ struct IDTEntry { // last 3 bits should be 0, since i want to use the GDT and be on ring 0 IDTEntry(const void* address) : IDTEntry(address, 0b101'000, 0, GateType::Interrupt) {} - IDTEntry() : IDTEntry(nullptr) {} + IDTEntry(void (*func)()) : IDTEntry(reinterpret_cast(func)) {} + + IDTEntry() : IDTEntry(static_cast(nullptr)) {} }; static IDTEntry idt_table[256]; @@ -208,28 +210,29 @@ void kernel::interrupt::init() { idt_table[i] = IDTEntry(); } - ([] { - ((idt_table[Values] = IDTEntry(reinterpret_cast(&raw_interrupt_handler))), - ...); - }) - . - operator()<0, 1, 2, 3, 4, 5, 6, 7, 9, 15, 16>(); +#define REMOVE_PARENS(...) __VA_ARGS__ +#define CONST_FOR_EACH(var, expr, values) \ + ([] { ((expr), ...); }).operator()() + + CONST_FOR_EACH( + number, + idt_table[number] = IDTEntry(&raw_interrupt_handler), + (0, 1, 2, 3, 4, 5, 6, 7, 9, 15, 16) + ); - ([] { - ((idt_table[Values] = IDTEntry(reinterpret_cast(&raw_interrupt_error_handler))), - ...); - }) - . - operator()<8, 10, 11, 12, 13, 14>(); + CONST_FOR_EACH( + number, + idt_table[number] = IDTEntry(&raw_interrupt_error_handler), + (8, 10, 11, 12, 13, 14) + ); // setup handlers for IRQs - ([] { - ((idt_table[PIC_IRQ_OFFSET + Values] = - IDTEntry(reinterpret_cast(&raw_interrupt_handler))), - ...); - }) - . - operator()<0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15>(); + CONST_FOR_EACH( + number, + idt_table[PIC_IRQ_OFFSET + number] = + IDTEntry(&raw_interrupt_handler), + (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) + ); idt_register.size = sizeof(idt_table) - 1; idt_register.addr = &idt_table[0];