KVM: arm64: timers: Correctly handle TGE flip with CNTPOFF_EL2
authorMarc Zyngier <maz@kernel.org>
Tue, 22 Aug 2023 12:18:10 +0000 (13:18 +0100)
committerMarc Zyngier <maz@kernel.org>
Thu, 12 Oct 2023 15:55:21 +0000 (16:55 +0100)
commit9404673293b065cbb16b8915530147cac7e80b4d
tree4bdefb73667c09dec5cccd26c97cf59f37f2cd92
parent839d90357b7ce6b129045d28ac22bd3a247e2350
KVM: arm64: timers: Correctly handle TGE flip with CNTPOFF_EL2

Contrary to common belief, HCR_EL2.TGE has a direct and immediate
effect on the way the EL0 physical counter is offset. Flipping
TGE from 1 to 0 while at EL2 immediately changes the way the counter
compared to the CVAL limit.

This means that we cannot directly save/restore the guest's view of
CVAL, but that we instead must treat it as if CNTPOFF didn't exist.
Only in the world switch, once we figure out that we do have CNTPOFF,
can we must the offset back and forth depending on the polarity of
TGE.

Fixes: 2b4825a86940 ("KVM: arm64: timers: Use CNTPOFF_EL2 to offset the physical timer")
Reported-by: Ganapatrao Kulkarni <gankulkarni@os.amperecomputing.com>
Tested-by: Ganapatrao Kulkarni <gankulkarni@os.amperecomputing.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/arch_timer.c
arch/arm64/kvm/hyp/vhe/switch.c
include/kvm/arm_arch_timer.h