mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 12:52:30 +00:00
objtool: Make stack validation frame-pointer-specific
Now that CONFIG_STACK_VALIDATION is frame-pointer specific, do the same for the '--stackval' option. Now the '--no-fp' option is redundant and can be removed. Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Link: https://lkml.kernel.org/r/f563fa064b3b63d528de250c72012d49e14742a3.1650300597.git.jpoimboe@redhat.com
This commit is contained in:
parent
03f16cd020
commit
7206447496
@ -235,7 +235,6 @@ objtool_args = \
|
|||||||
$(if $(CONFIG_STACK_VALIDATION), --stackval) \
|
$(if $(CONFIG_STACK_VALIDATION), --stackval) \
|
||||||
$(if $(CONFIG_X86_SMAP), --uaccess) \
|
$(if $(CONFIG_X86_SMAP), --uaccess) \
|
||||||
$(if $(part-of-module), --module) \
|
$(if $(part-of-module), --module) \
|
||||||
$(if $(CONFIG_FRAME_POINTER),, --no-fp) \
|
|
||||||
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
|
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
|
||||||
|
|
||||||
cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
|
cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
|
||||||
|
@ -155,10 +155,6 @@ objtool_link()
|
|||||||
|
|
||||||
if [ -n "${objtoolopt}" ]; then
|
if [ -n "${objtoolopt}" ]; then
|
||||||
|
|
||||||
if ! is_enabled CONFIG_FRAME_POINTER; then
|
|
||||||
objtoolopt="${objtoolopt} --no-fp"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if is_enabled CONFIG_GCOV_KERNEL; then
|
if is_enabled CONFIG_GCOV_KERNEL; then
|
||||||
objtoolopt="${objtoolopt} --no-unreachable"
|
objtoolopt="${objtoolopt} --no-unreachable"
|
||||||
fi
|
fi
|
||||||
|
@ -39,7 +39,7 @@ const struct option check_options[] = {
|
|||||||
OPT_BOOLEAN('o', "orc", &opts.orc, "generate ORC metadata"),
|
OPT_BOOLEAN('o', "orc", &opts.orc, "generate ORC metadata"),
|
||||||
OPT_BOOLEAN('r', "retpoline", &opts.retpoline, "validate and annotate retpoline usage"),
|
OPT_BOOLEAN('r', "retpoline", &opts.retpoline, "validate and annotate retpoline usage"),
|
||||||
OPT_BOOLEAN('l', "sls", &opts.sls, "validate straight-line-speculation mitigations"),
|
OPT_BOOLEAN('l', "sls", &opts.sls, "validate straight-line-speculation mitigations"),
|
||||||
OPT_BOOLEAN('s', "stackval", &opts.stackval, "validate stack unwinding rules"),
|
OPT_BOOLEAN('s', "stackval", &opts.stackval, "validate frame pointer rules"),
|
||||||
OPT_BOOLEAN('u', "uaccess", &opts.uaccess, "validate uaccess rules for SMAP"),
|
OPT_BOOLEAN('u', "uaccess", &opts.uaccess, "validate uaccess rules for SMAP"),
|
||||||
OPT_CALLBACK_OPTARG(0, "dump", NULL, NULL, "orc", "dump metadata", parse_dump),
|
OPT_CALLBACK_OPTARG(0, "dump", NULL, NULL, "orc", "dump metadata", parse_dump),
|
||||||
|
|
||||||
@ -49,7 +49,6 @@ const struct option check_options[] = {
|
|||||||
OPT_BOOLEAN(0, "dry-run", &opts.dryrun, "don't write modifications"),
|
OPT_BOOLEAN(0, "dry-run", &opts.dryrun, "don't write modifications"),
|
||||||
OPT_BOOLEAN(0, "lto", &opts.lto, "whole-archive like runs"),
|
OPT_BOOLEAN(0, "lto", &opts.lto, "whole-archive like runs"),
|
||||||
OPT_BOOLEAN(0, "module", &opts.module, "object is part of a kernel module"),
|
OPT_BOOLEAN(0, "module", &opts.module, "object is part of a kernel module"),
|
||||||
OPT_BOOLEAN(0, "no-fp", &opts.no_fp, "skip frame pointer validation"),
|
|
||||||
OPT_BOOLEAN(0, "no-unreachable", &opts.no_unreachable, "skip 'unreachable instruction' warnings"),
|
OPT_BOOLEAN(0, "no-unreachable", &opts.no_unreachable, "skip 'unreachable instruction' warnings"),
|
||||||
OPT_BOOLEAN(0, "sec-address", &opts.sec_address, "print section addresses in warnings"),
|
OPT_BOOLEAN(0, "sec-address", &opts.sec_address, "print section addresses in warnings"),
|
||||||
OPT_BOOLEAN(0, "stats", &opts.stats, "print statistics"),
|
OPT_BOOLEAN(0, "stats", &opts.stats, "print statistics"),
|
||||||
|
@ -2806,7 +2806,7 @@ static int update_cfi_state(struct instruction *insn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* detect when asm code uses rbp as a scratch register */
|
/* detect when asm code uses rbp as a scratch register */
|
||||||
if (!opts.no_fp && insn->func && op->src.reg == CFI_BP &&
|
if (opts.stackval && insn->func && op->src.reg == CFI_BP &&
|
||||||
cfa->base != CFI_BP)
|
cfa->base != CFI_BP)
|
||||||
cfi->bp_scratch = true;
|
cfi->bp_scratch = true;
|
||||||
break;
|
break;
|
||||||
@ -3279,7 +3279,7 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (!opts.no_fp && func && !is_fentry_call(insn) &&
|
if (opts.stackval && func && !is_fentry_call(insn) &&
|
||||||
!has_valid_stack_frame(&state)) {
|
!has_valid_stack_frame(&state)) {
|
||||||
WARN_FUNC("call without frame pointer save/setup",
|
WARN_FUNC("call without frame pointer save/setup",
|
||||||
sec, insn->offset);
|
sec, insn->offset);
|
||||||
|
@ -27,7 +27,6 @@ struct opts {
|
|||||||
bool dryrun;
|
bool dryrun;
|
||||||
bool lto;
|
bool lto;
|
||||||
bool module;
|
bool module;
|
||||||
bool no_fp;
|
|
||||||
bool no_unreachable;
|
bool no_unreachable;
|
||||||
bool sec_address;
|
bool sec_address;
|
||||||
bool stats;
|
bool stats;
|
||||||
|
Loading…
Reference in New Issue
Block a user