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