]> git.ipfire.org Git - thirdparty/qemu.git/commit
target/arm: Handle overflow in calculation of next timer tick
authorPeter Maydell <peter.maydell@linaro.org>
Mon, 20 Nov 2023 17:35:06 +0000 (17:35 +0000)
committerMichael Tokarev <mjt@tls.msk.ru>
Tue, 5 Dec 2023 09:32:36 +0000 (12:32 +0300)
commit49727560c7cfa4ddf71a14f0b259fb441a6a1792
tree3a8b31a7cc228ac58fc4ebe72e6dcad85cbe1b17
parent169c593f78d936e85721acf54ff47dc436c4aefc
target/arm: Handle overflow in calculation of next timer tick

In commit edac4d8a168 back in 2015 when we added support for
the virtual timer offset CNTVOFF_EL2, we didn't correctly update
the timer-recalculation code that figures out when the timer
interrupt is next going to change state. We got it wrong in
two ways:
 * for the 0->1 transition, we didn't notice that gt->cval + offset
   can overflow a uint64_t
 * for the 1->0 transition, we didn't notice that the transition
   might now happen before the count rolls over, if offset > count

In the former case, we end up trying to set the next interrupt
for a time in the past, which results in QEMU hanging as the
timer fires continuously.

In the latter case, we would fail to update the interrupt
status when we are supposed to.

Fix the calculations in both cases.

The test case is Alex Bennée's from the bug report, and tests
the 0->1 transition overflow case.

Fixes: edac4d8a168 ("target-arm: Add CNTVOFF_EL2")
Cc: qemu-stable@nongnu.org
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/60
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20231120173506.3729884-1-peter.maydell@linaro.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
(cherry picked from commit 8d37a1425b9954d7e445615dcad23456515e24c0)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
target/arm/helper.c
tests/tcg/aarch64/Makefile.softmmu-target
tests/tcg/aarch64/system/vtimer.c [new file with mode: 0644]