summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/alpha/kernel/traps.c4
-rw-r--r--arch/i386/kernel/process.c2
-rw-r--r--arch/i386/kernel/traps.c14
-rw-r--r--arch/ppc64/kernel/process.c17
-rw-r--r--include/asm-i386/processor.h1
-rw-r--r--include/linux/sched.h9
-rw-r--r--kernel/sched.c5
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(&regs->esp);
+ show_trace(NULL, &regs->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)