From ec2db7de7a280ce8d943e1a14463609d44b2b3e8 Mon Sep 17 00:00:00 2001 From: pbrook Date: Tue, 14 Nov 2006 21:13:53 +0000 Subject: ARM timer counts down, not up. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2214 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/arm_timer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hw/arm_timer.c b/hw/arm_timer.c index a97d73e44..c8864f13c 100644 --- a/hw/arm_timer.c +++ b/hw/arm_timer.c @@ -107,29 +107,29 @@ static void arm_timer_update(arm_timer_state *s, int64_t now) /* Return the current value of the timer. */ static uint32_t arm_timer_getcount(arm_timer_state *s, int64_t now) { - int64_t elapsed; + int64_t left; int64_t period; if (s->count == 0) return 0; if ((s->control & TIMER_CTRL_ENABLE) == 0) return s->count; - elapsed = now - s->loaded; + left = s->expires - now; period = s->expires - s->loaded; /* If the timer should have expired then return 0. This can happen when the host timer signal doesnt occur immediately. It's better to have a timer appear to sit at zero for a while than have it wrap around before the guest interrupt is raised. */ /* ??? Could we trigger the interrupt here? */ - if (elapsed > period) + if (left < 0) return 0; /* We need to calculate count * elapsed / period without overfowing. Scale both elapsed and period so they fit in a 32-bit int. */ while (period != (int32_t)period) { period >>= 1; - elapsed >>= 1; + left >>= 1; } - return ((uint64_t)s->count * (uint64_t)(int32_t)elapsed) + return ((uint64_t)s->count * (uint64_t)(int32_t)left) / (int32_t)period; } -- cgit v1.2.3