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