diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2008-11-11 01:03:45 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-11 04:29:11 -0500 |
commit | caf4b323b02a16c92fba449952ac6515ddc76d7a (patch) | |
tree | 6fc234d00faca192248344996a168afb253e5f40 /include/linux/ftrace.h | |
parent | d844222a54c33a960755b44b934cd1b01b05dceb (diff) |
tracing, x86: add low level support for ftrace return tracing
Impact: add infrastructure for function-return tracing
Add low level support for ftrace return tracing.
This plug-in stores return addresses on the thread_info structure of
the current task.
The index of the current return address is initialized when the task
is the first one (init) and when a process forks (the child). It is
not needed when a task does a sys_execve because after this syscall,
it still needs to return on the kernel functions it called.
Note that the code of return_to_handler has been suggested by Steven
Rostedt as almost all of the ideas of improvements in this V3.
For purpose of security, arch/x86/kernel/process_32.c is not traced
because __switch_to() changes the current task during its execution.
That could cause inconsistency in the stored return address of this
function even if I didn't have any crash after testing with tracing on
this function enabled.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux/ftrace.h')
-rw-r--r-- | include/linux/ftrace.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 1f5608c11023..dcbbf72a88b1 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -268,6 +268,26 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { } | |||
268 | 268 | ||
269 | 269 | ||
270 | /* | 270 | /* |
271 | * Structure that defines a return function trace. | ||
272 | */ | ||
273 | struct ftrace_retfunc { | ||
274 | unsigned long ret; /* Return address */ | ||
275 | unsigned long func; /* Current function */ | ||
276 | unsigned long long calltime; | ||
277 | unsigned long long rettime; | ||
278 | }; | ||
279 | |||
280 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
281 | /* Type of a callback handler of tracing return function */ | ||
282 | typedef void (*trace_function_return_t)(struct ftrace_retfunc *); | ||
283 | |||
284 | extern void register_ftrace_return(trace_function_return_t func); | ||
285 | /* The current handler in use */ | ||
286 | extern trace_function_return_t ftrace_function_return; | ||
287 | extern void unregister_ftrace_return(void); | ||
288 | #endif | ||
289 | |||
290 | /* | ||
271 | * Structure which defines the trace of an initcall. | 291 | * Structure which defines the trace of an initcall. |
272 | * You don't have to fill the func field since it is | 292 | * You don't have to fill the func field since it is |
273 | * only used internally by the tracer. | 293 | * only used internally by the tracer. |