xref: /original-bsd/old/games.vax/compat/dosig.c (revision e59fb703)
1 #ifndef	lint
2 static char sccsid[] = "@(#)dosig.c	4.3  84/05/05";
3 #endif
4 
5 /* From Lou Salkind: compat/RCS/dosig.c,v 1.2 84/01/31 13:34:17 */
6 
7 /*
8  * Handle signal trapping from version 6 or
9  * version 7 compatability mode programs.
10  *	Art Wetzel	November 1979
11  */
12 
13 #ifdef TRACE
14 #include <stdio.h>
15 #endif
16 #include <signal.h>
17 #include "defs.h"
18 
19 int sigtrapped;
20 unsigned int  sigvals[NSIG+1];
21 
22 /* actual catch point for all signals */
23 sigcatch(signum, faultcode, scp)
24 	int signum, faultcode;
25 	struct sigcontext *scp;
26 {
27 	unsigned short *pcptr;
28 	extern getregs();
29 	if(incompat) {
30 		/* hurry up and get the registers before they are destroyed */
31 		getregs();
32 	} else {
33 		/* we were in native mode simulating a sys call */
34 		/* set it up with the old values */
35 		dosig(signum, pc);
36 		/* go back where we were doing the sys call */
37 		return(0);
38 	}
39 	/* figure out the pc */
40 	pcptr = (unsigned short *) &scp->sc_pc;
41 	pc = (unsigned short *) *pcptr;
42 	/* get the psl with condition codes */
43 	psl = 0x83c00000 | (scp->sc_ps & 017);
44 	/* actually do the thing */
45 	if (sigvals[signum] != (unsigned int)SIG_DFL &&
46 	    (sigvals[signum] & (unsigned int)SIG_IGN) == 0)
47 		dosig(signum, pc);
48 	/* go back to compatability mode and the signal routine there */
49 	sigsetmask(scp->sc_mask);
50 	incompat++;
51 	compat();
52 }
53 
54 /* routine to set up pdp11 space for return from a signal */
55 dosig(signum, from)
56 	int signum, from;
57 {
58 	unsigned short *sp;
59 
60 #ifdef TRACE
61 	fprintf(stderr,"Caught sig %d from 0%o -> 0%o\n",signum,(pc-1),*(pc-1));
62 #endif
63 	sigtrapped = 1;
64 	/* where is the stack */
65 	sp = (unsigned short *)regs[6];
66 	/* stack up psw condition codes so rti works */
67 	*(--sp) = psl & 017;
68 	/* stack pc */
69 	*(--sp) = (unsigned short)(int)pc;
70 	/* reset stack pointer */
71 	regs[6] = (unsigned short)(int)sp;
72 	/* reset pc to signal catching routine */
73 	pc = (unsigned short *)sigvals[signum];
74 /*	signal(signum, SIG_DFL); */
75 }
76