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 /arch/x86/include/asm/thread_info.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 'arch/x86/include/asm/thread_info.h')
-rw-r--r-- | arch/x86/include/asm/thread_info.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index e44d379faad..a71158369fd 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -20,6 +20,7 @@ | |||
20 | struct task_struct; | 20 | struct task_struct; |
21 | struct exec_domain; | 21 | struct exec_domain; |
22 | #include <asm/processor.h> | 22 | #include <asm/processor.h> |
23 | #include <asm/ftrace.h> | ||
23 | 24 | ||
24 | struct thread_info { | 25 | struct thread_info { |
25 | struct task_struct *task; /* main task structure */ | 26 | struct task_struct *task; /* main task structure */ |
@@ -38,8 +39,30 @@ struct thread_info { | |||
38 | */ | 39 | */ |
39 | __u8 supervisor_stack[0]; | 40 | __u8 supervisor_stack[0]; |
40 | #endif | 41 | #endif |
42 | |||
43 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
44 | /* Index of current stored adress in ret_stack */ | ||
45 | int curr_ret_stack; | ||
46 | /* Stack of return addresses for return function tracing */ | ||
47 | struct ftrace_ret_stack ret_stack[FTRACE_RET_STACK_SIZE]; | ||
48 | #endif | ||
41 | }; | 49 | }; |
42 | 50 | ||
51 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
52 | #define INIT_THREAD_INFO(tsk) \ | ||
53 | { \ | ||
54 | .task = &tsk, \ | ||
55 | .exec_domain = &default_exec_domain, \ | ||
56 | .flags = 0, \ | ||
57 | .cpu = 0, \ | ||
58 | .preempt_count = 1, \ | ||
59 | .addr_limit = KERNEL_DS, \ | ||
60 | .restart_block = { \ | ||
61 | .fn = do_no_restart_syscall, \ | ||
62 | }, \ | ||
63 | .curr_ret_stack = -1,\ | ||
64 | } | ||
65 | #else | ||
43 | #define INIT_THREAD_INFO(tsk) \ | 66 | #define INIT_THREAD_INFO(tsk) \ |
44 | { \ | 67 | { \ |
45 | .task = &tsk, \ | 68 | .task = &tsk, \ |
@@ -52,6 +75,7 @@ struct thread_info { | |||
52 | .fn = do_no_restart_syscall, \ | 75 | .fn = do_no_restart_syscall, \ |
53 | }, \ | 76 | }, \ |
54 | } | 77 | } |
78 | #endif | ||
55 | 79 | ||
56 | #define init_thread_info (init_thread_union.thread_info) | 80 | #define init_thread_info (init_thread_union.thread_info) |
57 | #define init_stack (init_thread_union.stack) | 81 | #define init_stack (init_thread_union.stack) |