On 9/23/19 4:40 PM, Peter Maydell wrote: > On Sat, 21 Sep 2019 at 11:17, Philippe Mathieu-Daudé <phi...@redhat.com> > wrote: >> >> If the period is too big, the 'delta * period' product result >> might overflow, resulting in a negative number, then the >> next_event ends before the last_event. This is buggy, as there >> is no forward progress. Assert this can not happen. >> >> Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com> >> --- >> hw/core/ptimer.c | 3 +++ >> 1 file changed, 3 insertions(+) >> >> diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c >> index d58e2dfdb0..88085d4c81 100644 >> --- a/hw/core/ptimer.c >> +++ b/hw/core/ptimer.c >> @@ -125,6 +125,9 @@ static void ptimer_reload(ptimer_state *s, int >> delta_adjust) >> >> s->last_event = s->next_event; >> s->next_event = s->last_event + delta * period; >> + /* Verify forward progress */ >> + g_assert(s->next_event > s->last_event); >> + >> if (period_frac) { >> s->next_event += ((int64_t)period_frac * delta) >> 32; >> } >> -- > > Can this only happen if a QEMU timer model using the ptimer > code has a bug, or is it guest-triggerable for some of our > timer models?
I hit this running a raspi4 guest, I had incorrectly initialized a clock using the core cpu frequency, while I had to use the APB one (in my case, core_cpu_freq / 2). The guest use a high value to configure a slow timer, which in my buggy case made QEMU hang in hard way to debug. So yes, it seems guest-triggerable if the implementation is broken. Using assert() is OK for broken implementation, right? Or should we audit all ptimer calls? Regards, Phil.