浏览代码

x86_64: Fix S3 fail path

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>
Jiri Slaby 16 年之前
父节点
当前提交
6defa2fe20
共有 1 个文件被更改,包括 3 次插入1 次删除
  1. 3 1
      arch/x86/kernel/acpi/wakeup_64.S

+ 3 - 1
arch/x86/kernel/acpi/wakeup_64.S

@@ -73,7 +73,9 @@ ENTRY(do_suspend_lowlevel)
 	addq	$8, %rsp
 	addq	$8, %rsp
 	movl	$3, %edi
 	movl	$3, %edi
 	xorl	%eax, %eax
 	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
 	.align 4
 resume_point:
 resume_point: