diff options
| author | Jan Beulich <JBeulich@novell.com> | 2009-10-06 11:32:43 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-10-12 12:06:48 -0400 |
| commit | 7a4b7e5e741fe0a72a517b0367a2659aa53f7c44 (patch) | |
| tree | 00d0a9617280f2982277043d6a0e4024bac05960 | |
| parent | d0153ca35d344d9b640dc305031b0703ba3f30f0 (diff) | |
x86: Fix Suspend to RAM freeze on Acer Aspire 1511Lmi laptop
Move the trampoline and accessors back out of .cpuinit.* for the
case of 64-bits+ACPI_SLEEP.
This solves s2ram hangs reported in:
http://bugzilla.kernel.org/show_bug.cgi?id=14279
Reported-and-bisected-by: Christian Casteyde <casteyde.christian@free.fr>
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Cc: <bugzilla-daemon@bugzilla.kernel.org>
Cc: "Andrew Morton" <akpm@linux-foundation.org>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | arch/x86/kernel/trampoline.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/trampoline_64.S | 4 |
2 files changed, 14 insertions, 2 deletions
diff --git a/arch/x86/kernel/trampoline.c b/arch/x86/kernel/trampoline.c index 699f7eeb896..cd022121cab 100644 --- a/arch/x86/kernel/trampoline.c +++ b/arch/x86/kernel/trampoline.c | |||
| @@ -3,8 +3,16 @@ | |||
| 3 | #include <asm/trampoline.h> | 3 | #include <asm/trampoline.h> |
| 4 | #include <asm/e820.h> | 4 | #include <asm/e820.h> |
| 5 | 5 | ||
| 6 | #if defined(CONFIG_X86_64) && defined(CONFIG_ACPI_SLEEP) | ||
| 7 | #define __trampinit | ||
| 8 | #define __trampinitdata | ||
| 9 | #else | ||
| 10 | #define __trampinit __cpuinit | ||
| 11 | #define __trampinitdata __cpuinitdata | ||
| 12 | #endif | ||
| 13 | |||
| 6 | /* ready for x86_64 and x86 */ | 14 | /* ready for x86_64 and x86 */ |
| 7 | unsigned char *__cpuinitdata trampoline_base = __va(TRAMPOLINE_BASE); | 15 | unsigned char *__trampinitdata trampoline_base = __va(TRAMPOLINE_BASE); |
| 8 | 16 | ||
| 9 | void __init reserve_trampoline_memory(void) | 17 | void __init reserve_trampoline_memory(void) |
| 10 | { | 18 | { |
| @@ -26,7 +34,7 @@ void __init reserve_trampoline_memory(void) | |||
| 26 | * bootstrap into the page concerned. The caller | 34 | * bootstrap into the page concerned. The caller |
| 27 | * has made sure it's suitably aligned. | 35 | * has made sure it's suitably aligned. |
| 28 | */ | 36 | */ |
| 29 | unsigned long __cpuinit setup_trampoline(void) | 37 | unsigned long __trampinit setup_trampoline(void) |
| 30 | { | 38 | { |
| 31 | memcpy(trampoline_base, trampoline_data, TRAMPOLINE_SIZE); | 39 | memcpy(trampoline_base, trampoline_data, TRAMPOLINE_SIZE); |
| 32 | return virt_to_phys(trampoline_base); | 40 | return virt_to_phys(trampoline_base); |
diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 596d54c660a..3af2dff58b2 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S | |||
| @@ -32,8 +32,12 @@ | |||
| 32 | #include <asm/segment.h> | 32 | #include <asm/segment.h> |
| 33 | #include <asm/processor-flags.h> | 33 | #include <asm/processor-flags.h> |
| 34 | 34 | ||
| 35 | #ifdef CONFIG_ACPI_SLEEP | ||
| 36 | .section .rodata, "a", @progbits | ||
| 37 | #else | ||
| 35 | /* We can free up the trampoline after bootup if cpu hotplug is not supported. */ | 38 | /* We can free up the trampoline after bootup if cpu hotplug is not supported. */ |
| 36 | __CPUINITRODATA | 39 | __CPUINITRODATA |
| 40 | #endif | ||
| 37 | .code16 | 41 | .code16 |
| 38 | 42 | ||
| 39 | ENTRY(trampoline_data) | 43 | ENTRY(trampoline_data) |
