first stab
authorBill Joy <bill@ucbvax.Berkeley.EDU>
Mon, 19 May 1980 02:36:58 +0000 (18:36 -0800)
committerBill Joy <bill@ucbvax.Berkeley.EDU>
Mon, 19 May 1980 02:36:58 +0000 (18:36 -0800)
SCCS-vsn: sys/vax/vax/trap.c 3.2

usr/src/sys/vax/vax/trap.c

index 8620057..8a9d3d0 100644 (file)
@@ -1,4 +1,4 @@
-/*     trap.c  3.1     %H%     */
+
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -10,6 +10,7 @@
 #include "../h/trap.h"
 #include "../h/psl.h"
 #include "../h/pte.h"
 #include "../h/trap.h"
 #include "../h/psl.h"
 #include "../h/pte.h"
+#include "../h/inline.h"
 
 #define        USER    040             /* user-mode flag added to type */
 
 
 #define        USER    040             /* user-mode flag added to type */
 
@@ -48,49 +49,14 @@ unsigned code;
        case PRIVINFLT + USER:  /* privileged instruction fault */
        case RESADFLT + USER:   /* reserved addressing fault */
        case RESOPFLT + USER:   /* resereved operand fault */
        case PRIVINFLT + USER:  /* privileged instruction fault */
        case RESADFLT + USER:   /* reserved addressing fault */
        case RESOPFLT + USER:   /* resereved operand fault */
-               i = SIGINS;
+               i = SIGILL;
                break;
 
        case RESCHED + USER:    /* Allow process switch */
                goto out;
 
                break;
 
        case RESCHED + USER:    /* Allow process switch */
                goto out;
 
-/* OLD CODE... see syscall() below
-       case SYSCALL + USER:
-               params = (caddr_t)locr0[AP] + NBPW;
-               u.u_error = 0;
-               callp = &sysent[code&0177];
-               if (callp == sysent) {
-                       i = fuword(params);
-                       params += NBPW;
-                       callp = &sysent[i&0177];
-               }
-               if (i = callp->sy_narg)
-                       if (copyin(params, &u.u_arg[0], i*NBPW)) {
-                               u.u_error = EFAULT;
-                               goto bad;
-                       }
-               u.u_ap = u.u_arg;
-               locr0[PS] &= ~PSL_C;
-               u.u_dirp = (caddr_t)u.u_arg[0];
-               u.u_r.r_val1 = 0;
-               u.u_r.r_val2 = locr0[R1];
-               if (setjmp(u.u_qsav)) {
-                       if (u.u_error==0)
-                               u.u_error = EINTR;
-               } else
-                       (*(callp->sy_call))();
-               if(u.u_error) {
-                       locr0[R0] = u.u_error;
-                       locr0[PS] |= PSL_C;
-               } else {
-                       locr0[R0] = u.u_r.r_val1;
-                       locr0[R1] = u.u_r.r_val2;
-               }
-               goto out;
-END OF OLD CODE REPLACED BY syscall() */
-
        case ARITHTRAP + USER:
        case ARITHTRAP + USER:
-               i = SIGFPT;
+               i = SIGFPE;
                break;
 
        /*
                break;
 
        /*
@@ -100,7 +66,7 @@ END OF OLD CODE REPLACED BY syscall() */
        case SEGFLT + USER: /* segmentation exception */
                if(grow((unsigned)locr0[SP]) || grow(code))
                        goto out;
        case SEGFLT + USER: /* segmentation exception */
                if(grow((unsigned)locr0[SP]) || grow(code))
                        goto out;
-               i = SIGSEG;
+               i = SIGSEGV;
                break;
 
        case TABLEFLT:          /* allow page table faults in kernel mode */
                break;
 
        case TABLEFLT:          /* allow page table faults in kernel mode */
@@ -123,7 +89,7 @@ END OF OLD CODE REPLACED BY syscall() */
        case BPTFLT + USER:     /* bpt instruction fault */
        case TRCTRAP + USER:    /* trace trap */
                locr0[PS] &= ~PSL_T;    /* turn off trace bit */
        case BPTFLT + USER:     /* bpt instruction fault */
        case TRCTRAP + USER:    /* trace trap */
                locr0[PS] &= ~PSL_T;    /* turn off trace bit */
-               i = SIGTRC;
+               i = SIGTRAP;
                break;
 
        case XFCFLT + USER:     /* xfc instruction fault */
                break;
 
        case XFCFLT + USER:     /* xfc instruction fault */
@@ -132,13 +98,13 @@ END OF OLD CODE REPLACED BY syscall() */
 
        case COMPATFLT + USER:  /* compatibility mode fault */
                u.u_cfcode = code;
 
        case COMPATFLT + USER:  /* compatibility mode fault */
                u.u_cfcode = code;
