:: commit 03298ffe140dc8b9158efe9712d486d0f74168c8

Mintsuki <mintsuki@protonmail.com> — 2025-09-21 19:17

parents: 773bd3e93f

Revert "sys/idt: Relatively minor code cleanup and removal of repetitions"

This reverts commit 30c5a373aef60e08d771b3016d31b2528139e72a.
diff --git a/common/entry.s2.c b/common/entry.s2.c
index 841fa67f..0ec4defd 100644
--- a/common/entry.s2.c
+++ b/common/entry.s2.c
@@ -90,7 +90,7 @@ noreturn void entry(uint8_t boot_drive, int boot_from) {
     init_e820();
     init_memmap();
 
-    idt_init();
+    idt_init_bios();
 
     disk_create_index();
 
diff --git a/common/sys/idt.c b/common/sys/idt.c
index e8267f09..a1cdcf85 100644
--- a/common/sys/idt.c
+++ b/common/sys/idt.c
@@ -9,6 +9,28 @@
 #include <mm/pmm.h>
 #include <lib/misc.h>
 
+static struct idt_entry *dummy_idt = NULL;
+
+void dummy_isr(void);
+
+void idt_init(void) {
+    size_t dummy_idt_size = 256 * sizeof(struct idt_entry);
+    dummy_idt = ext_mem_alloc(dummy_idt_size);
+
+    for (size_t i = 0; i < 256; i++) {
+        dummy_idt[i].offset_lo = (uint16_t)(uintptr_t)dummy_isr;
+        dummy_idt[i].type_attr = 0x8e;
+#if defined (__i386__)
+        dummy_idt[i].selector = 0x18;
+        dummy_idt[i].offset_hi = (uint16_t)((uintptr_t)dummy_isr >> 16);
+#elif defined (__x86_64__)
+        dummy_idt[i].selector = 0x28;
+        dummy_idt[i].offset_mid = (uint16_t)((uintptr_t)dummy_isr >> 16);
+        dummy_idt[i].offset_hi = (uint32_t)((uintptr_t)dummy_isr >> 32);
+#endif
+    }
+}
+
 int irq_flush_type = IRQ_NO_FLUSH;
 
 void flush_irqs(void) {
@@ -29,7 +51,7 @@ void flush_irqs(void) {
 
     struct idtr new_idt = {
         256 * sizeof(struct idt_entry) - 1,
-        (uintptr_t)idt
+        (uintptr_t)dummy_idt
     };
     asm volatile ("lidt %0" :: "m"(new_idt) : "memory");
 
diff --git a/common/sys/idt.h b/common/sys/idt.h
index 0d7cb0b1..a36cea8a 100644
--- a/common/sys/idt.h
+++ b/common/sys/idt.h
@@ -2,7 +2,6 @@
 #define SYS__IDT_H__
 
 #include <stdint.h>
-#include <stddef.h>
 
 #if defined (__i386__)
 
@@ -38,17 +37,23 @@ struct idt_entry {
 
 #endif
 
+#if defined (BIOS)
+
+extern struct idtr idt;
+
+void idt_init_bios(void);
+
+#endif
+
 enum {
     IRQ_NO_FLUSH,
     IRQ_PIC_ONLY_FLUSH,
     IRQ_PIC_APIC_FLUSH
 };
 
-extern struct idt_entry *idt;
 extern int irq_flush_type;
 
 void idt_init(void);
-void idt_register_isr(size_t vec, void *handler, uint8_t type);
 void flush_irqs(void);
 
 #endif
diff --git a/common/sys/idt.s2.c b/common/sys/idt.s2.c
index 87b93df4..fe224ea0 100644
--- a/common/sys/idt.s2.c
+++ b/common/sys/idt.s2.c
@@ -1,58 +1,35 @@
-#if defined (__x86_64__) || defined (__i386__)
-
 #include <stddef.h>
 #include <stdint.h>
 #include <sys/idt.h>
 #include <lib/misc.h>
-#include <mm/pmm.h>
-
-struct idt_entry *idt = NULL;
-
-void idt_register_isr(size_t vec, void *handler, uint8_t type) {
-    uint32_t p = (uintptr_t)handler;
-
-    idt[vec].offset_lo = (uint16_t)p;
-    idt[vec].type_attr = type;
-#if defined (__i386__)
-    idt[vec].selector = 0x18;
-    idt[vec].offset_hi = (uint16_t)((uintptr_t)p >> 16);
-#elif defined (__x86_64__)
-    idt[vec].selector = 0x28;
-    idt[vec].offset_mid = (uint16_t)((uintptr_t)p >> 16);
-    idt[vec].offset_hi = (uint32_t)((uintptr_t)p >> 32);
-#endif
+
+#if defined (BIOS)
+
+static struct idt_entry idt_entries[32];
+
+__attribute__((section(".realmode")))
+struct idtr idt = {
+    sizeof(idt_entries) - 1,
+    (uintptr_t)idt_entries
+};
+
+static void register_interrupt_handler(size_t vec, void *handler, uint8_t type) {
+    uint32_t p = (uint32_t)handler;
+
+    idt_entries[vec].offset_lo = (uint16_t)p;
+    idt_entries[vec].selector = 0x18;
+    idt_entries[vec].unused = 0;
+    idt_entries[vec].type_attr = type;
+    idt_entries[vec].offset_hi = (uint16_t)(p >> 16);
 }
 
-#if defined (UEFI)
-void dummy_isr(void);
-#elif defined (BIOS)
 extern void *exceptions[];
-#endif
 
-void idt_init(void) {
-#if defined (UEFI)
-    size_t idt_entry_count = 256;
-#elif defined (BIOS)
-    size_t idt_entry_count = 32;
-#endif
-    size_t idt_size = idt_entry_count * sizeof(struct idt_entry);
-    idt = ext_mem_alloc(idt_size);
-
-#if defined (UEFI)
-    for (size_t i = 0; i < idt_entry_count; i++) {
-        idt_register_isr(i, dummy_isr, 0x8e);
-    }
-#elif defined (BIOS)
-    for (size_t i = 0; i < idt_entry_count; i++) {
-        idt_register_isr(i, exceptions[i], 0x8e);
-    }
-
-    struct idtr idtr = {
-        256 * sizeof(struct idt_entry) - 1,
-        (uintptr_t)idt
-    };
-    asm volatile ("lidt %0" :: "m"(idtr) : "memory");
-#endif
+void idt_init_bios(void) {
+    for (size_t i = 0; i < SIZEOF_ARRAY(idt_entries); i++)
+        register_interrupt_handler(i, exceptions[i], 0x8e);
+
+    asm volatile ("lidt %0" :: "m"(idt) : "memory");
 }
 
 #endif
tab: 248 wrap: offon