x86/nospec: Fix i386 RSB stuffing
commit 332924973725e8cdcc783c175f68cf7e162cb9e5 upstream. Turns out that i386 doesn't unconditionally have LFENCE, as such the loop in __FILL_RETURN_BUFFER isn't actually speculation safe on such chips. Fixes: ba6e31af2be9 ("x86/speculation: Add LFENCE to RSB fill sequence") Reported-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/Yv9tj9vbQ9nNlXoY@worktop.programming.kicks-ass.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
adee8f3082
commit
e5796ff9ac
@@ -50,6 +50,7 @@
|
|||||||
* the optimal version — two calls, each with their own speculation
|
* the optimal version — two calls, each with their own speculation
|
||||||
* trap should their return address end up getting used, in a loop.
|
* trap should their return address end up getting used, in a loop.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
#define __FILL_RETURN_BUFFER(reg, nr) \
|
#define __FILL_RETURN_BUFFER(reg, nr) \
|
||||||
mov $(nr/2), reg; \
|
mov $(nr/2), reg; \
|
||||||
771: \
|
771: \
|
||||||
@@ -60,6 +61,17 @@
|
|||||||
jnz 771b; \
|
jnz 771b; \
|
||||||
/* barrier for jnz misprediction */ \
|
/* barrier for jnz misprediction */ \
|
||||||
lfence;
|
lfence;
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* i386 doesn't unconditionally have LFENCE, as such it can't
|
||||||
|
* do a loop.
|
||||||
|
*/
|
||||||
|
#define __FILL_RETURN_BUFFER(reg, nr) \
|
||||||
|
.rept nr; \
|
||||||
|
__FILL_RETURN_SLOT; \
|
||||||
|
.endr; \
|
||||||
|
add $(BITS_PER_LONG/8) * nr, %_ASM_SP;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Stuff a single RSB slot.
|
* Stuff a single RSB slot.
|
||||||
|
Reference in New Issue
Block a user