• Marc Zyngier's avatar
    KVM: arm64: Ensure I-cache isolation between vcpus of a same VM · 01dc9262
    Marc Zyngier authored
    It recently became apparent that the ARMv8 architecture has interesting
    rules regarding attributes being used when fetching instructions
    if the MMU is off at Stage-1.
    
    In this situation, the CPU is allowed to fetch from the PoC and
    allocate into the I-cache (unless the memory is mapped with
    the XN attribute at Stage-2).
    
    If we transpose this to vcpus sharing a single physical CPU,
    it is possible for a vcpu running with its MMU off to influence
    another vcpu running with its MMU on, as the latter is expected to
    fetch from the PoU (and self-patching code doesn't flush below that
    level).
    
    In order to solve this, reuse the vcpu-private TLB invalidation
    code to apply the same policy to the I-cache, nuking it every time
    the vcpu runs on a physical CPU that ran another vcpu of the same
    VM in the past.
    
    This involve renaming __kvm_tlb_flush_local_vmid() to
    __kvm_flush_cpu_context(), and inserting a local i-cache invalidation
    there.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Acked-by: default avatarWill Deacon <will@kernel.org>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Link: https://lore.kernel.org/r/20210303164505.68492-1-maz@kernel.org
    01dc9262
tlb.c 4.04 KB