|
@@ -67,6 +67,18 @@
|
|
|
.popsection
|
|
|
.endm
|
|
|
|
|
|
+/*
|
|
|
+ * This should be used immediately before an indirect jump/call. It tells
|
|
|
+ * objtool the subsequent indirect jump/call is vouched safe for retpoline
|
|
|
+ * builds.
|
|
|
+ */
|
|
|
+.macro ANNOTATE_RETPOLINE_SAFE
|
|
|
+ .Lannotate_\@:
|
|
|
+ .pushsection .discard.retpoline_safe
|
|
|
+ _ASM_PTR .Lannotate_\@
|
|
|
+ .popsection
|
|
|
+.endm
|
|
|
+
|
|
|
/*
|
|
|
* These are the bare retpoline primitives for indirect jmp and call.
|
|
|
* Do not use these directly; they only exist to make the ALTERNATIVE
|
|
@@ -103,9 +115,9 @@
|
|
|
.macro JMP_NOSPEC reg:req
|
|
|
#ifdef CONFIG_RETPOLINE
|
|
|
ANNOTATE_NOSPEC_ALTERNATIVE
|
|
|
- ALTERNATIVE_2 __stringify(jmp *\reg), \
|
|
|
+ ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; jmp *\reg), \
|
|
|
__stringify(RETPOLINE_JMP \reg), X86_FEATURE_RETPOLINE, \
|
|
|
- __stringify(lfence; jmp *\reg), X86_FEATURE_RETPOLINE_AMD
|
|
|
+ __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *\reg), X86_FEATURE_RETPOLINE_AMD
|
|
|
#else
|
|
|
jmp *\reg
|
|
|
#endif
|
|
@@ -114,9 +126,9 @@
|
|
|
.macro CALL_NOSPEC reg:req
|
|
|
#ifdef CONFIG_RETPOLINE
|
|
|
ANNOTATE_NOSPEC_ALTERNATIVE
|
|
|
- ALTERNATIVE_2 __stringify(call *\reg), \
|
|
|
+ ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; call *\reg), \
|
|
|
__stringify(RETPOLINE_CALL \reg), X86_FEATURE_RETPOLINE,\
|
|
|
- __stringify(lfence; call *\reg), X86_FEATURE_RETPOLINE_AMD
|
|
|
+ __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; call *\reg), X86_FEATURE_RETPOLINE_AMD
|
|
|
#else
|
|
|
call *\reg
|
|
|
#endif
|
|
@@ -144,6 +156,12 @@
|
|
|
".long 999b - .\n\t" \
|
|
|
".popsection\n\t"
|
|
|
|
|
|
+#define ANNOTATE_RETPOLINE_SAFE \
|
|
|
+ "999:\n\t" \
|
|
|
+ ".pushsection .discard.retpoline_safe\n\t" \
|
|
|
+ _ASM_PTR " 999b\n\t" \
|
|
|
+ ".popsection\n\t"
|
|
|
+
|
|
|
#if defined(CONFIG_X86_64) && defined(RETPOLINE)
|
|
|
|
|
|
/*
|
|
@@ -153,6 +171,7 @@
|
|
|
# define CALL_NOSPEC \
|
|
|
ANNOTATE_NOSPEC_ALTERNATIVE \
|
|
|
ALTERNATIVE( \
|
|
|
+ ANNOTATE_RETPOLINE_SAFE \
|
|
|
"call *%[thunk_target]\n", \
|
|
|
"call __x86_indirect_thunk_%V[thunk_target]\n", \
|
|
|
X86_FEATURE_RETPOLINE)
|