| Jeff Dike | 13c06be | 2006-09-25 23:32:59 -0700 | [diff] [blame] | 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 | 
 | 21 | setjmp: | 
 | 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 | 
 | 44 | longjmp: | 
 | 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 |