• Quentin Perret's avatar
    KVM: arm64: Fix host stage-2 finalization · 50a8d331
    Quentin Perret authored
    We currently walk the hypervisor stage-1 page-table towards the end of
    hyp init in nVHE protected mode and adjust the host page ownership
    attributes in its stage-2 in order to get a consistent state from both
    point of views. The walk is done on the entire hyp VA space, and expects
    to only ever find page-level mappings. While this expectation is
    reasonable in the half of hyp VA space that maps memory with a fixed
    offset (see the loop in pkvm_create_mappings_locked()), it can be
    incorrect in the other half where nothing prevents the usage of block
    mappings. For instance, on systems where memory is physically aligned at
    an address that happens to maps to a PMD aligned VA in the hyp_vmemmap,
    kvm_pgtable_hyp_map() will install block mappings when backing the
    hyp_vmemmap, which will later cause finalize_host_mappings() to fail.
    Furthermore, it should be noted that all pages backing the hyp_vmemmap
    are also mapped in the 'fixed offset range' of the hypervisor, which
    implies that finalize_host_mappings() will walk both aliases and update
    the host stage-2 attributes twice. The order in which this happens is
    unpredictable, though, since the hyp VA layout is highly dependent on
    the position of the idmap page, hence resulting in a fragile mess at
    best.
    
    In order to fix all of this, let's restrict the finalization walk to
    only cover memory regions in the 'fixed-offset range' of the hyp VA
    space and nothing else. This not only fixes a correctness issue, but
    will also result in a slighlty faster hyp initialization overall.
    
    Fixes: 2c50166c ("KVM: arm64: Mark host bss and rodata section as shared")
    Signed-off-by: default avatarQuentin Perret <qperret@google.com>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20211108154636.393384-1-qperret@google.com
    50a8d331
setup.c 7.27 KB