From: Jim Shu <jim.shu@sifive.com>
Clearing IMSIC registers and qemu_irq in the reset function
Signed-off-by: Jim Shu <jim.shu@sifive.com>
Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
Message-ID: <20260428160103.3551125-4-jim.shu@sifive.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
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 7c9a012033..ac59496c22 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;
}
--
2.53.0