On 25.06.2016 16:20, Mark Cave-Ayland wrote: > On 25/06/16 13:35, Dmitry Osipenko wrote: > >> Software should see timer counter wrap around only after IRQ being triggered. >> Change returned counter value to "1" for the expired timer and avoid >> returning >> wrapped around counter value in periodic mode for the timer that has >> bottom-half >> handler setup, assuming it drives timer IRQ. >> >> This fixes regression introduced by the commit 5a50307 ("hw/ptimer: Perform >> counter wrap around if timer already expired") on SPARC emulated machine as >> reported by Mark Cave-Ayland. >> >> Signed-off-by: Dmitry Osipenko <dig...@gmail.com> >> --- >> hw/core/ptimer.c | 8 +++++--- >> 1 file changed, 5 insertions(+), 3 deletions(-) >> >> diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c >> index 05b0c27..8006442 100644 >> --- a/hw/core/ptimer.c >> +++ b/hw/core/ptimer.c >> @@ -93,10 +93,10 @@ uint64_t ptimer_get_count(ptimer_state *s) >> bool oneshot = (s->enabled == 2); >> >> /* Figure out the current counter value. */ >> - if (s->period == 0 || (expired && (oneshot || use_icount))) { >> + if (expired && (oneshot || use_icount || s->bh != NULL)) { >> /* Prevent timer underflowing if it should already have >> triggered. */ >> - counter = 0; >> + counter = 1; >> } else { >> uint64_t rem; >> uint64_t div; >> @@ -143,7 +143,9 @@ uint64_t ptimer_get_count(ptimer_state *s) >> >> if (expired && counter != 0) { >> /* Wrap around periodic counter. */ >> - counter = s->limit - (counter - 1) % s->limit; >> + counter = s->delta = s->limit - (counter - 1) % s->limit; >> + /* Re-arm timer according to the wrapped around value. */ >> + ptimer_reload(s); >> } >> } >> } else { >> > > Hi Dmitry, > > I ran through all of my OpenBIOS test images for qemu-system-sparc and AFAICT > this fixes the issue without introducing any further regressions so: > > Tested-by: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk> > > > Many thanks, > > Mark. >
Great! Thanks for testing it. -- Dmitry