diff options
| -rw-r--r-- | arch/alpha/kernel/traps.c | 4 | ||||
| -rw-r--r-- | arch/i386/kernel/process.c | 2 | ||||
| -rw-r--r-- | arch/i386/kernel/traps.c | 14 | ||||
| -rw-r--r-- | arch/ppc64/kernel/process.c | 17 | ||||
| -rw-r--r-- | include/asm-i386/processor.h | 1 | ||||
| -rw-r--r-- | include/linux/sched.h | 9 | ||||
| -rw-r--r-- | kernel/sched.c | 5 |
7 files changed, 29 insertions, 23 deletions
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index ddea651cb87e..412cd3672573 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -148,7 +148,7 @@ void show_trace_task(struct task_struct * tsk) static int kstack_depth_to_print = 24; -void show_stack(unsigned long *sp) +void show_stack(struct task_struct *task, unsigned long *sp) { unsigned long *stack; int i; @@ -174,7 +174,7 @@ void show_stack(unsigned long *sp) void dump_stack(void) { - show_stack(NULL); + show_stack(NULL, NULL); } void diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 8cb6adb50b8a..61bc3326e287 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -190,7 +190,7 @@ void show_regs(struct pt_regs * regs) ".previous \n" : "=r" (cr4): "0" (0)); printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4); - show_trace(®s->esp); + show_trace(NULL, ®s->esp); } /* diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index c6bc1936f45b..7fcedfd5cc4b 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c @@ -32,9 +32,9 @@ #ifdef CONFIG_MCA #include <linux/mca.h> -#include <asm/processor.h> #endif +#include <asm/processor.h> #include <asm/system.h> #include <asm/uaccess.h> #include <asm/io.h> @@ -92,7 +92,7 @@ asmlinkage void machine_check(void); static int kstack_depth_to_print = 24; -void show_trace(unsigned long * stack) +void show_trace(struct task_struct *task, unsigned long * stack) { int i; unsigned long addr; @@ -122,10 +122,10 @@ void show_trace_task(struct task_struct *tsk) /* User space on another CPU? */ if ((esp ^ (unsigned long)tsk->thread_info) & (PAGE_MASK<<1)) return; - show_trace((unsigned long *)esp); + show_trace(tsk, (unsigned long *)esp); } -void show_stack(unsigned long * esp) +void show_stack(struct task_struct *task, unsigned long * esp) { unsigned long *stack; int i; @@ -145,7 +145,7 @@ void show_stack(unsigned long * esp) printk("%08lx ", *stack++); } printk("\n"); - show_trace(esp); + show_trace(task, esp); } /* @@ -155,7 +155,7 @@ void dump_stack(void) { unsigned long stack; - show_trace(&stack); + show_trace(current, &stack); } void show_registers(struct pt_regs *regs) @@ -192,7 +192,7 @@ void show_registers(struct pt_regs *regs) if (in_kernel) { printk("\nStack: "); - show_stack((unsigned long*)esp); + show_stack(NULL, (unsigned long*)esp); printk("Code: "); if(regs->eip < PAGE_OFFSET) diff --git a/arch/ppc64/kernel/process.c b/arch/ppc64/kernel/process.c index 949425d44cb3..c22a54fe544f 100644 --- a/arch/ppc64/kernel/process.c +++ b/arch/ppc64/kernel/process.c @@ -129,7 +129,6 @@ struct task_struct *__switch_to(struct task_struct *prev, return last; } -static void show_tsk_stack(struct task_struct *p, unsigned long sp); char *ppc_find_proc_name(unsigned *p, char *buf, unsigned buflen); void show_regs(struct pt_regs * regs) @@ -172,7 +171,7 @@ void show_regs(struct pt_regs * regs) printk("NIP [%016lx] ", regs->nip); printk("%s\n", ppc_find_proc_name((unsigned *)regs->nip, name_buf, 256)); - show_tsk_stack(current, regs->gpr[1]); + show_stack(current, (unsigned long *)regs->gpr[1]); } void exit_thread(void) @@ -517,22 +516,26 @@ unsigned long get_wchan(struct task_struct *p) return 0; } -static void show_tsk_stack(struct task_struct *p, unsigned long sp) +void show_stack(struct task_struct *p, unsigned long *_sp) { unsigned long ip; unsigned long stack_page = (unsigned long)p->thread_info; int count = 0; char name_buf[256]; + unsigned long sp = (unsigned long)_sp; if (!p) return; + if (sp == 0) + sp = p->thread.ksp; printk("Call Trace:\n"); do { if (__get_user(sp, (unsigned long *)sp)) break; - if (sp < (stack_page + sizeof(struct thread_struct)) || - sp >= (stack_page + THREAD_SIZE)) + if (sp < stack_page + sizeof(struct thread_struct)) + break; + if (sp >= stack_page + THREAD_SIZE) break; if (__get_user(ip, (unsigned long *)(sp + 16))) break; @@ -544,10 +547,10 @@ static void show_tsk_stack(struct task_struct *p, unsigned long sp) void dump_stack(void) { - show_tsk_stack(current, (unsigned long)_get_SP()); + show_stack(current, (unsigned long *)_get_SP()); } void show_trace_task(struct task_struct *tsk) { - show_tsk_stack(tsk, tsk->thread.ksp); + show_stack(tsk, (unsigned long *)tsk->thread.ksp); } diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index 770938129032..ac14135d83ba 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h @@ -468,6 +468,7 @@ extern void prepare_to_copy(struct task_struct *tsk); extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); extern unsigned long thread_saved_pc(struct task_struct *tsk); +void show_trace(struct task_struct *task, unsigned long *stack); unsigned long get_wchan(struct task_struct *p); #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)->thread_info))[1019]) diff --git a/include/linux/sched.h b/include/linux/sched.h index d313e2ccbf42..f5cdfefc5b05 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -148,10 +148,15 @@ extern void sched_init(void); extern void init_idle(task_t *idle, int cpu); extern void show_state(void); -extern void show_trace(unsigned long *stack); -extern void show_stack(unsigned long *stack); extern void show_regs(struct pt_regs *); +/* + * TASK is a pointer to the task whose backtrace we want to see (or NULL for current + * task), SP is the stack pointer of the first frame that should be shown in the back + * trace (or NULL if the entire call-chain of the task should be shown). + */ +extern void show_stack(struct task_struct *task, unsigned long *sp); + void io_schedule(void); long io_schedule_timeout(long timeout); diff --git a/kernel/sched.c b/kernel/sched.c index c603aaa67790..aa79183f1453 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -2182,10 +2182,7 @@ static void show_task(task_t * p) else printk(" (NOTLB)\n"); - { - extern void show_trace_task(task_t *tsk); - show_trace_task(p); - } + show_stack(p, NULL); } void show_state(void) |
