18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#
38c2ecf20Sopenharmony_ci# arch/i386/setjmp.S
48c2ecf20Sopenharmony_ci#
58c2ecf20Sopenharmony_ci# setjmp/longjmp for the i386 architecture
68c2ecf20Sopenharmony_ci#
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#
98c2ecf20Sopenharmony_ci# The jmp_buf is assumed to contain the following, in order:
108c2ecf20Sopenharmony_ci#	%ebx
118c2ecf20Sopenharmony_ci#	%esp
128c2ecf20Sopenharmony_ci#	%ebp
138c2ecf20Sopenharmony_ci#	%esi
148c2ecf20Sopenharmony_ci#	%edi
158c2ecf20Sopenharmony_ci#	<return address>
168c2ecf20Sopenharmony_ci#
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	.text
198c2ecf20Sopenharmony_ci	.align 4
208c2ecf20Sopenharmony_ci	.globl kernel_setjmp
218c2ecf20Sopenharmony_ci	.type kernel_setjmp, @function
228c2ecf20Sopenharmony_cikernel_setjmp:
238c2ecf20Sopenharmony_ci#ifdef _REGPARM
248c2ecf20Sopenharmony_ci	movl %eax,%edx
258c2ecf20Sopenharmony_ci#else
268c2ecf20Sopenharmony_ci	movl 4(%esp),%edx
278c2ecf20Sopenharmony_ci#endif
288c2ecf20Sopenharmony_ci	popl %ecx			# Return address, and adjust the stack
298c2ecf20Sopenharmony_ci	xorl %eax,%eax			# Return value
308c2ecf20Sopenharmony_ci	movl %ebx,(%edx)
318c2ecf20Sopenharmony_ci	movl %esp,4(%edx)		# Post-return %esp!
328c2ecf20Sopenharmony_ci	pushl %ecx			# Make the call/return stack happy
338c2ecf20Sopenharmony_ci	movl %ebp,8(%edx)
348c2ecf20Sopenharmony_ci	movl %esi,12(%edx)
358c2ecf20Sopenharmony_ci	movl %edi,16(%edx)
368c2ecf20Sopenharmony_ci	movl %ecx,20(%edx)		# Return address
378c2ecf20Sopenharmony_ci	RET
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	.size kernel_setjmp,.-kernel_setjmp
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	.text
428c2ecf20Sopenharmony_ci	.align 4
438c2ecf20Sopenharmony_ci	.globl kernel_longjmp
448c2ecf20Sopenharmony_ci	.type kernel_longjmp, @function
458c2ecf20Sopenharmony_cikernel_longjmp:
468c2ecf20Sopenharmony_ci#ifdef _REGPARM
478c2ecf20Sopenharmony_ci	xchgl %eax,%edx
488c2ecf20Sopenharmony_ci#else
498c2ecf20Sopenharmony_ci	movl 4(%esp),%edx		# jmp_ptr address
508c2ecf20Sopenharmony_ci	movl 8(%esp),%eax		# Return value
518c2ecf20Sopenharmony_ci#endif
528c2ecf20Sopenharmony_ci	movl (%edx),%ebx
538c2ecf20Sopenharmony_ci	movl 4(%edx),%esp
548c2ecf20Sopenharmony_ci	movl 8(%edx),%ebp
558c2ecf20Sopenharmony_ci	movl 12(%edx),%esi
568c2ecf20Sopenharmony_ci	movl 16(%edx),%edi
578c2ecf20Sopenharmony_ci	jmp *20(%edx)
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	.size kernel_longjmp,.-kernel_longjmp
60