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:
parent
d109354c0f
commit
88eb167868
|
@ -15,6 +15,13 @@
|
|||
.globl __wakeup
|
||||
__wakeup:
|
||||
#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
|
||||
mov %ss, %ax
|
||||
push %rax
|
||||
|
|
Loading…
Reference in New Issue