41 lines
954 B
C
41 lines
954 B
C
#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;
|
|
}
|