]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/speculation: Add LFENCE to RSB fill sequence
authorPawan Gupta <pawan.kumar.gupta@linux.intel.com>
Tue, 2 Aug 2022 22:47:02 +0000 (15:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 Aug 2022 10:48:42 +0000 (12:48 +0200)
commit ba6e31af2be96c4d0536f2152ed6f7b6c11bca47 upstream.

RSB fill sequence does not have any protection for miss-prediction of
conditional branch at the end of the sequence. CPU can speculatively
execute code immediately after the sequence, while RSB filling hasn't
completed yet.

  #define __FILL_RETURN_BUFFER(reg, nr, sp) \
   mov $(nr/2), reg; \
  771: \
   call 772f; \
  773: /* speculation trap */ \
   pause; \
   lfence; \
   jmp 773b; \
  772: \
   call 774f; \
  775: /* speculation trap */ \
   pause; \
   lfence; \
   jmp 775b; \
  774: \
   dec reg; \
   jnz 771b;  <----- CPU can miss-predict here. \
   add $(BITS_PER_LONG/8) * nr, sp;

Before RSB is filled, RETs that come in program order after this macro
can be executed speculatively, making them vulnerable to RSB-based
attacks.

Mitigate it by adding an LFENCE after the conditional branch to prevent
speculation while RSB is being filled.

Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/include/asm/nospec-branch.h

index 6164994e27c58c6407a94131d9b9230cdf0fe139..747549934fe32fe4cbfd8c76502869983d031303 100644 (file)
@@ -52,7 +52,9 @@
 774:                                           \
        dec     reg;                            \
        jnz     771b;                           \
-       add     $(BITS_PER_LONG/8) * nr, sp;
+       add     $(BITS_PER_LONG/8) * nr, sp;    \
+       /* barrier for jnz misprediction */     \
+       lfence;
 
 /* Sequence to mitigate PBRSB on eIBRS CPUs */
 #define __ISSUE_UNBALANCED_RET_GUARD(sp)       \