arch/x86: Save resume vector to stack in x86_64 mode

In x86_64, the first function parameter is passed in rdi register, and
the 32-bit code after exiting long mode reads the resume vector in
4(%esp), so it's needed to save the resume vector from rdi to 4(%rsp).

Also note that the function attribute "regparm" only works on x86-32
targets according to the GCC manual, so "asmlinkage" doesn't change
the ABI of an x86_64 function.

Tested on HP EliteBook 2560p. The laptop can resume from S3 in x86_64
mode after this change.

Change-Id: I45f2678071b2511c0af5dce9d9b73ac70dfd7252
Signed-off-by: Iru Cai <mytbk920423@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55947
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Iru Cai 2021-06-29 21:16:26 +08:00 committed by Patrick Georgi
parent d109354c0f
commit 88eb167868
1 changed files with 7 additions and 0 deletions

View File

@ -15,6 +15,13 @@
.globl __wakeup .globl __wakeup
__wakeup: __wakeup:
#if ENV_X86_64 #if ENV_X86_64
/* When called in x86_64 mode, the resume vector is in %rdi
* instead of the stack, save it in 4(%rsp) for the 32-bit code.
* It's OK to overwrite the return address at (%rsp) because this
* function doesn't return.
*/
mov %edi, 4(%rsp)
xor %rax,%rax xor %rax,%rax
mov %ss, %ax mov %ss, %ax
push %rax push %rax