On Mon, 17 Feb 2020 12:45:22 +0100 Philippe Mathieu-Daudé <f4...@amsat.org> wrote:
> Using class_data pointer to create a MachineClass is not > the recommended way anymore. The correct way is to open-code > the MachineClass::fields in the class_init() method. > > We can not use TYPE_RASPI_MACHINE::class_base_init() because > it is called *before* each machine class_init(), therefore the > board_rev field is not populated. We have to manually call > raspi_machine_class_common_init() for each machine. > > This partly reverts commit a03bde3674e. > > Suggested-by: Igor Mammedov <imamm...@redhat.com> > Reviewed-by: Richard Henderson <richard.hender...@linaro.org> > Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> Reviewed-by: Igor Mammedov <imamm...@redhat.com> > --- > hw/arm/raspi.c | 34 ++++++++++++++++++++++++---------- > 1 file changed, 24 insertions(+), 10 deletions(-) > > diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c > index 221356933e..1a8c135dc6 100644 > --- a/hw/arm/raspi.c > +++ b/hw/arm/raspi.c > @@ -309,13 +309,9 @@ static void raspi_machine_init(MachineState *machine) > setup_boot(machine, version, machine->ram_size - vcram_size); > } > > -static void raspi_machine_class_init(ObjectClass *oc, void *data) > +static void raspi_machine_class_common_init(MachineClass *mc, > + uint32_t board_rev) > { > - MachineClass *mc = MACHINE_CLASS(oc); > - RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc); > - uint32_t board_rev = (uint32_t)(uintptr_t)data; > - > - rmc->board_rev = board_rev; > mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev)); > mc->init = raspi_machine_init; > mc->block_default_type = IF_SD; > @@ -326,18 +322,36 @@ static void raspi_machine_class_init(ObjectClass *oc, > void *data) > mc->default_ram_size = board_ram_size(board_rev); > }; > > +static void raspi2b_machine_class_init(ObjectClass *oc, void *data) > +{ > + MachineClass *mc = MACHINE_CLASS(oc); > + RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc); > + > + rmc->board_rev = 0xa21041; > + raspi_machine_class_common_init(mc, rmc->board_rev); > +}; > + > +#ifdef TARGET_AARCH64 > +static void raspi3b_machine_class_init(ObjectClass *oc, void *data) > +{ > + MachineClass *mc = MACHINE_CLASS(oc); > + RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc); > + > + rmc->board_rev = 0xa02082; > + raspi_machine_class_common_init(mc, rmc->board_rev); > +}; > +#endif /* TARGET_AARCH64 */ > + > static const TypeInfo raspi_machine_types[] = { > { > .name = MACHINE_TYPE_NAME("raspi2"), > .parent = TYPE_RASPI_MACHINE, > - .class_init = raspi_machine_class_init, > - .class_data = (void *)0xa21041, > + .class_init = raspi2b_machine_class_init, > #ifdef TARGET_AARCH64 > }, { > .name = MACHINE_TYPE_NAME("raspi3"), > .parent = TYPE_RASPI_MACHINE, > - .class_init = raspi_machine_class_init, > - .class_data = (void *)0xa02082, > + .class_init = raspi3b_machine_class_init, > #endif > }, { > .name = TYPE_RASPI_MACHINE,