Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10 5/3/83; site aplvax.UUCP Path: utzoo!linus!vaxine!wjh12!harvard!seismo!rlgvax!cvl!umcp-cs!aplvax!mef From: mef@aplvax.UUCP Newsgroups: net.lang,net.lang.forth,net.sources Subject: Signal bug fix (maybe) for VAX FORTH running under 4.2BSD Message-ID: <686@aplvax.UUCP> Date: Thu, 28-Jun-84 17:30:18 EDT Article-I.D.: aplvax.686 Posted: Thu Jun 28 17:30:18 1984 Date-Received: Tue, 10-Jul-84 04:03:22 EDT Organization: JHU/Applied Physics Lab, Laurel, MD Lines: 73 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