-               i = SIGINS;
+               i = SIGILL;
                break;
        }
        psignal(u.u_procp, i);
 out:
        p = u.u_procp;
                break;
        }
        psignal(u.u_procp, i);
 out:
        p = u.u_procp;
-       if(p->p_sig && issig())         /* check p_sig to save time */
+       if (p->p_cursig || ISSIG(p))
                psig();
        p->p_pri = p->p_usrpri;
        if (runrun) {
                psig();
        p->p_pri = p->p_usrpri;
        if (runrun) {
@@ -159,10 +125,6 @@ out:
        curpri = p->p_pri;
 }
 
        curpri = p->p_pri;
 }
 
-#ifdef FASTVAX
-asm(".globl _eintr");
-#endif
-
 /*
  * Called from the trap handler when a system call occurs
  */
 /*
  * Called from the trap handler when a system call occurs
  */
@@ -176,6 +138,7 @@ unsigned code;
        register struct sysent *callp;
        register struct proc *p;
        time_t syst;
        register struct sysent *callp;
        register struct proc *p;
        time_t syst;
+       int opc;
 
        syst = u.u_vm.vm_stime;
        if (!USERMODE(locr0[PS]))
 
        syst = u.u_vm.vm_stime;
        if (!USERMODE(locr0[PS]))
@@ -183,6 +146,9 @@ unsigned code;
        u.u_ar0 = locr0;
        params = (caddr_t)locr0[AP] + NBPW;
        u.u_error = 0;
        u.u_ar0 = locr0;
        params = (caddr_t)locr0[AP] + NBPW;
        u.u_error = 0;
+       opc = u.u_ar0[PC] - 2;
+       if (code > 63)
+               opc -= 2;
        callp = &sysent[code&0177];
        if (callp == sysent) {
                i = fuword(params);
        callp = &sysent[code&0177];
        if (callp == sysent) {
                i = fuword(params);
@@ -190,29 +156,30 @@ unsigned code;
                callp = &sysent[i&0177];
        }
        if (i = callp->sy_narg * sizeof (int)) {
                callp = &sysent[i&0177];
        }
        if (i = callp->sy_narg * sizeof (int)) {
-               asm("prober $3,r9,(r10)");
-               asm("bnequ ok");
-               u.u_error = EFAULT;
-               goto bad;
-asm("ok:");
-               asm("movc3 r9,(r10),_u+U_ARG");
+               asm("prober $3,r9,(r10)");              /* GROT */
+               asm("bnequ ok");                        /* GROT */
+               u.u_error = EFAULT;                     /* GROT */
+               goto bad;                               /* GROT */
+asm("ok:");                                            /* GROT */
+               asm("movc3 r9,(r10),_u+U_ARG");         /* GROT */
        }
        u.u_ap = u.u_arg;
        }
        u.u_ap = u.u_arg;
-       locr0[PS] &= ~PSL_C;
        u.u_dirp = (caddr_t)u.u_arg[0];
        u.u_r.r_val1 = 0;
        u.u_r.r_val2 = locr0[R1];
        u.u_dirp = (caddr_t)u.u_arg[0];
        u.u_r.r_val1 = 0;
        u.u_r.r_val2 = locr0[R1];
-       /*
-        * INLINE EXPANSION OF setjmp().  NOTE THAT THIS ONLY
-        * RESTORES fp,sp, and r11=locr0 ON INTERRRUPTS (MATCHING
-        * CODE IN slp.c).
-        */
-       asm("movl fp,_u+U_QSAV");
-       asm("movl sp,_u+U_QSAV+4");
-       asm("movl r11,_u+U_QSAV+8");
-       (*(callp->sy_call))();
-asm("_eintr:");
-       if(u.u_error) {
+       if (setjmp(u.u_qsav)) {
+               if (u.u_error == 0 && u.u_eosys == JUSTRETURN)
+                       u.u_error = EINTR;
+       } else {
+               u.u_eosys = JUSTRETURN;
+               (*(callp->sy_call))();
+       }
+       locr0[PS] &= ~PSL_C;
+       if (u.u_eosys == RESTARTSYS)
+               pc = opc;
+       else if (u.u_eosys == SIMULATERTI)
+               dorti();
+       else if (u.u_error) {
 bad:
                locr0[R0] = u.u_error;
                locr0[PS] |= PSL_C;     /* carry bit */
 bad:
                locr0[R0] = u.u_error;
                locr0[PS] |= PSL_C;     /* carry bit */
@@ -221,7 +188,7 @@ bad:
                locr0[R1] = u.u_r.r_val2;
        }
        p = u.u_procp;
                locr0[R1] = u.u_r.r_val2;
        }
        p = u.u_procp;
-       if(p->p_sig && issig())         /* check p_sig to save time */
+       if (p->p_cursig || ISSIG(p))
                psig();
        p->p_pri = p->p_usrpri;
        if (runrun) {
                psig();
        p->p_pri = p->p_usrpri;
        if (runrun) {