]> git.baikalelectronics.ru Git - kernel.git/commitdiff
efi: runtime: Don't assume virtual mappings are missing if VA == PA == 0
authorArd Biesheuvel <ardb@kernel.org>
Thu, 20 Oct 2022 13:16:09 +0000 (15:16 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Fri, 21 Oct 2022 09:09:41 +0000 (11:09 +0200)
The generic EFI stub can be instructed to avoid SetVirtualAddressMap(),
and simply run with the firmware's 1:1 mapping. In this case, it
populates the virtual address fields of the runtime regions in the
memory map with the physical address of each region, so that the mapping
code has to be none the wiser. Only if SetVirtualAddressMap() fails, the
virtual addresses are wiped and the kernel code knows that the regions
cannot be mapped.

However, wiping amounts to setting it to zero, and if a runtime region
happens to live at physical address 0, its valid 1:1 mapped virtual
address could be mistaken for a wiped field, resulting on loss of access
to the EFI services at runtime.

So let's only assume that VA == 0 means 'no runtime services' if the
region in question does not live at PA 0x0.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
drivers/firmware/efi/arm-runtime.c
drivers/firmware/efi/libstub/fdt.c
drivers/firmware/efi/riscv-runtime.c

index 3359ae2adf24ba93ba8511f79bfc5ba1198d63ef..7c48c380d722cb8d8e854be494391243afb180e9 100644 (file)
@@ -63,7 +63,7 @@ static bool __init efi_virtmap_init(void)
 
                if (!(md->attribute & EFI_MEMORY_RUNTIME))
                        continue;
-               if (md->virt_addr == 0)
+               if (md->virt_addr == U64_MAX)
                        return false;
 
                ret = efi_create_mapping(&efi_mm, md);
index 4f4d98e51fbfd99f8a354b62ccdfa38089202092..70e9789ff9de0a2f2ebf7a443114ab6565ca2c1f 100644 (file)
@@ -313,16 +313,16 @@ efi_status_t allocate_new_fdt_and_exit_boot(void *handle,
 
                        /*
                         * Set the virtual address field of all
-                        * EFI_MEMORY_RUNTIME entries to 0. This will signal
-                        * the incoming kernel that no virtual translation has
-                        * been installed.
+                        * EFI_MEMORY_RUNTIME entries to U64_MAX. This will
+                        * signal the incoming kernel that no virtual
+                        * translation has been installed.
                         */
                        for (l = 0; l < priv.boot_memmap->map_size;
                             l += priv.boot_memmap->desc_size) {
                                p = (void *)priv.boot_memmap->map + l;
 
                                if (p->attribute & EFI_MEMORY_RUNTIME)
-                                       p->virt_addr = 0;
+                                       p->virt_addr = U64_MAX;
                        }
                }
                return EFI_SUCCESS;
index d28e715d2bcc8b33ffe4b90a16305dc99448b279..d0daacd2c903f18224c993c32afd4e56e2e6df8a 100644 (file)
@@ -41,7 +41,7 @@ static bool __init efi_virtmap_init(void)
 
                if (!(md->attribute & EFI_MEMORY_RUNTIME))
                        continue;
-               if (md->virt_addr == 0)
+               if (md->virt_addr == U64_MAX)
                        return false;
 
                ret = efi_create_mapping(&efi_mm, md);