Currently cpu->nr_cores and cpu->nr_threads are initialized in qemu_init_vcpu(), which is called a bit late in *cpu_realizefn() for each ARCHes.
x86 arch would like to use nr_cores and nr_threads earlier in its realizefn(). To serve this purpose, initialize nr_cores and nr_threads in cpu_common_initfn(), which is earlier than *cpu_realizefn(). Signed-off-by: Xiaoyao Li <xiaoyao...@intel.com> --- hw/core/cpu-common.c | 10 +++++++++- system/cpus.c | 4 ---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c index 09c79035949b..6de92ed854bc 100644 --- a/hw/core/cpu-common.c +++ b/hw/core/cpu-common.c @@ -237,14 +237,22 @@ static void cpu_common_unrealizefn(DeviceState *dev) static void cpu_common_initfn(Object *obj) { CPUState *cpu = CPU(obj); + Object *machine = qdev_get_machine(); + MachineState *ms; gdb_init_cpu(cpu); cpu->cpu_index = UNASSIGNED_CPU_INDEX; cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX; /* user-mode doesn't have configurable SMP topology */ - /* the default value is changed by qemu_init_vcpu() for system-mode */ cpu->nr_cores = 1; cpu->nr_threads = 1; +#ifndef CONFIG_USER_ONLY + if (object_dynamic_cast(machine, TYPE_MACHINE)) { + ms = MACHINE(machine); + cpu->nr_cores = machine_topo_get_cores_per_socket(ms); + cpu->nr_threads = ms->smp.threads; + } +#endif cpu->cflags_next_tb = -1; /* allocate storage for thread info, initialise condition variables */ diff --git a/system/cpus.c b/system/cpus.c index 1c818ff6828c..c1547fbfd39b 100644 --- a/system/cpus.c +++ b/system/cpus.c @@ -664,10 +664,6 @@ const AccelOpsClass *cpus_get_accel(void) void qemu_init_vcpu(CPUState *cpu) { - MachineState *ms = MACHINE(qdev_get_machine()); - - cpu->nr_cores = machine_topo_get_cores_per_socket(ms); - cpu->nr_threads = ms->smp.threads; cpu->stopped = true; cpu->random_seed = qemu_guest_random_seed_thread_part1(); -- 2.34.1