KVM: arm64: Fix bad dereference on MTE-enabled systems
authorRyan Roberts <ryan.roberts@arm.com>
Thu, 27 Oct 2022 12:09:45 +0000 (13:09 +0100)
committerMarc Zyngier <maz@kernel.org>
Thu, 27 Oct 2022 18:49:40 +0000 (19:49 +0100)
enter_exception64() performs an MTE check, which involves dereferencing
vcpu->kvm. While vcpu has already been fixed up to be a HYP VA pointer,
kvm is still a pointer in the kernel VA space.

This only affects nVHE configurations with MTE enabled, as in other
cases, the pointer is either valid (VHE) or not dereferenced (!MTE).

Fix this by first converting kvm to a HYP VA pointer.

Fixes: ea7fc1bb1cd1 ("KVM: arm64: Introduce MTE VM feature")
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
Reviewed-by: Steven Price <steven.price@arm.com>
[maz: commit message tidy-up]
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20221027120945.29679-1-ryan.roberts@arm.com
arch/arm64/kvm/hyp/exception.c

index b7557b25ed568935b32409efc49865fc19917704..791d3de767713c8ad6f48d81b1e371fdbcab9063 100644 (file)
@@ -13,6 +13,7 @@
 #include <hyp/adjust_pc.h>
 #include <linux/kvm_host.h>
 #include <asm/kvm_emulate.h>
+#include <asm/kvm_mmu.h>
 
 #if !defined (__KVM_NVHE_HYPERVISOR__) && !defined (__KVM_VHE_HYPERVISOR__)
 #error Hypervisor code only!
@@ -115,7 +116,7 @@ static void enter_exception64(struct kvm_vcpu *vcpu, unsigned long target_mode,
        new |= (old & PSR_C_BIT);
        new |= (old & PSR_V_BIT);
 
-       if (kvm_has_mte(vcpu->kvm))
+       if (kvm_has_mte(kern_hyp_va(vcpu->kvm)))
                new |= PSR_TCO_BIT;
 
        new |= (old & PSR_DIT_BIT);