mirror of
https://github.com/gbowne1/ClassicOS.git
synced 2025-05-15 09:01:27 -07:00
106 lines
2.8 KiB
C
106 lines
2.8 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 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();
|
|
}
|