On 4/28/2026 1:01 PM, Jim Shu wrote:
Clearing IMSIC registers and qemu_irq in the reset function

Signed-off-by: Jim Shu <[email protected]>
---

Reviewed-by: Daniel Henrique Barboza <[email protected]>

  hw/intc/riscv_imsic.c | 19 +++++++++++++++++++
  1 file changed, 19 insertions(+)

diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c
index 7c9a0120335..ac59496c22b 100644
--- a/hw/intc/riscv_imsic.c
+++ b/hw/intc/riscv_imsic.c
@@ -342,6 +342,23 @@ static const MemoryRegionOps riscv_imsic_ops = {
      }
  };
+static void riscv_imsic_reset_enter(Object *obj, ResetType type)
+{
+    RISCVIMSICState *imsic = RISCV_IMSIC(obj);
+    int i;
+
+    memset(imsic->eidelivery, 0, sizeof(uint32_t) * imsic->num_pages);
+    memset(imsic->eithreshold, 0, sizeof(uint32_t) * imsic->num_pages);
+
+    for (i = 0; i < imsic->num_eistate; i++) {
+        imsic->eistate[i] &= ~IMSIC_EISTATE_ENABLED;
+    }
+
+    for (i = 0; i < imsic->num_pages; i++) {
+        qemu_irq_lower(imsic->external_irqs[i]);
+    }
+}
+
  static void riscv_imsic_realize(DeviceState *dev, Error **errp)
  {
      RISCVIMSICState *imsic = RISCV_IMSIC(dev);
@@ -425,9 +442,11 @@ static const VMStateDescription vmstate_riscv_imsic = {
  static void riscv_imsic_class_init(ObjectClass *klass, const void *data)
  {
      DeviceClass *dc = DEVICE_CLASS(klass);
+    ResettableClass *rc = RESETTABLE_CLASS(klass);
device_class_set_props(dc, riscv_imsic_properties);
      dc->realize = riscv_imsic_realize;
+    rc->phases.enter = riscv_imsic_reset_enter;
      dc->vmsd = &vmstate_riscv_imsic;
  }


Reply via email to