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