2006-09-26 13:32:59 +07:00
|
|
|
#
|
|
|
|
# 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
|
2017-05-24 07:32:31 +07:00
|
|
|
.globl kernel_setjmp
|
|
|
|
.type kernel_setjmp, @function
|
|
|
|
kernel_setjmp:
|
2006-09-26 13:32:59 +07:00
|
|
|
#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
|
|
|
|
|
2017-05-24 07:32:31 +07:00
|
|
|
.size kernel_setjmp,.-kernel_setjmp
|
2006-09-26 13:32:59 +07:00
|
|
|
|
|
|
|
.text
|
|
|
|
.align 4
|
2017-05-24 07:32:31 +07:00
|
|
|
.globl kernel_longjmp
|
|
|
|
.type kernel_longjmp, @function
|
|
|
|
kernel_longjmp:
|
2006-09-26 13:32:59 +07:00
|
|
|
#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)
|
|
|
|
|
2017-05-24 07:32:31 +07:00
|
|
|
.size kernel_longjmp,.-kernel_longjmp
|