:: commit 0c30f689d995d44bc05fd36334cb25cc2ea36e4b

mintsuki <mintsuki@protonmail.com> — 2022-06-29 11:04

parents: ee3bb6304d

multiboot2: Bring a.out kludge up to par with mb1

diff --git a/common/protos/multiboot2.c b/common/protos/multiboot2.c
index 2138939c..a7448b50 100644
--- a/common/protos/multiboot2.c
+++ b/common/protos/multiboot2.c
@@ -186,8 +186,7 @@ bool multiboot2_load(char *config, char* cmdline) {
         if (addresstag->load_addr > addresstag->header_addr)
             panic(true, "multiboot2: Illegal load address");
 
-        size_t load_size = 0;
-
+        size_t load_size;
         if (addresstag->load_end_addr)
             load_size = addresstag->load_end_addr - addresstag->load_addr;
         else
@@ -195,24 +194,32 @@ bool multiboot2_load(char *config, char* cmdline) {
 
         size_t header_offset = (size_t)header - (size_t)kernel;
 
-        memmap_alloc_range(addresstag->load_addr, load_size, MEMMAP_KERNEL_AND_MODULES, true, true, false, false);
-        memcpy((void *)(uintptr_t)addresstag->load_addr, kernel + (header_offset
-                - (addresstag->header_addr - addresstag->load_addr)), load_size);
-
-        //kernel_top = addresstag->load_addr + load_size;
-
+        uint32_t bss_size = 0;
         if (addresstag->bss_end_addr) {
             uintptr_t bss_addr = addresstag->load_addr + load_size;
             if (addresstag->bss_end_addr < bss_addr)
                 panic(true, "multiboot2: Illegal bss end address");
 
-            uint32_t bss_size = addresstag->bss_end_addr - bss_addr;
+            bss_size = addresstag->bss_end_addr - bss_addr;
+        }
+
+        size_t full_size = load_size + bss_size;
 
-            memmap_alloc_range(bss_addr, bss_size, MEMMAP_KERNEL_AND_MODULES, true, true, false, false);
-            memset((void *)bss_addr, 0, bss_size);
+        void *elsewhere = ext_mem_alloc(full_size);
 
-            //kernel_top = bss_addr + bss_size;
+        memcpy(elsewhere, kernel + (header_offset
+                - (addresstag->header_addr - addresstag->load_addr)), load_size);
+
+        if (entry_point == 0xffffffff) {
+            panic(true, "multiboot2: Using address tag but entry address tag missing");
         }
+
+        ranges_count = 1;
+        ranges = ext_mem_alloc(sizeof(struct elsewhere_range));
+
+        ranges->elsewhere = (uintptr_t)elsewhere;
+        ranges->target = addresstag->load_addr;
+        ranges->length = full_size;
     } else {
         uint64_t e;
         int bits = elf_bits(kernel);
tab: 248 wrap: offon