remove support for syscall(2) -- the "indirection system call" because
authorderaadt <deraadt@openbsd.org>
Tue, 12 Dec 2023 15:30:55 +0000 (15:30 +0000)
committerderaadt <deraadt@openbsd.org>
Tue, 12 Dec 2023 15:30:55 +0000 (15:30 +0000)
it is a dangerous alternative entry point for all system calls, and thus
incompatible with the precision system call entry point scheme we are
heading towards.  This has been a 3-year mission:
First perl needed a code-generated wrapper to fake syscall(2) as a giant
switch table, then all the ports were cleaned with relatively minor fixes,
except for "go".  "go" required two fixes -- 1) a framework issue with
old library versions, and 2) like perl, a fake syscall(2) wrapper to
handle ioctl(2) and sysctl(2) because "syscall(SYS_ioctl" occurs all over
the place in the "go" ecosystem because the "go developers" are plan9-loving
unix-hating folk who tried to build an ecosystem without allowing "ioctl".
ok kettenis, jsing, afresh1, sthen

24 files changed:
include/unistd.h
lib/libc/Symbols.list
lib/libc/hidden/unistd.h
lib/libc/sys/Makefile.inc
lib/libc/sys/syscall.2
sys/arch/alpha/alpha/trap.c
sys/arch/amd64/amd64/locore.S
sys/arch/amd64/amd64/trap.c
sys/arch/arm/arm/syscall.c
sys/arch/arm64/arm64/syscall.c
sys/arch/hppa/hppa/trap.c
sys/arch/i386/i386/trap.c
sys/arch/m88k/m88k/trap.c
sys/arch/mips64/mips64/trap.c
sys/arch/powerpc/powerpc/trap.c
sys/arch/powerpc64/powerpc64/syscall.c
sys/arch/riscv64/riscv64/syscall.c
sys/arch/sh/sh/trap.c
sys/arch/sparc64/sparc64/trap.c
sys/kern/kern_ktrace.c
sys/kern/syscalls.master
sys/sys/ktrace.h
sys/sys/syscall_mi.h
usr.bin/kdump/kdump.c

index 7713470..b87979e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: unistd.h,v 1.107 2023/01/07 05:24:58 guenther Exp $ */
+/*     $OpenBSD: unistd.h,v 1.108 2023/12/12 15:30:55 deraadt Exp $ */
 /*     $NetBSD: unistd.h,v 1.26.4.1 1996/05/28 02:31:51 mrg Exp $      */
 
 /*-
@@ -522,7 +522,6 @@ int  setthrname(pid_t, const char *);
 void    setusershell(void);
 int     strtofflags(char **, u_int32_t *, u_int32_t *);
 int     swapctl(int cmd, const void *arg, int misc);
-int     syscall(int, ...);
 int     getentropy(void *, size_t);
 int     pledge(const char *, const char *);
 int     unveil(const char *, const char *);
index f18c6ba..a6bc65f 100644 (file)
@@ -434,7 +434,6 @@ symlink
 symlinkat
 sync
 sysarch
-syscall
 timer_create
 timer_delete
 timer_getoverrun
index c595095..74918f5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: unistd.h,v 1.12 2023/05/18 16:11:09 guenther Exp $    */
+/*     $OpenBSD: unistd.h,v 1.13 2023/12/12 15:30:55 deraadt Exp $     */
 /*
  * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org>
  *
@@ -157,7 +157,6 @@ PROTO_NORMAL(swapctl);
 PROTO_NORMAL(symlink);
 PROTO_NORMAL(symlinkat);
 PROTO_NORMAL(sync);
-PROTO_NORMAL(syscall);
 PROTO_NORMAL(sysconf);
 PROTO_DEPRECATED(tcgetpgrp);
 PROTO_DEPRECATED(tcsetpgrp);
index 28f1ac7..45c3754 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile.inc,v 1.175 2023/12/11 00:34:24 deraadt Exp $
+#      $OpenBSD: Makefile.inc,v 1.176 2023/12/12 15:30:55 deraadt Exp $
 #      $NetBSD: Makefile.inc,v 1.35 1995/10/16 23:49:07 jtc Exp $
 #      @(#)Makefile.inc        8.1 (Berkeley) 6/17/93
 
@@ -8,7 +8,7 @@
 # modules with non-default implementations on at least one architecture:
 SRCS+= Ovfork.S brk.S ${CERROR} \
        sbrk.S sigpending.S sigprocmask.S \
-       sigsuspend.S syscall.S tfork_thread.S
+       sigsuspend.S tfork_thread.S
 
 # glue to offer userland wrappers for some syscalls
 SRCS+= posix_madvise.c pthread_sigmask.c \
@@ -216,7 +216,7 @@ MAN+=       __get_tcb.2 __thrsigdivert.2 __thrsleep.2 _exit.2 accept.2 \
        shmctl.2 shmget.2 shutdown.2 sigaction.2 sigaltstack.2 sigpending.2 \
        sigprocmask.2 sigreturn.2 sigsuspend.2 socket.2 \
        socketpair.2 stat.2 statfs.2 swapctl.2 symlink.2 \
-       sync.2 sysarch.2 syscall.2 sysctl.2 thrkill.2 truncate.2 \
+       sync.2 sysarch.2 sysctl.2 thrkill.2 truncate.2 \
        umask.2 unlink.2 unveil.2 utimes.2 utrace.2 vfork.2 \
        wait.2 waitid.2 write.2 \
        ypconnect.2
index 754d012..e69de29 100644 (file)
@@ -1,68 +0,0 @@
-.\"    $OpenBSD: syscall.2,v 1.16 2023/02/22 07:04:50 jmc Exp $
-.\"    $NetBSD: syscall.2,v 1.4 1995/02/27 12:38:53 cgd Exp $
-.\"
-.\" Copyright (c) 1980, 1991, 1993
-.\"    The Regents of the University of California.  All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\"     @(#)syscall.2  8.1 (Berkeley) 6/16/93
-.\"
-.Dd $Mdocdate: February 22 2023 $
-.Dt SYSCALL 2
-.Os
-.Sh NAME
-.Nm syscall
-.Nd indirect system call
-.Sh SYNOPSIS
-.In sys/syscall.h
-.In unistd.h
-.Ft int
-.Fn syscall "int number" "..."
-.Sh DESCRIPTION
-.Fn syscall
-performs the system call whose assembly language
-interface has the specified
-.Fa number
-with the specified arguments.
-Symbolic constants for system calls can be found in the header file
-.In sys/syscall.h .
-.Sh RETURN VALUES
-The return values are defined by the system call being invoked.
-In general, for system calls returning
-.Va int ,
-a 0 return value indicates success.
-A \-1 return value indicates an error,
-and an error code is stored in
-.Va errno .
-.Sh HISTORY
-The predecessor of these functions, the former
-.Fn indir
-system call, first appeared in
-.At v4 .
-The
-.Fn syscall
-function first appeared in
-.Bx 3 .
index abe6940..fc697aa 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.108 2023/03/08 04:43:07 guenther Exp $ */
+/* $OpenBSD: trap.c,v 1.109 2023/12/12 15:30:55 deraadt Exp $ */
 /* $NetBSD: trap.c,v 1.52 2000/05/24 16:48:33 thorpej Exp $ */
 
 /*-
@@ -497,17 +497,15 @@ dopanic:
  * a3, and v0 from the frame before returning to the user process.
  */
 void
