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

Commit e17ff5fe authored by Wu Zhangjin's avatar Wu Zhangjin Committed by Ralf Baechle
Browse files

MIPS: Tracing: Add dynamic function graph tracer for MIPS



This patch make function graph tracer work with dynamic function tracer.

To share the source code of dynamic function tracer(MCOUNT_SAVE_REGS),
and avoid restoring the whole saved registers, we need to restore the ra
register from the stack.

(NOTE: This not work with 32bit! need to ensure why!)

Signed-off-by: default avatarWu Zhangjin <wuzhangjin@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Nicholas Mc Guire <der.herr@hofr.at>
Cc: zhangfx@lemote.com
Cc: Wu Zhangjin <wuzhangjin@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: linux-kernel@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: http://patchwork.linux-mips.org/patch/678/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 29c5d346
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -115,6 +115,27 @@ int __init ftrace_dyn_arch_init(void *data)

#ifdef CONFIG_FUNCTION_GRAPH_TRACER

#ifdef CONFIG_DYNAMIC_FTRACE

extern void ftrace_graph_call(void);
#define JMP	0x08000000	/* jump to target directly */
#define CALL_FTRACE_GRAPH_CALLER \
	jump_insn_encode(JMP, (unsigned long)(&ftrace_graph_caller))
#define FTRACE_GRAPH_CALL_IP	((unsigned long)(&ftrace_graph_call))

int ftrace_enable_ftrace_graph_caller(void)
{
	return ftrace_modify_code(FTRACE_GRAPH_CALL_IP,
				  CALL_FTRACE_GRAPH_CALLER);
}

int ftrace_disable_ftrace_graph_caller(void)
{
	return ftrace_modify_code(FTRACE_GRAPH_CALL_IP, ftrace_nop);
}

#endif				/* !CONFIG_DYNAMIC_FTRACE */

#define S_RA_SP	(0xafbf << 16)	/* s{d,w} ra, offset(sp) */
#define S_R_SP	(0xafb0 << 16)  /* s{d,w} R, offset(sp) */
#define OFFSET_MASK	0xffff	/* stack offset range: 0 ~ PT_SIZE */
+12 −2
Original line number Diff line number Diff line
@@ -77,6 +77,13 @@ ftrace_call:
	nop	/* a placeholder for the call to a real tracing function */
	 move	a1, AT		/* arg2: the caller's next ip, parent */

#ifdef CONFIG_FUNCTION_GRAPH_TRACER
	.globl ftrace_graph_call
ftrace_graph_call:
	nop
	 nop
#endif

	MCOUNT_RESTORE_REGS
	.globl ftrace_stub
ftrace_stub:
@@ -124,10 +131,13 @@ ftrace_stub:
#ifdef CONFIG_FUNCTION_GRAPH_TRACER

NESTED(ftrace_graph_caller, PT_SIZE, ra)
#ifdef CONFIG_DYNAMIC_FTRACE
	PTR_L	a1, PT_R31(sp)	/* load the original ra from the stack */
#else
	MCOUNT_SAVE_REGS

	PTR_LA	a0, PT_R1(sp)	/* arg1: &AT -> a0 */
	move	a1, ra		/* arg2: next ip, selfaddr */
#endif
	PTR_LA	a0, PT_R1(sp)	/* arg1: &AT -> a0 */
	jal	prepare_ftrace_return
	 move	a2, fp		/* arg3: frame pointer */