diff options
| author | Anton Blanchard <anton@samba.org> | 2002-11-23 14:33:20 +1100 |
|---|---|---|
| committer | Anton Blanchard <anton@samba.org> | 2002-11-23 14:33:20 +1100 |
| commit | 31fa8532ec0f32402fe3ebf97d87dc714cb96185 (patch) | |
| tree | 057dcec02563b1ba977f12688f344508855e904f /arch/ppc64/kernel/process.c | |
| parent | b4bf25f2464b48a908c9a230d73877b6b12d96d7 (diff) | |
ppc64: clean up show_regs and remove print_backtrace
Diffstat (limited to 'arch/ppc64/kernel/process.c')
| -rw-r--r-- | arch/ppc64/kernel/process.c | 78 |
1 files changed, 32 insertions, 46 deletions
diff --git a/arch/ppc64/kernel/process.c b/arch/ppc64/kernel/process.c index 962779ec9969..f21973c0a733 100644 --- a/arch/ppc64/kernel/process.c +++ b/arch/ppc64/kernel/process.c @@ -103,6 +103,8 @@ __switch_to(struct task_struct *prev, struct task_struct *new) local_irq_restore(flags); } +static void show_tsk_stack(struct task_struct *p, unsigned long sp); + void show_regs(struct pt_regs * regs) { int i; @@ -114,32 +116,26 @@ void show_regs(struct pt_regs * regs) regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0, regs->msr&MSR_IR ? 1 : 0, regs->msr&MSR_DR ? 1 : 0); + if (regs->trap == 0x300 || regs->trap == 0x380 || regs->trap == 0x600) + printk("DAR: %016lx, DSISR: %016lx\n", regs->dar, regs->dsisr); printk("TASK = %p[%d] '%s' ", current, current->pid, current->comm); - printk("\nlast math %p ", last_task_used_math); - + #ifdef CONFIG_SMP - /* printk(" CPU: %d last CPU: %d", current->processor,current->last_processor); */ + printk(" CPU: %d", smp_processor_id()); #endif /* CONFIG_SMP */ - - printk("\n"); - for (i = 0; i < 32; i++) - { + + for (i = 0; i < 32; i++) { long r; - if ((i % 4) == 0) - { - printk("GPR%02d: ", i); + if ((i % 4) == 0) { + printk("\n" KERN_INFO "GPR%02d: ", i); } - - if ( __get_user(r, &(regs->gpr[i])) ) + if (__get_user(r, &(regs->gpr[i]))) return; - printk("%016lX ", r); - if ((i % 4) == 3) - { - printk("\n"); - } } + printk("\n"); + show_tsk_stack(current, regs->gpr[1]); } void exit_thread(void) @@ -338,7 +334,7 @@ void initialize_paca_hardware_interrupt_stack(void) if (!cpu_possible(i)) continue; /* Carve out storage for the hardware interrupt stack */ - stack = __get_free_pages(GFP_KERNEL, get_order(8*PAGE_SIZE)); + stack = __get_free_pages(GFP_ATOMIC, get_order(8*PAGE_SIZE)); if ( !stack ) { printk("ERROR, cannot find space for hardware stack.\n"); @@ -413,26 +409,6 @@ char * ppc_find_proc_name( unsigned * p, char * buf, unsigned buflen ) return buf; } -void -print_backtrace(unsigned long *sp) -{ - int cnt = 0; - unsigned long i; - char name_buf[256]; - - printk("Call backtrace: \n"); - while (sp) { - if (__get_user( i, &sp[2] )) - break; - printk("%016lX ", i); - printk("%s\n", ppc_find_proc_name( (unsigned *)i, name_buf, 256 )); - if (cnt > 32) break; - if (__get_user(sp, (unsigned long **)sp)) - break; - } - printk("\n"); -} - /* * These bracket the sleeping functions.. */ @@ -467,31 +443,41 @@ unsigned long get_wchan(struct task_struct *p) return 0; } -void show_trace_task(struct task_struct *p) +static void show_tsk_stack(struct task_struct *p, unsigned long sp) { - unsigned long ip, sp; + unsigned long ip; unsigned long stack_page = (unsigned long)p->thread_info; int count = 0; + char name_buf[256]; if (!p) return; printk("Call Trace: "); - sp = p->thread.ksp; do { - sp = *(unsigned long *)sp; + if (__get_user(sp, (unsigned long *)sp)) + break; if (sp < (stack_page + sizeof(struct thread_struct)) || sp >= (stack_page + THREAD_SIZE)) break; if (count > 0) { - ip = *(unsigned long *)(sp + 16); + if (__get_user(ip, (unsigned long *)(sp + 16))) + break; printk("[%016lx] ", ip); + printk("%s\n", ppc_find_proc_name((unsigned *)ip, + name_buf, 256 )); } - } while (count++ < 16); - printk("\n"); + } while (count++ < 32); } +extern unsigned long *_get_SP(void); + void dump_stack(void) { - show_stack(NULL); + show_tsk_stack(current, (unsigned long)_get_SP()); +} + +void show_trace_task(struct task_struct *tsk) +{ + show_tsk_stack(tsk, tsk->thread.ksp); } |
