|
|
1.1 ! root 1: static char sccsid[] = "@(#)dosig.c 4.2 83/07/31"; ! 2: ! 3: /* ! 4: * Handle signal trapping from version 6 or ! 5: * version 7 compatability mode programs. ! 6: * Art Wetzel November 1979 ! 7: */ ! 8: ! 9: #ifdef TRACE ! 10: #include <stdio.h> ! 11: #endif ! 12: #include <signal.h> ! 13: #include "defs.h" ! 14: ! 15: unsigned int sigvals[NSIG+1]; ! 16: ! 17: /* actual catch point for all signals */ ! 18: sigcatch(signum, faultcode, scp) ! 19: int signum, faultcode; ! 20: struct sigcontext *scp; ! 21: { ! 22: unsigned short *pcptr; ! 23: extern getregs(); ! 24: if(incompat) { ! 25: /* hurry up and get the registers before they are destroyed */ ! 26: getregs(); ! 27: } else { ! 28: /* we were in native mode simulating a sys call */ ! 29: /* set it up with the old values */ ! 30: dosig(signum, pc); ! 31: /* go back where we were doing the sys call */ ! 32: return(0); ! 33: } ! 34: /* figure out the pc */ ! 35: pcptr = (unsigned short *) &scp->sc_pc; ! 36: pc = (unsigned short *) *pcptr; ! 37: /* get the psl with condition codes */ ! 38: psl = 0x83c00000 | (scp->sc_ps & 017); ! 39: /* actually do the thing */ ! 40: if (sigvals[signum] != (unsigned int)SIG_DFL && ! 41: (sigvals[signum] & (unsigned int)SIG_IGN) == 0) ! 42: dosig(signum, pc); ! 43: /* go back to compatability mode and the signal routine there */ ! 44: sigsetmask(scp->sc_mask); ! 45: incompat++; ! 46: compat(); ! 47: } ! 48: ! 49: /* routine to set up pdp11 space for return from a signal */ ! 50: dosig(signum, from) ! 51: int signum, from; ! 52: { ! 53: unsigned short *sp; ! 54: ! 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: signal(signum, SIG_DFL); ! 69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.