|
4 | 4 | #define _ASM_X86_NOSPEC_BRANCH_H_
|
5 | 5 |
|
6 | 6 | #include <linux/static_key.h>
|
| 7 | +#include <linux/frame.h> |
7 | 8 |
|
8 | 9 | #include <asm/alternative.h>
|
9 | 10 | #include <asm/alternative-asm.h>
|
10 | 11 | #include <asm/cpufeatures.h>
|
11 | 12 | #include <asm/msr-index.h>
|
| 13 | +#include <asm/unwind_hints.h> |
12 | 14 |
|
13 | 15 | /*
|
14 | 16 | * This should be used immediately before a retpoline alternative. It tells
|
|
46 | 48 | #define __FILL_RETURN_BUFFER(reg, nr, sp) \
|
47 | 49 | mov $(nr/2), reg; \
|
48 | 50 | 771: \
|
| 51 | + ANNOTATE_INTRA_FUNCTION_CALL; \ |
49 | 52 | call 772f; \
|
50 | 53 | 773: /* speculation trap */ \
|
| 54 | + UNWIND_HINT_EMPTY; \ |
51 | 55 | pause; \
|
52 | 56 | lfence; \
|
53 | 57 | jmp 773b; \
|
54 | 58 | 772: \
|
| 59 | + ANNOTATE_INTRA_FUNCTION_CALL; \ |
55 | 60 | call 774f; \
|
56 | 61 | 775: /* speculation trap */ \
|
| 62 | + UNWIND_HINT_EMPTY; \ |
57 | 63 | pause; \
|
58 | 64 | lfence; \
|
59 | 65 | jmp 775b; \
|
60 | 66 | 774: \
|
| 67 | + add $(BITS_PER_LONG/8) * 2, sp; \ |
61 | 68 | dec reg; \
|
62 |
| - jnz 771b; \ |
63 |
| - add $(BITS_PER_LONG/8) * nr, sp; |
| 69 | + jnz 771b; |
64 | 70 |
|
65 | 71 | #ifdef __ASSEMBLY__
|
66 | 72 |
|
|
137 | 143 | */
|
138 | 144 | .macro FILL_RETURN_BUFFER reg:req nr:req ftr:req
|
139 | 145 | #ifdef CONFIG_RETPOLINE
|
140 |
| - ANNOTATE_NOSPEC_ALTERNATIVE |
141 |
| - ALTERNATIVE "jmp .Lskip_rsb_\@", \ |
142 |
| - __stringify(__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP)) \ |
143 |
| - \ftr |
| 146 | + ALTERNATIVE "jmp .Lskip_rsb_\@", "", \ftr |
| 147 | + __FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP) |
144 | 148 | .Lskip_rsb_\@:
|
145 | 149 | #endif
|
146 | 150 | .endm
|
|
0 commit comments