30 lines
777 B
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");
|
|
} |