Skip to content

Commit

Permalink
Revert "hw/ptimer: Perform counter wrap around if timer already expired"
Browse files Browse the repository at this point in the history
Software should see timer counter wraparound only after IRQ being triggered.
This fixes regression introduced by the commit 5a50307 ("hw/ptimer: Perform
counter wrap around if timer already expired"), resulting in monotonic timer
jumping backwards on SPARC emulated machine running NetBSD guest OS, as
reported by Mark Cave-Ayland.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Message-id: 20160708132206.2080-1-digetx@gmail.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
digetx authored and pm215 committed Jul 14, 2016
1 parent f58b39d commit 56215da
Showing 1 changed file with 2 additions and 7 deletions.
9 changes: 2 additions & 7 deletions hw/core/ptimer.c
Expand Up @@ -93,7 +93,7 @@ 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) {
/* Prevent timer underflowing if it should already have
triggered. */
counter = 0;
Expand All @@ -120,7 +120,7 @@ uint64_t ptimer_get_count(ptimer_state *s)
backwards.
*/

rem = expired ? now - next : next - now;
rem = next - now;
div = period;

clz1 = clz64(rem);
Expand All @@ -140,11 +140,6 @@ uint64_t ptimer_get_count(ptimer_state *s)
div += 1;
}
counter = rem / div;

if (expired && counter != 0) {
/* Wrap around periodic counter. */
counter = s->limit - (counter - 1) % s->limit;
}
}
} else {
counter = s->delta;
Expand Down

0 comments on commit 56215da

Please sign in to comment.