diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
| -rw-r--r-- | arch/arm/kernel/process.c | 31 | 
1 files changed, 15 insertions, 16 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index d3ea6fa89521..2de14e2afdc5 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -34,6 +34,7 @@  #include <asm/processor.h>  #include <asm/system.h>  #include <asm/thread_notify.h> +#include <asm/stacktrace.h>  #include <asm/mach/time.h>  static const char *processor_modes[] = { @@ -82,7 +83,7 @@ static int __init hlt_setup(char *__unused)  __setup("nohlt", nohlt_setup);  __setup("hlt", hlt_setup); -void arm_machine_restart(char mode) +void arm_machine_restart(char mode, const char *cmd)  {  	/*  	 * Clean and disable cache, and turn off interrupts @@ -99,7 +100,7 @@ void arm_machine_restart(char mode)  	/*  	 * Now call the architecture specific reboot code.  	 */ -	arch_reset(mode); +	arch_reset(mode, cmd);  	/*  	 * Whoops - the architecture was unable to reboot. @@ -119,7 +120,7 @@ EXPORT_SYMBOL(pm_idle);  void (*pm_power_off)(void);  EXPORT_SYMBOL(pm_power_off); -void (*arm_pm_restart)(char str) = arm_machine_restart; +void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart;  EXPORT_SYMBOL_GPL(arm_pm_restart); @@ -194,9 +195,9 @@ void machine_power_off(void)  		pm_power_off();  } -void machine_restart(char * __unused) +void machine_restart(char *cmd)  { -	arm_pm_restart(reboot_mode); +	arm_pm_restart(reboot_mode, cmd);  }  void __show_regs(struct pt_regs *regs) @@ -372,23 +373,21 @@ EXPORT_SYMBOL(kernel_thread);  unsigned long get_wchan(struct task_struct *p)  { -	unsigned long fp, lr; -	unsigned long stack_start, stack_end; +	struct stackframe frame;  	int count = 0;  	if (!p || p == current || p->state == TASK_RUNNING)  		return 0; -	stack_start = (unsigned long)end_of_stack(p); -	stack_end = (unsigned long)task_stack_page(p) + THREAD_SIZE; - -	fp = thread_saved_fp(p); +	frame.fp = thread_saved_fp(p); +	frame.sp = thread_saved_sp(p); +	frame.lr = 0;			/* recovered from the stack */ +	frame.pc = thread_saved_pc(p);  	do { -		if (fp < stack_start || fp > stack_end) +		int ret = unwind_frame(&frame); +		if (ret < 0)  			return 0; -		lr = ((unsigned long *)fp)[-1]; -		if (!in_sched_functions(lr)) -			return lr; -		fp = *(unsigned long *) (fp - 12); +		if (!in_sched_functions(frame.pc)) +			return frame.pc;  	} while (count ++ < 16);  	return 0;  }  | 
