On Fri, Aug 21, 2020 at 10:33:06PM -0700, Alistair Francis wrote: > Reported-by: Eduardo Habkost <ehabk...@redhat.com> > Signed-off-by: Alistair Francis <alistair.fran...@wdc.com> > --- > hw/core/register.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/hw/core/register.c b/hw/core/register.c > index ddf91eb445..5e8e8199d0 100644 > --- a/hw/core/register.c > +++ b/hw/core/register.c > @@ -180,11 +180,7 @@ void register_init(RegisterInfo *reg) > { > assert(reg); > > - if (!reg->data || !reg->access) { > - return; > - } > > - object_initialize((void *)reg, sizeof(*reg), TYPE_REGISTER); > } > > void register_write_memory(void *opaque, hwaddr addr, > @@ -269,13 +265,20 @@ static RegisterInfoArray > *register_init_block(DeviceState *owner, > int index = rae[i].addr / data_size; > RegisterInfo *r = &ri[index]; > > + if (data + data_size * index == 0 || !&rae[i]) { > + continue; > + } > + > + /* Init the register, this will zero it. */ > + object_initialize((void *)r, sizeof(*r), TYPE_REGISTER); > + > + /* Set the properties of the register */ > *r = (RegisterInfo) { > .data = data + data_size * index, > .data_size = data_size, > .access = &rae[i], > .opaque = owner, > };
This doesn't look right. Won't this wipe out all DeviceState data in r->parent_obj? > - register_init(r); > > r_array->r[i] = r; > } > @@ -329,6 +332,7 @@ static const TypeInfo register_info = { > .name = TYPE_REGISTER, > .parent = TYPE_DEVICE, > .class_init = register_class_init, > + .instance_size = sizeof(RegisterInfo), > }; > > static void register_register_types(void) > -- > 2.28.0 > > -- Eduardo