0283-x86-kvm-add-MSR_IA32_SPEC_CTRL-and-MSR_IA32_PRED_CMD.patch 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Wei Wang <[email protected]>
  3. Date: Tue, 7 Nov 2017 16:47:53 +0800
  4. Subject: [PATCH] x86/kvm: add MSR_IA32_SPEC_CTRL and MSR_IA32_PRED_CMD to kvm
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. CVE-2017-5753
  9. CVE-2017-5715
  10. Add field to access guest MSR_IA332_SPEC_CTRL and MSR_IA32_PRED_CMD state.
  11. Signed-off-by: Wei Wang <[email protected]>
  12. Signed-off-by: Tim Chen <[email protected]>
  13. Signed-off-by: Andy Whitcroft <[email protected]>
  14. Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
  15. (cherry picked from commit 15eb187f47ee2be44d34313bc89cfb719d82cb21)
  16. Signed-off-by: Fabian Grünbichler <[email protected]>
  17. ---
  18. arch/x86/include/asm/kvm_host.h | 2 ++
  19. arch/x86/kvm/vmx.c | 10 ++++++++++
  20. arch/x86/kvm/x86.c | 2 +-
  21. 3 files changed, 13 insertions(+), 1 deletion(-)
  22. diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
  23. index b69af3df978a..1953c0a5b972 100644
  24. --- a/arch/x86/include/asm/kvm_host.h
  25. +++ b/arch/x86/include/asm/kvm_host.h
  26. @@ -628,6 +628,8 @@ struct kvm_vcpu_arch {
  27. u64 mcg_ext_ctl;
  28. u64 *mce_banks;
  29. + u64 spec_ctrl;
  30. +
  31. /* Cache MMIO info */
  32. u64 mmio_gva;
  33. unsigned access;
  34. diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
  35. index 9b4256fd589a..daff9962c90a 100644
  36. --- a/arch/x86/kvm/vmx.c
  37. +++ b/arch/x86/kvm/vmx.c
  38. @@ -50,6 +50,7 @@
  39. #include <asm/apic.h>
  40. #include <asm/irq_remapping.h>
  41. #include <asm/mmu_context.h>
  42. +#include <asm/microcode.h>
  43. #include "trace.h"
  44. #include "pmu.h"
  45. @@ -3247,6 +3248,9 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
  46. case MSR_IA32_TSC:
  47. msr_info->data = guest_read_tsc(vcpu);
  48. break;
  49. + case MSR_IA32_SPEC_CTRL:
  50. + msr_info->data = vcpu->arch.spec_ctrl;
  51. + break;
  52. case MSR_IA32_SYSENTER_CS:
  53. msr_info->data = vmcs_read32(GUEST_SYSENTER_CS);
  54. break;
  55. @@ -3351,6 +3355,9 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
  56. case MSR_IA32_TSC:
  57. kvm_write_tsc(vcpu, msr_info);
  58. break;
  59. + case MSR_IA32_SPEC_CTRL:
  60. + vcpu->arch.spec_ctrl = msr_info->data;
  61. + break;
  62. case MSR_IA32_CR_PAT:
  63. if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
  64. if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
  65. @@ -6146,6 +6153,7 @@ static int handle_rdmsr(struct kvm_vcpu *vcpu)
  66. msr_info.index = ecx;
  67. msr_info.host_initiated = false;
  68. +
  69. if (vmx_get_msr(vcpu, &msr_info)) {
  70. trace_kvm_msr_read_ex(ecx);
  71. kvm_inject_gp(vcpu, 0);
  72. @@ -6699,6 +6707,8 @@ static __init int hardware_setup(void)
  73. vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false);
  74. vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false);
  75. vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false);
  76. + vmx_disable_intercept_for_msr(MSR_IA32_SPEC_CTRL, false);
  77. + vmx_disable_intercept_for_msr(MSR_IA32_PRED_CMD, false);
  78. memcpy(vmx_msr_bitmap_legacy_x2apic_apicv,
  79. vmx_msr_bitmap_legacy, PAGE_SIZE);
  80. diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
  81. index 703cd4171921..eae4aecf3cfe 100644
  82. --- a/arch/x86/kvm/x86.c
  83. +++ b/arch/x86/kvm/x86.c
  84. @@ -983,7 +983,7 @@ static u32 msrs_to_save[] = {
  85. MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR,
  86. #endif
  87. MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA,
  88. - MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX,
  89. + MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX, MSR_IA32_SPEC_CTRL,
  90. };
  91. static unsigned num_msrs_to_save;
  92. --
  93. 2.14.2