x86/speculation: Change FILL_RETURN_BUFFER to work with objtool
Change FILL_RETURN_BUFFER so that objtool groks it and can generate correct ORC unwind information. - Since ORC is alternative invariant; that is, all alternatives should have the same ORC entries, the __FILL_RETURN_BUFFER body can not be part of an alternative. Therefore, move it out of the alternative and keep the alternative as a sort of jump_label around it. - Use the ANNOTATE_INTRA_FUNCTION_CALL annotation to white-list these 'funny' call instructions to nowhere. - Use UNWIND_HINT_EMPTY to 'fill' the speculation traps, otherwise objtool will consider them unreachable. - Move the RSP adjustment into the loop, such that the loop has a deterministic stack layout. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Link: https://lkml.kernel.org/r/20200428191700.032079304@infradead.org
This commit is contained in:
parent
8aa8eb2a8f
commit
089dd8e531
1 changed files with 10 additions and 6 deletions
|
@ -4,11 +4,13 @@
|
||||||
#define _ASM_X86_NOSPEC_BRANCH_H_
|
#define _ASM_X86_NOSPEC_BRANCH_H_
|
||||||
|
|
||||||
#include <linux/static_key.h>
|
#include <linux/static_key.h>
|
||||||
|
#include <linux/frame.h>
|
||||||
|
|
||||||
#include <asm/alternative.h>
|
#include <asm/alternative.h>
|
||||||
#include <asm/alternative-asm.h>
|
#include <asm/alternative-asm.h>
|
||||||
#include <asm/cpufeatures.h>
|
#include <asm/cpufeatures.h>
|
||||||
#include <asm/msr-index.h>
|
#include <asm/msr-index.h>
|
||||||
|
#include <asm/unwind_hints.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This should be used immediately before a retpoline alternative. It tells
|
* This should be used immediately before a retpoline alternative. It tells
|
||||||
|
@ -46,21 +48,25 @@
|
||||||
#define __FILL_RETURN_BUFFER(reg, nr, sp) \
|
#define __FILL_RETURN_BUFFER(reg, nr, sp) \
|
||||||
mov $(nr/2), reg; \
|
mov $(nr/2), reg; \
|
||||||
771: \
|
771: \
|
||||||
|
ANNOTATE_INTRA_FUNCTION_CALL; \
|
||||||
call 772f; \
|
call 772f; \
|
||||||
773: /* speculation trap */ \
|
773: /* speculation trap */ \
|
||||||
|
UNWIND_HINT_EMPTY; \
|
||||||
pause; \
|
pause; \
|
||||||
lfence; \
|
lfence; \
|
||||||
jmp 773b; \
|
jmp 773b; \
|
||||||
772: \
|
772: \
|
||||||
|
ANNOTATE_INTRA_FUNCTION_CALL; \
|
||||||
call 774f; \
|
call 774f; \
|
||||||
775: /* speculation trap */ \
|
775: /* speculation trap */ \
|
||||||
|
UNWIND_HINT_EMPTY; \
|
||||||
pause; \
|
pause; \
|
||||||
lfence; \
|
lfence; \
|
||||||
jmp 775b; \
|
jmp 775b; \
|
||||||
774: \
|
774: \
|
||||||
|
add $(BITS_PER_LONG/8) * 2, sp; \
|
||||||
dec reg; \
|
dec reg; \
|
||||||
jnz 771b; \
|
jnz 771b;
|
||||||
add $(BITS_PER_LONG/8) * nr, sp;
|
|
||||||
|
|
||||||
#ifdef __ASSEMBLY__
|
#ifdef __ASSEMBLY__
|
||||||
|
|
||||||
|
@ -137,10 +143,8 @@
|
||||||
*/
|
*/
|
||||||
.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req
|
.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req
|
||||||
#ifdef CONFIG_RETPOLINE
|
#ifdef CONFIG_RETPOLINE
|
||||||
ANNOTATE_NOSPEC_ALTERNATIVE
|
ALTERNATIVE "jmp .Lskip_rsb_\@", "", \ftr
|
||||||
ALTERNATIVE "jmp .Lskip_rsb_\@", \
|
__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP)
|
||||||
__stringify(__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP)) \
|
|
||||||
\ftr
|
|
||||||
.Lskip_rsb_\@:
|
.Lskip_rsb_\@:
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
Loading…
Add table
Reference in a new issue