diff options
author | Dmitry Osipenko <digetx@gmail.com> | 2016-07-14 16:51:36 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2016-07-14 16:51:36 +0100 |
commit | 56215da394e9b784d425bc27cb826baf16c18b0d (patch) | |
tree | e728adde9627a148ed4ffee5d1e1202348d17ce4 /hw/core | |
parent | f58b39d2d5b6dea1a757e1dc7d67a44eac1c4f9c (diff) | |
download | qemu-56215da394e9b784d425bc27cb826baf16c18b0d.zip qemu-56215da394e9b784d425bc27cb826baf16c18b0d.tar.gz qemu-56215da394e9b784d425bc27cb826baf16c18b0d.tar.bz2 |
Revert "hw/ptimer: Perform counter wrap around if timer already expired"
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>
Diffstat (limited to 'hw/core')
-rw-r--r-- | hw/core/ptimer.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c index 05b0c27..30829ee 100644 --- a/hw/core/ptimer.c +++ b/hw/core/ptimer.c @@ -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; @@ -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); @@ -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; |