quark/src/kernel/arch/i686/idt.c
2022-06-18 00:44:37 +02:00

42 líneas
1 KiB
C

#include "idt.h"
#include "../../util/binary.h"
typedef struct{
uint16_t base_low;
uint16_t segment_selector;
uint8_t reserved;
uint8_t flags;
uint16_t base_high;
} idt_entry;
typedef struct{
uint16_t limit;
idt_entry *ptr;
} idt_descriptor;
idt_entry g_idt[256];
idt_descriptor g_idt_descriptor = {sizeof(g_idt) - 1, g_idt};
void __attribute__((cdecl)) i686_idt_load(idt_descriptor *descriptor);
void i686_idt_set_gate(int interrupt, void *base, uint16_t segment_descriptor, uint8_t flags){
g_idt[interrupt].base_low = ((uint32_t)base) & 0xFFFF;
g_idt[interrupt].segment_selector = segment_descriptor;
g_idt[interrupt].reserved = 0;
g_idt[interrupt].flags = flags;
g_idt[interrupt].base_high = ((uint32_t)base >> 16) & 0xFFFF;
}
void i686_idt_enable_gate(int interrupt){
FLAG_SET(g_idt[interrupt].flags, IDT_FLAG_PRESENT);
}
void i686_idt_disable_gate(int interrupt){
FLAG_UNSET(g_idt[interrupt].flags, IDT_FLAG_PRESENT);
}
void i686_idt_initialize(){
i686_idt_load(&g_idt_descriptor);
}