diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack_64.c')
| -rw-r--r-- | arch/x86/kernel/dumpstack_64.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index 6a340485249a..64101335de19 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -139,8 +139,8 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack, | |||
| 139 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack | 139 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack |
| 140 | */ | 140 | */ |
| 141 | 141 | ||
| 142 | void dump_trace(struct task_struct *task, struct pt_regs *regs, | 142 | void dump_trace(struct task_struct *task, |
| 143 | unsigned long *stack, unsigned long bp, | 143 | struct pt_regs *regs, unsigned long *stack, |
| 144 | const struct stacktrace_ops *ops, void *data) | 144 | const struct stacktrace_ops *ops, void *data) |
| 145 | { | 145 | { |
| 146 | const unsigned cpu = get_cpu(); | 146 | const unsigned cpu = get_cpu(); |
| @@ -149,6 +149,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 149 | unsigned used = 0; | 149 | unsigned used = 0; |
| 150 | struct thread_info *tinfo; | 150 | struct thread_info *tinfo; |
| 151 | int graph = 0; | 151 | int graph = 0; |
| 152 | unsigned long bp; | ||
| 152 | 153 | ||
| 153 | if (!task) | 154 | if (!task) |
| 154 | task = current; | 155 | task = current; |
| @@ -160,18 +161,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 160 | stack = (unsigned long *)task->thread.sp; | 161 | stack = (unsigned long *)task->thread.sp; |
| 161 | } | 162 | } |
| 162 | 163 | ||
| 163 | #ifdef CONFIG_FRAME_POINTER | 164 | bp = stack_frame(task, regs); |
| 164 | if (!bp) { | ||
| 165 | if (task == current) { | ||
| 166 | /* Grab bp right from our regs */ | ||
| 167 | get_bp(bp); | ||
| 168 | } else { | ||
| 169 | /* bp is the last reg pushed by switch_to */ | ||
| 170 | bp = *(unsigned long *) task->thread.sp; | ||
| 171 | } | ||
| 172 | } | ||
| 173 | #endif | ||
| 174 | |||
| 175 | /* | 165 | /* |
| 176 | * Print function call entries in all stacks, starting at the | 166 | * Print function call entries in all stacks, starting at the |
| 177 | * current stack address. If the stacks consist of nested | 167 | * current stack address. If the stacks consist of nested |
| @@ -235,7 +225,7 @@ EXPORT_SYMBOL(dump_trace); | |||
| 235 | 225 | ||
| 236 | void | 226 | void |
| 237 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | 227 | show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 238 | unsigned long *sp, unsigned long bp, char *log_lvl) | 228 | unsigned long *sp, char *log_lvl) |
| 239 | { | 229 | { |
| 240 | unsigned long *irq_stack_end; | 230 | unsigned long *irq_stack_end; |
| 241 | unsigned long *irq_stack; | 231 | unsigned long *irq_stack; |
| @@ -279,7 +269,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 279 | preempt_enable(); | 269 | preempt_enable(); |
| 280 | 270 | ||
| 281 | printk(KERN_CONT "\n"); | 271 | printk(KERN_CONT "\n"); |
| 282 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); | 272 | show_trace_log_lvl(task, regs, sp, log_lvl); |
| 283 | } | 273 | } |
| 284 | 274 | ||
| 285 | void show_registers(struct pt_regs *regs) | 275 | void show_registers(struct pt_regs *regs) |
| @@ -308,7 +298,7 @@ void show_registers(struct pt_regs *regs) | |||
| 308 | 298 | ||
| 309 | printk(KERN_EMERG "Stack:\n"); | 299 | printk(KERN_EMERG "Stack:\n"); |
| 310 | show_stack_log_lvl(NULL, regs, (unsigned long *)sp, | 300 | show_stack_log_lvl(NULL, regs, (unsigned long *)sp, |
| 311 | regs->bp, KERN_EMERG); | 301 | KERN_EMERG); |
| 312 | 302 | ||
| 313 | printk(KERN_EMERG "Code: "); | 303 | printk(KERN_EMERG "Code: "); |
| 314 | 304 | ||
