xref: /OK3568_Linux_fs/kernel/arch/x86/um/setjmp_32.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# arch/i386/setjmp.S
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# setjmp/longjmp for the i386 architecture
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#
9*4882a593Smuzhiyun# The jmp_buf is assumed to contain the following, in order:
10*4882a593Smuzhiyun#	%ebx
11*4882a593Smuzhiyun#	%esp
12*4882a593Smuzhiyun#	%ebp
13*4882a593Smuzhiyun#	%esi
14*4882a593Smuzhiyun#	%edi
15*4882a593Smuzhiyun#	<return address>
16*4882a593Smuzhiyun#
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun	.text
19*4882a593Smuzhiyun	.align 4
20*4882a593Smuzhiyun	.globl kernel_setjmp
21*4882a593Smuzhiyun	.type kernel_setjmp, @function
22*4882a593Smuzhiyunkernel_setjmp:
23*4882a593Smuzhiyun#ifdef _REGPARM
24*4882a593Smuzhiyun	movl %eax,%edx
25*4882a593Smuzhiyun#else
26*4882a593Smuzhiyun	movl 4(%esp),%edx
27*4882a593Smuzhiyun#endif
28*4882a593Smuzhiyun	popl %ecx			# Return address, and adjust the stack
29*4882a593Smuzhiyun	xorl %eax,%eax			# Return value
30*4882a593Smuzhiyun	movl %ebx,(%edx)
31*4882a593Smuzhiyun	movl %esp,4(%edx)		# Post-return %esp!
32*4882a593Smuzhiyun	pushl %ecx			# Make the call/return stack happy
33*4882a593Smuzhiyun	movl %ebp,8(%edx)
34*4882a593Smuzhiyun	movl %esi,12(%edx)
35*4882a593Smuzhiyun	movl %edi,16(%edx)
36*4882a593Smuzhiyun	movl %ecx,20(%edx)		# Return address
37*4882a593Smuzhiyun	RET
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	.size kernel_setjmp,.-kernel_setjmp
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun	.text
42*4882a593Smuzhiyun	.align 4
43*4882a593Smuzhiyun	.globl kernel_longjmp
44*4882a593Smuzhiyun	.type kernel_longjmp, @function
45*4882a593Smuzhiyunkernel_longjmp:
46*4882a593Smuzhiyun#ifdef _REGPARM
47*4882a593Smuzhiyun	xchgl %eax,%edx
48*4882a593Smuzhiyun#else
49*4882a593Smuzhiyun	movl 4(%esp),%edx		# jmp_ptr address
50*4882a593Smuzhiyun	movl 8(%esp),%eax		# Return value
51*4882a593Smuzhiyun#endif
52*4882a593Smuzhiyun	movl (%edx),%ebx
53*4882a593Smuzhiyun	movl 4(%edx),%esp
54*4882a593Smuzhiyun	movl 8(%edx),%ebp
55*4882a593Smuzhiyun	movl 12(%edx),%esi
56*4882a593Smuzhiyun	movl 16(%edx),%edi
57*4882a593Smuzhiyun	jmp *20(%edx)
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun	.size kernel_longjmp,.-kernel_longjmp
60