• Ryan Roberts's avatar
    KVM: arm64: Fix kvm init failure when mode!=vhe and VA_BITS=52. · 579d7ebe
    Ryan Roberts authored
    For nvhe and protected modes, the hyp stage 1 page-tables were previously
    configured to have the same number of VA bits as the kernel's idmap.
    However, for kernel configs with VA_BITS=52 and where the kernel is
    loaded in physical memory below 48 bits, the idmap VA bits is actually
    smaller than the kernel's normal stage 1 VA bits. This can lead to
    kernel addresses that can't be mapped into the hypervisor, leading to
    kvm initialization failure during boot:
    
      kvm [1]: IPA Size Limit: 48 bits
      kvm [1]: Cannot map world-switch code
      kvm [1]: error initializing Hyp mode: -34
    
    Fix this by ensuring that the hyp stage 1 VA size is the maximum of
    what's used for the idmap and the regular kernel stage 1. At the same
    time, refactor the code so that the hyp VA bits is only calculated in
    one place.
    
    Prior to 7ba8f2b2, the idmap was always 52 bits for a 52 VA bits
    kernel and therefore the hyp stage1 was also always 52 bits.
    
    Fixes: 7ba8f2b2 ("arm64: mm: use a 48-bit ID map when possible on 52-bit VA builds")
    Signed-off-by: default avatarRyan Roberts <ryan.roberts@arm.com>
    [maz: commit message fixes]
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221103150507.32948-2-ryan.roberts@arm.com
    579d7ebe
arm.c 53.9 KB