109 lines
4.2 KiB
Diff
109 lines
4.2 KiB
Diff
|
|
From bd6fec2cb2bb811aa73a2a6e6da45c76ecded49c Mon Sep 17 00:00:00 2001
|
||
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
|
Date: Thu, 27 Jun 2024 01:12:42 +0200
|
||
|
|
Subject: [PATCH] target/i386: pass X86CPU to
|
||
|
|
x86_cpu_get_supported_feature_word
|
||
|
|
|
||
|
|
commit 8dee38483274bd0fcf3f74dea024d719b958200d upstream.
|
||
|
|
|
||
|
|
This allows modifying the bits in "-cpu max"/"-cpu host" depending on
|
||
|
|
the guest CPU vendor (which, at least by default, is the host vendor in
|
||
|
|
the case of KVM).
|
||
|
|
|
||
|
|
For example, machine check architecture differs between Intel and AMD,
|
||
|
|
and bits from AMD should be dropped when configuring the guest for
|
||
|
|
an Intel model.
|
||
|
|
|
||
|
|
Intel-SIG: commit 8dee38483274 target/i386: pass X86CPU to x86_cpu_get_supported_feature_word
|
||
|
|
|
||
|
|
Cc: Xiaoyao Li <xiaoyao.li@intel.com>
|
||
|
|
Cc: John Allen <john.allen@amd.com>
|
||
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
||
|
|
---
|
||
|
|
target/i386/cpu.c | 11 +++++------
|
||
|
|
target/i386/cpu.h | 3 +--
|
||
|
|
target/i386/kvm/kvm-cpu.c | 2 +-
|
||
|
|
3 files changed, 7 insertions(+), 9 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
||
|
|
index f80570f4da..dfc0f7fd2d 100644
|
||
|
|
--- a/target/i386/cpu.c
|
||
|
|
+++ b/target/i386/cpu.c
|
||
|
|
@@ -5959,8 +5959,7 @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
|
||
|
|
|
||
|
|
#endif /* !CONFIG_USER_ONLY */
|
||
|
|
|
||
|
|
-uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||
|
|
- bool migratable_only)
|
||
|
|
+uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
|
||
|
|
{
|
||
|
|
FeatureWordInfo *wi = &feature_word_info[w];
|
||
|
|
uint64_t r = 0;
|
||
|
|
@@ -6002,7 +6001,7 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||
|
|
r &= ~unavail;
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
- if (migratable_only) {
|
||
|
|
+ if (cpu && cpu->migratable) {
|
||
|
|
r &= x86_cpu_get_migratable_flags(w);
|
||
|
|
}
|
||
|
|
return r;
|
||
|
|
@@ -7324,7 +7323,7 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||
|
|
* by the user.
|
||
|
|
*/
|
||
|
|
env->features[w] |=
|
||
|
|
- x86_cpu_get_supported_feature_word(w, cpu->migratable) &
|
||
|
|
+ x86_cpu_get_supported_feature_word(cpu, w) &
|
||
|
|
~env->user_features[w] &
|
||
|
|
~feature_word_info[w].no_autoenable_flags;
|
||
|
|
}
|
||
|
|
@@ -7450,7 +7449,7 @@ static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
|
||
|
|
|
||
|
|
for (w = 0; w < FEATURE_WORDS; w++) {
|
||
|
|
uint64_t host_feat =
|
||
|
|
- x86_cpu_get_supported_feature_word(w, false);
|
||
|
|
+ x86_cpu_get_supported_feature_word(NULL, w);
|
||
|
|
uint64_t requested_features = env->features[w];
|
||
|
|
uint64_t unavailable_features = requested_features & ~host_feat;
|
||
|
|
mark_unavailable_features(cpu, w, unavailable_features, prefix);
|
||
|
|
@@ -7566,7 +7565,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
||
|
|
env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
|
||
|
|
if (requested_lbr_fmt && kvm_enabled()) {
|
||
|
|
uint64_t host_perf_cap =
|
||
|
|
- x86_cpu_get_supported_feature_word(FEAT_PERF_CAPABILITIES, false);
|
||
|
|
+ x86_cpu_get_supported_feature_word(NULL, FEAT_PERF_CAPABILITIES);
|
||
|
|
unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
|
||
|
|
|
||
|
|
if (!cpu->enable_pmu) {
|
||
|
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||
|
|
index fb6721f182..b90182582f 100644
|
||
|
|
--- a/target/i386/cpu.h
|
||
|
|
+++ b/target/i386/cpu.h
|
||
|
|
@@ -655,8 +655,7 @@ typedef enum FeatureWord {
|
||
|
|
} FeatureWord;
|
||
|
|
|
||
|
|
typedef uint64_t FeatureWordArray[FEATURE_WORDS];
|
||
|
|
-uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||
|
|
- bool migratable_only);
|
||
|
|
+uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||
|
|
|
||
|
|
/* cpuid_features bits */
|
||
|
|
#define CPUID_FP87 (1U << 0)
|
||
|
|
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
|
||
|
|
index f76972e47e..a3bc8d8f83 100644
|
||
|
|
--- a/target/i386/kvm/kvm-cpu.c
|
||
|
|
+++ b/target/i386/kvm/kvm-cpu.c
|
||
|
|
@@ -137,7 +137,7 @@ static void kvm_cpu_xsave_init(void)
|
||
|
|
if (!esa->size) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
- if ((x86_cpu_get_supported_feature_word(esa->feature, false) & esa->bits)
|
||
|
|
+ if ((x86_cpu_get_supported_feature_word(NULL, esa->feature) & esa->bits)
|
||
|
|
!= esa->bits) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|