aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/idt.c
diff options
context:
space:
mode:
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;
}