• Pawan Gupta's avatar
    x86/speculation: Add LFENCE to RSB fill sequence · ba6e31af
    Pawan Gupta authored
    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:                                            \
              ANNOTATE_INTRA_FUNCTION_CALL;           \
              call    772f;                           \
      773:    /* speculation trap */                  \
              UNWIND_HINT_EMPTY;                      \
              pause;                                  \
              lfence;                                 \
              jmp     773b;                           \
      772:                                            \
              ANNOTATE_INTRA_FUNCTION_CALL;           \
              call    774f;                           \
      775:    /* speculation trap */                  \
              UNWIND_HINT_EMPTY;                      \
              pause;                                  \
              lfence;                                 \
              jmp     775b;                           \
      774:                                            \
              add     $(BITS_PER_LONG/8) * 2, sp;     \
              dec     reg;                            \
              jnz     771b;        <----- CPU can miss-predict here.
    
    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: default avatarAndrew Cooper <andrew.cooper3@citrix.com>
    Signed-off-by: default avatarPawan Gupta <pawan.kumar.gupta@linux.intel.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    ba6e31af
nospec-branch.h 10.5 KB