]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
hw/intc: Update APLIC IDC after claiming iforce register
authorFrank Chang <frank.chang@sifive.com>
Thu, 21 Mar 2024 10:49:48 +0000 (18:49 +0800)
committerMichael Tokarev <mjt@tls.msk.ru>
Wed, 27 Mar 2024 10:00:25 +0000 (13:00 +0300)
Currently, QEMU only sets the iforce register to 0 and returns early
when claiming the iforce register. However, this may leave mip.meip
remains at 1 if a spurious external interrupt triggered by iforce
register is the only pending interrupt to be claimed, and the interrupt
cannot be lowered as expected.

This commit fixes this issue by calling riscv_aplic_idc_update() to
update the IDC status after the iforce register is claimed.

Signed-off-by: Frank Chang <frank.chang@sifive.com>
Reviewed-by: Jim Shu <jim.shu@sifive.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <20240321104951.12104-1-frank.chang@sifive.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
(cherry picked from commit 078189b327ae5c5727b51ec714d9663b1d0ca3df)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
hw/intc/riscv_aplic.c

index c677b5cfbb54d3fdd2480063ba0f5edc0c67d379..6e816e33bf221d0ee88593b9bb70a97d7c9a0b4b 100644 (file)
@@ -463,6 +463,7 @@ static uint32_t riscv_aplic_idc_claimi(RISCVAPLICState *aplic, uint32_t idc)
 
     if (!topi) {
         aplic->iforce[idc] = 0;
+        riscv_aplic_idc_update(aplic, idc);
         return 0;
     }