2 * Low-level ftrace handling
4 * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
5 * Copyright (C) 2009 PetaLogix
7 * This file is subject to the terms and conditions of the GNU General
8 * Public License. See the file COPYING in the main directory of this
9 * archive for more details.
12 #include <linux/linkage.h>
14 #define NOALIGN_ENTRY(name) .globl name; name:
16 /* FIXME MS: I think that I don't need to save all regs */
49 #define RESTORE_REGS \
86 #ifdef CONFIG_DYNAMIC_FTRACE
88 /* MS: It is just barrier which is removed from C code */
91 #endif /* CONFIG_DYNAMIC_FTRACE */
94 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
95 #ifndef CONFIG_DYNAMIC_FTRACE
96 lwi r5, r0, ftrace_graph_return;
97 addik r6, r0, ftrace_stub; /* asm implementation */
98 cmpu r5, r5, r6; /* ftrace_graph_return != ftrace_stub */
99 beqid r5, end_graph_tracer;
102 lwi r6, r0, ftrace_graph_entry;
103 addik r5, r0, ftrace_graph_entry_stub; /* implemented in C */
104 cmpu r5, r5, r6; /* ftrace_graph_entry != ftrace_graph_entry_stub */
105 beqid r5, end_graph_tracer;
107 #else /* CONFIG_DYNAMIC_FTRACE */
108 NOALIGN_ENTRY(ftrace_call_graph)
109 /* MS: jump over graph function - replaced from C code */
111 #endif /* CONFIG_DYNAMIC_FTRACE */
112 addik r5, r1, 120; /* MS: load parent addr */
113 addik r6, r15, 0; /* MS: load current function addr */
114 bralid r15, prepare_ftrace_return;
116 /* MS: graph was taken that's why - can jump over function trace */
120 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
121 #ifndef CONFIG_DYNAMIC_FTRACE
122 /* MS: test function trace if is taken or not */
123 lwi r20, r0, ftrace_trace_function;
124 addik r6, r0, ftrace_stub;
125 cmpu r5, r20, r6; /* ftrace_trace_function != ftrace_stub */
126 beqid r5, end; /* MS: not taken -> jump over */
128 #else /* CONFIG_DYNAMIC_FTRACE */
129 NOALIGN_ENTRY(ftrace_call)
130 /* instruction for setup imm FUNC_part1, addik r20, r0, FUNC_part2 */
133 #endif /* CONFIG_DYNAMIC_FTRACE */
134 /* static normal trace */
135 lwi r6, r1, 120; /* MS: load parent addr */
136 addik r5, r15, -4; /* MS: load current function addr */
137 /* MS: here is dependency on previous code */
138 brald r15, r20; /* MS: jump to ftrace handler */
144 rtsd r15, 8; /* MS: jump back */
147 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
148 ENTRY(return_to_handler)
149 nop; /* MS: just barrier for rtsd r15, 8 */
154 /* MS: find out returning address */
155 bralid r15, ftrace_return_to_handler;
158 /* MS: return value from ftrace_return_to_handler is my returning addr
159 * must be before restore regs because I have to restore r3 content */
163 rtsd r15, 8; /* MS: jump back */
165 #endif /* CONFIG_FUNCTION_TRACER */