On Sun, 2010-10-24 at 02:53 +0800, wu zhangjin wrote: > (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)];* I merged the 32bit and 64bit here. It may be my fault on this one ;-) I'll look into it on Monday. Thanks, -- Steve > 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