On Tue, 2008-12-23 at 14:08 +0800, Shaohua Li wrote: > In IA64, a function pointer isn't a 'unsigned long' but a > 'struct {unsigned long ip, unsigned long gp}'. MCOUNT_ADDR is determined > at link time not compile time, so explictly ignore kernel/trace/ftrace.o > in recordmcount.pl. > > Signed-off-by: Shaohua Li <shaohua.li@xxxxxxxxx> > --- > kernel/trace/ftrace.c | 10 +--------- > scripts/recordmcount.pl | 5 +++++ > 2 files changed, 6 insertions(+), 9 deletions(-) > > Index: linux/kernel/trace/ftrace.c > =================================================================== > --- linux.orig/kernel/trace/ftrace.c 2008-12-23 13:11:28.000000000 +0800 > +++ linux/kernel/trace/ftrace.c 2008-12-23 13:24:59.000000000 +0800 > @@ -263,14 +263,6 @@ static void ftrace_update_pid_func(void) > # error Dynamic ftrace depends on MCOUNT_RECORD > #endif > > -/* > - * Since MCOUNT_ADDR may point to mcount itself, we do not want > - * to get it confused by reading a reference in the code as we > - * are parsing on objcopy output of text. Use a variable for > - * it instead. > - */ > -static unsigned long mcount_addr = MCOUNT_ADDR; > - > enum { > FTRACE_ENABLE_CALLS = (1 << 0), > FTRACE_DISABLE_CALLS = (1 << 1), > @@ -575,7 +567,7 @@ ftrace_code_disable(struct module *mod, > > ip = rec->ip; > > - ret = ftrace_make_nop(mod, rec, mcount_addr); > + ret = ftrace_make_nop(mod, rec, MCOUNT_ADDR); This change will make dynamic ftrace fail on other archs (ppc and x86). Please read the comment you deleted. By using MCOUNT_ADDR directly in the code, you will create a reference to mcount in a text section that will confuse recordmcount.pl. It will think this reference is a call to mcount and when it tries to modify it, it will fail because the code is not a call. -- Steve > if (ret) { > ftrace_bug(ret, ip); > rec->flags |= FTRACE_FL_FAILED; > Index: linux/scripts/recordmcount.pl > =================================================================== > --- linux.orig/scripts/recordmcount.pl 2008-12-23 13:24:38.000000000 +0800 > +++ linux/scripts/recordmcount.pl 2008-12-23 13:24:59.000000000 +0800 > @@ -109,6 +109,11 @@ if ($#ARGV < 7) { > my ($arch, $bits, $objdump, $objcopy, $cc, > $ld, $nm, $rm, $mv, $is_module, $inputfile) = @ARGV; > > +# This file refers to mcount and shouldn't be ftraced, so lets' ignore it > +if ($inputfile eq "kernel/trace/ftrace.o") { > + exit(0); > +} > + > # Acceptable sections to record. > my %text_sections = ( > ".text" => 1, > > -- To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |