On Wed, Jan 16, 2013 at 06:32:47AM +0100, Andreas Färber wrote: [...] > diff --git a/target-arm/helper.c b/target-arm/helper.c > index 37c34a1..f4553de 100644 > --- a/target-arm/helper.c > +++ b/target-arm/helper.c > @@ -1270,14 +1270,12 @@ ARMCPU *cpu_arm_init(const char *cpu_model) > cpu = ARM_CPU(object_new(cpu_model)); > env = &cpu->env; > env->cpu_model_str = cpu_model; > - arm_cpu_realize(cpu); > > if (tcg_enabled() && !inited) { > inited = 1; > arm_translate_init(); > } > > - cpu_reset(CPU(cpu)); > if (arm_feature(env, ARM_FEATURE_NEON)) { > gdb_register_coprocessor(env, vfp_gdb_get_reg, vfp_gdb_set_reg, > 51, "arm-neon.xml", 0);
Some arm_feature() checks here (e.g. ARM_FEATURE_VFP3) depend on set_feature() calls done by arm_cpu_realize[fn](). On the other hand, I won't be surprised if gdb_register_coprocessor() needs to be called before qemu_init_vcpu(). I also don't know if it is safe to call gdb_register_coprocessor() before cpu_reset(). Why not move all the code between the "arm_cpu_realize(cpu)" and "return cpu" lines to the realize function as-is, instead of moving only part of the code? If arm requires these steps to be run after creating a CPU, I consider all of them part of the CPU realization process. > @@ -1288,7 +1286,10 @@ ARMCPU *cpu_arm_init(const char *cpu_model) > gdb_register_coprocessor(env, vfp_gdb_get_reg, vfp_gdb_set_reg, > 19, "arm-vfp.xml", 0); > } > - qemu_init_vcpu(env); > + > + /* TODO this should be set centrally, once possible */ > + object_property_set_bool(OBJECT(cpu), true, "realized", NULL); > + > return cpu; > } > > -- > 1.7.10.4 > > -- Eduardo