diff --git a/sys/arch/arm/cortex/gtmr.c b/sys/arch/arm/cortex/gtmr.c index 7fb7bc1..4a2add6 100644 --- a/sys/arch/arm/cortex/gtmr.c +++ b/sys/arch/arm/cortex/gtmr.c @@ -290,9 +290,11 @@ gtmr_intr(void *arg) printf("%s(%p): %s: now %#"PRIx64" delta %"PRIu64"\n", __func__, cf, ci->ci_data.cpu_name, now, delta); #endif +#ifndef ARM_KVM_GUEST KASSERTMSG(delta > sc->sc_autoinc / 100, "%s: interrupting too quickly (delta=%"PRIu64") autoinc=%lu", ci->ci_data.cpu_name, delta, sc->sc_autoinc); +#endif /* * If we got interrupted too soon (delta < sc->sc_autoinc) or @@ -304,6 +306,13 @@ gtmr_intr(void *arg) delta = 0; } armreg_cntv_tval_write(sc->sc_autoinc - delta); +#ifdef ARM_KVM_GUEST + /* + * KVM emulated timer is oneshot, so we need to rearm it after + * each interrupt. + */ + armreg_cntv_ctl_write(ARM_CNTCTL_ENABLE); +#endif ci->ci_lastintr = now;