|
@@ -11,7 +11,7 @@
|
|
* Fill the CPU return stack buffer.
|
|
* Fill the CPU return stack buffer.
|
|
*
|
|
*
|
|
* Each entry in the RSB, if used for a speculative 'ret', contains an
|
|
* Each entry in the RSB, if used for a speculative 'ret', contains an
|
|
- * infinite 'pause; jmp' loop to capture speculative execution.
|
|
|
|
|
|
+ * infinite 'pause; lfence; jmp' loop to capture speculative execution.
|
|
*
|
|
*
|
|
* This is required in various cases for retpoline and IBRS-based
|
|
* This is required in various cases for retpoline and IBRS-based
|
|
* mitigations for the Spectre variant 2 vulnerability. Sometimes to
|
|
* mitigations for the Spectre variant 2 vulnerability. Sometimes to
|
|
@@ -38,11 +38,13 @@
|
|
call 772f; \
|
|
call 772f; \
|
|
773: /* speculation trap */ \
|
|
773: /* speculation trap */ \
|
|
pause; \
|
|
pause; \
|
|
|
|
+ lfence; \
|
|
jmp 773b; \
|
|
jmp 773b; \
|
|
772: \
|
|
772: \
|
|
call 774f; \
|
|
call 774f; \
|
|
775: /* speculation trap */ \
|
|
775: /* speculation trap */ \
|
|
pause; \
|
|
pause; \
|
|
|
|
+ lfence; \
|
|
jmp 775b; \
|
|
jmp 775b; \
|
|
774: \
|
|
774: \
|
|
dec reg; \
|
|
dec reg; \
|
|
@@ -73,6 +75,7 @@
|
|
call .Ldo_rop_\@
|
|
call .Ldo_rop_\@
|
|
.Lspec_trap_\@:
|
|
.Lspec_trap_\@:
|
|
pause
|
|
pause
|
|
|
|
+ lfence
|
|
jmp .Lspec_trap_\@
|
|
jmp .Lspec_trap_\@
|
|
.Ldo_rop_\@:
|
|
.Ldo_rop_\@:
|
|
mov \reg, (%_ASM_SP)
|
|
mov \reg, (%_ASM_SP)
|
|
@@ -165,6 +168,7 @@
|
|
" .align 16\n" \
|
|
" .align 16\n" \
|
|
"901: call 903f;\n" \
|
|
"901: call 903f;\n" \
|
|
"902: pause;\n" \
|
|
"902: pause;\n" \
|
|
|
|
+ " lfence;\n" \
|
|
" jmp 902b;\n" \
|
|
" jmp 902b;\n" \
|
|
" .align 16\n" \
|
|
" .align 16\n" \
|
|
"903: addl $4, %%esp;\n" \
|
|
"903: addl $4, %%esp;\n" \
|