106 lines
3.9 KiB
Diff
106 lines
3.9 KiB
Diff
From c45bc21b4c191ceb2523bfeac4ff2eb042469d89 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Fri, 18 Jul 2025 18:03:47 +0200
|
|
Subject: [PATCH 062/115] i386/cpu: Introduce enable_cpuid_0x1f to force
|
|
exposing CPUID 0x1f
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
|
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
|
RH-Acked-by: Yash Mankad <None>
|
|
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
|
RH-Commit: [62/115] 046ef898225f70d84fbcf20266aff8478c6fb428 (bonzini/rhel-qemu-kvm)
|
|
|
|
Currently, QEMU exposes CPUID 0x1f to guest only when necessary, i.e.,
|
|
when topology level that cannot be enumerated by leaf 0xB, e.g., die or
|
|
module level, are configured for the guest, e.g., -smp xx,dies=2.
|
|
|
|
However, TDX architecture forces to require CPUID 0x1f to configure CPU
|
|
topology.
|
|
|
|
Introduce a bool flag, enable_cpuid_0x1f, in CPU for the case that
|
|
requires CPUID leaf 0x1f to be exposed to guest.
|
|
|
|
Introduce a new function x86_has_cpuid_0x1f(), which is the wrapper of
|
|
cpu->enable_cpuid_0x1f and x86_has_extended_topo() to check if it needs
|
|
to enable cpuid leaf 0x1f for the guest.
|
|
|
|
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
|
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
|
Link: https://lore.kernel.org/r/20250508150002.689633-34-xiaoyao.li@intel.com
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit ab8bd85adf75900edc2764d0ebe8b53867cc54aa)
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
target/i386/cpu.c | 4 ++--
|
|
target/i386/cpu.h | 9 +++++++++
|
|
target/i386/kvm/kvm.c | 2 +-
|
|
3 files changed, 12 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|
index ee6f1c0627..ab34626b19 100644
|
|
--- a/target/i386/cpu.c
|
|
+++ b/target/i386/cpu.c
|
|
@@ -7177,7 +7177,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
|
break;
|
|
case 0x1F:
|
|
/* V2 Extended Topology Enumeration Leaf */
|
|
- if (!x86_has_extended_topo(env->avail_cpu_topo)) {
|
|
+ if (!x86_has_cpuid_0x1f(cpu)) {
|
|
*eax = *ebx = *ecx = *edx = 0;
|
|
break;
|
|
}
|
|
@@ -8035,7 +8035,7 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
|
* cpu->vendor_cpuid_only has been unset for compatibility with older
|
|
* machine types.
|
|
*/
|
|
- if (x86_has_extended_topo(env->avail_cpu_topo) &&
|
|
+ if (x86_has_cpuid_0x1f(cpu) &&
|
|
(IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
|
|
x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
|
|
}
|
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|
index ee1a1b6622..83fa89bf0a 100644
|
|
--- a/target/i386/cpu.h
|
|
+++ b/target/i386/cpu.h
|
|
@@ -2168,6 +2168,9 @@ struct ArchCPU {
|
|
/* Compatibility bits for old machine types: */
|
|
bool enable_cpuid_0xb;
|
|
|
|
+ /* Force to enable cpuid 0x1f */
|
|
+ bool enable_cpuid_0x1f;
|
|
+
|
|
/* Enable auto level-increase for all CPUID leaves */
|
|
bool full_cpuid_auto_level;
|
|
|
|
@@ -2429,6 +2432,12 @@ void host_cpuid(uint32_t function, uint32_t count,
|
|
uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx);
|
|
bool cpu_has_x2apic_feature(CPUX86State *env);
|
|
|
|
+static inline bool x86_has_cpuid_0x1f(X86CPU *cpu)
|
|
+{
|
|
+ return cpu->enable_cpuid_0x1f ||
|
|
+ x86_has_extended_topo(cpu->env.avail_cpu_topo);
|
|
+}
|
|
+
|
|
/* helper.c */
|
|
void x86_cpu_set_a20(X86CPU *cpu, int a20_state);
|
|
void cpu_sync_avx_hflag(CPUX86State *env);
|
|
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
|
index 4bda4f5525..f4809ee004 100644
|
|
--- a/target/i386/kvm/kvm.c
|
|
+++ b/target/i386/kvm/kvm.c
|
|
@@ -1861,7 +1861,7 @@ uint32_t kvm_x86_build_cpuid(CPUX86State *env, struct kvm_cpuid_entry2 *entries,
|
|
break;
|
|
}
|
|
case 0x1f:
|
|
- if (!x86_has_extended_topo(env->avail_cpu_topo)) {
|
|
+ if (!x86_has_cpuid_0x1f(env_archcpu(env))) {
|
|
cpuid_i--;
|
|
break;
|
|
}
|
|
--
|
|
2.50.1
|
|
|