aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent1b8b0252699d417f1677527a69450660d304b756 (diff)
downloadgftos-f1dee4bc58e4bfb97a1b41831c5d4fc327882991.tar.gz
random shit
Diffstat (limited to 'src')
-rw-r--r--src/boot/boot.s1
-rw-r--r--src/include/idt.h5
-rw-r--r--src/include/kernel.h3
-rw-r--r--src/kernel/idt.c29
-rw-r--r--src/kernel/kernel.c10
-rw-r--r--src/kernel/stub_table.asm33
6 files changed, 60 insertions, 21 deletions
diff --git a/src/boot/boot.s b/src/boot/boot.s
index 22d32f3..8df5c6b 100644
--- a/src/boot/boot.s
+++ b/src/boot/boot.s
@@ -47,6 +47,7 @@ _start:
extern get_idtr
call get_idtr
lidt [idtr]
+ sti
[bits 32]
extern kernel_main
diff --git a/src/include/idt.h b/src/include/idt.h
index b8413b8..78d736b 100644
--- a/src/include/idt.h
+++ b/src/include/idt.h
@@ -9,9 +9,6 @@ typedef struct Gate_Descriptor {
uint16_t offset_high;
} __attribute__((packed)) Gate_Descriptor_t;
-typedef Gate_Descriptor_t *IDT_t;
-
-Gate_Descriptor_t make_gate(uint32_t offset, uint8_t segment_selector,
- uint8_t attrs);
+void make_gate(uint32_t offset, uint8_t attrs, uint8_t vec);
void get_idtr();
diff --git a/src/include/kernel.h b/src/include/kernel.h
new file mode 100644
index 0000000..2310647
--- /dev/null
+++ b/src/include/kernel.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void kernel_panic(const char *);
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;
}
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 1fca95b..b582e85 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -1,3 +1,4 @@
+#include "kernel.h"
#include "print.h"
#if defined(__linux__)
@@ -40,9 +41,18 @@ void motd() {
printf("%c", 188);
}
+void kernel_panic(const char *error) {
+ print_set_color(PRINT_COLOR_BLACK, PRINT_COLOR_RED);
+ print_clear();
+ printf(" PANIC! ERROR: %s", error);
+ for (;;)
+ ;
+}
+
void kernel_main(void) {
print_clear();
motd();
+ /* kernel_panic("test_panic."); */
// for (int r = 0; r < 24; r++) {
// for (int c = 0; c < 80; c += 3) {
// int color = (r + c) % 15 + 1;
diff --git a/src/kernel/stub_table.asm b/src/kernel/stub_table.asm
new file mode 100644
index 0000000..9901cea
--- /dev/null
+++ b/src/kernel/stub_table.asm
@@ -0,0 +1,33 @@
+extern exception_handler
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_err_stub 0
+isr_no_err_stub 0
+isr_err_stub 0
+isr_err_stub 0
+isr_err_stub 0
+isr_err_stub 0
+isr_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_no_err_stub 0
+isr_err_stub 0
+isr_no_err_stub 0