diff options
Diffstat (limited to 'arch/x86/include/asm')
-rw-r--r-- | arch/x86/include/asm/ftrace.h | 26 | ||||
-rw-r--r-- | arch/x86/include/asm/thread_info.h | 24 |
2 files changed, 50 insertions, 0 deletions
diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index f8173ed1c97..9b6a1fa19e7 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h | |||
@@ -20,4 +20,30 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) | |||
20 | #endif /* __ASSEMBLY__ */ | 20 | #endif /* __ASSEMBLY__ */ |
21 | #endif /* CONFIG_FUNCTION_TRACER */ | 21 | #endif /* CONFIG_FUNCTION_TRACER */ |
22 | 22 | ||
23 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
24 | #define FTRACE_RET_STACK_SIZE 20 | ||
25 | |||
26 | #ifndef __ASSEMBLY__ | ||
27 | |||
28 | /* | ||
29 | * Stack of return addresses for functions | ||
30 | * of a thread. | ||
31 | * Used in struct thread_info | ||
32 | */ | ||
33 | struct ftrace_ret_stack { | ||
34 | unsigned long ret; | ||
35 | unsigned long func; | ||
36 | unsigned long long calltime; | ||
37 | }; | ||
38 | |||
39 | /* | ||
40 | * Primary handler of a function return. | ||
41 | * It relays on ftrace_return_to_handler. | ||
42 | * Defined in entry32.S | ||
43 | */ | ||
44 | extern void return_to_handler(void); | ||
45 | |||
46 | #endif /* __ASSEMBLY__ */ | ||
47 | #endif /* CONFIG_FUNCTION_RET_TRACER */ | ||
48 | |||
23 | #endif /* _ASM_X86_FTRACE_H */ | 49 | #endif /* _ASM_X86_FTRACE_H */ |
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) |