Setjmp/longjmp updates and cleanup.

This commit is contained in:
David van Moolenbroek
2006-12-08 16:23:18 +00:00
parent 170a72fd61
commit d4e6fe3546
16 changed files with 232 additions and 345 deletions

View File

@@ -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
View 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 $

View File

@@ -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 $

View File

@@ -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 $

View File

@@ -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 $

View File

@@ -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 $

View File

@@ -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;
{

View File

@@ -89,7 +89,6 @@ libc_FILES=" \
sigemptyset.s \
sigfillset.s \
sigismember.s \
siglongjmp.s \
sigpending.s \
sigprocmask.s \
sigreturn.s \

View File

@@ -1,7 +0,0 @@
.sect .text
.extern _longjmp
.define _siglongjmp
.align 2
_siglongjmp:
jmp _longjmp