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 */
sigcatch(signum,faultcode,scp)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 */
dosig(signum,from)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