ftrace/fgraph/x86: Have prepare_ftrace_return() take ip as first parameter
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Tue, 25 Nov 2014 02:00:34 +0000 (21:00 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Mon, 1 Dec 2014 19:08:58 +0000 (14:08 -0500)
The function graph helper function prepare_ftrace_return() which does the work
to hijack the parent pointer has that parent pointer as its first parameter.
Instead, if we make it the second parameter and have ip as the first parameter
(self_addr), then it can use the %rdi from save_mcount_regs that loads it
already.

Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1411262304010.3961@nanos
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
arch/x86/kernel/ftrace.c
arch/x86/kernel/mcount_64.S

index 60881d9194323271cf4e7760f35b6de7c78853e6..2142376dc8c6ce0a2ea8c5da5e42016545005d8f 100644 (file)
@@ -871,7 +871,7 @@ static void *addr_from_call(void *ptr)
        return ptr + MCOUNT_INSN_SIZE + calc.offset;
 }
 
-void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
+void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent,
                           unsigned long frame_pointer);
 
 /*
@@ -964,7 +964,7 @@ int ftrace_disable_ftrace_graph_caller(void)
  * 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 self_addr, unsigned long *parent,
                           unsigned long frame_pointer)
 {
        unsigned long old;
index ddc766efa1f1f1a9c05b399fbcaaefedfa17d648..94ea120fa21ff7a9de85cc123054e9d2133b2305 100644 (file)
        /*
         * Now %rdi (the first parameter) has the return address of
         * where ftrace_call returns. But the callbacks expect the
-        * the address of the call itself.
+        * address of the call itself.
         */
        subq $MCOUNT_INSN_SIZE, %rdi
        .endm
@@ -289,21 +289,18 @@ END(function_hook)
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 ENTRY(ftrace_graph_caller)
-       /* Saves rbp into %rdx */
+       /* Saves rbp into %rdx and fills first parameter  */
        save_mcount_regs
 
 #ifdef CC_USING_FENTRY
-       leaq MCOUNT_REG_SIZE+8(%rsp), %rdi
+       leaq MCOUNT_REG_SIZE+8(%rsp), %rsi
        movq $0, %rdx   /* No framepointers needed */
 #else
        /* Save address of the return address of traced function */
-       leaq 8(%rdx), %rdi
+       leaq 8(%rdx), %rsi
        /* ftrace does sanity checks against frame pointers */
        movq (%rdx), %rdx
 #endif
-       movq RIP(%rsp), %rsi
-       subq $MCOUNT_INSN_SIZE, %rsi
-
        call    prepare_ftrace_return
 
        restore_mcount_regs