0001
0002 #
0003 # arch/i386/setjmp.S
0004 #
0005 # setjmp/longjmp for the i386 architecture
0006 #
0007
0008 #
0009 # The jmp_buf is assumed to contain the following, in order:
0010 # %ebx
0011 # %esp
0012 # %ebp
0013 # %esi
0014 # %edi
0015 # <return address>
0016 #
0017
0018 .text
0019 .align 4
0020 .globl kernel_setjmp
0021 .type kernel_setjmp, @function
0022 kernel_setjmp:
0023 #ifdef _REGPARM
0024 movl %eax,%edx
0025 #else
0026 movl 4(%esp),%edx
0027 #endif
0028 popl %ecx # Return address, and adjust the stack
0029 xorl %eax,%eax # Return value
0030 movl %ebx,(%edx)
0031 movl %esp,4(%edx) # Post-return %esp!
0032 pushl %ecx # Make the call/return stack happy
0033 movl %ebp,8(%edx)
0034 movl %esi,12(%edx)
0035 movl %edi,16(%edx)
0036 movl %ecx,20(%edx) # Return address
0037 RET
0038
0039 .size kernel_setjmp,.-kernel_setjmp
0040
0041 .text
0042 .align 4
0043 .globl kernel_longjmp
0044 .type kernel_longjmp, @function
0045 kernel_longjmp:
0046 #ifdef _REGPARM
0047 xchgl %eax,%edx
0048 #else
0049 movl 4(%esp),%edx # jmp_ptr address
0050 movl 8(%esp),%eax # Return value
0051 #endif
0052 movl (%edx),%ebx
0053 movl 4(%edx),%esp
0054 movl 8(%edx),%ebp
0055 movl 12(%edx),%esi
0056 movl 16(%edx),%edi
0057 jmp *20(%edx)
0058
0059 .size kernel_longjmp,.-kernel_longjmp