mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 04:42:12 +00:00
microblaze: ftrace: Add dynamic function graph tracer
This patch add support for dynamic function graph tracer. There is one my expactation that I can do flush_icache after all code modification. On microblaze is this safer than do flush for every entry. For icache is used name flush but correct should be invalidation - this will be fix in upcomming new cache implementaion and WB support. Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
parent
a0d3e66522
commit
4f911b0daf
@ -206,4 +206,32 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
|
unsigned int old_jump; /* saving place for jump instruction */
|
||||||
|
|
||||||
|
int ftrace_enable_ftrace_graph_caller(void)
|
||||||
|
{
|
||||||
|
unsigned int ret;
|
||||||
|
unsigned long ip = (unsigned long)(&ftrace_call_graph);
|
||||||
|
|
||||||
|
old_jump = *(unsigned int *)ip; /* save jump over instruction */
|
||||||
|
ret = ftrace_modify_code(ip, MICROBLAZE_NOP);
|
||||||
|
flush_icache();
|
||||||
|
|
||||||
|
pr_debug("%s: Replace instruction: 0x%x\n", __func__, old_jump);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ftrace_disable_ftrace_graph_caller(void)
|
||||||
|
{
|
||||||
|
unsigned int ret;
|
||||||
|
unsigned long ip = (unsigned long)(&ftrace_call_graph);
|
||||||
|
|
||||||
|
ret = ftrace_modify_code(ip, old_jump);
|
||||||
|
flush_icache();
|
||||||
|
|
||||||
|
pr_debug("%s\n", __func__);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||||
|
@ -97,6 +97,7 @@ ENTRY(ftrace_caller)
|
|||||||
nop;
|
nop;
|
||||||
/* MS: HAVE_FUNCTION_TRACE_MCOUNT_TEST end of checking */
|
/* MS: HAVE_FUNCTION_TRACE_MCOUNT_TEST end of checking */
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
|
#ifndef CONFIG_DYNAMIC_FTRACE
|
||||||
lwi r5, r0, ftrace_graph_return;
|
lwi r5, r0, ftrace_graph_return;
|
||||||
addik r6, r0, ftrace_stub; /* asm implementation */
|
addik r6, r0, ftrace_stub; /* asm implementation */
|
||||||
cmpu r5, r5, r6; /* ftrace_graph_return != ftrace_stub */
|
cmpu r5, r5, r6; /* ftrace_graph_return != ftrace_stub */
|
||||||
@ -108,6 +109,11 @@ ENTRY(ftrace_caller)
|
|||||||
cmpu r5, r5, r6; /* ftrace_graph_entry != ftrace_graph_entry_stub */
|
cmpu r5, r5, r6; /* ftrace_graph_entry != ftrace_graph_entry_stub */
|
||||||
beqid r5, end_graph_tracer;
|
beqid r5, end_graph_tracer;
|
||||||
nop;
|
nop;
|
||||||
|
#else /* CONFIG_DYNAMIC_FTRACE */
|
||||||
|
NOALIGN_ENTRY(ftrace_call_graph)
|
||||||
|
/* MS: jump over graph function - replaced from C code */
|
||||||
|
bri end_graph_tracer
|
||||||
|
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||||
addik r5, r1, 120; /* MS: load parent addr */
|
addik r5, r1, 120; /* MS: load parent addr */
|
||||||
addik r6, r15, 0; /* MS: load current function addr */
|
addik r6, r15, 0; /* MS: load current function addr */
|
||||||
bralid r15, prepare_ftrace_return;
|
bralid r15, prepare_ftrace_return;
|
||||||
|
Loading…
Reference in New Issue
Block a user