#include "src/kernel/idt.h" struct idt_entry { uint16_t offset_low; uint16_t selector; uint8_t ist; uint8_t flags; uint16_t offset_mid; uint32_t offset_high; uint32_t zero; } __attribute__((packed)); struct idt_descriptor { uint16_t size; uint64_t offset; } __attribute__((packed)); static struct idt_entry idt[256]; static struct idt_descriptor idt_desc; static void idt_load() { idt_desc.size = sizeof(idt) - 1; idt_desc.offset = (uint64_t)&idt; __asm__ volatile("lidt %0" : : "m"(idt_desc)); } inline void idt_init() { idt_load(); } void idt_set_entry(int vector, void (*handler)(struct interrupt_frame *), uint8_t flags) { uint64_t addr = (uint64_t)handler; idt[vector].offset_low = addr & 0xFFFF; idt[vector].selector = 0x0010; idt[vector].ist = 0; idt[vector].flags = flags; idt[vector].offset_mid = (addr >> 16) & 0xFFFF; idt[vector].offset_high = (addr >> 32) & 0xFFFFFFFF; idt[vector].zero = 0; }