Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a06bdbf authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Steven Rostedt
Browse files

ftrace/fgraph/x86: Have prepare_ftrace_return() take ip as first parameter

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent f1ab00af
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;
+4 −7
Original line number Diff line number Diff line
@@ -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
@@ -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