On Thu, Jul 29, 2021 at 12:10:10AM +0000, Oliver Upton wrote: > Presently, KVM provides no facilities for correctly migrating a guest > that depends on the physical counter-timer. While most guests (barring > NV, of course) should not depend on the physical counter-timer, an > operator may still wish to provide a consistent view of the physical > counter-timer across migrations. > > Provide userspace with a new vCPU attribute to modify the guest physical > counter-timer offset. Since the base architecture doesn't provide a > physical counter-timer offset register, emulate the correct behavior by > trapping accesses to the physical counter-timer whenever the offset > value is non-zero. > > Uphold the same behavior as CNTVOFF_EL2 and broadcast the physical > offset to all vCPUs whenever written. This guarantees that the > counter-timer we provide the guest remains architectural, wherein all > views of the counter-timer are consistent across vCPUs. Reconfigure > timer traps for VHE on every guest entry, as different VMs will now have > different traps enabled. Enable physical counter traps for nVHE whenever > the offset is nonzero (we already trap physical timer registers in > nVHE). > > FEAT_ECV provides a guest physical counter-timer offset register > (CNTPOFF_EL2), but ECV-enabled hardware is nonexistent at the time of > writing so support for it was elided for the sake of the author :) > > Cc: Andrew Jones <drjones@xxxxxxxxxx> > Signed-off-by: Oliver Upton <oupton@xxxxxxxxxx> > --- > Documentation/virt/kvm/devices/vcpu.rst | 22 +++++++ > arch/arm64/include/asm/kvm_host.h | 1 + > arch/arm64/include/asm/kvm_hyp.h | 2 - > arch/arm64/include/asm/sysreg.h | 1 + > arch/arm64/include/uapi/asm/kvm.h | 1 + > arch/arm64/kvm/arch_timer.c | 72 ++++++++++++++--------- > arch/arm64/kvm/arm.c | 4 +- > arch/arm64/kvm/hyp/include/hyp/switch.h | 23 ++++++++ > arch/arm64/kvm/hyp/include/hyp/timer-sr.h | 26 ++++++++ > arch/arm64/kvm/hyp/nvhe/switch.c | 2 - > arch/arm64/kvm/hyp/nvhe/timer-sr.c | 21 +++---- > arch/arm64/kvm/hyp/vhe/timer-sr.c | 27 +++++++++ > include/kvm/arm_arch_timer.h | 2 - > 13 files changed, 158 insertions(+), 46 deletions(-) > create mode 100644 arch/arm64/kvm/hyp/include/hyp/timer-sr.h > Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx>