:: commit 86780fc776d05c334449ad5aa72ff4cfc324f8ee

mintsuki <mintsuki@protonmail.com> — 2021-09-02 00:47

parents: b00845fba0

efi: Improve reclaim memory process

diff --git a/Makefile b/Makefile
index 09211a7d..d12b51c6 100644
--- a/Makefile
+++ b/Makefile
@@ -319,7 +319,7 @@ full-hybrid-test:
 	cp -rv bin/* test/* test_image/boot/
 	xorriso -as mkisofs -b boot/limine-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot boot/limine-eltorito-efi.bin -efi-boot-part --efi-boot-image --protective-msdos-label test_image/ -o test.iso
 	bin/limine-install test.iso
-	qemu-system-x86_64 -m 512M -M q35 -bios ovmf-x64/OVMF.fd -net none -smp 4   -cdrom test.iso -debugcon stdio
+	qemu-system-x86_64 -M q35 -bios ovmf-x64/OVMF.fd -net none -smp 4   -cdrom test.iso -debugcon stdio
 	qemu-system-x86_64 -m 512M -M q35 -bios ovmf-x64/OVMF.fd -net none -smp 4   -hda test.iso -debugcon stdio
 	qemu-system-x86_64 -m 512M -M q35 -bios ovmf-ia32/OVMF.fd -net none -smp 4   -cdrom test.iso -debugcon stdio
 	qemu-system-x86_64 -m 512M -M q35 -bios ovmf-ia32/OVMF.fd -net none -smp 4   -hda test.iso -debugcon stdio
diff --git a/stage23/mm/pmm.s2.c b/stage23/mm/pmm.s2.c
index 3c63a12d..86caabe7 100644
--- a/stage23/mm/pmm.s2.c
+++ b/stage23/mm/pmm.s2.c
@@ -12,7 +12,7 @@
 #endif
 
 #define PAGE_SIZE   4096
-#define MEMMAP_MAX_ENTRIES 256
+#define MEMMAP_MAX_ENTRIES 384
 
 #if bios == 1
 extern symbol bss_end;
@@ -319,7 +319,9 @@ void init_memmap(void) {
     allocations_disallowed = false;
 
     // Let's leave 64MiB to the firmware
-    ext_mem_alloc_type(0x4000000, MEMMAP_EFI_RECLAIMABLE);
+    for (size_t i = 0; i < 64; i++) {
+        ext_mem_alloc_type(0x100000, MEMMAP_EFI_RECLAIMABLE);
+    }
 
     memcpy(untouched_memmap, memmap, memmap_entries * sizeof(struct e820_entry_t));
     untouched_memmap_entries = memmap_entries;
@@ -372,23 +374,34 @@ void pmm_reclaim_uefi_mem(void) {
         }
     }
 
-    struct e820_entry_t recl;
+    size_t recl_i = 0;
 
-    for (size_t i = 0; ; i++) {
+    for (size_t i = 0; i < memmap_entries; i++) {
         if (memmap[i].type == MEMMAP_EFI_RECLAIMABLE) {
-            recl = memmap[i];
-            break;
+            recl_i++;
         }
     }
 
+    struct e820_entry_t *recl = ext_mem_alloc(recl_i * sizeof(struct e820_entry_t));
+
+    {
+        size_t recl_j = 0;
+        for (size_t i = 0; i < memmap_entries; i++) {
+            if (memmap[i].type == MEMMAP_EFI_RECLAIMABLE) {
+                recl[recl_j++] = memmap[i];
+            }
+        }
+    }
+
+another_recl:;
     // Punch holes in our EFI reclaimable entry for every EFI area which is
     // boot services or conventional that fits within
     size_t efi_mmap_entry_count = efi_mmap_size / efi_desc_size;
     for (size_t i = 0; i < efi_mmap_entry_count; i++) {
         EFI_MEMORY_DESCRIPTOR *entry = (void *)efi_mmap + i * efi_desc_size;
 
-        uintptr_t base = recl.base;
-        uintptr_t top = base + recl.length;
+        uintptr_t base = recl->base;
+        uintptr_t top = base + recl->length;
         uintptr_t efi_base = entry->PhysicalStart;
         uintptr_t efi_size = entry->NumberOfPages * 4096;
 
@@ -430,6 +443,11 @@ void pmm_reclaim_uefi_mem(void) {
         memmap_alloc_range(efi_base, efi_size, our_type, false, true, false, true);
     }
 
+    if (--recl_i > 0) {
+        recl++;
+        goto another_recl;
+    }
+
     sanitise_entries(memmap, &memmap_entries, false);
 }
 
tab: 248 wrap: offon