diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-28 14:03:14 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-28 14:03:14 -0700 | 
| commit | 0fe41b8982001cd14ee2c77cd776735a5024e98b (patch) | |
| tree | 83e65d595c413d55259ea14fb97748ce5efe5707 /arch/arm/kernel/process.c | |
| parent | eedf2c5296a8dfaaf9aec1a938c1d3bd73159a30 (diff) | |
| parent | 9759d22c8348343b0da4e25d6150c41712686c14 (diff) | |
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (422 commits)
  [ARM] 5435/1: fix compile warning in sanity_check_meminfo()
  [ARM] 5434/1: ARM: OMAP: Fix mailbox compile for 24xx
  [ARM] pxa: fix the bad assumption that PCMCIA sockets always start with 0
  [ARM] pxa: fix Colibri PXA300 and PXA320 LCD backlight pins
  imxfb: Fix TFT mode
  i.MX21/27: remove ifdef CONFIG_FB_IMX
  imxfb: add clock support
  mxc: add arch_reset() function
  clkdev: add possibility to get a clock based on the device name
  i.MX1: remove fb support from mach-imx
  [ARM] pxa: build arch/arm/plat-pxa/mfp.c only when PXA3xx or ARCH_MMP defined
  Gemini: Add support for Teltonika RUT100
  Gemini: gpiolib based GPIO support v2
  MAINTAINERS: add myself as Gemini architecture maintainer
  ARM: Add Gemini architecture v3
  [ARM] OMAP: Fix compile for omap2_init_common_hw()
  MAINTAINERS: Add myself as Faraday ARM core variant maintainer
  ARM: Add support for FA526 v2
  [ARM] acorn,ebsa110,footbridge,integrator,sa1100: Convert asm/io.h to linux/io.h
  [ARM] collie: fix two minor formatting nits
  ...
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;  } | 
