|
@@ -2134,12 +2134,20 @@ static void user_instruction_dump (unsigned int __user *pc)
|
|
|
void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
|
|
{
|
|
|
unsigned long pc, fp, thread_base, ksp;
|
|
|
- void *tp = task_stack_page(tsk);
|
|
|
+ struct thread_info *tp;
|
|
|
struct reg_window *rw;
|
|
|
int count = 0;
|
|
|
|
|
|
ksp = (unsigned long) _ksp;
|
|
|
-
|
|
|
+ if (!tsk)
|
|
|
+ tsk = current;
|
|
|
+ tp = task_thread_info(tsk);
|
|
|
+ if (ksp == 0UL) {
|
|
|
+ if (tsk == current)
|
|
|
+ asm("mov %%fp, %0" : "=r" (ksp));
|
|
|
+ else
|
|
|
+ ksp = tp->ksp;
|
|
|
+ }
|
|
|
if (tp == current_thread_info())
|
|
|
flushw_all();
|
|
|
|
|
@@ -2168,11 +2176,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
|
|
|
|
|
|
void dump_stack(void)
|
|
|
{
|
|
|
- unsigned long *ksp;
|
|
|
-
|
|
|
- __asm__ __volatile__("mov %%fp, %0"
|
|
|
- : "=r" (ksp));
|
|
|
- show_stack(current, ksp);
|
|
|
+ show_stack(current, NULL);
|
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL(dump_stack);
|