From ecf636f2797647d5dfc38a4562cae53fe275217d Mon Sep 17 00:00:00 2001 From: Nic Gaffney Date: Tue, 6 Feb 2024 04:58:35 -0600 Subject: Interrupts + basic keyboard driver --- src/kernel/tables/idt.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/kernel/tables/idt.c (limited to 'src/kernel/tables/idt.c') diff --git a/src/kernel/tables/idt.c b/src/kernel/tables/idt.c new file mode 100644 index 0000000..01a6776 --- /dev/null +++ b/src/kernel/tables/idt.c @@ -0,0 +1,27 @@ +#include "idt.h" +#include "gdt.h" +#include "isr.h" +#include + +__attribute__((aligned(0x10))) static Gate_Descriptor_t idt[256]; +extern GDTR_t idtr; +extern void *isr_stub_table; + +void get_idtr() { + idtr.offset = (uintptr_t)&idt[0]; + idtr.size = sizeof(Gate_Descriptor_t) * 256 - 1; + for (uint8_t vec = 0; vec < 32; vec++) { + make_gate(((void **)(isr_stub_table))[vec], 0x8E, vec); + } + make_gate(wrap_keyboard_handler, 0x8E, 0x21); +} + +void make_gate(void *isr, uint8_t attrs, uint8_t vec) { + Gate_Descriptor_t *descriptor = &idt[vec]; + + descriptor->offset_low = (uint32_t)isr & 0xFFFF; + descriptor->attrs = (0b1000 << 4) | attrs; + descriptor->offset_high = (uint32_t)isr >> 16; + descriptor->segment_selector = 0x08; + descriptor->reserved = 0; +} -- cgit v1.2.3