diff -urN 2.2.18pre23/arch/alpha/kernel/process.c adebug/arch/alpha/kernel/process.c --- 2.2.18pre23/arch/alpha/kernel/process.c Thu May 4 13:00:36 2000 +++ adebug/arch/alpha/kernel/process.c Sun Nov 26 05:10:14 2000 @@ -249,8 +249,11 @@ alpha_mv.kill_arch(LINUX_REBOOT_CMD_POWER_OFF, NULL); } -void show_regs(struct pt_regs * regs) +void __show_regs(struct pt_regs * regs) { + extern void dik_show_trace(unsigned long *); + + printk("\nCPU: %d", smp_processor_id()); printk("\nps: %04lx pc: [<%016lx>]\n", regs->ps, regs->pc); printk("rp: [<%016lx>] sp: %p\n", regs->r26, regs+1); printk(" r0: %016lx r1: %016lx r2: %016lx r3: %016lx\n", @@ -265,6 +268,15 @@ regs->r23, regs->r24, regs->r25, regs->r26); printk("r27: %016lx r28: %016lx r29: %016lx hae: %016lx\n", regs->r27, regs->r28, regs->gp, regs->hae); + dik_show_trace(regs+1); +} + +void show_regs(struct pt_regs * regs) +{ + __show_regs(regs); +#ifdef CONFIG_SMP + smp_show_regs(); +#endif } /* diff -urN 2.2.18pre23/arch/alpha/kernel/smp.c adebug/arch/alpha/kernel/smp.c --- 2.2.18pre23/arch/alpha/kernel/smp.c Thu Nov 23 03:28:43 2000 +++ adebug/arch/alpha/kernel/smp.c Sun Nov 26 05:09:18 2000 @@ -739,7 +739,14 @@ /* At this point the structure may be gone unless wait is true. */ - (*func)(info); + { + static void ipi_show_regs(void *); + + if (func != ipi_show_regs) + (*func)(info); + else + (*func)((void *) regs); + } /* Notify the sending CPU that the task is done. */ mb(); @@ -853,6 +860,21 @@ printk(KERN_CRIT "smp_imb: timed out\n"); imb(); +} + +static void +ipi_show_regs(void * param) +{ + struct pt_regs *regs = (struct pt_regs *) param; + + __show_regs(regs); +} + +void +smp_show_regs(void) +{ + if (smp_call_function(ipi_show_regs, NULL, 1, 1)) + printk(KERN_CRIT "smp_show_regs: timed out\n"); } static void diff -urN 2.2.18pre23/arch/alpha/kernel/traps.c adebug/arch/alpha/kernel/traps.c --- 2.2.18pre23/arch/alpha/kernel/traps.c Tue Jun 13 03:48:12 2000 +++ adebug/arch/alpha/kernel/traps.c Sun Nov 26 05:09:18 2000 @@ -269,7 +269,7 @@ } } -static void +void dik_show_trace(unsigned long *sp) { int i = 1; diff -urN 2.2.18pre23/include/asm-alpha/ptrace.h adebug/include/asm-alpha/ptrace.h --- 2.2.18pre23/include/asm-alpha/ptrace.h Mon Jan 17 16:44:43 2000 +++ adebug/include/asm-alpha/ptrace.h Sun Nov 26 05:09:18 2000 @@ -70,6 +70,7 @@ #define user_mode(regs) (((regs)->ps & 8) != 0) #define instruction_pointer(regs) ((regs)->pc) extern void show_regs(struct pt_regs *); +extern void __show_regs(struct pt_regs *); #endif #endif