On 8/18/20 1:03 PM, Philippe Mathieu-Daudé wrote: > 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));
Well this is simply: if (!qdev_realize_and_unref(DEVICE(cpu), NULL, errp)) { > >> 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); >>> >