Commit 089dd8e5 authored by Peter Zijlstra's avatar Peter Zijlstra

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: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarAlexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/20200428191700.032079304@infradead.org
parent 8aa8eb2a
...@@ -4,11 +4,13 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment