|
67 | 67 | .popsection
|
68 | 68 | .endm
|
69 | 69 |
|
| 70 | +/* |
| 71 | + * This should be used immediately before an indirect jump/call. It tells |
| 72 | + * objtool the subsequent indirect jump/call is vouched safe for retpoline |
| 73 | + * builds. |
| 74 | + */ |
| 75 | +.macro ANNOTATE_RETPOLINE_SAFE |
| 76 | + .Lannotate_\@: |
| 77 | + .pushsection .discard.retpoline_safe |
| 78 | + _ASM_PTR .Lannotate_\@ |
| 79 | + .popsection |
| 80 | +.endm |
| 81 | + |
70 | 82 | /*
|
71 | 83 | * These are the bare retpoline primitives for indirect jmp and call.
|
72 | 84 | * Do not use these directly; they only exist to make the ALTERNATIVE
|
|
103 | 115 | .macro JMP_NOSPEC reg:req
|
104 | 116 | #ifdef CONFIG_RETPOLINE
|
105 | 117 | ANNOTATE_NOSPEC_ALTERNATIVE
|
106 |
| - ALTERNATIVE_2 __stringify(jmp *\reg), \ |
| 118 | + ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; jmp *\reg), \ |
107 | 119 | __stringify(RETPOLINE_JMP \reg), X86_FEATURE_RETPOLINE, \
|
108 |
| - __stringify(lfence; jmp *\reg), X86_FEATURE_RETPOLINE_AMD |
| 120 | + __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *\reg), X86_FEATURE_RETPOLINE_AMD |
109 | 121 | #else
|
110 | 122 | jmp *\reg
|
111 | 123 | #endif
|
|
114 | 126 | .macro CALL_NOSPEC reg:req
|
115 | 127 | #ifdef CONFIG_RETPOLINE
|
116 | 128 | ANNOTATE_NOSPEC_ALTERNATIVE
|
117 |
| - ALTERNATIVE_2 __stringify(call *\reg), \ |
| 129 | + ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; call *\reg), \ |
118 | 130 | __stringify(RETPOLINE_CALL \reg), X86_FEATURE_RETPOLINE,\
|
119 |
| - __stringify(lfence; call *\reg), X86_FEATURE_RETPOLINE_AMD |
| 131 | + __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; call *\reg), X86_FEATURE_RETPOLINE_AMD |
120 | 132 | #else
|
121 | 133 | call *\reg
|
122 | 134 | #endif
|
|
144 | 156 | ".long 999b - .\n\t" \
|
145 | 157 | ".popsection\n\t"
|
146 | 158 |
|
| 159 | +#define ANNOTATE_RETPOLINE_SAFE \ |
| 160 | + "999:\n\t" \ |
| 161 | + ".pushsection .discard.retpoline_safe\n\t" \ |
| 162 | + _ASM_PTR " 999b\n\t" \ |
| 163 | + ".popsection\n\t" |
| 164 | + |
147 | 165 | #if defined(CONFIG_X86_64) && defined(RETPOLINE)
|
148 | 166 |
|
149 | 167 | /*
|
|
153 | 171 | # define CALL_NOSPEC \
|
154 | 172 | ANNOTATE_NOSPEC_ALTERNATIVE \
|
155 | 173 | ALTERNATIVE( \
|
| 174 | + ANNOTATE_RETPOLINE_SAFE \ |
156 | 175 | "call *%[thunk_target]\n", \
|
157 | 176 | "call __x86_indirect_thunk_%V[thunk_target]\n", \
|
158 | 177 | X86_FEATURE_RETPOLINE)
|
|
0 commit comments