On 8/18/20 9:26 AM, Philippe Mathieu-Daudé wrote: > On 8/18/20 5:33 AM, Thiago Jung Bauermann wrote: >> Instead of setting CPUState::halted to 1 in main_cpu_reset(), use the >> start-powered-off property which makes cpu_common_reset() initialize it >> to 1 in common code. >> >> Also change creation of CPU object from cpu_create() to object_new() and >> qdev_realize() because cpu_create() realizes the CPU and it's not possible to >> set a property after the object is realized. >> >> Signed-off-by: Thiago Jung Bauermann <bauer...@linux.ibm.com> >> --- >> hw/mips/cps.c | 16 ++++++++++++---- >> 1 file changed, 12 insertions(+), 4 deletions(-) >> >> diff --git a/hw/mips/cps.c b/hw/mips/cps.c >> index 615e1a1ad2..be85357dc0 100644 >> --- a/hw/mips/cps.c >> +++ b/hw/mips/cps.c >> @@ -52,9 +52,6 @@ static void main_cpu_reset(void *opaque) >> CPUState *cs = CPU(cpu); >> >> cpu_reset(cs); >> - >> - /* All VPs are halted on reset. Leave powering up to CPC. */ >> - cs->halted = 1; >> } >> >> static bool cpu_mips_itu_supported(CPUMIPSState *env) >> @@ -76,7 +73,9 @@ static void mips_cps_realize(DeviceState *dev, Error >> **errp) >> bool saar_present = false; >> >> for (i = 0; i < s->num_vp; i++) { >> - cpu = MIPS_CPU(cpu_create(s->cpu_type)); >> + Error *err = NULL; >> + >> + cpu = MIPS_CPU(object_new(s->cpu_type)); >> >> /* Init internal devices */ >> cpu_mips_irq_init_cpu(cpu); >> @@ -89,7 +88,16 @@ static void mips_cps_realize(DeviceState *dev, Error >> **errp) >> env->itc_tag = mips_itu_get_tag_region(&s->itu); >> env->itu = &s->itu; >> } >> + /* All VPs are halted on reset. Leave powering up to CPC. */ >> + object_property_set_bool(OBJECT(cpu), "start-powered-off", true, >> + &error_abort); >> qemu_register_reset(main_cpu_reset, cpu); >> + >> + if (!qdev_realize(DEVICE(cpu), NULL, &err)) { >> + error_report_err(err); >> + object_unref(OBJECT(cpu)); >> + exit(EXIT_FAILURE); >> + } > > Here errp is available, so we can propagate the error to the caller: > > if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
Igor corrected me in the previous patch, to avoid leaking the reference this snippet misses: object_unref(OBJECT(cpu)); > return; > } > > For example in hw/mips/boston.c: > > object_initialize_child(OBJECT(machine), "cps", &s->cps, TYPE_MIPS_CPS); > object_property_set_str(OBJECT(&s->cps), "cpu-type", machine->cpu_type, > &error_fatal); > object_property_set_int(OBJECT(&s->cps), "num-vp", machine->smp.cpus, > &error_fatal); > sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal); > > This will be propagated here ---------------^^^^^^^^^^^^^ > >> } >> >> cpu = MIPS_CPU(first_cpu); >>