:: commit f1859036f560c977e9b1f59e94eed415c034612f

mintsuki <mintsuki@protonmail.com> — 2024-03-30 04:46

parents: 08eca238ed

misc: Fix some issues with the relocation code from 2419a8c5be8d35c3dba85be1b7c88c8816d4b4fd

diff --git a/common/entry.s3.c b/common/entry.s3.c
index 12fe8d62..3c2b0f89 100644
--- a/common/entry.s3.c
+++ b/common/entry.s3.c
@@ -39,18 +39,21 @@ noreturn void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
 
     EFI_STATUS status;
 
+    const char *deferred_error = NULL;
+
 #if defined (__x86_64__)
     if ((uintptr_t)__slide >= 0x100000000) {
         size_t image_size_pages = ALIGN_UP((size_t)__image_size, 4096) / 4096;
         size_t new_base;
-        for (new_base = 0x1000; new_base + image_size_pages < 0x100000000; new_base += 0x1000) {
+        for (new_base = 0x1000; new_base + (size_t)__image_size < 0x100000000; new_base += 0x1000) {
             EFI_PHYSICAL_ADDRESS _new_base = (EFI_PHYSICAL_ADDRESS)new_base;
             status = gBS->AllocatePages(AllocateAddress, EfiLoaderData, image_size_pages, &_new_base);
             if (status == 0) {
                 goto new_base_gotten;
             }
         }
-        panic(false, "Limine does not support being loaded above 4GiB");
+        deferred_error = "Limine does not support being loaded above 4GiB and no alternative loading spot found";
+        goto defer_error;
 new_base_gotten:
         memcpy((void *)new_base, __slide, (size_t)__image_size);
         __attribute__((ms_abi))
@@ -61,6 +64,7 @@ new_base_gotten:
     }
 #endif
 
+defer_error:
     gST->ConOut->EnableCursor(gST->ConOut, false);
 
     init_memmap();
@@ -72,6 +76,10 @@ new_base_gotten:
         print("WARNING: Failed to disable watchdog timer!\n");
     }
 
+    if (deferred_error != NULL) {
+        panic(false, "%s", deferred_error);
+    }
+
 #if defined (__x86_64__) || defined (__i386__)
     init_gdt();
 #endif
tab: 248 wrap: offon