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
