Change the legacy reset function into the init phase and test the resetting flag in register accesses.
Signed-off-by: Damien Hedde <damien.he...@greensocs.com> --- hw/misc/zynq_slcr.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/hw/misc/zynq_slcr.c b/hw/misc/zynq_slcr.c index baa13d1316..47f43e1d8d 100644 --- a/hw/misc/zynq_slcr.c +++ b/hw/misc/zynq_slcr.c @@ -180,9 +180,9 @@ typedef struct ZynqSLCRState { uint32_t regs[ZYNQ_SLCR_NUM_REGS]; } ZynqSLCRState; -static void zynq_slcr_reset(DeviceState *d) +static void zynq_slcr_reset_init(Object *obj, bool cold) { - ZynqSLCRState *s = ZYNQ_SLCR(d); + ZynqSLCRState *s = ZYNQ_SLCR(obj); int i; DB_PRINT("RESET\n"); @@ -346,6 +346,10 @@ static uint64_t zynq_slcr_read(void *opaque, hwaddr offset, offset /= 4; uint32_t ret = s->regs[offset]; + if (qdev_is_resetting((DeviceState *) opaque)) { + return 0; + } + if (!zynq_slcr_check_offset(offset, true)) { qemu_log_mask(LOG_GUEST_ERROR, "zynq_slcr: Invalid read access to " " addr %" HWADDR_PRIx "\n", offset * 4); @@ -361,6 +365,10 @@ static void zynq_slcr_write(void *opaque, hwaddr offset, ZynqSLCRState *s = (ZynqSLCRState *)opaque; offset /= 4; + if (qdev_is_resetting((DeviceState *) opaque)) { + return; + } + DB_PRINT("addr: %08" HWADDR_PRIx " data: %08" PRIx64 "\n", offset * 4, val); if (!zynq_slcr_check_offset(offset, false)) { @@ -441,7 +449,7 @@ static void zynq_slcr_class_init(ObjectClass *klass, void *data) DeviceClass *dc = DEVICE_CLASS(klass); dc->vmsd = &vmstate_zynq_slcr; - dc->reset = zynq_slcr_reset; + dc->reset_phases.init = zynq_slcr_reset_init; } static const TypeInfo zynq_slcr_info = { -- 2.21.0