Setjmp/longjmp updates and cleanup.
This commit is contained in:
@@ -2,9 +2,7 @@
|
||||
LIBRARIES=libc
|
||||
|
||||
libc_FILES=" \
|
||||
_longjmp.gs \
|
||||
_setjmp.gs \
|
||||
longjmp.gs \
|
||||
setjmp.gs"
|
||||
__setjmp.gs \
|
||||
longjmp.gs"
|
||||
|
||||
TYPE=gnu
|
||||
|
||||
31
lib/gnu/rts/__setjmp.gs
Normal file
31
lib/gnu/rts/__setjmp.gs
Normal file
@@ -0,0 +1,31 @@
|
||||
/ __setjmp.gnu.s
|
||||
/
|
||||
/ Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||
|
||||
.text
|
||||
.globl ___setjmp
|
||||
___setjmp:
|
||||
movl 4(%esp), %eax # jmp_buf
|
||||
movl %edx, 28(%eax) # save edx
|
||||
movl 0(%esp), %edx
|
||||
movl %edx, 8(%eax) # save program counter
|
||||
movl %esp, 12(%eax) # save stack pointer
|
||||
movl %ebp, 16(%eax) # save frame pointer
|
||||
movl %ebx, 20(%eax)
|
||||
movl %ecx, 24(%eax)
|
||||
movl %esi, 32(%eax)
|
||||
movl %edi, 36(%eax)
|
||||
|
||||
movl 8(%esp), %edx # save mask?
|
||||
movl %edx, 0(%eax) # save whether to restore mask
|
||||
testl %edx, %edx
|
||||
jz 1f
|
||||
leal 4(%eax), %edx # pointer to sigset_t
|
||||
pushl %edx
|
||||
call ___newsigset # save mask
|
||||
addl $4, %esp
|
||||
1:
|
||||
movl $0, %eax
|
||||
ret
|
||||
|
||||
/ $PchId: __setjmp.gnu.s,v 1.4 1996/03/12 19:30:54 philip Exp $
|
||||
@@ -1,38 +0,0 @@
|
||||
/ _longjmp.gnu.s
|
||||
/
|
||||
/ Created: Oct 15, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||
|
||||
.text
|
||||
.globl __longjmp
|
||||
__longjmp:
|
||||
movl 4(%esp), %eax # jmp_buf
|
||||
cmpl $0, 0(%eax) # save mask?
|
||||
je 1f
|
||||
leal 4(%eax), %ebx # pointer to sigset_t
|
||||
pushl %ebx
|
||||
call ___oldsigset # restore mask
|
||||
addl $4, %esp
|
||||
movl 4(%esp), %eax # jmp_buf
|
||||
1:
|
||||
movl 8(%esp), %ecx # result value
|
||||
movl 12(%eax), %esp # restore stack pointer
|
||||
|
||||
movl 8(%eax), %ebx # restore program counter
|
||||
movl %ebx, 0(%esp)
|
||||
|
||||
pushl %ecx # save result code
|
||||
|
||||
movl 16(%eax), %ebp # restore frame pointer
|
||||
movl 20(%eax), %ebx
|
||||
movl 24(%eax), %ecx
|
||||
movl 28(%eax), %edx
|
||||
movl 32(%eax), %esi
|
||||
movl 36(%eax), %edi
|
||||
pop %eax
|
||||
testl %eax, %eax
|
||||
jz 1f
|
||||
ret
|
||||
1: movl $1, %eax
|
||||
ret
|
||||
|
||||
/ $PchId: _longjmp.gnu.s,v 1.4 1996/03/12 19:30:02 philip Exp $
|
||||
@@ -1,35 +0,0 @@
|
||||
/ _setjmp.gnu.s
|
||||
/
|
||||
/ Created: Oct 14, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||
|
||||
.text
|
||||
.globl ___setjmp
|
||||
___setjmp:
|
||||
movl 4(%esp), %eax # jmp_buf
|
||||
movl %ebx, 20(%eax) # save ebx
|
||||
movl 0(%esp), %ebx
|
||||
movl %ebx, 8(%eax) # save program counter
|
||||
movl %esp, 12(%eax) # save stack pointer
|
||||
movl %ebp, 16(%eax) # save frame pointer
|
||||
movl %ecx, 24(%eax)
|
||||
movl %edx, 28(%eax)
|
||||
movl %esi, 32(%eax)
|
||||
movl %edi, 36(%eax)
|
||||
|
||||
movl 8(%esp), %ebx # save mask?
|
||||
movl %ebx, 0(%eax) # save whether to restore mask
|
||||
|
||||
pushl 20(%eax) # save ebx
|
||||
|
||||
testl %ebx, %ebx
|
||||
jz 1f
|
||||
leal 4(%eax), %ebx # pointer to sigset_t
|
||||
pushl %ebx
|
||||
call ___newsigset # save mask
|
||||
addl $4, %esp
|
||||
1:
|
||||
popl %ebx
|
||||
movl $0, %eax
|
||||
ret
|
||||
|
||||
/ $PchId: _setjmp.gnu.s,v 1.4 1996/03/12 19:30:54 philip Exp $
|
||||
@@ -1,6 +1,38 @@
|
||||
.text
|
||||
.globl _longjmp
|
||||
_longjmp:
|
||||
jmp __longjmp
|
||||
/ longjmp.gnu.s
|
||||
/
|
||||
/ Created: Oct 15, 1993 by Philip Homburg <philip@cs.vu.nl>
|
||||
|
||||
/ $PchId: longjmp.gnu.s,v 1.4 1996/03/12 19:31:18 philip Exp $
|
||||
.text
|
||||
.globl _longjmp
|
||||
_longjmp:
|
||||
movl 4(%esp), %eax # jmp_buf
|
||||
cmpl $0, 0(%eax) # save mask?
|
||||
je 1f
|
||||
leal 4(%eax), %edx # pointer to sigset_t
|
||||
pushl %edx
|
||||
call ___oldsigset # restore mask
|
||||
addl $4, %esp
|
||||
movl 4(%esp), %eax # jmp_buf
|
||||
1:
|
||||
movl 8(%esp), %ecx # result value
|
||||
movl 12(%eax), %esp # restore stack pointer
|
||||
|
||||
movl 8(%eax), %edx # restore program counter
|
||||
movl %edx, 0(%esp)
|
||||
|
||||
pushl %ecx # save result code
|
||||
|
||||
movl 16(%eax), %ebp # restore frame pointer
|
||||
movl 20(%eax), %ebx
|
||||
movl 24(%eax), %ecx
|
||||
movl 28(%eax), %edx
|
||||
movl 32(%eax), %esi
|
||||
movl 36(%eax), %edi
|
||||
pop %eax
|
||||
testl %eax, %eax
|
||||
jz 1f
|
||||
ret
|
||||
1: movl $1, %eax
|
||||
ret
|
||||
|
||||
/ $PchId: longjmp.gnu.s,v 1.4 1996/03/12 19:30:02 philip Exp $
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
.text
|
||||
.globl _setjmp
|
||||
_setjmp:
|
||||
jmp ___setjmp
|
||||
|
||||
/ $PchId: setjmp.gnu.s,v 1.4 1996/03/12 19:31:18 philip Exp $
|
||||
@@ -1,42 +1,10 @@
|
||||
#include <lib.h>
|
||||
#define sigfillset _sigfillset
|
||||
#define sigjmp _sigjmp
|
||||
#define sigprocmask _sigprocmask
|
||||
#define sigreturn _sigreturn
|
||||
#include <sys/sigcontext.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
|
||||
_PROTOTYPE( int sigjmp, (jmp_buf jb, int retval));
|
||||
|
||||
#if (_SETJMP_SAVES_REGS == 0)
|
||||
/* 'sigreturn' using a short format jmp_buf (no registers saved). */
|
||||
PUBLIC int sigjmp(jb, retval)
|
||||
jmp_buf jb;
|
||||
int retval;
|
||||
{
|
||||
struct sigcontext sc;
|
||||
|
||||
sc.sc_flags = jb[0].__flags;
|
||||
sc.sc_mask = jb[0].__mask;
|
||||
|
||||
#if (CHIP == INTEL)
|
||||
sc.sc_pc = (int) jb[0].__pc;
|
||||
sc.sc_sp = (int) jb[0].__sp;
|
||||
sc.sc_fp = (int) jb[0].__lb;
|
||||
#endif
|
||||
|
||||
#if (CHIP == M68000)
|
||||
sc.sc_pc = (long) jb[0].__pc;
|
||||
sc.sc_sp = (long) jb[0].__sp;
|
||||
sc.sc_fp = (long) jb[0].__lb;
|
||||
#endif
|
||||
|
||||
sc.sc_retreg = retval;
|
||||
return sigreturn(&sc);
|
||||
}
|
||||
#endif
|
||||
|
||||
PUBLIC int sigreturn(scp)
|
||||
register struct sigcontext *scp;
|
||||
{
|
||||
|
||||
@@ -89,7 +89,6 @@ libc_FILES=" \
|
||||
sigemptyset.s \
|
||||
sigfillset.s \
|
||||
sigismember.s \
|
||||
siglongjmp.s \
|
||||
sigpending.s \
|
||||
sigprocmask.s \
|
||||
sigreturn.s \
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
.sect .text
|
||||
.extern _longjmp
|
||||
.define _siglongjmp
|
||||
.align 2
|
||||
|
||||
_siglongjmp:
|
||||
jmp _longjmp
|
||||
Reference in New Issue
Block a user