|
@@ -268,6 +268,22 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
|
|
|
|
|
|
efi_scratch.use_pgd = true;
|
|
|
|
|
|
+ /*
|
|
|
+ * Certain firmware versions are way too sentimential and still believe
|
|
|
+ * they are exclusive and unquestionable owners of the first physical page,
|
|
|
+ * even though they explicitly mark it as EFI_CONVENTIONAL_MEMORY
|
|
|
+ * (but then write-access it later during SetVirtualAddressMap()).
|
|
|
+ *
|
|
|
+ * Create a 1:1 mapping for this page, to avoid triple faults during early
|
|
|
+ * boot with such firmware. We are free to hand this page to the BIOS,
|
|
|
+ * as trim_bios_range() will reserve the first page and isolate it away
|
|
|
+ * from memory allocators anyway.
|
|
|
+ */
|
|
|
+ if (kernel_map_pages_in_pgd(pgd, 0x0, 0x0, 1, _PAGE_RW)) {
|
|
|
+ pr_err("Failed to create 1:1 mapping for the first page!\n");
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* When making calls to the firmware everything needs to be 1:1
|
|
|
* mapped and addressable with 32-bit pointers. Map the kernel
|