• Ard Biesheuvel's avatar
    efi/arm64: libstub: avoid SetVirtualAddressMap() when possible · d3549a93
    Ard Biesheuvel authored
    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: default avatarArd Biesheuvel <ardb@kernel.org>
    d3549a93
efi-stub-helper.c 21.5 KB