0256-x86-cpu-AMD-Make-LFENCE-a-serializing-instruction.patch 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Tom Lendacky <[email protected]>
  3. Date: Mon, 8 Jan 2018 16:09:21 -0600
  4. Subject: [PATCH] x86/cpu/AMD: Make LFENCE a serializing instruction
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. CVE-2017-5754
  9. To aid in speculation control, make LFENCE a serializing instruction
  10. since it has less overhead than MFENCE. This is done by setting bit 1
  11. of MSR 0xc0011029 (DE_CFG). Some families that support LFENCE do not
  12. have this MSR. For these families, the LFENCE instruction is already
  13. serializing.
  14. Signed-off-by: Tom Lendacky <[email protected]>
  15. Signed-off-by: Thomas Gleixner <[email protected]>
  16. Reviewed-by: Reviewed-by: Borislav Petkov <[email protected]>
  17. Cc: Peter Zijlstra <[email protected]>
  18. Cc: Tim Chen <[email protected]>
  19. Cc: Dave Hansen <[email protected]>
  20. Cc: Borislav Petkov <[email protected]>
  21. Cc: Dan Williams <[email protected]>
  22. Cc: Linus Torvalds <[email protected]>
  23. Cc: Greg Kroah-Hartman <[email protected]>
  24. Cc: David Woodhouse <[email protected]>
  25. Cc: Paul Turner <[email protected]>
  26. Link: https://lkml.kernel.org/r/[email protected]
  27. (cherry picked from commit e4d0e84e490790798691aaa0f2e598637f1867ec)
  28. Signed-off-by: Andy Whitcroft <[email protected]>
  29. Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
  30. (cherry picked from commit bde943193168fe9a3814badaa0cae3422029dce5)
  31. Signed-off-by: Fabian Grünbichler <[email protected]>
  32. ---
  33. arch/x86/include/asm/msr-index.h | 2 ++
  34. arch/x86/kernel/cpu/amd.c | 10 ++++++++++
  35. 2 files changed, 12 insertions(+)
  36. diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
  37. index 5573c75f8e4c..25147df4acfc 100644
  38. --- a/arch/x86/include/asm/msr-index.h
  39. +++ b/arch/x86/include/asm/msr-index.h
  40. @@ -351,6 +351,8 @@
  41. #define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL
  42. #define FAM10H_MMIO_CONF_BASE_SHIFT 20
  43. #define MSR_FAM10H_NODE_ID 0xc001100c
  44. +#define MSR_F10H_DECFG 0xc0011029
  45. +#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1
  46. /* K8 MSRs */
  47. #define MSR_K8_TOP_MEM1 0xc001001a
  48. diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
  49. index 2a5328cc03a6..c9a4e4db7860 100644
  50. --- a/arch/x86/kernel/cpu/amd.c
  51. +++ b/arch/x86/kernel/cpu/amd.c
  52. @@ -785,6 +785,16 @@ static void init_amd(struct cpuinfo_x86 *c)
  53. set_cpu_cap(c, X86_FEATURE_K8);
  54. if (cpu_has(c, X86_FEATURE_XMM2)) {
  55. + /*
  56. + * A serializing LFENCE has less overhead than MFENCE, so
  57. + * use it for execution serialization. On families which
  58. + * don't have that MSR, LFENCE is already serializing.
  59. + * msr_set_bit() uses the safe accessors, too, even if the MSR
  60. + * is not present.
  61. + */
  62. + msr_set_bit(MSR_F10H_DECFG,
  63. + MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
  64. +
  65. /* MFENCE stops RDTSC speculation */
  66. set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
  67. }
  68. --
  69. 2.14.2