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: }
Defined functions
dosig
defined in line
55; used 4 times
Defined variables
sccsid
defined in line
2;
never used