remove support for syscall(2) -- the "indirection system call" because

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
This commit is contained in:
deraadt 2023-12-12 15:30:55 +00:00
parent 598bb1ad5c
commit cafeb892b1
24 changed files with 158 additions and 461 deletions

View 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 *);

View File

@ -434,7 +434,6 @@ symlink
symlinkat
sync
sysarch
syscall
timer_create
timer_delete
timer_getoverrun

View 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);

View 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

View 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 .

View 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:

View 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)

View 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:

View 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;

View 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;

View 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);

View 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
// 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:

View 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);

View 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;
}

View 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:

View 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;

View 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;

View 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:

View 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;

View 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.

View 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); }

View 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

View 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

View 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