target/i386/cpu.c | 7 ++++++- target/i386/kvm/kvm.c | 1 + 2 files changed, 7 insertions(+), 1 deletion(-)
The AMD APM states that if CPUID 0x80000001.ECX[TopologyExtensions] = 0,
then CPUID 0x8000001D and 0x8000001E are reserved. To comply with this,
ensure that EAX, EBX, ECX, and EDX for the two leaves return zero when
CPUID_EXT3_TOPOEXT is not enabled.
To test, launch a VM with CPUID_EXT3_TOPOEXT disabled using "-cpu host" or
"-cpu EPYC-Genoa,-topoext" on a Zen-based machine.
Signed-off-by: Wei Wang <wei.w.wang@hotmail.com>
---
target/i386/cpu.c | 7 ++++++-
target/i386/kvm/kvm.c | 1 +
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 6417775786..437da88b4a 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -8489,6 +8489,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
break;
case 0x8000001D:
*eax = 0;
+ /* 0x8000001D leaf is reserved if CPUID_EXT3_TOPOEXT is not set */
+ if (!(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT)) {
+ break;
+ }
if (cpu->cache_info_passthrough) {
x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
break;
@@ -8519,7 +8523,8 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
}
break;
case 0x8000001E:
- if (cpu->core_id <= 255) {
+ if ((env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
+ cpu->core_id <= 255) {
encode_topo_cpuid8000001e(cpu, topo_info, eax, ebx, ecx, edx);
} else {
*eax = 0;
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 60c7981138..c988358548 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -2029,6 +2029,7 @@ uint32_t kvm_x86_build_cpuid(CPUX86State *env, struct kvm_cpuid_entry2 *entries,
cpu_x86_cpuid(env, i, j, &c->eax, &c->ebx, &c->ecx, &c->edx);
if (c->eax == 0) {
+ cpuid_i--;
break;
}
if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
--
2.51.0
On 1/6/26 3:19 AM, Wei Wang wrote:
> The AMD APM states that if CPUID 0x80000001.ECX[TopologyExtensions] = 0,
> then CPUID 0x8000001D and 0x8000001E are reserved. To comply with this,
> ensure that EAX, EBX, ECX, and EDX for the two leaves return zero when
> CPUID_EXT3_TOPOEXT is not enabled.
>
> To test, launch a VM with CPUID_EXT3_TOPOEXT disabled using "-cpu host" or
> "-cpu EPYC-Genoa,-topoext" on a Zen-based machine.
>
> Signed-off-by: Wei Wang <wei.w.wang@hotmail.com>
> ---
> target/i386/cpu.c | 7 ++++++-
> target/i386/kvm/kvm.c | 1 +
> 2 files changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index 6417775786..437da88b4a 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -8489,6 +8489,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> break;
> case 0x8000001D:
> *eax = 0;
> + /* 0x8000001D leaf is reserved if CPUID_EXT3_TOPOEXT is not set */
> + if (!(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT)) {
> + break;
> + }
> if (cpu->cache_info_passthrough) {
> x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
> break;
> @@ -8519,7 +8523,8 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> }
> break;
> case 0x8000001E:
> - if (cpu->core_id <= 255) {
> + if ((env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
> + cpu->core_id <= 255) {
> encode_topo_cpuid8000001e(cpu, topo_info, eax, ebx, ecx, edx);
> } else {
> *eax = 0;
> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
> index 60c7981138..c988358548 100644
> --- a/target/i386/kvm/kvm.c
> +++ b/target/i386/kvm/kvm.c
> @@ -2029,6 +2029,7 @@ uint32_t kvm_x86_build_cpuid(CPUX86State *env, struct kvm_cpuid_entry2 *entries,
> cpu_x86_cpuid(env, i, j, &c->eax, &c->ebx, &c->ecx, &c->edx);
>
> if (c->eax == 0) {
> + cpuid_i--;
> break;
> }
> if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
Gentle ping — any thoughts on this patch?
© 2016 - 2026 Red Hat, Inc.