HhhOS/arch/x86_64/drivers/idt/idt.c
2021-08-17 12:45:35 +03:00

48 lines
1.3 KiB
C

#include <drivers/idt/idt.h>
#include <drivers/terminal/terminal.h>
__attribute__((aligned(0x10)))
static idt_entry_t idt[256];
static idtr_t idtr;
void idt_init() {
idtr.base = (uintptr_t)&idt[0];
idtr.limit = (u16)sizeof(idt_entry_t) * 256 - 1;
asm volatile ("lidt %0" : : "memory"(idtr)); // load the new IDT
asm volatile ("sti"); // set the interrupt flag
}
void idt_set_entry(u8 vector, void* isr, u8 flags) {
idt_entry_t* entry = &idt[vector];
entry->isr_low = (u64)isr & 0xFFFF;
entry->kernel_cs = KERNEL_CODE_SEGMENT_OFFSET;
entry->ist = 0;
entry->attributes = flags;
entry->isr_mid = ((u64)isr >> 16) & 0xFFFF;
entry->isr_high = ((u64)isr >> 32) & 0xFFFFFFFF;
entry->reserved = 0;
}
/*
void idt_init() {
idt_address = (unsigned long)idt;
idt_ptr[0] = (sizeof (struct idt_entry) * 256) + ((idt_address & 0xffff) << 16);
idt_ptr[1] = idt_address >> 16;
__asm__ __volatile__(
"lidt %0\n\t"
"sti\n\t" : : "m"(idt_ptr)
);
}
void idt_register_handler(u8 interrupt, unsigned long address) {
idt[interrupt].offset_lowerbits = address & 0xffff;
idt[interrupt].selector = KERNEL_CODE_SEGMENT_OFFSET;
idt[interrupt].zero = 0;
idt[interrupt].type_attr = INTERRUPT_GATE;
idt[interrupt].offset_higherbits = (address & 0xffff0000) >> 16;
}
*/