[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 8/8] hw/timer/imx_epit: Avoid assertion when CR.SWR is written
From: |
Peter Maydell |
Subject: |
[PULL 8/8] hw/timer/imx_epit: Avoid assertion when CR.SWR is written |
Date: |
Mon, 3 Aug 2020 20:33:59 +0100 |
The imx_epit device has a software-controllable reset triggered by
setting the SWR bit in the CR register. An error in commit cc2722ec83ad9
means that we will end up assert()ing if the guest does this, because
the code in imx_epit_write() starts ptimer transactions, and then
imx_epit_reset() also starts ptimer transactions, triggering
"ptimer_transaction_begin: Assertion `!s->in_transaction' failed".
The cleanest way to avoid this double-transaction is to move the
start-transaction for the CR write handling down below the check of
the SWR bit.
Fixes: https://bugs.launchpad.net/qemu/+bug/1880424
Fixes: cc2722ec83ad944505fe
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 20200727154550.3409-1-peter.maydell@linaro.org
---
hw/timer/imx_epit.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
index baf6338e1a6..ebd58254d15 100644
--- a/hw/timer/imx_epit.c
+++ b/hw/timer/imx_epit.c
@@ -199,15 +199,22 @@ static void imx_epit_write(void *opaque, hwaddr offset,
uint64_t value,
switch (offset >> 2) {
case 0: /* CR */
- ptimer_transaction_begin(s->timer_cmp);
- ptimer_transaction_begin(s->timer_reload);
oldcr = s->cr;
s->cr = value & 0x03ffffff;
if (s->cr & CR_SWR) {
/* handle the reset */
imx_epit_reset(DEVICE(s));
- } else {
+ /*
+ * TODO: could we 'break' here? following operations appear
+ * to duplicate the work imx_epit_reset() already did.
+ */
+ }
+
+ ptimer_transaction_begin(s->timer_cmp);
+ ptimer_transaction_begin(s->timer_reload);
+
+ if (!(s->cr & CR_SWR)) {
imx_epit_set_freq(s);
}
--
2.20.1
- [PULL 0/8] target-arm queue, Peter Maydell, 2020/08/03
- [PULL 1/8] hw/arm/netduino2, netduinoplus2: Set system_clock_scale, Peter Maydell, 2020/08/03
- [PULL 2/8] include/hw/irq.h: New function qemu_irq_is_connected(), Peter Maydell, 2020/08/03
- [PULL 3/8] hw/intc/armv7m_nvic: Provide default "reset the system" behaviour for SYSRESETREQ, Peter Maydell, 2020/08/03
- [PULL 4/8] msf2-soc, stellaris: Don't wire up SYSRESETREQ, Peter Maydell, 2020/08/03
- [PULL 5/8] target/arm: Fix AddPAC error indication, Peter Maydell, 2020/08/03
- [PULL 6/8] target/arm: Avoid maybe-uninitialized warning with gcc 4.9, Peter Maydell, 2020/08/03
- [PULL 7/8] hw/arm/nrf51_soc: Set system_clock_scale, Peter Maydell, 2020/08/03
- [PULL 8/8] hw/timer/imx_epit: Avoid assertion when CR.SWR is written,
Peter Maydell <=
- Re: [PULL 0/8] target-arm queue, Peter Maydell, 2020/08/03