2025-04-30 23:03:44 -07:00

44 lines
1.1 KiB
C

#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 isr13();
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
idt_set_gate(0, (uint32_t)isr0); // Divide by zero
idt_set_gate(13, (uint32_t)isr13); // General protection fault
idt_load();
}