:: commit 7cb5ae20ea7c342ebb8c3cd96a99972fdde985aa

48cf <32851089+48cf@users.noreply.github.com> — 2023-12-02 22:20

parents: 6e4b4fd123

misc/efi: Call SetVirtualAddressMap when exiting boot services

diff --git a/common/lib/misc.c b/common/lib/misc.c
index 18d1848c..f015e639 100644
--- a/common/lib/misc.c
+++ b/common/lib/misc.c
@@ -151,6 +151,7 @@ error:
 #endif
 
 no_unwind bool efi_boot_services_exited = false;
+no_unwind bool efi_no_va_map = false;
 
 bool efi_exit_boot_services(void) {
     EFI_STATUS status;
@@ -199,6 +200,21 @@ retry:
         goto retry;
     }
 
+    for (size_t i = 0; i < efi_mmap_size / efi_desc_size; i++) {
+        EFI_MEMORY_DESCRIPTOR *md = (void *)efi_mmap + i * efi_desc_size;
+        if ((md->Attribute & EFI_MEMORY_RUNTIME) == 0) {
+            continue;
+        }
+
+        md->VirtualStart = md->PhysicalStart;
+    }
+
+    status = gRT->SetVirtualAddressMap(efi_mmap_size, efi_desc_size, efi_desc_ver, efi_mmap);
+    if (status != EFI_SUCCESS) {
+        print("efi: Failed to set virtual address map\n");
+        efi_no_va_map = true;
+    }
+
 #if defined(__x86_64__) || defined(__i386__)
     asm volatile ("cli" ::: "memory");
 #elif defined (__aarch64__)
diff --git a/common/lib/misc.h b/common/lib/misc.h
index 495c7984..a9fd5fe0 100644
--- a/common/lib/misc.h
+++ b/common/lib/misc.h
@@ -25,6 +25,8 @@ extern UINTN efi_mmap_size, efi_desc_size;
 extern UINT32 efi_desc_ver;
 
 extern bool efi_boot_services_exited;
+extern bool efi_no_va_map;
+
 bool efi_exit_boot_services(void);
 #endif
 
diff --git a/common/protos/linux.c b/common/protos/linux.c
index 84202460..fa9106e4 100644
--- a/common/protos/linux.c
+++ b/common/protos/linux.c
@@ -803,6 +803,10 @@ no_fb:;
         goto fdt_error;
     }
 
+    if (efi_no_va_map) {
+        goto no_va_map;
+    }
+
     fdt_val64 = cpu_to_fdt64((uintptr_t)efi_mmap);
     status = fdt_setprop_inplace(fdt, node, "linux,uefi-mmap-start", &fdt_val64, sizeof(uint64_t));
     if (status != 0) {
@@ -826,6 +830,8 @@ no_fb:;
     if (status != 0) {
         goto fdt_error;
     }
+
+no_va_map:;
 #endif
 #endif
 
tab: 248 wrap: offon