blob: 2fb5c234c3aabc9f44363b15dc5208855f35b631 [file] [log] [blame]
/*
* 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: # gcc 4.0.1 wants this as an alias?
.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
*/
#if __SIZEOF_POINTER__ == 4
#include <i386/setjmp.S>
#elif __SIZEOF_POINTER__ == 8
#include <x86_64/setjmp.S>
#else
#error "Unable to build for to-be-defined architecture type"
#endif