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
24 kernel_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
44 kernel_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