Hi Ard, After entering 6.1-rc1 the efi runtime services is not working on my platform: [ 0.054039] Remapping and enabling EFI services. [ 0.054043] UEFI virtual mapping missing or invalid -- runtime services will not be available Not sure this patch is the root cause since I see some refactor of efi codes in 6.1-rc1, but simply reverting this make EFI runtime services works again. Tested on HiSilicon's Kunpeng 920 arm64 server using 48 bit VA address: CONFIG_ARM64_VA_BITS_48=y CONFIG_ARM64_VA_BITS=48 Thanks. On 2022/9/16 18:18, Ard Biesheuvel wrote: > EFI's SetVirtualAddressMap() runtime service is a horrid hack that we'd > like to avoid using, if possible. For 64-bit architectures such as > arm64, the user and kernel mappings are entirely disjoint, and given > that we use the user region for mapping the UEFI runtime regions when > running under the OS, we don't rely on SetVirtualAddressMap() in the > conventional way, i.e., to permit kernel mappings of the OS to coexist > with kernel region mappings of the firmware regions. This means that, in > principle, we should be able to avoid SetVirtualAddressMap() altogether, > and simply use the 1:1 mapping that UEFI uses at boot time. (Note that > omitting SetVirtualAddressMap() is explicitly permitted by the UEFI > spec). > > However, there is a corner case on arm64, which, if configured for > 3-level paging (or 2-level paging when using 64k pages), may not be able > to cover the entire range of firmware mappings (which might contain both > memory and MMIO peripheral mappings). > > So let's avoid SetVirtualAddressMap() on arm64, but only if the VA space > is guaranteed to be of sufficient size. > > Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> > --- > drivers/firmware/efi/libstub/arm64-stub.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/firmware/efi/libstub/arm64-stub.c b/drivers/firmware/efi/libstub/arm64-stub.c > index cd3bea25c762..4fff6c32899e 100644 > --- a/drivers/firmware/efi/libstub/arm64-stub.c > +++ b/drivers/firmware/efi/libstub/arm64-stub.c > @@ -31,6 +31,15 @@ efi_status_t check_platform_features(void) > efi_err("This 16 KB granular kernel is not supported by your CPU\n"); > return EFI_UNSUPPORTED; > } > + > + /* > + * If we have 48 bits of VA space for TTBR0 mappings, we can map the > + * UEFI runtime regions 1:1 and so calling SetVirtualAddressMap() is > + * unnecessary. > + */ > + if (VA_BITS_MIN >= 48) > + efi_novamap = true; > + > return EFI_SUCCESS; > } > >