aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/idt.c
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2024-02-05 22:28:34 -0600
committerNic Gaffney <gaffney_nic@protonmail.com>2024-02-05 22:28:34 -0600
commitf1dee4bc58e4bfb97a1b41831c5d4fc327882991 (patch)
treecd86e38556d69696fef0b6bfddfe539c15988868 /src/kernel/idt.c
parent1b8b0252699d417f1677527a69450660d304b756 (diff)
downloadgftos-f1dee4bc58e4bfb97a1b41831c5d4fc327882991.tar.gz
random shit
Diffstat (limited to 'src/kernel/idt.c')
-rw-r--r--src/kernel/idt.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/src/kernel/idt.c b/src/kernel/idt.c
index f3fea4f..2805889 100644
--- a/src/kernel/idt.c
+++ b/src/kernel/idt.c
@@ -2,27 +2,22 @@
#include "gdt.h"
#include <stdint.h>
-IDT_t idt = (IDT_t)0x7fffe;
+static Gate_Descriptor_t idt[256];
extern GDTR_t idtr;
void get_idtr() {
- int base = 0x7fffe;
- uint8_t code_seg = (0b1000 << 3) | 0b000;
-
- // idtr.size = sizeof(Gate_Descriptor_t) * n - 1;
- idtr.size = 0;
- idtr.offset = base;
+ idtr.offset = (uintptr_t)&idt[0];
+ idtr.size = sizeof(Gate_Descriptor_t) * 256 - 1;
+ for (uint8_t vec = 0; vec < 32; vec++) {
+ make_gate(stub_table[vec], 0x8E, vec);
+ }
}
-Gate_Descriptor_t make_gate(uint32_t offset, uint8_t segment_selector,
- uint8_t type) {
- Gate_Descriptor_t ret = (Gate_Descriptor_t){
- .offset_low = offset,
- .reserved = 0,
- .attrs = (0b1000 << 4) | type,
- .offset_high = offset >> 16,
- .segment_selector = segment_selector,
- };
+void make_gate(uint32_t offset, uint8_t attrs, uint8_t vec) {
+ Gate_Descriptor_t *descriptor = &idt[vec];
- return ret;
+ descriptor->offset_low = offset & 0xFFFF;
+ descriptor->attrs = (0b1000 << 4) | attrs;
+ descriptor->offset_high = offset >> 16, descriptor->segment_selector = 0x08;
+ descriptor->reserved = 0;
}