Skip to content

Commit

Permalink
ftrace/fgraph/x86: Have prepare_ftrace_return() take ip as first para…
Browse files Browse the repository at this point in the history
…meter

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>
  • Loading branch information
Steven Rostedt (Red Hat) committed Dec 1, 2014
1 parent f1ab00a commit 6a06bdb
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 9 deletions.
4 changes: 2 additions & 2 deletions arch/x86/kernel/ftrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/*
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 4 additions & 7 deletions arch/x86/kernel/mcount_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
/*
* 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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 6a06bdb

Please sign in to comment.