瀏覽代碼

[PATCH] ARM SMP: Fix PXA/SA11x0 suspend resume crash

We need to re-initialise the stack pointers for undefined, IRQ
and abort mode handlers whenever we resume.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Russell King 20 年之前
父節點
當前提交
36c5ed23b9
共有 4 個文件被更改,包括 6 次插入1 次删除
  1. 1 1
      arch/arm/kernel/setup.c
  2. 2 0
      arch/arm/mach-pxa/pm.c
  3. 2 0
      arch/arm/mach-sa1100/pm.c
  4. 1 0
      include/asm-arm/system.h

+ 1 - 1
arch/arm/kernel/setup.c

@@ -328,7 +328,7 @@ static void __init setup_processor(void)
  * cpu_init dumps the cache information, initialises SMP specific
  * information, and sets up the per-CPU stacks.
  */
-void __init cpu_init(void)
+void cpu_init(void)
 {
 	unsigned int cpu = smp_processor_id();
 	struct stack *stk = &stacks[cpu];

+ 2 - 0
arch/arm/mach-pxa/pm.c

@@ -133,6 +133,8 @@ static int pxa_pm_enter(suspend_state_t state)
 	/* *** go zzz *** */
 	pxa_cpu_pm_enter(state);
 
+	cpu_init();
+
 	/* after sleeping, validate the checksum */
 	checksum = 0;
 	for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++)

+ 2 - 0
arch/arm/mach-sa1100/pm.c

@@ -88,6 +88,8 @@ static int sa11x0_pm_enter(suspend_state_t state)
 	/* go zzz */
 	sa1100_cpu_suspend();
 
+	cpu_init();
+
 	/*
 	 * Ensure not to come back here if it wasn't intended
 	 */

+ 1 - 0
include/asm-arm/system.h

@@ -104,6 +104,7 @@ extern void show_pte(struct mm_struct *mm, unsigned long addr);
 extern void __show_regs(struct pt_regs *);
 
 extern int cpu_architecture(void);
+extern void cpu_init(void);
 
 #define set_cr(x)					\
 	__asm__ __volatile__(				\