:: commit 773bd3e93fff386b7d8758f3dd9d34f304f74b8c

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

parents: 443b7199c1

Revert "mm/pmm: Add validation of allocated memory viability on x86_64/UEFI"

This reverts commit 5f6b2faf26d5f6deade73d68f245c2178ed55d06.
diff --git a/common/entry.s2.c b/common/entry.s2.c
index 9de0697f..841fa67f 100644
--- a/common/entry.s2.c
+++ b/common/entry.s2.c
@@ -87,11 +87,11 @@ noreturn void entry(uint8_t boot_drive, int boot_from) {
 
     uint64_t usec_at_entry = rdtsc_usec();
 
-    idt_init();
-
     init_e820();
     init_memmap();
 
+    idt_init();
+
     disk_create_index();
 
     if (boot_from == BOOTED_FROM_HDD || boot_from == BOOTED_FROM_CD) {
diff --git a/common/entry.s3.c b/common/entry.s3.c
index cfe8544c..8d8ca7e3 100644
--- a/common/entry.s3.c
+++ b/common/entry.s3.c
@@ -71,10 +71,6 @@ defer_error:
 
     gST->ConOut->EnableCursor(gST->ConOut, false);
 
-#if defined (__x86_64__) || defined (__i386__)
-    idt_init();
-#endif
-
     init_memmap();
 
     term_fallback();
@@ -169,6 +165,7 @@ opened:
 
 noreturn void stage3_common(void) {
 #if defined (__x86_64__) || defined (__i386__)
+    idt_init();
     init_io_apics();
 #endif
 
diff --git a/common/mm/pmm.s2.c b/common/mm/pmm.s2.c
index d3d45c89..3bd579db 100644
--- a/common/mm/pmm.s2.c
+++ b/common/mm/pmm.s2.c
@@ -8,10 +8,6 @@
 #include <lib/libc.h>
 #include <lib/print.h>
 #if defined (UEFI)
-#  if defined (__x86_64__)
-#    include <sys/idt.h>
-#    include <sys/gdt.h>
-#  endif
 #  include <efi.h>
 #endif
 
@@ -301,66 +297,6 @@ static struct memmap_entry *recl;
 
 extern symbol __slide, __image_base, __image_end;
 
-#if defined (__x86_64__)
-
-void dummy_isr(void);
-static volatile bool access_validation_success;
-static volatile void *page_fault_handler_ret;
-
-__attribute__((interrupt)) static void page_fault_handler(void *unused) {
-    (void)unused;
-    access_validation_success = false;
-    asm volatile (
-        "mov %0, (%%esp)\n\t"
-        :
-        : "r"(page_fault_handler_ret)
-        : "memory"
-    );
-}
-
-static bool validate_accessibility(void *addr) {
-    access_validation_success = true;
-
-    asm volatile ("cli");
-
-    struct gdtr original_gdtr;
-    asm volatile ("sgdt %0" : "=m"(original_gdtr) :: "memory");
-
-    asm volatile ("lgdt %0" :: "m"(gdt) : "memory");
-
-    struct idtr original_idtr;
-    asm volatile ("sidt %0" : "=m"(original_idtr) :: "memory");
-
-    struct idtr idtr = {
-        IDT_ENTRY_COUNT * sizeof(struct idt_entry) - 1,
-        (uintptr_t)idt
-    };
-
-    asm volatile ("lidt %0" :: "m"(idtr) : "memory");
-
-    idt_register_isr(0x0e, page_fault_handler, 0x8e);
-
-    page_fault_handler_ret = &&actual_return;
-
-    *(volatile uint8_t *)addr = 0xc3; // 0xc3 = ret
-
-    void (*callback)(void) = addr;
-
-    callback();
-
-actual_return:
-    idt_register_isr(0x0e, dummy_isr, 0x8e);
-    asm volatile ("lidt %0" :: "m"(original_idtr) : "memory");
-
-    asm volatile ("lgdt %0" :: "m"(original_gdtr) : "memory");
-
-    asm volatile ("sti");
-
-    return access_validation_success;
-}
-
-#endif
-
 void init_memmap(void) {
     EFI_STATUS status;
 
@@ -464,27 +400,11 @@ void init_memmap(void) {
 
         status = gBS->AllocatePages(AllocateAddress, EfiLoaderCode,
                                     untouched_memmap[i].length / 4096, &base);
-#if defined (__x86_64__)
-        if (status == 0) {
-            if (!validate_accessibility((void *)base)) {
-                memmap_alloc_range(base, untouched_memmap[i].length, MEMMAP_EFI_RECLAIMABLE, MEMMAP_USABLE, true, false, false);
-            }
-            continue;
-        }
-#endif
 
         if (status) {
             for (size_t j = 0; j < untouched_memmap[i].length; j += 4096) {
                 base = untouched_memmap[i].base + j;
                 status = gBS->AllocatePages(AllocateAddress, EfiLoaderCode, 1, &base);
-#if defined (__x86_64__)
-                if (status == 0) {
-                    if (!validate_accessibility((void *)base)) {
-                        memmap_alloc_range(base, 4096, MEMMAP_EFI_RECLAIMABLE, MEMMAP_USABLE, true, false, false);
-                    }
-                    continue;
-                }
-#endif
                 if (status) {
                     memmap_alloc_range(base, 4096, MEMMAP_EFI_RECLAIMABLE, MEMMAP_USABLE, true, false, false);
                 }
diff --git a/common/sys/idt.c b/common/sys/idt.c
index 48881b5b..e8267f09 100644
--- a/common/sys/idt.c
+++ b/common/sys/idt.c
@@ -28,7 +28,7 @@ void flush_irqs(void) {
     asm volatile ("sidt %0" : "=m"(old_idt) :: "memory");
 
     struct idtr new_idt = {
-        IDT_ENTRY_COUNT * sizeof(struct idt_entry) - 1,
+        256 * sizeof(struct idt_entry) - 1,
         (uintptr_t)idt
     };
     asm volatile ("lidt %0" :: "m"(new_idt) : "memory");
diff --git a/common/sys/idt.h b/common/sys/idt.h
index d3a74ad2..0d7cb0b1 100644
--- a/common/sys/idt.h
+++ b/common/sys/idt.h
@@ -44,13 +44,7 @@ enum {
     IRQ_PIC_APIC_FLUSH
 };
 
-#if defined (UEFI)
-#  define IDT_ENTRY_COUNT 256
-#elif defined (BIOS)
-#  define IDT_ENTRY_COUNT 32
-#endif
-
-extern struct idt_entry idt[IDT_ENTRY_COUNT];
+extern struct idt_entry *idt;
 extern int irq_flush_type;
 
 void idt_init(void);
diff --git a/common/sys/idt.s2.c b/common/sys/idt.s2.c
index 60cd9ac9..87b93df4 100644
--- a/common/sys/idt.s2.c
+++ b/common/sys/idt.s2.c
@@ -6,7 +6,7 @@
 #include <lib/misc.h>
 #include <mm/pmm.h>
 
-struct idt_entry idt[IDT_ENTRY_COUNT];
+struct idt_entry *idt = NULL;
 
 void idt_register_isr(size_t vec, void *handler, uint8_t type) {
     uint32_t p = (uintptr_t)handler;
@@ -31,16 +31,24 @@ extern void *exceptions[];
 
 void idt_init(void) {
 #if defined (UEFI)
-    for (size_t i = 0; i < IDT_ENTRY_COUNT; i++) {
+    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++) {
+    for (size_t i = 0; i < idt_entry_count; i++) {
         idt_register_isr(i, exceptions[i], 0x8e);
     }
 
     struct idtr idtr = {
-        IDT_ENTRY_COUNT * sizeof(struct idt_entry) - 1,
+        256 * sizeof(struct idt_entry) - 1,
         (uintptr_t)idt
     };
     asm volatile ("lidt %0" :: "m"(idtr) : "memory");
tab: 248 wrap: offon