diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack_32.c')
| -rw-r--r-- | arch/x86/kernel/dumpstack_32.c | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index 1bc7f75a5bda..74cc1eda384b 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
| @@ -17,11 +17,12 @@ | |||
| 17 | #include <asm/stacktrace.h> | 17 | #include <asm/stacktrace.h> |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | void dump_trace(struct task_struct *task, struct pt_regs *regs, | 20 | void dump_trace(struct task_struct *task, |
| 21 | unsigned long *stack, unsigned long bp, | 21 | struct pt_regs *regs, unsigned long *stack, |
| 22 | const struct stacktrace_ops *ops, void *data) | 22 | const struct stacktrace_ops *ops, void *data) |
| 23 | { | 23 | { |
| 24 | int graph = 0; | 24 | int graph = 0; |
| 25 | unsigned long bp; | ||
| 25 | 26 | ||
| 26 | if (!task) | 27 | if (!task) |
| 27 | task = current; | 28 | task = current; |
| @@ -34,18 +35,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 34 | stack = (unsigned long *)task->thread.sp; | 35 | stack = (unsigned long *)task->thread.sp; |
| 35 | } | 36 | } |
| 36 | 37 | ||
| 37 | #ifdef CONFIG_FRAME_POINTER | 38 | bp = stack_frame(task, regs); |
| 38 | if (!bp) { | ||
| 39 | if (task == current) { | ||
| 40 | /* Grab bp right from our regs */ | ||
| 41 | get_bp(bp); | ||
| 42 | } else { | ||
| 43 | /* bp is the last reg pushed by switch_to */ | ||
| 44 | bp = *(unsigned long *) task->thread.sp; | ||
| 45 | } | ||
| 46 | } | ||
| 47 | #endif | ||
| 48 | |||
| 49 | for (;;) { | 39 | for (;;) { |
| 50 | struct thread_info *context; | 40 | struct thread_info *context; |
| 51 | 41 | ||
| @@ -65,7 +55,7 @@ EXPORT_SYMBOL(dump_trace); | |||
| 65 | 55 | ||
| 66 | void | 56 | void |
| 67 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 57 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 68 | unsigned long *sp, unsigned long bp, char *log_lvl) | 58 | unsigned long *sp, char *log_lvl) |
| 69 | { | 59 | { |
| 70 | unsigned long *stack; | 60 | unsigned long *stack; |
| 71 | int i; | 61 | int i; |
| @@ -87,7 +77,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 87 | touch_nmi_watchdog(); | 77 | touch_nmi_watchdog(); |
| 88 | } | 78 | } |
| 89 | printk(KERN_CONT "\n"); | 79 | printk(KERN_CONT "\n"); |
| 90 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); | 80 | show_trace_log_lvl(task, regs, sp, log_lvl); |
| 91 | } | 81 | } |
| 92 | 82 | ||
| 93 | 83 | ||
| @@ -112,8 +102,7 @@ void show_registers(struct pt_regs *regs) | |||
| 112 | u8 *ip; | 102 | u8 *ip; |
| 113 | 103 | ||
| 114 | printk(KERN_EMERG "Stack:\n"); | 104 | printk(KERN_EMERG "Stack:\n"); |
| 115 | show_stack_log_lvl(NULL, regs, ®s->sp, | 105 | show_stack_log_lvl(NULL, regs, ®s->sp, KERN_EMERG); |
| 116 | 0, KERN_EMERG); | ||
| 117 | 106 | ||
| 118 | printk(KERN_EMERG "Code: "); | 107 | printk(KERN_EMERG "Code: "); |
| 119 | 108 | ||
