|
|
1.1 root 1: #define FBSD
2: /* Handle signal trapping from version 6 or version 7 compatability
3: * mode programs.
4: * Art Wetzel November 1979
5: */
6: #ifdef TRACE
7: #include <stdio.h>
8: #endif
9: #include <signal.h>
10: #include "defs.h"
11: unsigned int sigvals[NSIG+1];
12: /* actual catch point for all signals */
13: #ifdef FBSD
14: sigcatch(signum,faultcode,myaddr,stpc,stps) int signum;
15: #else
16: sigcatch(signum) int signum;
17: #endif
18: {
19: unsigned short *pcptr;
20: extern getregs();
21: if(incompat) {
22: /* hurry up and get the registers before they are destroyed */
23: getregs();
24: } else {
25: /* we were in native mode simulating a sys call */
26: /* set it up with the old values */
27: dosig(signum, pc);
28: /* go back where we were doing the sys call */
29: return(0);
30: }
31: /* figure out the pc */
32: #ifdef FBSD
33: pcptr = (unsigned short *) &stpc;
34: #else
35: pcptr = (unsigned short *)((char *)&pcptr + 20);
36: #endif
37: pc = (unsigned short *) *pcptr;
38: /* get the psl with condition codes */
39: /* requires UNIX-32V patch to not clear out condition codes */
40: #ifdef FBSD
41: psl = 0x83c00000 | (stps & 017);
42: #else
43: psl = 0x83c00000 | (*(pcptr - 6) & 017);
44: #endif
45: /* actually do the thing */
46: if(sigvals[signum] != (unsigned int)SIG_DFL && (sigvals[signum] & (unsigned int)SIG_IGN) == 0)
47: dosig(signum, pc);
48: /* go back to compatability mode and the signal routine there */
49: incompat++;
50: compat();
51: }
52: /* routine to set up pdp11 space for return from a signal */
53: dosig(signum, from) {
54: unsigned short *sp;
55: #ifdef TRACE
56: fprintf(stderr,"Caught sig %d from 0%o -> 0%o\n",signum,(pc-1),*(pc-1));
57: #endif
58: /* where is the stack */
59: sp = (unsigned short *)regs[6];
60: /* stack up psw condition codes so rti works */
61: *(--sp) = psl & 017;
62: /* stack pc */
63: *(--sp) = (unsigned short)(int)pc;
64: /* reset stack pointer */
65: regs[6] = (unsigned short)(int)sp;
66: /* reset pc to signal catching routine */
67: pc = (unsigned short *)sigvals[signum];
68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.