mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.0 KiB
59 lines
1.0 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
# |
|
# 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
|
|
|