#include #include "idt.h" #include "kprintf.h" #define ENTRIES 256 static IdtGate idtgates[ENTRIES] = {0}; static Idt idt; void idt_setgate(int i, uint64_t handler, uint8_t flags) { idtgates[i].isrlow = (uint16_t)handler; idtgates[i].kernelcs = 40; idtgates[i].ist = 0; idtgates[i].resv = 0; idtgates[i].attrs = flags; idtgates[i].isrmid = (uint16_t)(handler >> 16); idtgates[i].isrhigh = (uint16_t)(handler >> 32); } void idt_init(void) { idt.base = (uint64_t)&idtgates; idt.limit = ENTRIES * sizeof(IdtGate) - 1; asm volatile("lidt %0" :: "m"(idt) : "memory"); LOG("idt", "idt init\n"); }