diff options
Diffstat (limited to 'arch/x86/include/asm/stacktrace.h')
| -rw-r--r-- | arch/x86/include/asm/stacktrace.h | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h index 2b16a2ad23dc..52b5c7ed3608 100644 --- a/arch/x86/include/asm/stacktrace.h +++ b/arch/x86/include/asm/stacktrace.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #define _ASM_X86_STACKTRACE_H | 7 | #define _ASM_X86_STACKTRACE_H |
| 8 | 8 | ||
| 9 | #include <linux/uaccess.h> | 9 | #include <linux/uaccess.h> |
| 10 | #include <linux/ptrace.h> | ||
| 10 | 11 | ||
| 11 | extern int kstack_depth_to_print; | 12 | extern int kstack_depth_to_print; |
| 12 | 13 | ||
| @@ -46,7 +47,7 @@ struct stacktrace_ops { | |||
| 46 | }; | 47 | }; |
| 47 | 48 | ||
| 48 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, | 49 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, |
| 49 | unsigned long *stack, unsigned long bp, | 50 | unsigned long *stack, |
| 50 | const struct stacktrace_ops *ops, void *data); | 51 | const struct stacktrace_ops *ops, void *data); |
| 51 | 52 | ||
| 52 | #ifdef CONFIG_X86_32 | 53 | #ifdef CONFIG_X86_32 |
| @@ -57,13 +58,39 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, | |||
| 57 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) | 58 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) |
| 58 | #endif | 59 | #endif |
| 59 | 60 | ||
| 61 | #ifdef CONFIG_FRAME_POINTER | ||
| 62 | static inline unsigned long | ||
| 63 | stack_frame(struct task_struct *task, struct pt_regs *regs) | ||
| 64 | { | ||
| 65 | unsigned long bp; | ||
| 66 | |||
| 67 | if (regs) | ||
| 68 | return regs->bp; | ||
| 69 | |||
| 70 | if (task == current) { | ||
| 71 | /* Grab bp right from our regs */ | ||
| 72 | get_bp(bp); | ||
| 73 | return bp; | ||
| 74 | } | ||
| 75 | |||
| 76 | /* bp is the last reg pushed by switch_to */ | ||
| 77 | return *(unsigned long *)task->thread.sp; | ||
| 78 | } | ||
| 79 | #else | ||
| 80 | static inline unsigned long | ||
| 81 | stack_frame(struct task_struct *task, struct pt_regs *regs) | ||
| 82 | { | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | #endif | ||
| 86 | |||
| 60 | extern void | 87 | extern void |
| 61 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | 88 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 62 | unsigned long *stack, unsigned long bp, char *log_lvl); | 89 | unsigned long *stack, char *log_lvl); |
| 63 | 90 | ||
| 64 | extern void | 91 | extern void |
| 65 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 92 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 66 | unsigned long *sp, unsigned long bp, char *log_lvl); | 93 | unsigned long *sp, char *log_lvl); |
| 67 | 94 | ||
| 68 | extern unsigned int code_bytes; | 95 | extern unsigned int code_bytes; |
| 69 | 96 | ||
