:: commit 05e7c27f01bed652e1964a60beda5917b5a43035

mintsuki <mintsuki@protonmail.com> — 2021-07-02 23:02

parents: d53facc731

multiboot1: Make sure to load modules at a valid address even when using a.out kludge

diff --git a/stage23/protos/multiboot1.c b/stage23/protos/multiboot1.c
index 2882701e..44c29e02 100644
--- a/stage23/protos/multiboot1.c
+++ b/stage23/protos/multiboot1.c
@@ -52,7 +52,7 @@ void multiboot1_load(char *config, char *cmdline) {
         panic("multiboot1: Header checksum is invalid");
 
     uint32_t entry_point = 0;
-    uint32_t elf_top = 0;
+    uint32_t kernel_top = 0;
 
     if (header.flags & (1 << 16)) {
         if (header.load_addr > header.header_addr)
@@ -69,6 +69,8 @@ void multiboot1_load(char *config, char *cmdline) {
         memcpy((void *)(uintptr_t)header.load_addr, kernel + (header_offset
                 - (header.header_addr - header.load_addr)), load_size);
 
+        kernel_top = header.load_addr + load_size;
+
         if (header.bss_end_addr) {
             uintptr_t bss_addr = header.load_addr + load_size;
             if (header.bss_end_addr < bss_addr)
@@ -78,6 +80,8 @@ void multiboot1_load(char *config, char *cmdline) {
 
             memmap_alloc_range(bss_addr, bss_size, MEMMAP_KERNEL_AND_MODULES, true, true, false, false);
             memset((void *)bss_addr, 0, bss_size);
+
+            kernel_top = bss_addr + bss_size;
         }
 
         entry_point = header.entry_addr;
@@ -86,7 +90,7 @@ void multiboot1_load(char *config, char *cmdline) {
 
         switch (bits) {
             case 32:
-                if (elf32_load(kernel, &entry_point, &elf_top, MEMMAP_KERNEL_AND_MODULES))
+                if (elf32_load(kernel, &entry_point, &kernel_top, MEMMAP_KERNEL_AND_MODULES))
                     panic("multiboot1: ELF32 load failure");
                 break;
             case 64: {
@@ -94,7 +98,7 @@ void multiboot1_load(char *config, char *cmdline) {
                 if (elf64_load(kernel, &e, &t, NULL, MEMMAP_KERNEL_AND_MODULES, false, true))
                     panic("multiboot1: ELF64 load failure");
                 entry_point = e;
-                elf_top = t;
+                kernel_top = t;
 
                 break;
             }
@@ -131,10 +135,10 @@ void multiboot1_load(char *config, char *cmdline) {
 
             char *cmdline = config_get_value(config, i, "MODULE_STRING");
 
-            void *module_addr = (void *)ALIGN_UP(elf_top, 4096);
+            void *module_addr = (void *)ALIGN_UP(kernel_top, 4096);
             memmap_alloc_range((uintptr_t)module_addr, f.size, MEMMAP_KERNEL_AND_MODULES,
                                true, true, false, false);
-            elf_top = (uintptr_t)module_addr + f.size;
+            kernel_top = (uintptr_t)module_addr + f.size;
             fread(&f, module_addr, 0, f.size);
 
             m->begin   = (uint32_t)(size_t)module_addr;
tab: 248 wrap: offon