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
sigcatch defined in line 23; used 2 times

Defined variables

sccsid defined in line 2; never used
sigtrapped defined in line 19; used 1 times
  • in line 63
sigvals defined in line 20; used 12 times
Last modified: 1984-05-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1064
Valid CSS Valid XHTML 1.0 Strict