Patrick Georgi has submitted this change. ( https://review.coreboot.org/c/coreboot/+/55947 )
Change subject: arch/x86: Save resume vector to stack in x86_64 mode ......................................................................
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 --- M src/arch/x86/wakeup.S 1 file changed, 7 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Arthur Heymans: Looks good to me, approved
diff --git a/src/arch/x86/wakeup.S b/src/arch/x86/wakeup.S index dc9510b..7462dad 100644 --- a/src/arch/x86/wakeup.S +++ b/src/arch/x86/wakeup.S @@ -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