Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: arm64: Fix WFxT handling of nested virt

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>

+6 -1
+6 -1
arch/arm64/kvm/handle_exit.c
··· 147 147 if (esr & ESR_ELx_WFx_ISS_RV) { 148 148 u64 val, now; 149 149 150 - now = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_TIMER_CNT); 150 + now = kvm_phys_timer_read(); 151 + if (is_hyp_ctxt(vcpu) && vcpu_el2_e2h_is_set(vcpu)) 152 + now -= timer_get_offset(vcpu_hvtimer(vcpu)); 153 + else 154 + now -= timer_get_offset(vcpu_vtimer(vcpu)); 155 + 151 156 val = vcpu_get_reg(vcpu, kvm_vcpu_sys_get_rt(vcpu)); 152 157 153 158 if (now >= val)