|  | # | 
|  | # 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 |