aboutsummaryrefslogtreecommitdiff
path: root/hw/ssi
diff options
context:
space:
mode:
authorAlistair Francis <alistair23@gmail.com>2023-11-02 10:34:23 +1000
committerAlistair Francis <alistair.francis@wdc.com>2023-11-07 11:06:02 +1000
commitd53ead72066b1502bc3989dd11f1565d472e431d (patch)
tree677f61611c4f92edb77533578bb5989341a34813 /hw/ssi
parent251385fd4480c0715f3d2c76a3c76534a42570fc (diff)
downloadqemu-d53ead72066b1502bc3989dd11f1565d472e431d.zip
qemu-d53ead72066b1502bc3989dd11f1565d472e431d.tar.gz
qemu-d53ead72066b1502bc3989dd11f1565d472e431d.tar.bz2
hw/ssi: ibex_spi_host: Clear the interrupt even if disabled
We currently don't clear the interrupts if they are disabled. This means that if an interrupt occurs and the guest disables interrupts the QEMU IRQ will remain high. This doesn't immediately affect guests, but if the guest re-enables interrupts it's possible that we will miss an interrupt as it always remains set. Let's update the logic to always call qemu_set_irq() even if the interrupts are disabled to ensure we set the level low. The level will never be high unless interrupts are enabled, so we won't generate interrupts when we shouldn't. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Message-ID: <20231102003424.2003428-2-alistair.francis@wdc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Diffstat (limited to 'hw/ssi')
-rw-r--r--hw/ssi/ibex_spi_host.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/hw/ssi/ibex_spi_host.c b/hw/ssi/ibex_spi_host.c
index 1ee7d88..c300ec2 100644
--- a/hw/ssi/ibex_spi_host.c
+++ b/hw/ssi/ibex_spi_host.c
@@ -205,9 +205,10 @@ static void ibex_spi_host_irq(IbexSPIHostState *s)
if (err_irq) {
s->regs[IBEX_SPI_HOST_INTR_STATE] |= R_INTR_STATE_ERROR_MASK;
}
- qemu_set_irq(s->host_err, err_irq);
}
+ qemu_set_irq(s->host_err, err_irq);
+
/* Event IRQ Enabled and Event IRQ Cleared */
if (event_en && !status_pending) {
if (FIELD_EX32(intr_test_reg, INTR_STATE, SPI_EVENT)) {
@@ -229,8 +230,9 @@ static void ibex_spi_host_irq(IbexSPIHostState *s)
if (event_irq) {
s->regs[IBEX_SPI_HOST_INTR_STATE] |= R_INTR_STATE_SPI_EVENT_MASK;
}
- qemu_set_irq(s->event, event_irq);
}
+
+ qemu_set_irq(s->event, event_irq);
}
static void ibex_spi_host_transfer(IbexSPIHostState *s)