xnoe-os/idt.c

30 lines
777 B
C

#include "idt.h"
GateEntry idt[256];
void set_entry(uint8_t interrupt_number, uint16_t code_segment, void* handler, uint8_t type) {
uint32_t handler_addr = (uint16_t)handler;
uint16_t* handler_halves = (uint16_t*)&handler_addr;
idt[interrupt_number] = (GateEntry){
.offset_low = handler_halves[0],
.selector = code_segment,
.zero = 0,
.type = type,
.offset_high = handler_halves[1]
};
}
__attribute__((interrupt)) void ignore_interrupt(struct interrupt_frame* frame) {
// Do nothing
}
void init_idt() {
idt_desc desc = {.size = 256 * sizeof(GateEntry) - 1, .offset = (uint32_t)idt};
asm volatile("lidt %0" : : "m" (desc));
for (int i=0; i<256; i++)
set_entry(i, 0x08, &ignore_interrupt, 0x8E);
}
void enable_idt() {
asm ("sti");
}