]>
Commit | Line | Data |
---|---|---|
035dbe67 FG |
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 |