1#
2# arch/x86_64/setjmp.S
3#
4# setjmp/longjmp for the x86-64 architecture
5#
6
7#
8# The jmp_buf is assumed to contain the following, in order:
9#	%rbx
10#	%rsp (post-return)
11#	%rbp
12#	%r12
13#	%r13
14#	%r14
15#	%r15
16#	<return address>
17#
18
19	.text
20	.align 4
21	.globl setjmp
22	.type setjmp, @function
23setjmp:
24	pop  %rsi			# Return address, and adjust the stack
25	xorl %eax,%eax			# Return value
26	movq %rbx,(%rdi)
27	movq %rsp,8(%rdi)		# Post-return %rsp!
28	push %rsi			# Make the call/return stack happy
29	movq %rbp,16(%rdi)
30	movq %r12,24(%rdi)
31	movq %r13,32(%rdi)
32	movq %r14,40(%rdi)
33	movq %r15,48(%rdi)
34	movq %rsi,56(%rdi)		# Return address
35	ret
36
37	.size setjmp,.-setjmp
38
39	.text
40	.align 4
41	.globl longjmp
42	.type longjmp, @function
43longjmp:
44	movl %esi,%eax			# Return value (int)
45	movq (%rdi),%rbx
46	movq 8(%rdi),%rsp
47	movq 16(%rdi),%rbp
48	movq 24(%rdi),%r12
49	movq 32(%rdi),%r13
50	movq 40(%rdi),%r14
51	movq 48(%rdi),%r15
52	jmp *56(%rdi)
53
54	.size longjmp,.-longjmp
55