(Add John F. Reiser in this loop) On 10/23/10, Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > On Fri, 2010-10-22 at 14:10 -0700, David Daney wrote: >> On 10/22/2010 01:58 PM, Wu Zhangjin wrote: >> > From: Wu Zhangjin<wuzhangjin@xxxxxxxxx> >> > >> > In some situations(with related kernel config and gcc options), the >> > modules may have the same address space as the core kernel space, so >> > mcount_regex for modules should also match R_MIPS_26. >> > >> >> I think Steve is rewriting this bit to be a pure C program. Is this >> file even used anymore? If so for how long? > > It's already in mainline, but is only supported for x86 for now. Until > we verify that it works for other archs (which is up to you guys to > verify) the script will still be used. > > Also, I did not write it, John Reiser did. I just cleaned it up a bit > and got it working with the build system. Just applied this tmp patch to try the basic function. diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index ce8af84..3bf1c0c 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -9,6 +9,7 @@ config MIPS select HAVE_FUNCTION_TRACE_MCOUNT_TEST select HAVE_DYNAMIC_FTRACE select HAVE_FTRACE_MCOUNT_RECORD + select HAVE_C_RECORDMCOUNT select HAVE_FUNCTION_GRAPH_TRACER select HAVE_KPROBES select HAVE_KRETPROBES diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c index 26e1271..0fb200f 100644 --- a/scripts/recordmcount.c +++ b/scripts/recordmcount.c @@ -270,6 +270,7 @@ do_file(char const *const fname) case EM_IA_64: reltype = R_IA64_IMM64; gpfx = '_'; break; case EM_PPC: reltype = R_PPC_ADDR32; gpfx = '_'; break; case EM_PPC64: reltype = R_PPC64_ADDR64; gpfx = '_'; break; + case EM_MIPS: reltype = R_MIPS_26; gpfx = '_'; break; case EM_S390: /* reltype: e_class */ gpfx = '_'; break; case EM_SH: reltype = R_SH_DIR32; break; case EM_SPARCV9: reltype = R_SPARC_64; gpfx = '_'; break; (Note: The above patch is not enough, for the modules with -mlong-calls, the reltype should be R_MIPS_HI16, and we may also need to add our specific code for sift_rel_mcount() to get the right location of the _mcount calling site) but failed with the following error: $ make ARCH=mips CROSS_COMPILE=mips64el-unknown-linux-gnu- CHK include/linux/version.h CHK include/generated/utsrelease.h HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc scripts/basic/docproc.c: In function ‘docsect’: scripts/basic/docproc.c:336: warning: ignoring return value of ‘asprintf’, declared with attribute warn_unused_result Checking missing-syscalls for N32 CALL scripts/checksyscalls.sh Checking missing-syscalls for O32 CALL scripts/checksyscalls.sh CC kernel/bounds.s GEN include/generated/bounds.h CC arch/mips/kernel/asm-offsets.s GEN include/generated/asm-offsets.h CALL scripts/checksyscalls.sh CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig MKELF scripts/mod/elfconfig.h HOSTCC scripts/mod/file2alias.o HOSTCC scripts/mod/modpost.o HOSTCC scripts/mod/sumversion.o HOSTLD scripts/mod/modpost HOSTCC scripts/kallsyms HOSTCC scripts/conmakehash HOSTCC scripts/bin2c HOSTCC scripts/recordmcount CC init/main.o /bin/sh: line 1: 21835 Segmentation fault scripts/recordmcount "init/main.o" make[1]: *** [init/main.o] Error 139 make: *** [init] Error 2 I traced the problem and found it was triggered by the 201 line of scripts/recordmcount.h: 198 if (!mcountsym) { 199 Elf_Sym const *const symp = 200 &sym0[ELF_R_SYM(_w(relp->r_info))]; *201 char const *symname = &str0[w(symp->st_name)];* 202 203 if ('.' == symname[0]) 204 ++symname; /* ppc64 hack */ Exactly, it was triggered by: symp->st_name, symp is normal address, i.e. 0xa01831f0, but perhaps the content pointed by this address may not exist or is not allocated before? Did I miss something for MIPS specific support? By the way, because MIPS need to cope with its modules particularly(differ from the module): for kernel: # 10: 03e0082d move at,ra # 14: 0c000000 jal 0 # 14: R_MIPS_26 _mcount --> we record this for MIPS kernel # 14: R_MIPS_NONE *ABS* # 14: R_MIPS_NONE *ABS* # 18: 00020021 nop for module: # c: 3c030000 lui v1,0x0 # c: R_MIPS_HI16 _mcount --> we record this for MIPS module # c: R_MIPS_NONE *ABS* # c: R_MIPS_NONE *ABS* # 10: 64630000 daddiu v1,v1,0 # 10: R_MIPS_LO16 _mcount # 10: R_MIPS_NONE *ABS* # 10: R_MIPS_NONE *ABS* # 14: 03e0082d move at,ra # 18: 0060f809 jalr v1 # label: But I found there was only one argument: /path/to/file.o passed to scripts/recordmount: scripts/Makefile.build 217 cmd_record_mcount = if [ $(@) != "scripts/mod/empty.o" ]; then \ 218 $(objtree)/scripts/recordmcount "$(@)"; \ 219 fi; 220 else So, should we pass "$(if $(part-of-module),1,0)" to the C version of recordmcount? Regards, Wu Zhangjin