:: commit aed3b3348e51aa42fc87a62518f0df6a3b3b942e

Kacper Słomiński <kacper.slominski72@gmail.com> — 2024-06-16 17:02

parents: b3d7688449

protos/linux_risc: Properly fill VirtualStart in memory map

This lets Linux use UEFI runtime services.
diff --git a/common/protos/linux_risc.c b/common/protos/linux_risc.c
index 0b875435..da466a00 100644
--- a/common/protos/linux_risc.c
+++ b/common/protos/linux_risc.c
@@ -163,15 +163,17 @@ void *prepare_device_tree_blob(char *config, char *cmdline) {
         panic(true, "linux: failed to set UEFI secure boot state: '%s'", fdt_strerror(ret));
     }
 
-    // TODO(qookie): We should fill out VirtualStart for runtime entries and do
-    // SetVirtualMap here. Not doing this works, but Linux can't use UEFI
-    // runtime services.
     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;
 
         if (entry->Attribute & EFI_MEMORY_RUNTIME)
-            entry->VirtualStart = 0xFFFFFFFFFFFFFFFF;
+            entry->VirtualStart = entry->PhysicalStart;
+    }
+
+    EFI_STATUS status = gRT->SetVirtualAddressMap(efi_mmap_size, efi_desc_size, efi_desc_ver, efi_mmap);
+    if (status != EFI_SUCCESS) {
+        panic(false, "linux: failed to set UEFI virtual address map: '%x'", status);
     }
 
     return dtb;
tab: 248 wrap: offon