diff options
| -rw-r--r-- | target/i386/cpu.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 3b7c22e5d3..12e719e995 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -7871,7 +7871,17 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, } *edx = env->features[FEAT_1_EDX]; if (threads_per_pkg > 1) { - *ebx |= threads_per_pkg << 16; + /* + * For CPUID.01H.EBX[Bits 23-16], AMD requires logical processor + * count, but Intel needs maximum number of addressable IDs for + * logical processors per package. + */ + if (cpu->vendor_cpuid_only_v2 && + (IS_INTEL_CPU(env) || IS_ZHAOXIN_CPU(env))) { + *ebx |= 1 << apicid_pkg_offset(topo_info) << 16; + } else { + *ebx |= threads_per_pkg << 16; + } } break; case 2: { /* cache info: needed for Pentium Pro compatibility */ |