For this is a logical device which is not attached to system bus, we cannot use DeviceClass->reset interface directly. Instead we register our own reset callback to reset SDEI services when system resets. Signed-off-by: Heyi Guo <guoheyi@xxxxxxxxxx> Signed-off-by: Jingyi Wang <wangjingyi11@xxxxxxxxxx> Cc: Peter Maydell <peter.maydell@xxxxxxxxxx> Cc: Dave Martin <Dave.Martin@xxxxxxx> Cc: Marc Zyngier <marc.zyngier@xxxxxxx> Cc: Mark Rutland <mark.rutland@xxxxxxx> Cc: James Morse <james.morse@xxxxxxx> --- target/arm/sdei.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/target/arm/sdei.c b/target/arm/sdei.c index b40fa36..f9a1208 100644 --- a/target/arm/sdei.c +++ b/target/arm/sdei.c @@ -1083,6 +1083,26 @@ static void qemu_sde_init(QemuSDEState *s) qemu_private_sde_init(s); } +static void qemu_sde_reset(void *opaque) +{ + int64_t ret; + CPUState *cs; + QemuSDEState *s = opaque; + + CPU_FOREACH(cs) { + QemuSDECpu *sde_cpu = get_sde_cpu(s, cs); + sdei_private_reset_common(s, cs, true); + sde_cpu->masked = true; + sde_cpu->critical_running_event = SDEI_INVALID_EVENT_ID; + sde_cpu->normal_running_event = SDEI_INVALID_EVENT_ID; + } + + ret = sdei_shared_reset_common(s, first_cpu, true); + if (ret) { + error_report("SDEI system reset failed: 0x%lx", ret); + } +} + static int qemu_sdei_pre_save(void *opaque) { QemuSDEState *s = opaque; @@ -1235,6 +1255,7 @@ static void sdei_initfn(Object *obj) sde_state = s; qemu_sde_init(s); + qemu_register_reset(qemu_sde_reset, s); } static void qemu_sde_class_init(ObjectClass *klass, void *data) -- 1.8.3.1 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm