:: commit 11240b59a5a488b2f99a480ffc05c04cd8120bfb

mintsuki <mintsuki@protonmail.com> — 2020-09-26 13:06

parents: 0403a29f76

Fix potential memmap circular dependency issue

diff --git a/limine.bin b/limine.bin
index b5ecfded..1ac1bbcf 100644
Binary files a/limine.bin and b/limine.bin differ
diff --git a/stage2/protos/stivale.c b/stage2/protos/stivale.c
index 42fdcdac..11492fff 100644
--- a/stage2/protos/stivale.c
+++ b/stage2/protos/stivale.c
@@ -207,12 +207,14 @@ void stivale_load(char *cmdline, int boot_drive) {
 
     size_t memmap_entries;
     struct e820_entry_t *memmap = get_memmap(&memmap_entries);
-    stivale_struct.memory_map_entries = (uint64_t)memmap_entries;
-    stivale_struct.memory_map_addr    = (uint64_t)(size_t)memmap;
 
     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;
+
     stivale_spinup(bits, want_5lv, pagemap,
                    entry_point, &stivale_struct, stivale_hdr.stack);
 }
diff --git a/stage2/protos/stivale2.c b/stage2/protos/stivale2.c
index d2fc6729..3280e48c 100644
--- a/stage2/protos/stivale2.c
+++ b/stage2/protos/stivale2.c
@@ -292,7 +292,15 @@ void stivale2_load(char *cmdline, int boot_drive) {
     }
 
     size_t memmap_entries;
-    struct e820_entry_t *memmap;
+    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);
 
     //////////////////////////////////////////////
     // Create memmap struct tag
@@ -308,17 +316,10 @@ void stivale2_load(char *cmdline, int boot_drive) {
     void *tag_memmap = conv_mem_alloc_aligned(sizeof(struct e820_entry_t) * memmap_entries, 1);
     memcpy(tag_memmap, memmap, sizeof(struct e820_entry_t) * memmap_entries);
 
+print_memmap(memmap, memmap_entries);
     append_tag(&stivale2_struct, (struct stivale2_tag *)tag);
     }
 
-    // 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);
-
     //////////////////////////////////////////////
     // Create SMP struct tag
     //////////////////////////////////////////////
tab: 248 wrap: offon