]> git.proxmox.com Git - qemu.git/commitdiff
arm_timer: reload timer when enabled
authorRabin Vincent <rabin@rab.in>
Sun, 2 May 2010 09:50:51 +0000 (15:20 +0530)
committerAurelien Jarno <aurelien@aurel32.net>
Thu, 27 May 2010 13:52:52 +0000 (15:52 +0200)
Reload the timer when TimerControl is written, if the timer is to be
enabled.  Otherwise, if an earlier write to TimerLoad was done while
periodic mode was not set, s->delta may incorrectly still have the value
of the maximum limit instead of the value written to TimerLoad.

This problem is evident on versatileap on current linux-next, which
enables TIMER_CTRL_32BIT before writing to TimerLoad and then enabling
periodic mode and starting the timer.  This causes the first periodic
tick to be scheduled to occur after 0xffffffff periods, leading to a
perceived hang while the kernel waits for the first timer tick.

Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
(cherry picked from commit d6759902cb467c002086853d2eb38fb969c29f7f)

hw/arm_timer.c

index 9fef191cbc3e5322a6eba341c2f1bd6e20b57f26..5b6947a16684db78e2efe331549899a4c064cbd5 100644 (file)
@@ -113,7 +113,7 @@ static void arm_timer_write(void *opaque, target_phys_addr_t offset,
         case 1: freq >>= 4; break;
         case 2: freq >>= 8; break;
         }
-        arm_timer_recalibrate(s, 0);
+        arm_timer_recalibrate(s, s->control & TIMER_CTRL_ENABLE);
         ptimer_set_freq(s->timer, freq);
         if (s->control & TIMER_CTRL_ENABLE) {
             /* Restart the timer if still enabled.  */