@samitouri / QOSamiQemu / commits / 766391483b

hw/intc: riscv_imsic: Add reset API to IMSIC

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>

Jim Shu committed Apr 29, 2026 at 00:01 UTC 766391483bdccb66e392e71769bc85839569857d
1 file changed +19
hw/intc/riscv_imsic.c
+19
@@ -342,6 +342,23 @@ static const MemoryRegionOps riscv_imsic_ops = {
342 }
343 };
344
345 +static void riscv_imsic_reset_enter(Object *obj, ResetType type)
346 +{
347 + RISCVIMSICState *imsic = RISCV_IMSIC(obj);
348 + int i;
349 +
350 + memset(imsic->eidelivery, 0, sizeof(uint32_t) * imsic->num_pages);
351 + memset(imsic->eithreshold, 0, sizeof(uint32_t) * imsic->num_pages);
352 +
353 + for (i = 0; i < imsic->num_eistate; i++) {
354 + imsic->eistate[i] &= ~IMSIC_EISTATE_ENABLED;
355 + }
356 +
357 + for (i = 0; i < imsic->num_pages; i++) {
358 + qemu_irq_lower(imsic->external_irqs[i]);
359 + }
360 +}
361 +
362 static void riscv_imsic_realize(DeviceState *dev, Error **errp)
363 {
364 RISCVIMSICState *imsic = RISCV_IMSIC(dev);
@@ -425,9 +442,11 @@ static const VMStateDescription vmstate_riscv_imsic = {
442 static void riscv_imsic_class_init(ObjectClass *klass, const void *data)
443 {
444 DeviceClass *dc = DEVICE_CLASS(klass);
445 + ResettableClass *rc = RESETTABLE_CLASS(klass);
446
447 device_class_set_props(dc, riscv_imsic_properties);
448 dc->realize = riscv_imsic_realize;
449 + rc->phases.enter = riscv_imsic_reset_enter;
450 dc->vmsd = &vmstate_riscv_imsic;
451 }
452