From 7bf2c634fdb55d67affe74a2ed0a157610308942 Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Mon, 30 Aug 2021 08:26:05 -0500 Subject: i386: create idt.c and isr.s Create files that add IDT support for i386. Signed-off-by: Danny Holman --- arch/i386/boot/idt.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 arch/i386/boot/idt.c (limited to 'arch/i386/boot/idt.c') diff --git a/arch/i386/boot/idt.c b/arch/i386/boot/idt.c new file mode 100644 index 0000000..752b679 --- /dev/null +++ b/arch/i386/boot/idt.c @@ -0,0 +1,50 @@ +#include +#include + +struct idt_entry { + uint16_t isr_low; + uint16_t kernel_cs; + uint8_t reserved; + uint8_t attributes; + uint16_t isr_high; +} __attribute__((packed)); + +struct idt_ptr { + uint16_t limit; + uint32_t base; +} __attribute__((packed)); + +__attribute__((aligned(0x10))) +static struct idt_entry idt[256]; +static struct idt_ptr idtr; + +__attribute__((noreturn)) +void exception_handler(int in) { + kprintf("EXCEPTION %d CAUGHT\n", in); +} + +extern void* isr_stub_table[]; + +void idt_set_descriptor(uint8_t vector, void *isr, uint8_t flags) { + struct idt_entry *desc = &idt[vector]; + + desc->isr_low = (uint32_t)isr & 0xFFFF; + desc->kernel_cs = 0x08; + desc->attributes = flags; + desc->isr_high = (uint32_t)isr >> 16; + desc->reserved = 0; +} + +void idt_install(void) { + idtr.base = (uintptr_t)&idt[0]; + idtr.limit = (uint16_t)sizeof(struct idt_entry) * 256 - 1; + + for (uint8_t vector = 0; vector < 32; vector++) { + idt_set_descriptor(vector, isr_stub_table[vector], 0x8E); + isr_stub_table[vector] = 1; + } + + __asm__ volatile("lidt %0" : : "memory"(idtr)); + __asm__ volatile("sti"); + kprintf("Interrupts on\n"); +} -- cgit v1.2.3