12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #
- # 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 kernel_setjmp
- .type kernel_setjmp, @function
- kernel_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 kernel_setjmp,.-kernel_setjmp
- .text
- .align 4
- .globl kernel_longjmp
- .type kernel_longjmp, @function
- kernel_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 kernel_longjmp,.-kernel_longjmp
|