-syscall(code, framep)
-       u_int64_t code;
-       struct trapframe *framep;
+syscall(u_int64_t code, struct trapframe *framep)
 {
-       const struct sysent *callp;
+       const struct sysent *callp = sysent;
        struct proc *p;
-       int error, indirect = -1;
+       int error;
        u_int64_t opc;
        u_long rval[2];
        u_long args[10];                                        /* XXX */
-       u_int hidden, nargs;
+       u_int nargs;
 
        atomic_add_int(&uvmexp.syscalls, 1);
        p = curproc;
@@ -515,24 +513,11 @@ syscall(code, framep)
        framep->tf_regs[FRAME_SP] = alpha_pal_rdusp();
        opc = framep->tf_regs[FRAME_PC] - 4;
 
-       switch(code) {
-       case SYS_syscall:
-               indirect = code;
-               code = framep->tf_regs[FRAME_A0];
-               hidden = 1;
-               break;
-       default:
-               hidden = 0;
-       }
-
-       error = 0;
-       callp = sysent;
-       if (code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
 
-       nargs = callp->sy_narg + hidden;
+       nargs = callp->sy_narg;
        switch (nargs) {
        default:
                if (nargs > 10)         /* XXX */
@@ -559,7 +544,7 @@ syscall(code, framep)
        rval[0] = 0;
        rval[1] = 0;
 
-       error = mi_syscall(p, code, indirect, callp, args + hidden, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
index b36ab19..b8b9c32 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: locore.S,v 1.143 2023/12/12 07:37:20 deraadt Exp $    */
+/*     $OpenBSD: locore.S,v 1.144 2023/12/12 15:30:55 deraadt Exp $    */
 /*     $NetBSD: locore.S,v 1.13 2004/03/25 18:33:17 drochner Exp $     */
 
 /*
@@ -507,6 +507,7 @@ ENTRY(savectx)
        lfence
 END(savectx)
 
+// XXX this should not behave like a nop
 IDTVEC(syscall32)
        sysret          /* go away please */
 END(Xsyscall32)
index 8fc51b3..bccc016 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.101 2023/07/05 12:58:55 kn Exp $   */
+/*     $OpenBSD: trap.c,v 1.102 2023/12/12 15:30:55 deraadt Exp $      */
 /*     $NetBSD: trap.c,v 1.2 2003/05/04 23:51:56 fvdl Exp $    */
 
 /*-
@@ -553,7 +553,7 @@ syscall(struct trapframe *frame)
        caddr_t params;
        const struct sysent *callp;
        struct proc *p;
-       int error, indirect = -1;
+       int error = ENOSYS;
        size_t argsize, argoff;
        register_t code, args[9], rval[2], *argp;
 
@@ -570,26 +570,9 @@ syscall(struct trapframe *frame)
        argp = &args[0];
        argoff = 0;
 
-       switch (code) {
-       case SYS_syscall:
-               /*
-                * Code is first argument, followed by actual args.
-                */
-               indirect = code;
-               code = frame->tf_rdi;
-               argp = &args[1];
-               argoff = 1;
-               break;
-       default:
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
-               callp += code;
-
+       if (code <= 0 || code >= SYS_MAXSYSCALL)
+               goto bad;
+       callp = sysent + code;
        argsize = (callp->sy_argsize >> 3) + argoff;
        if (argsize) {
                switch (MIN(argsize, 6)) {
@@ -620,7 +603,7 @@ syscall(struct trapframe *frame)
        rval[0] = 0;
        rval[1] = 0;
 
-       error = mi_syscall(p, code, indirect, callp, argp, rval);
+       error = mi_syscall(p, code, callp, argp, rval);
 
        switch (error) {
        case 0:
index c23dcc3..3879834 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.c,v 1.26 2023/02/11 23:07:26 deraadt Exp $    */
+/*     $OpenBSD: syscall.c,v 1.27 2023/12/12 15:30:55 deraadt Exp $    */
 /*     $NetBSD: syscall.c,v 1.24 2003/11/14 19:03:17 scw Exp $ */
 
 /*-
@@ -93,8 +93,8 @@ void
 swi_handler(trapframe_t *frame)
 {
        struct proc *p = curproc;
-       const struct sysent *callp;
-       int code, error, indirect = -1;
+       const struct sysent *callp = sysent;
+       int code, error;
        u_int nap = 4, nargs;
        register_t *ap, *args, copyargs[MAXARGS], rval[2];
 
@@ -103,31 +103,18 @@ swi_handler(trapframe_t *frame)
        /* Before enabling interrupts, save FPU state */
        vfp_save();
 
-       /* Re-enable interrupts if they were enabled previously */
-       if (__predict_true((frame->tf_spsr & PSR_I) == 0))
-               enable_interrupts(PSR_I);
+       enable_interrupts(PSR_I);
 
        p->p_addr->u_pcb.pcb_tf = frame;
 
        /* Skip over speculation-blocking barrier. */
        frame->tf_pc += 8;
 
-       code = frame->tf_r12;
-
        ap = &frame->tf_r0;
 
-       switch (code) { 
-       case SYS_syscall:
-               indirect = code;
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       code = frame->tf_r12;
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
 
        nargs = callp->sy_argsize / sizeof(register_t);
@@ -145,27 +132,23 @@ swi_handler(trapframe_t *frame)
        rval[0] = 0;
        rval[1] = frame->tf_r1;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
                frame->tf_r0 = rval[0];
                frame->tf_r1 = rval[1];
-
                frame->tf_spsr &= ~PSR_C;       /* carry bit */
                break;
-
        case ERESTART:
                /*
                 * Reconstruct the pc to point at the swi.
                 */
                frame->tf_pc -= 12;
                break;
-
        case EJUSTRETURN:
                /* nothing to do */
                break;
-
        default:
        bad:
                frame->tf_r0 = error;
index 0f3b52f..eec3777 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: syscall.c,v 1.14 2023/04/13 02:19:04 jsg Exp $ */
+/* $OpenBSD: syscall.c,v 1.15 2023/12/12 15:30:55 deraadt Exp $ */
 /*
  * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
  *
@@ -33,7 +33,7 @@ svc_handler(trapframe_t *frame)
 {
        struct proc *p = curproc;
        const struct sysent *callp;
-       int code, error, indirect = -1;
+       int code, error = ENOSYS, indirect = -1;
        u_int nap = 8, nargs;
        register_t *ap, *args, copyargs[MAXARGS], rval[2];
 
@@ -50,20 +50,10 @@ svc_handler(trapframe_t *frame)
 
        ap = &frame->tf_x[0];
 
-       switch (code) { 
-       case SYS_syscall:
-               indirect = code;
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
        if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
-               callp += code;
+               goto bad;
 
+       callp = sysent + code;
        nargs = callp->sy_argsize / sizeof(register_t);
        if (nargs <= nap) {
                args = ap;
@@ -79,25 +69,22 @@ svc_handler(trapframe_t *frame)
        rval[0] = 0;
        rval[1] = 0;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
                frame->tf_x[0] = rval[0];
                frame->tf_spsr &= ~PSR_C;       /* carry bit */
                break;
-
        case ERESTART:
                /*
                 * Reconstruct the pc to point at the svc.
                 */
                frame->tf_elr -= 12;
                break;
-
        case EJUSTRETURN:
                /* nothing to do */
                break;
-
        default:
        bad:
                frame->tf_x[0] = error;
index bebd3c0..2a92b7d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.161 2023/02/11 23:07:26 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.162 2023/12/12 15:30:55 deraadt Exp $      */
 
 /*
  * Copyright (c) 1998-2004 Michael Shalayeff
@@ -764,8 +764,8 @@ void
 syscall(struct trapframe *frame)
 {
        struct proc *p = curproc;
-       const struct sysent *callp;
-       int retq, code, argsize, argoff, error, indirect = -1;
+       const struct sysent *callp = sysent;
+       int retq, code, argsize, argoff, error;
        register_t args[8], rval[2];
 #ifdef DIAGNOSTIC
        int oldcpl = curcpu()->ci_cpl;
@@ -779,27 +779,13 @@ syscall(struct trapframe *frame)
        p->p_md.md_regs = frame;
 
        argoff = 4; retq = 0;
-       switch (code = frame->tf_t1) {
-       case SYS_syscall:
-               indirect = code;
-               code = frame->tf_arg0;
-               args[0] = frame->tf_arg1;
-               args[1] = frame->tf_arg2;
-               args[2] = frame->tf_arg3;
-               argoff = 3;
-               break;
-       default:
-               args[0] = frame->tf_arg0;
-               args[1] = frame->tf_arg1;
-               args[2] = frame->tf_arg2;
-               args[3] = frame->tf_arg3;
-               break;
-       }
+       args[0] = frame->tf_arg0;
+       args[1] = frame->tf_arg1;
+       args[2] = frame->tf_arg2;
+       args[3] = frame->tf_arg3;
 
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
 
        if ((argsize = callp->sy_argsize)) {
@@ -851,7 +837,7 @@ syscall(struct trapframe *frame)
        rval[0] = 0;
        rval[1] = frame->tf_ret1;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
@@ -872,7 +858,7 @@ syscall(struct trapframe *frame)
                break;
        }
 
-       ast(p);
+       ast(p);         // XXX why?
 
        mi_syscall_return(p, code, error, rval);
 
index 8208c89..69860df 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.162 2023/04/16 06:43:49 jsg Exp $  */
+/*     $OpenBSD: trap.c,v 1.163 2023/12/12 15:30:55 deraadt Exp $      */
 /*     $NetBSD: trap.c,v 1.95 1996/05/05 06:50:02 mycroft Exp $        */
 
 /*-
@@ -516,9 +516,9 @@ void
 syscall(struct trapframe *frame)
 {
        caddr_t params;
-       const struct sysent *callp;
-       struct proc *p;
-       int error, indirect = -1;
+       const struct sysent *callp = sysent;
+       struct proc *p = curproc;
+       int error;
        register_t code, args[8], rval[2];
 #ifdef DIAGNOSTIC
        int ocpl = lapic_tpr;
@@ -540,38 +540,22 @@ syscall(struct trapframe *frame)
        }
 #endif
 
-       p = curproc;
        p->p_md.md_regs = frame;
-       code = frame->tf_eax;
-
-       params = (caddr_t)frame->tf_esp + sizeof(int);
 
-       switch (code) {
-       case SYS_syscall:
-               /*
-                * Code is first argument, followed by actual args.
-                */
-               indirect = code;
-               copyin(params, &code, sizeof(int));
-               params += sizeof(int);
-               break;
-       default:
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       code = frame->tf_eax;
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
+
        argsize = callp->sy_argsize;
+       params = (caddr_t)frame->tf_esp + sizeof(int);
        if (argsize && (error = copyin(params, args, argsize)))
                goto bad;
 
        rval[0] = 0;
        rval[1] = frame->tf_edx;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
index 11abfd2..fc37bc4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.128 2023/08/02 06:14:46 miod Exp $ */
+/*     $OpenBSD: trap.c,v 1.129 2023/12/12 15:30:56 deraadt Exp $      */
 /*
  * Copyright (c) 2004, Miodrag Vallat.
  * Copyright (c) 1998 Steve Murphree, Jr.
@@ -1153,9 +1153,9 @@ void
 m88100_syscall(register_t code, struct trapframe *tf)
 {
        int i, nap;
-       const struct sysent *callp;
+       const struct sysent *callp = sysent;
        struct proc *p = curproc;
-       int error, indirect = -1;
+       int error;
        register_t args[8] __aligned(8);
        register_t rval[2] __aligned(8);
        register_t *ap;
@@ -1172,18 +1172,8 @@ m88100_syscall(register_t code, struct trapframe *tf)
        ap = &tf->tf_r[2];
        nap = 8; /* r2-r9 */
 
-       switch (code) {
-       case SYS_syscall:
-               indirect = code;
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
 
        i = callp->sy_argsize / sizeof(register_t);
@@ -1200,7 +1190,7 @@ m88100_syscall(register_t code, struct trapframe *tf)
        rval[0] = 0;
        rval[1] = tf->tf_r[3];
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        /*
         * system call will look like:
@@ -1266,7 +1256,7 @@ void
 m88110_syscall(register_t code, struct trapframe *tf)
 {
        int i, nap;
-       const struct sysent *callp;
+       const struct sysent *callp = sysent;
        struct proc *p = curproc;
        int error;
        register_t args[8] __aligned(8);
@@ -1285,17 +1275,8 @@ m88110_syscall(register_t code, struct trapframe *tf)
        ap = &tf->tf_r[2];
        nap = 8;        /* r2-r9 */
 
-       switch (code) {
-       case SYS_syscall:
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
 
        i = callp->sy_argsize / sizeof(register_t);
index df4d2ad..343ac89 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.167 2023/04/26 16:53:59 claudio Exp $      */
+/*     $OpenBSD: trap.c,v 1.168 2023/12/12 15:30:56 deraadt Exp $      */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -396,8 +396,8 @@ fault_common_no_miss:
        case T_SYSCALL+T_USER:
            {
                struct trapframe *locr0 = p->p_md.md_regs;
-               const struct sysent *callp;
-               unsigned int code, indirect = -1;
+               const struct sysent *callp = sysent;
+               unsigned int code;
                register_t tpc;
                uint32_t branch = 0;
                int error, numarg;
@@ -422,51 +422,22 @@ fault_common_no_miss:
                            trapframe->pc, 0, branch);
                } else
                        locr0->pc += 4;
-               callp = sysent;
                code = locr0->v0;
-               switch (code) {
-               case SYS_syscall:
-                       /*
-                        * Code is first argument, followed by actual args.
-                        */
-                       indirect = code;
-                       code = locr0->a0;
-                       if (code >= SYS_MAXSYSCALL)
-                               callp += SYS_syscall;
-                       else
-                               callp += code;
-                       numarg = callp->sy_argsize / sizeof(register_t);
-                       args.i[0] = locr0->a1;
-                       args.i[1] = locr0->a2;
-                       args.i[2] = locr0->a3;
-                       if (numarg > 3) {
-                               args.i[3] = locr0->a4;
-                               args.i[4] = locr0->a5;
-                               args.i[5] = locr0->a6;
-                               args.i[6] = locr0->a7;
-                               if (numarg > 7)
-                                       if ((error = copyin((void *)locr0->sp,
-                                           &args.i[7], sizeof(register_t))))
-                                               goto bad;
-                       }
-                       break;
-               default:
-                       if (code >= SYS_MAXSYSCALL)
-                               callp += SYS_syscall;
-                       else
-                               callp += code;
-
-                       numarg = callp->sy_narg;
-                       args.i[0] = locr0->a0;
-                       args.i[1] = locr0->a1;
-                       args.i[2] = locr0->a2;
-                       args.i[3] = locr0->a3;
-                       if (numarg > 4) {
-                               args.i[4] = locr0->a4;
-                               args.i[5] = locr0->a5;
-                               args.i[6] = locr0->a6;
-                               args.i[7] = locr0->a7;
-                       }
+
+               // XXX out of range stays on syscall0, which we assume is enosys
+               if (code >= 0 || code <= SYS_MAXSYSCALL)
+                       callp += code;
+
+               numarg = callp->sy_narg;
+               args.i[0] = locr0->a0;
+               args.i[1] = locr0->a1;
+               args.i[2] = locr0->a2;
+               args.i[3] = locr0->a3;
+               if (numarg > 4) {
+                       args.i[4] = locr0->a4;
+                       args.i[5] = locr0->a5;
+                       args.i[6] = locr0->a6;
+                       args.i[7] = locr0->a7;
                }
 
                rval[0] = 0;
@@ -477,21 +448,18 @@ fault_common_no_miss:
                    TRAPSIZE : trppos[ci->ci_cpuid]) - 1].code = code;
 #endif
 
-               error = mi_syscall(p, code, indirect, callp, args.i, rval);
+               error = mi_syscall(p, code, callp, args.i, rval);
 
                switch (error) {
                case 0:
                        locr0->v0 = rval[0];
                        locr0->a3 = 0;
                        break;
-
                case ERESTART:
                        locr0->pc = tpc;
                        break;
-
                case EJUSTRETURN:
                        break;  /* nothing to do */
-
                default:
                bad:
                        locr0->v0 = error;
@@ -499,7 +467,6 @@ fault_common_no_miss:
                }
 
                mi_syscall_return(p, code, error, rval);
-
                return;
            }
 
index 94ec7cc..bd20eb4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.131 2023/02/11 23:07:27 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.132 2023/12/12 15:30:56 deraadt Exp $      */
 /*     $NetBSD: trap.c,v 1.3 1996/10/13 03:31:37 christos Exp $        */
 
 /*
@@ -239,11 +239,11 @@ trap(struct trapframe *frame)
        struct vm_map *map;
        vaddr_t va;
        int access_type;
-       const struct sysent *callp;
+       const struct sysent *callp = sysent;
        size_t argsize;
        register_t code, error;
        register_t *params, rval[2], args[10];
-       int n, indirect = -1;
+       int n;
 
        if (frame->srr1 & PSL_PR) {
                type |= EXC_USER;
@@ -360,27 +360,13 @@ trap(struct trapframe *frame)
        case EXC_SC|EXC_USER:
                uvmexp.syscalls++;
 
-               code = frame->fixreg[0];
                params = frame->fixreg + FIRSTARG;
 
-               switch (code) {
-               case SYS_syscall:
-                       /*
-                        * code is first argument,
-                        * followed by actual args.
-                        */
-                       indirect = code;
-                       code = *params++;
-                       break;
-               default:
-                       break;
-               }
+               code = frame->fixreg[0];
+               // XXX out of range stays on syscall0, which we assume is enosys
+               if (code >= 0 || code <= SYS_MAXSYSCALL)
+                       callp += code;
 
-               callp = sysent;
-               if (code < 0 || code >= SYS_MAXSYSCALL)
-                       callp += SYS_syscall;
-               else
-                       callp += code;
                argsize = callp->sy_argsize;
                n = NARGREG - (params - (frame->fixreg + FIRSTARG));
                if (argsize > n * sizeof(register_t)) {
@@ -395,7 +381,7 @@ trap(struct trapframe *frame)
                rval[0] = 0;
                rval[1] = frame->fixreg[FIRSTARG + 1];
 
-               error = mi_syscall(p, code, indirect, callp, params, rval);
+               error = mi_syscall(p, code, callp, params, rval);
 
                switch (error) {
                case 0:
index 04fcc33..d252745 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.c,v 1.11 2023/02/11 23:07:27 deraadt Exp $    */
+/*     $OpenBSD: syscall.c,v 1.12 2023/12/12 15:30:56 deraadt Exp $    */
 
 /*
  * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
@@ -30,27 +30,18 @@ void
 syscall(struct trapframe *frame)
 {
        struct proc *p = curproc;
-       const struct sysent *callp;
-       int code, error, indirect = -1;
+       const struct sysent *callp = sysent;
+       int code, error;
        int nap = 8, nargs;
        register_t *ap, *args, copyargs[MAXARGS], rval[2];
 
-       code = frame->fixreg[0];
        ap = &frame->fixreg[3];
 
-       switch (code) {
-       case SYS_syscall:
-               indirect = code;
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       code = frame->fixreg[0];
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
+
        nargs = callp->sy_argsize / sizeof(register_t);
        if (nargs <= nap) {
                args = ap;
@@ -66,7 +57,7 @@ syscall(struct trapframe *frame)
        rval[0] = 0;
        rval[1] = 0;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
@@ -74,15 +65,12 @@ syscall(struct trapframe *frame)
                frame->fixreg[3] = rval[0];
                frame->cr &= ~0x10000000;
                break;
-
        case ERESTART:
                frame->srr0 -= 4;
                break;
-
        case EJUSTRETURN:
                /* nothing to do */
                break;
-
        default:
        bad:
                frame->fixreg[0] = error;
index 65f6f8f..ed5e534 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.c,v 1.16 2023/04/13 02:19:05 jsg Exp $        */
+/*     $OpenBSD: syscall.c,v 1.17 2023/12/12 15:30:56 deraadt Exp $    */
 
 /*
  * Copyright (c) 2020 Brian Bamsch <bbamsch@google.com>
@@ -39,33 +39,20 @@ void
 svc_handler(trapframe_t *frame)
 {
        struct proc *p = curproc;
-       const struct sysent *callp;
-       int code, error, indirect = -1;
+       const struct sysent *callp = sysent;
+       int code, error;
        u_int nap = 8, nargs;
        register_t *ap, *args, copyargs[MAXARGS], rval[2];
 
        uvmexp.syscalls++;
 
-       /* Re-enable interrupts if they were enabled previously */
-       if (__predict_true(frame->tf_scause & EXCP_INTR))
-               intr_enable();
-
        ap = &frame->tf_a[0];
        code = frame->tf_t[0];
 
-       switch (code) {
-       case SYS_syscall:
-               indirect = code;
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
+
        nargs = callp->sy_argsize / sizeof(register_t);
        if (nargs <= nap) {
                args = ap;
@@ -81,21 +68,18 @@ svc_handler(trapframe_t *frame)
        rval[0] = 0;
        rval[1] = 0;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
                frame->tf_a[0] = rval[0];
                frame->tf_t[0] = 0;             /* syscall succeeded */
                break;
-
        case ERESTART:
                frame->tf_sepc -= 4;            /* prev instruction */
                break;
-
        case EJUSTRETURN:
                break;
-
        default:
        bad:
                frame->tf_a[0] = error;
index 7242195..0002a8c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.54 2023/02/11 23:07:27 deraadt Exp $       */
+/*     $OpenBSD: trap.c,v 1.55 2023/12/12 15:30:56 deraadt Exp $       */
 /*     $NetBSD: exception.c,v 1.32 2006/09/04 23:57:52 uwe Exp $       */
 /*     $NetBSD: syscall.c,v 1.6 2006/03/07 07:21:50 thorpej Exp $      */
 
@@ -515,44 +515,22 @@ void
 syscall(struct proc *p, struct trapframe *tf)
 {
        caddr_t params;
-       const struct sysent *callp;
-       int error, opc, indirect = -1;
-       int argoff, argsize;
+       const struct sysent *callp = sysent;
+       int error, opc;
+       int argsize;
        register_t code, args[8], rval[2];
 
        uvmexp.syscalls++;
 
        opc = tf->tf_spc;
-       code = tf->tf_r0;
-
        params = (caddr_t)tf->tf_r15;
 
-       switch (code) {
-       case SYS_syscall:
-               /*
-                * Code is first argument, followed by actual args.
-                */
-               indirect = code;
-               code = tf->tf_r4;
-               argoff = 1;
-               break;
-       default:
-               argoff = 0;
-               break;
-       }
-
-       callp = sysent;
-       if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else
+       code = tf->tf_r0;
+       // XXX out of range stays on syscall0, which we assume is enosys
+       if (code >= 0 || code <= SYS_MAXSYSCALL)
                callp += code;
+
        argsize = callp->sy_argsize;
-#ifdef DIAGNOSTIC
-       if (argsize > sizeof args) {
-               callp += SYS_syscall - code;
-               argsize = callp->sy_argsize;
-       }
-#endif
 
        if (argsize) {
                register_t *ap;
@@ -570,20 +548,18 @@ syscall(struct proc *p, struct trapframe *tf)
                }
 
                ap = args;
-               switch (argoff) {
-               case 0: *ap++ = tf->tf_r4; argsize -= sizeof(int);
-               case 1: *ap++ = tf->tf_r5; argsize -= sizeof(int);
-               case 2: *ap++ = tf->tf_r6; argsize -= sizeof(int);
-                       /*
-                        * off_t args aren't split between register
-                        * and stack, but rather r7 is skipped and
-                        * the entire off_t is on the stack.
-                        */
-                       if (argoff + off_t_arg == 3)
-                               break;
-                       *ap++ = tf->tf_r7; argsize -= sizeof(int);
+
+               *ap++ = tf->tf_r4; argsize -= sizeof(int);
+               *ap++ = tf->tf_r5; argsize -= sizeof(int);
+               *ap++ = tf->tf_r6; argsize -= sizeof(int);
+               /*
+                * off_t args aren't split between register
+                * and stack, but rather r7 is skipped and
+                * the entire off_t is on the stack.
+                */
+               if (off_t_arg == 3)
                        break;
-               }
+               *ap++ = tf->tf_r7; argsize -= sizeof(int);
 
                if (argsize > 0) {
                        if ((error = copyin(params, ap, argsize)))
@@ -594,7 +570,7 @@ syscall(struct proc *p, struct trapframe *tf)
        rval[0] = 0;
        rval[1] = tf->tf_r1;
 
-       error = mi_syscall(p, code, indirect, callp, args, rval);
+       error = mi_syscall(p, code, callp, args, rval);
 
        switch (error) {
        case 0:
index 09723a6..7dbf244 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.115 2023/02/11 23:07:28 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.116 2023/12/12 15:30:56 deraadt Exp $      */
 /*     $NetBSD: trap.c,v 1.73 2001/08/09 01:03:01 eeh Exp $ */
 
 /*
@@ -1109,9 +1109,10 @@ syscall(struct trapframe *tf, register_t code, register_t pc)
        int64_t *ap;
        const struct sysent *callp;
        struct proc *p = curproc;
-       int error, new, indirect = -1;
+       int error = ENOSYS, new, indirect = -1;
        register_t args[8];
        register_t rval[2];
+       register_t *argp;
 
        if ((tf->tf_out[6] & 1) == 0)
                sigexit(p, SIGILL);
@@ -1137,39 +1138,26 @@ syscall(struct trapframe *tf, register_t code, register_t pc)
        ap = &tf->tf_out[0];
        nap = 6;
 
-       switch (code) {
-       case SYS_syscall:
-               indirect = code;
-               code = *ap++;
-               nap--;
-               break;
-       }
-
-       callp = sysent;
        if (code < 0 || code >= SYS_MAXSYSCALL)
-               callp += SYS_syscall;
-       else {
-               register_t *argp;
-
-               callp += code;
-               i = callp->sy_narg; /* Why divide? */
-               if (i > nap) {  /* usually false */
-                       if (i > 8)
-                               panic("syscall nargs");
-                       /* Read the whole block in */
-                       if ((error = copyin((caddr_t)tf->tf_out[6]
-                           + BIAS + offsetof(struct frame, fr_argx),
-                           &args[nap], (i - nap) * sizeof(register_t))))
-                               goto bad;
-                       i = nap;
-               }
-               /*
-                * It should be faster to do <= 6 longword copies than
-                * to call bcopy
-                */
-               for (argp = args; i--;)
-                       *argp++ = *ap++;
+               goto bad;
+       callp = sysent + code;
+       i = callp->sy_narg; /* Why divide? */
+       if (i > nap) {  /* usually false */
+               if (i > 8)
+                       panic("syscall nargs");
+               /* Read the whole block in */
+               if ((error = copyin((caddr_t)tf->tf_out[6]
+                   + BIAS + offsetof(struct frame, fr_argx),
+                   &args[nap], (i - nap) * sizeof(register_t))))
+                       goto bad;
+               i = nap;
        }
+       /*
+        * It should be faster to do <= 6 longword copies than
+        * to call bcopy
+        */
+       for (argp = args; i--;)
+               *argp++ = *ap++;
 
        rval[0] = 0;
        rval[1] = 0;
index 528547a..9d88075 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_ktrace.c,v 1.112 2023/05/11 09:51:33 bluhm Exp $ */
+/*     $OpenBSD: kern_ktrace.c,v 1.113 2023/12/12 15:30:55 deraadt Exp $       */
 /*     $NetBSD: kern_ktrace.c,v 1.23 1996/02/09 18:59:36 christos Exp $        */
 
 /*
@@ -160,7 +160,7 @@ ktrsyscall(struct proc *p, register_t code, size_t argsize, register_t args[])
        u_int nargs = 0;
        int i;
 
-       if ((code & KTRC_CODE_MASK) == SYS_sysctl) {
+       if (code == SYS_sysctl) {
                /*
                 * The sysctl encoding stores the mib[]
                 * array because it is interesting.
index ac0b924..31c051c 100644 (file)
@@ -1,4 +1,4 @@
-;      $OpenBSD: syscalls.master,v 1.253 2023/12/10 16:59:09 deraadt Exp $
+;      $OpenBSD: syscalls.master,v 1.254 2023/12/12 15:30:55 deraadt Exp $
 ;      $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $
 
 ;      @(#)syscalls.master     8.2 (Berkeley) 1/13/94
@@ -48,7 +48,7 @@
 ; redistributions should be placed in the reserved range at the end
 ; of the current calls.
 
-0      INDIR           { int sys_syscall(int number, ...); }
+0      UNIMPL          syscall
 1      STD             { void sys_exit(int rval); }
 2      STD             { int sys_fork(void); }
 3      STD NOLOCK      { ssize_t sys_read(int fd, void *buf, size_t nbyte); }
index e76652e..19eb541 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ktrace.h,v 1.46 2023/02/23 01:33:20 deraadt Exp $     */
+/*     $OpenBSD: ktrace.h,v 1.47 2023/12/12 15:30:55 deraadt Exp $     */
 /*     $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $     */
 
 /*
@@ -76,8 +76,6 @@ struct ktr_header {
 #define KTR_SYSCALL    1
 struct ktr_syscall {
        int     ktr_code;               /* syscall number */
-#define KTRC_CODE_MASK                 0x0000ffff
-#define KTRC_CODE_SYSCALL              0x20000000
        int     ktr_argsize;            /* size of arguments */
        /*
         * followed by ktr_argsize/sizeof(register_t) "register_t"s
index 7f88ce7..4063790 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall_mi.h,v 1.28 2023/02/11 23:07:23 deraadt Exp $ */
+/*     $OpenBSD: syscall_mi.h,v 1.29 2023/12/12 15:30:55 deraadt Exp $ */
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -51,8 +51,8 @@
  * The MD setup for a system call has been done; here's the MI part.
  */
 static inline int
-mi_syscall(struct proc *p, register_t code, int indirect,
-    const struct sysent *callp, register_t *argp, register_t retval[2])
+mi_syscall(struct proc *p, register_t code, const struct sysent *callp,
+    register_t *argp, register_t retval[2])
 {
        uint64_t tval;
        int lock = !(callp->sy_flags & SY_NOLOCK);
@@ -73,15 +73,8 @@ mi_syscall(struct proc *p, register_t code, int indirect,
 #ifdef KTRACE
        if (KTRPOINT(p, KTR_SYSCALL)) {
                /* convert to mask, then include with code */
-               switch (indirect) {
-               case SYS_syscall:
-                       indirect = KTRC_CODE_SYSCALL;
-                       break;
-               default:
-                       indirect = 0;
-               }
                KERNEL_LOCK();
-               ktrsyscall(p, code | indirect, callp->sy_argsize, argp);
+               ktrsyscall(p, code, callp->sy_argsize, argp);
                KERNEL_UNLOCK();
        }
 #endif
index 3411f7a..9632afd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kdump.c,v 1.159 2023/11/09 15:43:28 kn Exp $  */
+/*     $OpenBSD: kdump.c,v 1.160 2023/12/12 15:30:55 deraadt Exp $     */
 
 /*-
  * Copyright (c) 1988, 1993
@@ -933,9 +933,7 @@ ktrsyscall(struct ktr_syscall *ktr, size_t ktrlen)
        narg = ktr->ktr_argsize / sizeof(register_t);
        sep = '\0';
 
-       if (ktr->ktr_code & KTRC_CODE_SYSCALL)
-               (void)printf("(via syscall) ");
-       code = ktr->ktr_code & KTRC_CODE_MASK;
+       code = ktr->ktr_code;
        if (code >= SYS_MAXSYSCALL || code < 0)
                (void)printf("[%d]", code);
        else