Commit ec2db7de7a280ce8d943e1a14463609d44b2b3e8

Authored by pbrook
1 parent 417f38f0

ARM timer counts down, not up.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2214 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 5 additions and 5 deletions
hw/arm_timer.c
@@ -107,29 +107,29 @@ static void arm_timer_update(arm_timer_state *s, int64_t now) @@ -107,29 +107,29 @@ static void arm_timer_update(arm_timer_state *s, int64_t now)
107 /* Return the current value of the timer. */ 107 /* Return the current value of the timer. */
108 static uint32_t arm_timer_getcount(arm_timer_state *s, int64_t now) 108 static uint32_t arm_timer_getcount(arm_timer_state *s, int64_t now)
109 { 109 {
110 - int64_t elapsed; 110 + int64_t left;
111 int64_t period; 111 int64_t period;
112 112
113 if (s->count == 0) 113 if (s->count == 0)
114 return 0; 114 return 0;
115 if ((s->control & TIMER_CTRL_ENABLE) == 0) 115 if ((s->control & TIMER_CTRL_ENABLE) == 0)
116 return s->count; 116 return s->count;
117 - elapsed = now - s->loaded; 117 + left = s->expires - now;
118 period = s->expires - s->loaded; 118 period = s->expires - s->loaded;
119 /* If the timer should have expired then return 0. This can happen 119 /* If the timer should have expired then return 0. This can happen
120 when the host timer signal doesnt occur immediately. It's better to 120 when the host timer signal doesnt occur immediately. It's better to
121 have a timer appear to sit at zero for a while than have it wrap 121 have a timer appear to sit at zero for a while than have it wrap
122 around before the guest interrupt is raised. */ 122 around before the guest interrupt is raised. */
123 /* ??? Could we trigger the interrupt here? */ 123 /* ??? Could we trigger the interrupt here? */
124 - if (elapsed > period) 124 + if (left < 0)
125 return 0; 125 return 0;
126 /* We need to calculate count * elapsed / period without overfowing. 126 /* We need to calculate count * elapsed / period without overfowing.
127 Scale both elapsed and period so they fit in a 32-bit int. */ 127 Scale both elapsed and period so they fit in a 32-bit int. */
128 while (period != (int32_t)period) { 128 while (period != (int32_t)period) {
129 period >>= 1; 129 period >>= 1;
130 - elapsed >>= 1; 130 + left >>= 1;
131 } 131 }
132 - return ((uint64_t)s->count * (uint64_t)(int32_t)elapsed) 132 + return ((uint64_t)s->count * (uint64_t)(int32_t)left)
133 / (int32_t)period; 133 / (int32_t)period;
134 } 134 }
135 135