Simplify syscall():
 - if the trapframe is of a 32bit process, just call sigexit() instead of 
   returning an error
 - delete other code for 32bit processes
 - 64bit processes only, so SYS__syscall can be handled the same as 
   SYS_syscall
 - delete a superfluous cast

builds and runs fine

ok?


Philip

Index: trap.c
===================================================================
RCS file: /data/src/openbsd/src/sys/arch/sparc64/sparc64/trap.c,v
retrieving revision 1.88
diff -u -p -r1.88 trap.c
--- trap.c      27 Feb 2016 13:08:07 -0000      1.88
+++ trap.c      10 Sep 2016 03:27:37 -0000
@@ -1222,6 +1222,9 @@ syscall(tf, code, pc)
        register_t args[8];
        register_t rval[2];
 
+       if ((tf->tf_out[6] & 1) == 0)
+               sigexit(p, SIGILL);
+
        uvmexp.syscalls++;
        p = curproc;
 #ifdef DIAGNOSTIC
@@ -1255,29 +1258,15 @@ syscall(tf, code, pc)
 
        switch (code) {
        case SYS_syscall:
+       case SYS___syscall:
                code = *ap++;
                nap--;
                break;
-       case SYS___syscall:
-               if (code < nsys && callp[code].sy_call !=
-                   callp[p->p_p->ps_emul->e_nosys].sy_call)
-                       break; /* valid system call */
-               if (tf->tf_out[6] & 1L) {
-                       /* longs *are* quadwords */
-                       code = ap[0];
-                       ap += 1;
-                       nap -= 1;                       
-               } else {
-                       code = ap[_QUAD_LOWWORD];
-                       ap += 2;
-                       nap -= 2;
-               }
-               break;
        }
 
        if (code < 0 || code >= nsys)
                callp += p->p_p->ps_emul->e_nosys;
-       else if (tf->tf_out[6] & 1L) {
+       else {
                register_t *argp;
 
                callp += code;
@@ -1286,7 +1275,7 @@ syscall(tf, code, pc)
                        if (i > 8)
                                panic("syscall nargs");
                        /* Read the whole block in */
-                       if ((error = copyin((caddr_t)(u_long)tf->tf_out[6]
+                       if ((error = copyin((caddr_t)tf->tf_out[6]
                            + BIAS + offsetof(struct frame64, fr_argx),
                            &args[nap], (i - nap) * sizeof(register_t))))
                                goto bad;
@@ -1298,9 +1287,6 @@ syscall(tf, code, pc)
                 */
                for (argp = args; i--;) 
                        *argp++ = *ap++;
-       } else {
-               error = EFAULT;
-               goto bad;
        }
 
        rval[0] = 0;

Reply via email to