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/sched.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/sched.h')
-rw-r--r-- | include/linux/sched.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 295b7c756ca6..df77abe860c9 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2005,6 +2005,17 @@ static inline void setup_thread_stack(struct task_struct *p, struct task_struct | |||
2005 | { | 2005 | { |
2006 | *task_thread_info(p) = *task_thread_info(org); | 2006 | *task_thread_info(p) = *task_thread_info(org); |
2007 | task_thread_info(p)->task = p; | 2007 | task_thread_info(p)->task = p; |
2008 | |||
2009 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
2010 | /* | ||
2011 | * When fork() creates a child process, this function is called. | ||
2012 | * But the child task may not inherit the return adresses traced | ||
2013 | * by the return function tracer because it will directly execute | ||
2014 | * in userspace and will not return to kernel functions its parent | ||
2015 | * used. | ||
2016 | */ | ||
2017 | task_thread_info(p)->curr_ret_stack = -1; | ||
2018 | #endif | ||
2008 | } | 2019 | } |
2009 | 2020 | ||
2010 | static inline unsigned long *end_of_stack(struct task_struct *p) | 2021 | static inline unsigned long *end_of_stack(struct task_struct *p) |