Annotation of 43BSD/games/compat/dosig.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.