:: commit 4321d910f61968c43bfbfb865a68fc0b6d6db885

mintsuki <mintsuki@protonmail.com> — 2023-11-02 09:12

parents: 4ade725b78

limine: Fix bug where on 32-bit ports, .limine_reqs section was not parsed correctly

diff --git a/common/protos/limine.c b/common/protos/limine.c
index bd0c97d9..14217658 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -377,18 +377,18 @@ noreturn void limine_load(char *config, char *cmdline) {
     }
 
     // Load requests
-    if (base_revision == 0 && elf64_load_section(kernel, &requests, ".limine_reqs", 0, slide)) {
+    uint64_t *limine_reqs = NULL;
+    requests = ext_mem_alloc(MAX_REQUESTS * sizeof(void *));
+    requests_count = 0;
+    if (base_revision == 0 && elf64_load_section(kernel, &limine_reqs, ".limine_reqs", 0, slide)) {
         for (size_t i = 0; ; i++) {
-            if (requests[i] == NULL) {
+            if (limine_reqs[i] == 0) {
                 break;
             }
-            requests[i] -= virtual_base;
-            requests[i] += physical_base;
+            requests[i] = (void *)(uintptr_t)((limine_reqs[i] - virtual_base) + physical_base);
             requests_count++;
         }
     } else {
-        requests = ext_mem_alloc(MAX_REQUESTS * sizeof(void *));
-        requests_count = 0;
         uint64_t common_magic[2] = { LIMINE_COMMON_MAGIC };
         for (size_t i = 0; i < ALIGN_DOWN(image_size_before_bss, 8); i += 8) {
             uint64_t *p = (void *)(uintptr_t)physical_base + i;
tab: 248 wrap: offon