Re: [RFC PATCH 3/3] objtool/mcount: Add powerpc specific functions
From: Naveen N. Rao <hidden>
Date: 2022-03-21 06:26:43
Also in:
lkml
Peter Zijlstra wrote:
On Fri, Mar 18, 2022 at 04:21:40PM +0530, Sathvika Vasireddy wrote:quoted
This patch adds powerpc specific functions required for 'objtool mcount' to work, and enables mcount for ppc.I would love to see more objtool enablement for Power :-)quoted
diff --git a/tools/objtool/arch/powerpc/include/arch/elf.h b/tools/objtool/arch/powerpc/include/arch/elf.h new file mode 100644 index 000000000000..3c8ebb7d2a6b --- /dev/null +++ b/tools/objtool/arch/powerpc/include/arch/elf.h@@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef _OBJTOOL_ARCH_ELF +#define _OBJTOOL_ARCH_ELF + +#define R_NONE R_PPC_NONE + +#endif /* _OBJTOOL_ARCH_ELF */diff --git a/tools/objtool/utils.c b/tools/objtool/utils.c index d1fc6a123a6e..c9c14fa0dfd7 100644 --- a/tools/objtool/utils.c +++ b/tools/objtool/utils.c@@ -179,11 +179,29 @@ int create_mcount_loc_sections(struct objtool_file *file) loc = (unsigned long *)sec->data->d_buf + idx; memset(loc, 0, sizeof(unsigned long)); - if (elf_add_reloc_to_insn(file->elf, sec, - idx * sizeof(unsigned long), - R_X86_64_64, - insn->sec, insn->offset)) - return -1; + if (file->elf->ehdr.e_machine == EM_X86_64) { + if (elf_add_reloc_to_insn(file->elf, sec, + idx * sizeof(unsigned long), + R_X86_64_64, + insn->sec, insn->offset)) + return -1; + } + + if (file->elf->ehdr.e_machine == EM_PPC64) { + if (elf_add_reloc_to_insn(file->elf, sec, + idx * sizeof(unsigned long), + R_PPC64_ADDR64, + insn->sec, insn->offset)) + return -1; + } + + if (file->elf->ehdr.e_machine == EM_PPC) { + if (elf_add_reloc_to_insn(file->elf, sec, + idx * sizeof(unsigned long), + R_PPC_ADDR32, + insn->sec, insn->offset)) + return -1; + }It appears to me that repeating this code 3 times doesn't really scale well, how about we introduce a helper like: int elf_reloc_type_long(struct elf *elf) { switch (elf->ehdr.e_machine) { case EM_X86_64: return R_X86_64_64; case EM_PPC64: return R_PPC64_ADDR64; case EM_PPC: return R_PPC_ADDR32; default: WARN("unknown machine...") exit(-1); } } if (elf_add_reloc_to_insn(file->elf, sec, idx * sizeof(unsigned long), elf_reloc_type_long(file->elf), insn->sec, insn->offset)) return -1;
Good point. I suppose we'll need a similar helper, say, elf_reloc_type_none(), to replace R_NONE usage if we want to have objtool work for cross-arch builds. - Naveen