xref: /openbmc/u-boot/arch/x86/cpu/x86_64/setjmp.S (revision 4ac5df4b)
1*96492732SIvan Gorinov/* SPDX-License-Identifier: GPL-2.0 */
2*96492732SIvan Gorinov/*
3*96492732SIvan Gorinov * Copyright (C) 2018 Intel Corporation
4*96492732SIvan Gorinov *
5*96492732SIvan Gorinov * See arch/x86/include/asm/setjmp.h for jmp_buf format
6*96492732SIvan Gorinov */
7*96492732SIvan Gorinov
8*96492732SIvan Gorinov#include <linux/linkage.h>
9*96492732SIvan Gorinov
10*96492732SIvan Gorinov.text
11*96492732SIvan Gorinov.align 8
12*96492732SIvan Gorinov
13*96492732SIvan GorinovENTRY(setjmp)
14*96492732SIvan Gorinov
15*96492732SIvan Gorinov	pop	%rcx
16*96492732SIvan Gorinov	movq	%rcx, (%rdi)	/* Return address */
17*96492732SIvan Gorinov	movq	%rsp, 8(%rdi)
18*96492732SIvan Gorinov	movq	%rbp, 16(%rdi)
19*96492732SIvan Gorinov	movq	%rbx, 24(%rdi)
20*96492732SIvan Gorinov	movq	%r12, 32(%rdi)
21*96492732SIvan Gorinov	movq	%r13, 40(%rdi)
22*96492732SIvan Gorinov	movq	%r14, 48(%rdi)
23*96492732SIvan Gorinov	movq	%r15, 56(%rdi)
24*96492732SIvan Gorinov	xorq	%rax, %rax	/* Direct invocation returns 0 */
25*96492732SIvan Gorinov	jmpq	*%rcx
26*96492732SIvan Gorinov
27*96492732SIvan GorinovENDPROC(setjmp)
28*96492732SIvan Gorinov
29*96492732SIvan Gorinov.align 8
30*96492732SIvan Gorinov
31*96492732SIvan GorinovENTRY(longjmp)
32*96492732SIvan Gorinov
33*96492732SIvan Gorinov	movq	(%rdi), %rcx	/* Return address */
34*96492732SIvan Gorinov	movq	8(%rdi), %rsp
35*96492732SIvan Gorinov	movq	16(%rdi), %rbp
36*96492732SIvan Gorinov	movq	24(%rdi), %rbx
37*96492732SIvan Gorinov	movq	32(%rdi), %r12
38*96492732SIvan Gorinov	movq	40(%rdi), %r13
39*96492732SIvan Gorinov	movq	48(%rdi), %r14
40*96492732SIvan Gorinov	movq	56(%rdi), %r15
41*96492732SIvan Gorinov
42*96492732SIvan Gorinov	movq	%rsi, %rax	/* Value to be returned by setjmp() */
43*96492732SIvan Gorinov	testq	%rax, %rax	/* cannot be 0 in this case */
44*96492732SIvan Gorinov	jnz	1f
45*96492732SIvan Gorinov	incq	%rax		/* Return 1 instead */
46*96492732SIvan Gorinov1:
47*96492732SIvan Gorinov	jmpq	*%rcx
48*96492732SIvan Gorinov
49*96492732SIvan GorinovENDPROC(longjmp)
50