:: commit ad2e03b43469a6a4d4188cdd4d4baa6fcf1d95ea

mintsuki <mintsuki@protonmail.com> — 2021-05-04 22:12

parents: a01e5ecd1a

pmm: Guard against broken E820 causing an EBDA overwrite

diff --git a/stage23/mm/pmm.s2.c b/stage23/mm/pmm.s2.c
index f88516f2..8fab15ae 100644
--- a/stage23/mm/pmm.s2.c
+++ b/stage23/mm/pmm.s2.c
@@ -3,6 +3,7 @@
 #include <stdbool.h>
 #include <mm/pmm.h>
 #include <sys/e820.h>
+#include <lib/acpi.h>
 #include <lib/blib.h>
 #include <lib/libc.h>
 #include <lib/print.h>
@@ -201,13 +202,29 @@ void init_memmap(void) {
 
         memmap[memmap_entries] = e820_map[i];
 
-        if (memmap[memmap_entries].base < 0x1000) {
-            if (memmap[memmap_entries].base + memmap[memmap_entries].length <= 0x1000) {
-                continue;
+        uint64_t top = memmap[memmap_entries].base + memmap[memmap_entries].length;
+
+        if (memmap[memmap_entries].type == MEMMAP_USABLE) {
+            if (memmap[memmap_entries].base < 0x1000) {
+                if (top <= 0x1000) {
+                    continue;
+                }
+
+                memmap[memmap_entries].length -= 0x1000 - memmap[memmap_entries].base;
+                memmap[memmap_entries].base = 0x1000;
             }
 
-            memmap[memmap_entries].length -= 0x1000 - memmap[memmap_entries].base;
-            memmap[memmap_entries].base = 0x1000;
+            if (memmap[memmap_entries].base >= EBDA && memmap[memmap_entries].base < 0x100000) {
+                if (top <= 0x100000)
+                    continue;
+
+                memmap[memmap_entries].length -= 0x100000 - memmap[memmap_entries].base;
+                memmap[memmap_entries].base = 0x100000;
+            }
+
+            if (top > EBDA && top <= 0x100000) {
+                memmap[memmap_entries].length -= top - EBDA;
+            }
         }
 
         memmap_entries++;
tab: 248 wrap: offon