]> git.proxmox.com Git - pve-kernel.git/blob - patches/kernel/0296-KVM-x86-Add-speculative-control-CPUID-support-for-gu.patch
8537b7c6e816e0295a450cd6485317dd8c414e68
[pve-kernel.git] / patches / kernel / 0296-KVM-x86-Add-speculative-control-CPUID-support-for-gu.patch
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Tom Lendacky <thomas.lendacky@amd.com>
3 Date: Wed, 20 Dec 2017 10:55:47 +0000
4 Subject: [PATCH] KVM: x86: Add speculative control CPUID support for guests
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 CVE-2017-5753
10 CVE-2017-5715
11
12 Provide the guest with the speculative control CPUID related values.
13
14 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
15 Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
16 Signed-off-by: Andy Whitcroft <apw@canonical.com>
17 Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
18 (cherry picked from commit db7641e5f41cd517c4181ce90c4f9ecc93af4b2b)
19 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
20 ---
21 arch/x86/kvm/cpuid.c | 12 ++++++++++--
22 1 file changed, 10 insertions(+), 2 deletions(-)
23
24 diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
25 index 19adbb418443..f64502d21a89 100644
26 --- a/arch/x86/kvm/cpuid.c
27 +++ b/arch/x86/kvm/cpuid.c
28 @@ -70,6 +70,7 @@ u64 kvm_supported_xcr0(void)
29 /* These are scattered features in cpufeatures.h. */
30 #define KVM_CPUID_BIT_AVX512_4VNNIW 2
31 #define KVM_CPUID_BIT_AVX512_4FMAPS 3
32 +#define KVM_CPUID_BIT_SPEC_CTRL 26
33 #define KF(x) bit(KVM_CPUID_BIT_##x)
34
35 int kvm_update_cpuid(struct kvm_vcpu *vcpu)
36 @@ -387,7 +388,12 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
37
38 /* cpuid 7.0.edx*/
39 const u32 kvm_cpuid_7_0_edx_x86_features =
40 - KF(AVX512_4VNNIW) | KF(AVX512_4FMAPS);
41 + KF(AVX512_4VNNIW) | KF(AVX512_4FMAPS) |
42 + KF(SPEC_CTRL);
43 +
44 + /* cpuid 0x80000008.0.ebx */
45 + const u32 kvm_cpuid_80000008_0_ebx_x86_features =
46 + F(IBPB);
47
48 /* all calls to cpuid_count() should be made on the same cpu */
49 get_cpu();
50 @@ -622,7 +628,9 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
51 if (!g_phys_as)
52 g_phys_as = phys_as;
53 entry->eax = g_phys_as | (virt_as << 8);
54 - entry->ebx = entry->edx = 0;
55 + entry->ebx &= kvm_cpuid_80000008_0_ebx_x86_features;
56 + cpuid_mask(&entry->ebx, CPUID_8000_0008_EBX);
57 + entry->edx = 0;
58 break;
59 }
60 case 0x80000019:
61 --
62 2.14.2
63