sh: ftrace support.
authorPaul Mundt <lethal@linux-sh.org>
Sun, 21 Sep 2008 07:43:45 +0000 (16:43 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Sun, 21 Sep 2008 07:43:45 +0000 (16:43 +0900)
This adds support for ftrace to SH. This only includes CONFIG_FTRACE,
and does not handle dynamic ftrace presently.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/Kconfig
arch/sh/boot/compressed/Makefile_32
arch/sh/kernel/entry-common.S
arch/sh/kernel/sh_ksyms_32.c

index adef42cd507fba89d1b11f7253544b1a24e4b5da..38a5a9edb677e933cab3ce8fece83302ab62bedc 100644 (file)
@@ -24,6 +24,7 @@ config SUPERH32
        select HAVE_KPROBES
        select HAVE_KRETPROBES
        select HAVE_ARCH_TRACEHOOK if !SH_FPU
+       select HAVE_FTRACE
 
 config SUPERH64
        def_bool y if CPU_SH5
index 47685f618ae748e504bc76a99a5f3a8b822f6534..301e6d503256da66d3e27a84ddec76d2dbe8957e 100644 (file)
@@ -23,6 +23,11 @@ IMAGE_OFFSET := $(shell /bin/bash -c 'printf "0x%08x" \
 
 LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
 
+ifeq ($(CONFIG_FTRACE),y)
+ORIG_CFLAGS := $(KBUILD_CFLAGS)
+KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
+endif
+
 LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup -T $(obj)/../../kernel/vmlinux.lds
 
 $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE
index efbb4268875e3a2b1fc43de0789b08b834cf2b3e..1a5cf9dd82dee327031d8461cbbd184c43c85758 100644 (file)
@@ -371,3 +371,47 @@ syscall_exit:
 #endif
 7:     .long   do_syscall_trace_enter
 8:     .long   do_syscall_trace_leave
+
+#ifdef CONFIG_FTRACE
+       .align 2
+       .globl  _mcount
+       .type   _mcount,@function
+       .globl  mcount
+       .type   mcount,@function
+_mcount:
+mcount:
+       mov.l   r4, @-r15
+       mov.l   r5, @-r15
+       mov.l   r6, @-r15
+       mov.l   r7, @-r15
+       sts.l   pr, @-r15
+
+       mov.l   @(20,r15),r4
+       sts     pr, r5
+
+       mov.l   1f, r6
+       mov.l   ftrace_stub, r7 
+       cmp/eq  r6, r7
+       bt      skip_trace
+
+       mov.l   @r6, r6
+       jsr     @r6
+        nop
+
+skip_trace:
+
+       lds.l   @r15+, pr
+       mov.l   @r15+, r7
+       mov.l   @r15+, r6
+       mov.l   @r15+, r5
+       rts
+        mov.l  @r15+, r4
+
+       .align 2
+1:     .long   ftrace_trace_function
+
+       .globl  ftrace_stub
+ftrace_stub:
+       rts
+        nop
+#endif /* CONFIG_FTRACE */
index 6e1b1c2716584a8bc79ab206098465029a700eea..d917b7b4042bcb81ce8c2a1219e099b95a3feea1 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/delay.h>
 #include <asm/tlbflush.h>
 #include <asm/cacheflush.h>
+#include <asm/ftrace.h>
 
 extern int dump_fpu(struct pt_regs *, elf_fpregset_t *);
 extern struct hw_interrupt_type no_irq_type;
@@ -133,6 +134,9 @@ EXPORT_SYMBOL(__flush_purge_region);
 EXPORT_SYMBOL(clear_user_page);
 #endif
 
+#ifdef CONFIG_FTRACE
+EXPORT_SYMBOL(mcount);
+#endif
 EXPORT_SYMBOL(csum_partial);
 EXPORT_SYMBOL(csum_partial_copy_generic);
 #ifdef CONFIG_IPV6