| # | 
 | # arch/i386/setjmp.S | 
 | # | 
 | # setjmp/longjmp for the i386 architecture | 
 | # | 
 |  | 
 | # | 
 | # The jmp_buf is assumed to contain the following, in order: | 
 | #	%ebx | 
 | #	%esp | 
 | #	%ebp | 
 | #	%esi | 
 | #	%edi | 
 | #	<return address> | 
 | # | 
 |  | 
 | 	.text | 
 | 	.align 4 | 
 | 	.globl setjmp | 
 | 	.type setjmp, @function | 
 | setjmp: | 
 | #ifdef _REGPARM | 
 | 	movl %eax,%edx | 
 | #else | 
 | 	movl 4(%esp),%edx | 
 | #endif | 
 | 	popl %ecx			# Return address, and adjust the stack | 
 | 	xorl %eax,%eax			# Return value | 
 | 	movl %ebx,(%edx) | 
 | 	movl %esp,4(%edx)		# Post-return %esp! | 
 | 	pushl %ecx			# Make the call/return stack happy | 
 | 	movl %ebp,8(%edx) | 
 | 	movl %esi,12(%edx) | 
 | 	movl %edi,16(%edx) | 
 | 	movl %ecx,20(%edx)		# Return address | 
 | 	ret | 
 |  | 
 | 	.size setjmp,.-setjmp | 
 |  | 
 | 	.text | 
 | 	.align 4 | 
 | 	.globl longjmp | 
 | 	.type longjmp, @function | 
 | longjmp: | 
 | #ifdef _REGPARM | 
 | 	xchgl %eax,%edx | 
 | #else | 
 | 	movl 4(%esp),%edx		# jmp_ptr address | 
 | 	movl 8(%esp),%eax		# Return value | 
 | #endif | 
 | 	movl (%edx),%ebx | 
 | 	movl 4(%edx),%esp | 
 | 	movl 8(%edx),%ebp | 
 | 	movl 12(%edx),%esi | 
 | 	movl 16(%edx),%edi | 
 | 	jmp *20(%edx) | 
 |  | 
 | 	.size longjmp,.-longjmp |