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