:: commit 30c5a373aef60e08d771b3016d31b2528139e72a

Mintsuki <mintsuki@protonmail.com> — 2025-09-21 02:43

parents: d316b17e24

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

diff --git a/common/entry.s2.c b/common/entry.s2.c
index 0ec4defd..841fa67f 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_bios();
+    idt_init();
 
     disk_create_index();
 
diff --git a/common/sys/idt.c b/common/sys/idt.c
index a1cdcf85..e8267f09 100644
--- a/common/sys/idt.c
+++ b/common/sys/idt.c
@@ -9,28 +9,6 @@
 #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) {
@@ -51,7 +29,7 @@ void flush_irqs(void) {
 
     struct idtr new_idt = {
         256 * sizeof(struct idt_entry) - 1,
-        (uintptr_t)dummy_idt
+        (uintptr_t)idt
     };
     asm volatile ("lidt %0" :: "m"(new_idt) : "memory");
 
diff --git a/common/sys/idt.h b/common/sys/idt.h
index a36cea8a..0d7cb0b1 100644
--- a/common/sys/idt.h
+++ b/common/sys/idt.h
@@ -2,6 +2,7 @@
 #define SYS__IDT_H__
 
 #include <stdint.h>
+#include <stddef.h>
 
 #if defined (__i386__)
 
@@ -37,23 +38,17 @@ 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 fe224ea0..87b93df4 100644
--- a/common/sys/idt.s2.c
+++ b/common/sys/idt.s2.c
@@ -1,35 +1,58 @@
+#if defined (__x86_64__) || defined (__i386__)
+
 #include <stddef.h>
 #include <stdint.h>
 #include <sys/idt.h>
 #include <lib/misc.h>
-
-#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);
+#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 (UEFI)
+void dummy_isr(void);
+#elif defined (BIOS)
 extern void *exceptions[];
+#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");
+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
 }
 
 #endif
tab: 248 wrap: offon