Init IDT
This commit is contained in:
25
kernel/hal/x86_64/idt.c
Normal file
25
kernel/hal/x86_64/idt.c
Normal file
@ -0,0 +1,25 @@
|
||||
#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");
|
||||
}
|
Reference in New Issue
Block a user