diff options
author | Peter Zijlstra <peterz@infradead.org> | 2018-01-17 16:34:34 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2018-02-21 03:05:03 -0500 |
commit | 9e0e3c5130e949c389caabc8033e9799b129e429 (patch) | |
tree | 8bf5afc8f6df34f15aa3703c99476b8943c23fa1 | |
parent | 87358710c1fb4f1bf96bbe2349975ff9953fc9b2 (diff) |
x86/speculation, objtool: Annotate indirect calls/jumps for objtool
Annotate the indirect calls/jumps in the CALL_NOSPEC/JUMP_NOSPEC
alternatives.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/include/asm/nospec-branch.h | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h index ec90c3228991..1aad6c79a597 100644 --- a/arch/x86/include/asm/nospec-branch.h +++ b/arch/x86/include/asm/nospec-branch.h | |||
@@ -68,6 +68,18 @@ | |||
68 | .endm | 68 | .endm |
69 | 69 | ||
70 | /* | 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 | |||
82 | /* | ||
71 | * These are the bare retpoline primitives for indirect jmp and call. | 83 | * These are the bare retpoline primitives for indirect jmp and call. |
72 | * Do not use these directly; they only exist to make the ALTERNATIVE | 84 | * Do not use these directly; they only exist to make the ALTERNATIVE |
73 | * invocation below less ugly. | 85 | * invocation below less ugly. |
@@ -103,9 +115,9 @@ | |||
103 | .macro JMP_NOSPEC reg:req | 115 | .macro JMP_NOSPEC reg:req |
104 | #ifdef CONFIG_RETPOLINE | 116 | #ifdef CONFIG_RETPOLINE |
105 | ANNOTATE_NOSPEC_ALTERNATIVE | 117 | ANNOTATE_NOSPEC_ALTERNATIVE |
106 | ALTERNATIVE_2 __stringify(jmp *\reg), \ | 118 | ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; jmp *\reg), \ |
107 | __stringify(RETPOLINE_JMP \reg), X86_FEATURE_RETPOLINE, \ | 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 | #else | 121 | #else |
110 | jmp *\reg | 122 | jmp *\reg |
111 | #endif | 123 | #endif |
@@ -114,9 +126,9 @@ | |||
114 | .macro CALL_NOSPEC reg:req | 126 | .macro CALL_NOSPEC reg:req |
115 | #ifdef CONFIG_RETPOLINE | 127 | #ifdef CONFIG_RETPOLINE |
116 | ANNOTATE_NOSPEC_ALTERNATIVE | 128 | ANNOTATE_NOSPEC_ALTERNATIVE |
117 | ALTERNATIVE_2 __stringify(call *\reg), \ | 129 | ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; call *\reg), \ |
118 | __stringify(RETPOLINE_CALL \reg), X86_FEATURE_RETPOLINE,\ | 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 | #else | 132 | #else |
121 | call *\reg | 133 | call *\reg |
122 | #endif | 134 | #endif |
@@ -144,6 +156,12 @@ | |||
144 | ".long 999b - .\n\t" \ | 156 | ".long 999b - .\n\t" \ |
145 | ".popsection\n\t" | 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 | #if defined(CONFIG_X86_64) && defined(RETPOLINE) | 165 | #if defined(CONFIG_X86_64) && defined(RETPOLINE) |
148 | 166 | ||
149 | /* | 167 | /* |
@@ -153,6 +171,7 @@ | |||
153 | # define CALL_NOSPEC \ | 171 | # define CALL_NOSPEC \ |
154 | ANNOTATE_NOSPEC_ALTERNATIVE \ | 172 | ANNOTATE_NOSPEC_ALTERNATIVE \ |
155 | ALTERNATIVE( \ | 173 | ALTERNATIVE( \ |
174 | ANNOTATE_RETPOLINE_SAFE \ | ||
156 | "call *%[thunk_target]\n", \ | 175 | "call *%[thunk_target]\n", \ |
157 | "call __x86_indirect_thunk_%V[thunk_target]\n", \ | 176 | "call __x86_indirect_thunk_%V[thunk_target]\n", \ |
158 | X86_FEATURE_RETPOLINE) | 177 | X86_FEATURE_RETPOLINE) |