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;