#include "arch/x86_64/tables.h" #include "arch/x86_64/idt.h" #include "print.h" __attribute__((aligned(0x10))) static interrupt_gate_t s_idtd[256]; kernel_isr_handler_t kernel_isr_handles[256]; void isr_handle(ivt_state_t* state) { kernel_isr_handler_t kernel_handle = kernel_isr_handles[state->num]; if(kernel_handle) { kernel_handle(state); return; } kpanic_state(state, "Unhandled interrupt %i", state->num); } void ivt_setup(void) { extern uintptr_t __ivt[256]; for(int i = 0; i < 256; i++) { uintptr_t base = __ivt[i]; s_idtd[i] = (interrupt_gate_t) { .base_0_15 = (base & 0xFFFF), .cs = GDT_OFFSET_KERNEL_CODE, .ist = 0, .type_flags = IDT_TYPE_INT_GATE | IDT_FLAG_DPL(0) | IDT_FLAG_P, .base_16_31 = (base >> 16) & 0xFFFF, .base_32_63 = (base >> 32) & 0xFFFFFFFF, .resv = 0 }; } } void idt_setup(processor_t *processor) { processor->idtr.base = (uintptr_t)&s_idtd; processor->idtr.length = sizeof(s_idtd) - 1; klogf("%X\n", s_idtd[0].type_flags); __asm__ volatile("lidt %0":: "m"(processor->idtr)); __asm__ volatile("cli"); }