:: commit accb58e11e9960478db2081e3694921151d188e5

mintsuki <mintsuki@protonmail.com> — 2022-01-16 21:52

parents: 62ef88a964

multiboot: Retry failed module loads at different addresses

diff --git a/stage23/protos/multiboot1.c b/stage23/protos/multiboot1.c
index c57b8997..29973317 100644
--- a/stage23/protos/multiboot1.c
+++ b/stage23/protos/multiboot1.c
@@ -148,8 +148,10 @@ bool multiboot1_load(char *config, char *cmdline) {
             strcpy(lowmem_modstr, module_cmdline);
 
             void *module_addr = (void *)(uintptr_t)ALIGN_UP(kernel_top, 4096);
-            memmap_alloc_range((uintptr_t)module_addr, f->size, MEMMAP_KERNEL_AND_MODULES,
-                               true, true, false, false);
+            while (!memmap_alloc_range((uintptr_t)module_addr, f->size, MEMMAP_KERNEL_AND_MODULES,
+                                       true, false, false, false)) {
+                module_addr += 0x200000;
+            }
             kernel_top = (uintptr_t)module_addr + f->size;
             fread(f, module_addr, 0, f->size);
 
diff --git a/stage23/protos/multiboot2.c b/stage23/protos/multiboot2.c
index 5792bb5c..95697e89 100644
--- a/stage23/protos/multiboot2.c
+++ b/stage23/protos/multiboot2.c
@@ -307,8 +307,10 @@ bool multiboot2_load(char *config, char* cmdline) {
             module_cmdline = "";
         }
 
-        memmap_alloc_range((uintptr_t)module_addr, f->size, MEMMAP_KERNEL_AND_MODULES,
-                            true, true, false, false);
+        while (!memmap_alloc_range((uintptr_t)module_addr, f->size, MEMMAP_KERNEL_AND_MODULES,
+                                   true, false, false, false)) {
+            module_addr += 0x200000;
+        }
 
         kernel_top = (uintptr_t)module_addr + f->size;
         fread(f, module_addr, 0, f->size);
tab: 248 wrap: offon