Sorry, please skip this version. I am sending out a updated one.
-Wei On 10/07/2014 02:17 PM, Wei Huang wrote:
AMD CPU doesn't support hyperthreading. Even though QEMU fixes this issue by setting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX via conversion, it is better to stop end-users in the first place with a warning message. Signed-off-by: Wei Huang <w...@redhat.com> --- target-i386/cpu.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index e7bf9de..01bbcaf 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2742,6 +2742,24 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) mce_init(cpu); qemu_init_vcpu(cs); + /* AMD CPU doesn't support hyperthreading. Even though QEMU does fix + * this issue by setting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX + * correctly, it is still better to stop end-users in the first place + * by giving out a warning message. + * + * NOTE: cs->nr_threads is initialized in qemu_init_vcpu(). So the + * following code has to follow qemu_init_vcpu(). + */ + if (env->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && + env->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && + env->cpuid_vendor3 == CPUID_VENDOR_AMD_3 && + (cs->nr_threads > 1)) { + error_setg(&local_err, + "AMD CPU doesn't support hyperthreading. Please configure " + "-smp options correctly."); + goto out; + } + x86_cpu_apic_realize(cpu, &local_err); if (local_err != NULL) { goto out;