Blackfin: support new ftrace frame pointer semantics
authorMike Frysinger <vapier@gentoo.org>
Fri, 22 Jan 2010 12:59:32 +0000 (07:59 -0500)
committerMike Frysinger <vapier@gentoo.org>
Tue, 9 Mar 2010 05:30:50 +0000 (00:30 -0500)
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
arch/blackfin/kernel/ftrace-entry.S
arch/blackfin/kernel/ftrace.c

index db3a51b..d66446b 100644 (file)
@@ -115,9 +115,12 @@ ENTRY(_ftrace_graph_caller)
        [--sp] = r1;
        [--sp] = rets;
 
-       /* prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) */
-       r0 = sp;
-       r1 = rets;
+       /* prepare_ftrace_return(parent, self_addr, frame_pointer) */
+       r0 = sp;        /* unsigned long *parent */
+       r1 = rets;      /* unsigned long self_addr */
+#ifdef CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST
+       r2 = fp;        /* unsigned long frame_pointer */
+#endif
        r0 += 16;       /* skip the 4 local regs on stack */
        r1 += -MCOUNT_INSN_SIZE;
        call _prepare_ftrace_return;
@@ -136,6 +139,9 @@ ENTRY(_return_to_handler)
        [--sp] = r1;
 
        /* get original return address */
+#ifdef CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST
+       r0 = fp;        /* Blackfin is sane, so omit this */
+#endif
        call _ftrace_return_to_handler;
        rets = r0;
 
index f2c85ac..a61d948 100644 (file)
@@ -16,7 +16,8 @@
  * Hook the return address and push it in the stack of return addrs
  * in current thread info.
  */
-void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
+void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
+                           unsigned long frame_pointer)
 {
        struct ftrace_graph_ent trace;
        unsigned long return_hooker = (unsigned long)&return_to_handler;
@@ -24,7 +25,8 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
        if (unlikely(atomic_read(&current->tracing_graph_pause)))
                return;
 
-       if (ftrace_push_return_trace(*parent, self_addr, &trace.depth, 0) == -EBUSY)
+       if (ftrace_push_return_trace(*parent, self_addr, &trace.depth,
+                                    frame_pointer) == -EBUSY)
                return;
 
        trace.func = self_addr;