83 lines
3.4 KiB
Diff
83 lines
3.4 KiB
Diff
From d3b9c1891a6d05308dd5ea119d2c32c8f98a25da Mon Sep 17 00:00:00 2001
|
|
From: Eduardo Habkost <ehabkost@redhat.com>
|
|
Date: Tue, 30 Jun 2020 23:40:15 -0400
|
|
Subject: [PATCH 1/4] i386: Mask SVM features if nested SVM is disabled
|
|
|
|
RH-Author: Eduardo Habkost <ehabkost@redhat.com>
|
|
Message-id: <20200630234015.166253-2-ehabkost@redhat.com>
|
|
Patchwork-id: 97852
|
|
O-Subject: [RHEL-8.3.0 qemu-kvm PATCH 1/1] i386: Mask SVM features if nested SVM is disabled
|
|
Bugzilla: 1835390
|
|
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
|
RH-Acked-by: Bandan Das <bsd@redhat.com>
|
|
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
|
QEMU incorrectly validates FEAT_SVM feature flags against
|
|
GET_SUPPORTED_CPUID even if SVM features are being masked out by
|
|
cpu_x86_cpuid(). This can make QEMU print warnings on most AMD
|
|
CPU models, even when SVM nesting is disabled (which is the
|
|
default).
|
|
|
|
This bug was never detected before because of a Linux KVM bug:
|
|
until Linux v5.6, KVM was not filtering out SVM features in
|
|
GET_SUPPORTED_CPUID when nested was disabled. This KVM bug was
|
|
fixed in Linux v5.7-rc1, on Linux commit a50718cc3f43 ("KVM:
|
|
nSVM: Expose SVM features to L1 iff nested is enabled").
|
|
|
|
Fix the problem by adding a CPUID_EXT3_SVM dependency to all
|
|
FEAT_SVM feature flags in the feature_dependencies table.
|
|
|
|
Reported-by: Yanan Fu <yfu@redhat.com>
|
|
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
Message-Id: <20200623230116.277409-1-ehabkost@redhat.com>
|
|
[Fix testcase. - Paolo]
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit 730319aef0fcb94f11a4a2d32656437fdde7efdd)
|
|
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
target/i386/cpu.c | 4 ++++
|
|
tests/test-x86-cpuid-compat.c | 4 ++--
|
|
2 files changed, 6 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|
index 7d7b016bb7..a343de0c9d 100644
|
|
--- a/target/i386/cpu.c
|
|
+++ b/target/i386/cpu.c
|
|
@@ -1477,6 +1477,10 @@ static FeatureDep feature_dependencies[] = {
|
|
.from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
|
|
.to = { FEAT_VMX_VMFUNC, ~0ull },
|
|
},
|
|
+ {
|
|
+ .from = { FEAT_8000_0001_ECX, CPUID_EXT3_SVM },
|
|
+ .to = { FEAT_SVM, ~0ull },
|
|
+ },
|
|
};
|
|
|
|
typedef struct X86RegisterInfo32 {
|
|
diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c
|
|
index e7c075ed98..983aa0719a 100644
|
|
--- a/tests/test-x86-cpuid-compat.c
|
|
+++ b/tests/test-x86-cpuid-compat.c
|
|
@@ -256,7 +256,7 @@ int main(int argc, char **argv)
|
|
"-cpu 486,+invtsc", "xlevel", 0x80000007);
|
|
/* CPUID[8000_000A].EDX: */
|
|
add_cpuid_test("x86/cpuid/auto-xlevel/486/npt",
|
|
- "-cpu 486,+npt", "xlevel", 0x8000000A);
|
|
+ "-cpu 486,+svm,+npt", "xlevel", 0x8000000A);
|
|
/* CPUID[C000_0001].EDX: */
|
|
add_cpuid_test("x86/cpuid/auto-xlevel2/phenom/xstore",
|
|
"-cpu phenom,+xstore", "xlevel2", 0xC0000001);
|
|
@@ -349,7 +349,7 @@ int main(int argc, char **argv)
|
|
"-machine pc-i440fx-2.4 -cpu SandyBridge,",
|
|
"xlevel", 0x80000008);
|
|
add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-on",
|
|
- "-machine pc-i440fx-2.4 -cpu SandyBridge,+npt",
|
|
+ "-machine pc-i440fx-2.4 -cpu SandyBridge,+svm,+npt",
|
|
"xlevel", 0x80000008);
|
|
#endif
|
|
|
|
--
|
|
2.27.0
|
|
|