From a16d62a2960b9f3c3e809d8051accf68826f3d32 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Mon, 17 Jul 2023 13:30:12 +0100 Subject: [PATCH] ANDROID: KVM: arm64: Fix MMU context save/restore over TLB invalidation The 'mmu' parameter to enter_vmid_context() represents the target MMU to switch to, so we should stash away the current MMU for restoration by exit_vmid_context() rather than the one we're about to switch to! Bug: 291568386 Fixes: 47318559bc51 ("ANDROID: KVM: arm64: Support TLB invalidation in guest context") Tested-by: Mostafa Saleh Reported-by: Mostafa Saleh Signed-off-by: Will Deacon Change-Id: I5d76c159424e32a6d70c598d0007f98ea80c1db4 --- arch/arm64/kvm/hyp/nvhe/tlb.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/tlb.c b/arch/arm64/kvm/hyp/nvhe/tlb.c index 35092e154614..692bd7f881f1 100644 --- a/arch/arm64/kvm/hyp/nvhe/tlb.c +++ b/arch/arm64/kvm/hyp/nvhe/tlb.c @@ -32,13 +32,19 @@ static void enter_vmid_context(struct kvm_s2_mmu *mmu, * to do. */ if (vcpu) { + /* We're in guest context */ if (mmu == vcpu->arch.hw_mmu || WARN_ON(mmu != host_s2_mmu)) return; - } else if (mmu == host_s2_mmu) { - return; + + cxt->mmu = vcpu->arch.hw_mmu; + } else { + /* We're in host context */ + if (mmu == host_s2_mmu) + return; + + cxt->mmu = host_s2_mmu; } - cxt->mmu = mmu; if (cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) { u64 val;