Re: [PATCH v9 04/10] tracing: add dynamic function tracer supportfor MIPS

From: Steven Rostedt
Date: Thu Dec 03 2009 - 12:55:00 EST


On Fri, 2009-11-20 at 20:34 +0800, Wu Zhangjin wrote:
> From: Wu Zhangjin <wuzhangjin@xxxxxxxxx>
>

> Signed-off-by: Wu Zhangjin <wuzhangjin@xxxxxxxxx>
> ---
> arch/mips/Kconfig | 2 +
> arch/mips/include/asm/ftrace.h | 9 +++
> arch/mips/kernel/Makefile | 3 +-
> arch/mips/kernel/ftrace.c | 112 ++++++++++++++++++++++++++++++++++++++++
> arch/mips/kernel/mcount.S | 29 ++++++++++


> scripts/recordmcount.pl | 54 +++++++++++++++++++


> 6 files changed, 208 insertions(+), 1 deletions(-)
> create mode 100644 arch/mips/kernel/ftrace.c
>



> diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
> index 24604d4..9d80d0d 100755
> --- a/scripts/recordmcount.pl
> +++ b/scripts/recordmcount.pl
> @@ -295,6 +295,60 @@ if ($arch eq "x86_64") {
> $ld .= " -m elf64_sparc";
> $cc .= " -m64";
> $objcopy .= " -O elf64-sparc";
> +
> +} elsif ($arch eq "mips") {
> + # To enable module support, we need to enable the -mlong-calls option
> + # of gcc for module, after using this option, we can not get the real
> + # offset of the calling to _mcount, but the offset of the lui
> + # instruction or the addiu one. herein, we record the address of the
> + # first one, and then we can replace this instruction by a branch
> + # instruction to jump over the profiling function to filter the
> + # indicated functions, or swith back to the lui instruction to trace
> + # them, which means dynamic tracing.
> + #
> + # c: 3c030000 lui v1,0x0
> + # c: R_MIPS_HI16 _mcount
> + # 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
> + #
> + # for the kernel:
> + #
> + # 10: 03e0082d move at,ra
> + # 14: 0c000000 jal 0 <loongson_halt>
> + # 14: R_MIPS_26 _mcount
> + # 14: R_MIPS_NONE *ABS*
> + # 14: R_MIPS_NONE *ABS*
> + # 18: 00020021 nop
> + if ($is_module eq "0") {
> + $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$";
> + } else {
> + $mcount_regex = "^\\s*([0-9a-fA-F]+): R_MIPS_HI16\\s+_mcount\$";
> + }
> + $objdump .= " -Melf-trad".$endian."mips ";
> +
> + if ($endian eq "big") {
> + $endian = " -EB ";
> + $ld .= " -melf".$bits."btsmip";
> + } else {
> + $endian = " -EL ";
> + $ld .= " -melf".$bits."ltsmip";
> + }
> +
> + $cc .= " -mno-abicalls -fno-pic -mabi=" . $bits . $endian;
> + $ld .= $endian;
> +
> + if ($bits == 64) {
> + $function_regex =
> + "^([0-9a-fA-F]+)\\s+<(.|[^\$]L.*?|\$[^L].*?|[^\$][^L].*?)>:";
> + $type = ".dword";
> + }
> +
> } else {
> die "Arch $arch is not supported with CONFIG_FTRACE_MCOUNT_RECORD";
> }

This only adds MIPS arch support to recordmcount.pl, and does not touch
any other arch or generic code. Thus, I consider this arch specific
code.

Acked-by: Steven Rostedt <rostedt@xxxxxxxxxxx>

-- Steve


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/