summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--hw/ptimer.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/hw/ptimer.c b/hw/ptimer.c
index de7d6643ad..bc0b3f802f 100644
--- a/hw/ptimer.c
+++ b/hw/ptimer.c
@@ -180,6 +180,19 @@ void ptimer_set_freq(ptimer_state *s, uint32_t freq)
    count = limit.  */
 void ptimer_set_limit(ptimer_state *s, uint64_t limit, int reload)
 {
+    /*
+     * Artificially limit timeout rate to something
+     * achievable under QEMU.  Otherwise, QEMU spends all
+     * its time generating timer interrupts, and there
+     * is no forward progress.
+     * About ten microseconds is the fastest that really works
+     * on the current generation of host machines.
+     */
+
+    if (limit * s->period < 10000 && s->period) {
+        limit = 10000 / s->period;
+    }
+
     s->limit = limit;
     if (reload)
         s->delta = limit;