26 lines
628 B
C
26 lines
628 B
C
#include <stdint.h>
|
|
#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");
|
|
}
|