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);
