mef@aplvax.UUCP (06/29/84)
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