summaryrefslogtreecommitdiff
path: root/src/idt/idt.c
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-07-26 15:32:32 +0200
committerCarlos Maiolino <[email protected]>2025-08-01 13:07:38 +0200
commit57d8e2b236c7a185bdd941c247ef0dcc5961a24e (patch)
tree1d1f496510c77422647f1513c3ca6f85e0110689 /src/idt/idt.c
parent80ac430366d65ef89a078832380a021308bbbfdf (diff)
Implement interrupt descriptor table
Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'src/idt/idt.c')
-rw-r--r--src/idt/idt.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/idt/idt.c b/src/idt/idt.c
new file mode 100644
index 0000000..d7a6743
--- /dev/null
+++ b/src/idt/idt.c
@@ -0,0 +1,42 @@
+#include <stdint.h>
+#include <toxic/config.h>
+#include <toxic/string.h>
+#include <toxic/vga.h>
+#include <toxic/idt.h>
+
+struct int_descriptor int_table[TOTAL_INTERRUPTS];
+struct int_reg_descriptor idtr_descriptor;
+
+extern void idt_load(struct int_reg_descriptor *desc);
+
+static void
+idt_zero()
+{
+ vprintl("Illegal operation: Divide by zero\n");
+}
+
+static void
+idt_set(int int_num, void *addr)
+{
+ struct int_descriptor *desc = &int_table[int_num];
+
+ desc->offset_low = (uint32_t) addr & 0x0000FFFF;
+ desc->selector = KERNEL_CODE_SELECTOR;
+ desc->reserved = 0x00;
+ desc->type_attr = TOXIC_INT_ATTR;
+ desc->offset_high = (uint32_t) addr >> 16;
+}
+
+void
+interrupts_init(void)
+{
+ memset(int_table, 0, sizeof(int_table));
+
+ idtr_descriptor.limit = sizeof(int_table) - 1;
+ idtr_descriptor.base = (uint32_t) int_table;
+
+ idt_set(0, idt_zero);
+
+ idt_load(&idtr_descriptor);
+}
+