#include "idt.h" #include "io.h" #define KERNEL_CS 0x08 // Kernel code segment selector idt_entry_t idt[IDT_ENTRIES]; idt_ptr_t idt_ptr; // External assembly stubs for ISRs (provided below) extern void isr0(); extern void isr1(); extern void isr2(); extern void isr3(); extern void isr4(); extern void isr5(); extern void isr6(); extern void isr7(); extern void isr8(); extern void isr9(); extern void isr10(); extern void isr11(); extern void isr12(); extern void isr13(); extern void isr14(); extern void isr15(); extern void isr16(); extern void isr17(); extern void isr18(); extern void isr19(); extern void isr20(); extern void isr21(); extern void isr22(); extern void isr23(); extern void isr24(); extern void isr25(); extern void isr26(); extern void isr27(); extern void isr28(); extern void isr29(); extern void isr30(); extern void isr31(); extern void isr_default(); // Helper to set an IDT gate void idt_set_gate(int n, uint32_t handler) { idt[n].offset_low = handler & 0xFFFF; idt[n].selector = KERNEL_CS; idt[n].zero = 0; idt[n].type_attr = 0x8E; // Present, ring 0, 32-bit interrupt gate idt[n].offset_high = (handler >> 16) & 0xFFFF; } // Load IDT via lidt static void idt_load() { asm volatile("lidt (%0)" : : "r" (&idt_ptr)); } // IDT initialization void idt_init() { idt_ptr.limit = sizeof(idt_entry_t) * IDT_ENTRIES - 1; idt_ptr.base = (uint32_t)&idt; // Clear all entries for (int i = 0; i < IDT_ENTRIES; i++) { idt_set_gate(i, (uint32_t)isr_default); } // Set specific handlers // Assign CPU exception handlers idt_set_gate(0, (uint32_t)isr0); idt_set_gate(1, (uint32_t)isr1); idt_set_gate(2, (uint32_t)isr2); idt_set_gate(3, (uint32_t)isr3); idt_set_gate(4, (uint32_t)isr4); idt_set_gate(5, (uint32_t)isr5); idt_set_gate(6, (uint32_t)isr6); idt_set_gate(7, (uint32_t)isr7); idt_set_gate(8, (uint32_t)isr8); idt_set_gate(9, (uint32_t)isr9); idt_set_gate(10, (uint32_t)isr10); idt_set_gate(11, (uint32_t)isr11); idt_set_gate(12, (uint32_t)isr12); idt_set_gate(13, (uint32_t)isr13); idt_set_gate(14, (uint32_t)isr14); idt_set_gate(15, (uint32_t)isr15); idt_set_gate(16, (uint32_t)isr16); idt_set_gate(17, (uint32_t)isr17); idt_set_gate(18, (uint32_t)isr18); idt_set_gate(19, (uint32_t)isr19); idt_set_gate(20, (uint32_t)isr20); idt_set_gate(21, (uint32_t)isr21); idt_set_gate(22, (uint32_t)isr22); idt_set_gate(23, (uint32_t)isr23); idt_set_gate(24, (uint32_t)isr24); idt_set_gate(25, (uint32_t)isr25); idt_set_gate(26, (uint32_t)isr26); idt_set_gate(27, (uint32_t)isr27); idt_set_gate(28, (uint32_t)isr28); idt_set_gate(29, (uint32_t)isr29); idt_set_gate(30, (uint32_t)isr30); idt_set_gate(31, (uint32_t)isr31); idt_load(); }