:: commit a002f05110b713d7a0af554faf04868368ca627e

mintsuki <mintsuki@protonmail.com> — 2020-08-11 16:00

parents: 6296d27c11

Fix broken memory types in stivale

diff --git a/qloader2.bin b/qloader2.bin
index 2bc87efe..a65f4fce 100644
Binary files a/qloader2.bin and b/qloader2.bin differ
diff --git a/src/lib/elf.c b/src/lib/elf.c
index 35a9378d..336fef15 100644
--- a/src/lib/elf.c
+++ b/src/lib/elf.c
@@ -271,7 +271,7 @@ int elf32_load_section(struct file_handle *fd, void *buffer, const char *name, s
     return 2;
 }
 
-int elf64_load(struct file_handle *fd, uint64_t *entry_point, uint64_t *top, uint64_t slide) {
+int elf64_load(struct file_handle *fd, uint64_t *entry_point, uint64_t *top, uint64_t slide, uint32_t alloc_type) {
     struct elf64_hdr hdr;
     fread(fd, &hdr, 0, sizeof(struct elf64_hdr));
 
@@ -312,7 +312,7 @@ int elf64_load(struct file_handle *fd, uint64_t *entry_point, uint64_t *top, uin
         if (this_top > *top)
             *top = this_top;
 
-        memmap_alloc_range((size_t)load_vaddr, (size_t)phdr.p_memsz);
+        memmap_alloc_range((size_t)load_vaddr, (size_t)phdr.p_memsz, alloc_type);
 
         fread(fd, (void *)(uint32_t)load_vaddr, phdr.p_offset, phdr.p_filesz);
 
@@ -335,7 +335,7 @@ int elf64_load(struct file_handle *fd, uint64_t *entry_point, uint64_t *top, uin
     return 0;
 }
 
-int elf32_load(struct file_handle *fd, uint32_t *entry_point, uint32_t *top) {
+int elf32_load(struct file_handle *fd, uint32_t *entry_point, uint32_t *top, uint32_t alloc_type) {
     struct elf32_hdr hdr;
     fread(fd, &hdr, 0, sizeof(struct elf32_hdr));
 
@@ -368,7 +368,7 @@ int elf32_load(struct file_handle *fd, uint32_t *entry_point, uint32_t *top) {
         if (this_top > *top)
             *top = this_top;
 
-        memmap_alloc_range((size_t)phdr.p_paddr, (size_t)phdr.p_memsz);
+        memmap_alloc_range((size_t)phdr.p_paddr, (size_t)phdr.p_memsz, alloc_type);
 
         fread(fd, (void *)phdr.p_paddr, phdr.p_offset, phdr.p_filesz);
 
diff --git a/src/lib/elf.h b/src/lib/elf.h
index 4b4b1b6a..c3467e6b 100644
--- a/src/lib/elf.h
+++ b/src/lib/elf.h
@@ -8,10 +8,10 @@
 
 int elf_bits(struct file_handle *fd);
 
-int elf64_load(struct file_handle *fd, uint64_t *entry_point, uint64_t *top, uint64_t slide);
+int elf64_load(struct file_handle *fd, uint64_t *entry_point, uint64_t *top, uint64_t slide, uint32_t alloc_type);
 int elf64_load_section(struct file_handle *fd, void *buffer, const char *name, size_t limit, uint64_t slide);
 
-int elf32_load(struct file_handle *fd, uint32_t *entry_point, uint32_t *top);
+int elf32_load(struct file_handle *fd, uint32_t *entry_point, uint32_t *top, uint32_t alloc_type);
 int elf32_load_section(struct file_handle *fd, void *buffer, const char *name, size_t limit);
 
 #endif
diff --git a/src/lib/memmap.c b/src/lib/memmap.c
index d4da5f96..4ab1d69c 100644
--- a/src/lib/memmap.c
+++ b/src/lib/memmap.c
@@ -165,7 +165,7 @@ void init_memmap(void) {
     sanitise_entries();
 }
 
-void memmap_alloc_range(uint64_t base, uint64_t length) {
+void memmap_alloc_range(uint64_t base, uint64_t length, uint32_t type) {
     uint64_t top = base + length;
 
     for (size_t i = 0; i < memmap_entries; i++) {
@@ -206,7 +206,7 @@ void memmap_alloc_range(uint64_t base, uint64_t length) {
             }
             target = &memmap[memmap_entries++];
 
-            target->type   = MEMMAP_KERNEL_AND_MODULES;
+            target->type   = type;
             target->base   = base;
             target->length = length;
 
diff --git a/src/lib/memmap.h b/src/lib/memmap.h
index b33282dc..da587d5d 100644
--- a/src/lib/memmap.h
+++ b/src/lib/memmap.h
@@ -5,7 +5,7 @@
 #include <lib/e820.h>
 
 void init_memmap(void);
-void memmap_alloc_range(uint64_t base, uint64_t length);
+void memmap_alloc_range(uint64_t base, uint64_t length, uint32_t type);
 struct e820_entry_t *get_memmap(size_t *entries);
 void print_memmap(struct e820_entry_t *mm, size_t size);
 
diff --git a/src/protos/linux.c b/src/protos/linux.c
index 59cb83a0..a8a60f68 100644
--- a/src/protos/linux.c
+++ b/src/protos/linux.c
@@ -103,7 +103,7 @@ void linux_load(char *cmdline, int boot_drive) {
 
     // load kernel
     print("Loading kernel...\n");
-    memmap_alloc_range(KERNEL_LOAD_ADDR, fd->size - real_mode_code_size);
+    memmap_alloc_range(KERNEL_LOAD_ADDR, fd->size - real_mode_code_size, 0);
     fread(fd, (void *)KERNEL_LOAD_ADDR, real_mode_code_size, fd->size - real_mode_code_size);
 
     char initrd_path[64];
@@ -125,7 +125,7 @@ void linux_load(char *cmdline, int boot_drive) {
     }
 
     print("Loading initrd...\n");
-    memmap_alloc_range(INITRD_LOAD_ADDR, initrd.size);
+    memmap_alloc_range(INITRD_LOAD_ADDR, initrd.size, 0);
     fread(&initrd, (void *)INITRD_LOAD_ADDR, 0, initrd.size);
 
     *((uint32_t *)(real_mode_code + 0x218)) = (uint32_t)INITRD_LOAD_ADDR;
diff --git a/src/protos/stivale.c b/src/protos/stivale.c
index 1c5b9bc3..b086b371 100644
--- a/src/protos/stivale.c
+++ b/src/protos/stivale.c
@@ -145,10 +145,10 @@ void stivale_load(char *cmdline, int boot_drive) {
 
     switch (bits) {
         case 64:
-            elf64_load(fd, &entry_point, &top_used_addr, slide);
+            elf64_load(fd, &entry_point, &top_used_addr, slide, 10);
             break;
         case 32:
-            elf32_load(fd, (uint32_t *)&entry_point, (uint32_t *)&top_used_addr);
+            elf32_load(fd, (uint32_t *)&entry_point, (uint32_t *)&top_used_addr, 10);
             break;
     }
 
@@ -192,7 +192,7 @@ void stivale_load(char *cmdline, int boot_drive) {
             ((uint32_t)top_used_addr & ~((uint32_t)0xfff)) + 0x1000 :
             (uint32_t)top_used_addr);
 
-        memmap_alloc_range((size_t)module_addr, f.size);
+        memmap_alloc_range((size_t)module_addr, f.size, 10);
         fread(&f, module_addr, 0, f.size);
 
         m->begin = (uint64_t)(size_t)module_addr;
diff --git a/src/protos/stivale2.c b/src/protos/stivale2.c
index b9360dfd..18ea0206 100644
--- a/src/protos/stivale2.c
+++ b/src/protos/stivale2.c
@@ -232,10 +232,10 @@ void stivale2_load(char *cmdline, int boot_drive) {
 
     switch (bits) {
         case 64:
-            elf64_load(fd, &entry_point, &top_used_addr, slide);
+            elf64_load(fd, &entry_point, &top_used_addr, slide, 0x1001);
             break;
         case 32:
-            elf32_load(fd, (uint32_t *)&entry_point, (uint32_t *)&top_used_addr);
+            elf32_load(fd, (uint32_t *)&entry_point, (uint32_t *)&top_used_addr, 0x1001);
             break;
     }
 
@@ -301,7 +301,7 @@ void stivale2_load(char *cmdline, int boot_drive) {
             ((uint32_t)top_used_addr & ~((uint32_t)0xfff)) + 0x1000 :
             (uint32_t)top_used_addr);
 
-        memmap_alloc_range((size_t)module_addr, f.size);
+        memmap_alloc_range((size_t)module_addr, f.size, 0x1001);
         fread(&f, module_addr, 0, f.size);
 
         m->begin = (uint64_t)(size_t)module_addr;
@@ -310,10 +310,10 @@ void stivale2_load(char *cmdline, int boot_drive) {
         top_used_addr = (uint64_t)(size_t)m->end;
 
         print("stivale2: Requested module %u:\n", i);
-        print("         Path:   %s\n", module_file);
-        print("         String: %s\n", m->string);
-        print("         Begin:  %X\n", m->begin);
-        print("         End:    %X\n", m->end);
+        print("          Path:   %s\n", module_file);
+        print("          String: %s\n", m->string);
+        print("          Begin:  %X\n", m->begin);
+        print("          End:    %X\n", m->end);
     }
 
     append_tag(&stivale2_struct, (struct stivale2_tag *)tag);
tab: 248 wrap: offon