#include #include #define IDT_MAX_DESCRIPTORS 256 #define ATTR_KERN_32 0x8E // active(1), ring 0 (00), interrupt gate(0), 32 bit (1110) #define SEGMENT_KERN 0x08 extern void load_idt(void); extern void enable_int(void); extern void isr0(); extern void isr1(); extern void isr8(); extern void isr13(); extern void isr14(); extern void isr32(); extern void isr33(); void* isr_stub_table[256] = { [0] = isr0, [1] = isr1, [8] = isr8, [13] = isr13, [14] = isr14, [32] = isr32, [33] = isr33, }; idt_entry idt[IDT_MAX_DESCRIPTORS]; idt_ptr idtr; void set_idtr(uint8_t vector, void* isr, uint8_t attributes) { idt_entry* desc = &idt[vector]; desc->isr_low = (uint32_t)isr & 0xFFFF; desc->kernel_cs = SEGMENT_KERN; desc->reserved = 0; desc->attributes = attributes; desc->isr_high = ((uint32_t)isr >> 16) & 0xFFFF; } void init_idt() { idtr.limit = (sizeof(idt_entry) * IDT_MAX_DESCRIPTORS) - 1; idtr.base = (uint32_t)&idt; for (int i = 0; i < IDT_MAX_DESCRIPTORS; i++) { if (isr_stub_table[i] != 0) { set_idtr(i, isr_stub_table[i], ATTR_KERN_32); } else { set_idtr(i, 0, 0); } } load_idt(); enable_int(); }