summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2002-11-02 23:51:51 -0800
committerLinus Torvalds <torvalds@penguin.transmeta.com>2002-11-02 23:51:51 -0800
commit78435629df60053764d3a5b68d58d9d4e96cf628 (patch)
tree6643dc9648d7e34a9fdb52add30c1d43d2957a48
parentf06d0bf1c0ddb2eeaf717a0ed2ab5de79c4ffefa (diff)
[PATCH] M68k dump_stack() updates
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)
-rw-r--r--arch/m68k/kernel/traps.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
index fa1aaca68883..4343116eef4e 100644
--- a/arch/m68k/kernel/traps.c
+++ b/arch/m68k/kernel/traps.c
@@ -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);
}