:: commit 07887dcc4cee03b9fe78f4eb7bdfb03bd4675e1c

mintsuki <mintsuki@protonmail.com> — 2021-01-27 16:24

parents: 02ef011f8e

linux: Misc protocol bug fixes

diff --git a/limine-pxe.bin b/limine-pxe.bin
index 3871e9df..f231d397 100644
Binary files a/limine-pxe.bin and b/limine-pxe.bin differ
diff --git a/limine.bin b/limine.bin
index f0fb0fd4..663827f8 100644
Binary files a/limine.bin and b/limine.bin differ
diff --git a/stage2.map b/stage2.map
index 8e255800..c530b7d1 100644
Binary files a/stage2.map and b/stage2.map differ
diff --git a/stage2/protos/linux.c b/stage2/protos/linux.c
index 798f0503..86cafdbe 100644
--- a/stage2/protos/linux.c
+++ b/stage2/protos/linux.c
@@ -13,7 +13,7 @@
 #include <mm/mtrr.h>
 
 #define KERNEL_LOAD_ADDR ((size_t)0x100000)
-#define KERNEL_HEAP_SIZE ((size_t)0x1000)
+#define KERNEL_HEAP_SIZE ((size_t)0x6000)
 
 __attribute__((section(".realmode"), used))
 static void spinup(uint16_t real_mode_code_seg, uint16_t kernel_entry_seg,
@@ -80,16 +80,11 @@ void linux_load(char *config, char *cmdline) {
 
     setup_code_size *= 512;
 
-    print("linux: Setup code size: %x\n", setup_code_size);
-
     size_t real_mode_code_size = 512 + setup_code_size;
 
-    print("linux: Real Mode code size: %x\n", real_mode_code_size);
-
-    size_t real_mode_and_heap_size =
-        ((real_mode_code_size & 0x0f) + 0x10) + KERNEL_HEAP_SIZE;
+    size_t real_mode_and_heap_size = 0x8000 + KERNEL_HEAP_SIZE;
 
-    void *real_mode_code = conv_mem_alloc_aligned(real_mode_and_heap_size, 0x1000);
+    void *real_mode_code = conv_mem_alloc_aligned(0x10000, 0x1000);
 
     fread(kernel, real_mode_code, 0, real_mode_code_size);
 
@@ -106,12 +101,7 @@ void linux_load(char *config, char *cmdline) {
     size_t heap_end_ptr = real_mode_and_heap_size - 0x200;
     *((uint16_t *)(real_mode_code + 0x224)) = (uint16_t)heap_end_ptr;
 
-    // The command line needs to be before address 0xa0000, we can use
-    // a conv_mem_alloc() allocated buffer for that.
-    // Allocate the relocation buffer for the command line early so it's allocated
-    // before the real mode code.
-    size_t cmdline_len = strlen(cmdline);
-    char *cmdline_reloc = conv_mem_alloc(cmdline_len + 1);
+    char *cmdline_reloc = real_mode_code + real_mode_and_heap_size;
     strcpy(cmdline_reloc, cmdline);
 
     // vid_mode. 0xffff means "normal"
@@ -142,11 +132,14 @@ void linux_load(char *config, char *cmdline) {
     *((uint32_t *)(real_mode_code + 0x228)) = (uint32_t)cmdline_reloc;
 
     // load kernel
-    print("Loading kernel...\n");
+    print("linux: Loading kernel...\n");
     memmap_alloc_range(KERNEL_LOAD_ADDR, kernel->size - real_mode_code_size, 0, true, true);
     fread(kernel, (void *)KERNEL_LOAD_ADDR, real_mode_code_size, kernel->size - real_mode_code_size);
 
     uint32_t modules_mem_base = *((uint32_t *)(real_mode_code + 0x22c)) + 1;
+    if (modules_mem_base == 0)
+        modules_mem_base = 0x38000000;
+
     size_t size_of_all_modules = 0;
 
     for (size_t i = 0; ; i++) {
@@ -180,7 +173,7 @@ void linux_load(char *config, char *cmdline) {
         if (!uri_open(&module, module_path))
             panic("Could not open `%s`", module_path);
 
-        print("Loading module `%s`...\n", module_path);
+        print("linux: Loading module `%s`...\n", module_path);
 
         fread(&module, (void *)_modules_mem_base, 0, module.size);
 
tab: 248 wrap: offon