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;
|
||||
}
|
||||
|
||||
#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 */
|
||||
|
@ -97,6 +97,7 @@ ENTRY(ftrace_caller)
|
||||
nop;
|
||||
/* MS: HAVE_FUNCTION_TRACE_MCOUNT_TEST end of checking */
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
#ifndef CONFIG_DYNAMIC_FTRACE
|
||||
lwi r5, r0, ftrace_graph_return;
|
||||
addik r6, r0, ftrace_stub; /* asm implementation */
|
||||
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 */
|
||||
beqid r5, end_graph_tracer;
|
||||
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 r6, r15, 0; /* MS: load current function addr */
|
||||
bralid r15, prepare_ftrace_return;
|
||||
|
Loading…
Reference in New Issue
Block a user