| From 9e0e3c5130e949c389caabc8033e9799b129e429 Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Wed, 17 Jan 2018 22:34:34 +0100 |
| Subject: x86/speculation, objtool: Annotate indirect calls/jumps for objtool |
| |
| From: Peter Zijlstra <peterz@infradead.org> |
| |
| commit 9e0e3c5130e949c389caabc8033e9799b129e429 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/nospec-branch.h | 27 +++++++++++++++++++++++---- |
| 1 file changed, 23 insertions(+), 4 deletions(-) |
| |
| --- a/arch/x86/include/asm/nospec-branch.h |
| +++ b/arch/x86/include/asm/nospec-branch.h |
| @@ -68,6 +68,18 @@ |
| .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 |
| * invocation below less ugly. |
| @@ -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) |