mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
objtool: Add --mnop as an option to --mcount
Some architectures (powerpc) may not support ftrace locations being nop'ed out at build time. Introduce CONFIG_HAVE_OBJTOOL_NOP_MCOUNT for objtool, as a means for architectures to enable nop'ing of ftrace locations. Add --mnop as an option to objtool --mcount, to indicate support for the same. Also, make sure that --mnop can be passed as an option to objtool only when --mcount is passed. Tested-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Reviewed-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20221114175754.1131267-12-sv@linux.ibm.com
This commit is contained in:
parent
86ea7f3615
commit
280981d699
4
Makefile
4
Makefile
@ -933,7 +933,9 @@ ifdef CONFIG_FTRACE_MCOUNT_USE_CC
|
||||
endif
|
||||
endif
|
||||
ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL
|
||||
CC_FLAGS_USING += -DCC_USING_NOP_MCOUNT
|
||||
ifdef CONFIG_HAVE_OBJTOOL_NOP_MCOUNT
|
||||
CC_FLAGS_USING += -DCC_USING_NOP_MCOUNT
|
||||
endif
|
||||
endif
|
||||
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||
ifdef CONFIG_HAVE_C_RECORDMCOUNT
|
||||
|
@ -195,6 +195,7 @@ config X86
|
||||
select HAVE_CONTEXT_TRACKING_USER_OFFSTACK if HAVE_CONTEXT_TRACKING_USER
|
||||
select HAVE_C_RECORDMCOUNT
|
||||
select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
|
||||
select HAVE_OBJTOOL_NOP_MCOUNT if HAVE_OBJTOOL_MCOUNT
|
||||
select HAVE_BUILDTIME_MCOUNT_SORT
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DMA_CONTIGUOUS
|
||||
|
@ -82,6 +82,13 @@ config HAVE_OBJTOOL_MCOUNT
|
||||
help
|
||||
Arch supports objtool --mcount
|
||||
|
||||
config HAVE_OBJTOOL_NOP_MCOUNT
|
||||
bool
|
||||
help
|
||||
Arch supports the objtool options --mcount with --mnop.
|
||||
An architecture can select this if it wants to enable nop'ing
|
||||
of ftrace locations.
|
||||
|
||||
config HAVE_C_RECORDMCOUNT
|
||||
bool
|
||||
help
|
||||
|
@ -256,6 +256,9 @@ objtool-args-$(CONFIG_HAVE_JUMP_LABEL_HACK) += --hacks=jump_label
|
||||
objtool-args-$(CONFIG_HAVE_NOINSTR_HACK) += --hacks=noinstr
|
||||
objtool-args-$(CONFIG_X86_KERNEL_IBT) += --ibt
|
||||
objtool-args-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL) += --mcount
|
||||
ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL
|
||||
objtool-args-$(CONFIG_HAVE_OBJTOOL_NOP_MCOUNT) += --mnop
|
||||
endif
|
||||
objtool-args-$(CONFIG_UNWINDER_ORC) += --orc
|
||||
objtool-args-$(CONFIG_RETPOLINE) += --retpoline
|
||||
objtool-args-$(CONFIG_RETHUNK) += --rethunk
|
||||
|
@ -82,6 +82,7 @@ const struct option check_options[] = {
|
||||
OPT_BOOLEAN(0, "dry-run", &opts.dryrun, "don't write modifications"),
|
||||
OPT_BOOLEAN(0, "link", &opts.link, "object is a linked object"),
|
||||
OPT_BOOLEAN(0, "module", &opts.module, "object is part of a kernel module"),
|
||||
OPT_BOOLEAN(0, "mnop", &opts.mnop, "nop out mcount call sites"),
|
||||
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, "stats", &opts.stats, "print statistics"),
|
||||
@ -150,6 +151,16 @@ static bool opts_valid(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool mnop_opts_valid(void)
|
||||
{
|
||||
if (opts.mnop && !opts.mcount) {
|
||||
ERROR("--mnop requires --mcount");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool link_opts_valid(struct objtool_file *file)
|
||||
{
|
||||
if (opts.link)
|
||||
@ -198,6 +209,9 @@ int objtool_run(int argc, const char **argv)
|
||||
if (!file)
|
||||
return 1;
|
||||
|
||||
if (!mnop_opts_valid())
|
||||
return 1;
|
||||
|
||||
if (!link_opts_valid(file))
|
||||
return 1;
|
||||
|
||||
|
@ -1256,18 +1256,19 @@ static void annotate_call_site(struct objtool_file *file,
|
||||
if (opts.mcount && sym->fentry) {
|
||||
if (sibling)
|
||||
WARN_FUNC("Tail call to __fentry__ !?!?", insn->sec, insn->offset);
|
||||
if (opts.mnop) {
|
||||
if (reloc) {
|
||||
reloc->type = R_NONE;
|
||||
elf_write_reloc(file->elf, reloc);
|
||||
}
|
||||
|
||||
if (reloc) {
|
||||
reloc->type = R_NONE;
|
||||
elf_write_reloc(file->elf, reloc);
|
||||
elf_write_insn(file->elf, insn->sec,
|
||||
insn->offset, insn->len,
|
||||
arch_nop_insn(insn->len));
|
||||
|
||||
insn->type = INSN_NOP;
|
||||
}
|
||||
|
||||
elf_write_insn(file->elf, insn->sec,
|
||||
insn->offset, insn->len,
|
||||
arch_nop_insn(insn->len));
|
||||
|
||||
insn->type = INSN_NOP;
|
||||
|
||||
list_add_tail(&insn->call_node, &file->mcount_loc_list);
|
||||
return;
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ struct opts {
|
||||
bool backup;
|
||||
bool dryrun;
|
||||
bool link;
|
||||
bool mnop;
|
||||
bool module;
|
||||
bool no_unreachable;
|
||||
bool sec_address;
|
||||
|
Loading…
Reference in New Issue
Block a user