• Ard Biesheuvel's avatar
    arm64/head: Disable MMU at EL2 before clearing HCR_EL2.E2H · 34e526cb
    Ard Biesheuvel authored
    Even though the boot protocol stipulates otherwise, an exception has
    been made for the EFI stub, and entering the core kernel with the MMU
    enabled is permitted. This allows a substantial amount of cache
    maintenance to be elided, wich is significant when fast boot times are
    critical (e.g., for booting micro-VMs)
    
    Once the initial ID map has been populated, the MMU is disabled as part
    of the logic sequence that puts all system registers into a known state.
    Any code that needs to execute within the window where the MMU is off is
    cleaned to the PoC explicitly, which includes all of HYP text when
    entering at EL2.
    
    However, the current sequence of initializing the EL2 system registers
    is not safe: HCR_EL2 is set to its nVHE initial state before SCTLR_EL2
    is reprogrammed, and this means that a VHE-to-nVHE switch may occur
    while the MMU is enabled. This switch causes some system registers as
    well as page table descriptors to be interpreted in a different way,
    potentially resulting in spurious exceptions relating to MMU
    translation.
    
    So disable the MMU explicitly first when entering in EL2 with the MMU
    and caches enabled.
    
    Fixes: 61786170 ("efi: arm64: enter with MMU and caches enabled")
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Cc: <stable@vger.kernel.org> # 6.3.x
    Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20240415075412.2347624-6-ardb+git@google.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    34e526cb
head.S 13.1 KB