x86_64: Fix S3 fail path
authorJiri Slaby <jirislaby@gmail.com>
Sun, 15 Feb 2009 21:46:45 +0000 (22:46 +0100)
committerLen Brown <len.brown@intel.com>
Sun, 22 Feb 2009 02:58:18 +0000 (21:58 -0500)
As acpi_enter_sleep_state can fail, take this into account in
do_suspend_lowlevel and don't return to the do_suspend_lowlevel's
caller. This would break (currently) fpu status and preempt count.

Technically, this means use `call' instead of `jmp' and `jmp' to
the `resume_point' after the `call' (i.e. if
acpi_enter_sleep_state returns=fails). `resume_point' will handle
the restore of fpu and preempt count gracefully.

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
arch/x86/kernel/acpi/wakeup_64.S

index b5dee6a0de3a13c02f51be839824312a88be4405..96258d9dc9743c094e0d42af3ff6201d960a6abb 100644 (file)
@@ -73,7 +73,9 @@ ENTRY(do_suspend_lowlevel)
        addq    $8, %rsp
        movl    $3, %edi
        xorl    %eax, %eax
-       jmp     acpi_enter_sleep_state
+       call    acpi_enter_sleep_state
+       /* in case something went wrong, restore the machine status and go on */
+       jmp     resume_point
 
        .align 4
 resume_point: