diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack_32.c')
-rw-r--r-- | arch/x86/kernel/dumpstack_32.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index 74cc1eda384b..3b97a80ce329 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
@@ -17,12 +17,11 @@ | |||
17 | #include <asm/stacktrace.h> | 17 | #include <asm/stacktrace.h> |
18 | 18 | ||
19 | 19 | ||
20 | void dump_trace(struct task_struct *task, | 20 | void dump_trace(struct task_struct *task, struct pt_regs *regs, |
21 | struct pt_regs *regs, unsigned long *stack, | 21 | unsigned long *stack, unsigned long bp, |
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; | ||
26 | 25 | ||
27 | if (!task) | 26 | if (!task) |
28 | task = current; | 27 | task = current; |
@@ -35,7 +34,9 @@ void dump_trace(struct task_struct *task, | |||
35 | stack = (unsigned long *)task->thread.sp; | 34 | stack = (unsigned long *)task->thread.sp; |
36 | } | 35 | } |
37 | 36 | ||
38 | bp = stack_frame(task, regs); | 37 | if (!bp) |
38 | bp = stack_frame(task, regs); | ||
39 | |||
39 | for (;;) { | 40 | for (;;) { |
40 | struct thread_info *context; | 41 | struct thread_info *context; |
41 | 42 | ||
@@ -55,7 +56,7 @@ EXPORT_SYMBOL(dump_trace); | |||
55 | 56 | ||
56 | void | 57 | void |
57 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 58 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
58 | unsigned long *sp, char *log_lvl) | 59 | unsigned long *sp, unsigned long bp, char *log_lvl) |
59 | { | 60 | { |
60 | unsigned long *stack; | 61 | unsigned long *stack; |
61 | int i; | 62 | int i; |
@@ -77,7 +78,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
77 | touch_nmi_watchdog(); | 78 | touch_nmi_watchdog(); |
78 | } | 79 | } |
79 | printk(KERN_CONT "\n"); | 80 | printk(KERN_CONT "\n"); |
80 | show_trace_log_lvl(task, regs, sp, log_lvl); | 81 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); |
81 | } | 82 | } |
82 | 83 | ||
83 | 84 | ||
@@ -102,7 +103,7 @@ void show_registers(struct pt_regs *regs) | |||
102 | u8 *ip; | 103 | u8 *ip; |
103 | 104 | ||
104 | printk(KERN_EMERG "Stack:\n"); | 105 | printk(KERN_EMERG "Stack:\n"); |
105 | show_stack_log_lvl(NULL, regs, ®s->sp, KERN_EMERG); | 106 | show_stack_log_lvl(NULL, regs, ®s->sp, 0, KERN_EMERG); |
106 | 107 | ||
107 | printk(KERN_EMERG "Code: "); | 108 | printk(KERN_EMERG "Code: "); |
108 | 109 | ||