Signal bug fix (maybe) for VAX FORTH running under 4.2BSD
mef at aplvax.UUCP
mef at aplvax.UUCP
Fri Jun 29 07:30:18 AEST 1984
John Owens has mailed me the following bug fix for VAX FORTH running
under 4.2BSD. The _SIGNAL code in SYS:ASM will not work. The following C
program using the sigvec system call will emulate the old version of signals.
The code is from /usr/include/signal.h and /usr/src/lib/libc/gen/signal.c
of a 4.2BSD system.
Program:
/*
* Signal vector "template" used in sigvec call.
*/
struct sigvec {
int (*sv_handler)(); /* signal handler */
int sv_mask; /* signal mask to apply */
int sv_onstack; /* if non-zero, take on signal stack */
};
#define BADSIG (int (*)())-1
int (*
signal(s, a))()
int s, (*a)();
{
static struct sigvec osv, sv;
sv.sv_handler = a;
sv.sv_mask = sv.sv_onstack = 0;
if (sigvec(s, &sv, &osv) < 0)
return (BADSIG);
return (osv.sv_handler);
}
I have translated this C code into its equivalent assembly language for
inclusion in SYS:ASM. Replace _SIGNAL with the following:
-----------------------------------------------------------------------
LABEL _SIGVEC 0 , ( ENTRY MASK )
CHMK 6C W$ ( SIGVEC CALL )
BCC 1 FWD
MNEGL 1 L$ 0 REG ( ERROR )
1 L: RET
LABEL SV ( SIGNAL VECTOR; SIGNAL HANDLER, )
0 , 0 , 0 , 0 , 0 , 0 , ( SIGNAL MASK, ? )
LABEL OSV ( OLD SIGNAL VECTOR; SIGNAL HANDLER, )
C ALLOT ( SIGNAL MASK, ? )
LABEL _SIGNAL 0 , ( ENTRY MASK )
MOVL 8 AP X( SV REL ( MOVE NEW SIGNAL HANDLER TO TEMPLATE )
PUSHAL OSV REL ( POINTER TO OLD VECTOR AREA )
PUSHAL SV REL ( POINTER TO NEW VECTOR AREA )
PUSHL 4 AP X( ( PUSH SIGNAL NUMBER )
CALLS 3 L$ _SIGVEC REL ( DO SIGVEC CALL )
TSTL 0 REG
BLSS 1 FWD ( RETURN -1 IF ERROR )
MOVL OSV REL 0 REG ( ELSE RETURN OLD SIGNAL HANDLER )
1 L: RET
-----------------------------------------------------------------------------
I haven't tested this code because I don't have a 4.2 system. I think
it will work. Let me know either way. Thanks.
-John Hayes
Johns Hopkins University
Applied Physics Lab
... seismo!umcp-cs!aplvax!lwt1
More information about the Comp.sources.unix
mailing list