i386/cpu: Hoist check of CPUID_EXT3_TOPOEXT against threads_per_core
Now it changes to use env->topo_info.threads_per_core and doesn't depend on qemu_init_vcpu() anymore. Put it together with other feature checks before qemu_init_vcpu() Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> Link: https://lore.kernel.org/r/20241219110125.1266461-8-xiaoyao.li@intel.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
84b71a131c
commit
473d79b56a
@ -7883,6 +7883,21 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
|||||||
*/
|
*/
|
||||||
cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
|
cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
|
||||||
|
* fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
|
||||||
|
* based on inputs (sockets,cores,threads), it is still better to give
|
||||||
|
* users a warning.
|
||||||
|
*/
|
||||||
|
if (IS_AMD_CPU(env) &&
|
||||||
|
!(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
|
||||||
|
env->topo_info.threads_per_core > 1) {
|
||||||
|
warn_report_once("This family of AMD CPU doesn't support "
|
||||||
|
"hyperthreading(%d). Please configure -smp "
|
||||||
|
"options properly or try enabling topoext "
|
||||||
|
"feature.", env->topo_info.threads_per_core);
|
||||||
|
}
|
||||||
|
|
||||||
/* For 64bit systems think about the number of physical bits to present.
|
/* For 64bit systems think about the number of physical bits to present.
|
||||||
* ideally this should be the same as the host; anything other than matching
|
* ideally this should be the same as the host; anything other than matching
|
||||||
* the host can cause incorrect guest behaviour.
|
* the host can cause incorrect guest behaviour.
|
||||||
@ -7987,21 +8002,6 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
|||||||
x86_cpu_gdb_init(cs);
|
x86_cpu_gdb_init(cs);
|
||||||
qemu_init_vcpu(cs);
|
qemu_init_vcpu(cs);
|
||||||
|
|
||||||
/*
|
|
||||||
* Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
|
|
||||||
* fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
|
|
||||||
* based on inputs (sockets,cores,threads), it is still better to give
|
|
||||||
* users a warning.
|
|
||||||
*/
|
|
||||||
if (IS_AMD_CPU(env) &&
|
|
||||||
!(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
|
|
||||||
env->topo_info.threads_per_core > 1) {
|
|
||||||
warn_report_once("This family of AMD CPU doesn't support "
|
|
||||||
"hyperthreading(%d). Please configure -smp "
|
|
||||||
"options properly or try enabling topoext "
|
|
||||||
"feature.", env->topo_info.threads_per_core);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
x86_cpu_apic_realize(cpu, &local_err);
|
x86_cpu_apic_realize(cpu, &local_err);
|
||||||
if (local_err != NULL) {
|
if (local_err != NULL) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user