]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] M68k dump_stack() updates
authorGeert Uytterhoeven <geert@linux-m68k.org>
Sun, 3 Nov 2002 07:51:51 +0000 (23:51 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Sun, 3 Nov 2002 07:51:51 +0000 (23:51 -0800)
M68k dump_stack() updates:
  - Let dump_stack() call show_trace() (cfr. ia32)
  - Separate show_registers() from show_stack()
  - Fix for dump_stack() becoming an arch-independent routine (from 2.4.x)

arch/m68k/kernel/traps.c

index fa1aaca68883aac9b41c64c6c2c4b8e08d78df1e..4343116eef4e5048618d0693d3e422b9d11e4f05 100644 (file)
@@ -881,9 +881,10 @@ void show_trace_task(struct task_struct *tsk)
        show_trace((unsigned long *)tsk->thread.esp0);
 }
 
-static void dump_stack(struct frame *fp)
+void show_registers(struct pt_regs *regs)
 {
-       unsigned long *stack, *endstack, addr;
+       struct frame *fp = (struct frame *)regs;
+       unsigned long addr;
        int i;
 
        addr = (unsigned long)&fp->un;
@@ -938,9 +939,22 @@ static void dump_stack(struct frame *fp)
        default:
            printk("\n");
        }
+       show_stack((unsigned long *)addr);
+
+       printk("Code: ");
+       for (i = 0; i < 10; i++)
+               printk("%04x ", 0xffff & ((short *) fp->ptregs.pc)[i]);
+       printk ("\n");
+}
+
+extern void show_stack(unsigned long *stack)
+{
+       unsigned long *endstack;
+       int i;
 
-       stack = (unsigned long *)addr;
-       endstack = (unsigned long *)((addr + THREAD_SIZE - 1) & -THREAD_SIZE);
+       if (!stack)
+               stack = (unsigned long *)&stack;
+       endstack = (unsigned long *)(((unsigned long)stack + THREAD_SIZE - 1) & -THREAD_SIZE);
 
        printk("Stack from %08lx:", (unsigned long)stack);
        for (i = 0; i < kstack_depth_to_print; i++) {
@@ -951,12 +965,17 @@ static void dump_stack(struct frame *fp)
                printk(" %08lx", *stack++);
        }
        printk("\n");
-       show_trace((unsigned long *)addr);
+       show_trace(stack);
+}
 
-       printk("Code: ");
-       for (i = 0; i < 10; i++)
-               printk("%04x ", 0xffff & ((short *) fp->ptregs.pc)[i]);
-       printk ("\n");
+/*
+ * The architecture-independent backtrace generator
+ */
+void dump_stack(void)
+{
+       unsigned long stack;
+
+       show_trace(&stack);
 }
 
 void bad_super_trap (struct frame *fp)
@@ -1129,7 +1148,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr)
 
        printk("Process %s (pid: %d, stackpage=%08lx)\n",
                current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
-       dump_stack((struct frame *)fp);
+       show_stack((unsigned long *)fp);
        do_exit(SIGSEGV);
 }