:: commit e834f5caae988f999912608108464a33c54d7bbc

mintsuki <mintsuki@protonmail.com> — 2020-11-07 22:50

parents: fd1f724e45

stivale: Fix pagemap not mapping every memmap entry bug

diff --git a/limine.bin b/limine.bin
index 86366a3f..0cac9769 100644
Binary files a/limine.bin and b/limine.bin differ
diff --git a/stage2/protos/stivale.c b/stage2/protos/stivale.c
index 2ed45dd9..3ae6bff1 100644
--- a/stage2/protos/stivale.c
+++ b/stage2/protos/stivale.c
@@ -183,13 +183,12 @@ void stivale_load(char *cmdline, int boot_drive) {
         stivale_struct.framebuffer_addr = (uint64_t)(size_t)fb32;
     }
 
+    bool want_5lv = level5pg && (stivale_hdr.flags & (1 << 1));
+    pagemap_t pagemap = stivale_build_pagemap(want_5lv);
+
     size_t memmap_entries;
     struct e820_entry_t *memmap = get_memmap(&memmap_entries);
 
-    bool want_5lv = level5pg && (stivale_hdr.flags & (1 << 1));
-    pagemap_t pagemap = stivale_build_pagemap(want_5lv, memmap, memmap_entries);
-
-    memmap = get_memmap(&memmap_entries);
     stivale_struct.memory_map_entries = (uint64_t)memmap_entries;
     stivale_struct.memory_map_addr    = (uint64_t)(size_t)memmap;
 
@@ -197,8 +196,7 @@ void stivale_load(char *cmdline, int boot_drive) {
                    entry_point, &stivale_struct, stivale_hdr.stack);
 }
 
-pagemap_t stivale_build_pagemap(bool level5pg, struct e820_entry_t *memmap,
-                                size_t memmap_entries) {
+pagemap_t stivale_build_pagemap(bool level5pg) {
     pagemap_t pagemap = new_pagemap(level5pg ? 5 : 4);
     uint64_t higher_half_base = level5pg ? 0xff00000000000000 : 0xffff800000000000;
 
@@ -213,8 +211,13 @@ pagemap_t stivale_build_pagemap(bool level5pg, struct e820_entry_t *memmap,
         map_page(pagemap, higher_half_base + i, i, 0x03);
     }
 
+    size_t memmap_entries;
+    struct e820_entry_t *memmap = get_memmap(&memmap_entries);
+
     // Map any other region of memory from the memmap
     for (size_t i = 0; i < memmap_entries; i++) {
+        memmap = get_memmap(&memmap_entries);
+
         uint64_t base   = memmap[i].base;
         uint64_t length = memmap[i].length;
         uint64_t top    = base + length;
diff --git a/stage2/protos/stivale.h b/stage2/protos/stivale.h
index 7cf8e1a0..88644161 100644
--- a/stage2/protos/stivale.h
+++ b/stage2/protos/stivale.h
@@ -8,8 +8,7 @@
 
 void stivale_load(char *cmdline, int boot_drive);
 
-pagemap_t stivale_build_pagemap(bool level5pg, struct e820_entry_t *memmap,
-                                size_t memmap_entries);
+pagemap_t stivale_build_pagemap(bool level5pg);
 __attribute__((noreturn)) void stivale_spinup(
                  int bits, bool level5pg, pagemap_t pagemap,
                  uint64_t entry_point, void *stivale_struct, uint64_t stack);
diff --git a/stage2/protos/stivale2.c b/stage2/protos/stivale2.c
index c521e5da..0c84921e 100644
--- a/stage2/protos/stivale2.c
+++ b/stage2/protos/stivale2.c
@@ -276,22 +276,19 @@ void stivale2_load(char *cmdline, int boot_drive) {
     }
     }
 
-    size_t memmap_entries;
-    struct e820_entry_t *memmap = get_memmap(&memmap_entries);
-
     // Check if 5-level paging tag is requesting support
     bool level5pg_requested = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_5LV_PAGING_ID) ? true : false;
 
     pagemap_t pagemap = {0};
     if (bits == 64)
-        pagemap = stivale_build_pagemap(level5pg && level5pg_requested,
-                                        memmap, memmap_entries);
+        pagemap = stivale_build_pagemap(level5pg && level5pg_requested);
 
     //////////////////////////////////////////////
     // Create memmap struct tag
     //////////////////////////////////////////////
     {
-    memmap = get_memmap(&memmap_entries);
+    size_t memmap_entries;
+    struct e820_entry_t *memmap = get_memmap(&memmap_entries);
 
     struct stivale2_struct_tag_memmap *tag =
         conv_mem_alloc(sizeof(struct stivale2_struct_tag_memmap) +
tab: 248 wrap: offon