• Will Deacon's avatar
    KVM: arm64: Ensure TLBI uses correct VMID after changing context · ed49fe5a
    Will Deacon authored
    When the target context passed to enter_vmid_context() matches the
    current running context, the function returns early without manipulating
    the registers of the stage-2 MMU. This can result in a stale VMID due to
    the lack of an ISB instruction in exit_vmid_context() after writing the
    VTTBR when ARM64_WORKAROUND_SPECULATIVE_AT is not enabled.
    
    For example, with pKVM enabled:
    
    	// Initially running in host context
    	enter_vmid_context(guest);
    		-> __load_stage2(guest); isb	// Writes VTCR & VTTBR
    	exit_vmid_context(guest);
    		-> __load_stage2(host);		// Restores VTCR & VTTBR
    
    	enter_vmid_context(host);
    		-> Returns early as we're already in host context
    	tlbi vmalls12e1is	// !!! Can use the stale VMID as we
    				// haven't performed context
    				// synchronisation since restoring
    				// VTTBR.VMID
    
    Add an unconditional ISB instruction to exit_vmid_context() after
    restoring the VTTBR. This already existed for the
    ARM64_WORKAROUND_SPECULATIVE_AT path, so we can simply hoist that onto
    the common path.
    
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Oliver Upton <oliver.upton@linux.dev>
    Cc: Fuad Tabba <tabba@google.com>
    Fixes: 58f3b0fc ("KVM: arm64: Support TLB invalidation in guest context")
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20240814123429.20457-3-will@kernel.orgSigned-off-by: default avatarMarc Zyngier <maz@kernel.org>
    ed49fe5a
tlb.c 6.15 KB