| From ca41b97ed9124fd62323a162de5852f6e28f94b8 Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Wed, 31 Jan 2018 10:18:28 +0100 |
| Subject: objtool: Add module specific retpoline rules |
| |
| From: Peter Zijlstra <peterz@infradead.org> |
| |
| commit ca41b97ed9124fd62323a162de5852f6e28f94b8 upstream. |
| |
| David allowed retpolines in .init.text, except for modules, which will |
| trip up objtool retpoline validation, fix that. |
| |
| Requested-by: David Woodhouse <dwmw2@infradead.org> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| 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> |
| |
| --- |
| scripts/Makefile.build | 2 ++ |
| tools/objtool/builtin-check.c | 3 ++- |
| tools/objtool/builtin.h | 2 +- |
| tools/objtool/check.c | 9 +++++++++ |
| 4 files changed, 14 insertions(+), 2 deletions(-) |
| |
| --- a/scripts/Makefile.build |
| +++ b/scripts/Makefile.build |
| @@ -261,6 +261,8 @@ __objtool_obj := $(objtree)/tools/objtoo |
| |
| objtool_args = $(if $(CONFIG_UNWINDER_ORC),orc generate,check) |
| |
| +objtool_args += $(if $(part-of-module), --module,) |
| + |
| ifndef CONFIG_FRAME_POINTER |
| objtool_args += --no-fp |
| endif |
| --- a/tools/objtool/builtin-check.c |
| +++ b/tools/objtool/builtin-check.c |
| @@ -29,7 +29,7 @@ |
| #include "builtin.h" |
| #include "check.h" |
| |
| -bool no_fp, no_unreachable, retpoline; |
| +bool no_fp, no_unreachable, retpoline, module; |
| |
| static const char * const check_usage[] = { |
| "objtool check [<options>] file.o", |
| @@ -40,6 +40,7 @@ const struct option check_options[] = { |
| OPT_BOOLEAN('f', "no-fp", &no_fp, "Skip frame pointer validation"), |
| OPT_BOOLEAN('u', "no-unreachable", &no_unreachable, "Skip 'unreachable instruction' warnings"), |
| OPT_BOOLEAN('r', "retpoline", &retpoline, "Validate retpoline assumptions"), |
| + OPT_BOOLEAN('m', "module", &module, "Indicates the object will be part of a kernel module"), |
| OPT_END(), |
| }; |
| |
| --- a/tools/objtool/builtin.h |
| +++ b/tools/objtool/builtin.h |
| @@ -20,7 +20,7 @@ |
| #include <subcmd/parse-options.h> |
| |
| extern const struct option check_options[]; |
| -extern bool no_fp, no_unreachable, retpoline; |
| +extern bool no_fp, no_unreachable, retpoline, module; |
| |
| extern int cmd_check(int argc, const char **argv); |
| extern int cmd_orc(int argc, const char **argv); |
| --- a/tools/objtool/check.c |
| +++ b/tools/objtool/check.c |
| @@ -1957,6 +1957,15 @@ static int validate_retpoline(struct obj |
| if (insn->retpoline_safe) |
| continue; |
| |
| + /* |
| + * .init.text code is ran before userspace and thus doesn't |
| + * strictly need retpolines, except for modules which are |
| + * loaded late, they very much do need retpoline in their |
| + * .init.text |
| + */ |
| + if (!strcmp(insn->sec->name, ".init.text") && !module) |
| + continue; |
| + |
| WARN_FUNC("indirect %s found in RETPOLINE build", |
| insn->sec, insn->offset, |
| insn->type == INSN_JUMP_DYNAMIC ? "jump" : "call"); |