Add a new selftests that validates some edge cases related to the virtual arch-timer, for example: - timers across counter roll-overs. - moving counters ahead and behind pending timers. - having the same timer condition firing multiple times. The tests run while checking the state of the IRQs (e.g., pending when they are supposed to be) and stressing things a bit by waiting for interrupts while: re-scheduling the vcpu (with sched_yield()), by migrating the vcpu between cores, or by sleeping in userspace (with usleep()). The first commit adds a timer utility function. The second commit adds some sanity checks and basic tests for the timer. The third commit adds the actual edge case tests (like forcing rollovers). v1 -> v2: - Remove the checks for timers firing within some margin; only leave the checks for timers not firing ahead of time. Also remove the tests that depend on timers firing within some margin. [Oliver, Marc] - Collect R-b tag from Oliver (first commit). [Oliver] - Multiple nits: replace wfi_ functions with wait_, reduce use of macros, drop typedefs, use IAR_SPURIOUS from header, move some comments functions to top. [Oliver] - Don't fail if the test has a single cpu available. [Oliver] - Don't fail if there's no GICv3 available. [Oliver] v1: https://lore.kernel.org/kvmarm/20220302172144.2734258-1-ricarkol@xxxxxxxxxx/ There is a slight complication with where this series applies. The test added here fails without commit cc94d47ce16d ("kvm: selftests: aarch64: fix assert in gicv3_access_reg") which lives in kvmarm/next. However, it can't be built on top of kvmarm/next as it depends on commit 456f89e0928a ("KVM: selftests: aarch64: Skip tests if we can't create a vgic-v3") which is not in kvmarm/next. Ricardo Koller (3): KVM: arm64: selftests: add timer_get_tval() lib function KVM: arm64: selftests: add arch_timer_edge_cases KVM: arm64: selftests: add edge cases tests into arch_timer_edge_cases tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 1 + .../kvm/aarch64/arch_timer_edge_cases.c | 891 ++++++++++++++++++ .../kvm/include/aarch64/arch_timer.h | 18 +- 4 files changed, 910 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/kvm/aarch64/arch_timer_edge_cases.c -- 2.35.1.723.g4982287a31-goog