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