Skip to content

Commit

Permalink
objtool: Add module specific retpoline rules
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Feb 21, 2018
1 parent b5bc223 commit ca41b97
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 2 deletions.
2 changes: 2 additions & 0 deletions scripts/Makefile.build
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,8 @@ __objtool_obj := $(objtree)/tools/objtool/objtool

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
Expand Down
3 changes: 2 additions & 1 deletion tools/objtool/builtin-check.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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(),
};

Expand Down
2 changes: 1 addition & 1 deletion tools/objtool/builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
9 changes: 9 additions & 0 deletions tools/objtool/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -1958,6 +1958,15 @@ static int validate_retpoline(struct objtool_file *file)
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");
Expand Down

0 comments on commit ca41b97

Please sign in to comment.