#include #include #define IDT_MAX_DESCRIPTORS 256 #define ATTR_KERN_32 0x8E // active(1), ring 0 (00), interrupt gate(0), 32 bit (1110) #define ATTR_USER_32 0xEE // active, ring 3, 32bit #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, uint16_t sel, uint8_t attributes) { idt_entry* desc = &idt[vector]; desc->isr_low = (uint32_t)isr & 0xFFFF; desc->selector = 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], SEGMENT_KERN, ATTR_KERN_32); } else { set_idtr(i, 0, SEGMENT_KERN, 0); } } extern void syscall_handler(); set_idtr(0x80, syscall_handler, SEGMENT_KERN, ATTR_USER_32); load_idt(); }