#include "idt.h" #include "kstdio.h" idt_t IDT[256]; extern void asm_load_idt(idt_pointer_t *); extern void inthandler_default(void); extern int *isr; void idt_load_gate(int num, void *pointer, short gdt_selector, unsigned char attrib) { if(num == 0) { kputdec(num); kputhex((int)pointer); kputhex((int)gdt_selector); kputhex((int)attrib); kputc('\n'); } IDT[num].pointer_low = (short)pointer & 0xFFFF; IDT[num].pointer_high = ((int)pointer >> 16) & 0xFFFF; IDT[num].gdt_selector = gdt_selector; IDT[num].attrib = attrib; } void idt_init(void) { for(int i = 0; i <= 18; i++) { idt_load_gate(i, isr[i], 0x08, IDT_ATTRIB_PRESENT | IDT_ATTRIB_KERNELMODE | IDT_GATE_INTERRUPT); kputhex(isr[i]); kputc('\n'); } for(int i = 19; i <= 255; i++) { idt_load_gate(i, inthandler_default, 0x08, IDT_ATTRIB_PRESENT | IDT_ATTRIB_KERNELMODE | IDT_GATE_INTERRUPT); } idt_pointer_t idt_point; idt_point.size = sizeof(IDT) - 1; idt_point.pointer = &IDT; asm_load_idt(&idt_point); } void int_handler(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax, int interrupt, int error) { if((interrupt == 255) && (error == 255)) kputs("Unsupported interrupt.\n"); kputs("Recieved interrupt #"); kputdec(interrupt); kputs(", with error #"); kputdec(error); kputc('\n'); }