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