aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/tables/idt.c
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2024-02-06 04:58:35 -0600
committerNic Gaffney <gaffney_nic@protonmail.com>2024-02-06 04:58:35 -0600
commitecf636f2797647d5dfc38a4562cae53fe275217d (patch)
treec71d113c553821c2b949eb6a6cd67de5f2fce068 /src/kernel/tables/idt.c
parentf1dee4bc58e4bfb97a1b41831c5d4fc327882991 (diff)
downloadgftos-ecf636f2797647d5dfc38a4562cae53fe275217d.tar.gz
Interrupts + basic keyboard driver
Diffstat (limited to 'src/kernel/tables/idt.c')
-rw-r--r--src/kernel/tables/idt.c27
1 files changed, 27 insertions, 0 deletions
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 <stdint.h>
+
+__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;
+}