18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#
38c2ecf20Sopenharmony_ci# arch/x86_64/setjmp.S
48c2ecf20Sopenharmony_ci#
58c2ecf20Sopenharmony_ci# setjmp/longjmp for the x86-64 architecture
68c2ecf20Sopenharmony_ci#
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#
98c2ecf20Sopenharmony_ci# The jmp_buf is assumed to contain the following, in order:
108c2ecf20Sopenharmony_ci#	%rbx
118c2ecf20Sopenharmony_ci#	%rsp (post-return)
128c2ecf20Sopenharmony_ci#	%rbp
138c2ecf20Sopenharmony_ci#	%r12
148c2ecf20Sopenharmony_ci#	%r13
158c2ecf20Sopenharmony_ci#	%r14
168c2ecf20Sopenharmony_ci#	%r15
178c2ecf20Sopenharmony_ci#	<return address>
188c2ecf20Sopenharmony_ci#
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	.text
218c2ecf20Sopenharmony_ci	.align 4
228c2ecf20Sopenharmony_ci	.globl kernel_setjmp
238c2ecf20Sopenharmony_ci	.type kernel_setjmp, @function
248c2ecf20Sopenharmony_cikernel_setjmp:
258c2ecf20Sopenharmony_ci	pop  %rsi			# Return address, and adjust the stack
268c2ecf20Sopenharmony_ci	xorl %eax,%eax			# Return value
278c2ecf20Sopenharmony_ci	movq %rbx,(%rdi)
288c2ecf20Sopenharmony_ci	movq %rsp,8(%rdi)		# Post-return %rsp!
298c2ecf20Sopenharmony_ci	push %rsi			# Make the call/return stack happy
308c2ecf20Sopenharmony_ci	movq %rbp,16(%rdi)
318c2ecf20Sopenharmony_ci	movq %r12,24(%rdi)
328c2ecf20Sopenharmony_ci	movq %r13,32(%rdi)
338c2ecf20Sopenharmony_ci	movq %r14,40(%rdi)
348c2ecf20Sopenharmony_ci	movq %r15,48(%rdi)
358c2ecf20Sopenharmony_ci	movq %rsi,56(%rdi)		# Return address
368c2ecf20Sopenharmony_ci	RET
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	.size kernel_setjmp,.-kernel_setjmp
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	.text
418c2ecf20Sopenharmony_ci	.align 4
428c2ecf20Sopenharmony_ci	.globl kernel_longjmp
438c2ecf20Sopenharmony_ci	.type kernel_longjmp, @function
448c2ecf20Sopenharmony_cikernel_longjmp:
458c2ecf20Sopenharmony_ci	movl %esi,%eax			# Return value (int)
468c2ecf20Sopenharmony_ci	movq (%rdi),%rbx
478c2ecf20Sopenharmony_ci	movq 8(%rdi),%rsp
488c2ecf20Sopenharmony_ci	movq 16(%rdi),%rbp
498c2ecf20Sopenharmony_ci	movq 24(%rdi),%r12
508c2ecf20Sopenharmony_ci	movq 32(%rdi),%r13
518c2ecf20Sopenharmony_ci	movq 40(%rdi),%r14
528c2ecf20Sopenharmony_ci	movq 48(%rdi),%r15
538c2ecf20Sopenharmony_ci	jmp *56(%rdi)
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	.size kernel_longjmp,.-kernel_longjmp
56