0283-x86-kvm-Pad-RSB-on-VM-transition.patch 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Tim Chen <[email protected]>
  3. Date: Fri, 20 Oct 2017 17:05:54 -0700
  4. Subject: [PATCH] x86/kvm: Pad RSB on VM transition
  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 code to pad the local CPU's RSB entries to protect
  11. from previous less privilege mode.
  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 5369368d3520addb2ffb2413cfa7e8f3efe2e31d)
  16. Signed-off-by: Fabian Grünbichler <[email protected]>
  17. ---
  18. arch/x86/include/asm/kvm_host.h | 103 ++++++++++++++++++++++++++++++++++++++++
  19. arch/x86/kvm/vmx.c | 2 +
  20. 2 files changed, 105 insertions(+)
  21. diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
  22. index 1953c0a5b972..4117a97228a2 100644
  23. --- a/arch/x86/include/asm/kvm_host.h
  24. +++ b/arch/x86/include/asm/kvm_host.h
  25. @@ -125,6 +125,109 @@ static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level)
  26. #define ASYNC_PF_PER_VCPU 64
  27. +static inline void stuff_RSB(void)
  28. +{
  29. + __asm__ __volatile__(" \n\
  30. + call .label1 \n\
  31. + pause \n\
  32. +.label1: \n\
  33. + call .label2 \n\
  34. + pause \n\
  35. +.label2: \n\
  36. + call .label3 \n\
  37. + pause \n\
  38. +.label3: \n\
  39. + call .label4 \n\
  40. + pause \n\
  41. +.label4: \n\
  42. + call .label5 \n\
  43. + pause \n\
  44. +.label5: \n\
  45. + call .label6 \n\
  46. + pause \n\
  47. +.label6: \n\
  48. + call .label7 \n\
  49. + pause \n\
  50. +.label7: \n\
  51. + call .label8 \n\
  52. + pause \n\
  53. +.label8: \n\
  54. + call .label9 \n\
  55. + pause \n\
  56. +.label9: \n\
  57. + call .label10 \n\
  58. + pause \n\
  59. +.label10: \n\
  60. + call .label11 \n\
  61. + pause \n\
  62. +.label11: \n\
  63. + call .label12 \n\
  64. + pause \n\
  65. +.label12: \n\
  66. + call .label13 \n\
  67. + pause \n\
  68. +.label13: \n\
  69. + call .label14 \n\
  70. + pause \n\
  71. +.label14: \n\
  72. + call .label15 \n\
  73. + pause \n\
  74. +.label15: \n\
  75. + call .label16 \n\
  76. + pause \n\
  77. +.label16: \n\
  78. + call .label17 \n\
  79. + pause \n\
  80. +.label17: \n\
  81. + call .label18 \n\
  82. + pause \n\
  83. +.label18: \n\
  84. + call .label19 \n\
  85. + pause \n\
  86. +.label19: \n\
  87. + call .label20 \n\
  88. + pause \n\
  89. +.label20: \n\
  90. + call .label21 \n\
  91. + pause \n\
  92. +.label21: \n\
  93. + call .label22 \n\
  94. + pause \n\
  95. +.label22: \n\
  96. + call .label23 \n\
  97. + pause \n\
  98. +.label23: \n\
  99. + call .label24 \n\
  100. + pause \n\
  101. +.label24: \n\
  102. + call .label25 \n\
  103. + pause \n\
  104. +.label25: \n\
  105. + call .label26 \n\
  106. + pause \n\
  107. +.label26: \n\
  108. + call .label27 \n\
  109. + pause \n\
  110. +.label27: \n\
  111. + call .label28 \n\
  112. + pause \n\
  113. +.label28: \n\
  114. + call .label29 \n\
  115. + pause \n\
  116. +.label29: \n\
  117. + call .label30 \n\
  118. + pause \n\
  119. +.label30: \n\
  120. + call .label31 \n\
  121. + pause \n\
  122. +.label31: \n\
  123. + call .label32 \n\
  124. + pause \n\
  125. +.label32: \n\
  126. + add $(32*8), %%rsp \n\
  127. +": : :"memory");
  128. +}
  129. +
  130. enum kvm_reg {
  131. VCPU_REGS_RAX = 0,
  132. VCPU_REGS_RCX = 1,
  133. diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
  134. index 57d538fc7c75..496884b6467f 100644
  135. --- a/arch/x86/kvm/vmx.c
  136. +++ b/arch/x86/kvm/vmx.c
  137. @@ -9228,6 +9228,8 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
  138. #endif
  139. );
  140. + stuff_RSB();
  141. +
  142. /* MSR_IA32_DEBUGCTLMSR is zeroed on vmexit. Restore it if needed */
  143. if (debugctlmsr)
  144. update_debugctlmsr(debugctlmsr);
  145. --
  146. 2.14.2