libc/newlib/libc/sys/go32/longjmp.S

66 lines
1.4 KiB
ArmAsm

/* This is file LONGJMP.S */
/*
** Copyright (C) 1993 DJ Delorie
**
** This file is distributed under the terms listed in the document
** "copying.dj".
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/*
** jmp_buf:
** eax ebx ecx edx esi edi ebp esp eip es fs gs ss
** 0 4 8 12 16 20 24 28 32 36 38 40 42
*/
.globl _longjmp /* jmp_buf, int */
_longjmp:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%edi /* get jmp_buf */
movl 12(%ebp),%eax /* store retval in j->eax */
testl %eax,%eax
jne 0f
incl %eax
0:
movl %eax,0(%edi)
movl 24(%edi),%ebp
pushfl /* get flags so will only re-enable */
popl %ebx /* interrupts if they were previously */
/* enabled */
cli
movw 42(%edi),%ax
movw %ax,%ss
movl 28(%edi),%esp
pushl 32(%edi) /* for a ret! */
pushl %ebx /* save flags that contain previous */
/* interrupt state */
movw 36(%edi),%ax
movw %ax,%es
movw 38(%edi),%ax
movw %ax,%fs
movw 40(%edi),%ax
movw %ax,%gs
movl 0(%edi),%eax
movl 4(%edi),%ebx
movl 8(%edi),%ecx
movl 12(%edi),%edx
movl 16(%edi),%esi
movl 20(%edi),%edi
popfl /* restore previous interrupt state */
ret /* actually jump to new eip */