#include #include #include #define IDT_ENTRIES 256 struct idt_entry idt[IDT_ENTRIES]; struct idt_ptr idtp; extern void idt_load(uint32_t); void idt_install(void) { idtp.limit = sizeof(struct idt_entry) * IDT_ENTRIES - 1; idtp.base = (uint32_t)&idt; memset(&idt, 0, sizeof(struct idt_entry) * IDT_ENTRIES); /* Set entries for IRQs/ISRs here using `idt_set_entry(...)` */ /* Example: idt_set_entry(0, (uint32_t)isr0, 0x08, 0x8E); */ idt_load((uint32_t)&idtp); } void pic_remap(void) { outb(0x20, 0x11); /* Start init for master PIC */ outb(0xA0, 0x11); /* Start init for slave PIC */ outb(0x21, 0x20); /* Master PIC vector offset */ outb(0xA1, 0x28); /* Slave PIC vector offset */ outb(0x21, 0x04); /* Tell Master PIC about Slave PIC at IRQ2 */ outb(0xA1, 0x02); /* Tell Slave PIC its cascade identity */ outb(0x21, 0x01); /* 8086/88 mode */ outb(0xA1, 0x01); outb(0x21, 0x0); /* Unmask master */ outb(0xA1, 0x0); /* Unmask slave */ } void idt_set_entry(int num, uint32_t base, uint16_t sel, uint8_t flags) { idt[num].base_low = base & 0xFFFF; idt[num].base_high = (base >> 16) & 0xFFFF; idt[num].sel = sel; idt[num].always0 = 0; idt[num].flags = flags; } extern void IRQ0_handler(void); extern void isr0(void); extern void isr1(void); extern void isr2(void); extern void isr3(void); extern void isr4(void); extern void isr5(void); extern void isr6(void); extern void isr7(void); extern void isr8(void); extern void isr9(void); extern void isr10(void); extern void isr11(void); extern void isr12(void); extern void isr13(void); extern void isr14(void); extern void isr15(void); extern void isr16(void); extern void isr17(void); extern void isr18(void); extern void isr19(void); extern void isr20(void); extern void isr21(void); extern void isr22(void); extern void isr23(void); extern void isr24(void); extern void isr25(void); extern void isr26(void); extern void isr27(void); extern void isr28(void); extern void isr29(void); extern void isr30(void); extern void isr31(void); extern void isr33(void); extern void isr128(void); void idt_install_isrs(void) { idt_set_entry(0, (uint32_t)isr0, 0x08, 0x8E); idt_set_entry(1, (uint32_t)isr1, 0x08, 0x8E); idt_set_entry(2, (uint32_t)isr2, 0x08, 0x8E); idt_set_entry(3, (uint32_t)isr3, 0x08, 0x8E); idt_set_entry(4, (uint32_t)isr4, 0x08, 0x8E); idt_set_entry(5, (uint32_t)isr5, 0x08, 0x8E); idt_set_entry(6, (uint32_t)isr6, 0x08, 0x8E); idt_set_entry(7, (uint32_t)isr7, 0x08, 0x8E); idt_set_entry(8, (uint32_t)isr8, 0x08, 0x8E); idt_set_entry(9, (uint32_t)isr9, 0x08, 0x8E); idt_set_entry(10, (uint32_t)isr10, 0x08, 0x8E); idt_set_entry(11, (uint32_t)isr11, 0x08, 0x8E); idt_set_entry(12, (uint32_t)isr12, 0x08, 0x8E); idt_set_entry(13, (uint32_t)isr13, 0x08, 0x8E); idt_set_entry(14, (uint32_t)isr14, 0x08, 0x8E); idt_set_entry(15, (uint32_t)isr15, 0x08, 0x8E); idt_set_entry(16, (uint32_t)isr16, 0x08, 0x8E); idt_set_entry(17, (uint32_t)isr17, 0x08, 0x8E); idt_set_entry(18, (uint32_t)isr18, 0x08, 0x8E); idt_set_entry(19, (uint32_t)isr19, 0x08, 0x8E); idt_set_entry(20, (uint32_t)isr20, 0x08, 0x8E); idt_set_entry(21, (uint32_t)isr21, 0x08, 0x8E); idt_set_entry(22, (uint32_t)isr22, 0x08, 0x8E); idt_set_entry(23, (uint32_t)isr23, 0x08, 0x8E); idt_set_entry(24, (uint32_t)isr24, 0x08, 0x8E); idt_set_entry(25, (uint32_t)isr25, 0x08, 0x8E); idt_set_entry(26, (uint32_t)isr26, 0x08, 0x8E); idt_set_entry(27, (uint32_t)isr27, 0x08, 0x8E); idt_set_entry(28, (uint32_t)isr28, 0x08, 0x8E); idt_set_entry(29, (uint32_t)isr29, 0x08, 0x8E); idt_set_entry(30, (uint32_t)isr30, 0x08, 0x8E); idt_set_entry(31, (uint32_t)isr31, 0x08, 0x8E); idt_set_entry(33, (uint32_t)isr33, 0x08, 0x8E); } void idt_install_syscall(void) { idt_set_entry(128, (uint32_t)isr128, 0x08, 0xEE); }