mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 19:33:39 +08:00
aspeed/timer: Ensure positive muldiv delta
If the host decrements the counter register that results in a negative delta. This is then passed to muldiv64 which only handles unsigned numbers resulting in bogus results. This fix ensures the delta being operated on is positive. Test case: kexec a kernel using aspeed_timer and it will freeze on the second bootup when the kernel initializes the timer. With this patch that no longer happens and the timer appears to run OK. Signed-off-by: Christian Svensson <bluecmd@google.com> Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Andrew Jeffery <andrew@aj.id.au> Message-id: 20190618165311.27066-12-clg@kaod.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
696942b8bc
commit
055762479b
@ -275,7 +275,11 @@ static void aspeed_timer_set_value(AspeedTimerCtrlState *s, int timer, int reg,
|
||||
int64_t delta = (int64_t) value - (int64_t) calculate_ticks(t, now);
|
||||
uint32_t rate = calculate_rate(t);
|
||||
|
||||
t->start += muldiv64(delta, NANOSECONDS_PER_SECOND, rate);
|
||||
if (delta >= 0) {
|
||||
t->start += muldiv64(delta, NANOSECONDS_PER_SECOND, rate);
|
||||
} else {
|
||||
t->start -= muldiv64(-delta, NANOSECONDS_PER_SECOND, rate);
|
||||
}
|
||||
aspeed_timer_mod(t);
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user