0016-x86-mm-Enable-CR4.PCIDE-on-supported-systems.patch 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Andy Lutomirski <[email protected]>
  3. Date: Thu, 29 Jun 2017 08:53:21 -0700
  4. Subject: [PATCH] x86/mm: Enable CR4.PCIDE on supported systems
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. CVE-2017-5754
  9. We can use PCID if the CPU has PCID and PGE and we're not on Xen.
  10. By itself, this has no effect. A followup patch will start using PCID.
  11. Signed-off-by: Andy Lutomirski <[email protected]>
  12. Reviewed-by: Nadav Amit <[email protected]>
  13. Reviewed-by: Boris Ostrovsky <[email protected]>
  14. Reviewed-by: Thomas Gleixner <[email protected]>
  15. Cc: Andrew Morton <[email protected]>
  16. Cc: Arjan van de Ven <[email protected]>
  17. Cc: Borislav Petkov <[email protected]>
  18. Cc: Dave Hansen <[email protected]>
  19. Cc: Juergen Gross <[email protected]>
  20. Cc: Linus Torvalds <[email protected]>
  21. Cc: Mel Gorman <[email protected]>
  22. Cc: Peter Zijlstra <[email protected]>
  23. Cc: Rik van Riel <[email protected]>
  24. Cc: [email protected]
  25. Link: http://lkml.kernel.org/r/6327ecd907b32f79d5aa0d466f04503bbec5df88.1498751203.git.luto@kernel.org
  26. Signed-off-by: Ingo Molnar <[email protected]>
  27. (cherry picked from commit 660da7c9228f685b2ebe664f9fd69aaddcc420b5)
  28. Signed-off-by: Andy Whitcroft <[email protected]>
  29. Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
  30. (cherry picked from commit 7d6bbe5528395f18de50bd2532843546c849883d)
  31. Signed-off-by: Fabian Grünbichler <[email protected]>
  32. ---
  33. arch/x86/include/asm/tlbflush.h | 8 ++++++++
  34. arch/x86/kernel/cpu/common.c | 22 ++++++++++++++++++++++
  35. arch/x86/xen/enlighten_pv.c | 6 ++++++
  36. 3 files changed, 36 insertions(+)
  37. diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
  38. index 50ea3482e1d1..2b3d68093235 100644
  39. --- a/arch/x86/include/asm/tlbflush.h
  40. +++ b/arch/x86/include/asm/tlbflush.h
  41. @@ -207,6 +207,14 @@ static inline void __flush_tlb_all(void)
  42. __flush_tlb_global();
  43. else
  44. __flush_tlb();
  45. +
  46. + /*
  47. + * Note: if we somehow had PCID but not PGE, then this wouldn't work --
  48. + * we'd end up flushing kernel translations for the current ASID but
  49. + * we might fail to flush kernel translations for other cached ASIDs.
  50. + *
  51. + * To avoid this issue, we force PCID off if PGE is off.
  52. + */
  53. }
  54. static inline void __flush_tlb_one(unsigned long addr)
  55. diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
  56. index 904485e7b230..b95cd94ca97b 100644
  57. --- a/arch/x86/kernel/cpu/common.c
  58. +++ b/arch/x86/kernel/cpu/common.c
  59. @@ -329,6 +329,25 @@ static __always_inline void setup_smap(struct cpuinfo_x86 *c)
  60. }
  61. }
  62. +static void setup_pcid(struct cpuinfo_x86 *c)
  63. +{
  64. + if (cpu_has(c, X86_FEATURE_PCID)) {
  65. + if (cpu_has(c, X86_FEATURE_PGE)) {
  66. + cr4_set_bits(X86_CR4_PCIDE);
  67. + } else {
  68. + /*
  69. + * flush_tlb_all(), as currently implemented, won't
  70. + * work if PCID is on but PGE is not. Since that
  71. + * combination doesn't exist on real hardware, there's
  72. + * no reason to try to fully support it, but it's
  73. + * polite to avoid corrupting data if we're on
  74. + * an improperly configured VM.
  75. + */
  76. + clear_cpu_cap(c, X86_FEATURE_PCID);
  77. + }
  78. + }
  79. +}
  80. +
  81. /*
  82. * Protection Keys are not available in 32-bit mode.
  83. */
  84. @@ -1143,6 +1162,9 @@ static void identify_cpu(struct cpuinfo_x86 *c)
  85. setup_smep(c);
  86. setup_smap(c);
  87. + /* Set up PCID */
  88. + setup_pcid(c);
  89. +
  90. /*
  91. * The vendor-specific functions might have changed features.
  92. * Now we do "generic changes."
  93. diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
  94. index 811e4ddb3f37..290bc5ac9852 100644
  95. --- a/arch/x86/xen/enlighten_pv.c
  96. +++ b/arch/x86/xen/enlighten_pv.c
  97. @@ -264,6 +264,12 @@ static void __init xen_init_capabilities(void)
  98. setup_clear_cpu_cap(X86_FEATURE_ACC);
  99. setup_clear_cpu_cap(X86_FEATURE_X2APIC);
  100. + /*
  101. + * Xen PV would need some work to support PCID: CR3 handling as well
  102. + * as xen_flush_tlb_others() would need updating.
  103. + */
  104. + setup_clear_cpu_cap(X86_FEATURE_PCID);
  105. +
  106. if (!xen_initial_domain())
  107. setup_clear_cpu_cap(X86_FEATURE_ACPI);
  108. --
  109. 2.14.2