:: commit bd7bdb9a0c943123d3948f292630fe8b585fbfe4

mintsuki <mintsuki@protonmail.com> — 2021-11-25 19:50

parents: 271c341cec

multiboot1: Allocate root struct on the heap

diff --git a/stage23/protos/multiboot1.c b/stage23/protos/multiboot1.c
index f5947106..ded9b085 100644
--- a/stage23/protos/multiboot1.c
+++ b/stage23/protos/multiboot1.c
@@ -21,8 +21,6 @@ __attribute__((noreturn)) void multiboot1_spinup_32(
                  uint32_t entry_point,
                  uint32_t multiboot1_info);
 
-struct multiboot1_info multiboot1_info = {0};
-
 bool multiboot1_load(char *config, char *cmdline) {
     struct file_handle *kernel_file;
 
@@ -59,6 +57,8 @@ bool multiboot1_load(char *config, char *cmdline) {
         return false;
     }
 
+    struct multiboot1_info *multiboot1_info = conv_mem_alloc(sizeof(struct multiboot1_info));
+
     if (header.magic + header.flags + header.checksum)
         panic("multiboot1: Header checksum is invalid");
 
@@ -128,8 +128,8 @@ bool multiboot1_load(char *config, char *cmdline) {
     if (n_modules) {
         struct multiboot1_module *mods = conv_mem_alloc(sizeof(*mods) * n_modules);
 
-        multiboot1_info.mods_count = n_modules;
-        multiboot1_info.mods_addr = (uint32_t)(size_t)mods;
+        multiboot1_info->mods_count = n_modules;
+        multiboot1_info->mods_addr = (uint32_t)(size_t)mods;
 
         for (size_t i = 0; i < n_modules; i++) {
             struct multiboot1_module *m = mods + i;
@@ -170,21 +170,21 @@ bool multiboot1_load(char *config, char *cmdline) {
             }
         }
 
-        multiboot1_info.flags |= (1 << 3);
+        multiboot1_info->flags |= (1 << 3);
     }
 
     char *lowmem_cmdline = conv_mem_alloc(strlen(cmdline) + 1);
     strcpy(lowmem_cmdline, cmdline);
-    multiboot1_info.cmdline = (uint32_t)(size_t)lowmem_cmdline;
+    multiboot1_info->cmdline = (uint32_t)(size_t)lowmem_cmdline;
     if (cmdline)
-        multiboot1_info.flags |= (1 << 2);
+        multiboot1_info->flags |= (1 << 2);
 
     char *bootload_name = "Limine";
     char *lowmem_bootname = conv_mem_alloc(strlen(bootload_name) + 1);
     strcpy(lowmem_bootname, bootload_name);
 
-    multiboot1_info.bootloader_name = (uint32_t)(size_t)lowmem_bootname;
-    multiboot1_info.flags |= (1 << 9);
+    multiboot1_info->bootloader_name = (uint32_t)(size_t)lowmem_bootname;
+    multiboot1_info->flags |= (1 << 9);
 
     term_deinit();
 
@@ -203,18 +203,18 @@ bool multiboot1_load(char *config, char *cmdline) {
                 goto nofb;
             }
 
-            multiboot1_info.fb_addr    = (uint64_t)fbinfo.framebuffer_addr;
-            multiboot1_info.fb_width   = fbinfo.framebuffer_width;
-            multiboot1_info.fb_height  = fbinfo.framebuffer_height;
-            multiboot1_info.fb_bpp     = fbinfo.framebuffer_bpp;
-            multiboot1_info.fb_pitch   = fbinfo.framebuffer_pitch;
-            multiboot1_info.fb_type    = 1;
-            multiboot1_info.fb_red_mask_size    = fbinfo.red_mask_size;
-            multiboot1_info.fb_red_mask_shift   = fbinfo.red_mask_shift;
-            multiboot1_info.fb_green_mask_size  = fbinfo.green_mask_size;
-            multiboot1_info.fb_green_mask_shift = fbinfo.green_mask_shift;
-            multiboot1_info.fb_blue_mask_size   = fbinfo.blue_mask_size;
-            multiboot1_info.fb_blue_mask_shift  = fbinfo.blue_mask_shift;
+            multiboot1_info->fb_addr    = (uint64_t)fbinfo.framebuffer_addr;
+            multiboot1_info->fb_width   = fbinfo.framebuffer_width;
+            multiboot1_info->fb_height  = fbinfo.framebuffer_height;
+            multiboot1_info->fb_bpp     = fbinfo.framebuffer_bpp;
+            multiboot1_info->fb_pitch   = fbinfo.framebuffer_pitch;
+            multiboot1_info->fb_type    = 1;
+            multiboot1_info->fb_red_mask_size    = fbinfo.red_mask_size;
+            multiboot1_info->fb_red_mask_shift   = fbinfo.red_mask_shift;
+            multiboot1_info->fb_green_mask_size  = fbinfo.green_mask_size;
+            multiboot1_info->fb_green_mask_shift = fbinfo.green_mask_shift;
+            multiboot1_info->fb_blue_mask_size   = fbinfo.blue_mask_size;
+            multiboot1_info->fb_blue_mask_shift  = fbinfo.blue_mask_shift;
         } else if (header.fb_mode == 1) {
 nofb:;
 #if uefi == 1
@@ -223,18 +223,18 @@ nofb:;
             size_t rows, cols;
             init_vga_textmode(&rows, &cols, false);
 
-            multiboot1_info.fb_addr    = 0xb8000;
-            multiboot1_info.fb_width   = cols;
-            multiboot1_info.fb_height  = rows;
-            multiboot1_info.fb_bpp     = 16;
-            multiboot1_info.fb_pitch   = 2 * cols;
-            multiboot1_info.fb_type    = 2;
+            multiboot1_info->fb_addr    = 0xb8000;
+            multiboot1_info->fb_width   = cols;
+            multiboot1_info->fb_height  = rows;
+            multiboot1_info->fb_bpp     = 16;
+            multiboot1_info->fb_pitch   = 2 * cols;
+            multiboot1_info->fb_type    = 2;
 #endif
         } else {
             panic("multiboot1: Illegal framebuffer type requested");
         }
 
-        multiboot1_info.flags |= (1 << 12);
+        multiboot1_info->flags |= (1 << 12);
     } else {
 #if uefi == 1
         panic("multiboot1: Cannot use text mode with UEFI.");
@@ -267,16 +267,16 @@ nofb:;
 
         // Convert the uppermem and lowermem fields from bytes to
         // KiB.
-        multiboot1_info.mem_lower = memory_info.lowermem / 1024;
-        multiboot1_info.mem_upper = memory_info.uppermem / 1024;
+        multiboot1_info->mem_lower = memory_info.lowermem / 1024;
+        multiboot1_info->mem_upper = memory_info.uppermem / 1024;
     }
 
-    multiboot1_info.mmap_length = mb_mmap_len;
-    multiboot1_info.mmap_addr = ((uint32_t)(size_t)mmap);
-    multiboot1_info.flags |= (1 << 0) | (1 << 6);
+    multiboot1_info->mmap_length = mb_mmap_len;
+    multiboot1_info->mmap_addr = ((uint32_t)(size_t)mmap);
+    multiboot1_info->flags |= (1 << 0) | (1 << 6);
 
     irq_flush_type = IRQ_PIC_ONLY_FLUSH;
 
     common_spinup(multiboot1_spinup_32, 2,
-                  entry_point, (uint32_t)(uintptr_t)&multiboot1_info);
+                  entry_point, (uint32_t)(uintptr_t)multiboot1_info);
 }
tab: 248 wrap: offon