Fix BIOS reserves
authorJack Miller <jack@codezen.org>
Thu, 7 Apr 2016 01:55:50 +0000 (20:55 -0500)
committerJack Miller <jack@codezen.org>
Thu, 7 Apr 2016 01:55:50 +0000 (20:55 -0500)
- Manually reserve 0xA0000 -> 0xFFFFF region, not in GRUB map

- ACPI window forgot the page shift

include/memmap.h
kernel/acpi.c
mm/page_alloc.c

index 8d8f73a..b5ea9db 100644 (file)
@@ -4,6 +4,15 @@
 #include <paging.h>
 
 /* Early physical addresses */
+
+/* This memory is off limits and includes stuff like the VGA buffer, but isn't
+ * included in the GRUB memory map for some reason
+ */
+
+#define EXTRA_RES_START 0x0A0000
+#define EXTRA_RES_END   0x100000
+#define EXTRA_RES_PAGES ((EXTRA_RES_END - EXTRA_RES_START) >> PAGE_SHIFT)
+
 #define KERNEL_START 0x100000
 
 #define VIRT_BASE              0xFFFFFFFF80000000
index 6b07cb7..5f3fd38 100644 (file)
@@ -119,7 +119,7 @@ struct acpi_section_handler handlers[] = {
 #define BIOS_ROM_START 0xe0000
 #define BIOS_ROM_END 0x100000
 #define BIOS_ROM_LENGTH (BIOS_ROM_END - BIOS_ROM_START)
-#define BIOS_ROM_PAGES PAGE_ALIGN_UP(BIOS_ROM_LENGTH)
+#define BIOS_ROM_PAGES (PAGE_ALIGN_UP(BIOS_ROM_LENGTH) >> PAGE_SHIFT)
 #define BIOS_ROM_16BYTES (BIOS_ROM_LENGTH / 16)
 
 struct rsdp *__acpi_find_rsdp(u64 * bios_mem)
index 4df2d02..5d46074 100644 (file)
@@ -810,6 +810,9 @@ int page_alloc_init(struct grub_info *info_phys, u64 end_structures)
         __reserve_region(base, length >> PAGE_SHIFT);
     }
 
+    /* Stuff we should reserve, despite not being reserved in the map */
+    __reserve_region(EXTRA_RES_START, EXTRA_RES_PAGES);
+
     /* Finally, mark our own pages as allocated */
 
     kernel_size = (end_structures - KERNEL_START);