]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/x86/kernel/dumpstack_32.c
x86, dumpstack: Correct stack dump info when frame pointer is available
[karo-tx-linux.git] / arch / x86 / kernel / dumpstack_32.c
index 74cc1eda384b8d26437a10fa55e3f64cfcf4545a..3b97a80ce32948ffa995f7b310024f901811703b 100644 (file)
 #include <asm/stacktrace.h>
 
 
-void dump_trace(struct task_struct *task,
-               struct pt_regs *regs, unsigned long *stack,
+void dump_trace(struct task_struct *task, struct pt_regs *regs,
+               unsigned long *stack, unsigned long bp,
                const struct stacktrace_ops *ops, void *data)
 {
        int graph = 0;
-       unsigned long bp;
 
        if (!task)
                task = current;
@@ -35,7 +34,9 @@ void dump_trace(struct task_struct *task,
                        stack = (unsigned long *)task->thread.sp;
        }
 
-       bp = stack_frame(task, regs);
+       if (!bp)
+               bp = stack_frame(task, regs);
+
        for (;;) {
                struct thread_info *context;
 
@@ -55,7 +56,7 @@ EXPORT_SYMBOL(dump_trace);
 
 void
 show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
-                  unsigned long *sp, char *log_lvl)
+                  unsigned long *sp, unsigned long bp, char *log_lvl)
 {
        unsigned long *stack;
        int i;
@@ -77,7 +78,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
                touch_nmi_watchdog();
        }
        printk(KERN_CONT "\n");
-       show_trace_log_lvl(task, regs, sp, log_lvl);
+       show_trace_log_lvl(task, regs, sp, bp, log_lvl);
 }
 
 
@@ -102,7 +103,7 @@ void show_registers(struct pt_regs *regs)
                u8 *ip;
 
                printk(KERN_EMERG "Stack:\n");
-               show_stack_log_lvl(NULL, regs, &regs->sp, KERN_EMERG);
+               show_stack_log_lvl(NULL, regs, &regs->sp, 0, KERN_EMERG);
 
                printk(KERN_EMERG "Code: ");