]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Fix WFxT handling of nested virt
authorMarc Zyngier <maz@kernel.org>
Mon, 29 Sep 2025 16:04:53 +0000 (17:04 +0100)
committerMarc Zyngier <maz@kernel.org>
Mon, 13 Oct 2025 13:42:41 +0000 (14:42 +0100)
The spec for WFxT indicates that the parameter to the WFxT instruction
is relative to the reading of CNTVCT_EL0. This means that the implementation
needs to take the execution context into account, as CNTVOFF_EL2
does not always affect readings of CNTVCT_EL0 (such as when HCR_EL2.E2H
is 1 and that we're in host context).

This also rids us of the last instance of KVM_REG_ARM_TIMER_CNT
outside of the userspace interaction code.

Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/handle_exit.c

index bca8c80e11da59a180586f6cb599dd2f0eb6eff1..cc7d5d1709cb88bafffda8d7b6eb17a270444e1f 100644 (file)
@@ -147,7 +147,12 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu)
                if (esr & ESR_ELx_WFx_ISS_RV) {
                        u64 val, now;
 
-                       now = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_TIMER_CNT);
+                       now = kvm_phys_timer_read();
+                       if (is_hyp_ctxt(vcpu) && vcpu_el2_e2h_is_set(vcpu))
+                               now -= timer_get_offset(vcpu_hvtimer(vcpu));
+                       else
+                               now -= timer_get_offset(vcpu_vtimer(vcpu));
+
                        val = vcpu_get_reg(vcpu, kvm_vcpu_sys_get_rt(vcpu));
 
                        if (now >= val)