From 89183fd03b2d8b88f98997ff18ce0fd77f86c79d Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Wed, 20 Apr 2022 17:12:23 +0100 Subject: [PATCH] ANDROID: KVM: arm64: Skip __kvm_adjust_pc() for protected vcpus Prevent the host from issuing arbitrary PC adjustments for protected vCPUs. Signed-off-by: Marc Zyngier Signed-off-by: Will Deacon Bug: 233587962 Change-Id: I28815d1c6782abf2654ae3e931548014c842d760 --- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c index c69cd22d1078..167c9ad98e19 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -259,9 +259,22 @@ out: static void handle___kvm_adjust_pc(struct kvm_cpu_context *host_ctxt) { - DECLARE_REG(struct kvm_vcpu *, vcpu, host_ctxt, 1); + struct pkvm_hyp_vcpu *hyp_vcpu; + struct kvm_vcpu *host_vcpu; - __kvm_adjust_pc(kern_hyp_va(vcpu)); + host_vcpu = get_host_hyp_vcpus(host_ctxt, 1, &hyp_vcpu); + if (!host_vcpu) + return; + + if (hyp_vcpu) { + /* This only applies to non-protected VMs */ + if (pkvm_hyp_vcpu_is_protected(hyp_vcpu)) + return; + + __kvm_adjust_pc(&hyp_vcpu->vcpu); + } else { + __kvm_adjust_pc(host_vcpu); + } } static void handle___kvm_flush_vm_context(struct kvm_cpu_context *host_ctxt)