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;