Introduce 2 new flags in types.h:

* __HAVE_SYSCALL_INTERN.  If this is defined, e_syscall is replaced by
  e_syscall_intern, which is called at key places in the kernel.  This can be
  used to set a MD syscall handler pointer.  This obsoletes and replaces the
  *_HAS_SEPARATED_SYSCALL flags.
* __HAVE_MINIMAL_EMUL.  If this is defined, certain (deprecated) elements in
  struct emul are omitted.
This commit is contained in:
mycroft 2000-12-11 05:28:59 +00:00
parent 105cf38061
commit f495cd9dc6
29 changed files with 504 additions and 255 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: files.i386,v 1.177 2000/12/09 06:30:54 mycroft Exp $
# $NetBSD: files.i386,v 1.178 2000/12/11 05:28:59 mycroft Exp $
#
# new style config file for i386 architecture
#
@ -72,6 +72,7 @@ file netns/ns_cksum.c ns
file arch/i386/i386/pmap.c
file arch/i386/i386/process_machdep.c
file arch/i386/i386/sys_machdep.c
file arch/i386/i386/syscall.c
file arch/i386/i386/trap.c
file arch/i386/i386/vm_machdep.c
file dev/cons.c

View File

@ -1,4 +1,4 @@
# $NetBSD: genassym.cf,v 1.23 2000/12/09 13:20:04 jdolecek Exp $
# $NetBSD: genassym.cf,v 1.24 2000/12/11 05:28:59 mycroft Exp $
#
# Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -142,12 +142,11 @@ define P_STAT offsetof(struct proc, p_stat)
define P_WCHAN offsetof(struct proc, p_wchan)
define P_FLAG offsetof(struct proc, p_flag)
define P_MD_TSS_SEL offsetof(struct proc, p_md.md_tss_sel)
define P_EMUL offsetof(struct proc, p_emul)
define P_MD_REGS offsetof(struct proc, p_md.md_regs)
define P_MD_SYSCALL offsetof(struct proc, p_md.md_syscall)
define P_SYSTEM P_SYSTEM
define E_SYSCALL offsetof(struct emul, e_syscall)
define M_DATA offsetof(struct mbuf, m_data)
define M_LEN offsetof(struct mbuf, m_len)
define M_NEXT offsetof(struct mbuf, m_next)

View File

@ -1,4 +1,4 @@
/* $NetBSD: ibcs2_syscall.c,v 1.6 2000/12/10 19:29:30 mycroft Exp $ */
/* $NetBSD: ibcs2_syscall.c,v 1.7 2000/12/11 05:28:59 mycroft Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@ -107,8 +107,19 @@
#include <compat/ibcs2/ibcs2_errno.h>
#include <compat/ibcs2/ibcs2_exec.h>
#include <compat/ibcs2/ibcs2_syscall.h>
#include <machine/ibcs2_machdep.h>
void ibcs2_syscall __P((struct trapframe));
extern struct sysent ibcs2_sysent[];
void
ibcs2_syscall_intern(p)
struct proc *p;
{
p->p_md.md_syscall = ibcs2_syscall;
}
/*
* syscall(frame):
@ -134,12 +145,11 @@ ibcs2_syscall(frame)
#endif
p = curproc;
p->p_md.md_regs = &frame;
code = frame.tf_eax;
if (IBCS2_HIGH_SYSCALL(code))
code = IBCS2_CVT_HIGH_SYSCALL(code);
callp = p->p_emul->e_sysent;
callp = ibcs2_sysent;
params = (caddr_t)frame.tf_esp + sizeof(int);
#ifdef VM86
@ -165,10 +175,7 @@ ibcs2_syscall(frame)
break;
}
if ((u_int)code >= (u_int)p->p_emul->e_nsysent)
callp += p->p_emul->e_nosys; /* illegal */
else
callp += code;
callp += (code & (IBCS2_SYS_NSYSENT - 1));
argsize = callp->sy_argsize;
if (argsize) {
error = copyin(params, (caddr_t)args, argsize);
@ -204,7 +211,7 @@ ibcs2_syscall(frame)
break;
default:
bad:
error = p->p_emul->e_errno[error];
error = native_to_ibcs2_errno[error];
frame.tf_eax = error;
frame.tf_eflags |= PSL_C; /* carry bit */
break;

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_syscall.c,v 1.6 2000/12/10 19:29:30 mycroft Exp $ */
/* $NetBSD: linux_syscall.c,v 1.7 2000/12/11 05:28:59 mycroft Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@ -105,10 +105,21 @@
#include <machine/trap.h>
#include <machine/userret.h>
#include <compat/ibcs2/ibcs2_errno.h>
#include <compat/ibcs2/ibcs2_exec.h>
#include <compat/linux/arch/i386/linux_errno.h>
#include <compat/linux/linux_syscall.h>
#include <compat/linux/arch/i386/linux_signal.h>
#include <compat/linux/arch/i386/linux_machdep.h>
void linux_syscall __P((struct trapframe));
extern struct sysent linux_sysent[];
void
linux_syscall_intern(p)
struct proc *p;
{
p->p_md.md_syscall = linux_syscall;
}
/*
* syscall(frame):
@ -133,10 +144,9 @@ linux_syscall(frame)
#endif
p = curproc;
p->p_md.md_regs = &frame;
code = frame.tf_eax;
callp = p->p_emul->e_sysent;
callp = linux_sysent;
#ifdef VM86
/*
@ -149,10 +159,7 @@ linux_syscall(frame)
else
#endif /* VM86 */
if ((u_int)code >= (u_int)p->p_emul->e_nsysent)
callp += p->p_emul->e_nosys; /* illegal */
else
callp += code;
callp += (code & (LINUX_SYS_NSYSENT - 1));
argsize = callp->sy_argsize;
if (argsize) {
/*
@ -204,7 +211,7 @@ linux_syscall(frame)
/* nothing to do */
break;
default:
error = p->p_emul->e_errno[error];
error = native_to_linux_errno[error];
frame.tf_eax = error;
frame.tf_eflags |= PSL_C; /* carry bit */
break;

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.s,v 1.230 2000/12/11 02:48:07 mycroft Exp $ */
/* $NetBSD: locore.s,v 1.231 2000/12/11 05:28:59 mycroft Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -2361,8 +2361,8 @@ syscall1:
movl _C_LABEL(cpl),%ebx
#endif /* DIAGNOSTIC */
movl _C_LABEL(curproc),%edx # get pointer to curproc
movl P_EMUL(%edx),%edx # get pointer to emul struct
call E_SYSCALL(%edx) # get pointer to syscall() function
movl %esp,P_MD_REGS(%edx) # save pointer to frame
call P_MD_SYSCALL(%edx) # get pointer to syscall() function
2: /* Check for ASTs on exit to user mode. */
cli
cmpb $0,_C_LABEL(astpending)

View File

@ -1,4 +1,4 @@
/* $NetBSD: svr4_syscall.c,v 1.5 2000/12/10 19:29:30 mycroft Exp $ */
/* $NetBSD: svr4_syscall.c,v 1.6 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@ -105,9 +105,20 @@
#include <machine/trap.h>
#include <machine/userret.h>
#include <compat/svr4/svr4_errno.h>
#include <compat/svr4/svr4_syscall.h>
#include <machine/svr4_machdep.h>
void svr4_syscall __P((struct trapframe));
extern struct sysent svr4_sysent[];
void
svr4_syscall_intern(p)
struct proc *p;
{
p->p_md.md_syscall = svr4_syscall;
}
/*
* syscall(frame):
@ -133,10 +144,9 @@ svr4_syscall(frame)
#endif
p = curproc;
p->p_md.md_regs = &frame;
code = frame.tf_eax;
callp = p->p_emul->e_sysent;
callp = svr4_sysent;
params = (caddr_t)frame.tf_esp + sizeof(int);
#ifdef VM86
@ -197,7 +207,7 @@ svr4_syscall(frame)
break;
default:
bad:
error = p->p_emul->e_errno[error];
error = native_to_svr4_errno[error];
frame.tf_eax = error;
frame.tf_eflags |= PSL_C; /* carry bit */
break;

View File

@ -0,0 +1,308 @@
/* $NetBSD: syscall.c,v 1.1 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Charles M. Hannum.
*
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* the University of Utah, and William Jolitz.
*
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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.
*
* @(#)trap.c 7.4 (Berkeley) 5/13/91
*/
/*
* 386 Trap and System call handling
*/
#include "opt_syscall_debug.h"
#include "opt_vm86.h"
#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/user.h>
#include <sys/acct.h>
#include <sys/kernel.h>
#include <sys/signal.h>
#ifdef KTRACE
#include <sys/ktrace.h>
#endif
#include <sys/syscall.h>
#include <uvm/uvm_extern.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/psl.h>
#include <machine/reg.h>
#include <machine/trap.h>
#include <machine/userret.h>
void syscall_intern __P((struct proc *));
void syscall __P((struct trapframe));
void
syscall_intern(p)
struct proc *p;
{
p->p_md.md_syscall = syscall;
}
/*
* syscall(frame):
* System call request from POSIX system call gate interface to kernel.
* Like trap(), argument is call by reference.
*/
#if 0
/*ARGSUSED*/
void
syscall(frame)
struct trapframe frame;
{
register caddr_t params;
register const struct sysent *callp;
register struct proc *p;
int error;
size_t argsize;
register_t code, args[8], rval[2];
uvmexp.syscalls++;
#ifdef DEBUG
if (!USERMODE(frame.tf_cs, frame.tf_eflags))
panic("syscall");
#endif
p = curproc;
code = frame.tf_eax;
callp = p->p_emul->e_sysent;
params = (caddr_t)frame.tf_esp + sizeof(int);
callp += (code & (SYS_NSYSENT - 1));
argsize = callp->sy_argsize;
if (argsize) {
error = copyin(params, (caddr_t)args, argsize);
if (error)
goto bad;
}
rval[0] = 0;
rval[1] = 0;
error = (*callp->sy_call)(p, args, rval);
switch (error) {
case 0:
frame.tf_eax = rval[0];
frame.tf_edx = rval[1];
frame.tf_eflags &= ~PSL_C; /* carry bit */
break;
case ERESTART:
/*
* The offset to adjust the PC by depends on whether we entered
* the kernel through the trap or call gate. We pushed the
* size of the instruction into tf_err on entry.
*/
frame.tf_eip -= frame.tf_err;
break;
case EJUSTRETURN:
/* nothing to do */
break;
default:
bad:
frame.tf_eax = error;
frame.tf_eflags |= PSL_C; /* carry bit */
break;
}
userret(p);
}
#endif
#if 1
/*ARGSUSED*/
void
syscall(frame)
struct trapframe frame;
{
register caddr_t params;
register const struct sysent *callp;
register struct proc *p;
int error;
size_t argsize;
register_t code, args[8], rval[2];
uvmexp.syscalls++;
#ifdef DEBUG
if (!USERMODE(frame.tf_cs, frame.tf_eflags))
panic("syscall");
#endif
p = curproc;
code = frame.tf_eax;
callp = p->p_emul->e_sysent;
params = (caddr_t)frame.tf_esp + sizeof(int);
#ifdef VM86
/*
* VM86 mode application found our syscall trap gate by accident; let
* it get a SIGSYS and have the VM86 handler in the process take care
* of it.
*/
if (frame.tf_eflags & PSL_VM)
code = -1;
else
#endif /* VM86 */
switch (code) {
case SYS_syscall:
/*
* Code is first argument, followed by actual args.
*/
code = fuword(params);
params += sizeof(int);
break;
case SYS___syscall:
/*
* Like syscall, but code is a quad, so as to maintain
* quad alignment for the rest of the arguments.
*/
code = fuword(params + _QUAD_LOWWORD * sizeof(int));
params += sizeof(quad_t);
break;
default:
break;
}
callp += (code & (SYS_NSYSENT - 1));
argsize = callp->sy_argsize;
if (argsize) {
error = copyin(params, (caddr_t)args, argsize);
if (error)
goto bad;
}
#ifdef SYSCALL_DEBUG
scdebug_call(p, code, args);
#endif /* SYSCALL_DEBUG */
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSCALL))
ktrsyscall(p, code, argsize, args);
#endif /* KTRACE */
rval[0] = 0;
rval[1] = 0;
error = (*callp->sy_call)(p, args, rval);
switch (error) {
case 0:
frame.tf_eax = rval[0];
frame.tf_edx = rval[1];
frame.tf_eflags &= ~PSL_C; /* carry bit */
break;
case ERESTART:
/*
* The offset to adjust the PC by depends on whether we entered
* the kernel through the trap or call gate. We pushed the
* size of the instruction into tf_err on entry.
*/
frame.tf_eip -= frame.tf_err;
break;
case EJUSTRETURN:
/* nothing to do */
break;
default:
bad:
frame.tf_eax = error;
frame.tf_eflags |= PSL_C; /* carry bit */
break;
}
#ifdef SYSCALL_DEBUG
scdebug_ret(p, code, error, rval);
#endif /* SYSCALL_DEBUG */
userret(p);
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET))
ktrsysret(p, code, error, rval[0]);
#endif /* KTRACE */
}
#endif
void
child_return(arg)
void *arg;
{
struct proc *p = arg;
struct trapframe *tf = p->p_md.md_regs;
tf->tf_eax = 0;
tf->tf_eflags &= ~PSL_C;
userret(p);
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET))
ktrsysret(p, SYS_fork, 0, 0);
#endif
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: trap.c,v 1.152 2000/12/10 19:29:30 mycroft Exp $ */
/* $NetBSD: trap.c,v 1.153 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@ -79,10 +79,8 @@
*/
#include "opt_ddb.h"
#include "opt_syscall_debug.h"
#include "opt_math_emulate.h"
#include "opt_vm86.h"
#include "opt_ktrace.h"
#include "opt_cputype.h"
#include <sys/param.h>
@ -92,9 +90,6 @@
#include <sys/acct.h>
#include <sys/kernel.h>
#include <sys/signal.h>
#ifdef KTRACE
#include <sys/ktrace.h>
#endif
#include <sys/syscall.h>
#include <uvm/uvm_extern.h>
@ -126,7 +121,6 @@ void trap __P((struct trapframe));
#if defined(I386_CPU)
int trapwrite __P((unsigned));
#endif
void syscall __P((struct trapframe));
const char *trap_type[] = {
"privileged instruction fault", /* 0 T_PRIVINFLT */
@ -530,131 +524,3 @@ trapwrite(addr)
return 0;
}
#endif /* I386_CPU */
/*
* syscall(frame):
* System call request from POSIX system call gate interface to kernel.
* Like trap(), argument is call by reference.
*/
/*ARGSUSED*/
void
syscall(frame)
struct trapframe frame;
{
register caddr_t params;
register const struct sysent *callp;
register struct proc *p;
int error;
size_t argsize;
register_t code, args[8], rval[2];
uvmexp.syscalls++;
#ifdef DEBUG
if (!USERMODE(frame.tf_cs, frame.tf_eflags))
panic("syscall");
#endif
p = curproc;
p->p_md.md_regs = &frame;
code = frame.tf_eax;
callp = p->p_emul->e_sysent;
params = (caddr_t)frame.tf_esp + sizeof(int);
#ifdef VM86
/*
* VM86 mode application found our syscall trap gate by accident; let
* it get a SIGSYS and have the VM86 handler in the process take care
* of it.
*/
if (frame.tf_eflags & PSL_VM)
code = -1;
else
#endif /* VM86 */
switch (code) {
case SYS_syscall:
/*
* Code is first argument, followed by actual args.
*/
code = fuword(params);
params += sizeof(int);
break;
case SYS___syscall:
/*
* Like syscall, but code is a quad, so as to maintain
* quad alignment for the rest of the arguments.
*/
code = fuword(params + _QUAD_LOWWORD * sizeof(int));
params += sizeof(quad_t);
break;
default:
break;
}
callp += (code & (SYS_NSYSENT - 1));
argsize = callp->sy_argsize;
if (argsize) {
error = copyin(params, (caddr_t)args, argsize);
if (error)
goto bad;
}
#ifdef SYSCALL_DEBUG
scdebug_call(p, code, args);
#endif /* SYSCALL_DEBUG */
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSCALL))
ktrsyscall(p, code, argsize, args);
#endif /* KTRACE */
rval[0] = 0;
rval[1] = 0;
error = (*callp->sy_call)(p, args, rval);
switch (error) {
case 0:
frame.tf_eax = rval[0];
frame.tf_edx = rval[1];
frame.tf_eflags &= ~PSL_C; /* carry bit */
break;
case ERESTART:
/*
* The offset to adjust the PC by depends on whether we entered
* the kernel through the trap or call gate. We pushed the
* size of the instruction into tf_err on entry.
*/
frame.tf_eip -= frame.tf_err;
break;
case EJUSTRETURN:
/* nothing to do */
break;
default:
bad:
frame.tf_eax = error;
frame.tf_eflags |= PSL_C; /* carry bit */
break;
}
#ifdef SYSCALL_DEBUG
scdebug_ret(p, code, error, rval);
#endif /* SYSCALL_DEBUG */
userret(p);
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET))
ktrsysret(p, code, error, rval[0]);
#endif /* KTRACE */
}
void
child_return(arg)
void *arg;
{
struct proc *p = arg;
struct trapframe *tf = p->p_md.md_regs;
tf->tf_eax = 0;
tf->tf_eflags &= ~PSL_C;
userret(p);
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET))
ktrsysret(p, SYS_fork, 0, 0);
#endif
}

View File

@ -1,7 +1,7 @@
/* $NetBSD: ibcs2_machdep.h,v 1.9 2000/12/09 12:45:44 jdolecek Exp $ */
/* $NetBSD: ibcs2_machdep.h,v 1.10 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
* Copyright (c) 1997, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -51,9 +51,7 @@ void ibcs2_setregs __P((struct proc *, struct exec_package *, u_long));
void ibcs2_sendsig __P((sig_t, int, sigset_t *, u_long));
int ibcs2_sys_sysmachine __P((struct proc *, void *, register_t *retval));
void ibcs2_syscall_intern __P((struct proc *));
#endif /* _KERNEL */
/* i386 has separated ibcs2_syscall() from syscall() */
#define IBCS2_MACHDEP_HAS_SEPARATED_SYSCALL
#endif /* !_I386_IBCS2_MACHDEP_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: proc.h,v 1.11 2000/08/16 04:44:37 thorpej Exp $ */
/* $NetBSD: proc.h,v 1.12 2000/12/11 05:29:00 mycroft Exp $ */
/*
* Copyright (c) 1991 Regents of the University of California.
@ -42,6 +42,8 @@ struct mdproc {
struct trapframe *md_regs; /* registers on current frame */
int md_flags; /* machine-dependent flags */
int md_tss_sel; /* TSS selector */
/* Syscall handling function */
void (*md_syscall) __P((struct trapframe));
};
/* md_flags */

View File

@ -1,4 +1,4 @@
/* $NetBSD: svr4_machdep.h,v 1.11 2000/12/09 12:44:26 jdolecek Exp $ */
/* $NetBSD: svr4_machdep.h,v 1.12 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
@ -125,7 +125,6 @@ struct svr4_ssd {
#define SVR4_TRAP_GETHRVTIME 4
#define SVR4_TRAP_CLOCK_SETTIME 5
/* i386 has separated svr4_syscall() from syscall() */
#define SVR4_MACHDEP_HAS_SEPARATED_SYSCALL
void svr4_syscall_intern __P((struct proc *));
#endif /* !_I386_SVR4_MACHDEP_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: types.h,v 1.24 2000/06/06 01:33:17 sommerfeld Exp $ */
/* $NetBSD: types.h,v 1.25 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@ -78,5 +78,7 @@ typedef int32_t register_t;
#define __HAVE_DEVICE_REGISTER
#define __HAVE_NWSCONS
#define __HAVE_CPU_COUNTER
#define __HAVE_SYSCALL_INTERN
#define __HAVE_MINIMAL_EMUL
#endif /* _MACHTYPES_H_ */

View File

@ -1,7 +1,7 @@
/* $NetBSD: aout_exec.c,v 1.8 2000/12/09 12:38:23 jdolecek Exp $ */
/* $NetBSD: aout_exec.c,v 1.9 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -53,26 +53,36 @@ extern struct sysent aout_sysent[];
extern const char * const aout_syscallnames[];
#endif
extern char sigcode[], esigcode[];
#ifdef __HAVE_SYSCALL_INTERN
void syscall_intern __P((struct proc *));
#else
void syscall __P((void));
#endif
struct emul emul_netbsd_aout = {
"netbsd",
"/emul/aout",
#ifndef __HAVE_MINIMAL_EMUL
EMUL_HAS_SYS___syscall,
NULL,
sendsig,
AOUT_SYS_syscall,
AOUT_SYS_MAXSYSCALL,
#endif
aout_sysent,
#ifdef SYSCALL_DEBUG
aout_syscallnames,
#else
NULL,
#endif
sendsig,
sigcode,
esigcode,
NULL,
NULL,
NULL,
EMUL_HAS_SYS___syscall,
syscall
#ifdef __HAVE_SYSCALL_INTERN
syscall_intern,
#else
syscall,
#endif
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: aoutm68k_exec.c,v 1.3 2000/12/09 12:38:24 jdolecek Exp $ */
/* $NetBSD: aoutm68k_exec.c,v 1.4 2000/12/11 05:29:00 mycroft Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@ -59,8 +59,8 @@ void syscall __P((void));
struct emul emul_netbsd_aoutm68k = {
"aoutm68k",
"/emul/aout",
EMUL_HAS_SYS___syscall,
NULL,
sendsig,
AOUTM68K_SYS_syscall,
AOUTM68K_SYS_MAXSYSCALL,
aoutm68k_sysent,
@ -69,11 +69,11 @@ struct emul emul_netbsd_aoutm68k = {
#else
NULL,
#endif
sendsig,
sigcode,
esigcode,
NULL,
NULL,
NULL,
EMUL_HAS_SYS___syscall,
syscall
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: freebsd_exec.c,v 1.12 2000/12/09 12:38:24 jdolecek Exp $ */
/* $NetBSD: freebsd_exec.c,v 1.13 2000/12/11 05:29:00 mycroft Exp $ */
/*
* Copyright (c) 1993, 1994 Christopher G. Demetriou
@ -41,22 +41,32 @@
extern struct sysent freebsd_sysent[];
extern const char * const freebsd_syscallnames[];
#ifdef __HAVE_SYSCALL_INTERN
void syscall_intern __P((struct proc *));
#else
void syscall __P((void));
#endif
const struct emul emul_freebsd = {
"freebsd",
"/emul/freebsd",
#ifndef __HAVE_MINIMAL_EMUL
EMUL_HAS_SYS___syscall,
NULL,
freebsd_sendsig,
FREEBSD_SYS_syscall,
FREEBSD_SYS_MAXSYSCALL,
#endif
freebsd_sysent,
freebsd_syscallnames,
freebsd_sendsig,
freebsd_sigcode,
freebsd_esigcode,
NULL,
NULL,
NULL,
EMUL_HAS_SYS___syscall,
syscall
#ifdef __HAVE_SYSCALL_INTERN
syscall_intern,
#else
syscall,
#endif
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: hpux_exec.c,v 1.21 2000/12/09 12:38:24 jdolecek Exp $ */
/* $NetBSD: hpux_exec.c,v 1.22 2000/12/11 05:29:01 mycroft Exp $ */
/*-
* Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@ -103,10 +103,11 @@ void syscall __P((void));
const struct emul emul_hpux = {
"hpux",
"/emul/hpux",
0,
native_to_hpux_errno,
hpux_sendsig,
HPUX_SYS_syscall,
HPUX_SYS_MAXSYSCALL,
hpux_sendsig,
hpux_sysent,
hpux_syscallnames,
sigcode,
@ -114,7 +115,6 @@ const struct emul emul_hpux = {
NULL,
NULL,
NULL,
0,
syscall
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: ibcs2_exec.c,v 1.43 2000/12/09 12:45:44 jdolecek Exp $ */
/* $NetBSD: ibcs2_exec.c,v 1.44 2000/12/11 05:29:01 mycroft Exp $ */
/*
* Copyright (c) 1994, 1995, 1998 Scott Bartram
@ -56,8 +56,9 @@ static void ibcs2_e_proc_exec __P((struct proc *, struct exec_package *));
extern struct sysent ibcs2_sysent[];
extern const char * const ibcs2_syscallnames[];
extern char ibcs2_sigcode[], ibcs2_esigcode[];
void ibcs2_syscall __P((void));
#ifndef __HAVE_SYSCALL_INTERN
void syscall __P((void));
#endif
#ifdef IBCS2_DEBUG
int ibcs2_debug = 1;
@ -68,20 +69,22 @@ int ibcs2_debug = 0;
const struct emul emul_ibcs2 = {
"ibcs2",
"/emul/ibcs2",
native_to_ibcs2_errno,
ibcs2_sendsig,
#ifndef __HAVE_MINIMAL_EMUL
0,
native_to_ibcs2_errno,
IBCS2_SYS_syscall,
IBCS2_SYS_MAXSYSCALL,
#endif
ibcs2_sysent,
ibcs2_syscallnames,
ibcs2_sendsig,
ibcs2_sigcode,
ibcs2_esigcode,
ibcs2_e_proc_exec,
NULL,
NULL,
0,
#ifdef IBCS2_MACHDEP_HAS_SEPARATED_SYSCALL
ibcs2_syscall,
#ifdef __HAVE_SYSCALL_INTERN
ibcs2_syscall_intern,
#else
syscall,
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_errno.h,v 1.3 1998/10/04 00:02:25 fvdl Exp $ */
/* $NetBSD: linux_errno.h,v 1.4 2000/12/11 05:29:01 mycroft Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@ -128,4 +128,6 @@
#define LINUX_EREMOTEIO 121
#define LINUX_EDQUOT 122
extern int native_to_linux_errno[];
#endif /* !_I386_LINUX_ERRNO_H */

View File

@ -1,7 +1,7 @@
/* $NetBSD: linux_machdep.h,v 1.15 2000/12/10 14:09:59 fvdl Exp $ */
/* $NetBSD: linux_machdep.h,v 1.16 2000/12/11 05:29:01 mycroft Exp $ */
/*-
* Copyright (c) 1995 The NetBSD Foundation, Inc.
* Copyright (c) 1995, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -127,9 +127,6 @@ __END_DECLS
#define LINUX_VT_WAITACTIVE 0x5607
#define LINUX_VT_DISALLOCATE 0x5608
/*
* Does the port have separated linux_syscall() ?
*/
#define LINUX_MACHDEP_HAS_SEPARATED_SYSCALL
void linux_syscall_intern __P((struct proc *));
#endif /* _I386_LINUX_MACHDEP_H */

View File

@ -1,7 +1,7 @@
/* $NetBSD: linux_exec.c,v 1.43 2000/12/09 12:38:24 jdolecek Exp $ */
/* $NetBSD: linux_exec.c,v 1.44 2000/12/11 05:29:01 mycroft Exp $ */
/*-
* Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
* Copyright (c) 1994, 1995, 1998, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -69,8 +69,9 @@
extern struct sysent linux_sysent[];
extern const char * const linux_syscallnames[];
extern char linux_sigcode[], linux_esigcode[];
void linux_syscall __P((void));
#ifndef __HAVE_SYSCALL_INTERN
void syscall __P((void));
#endif
static void linux_e_proc_exec __P((struct proc *, struct exec_package *));
static void linux_e_proc_fork __P((struct proc *, struct proc *));
@ -110,24 +111,22 @@ linux_sys_execve(p, v, retval)
const struct emul emul_linux = {
"linux",
"/emul/linux",
#ifndef __HAVE_MINIMAL_EMUL
0,
native_to_linux_errno,
linux_sendsig,
LINUX_SYS_syscall,
LINUX_SYS_MAXSYSCALL,
#endif
linux_sysent,
linux_syscallnames,
linux_sendsig,
linux_sigcode,
linux_esigcode,
linux_e_proc_exec,
linux_e_proc_fork,
linux_e_proc_exit,
#ifdef LINUX_MACHDEP_PASS_PPID_AND_EUID
EMUL_GETPID_PASS_PPID|EMUL_GETID_PASS_EID,
#else
0,
#endif
#ifdef LINUX_MACHDEP_HAS_SEPARATED_SYSCALL
linux_syscall,
#ifdef __HAVE_SYSCALL_INTERN
linux_syscall_intern,
#else
syscall,
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: osf1_exec.c,v 1.19 2000/12/09 12:38:25 jdolecek Exp $ */
/* $NetBSD: osf1_exec.c,v 1.20 2000/12/11 05:29:01 mycroft Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
@ -47,17 +47,17 @@ void syscall __P((void));
const struct emul emul_osf1 = {
"osf1",
"/emul/osf1",
0,
(int *)osf1_errno_rxlist,
sendsig,
OSF1_SYS_syscall,
OSF1_SYS_MAXSYSCALL,
osf1_sysent,
osf1_syscallnames,
sendsig,
osf1_sigcode,
osf1_esigcode,
NULL,
NULL,
NULL,
0,
syscall
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: pecoff_exec.c,v 1.6 2000/12/09 12:38:25 jdolecek Exp $ */
/* $NetBSD: pecoff_exec.c,v 1.7 2000/12/11 05:29:02 mycroft Exp $ */
/*
* Copyright (c) 2000 Masaru OKI
@ -82,29 +82,39 @@ int pecoff_read_from __P((struct proc *p, struct vnode *vp, int pos,
extern char sigcode[], esigcode[];
#ifdef __HAVE_SYSCALL_INTERN
void syscall_intern __P((void));
#else
void syscall __P((void));
#endif
#if notyet
const struct emul emul_pecoff = {
"pecoff",
"/emul/pecoff",
#ifndef __HAVE_MINIMAL_EMUL
0,
0,
sendsig,
SYS_syscall,
SYS_MAXSYSCALL,
#endif
sysent,
#ifdef SYSCALL_DEBUG
syscallnames,
#else
0,
#endif
sendsig,
sigcode,
esigcode,
NULL,
NULL,
NULL,
0,
syscall
#ifdef __HAVE_SYSCALL_INTERN
syscall_intern,
#else
syscall,
#endif
};
#endif

View File

@ -1,4 +1,4 @@
/* $NetBSD: sunos_exec.c,v 1.28 2000/12/09 12:38:25 jdolecek Exp $ */
/* $NetBSD: sunos_exec.c,v 1.29 2000/12/11 05:29:02 mycroft Exp $ */
/*
* Copyright (c) 1993 Theo de Raadt
@ -52,8 +52,8 @@ void syscall __P((void));
struct emul emul_sunos = {
"sunos",
"/emul/sunos",
0,
NULL,
sunos_sendsig,
SUNOS_SYS_syscall,
SUNOS_SYS_MAXSYSCALL,
sunos_sysent,
@ -62,11 +62,11 @@ struct emul emul_sunos = {
#else
NULL,
#endif
sunos_sendsig,
sunos_sigcode,
sunos_esigcode,
NULL,
NULL,
NULL,
0,
syscall
};

View File

@ -1,7 +1,7 @@
/* $NetBSD: svr4_exec.c,v 1.40 2000/12/09 12:44:26 jdolecek Exp $ */
/* $NetBSD: svr4_exec.c,v 1.41 2000/12/11 05:29:02 mycroft Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
* Copyright (c) 1994, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -52,26 +52,29 @@
extern char svr4_sigcode[], svr4_esigcode[];
extern struct sysent svr4_sysent[];
extern const char * const svr4_syscallnames[];
void svr4_syscall __P((void));
#ifndef __HAVE_SYSCALL_INTERN
void syscall __P((void));
#endif
const struct emul emul_svr4 = {
"svr4",
"/emul/svr4",
#ifndef __HAVE_MINIMAL_EMUL
0,
native_to_svr4_errno,
svr4_sendsig,
SVR4_SYS_syscall,
SVR4_SYS_MAXSYSCALL,
#endif
svr4_sysent,
svr4_syscallnames,
svr4_sendsig,
svr4_sigcode,
svr4_esigcode,
NULL,
NULL,
NULL,
0,
#ifdef SVR4_MACHDEP_HAS_SEPARATED_SYSCALL
svr4_syscall,
#ifdef __HAVE_SYSCALL_INTERN
svr4_syscall_intern,
#else
syscall,
#endif

View File

@ -1,7 +1,7 @@
/* $NetBSD: exec_elf32.c,v 1.59 2000/11/28 13:10:41 mrg Exp $ */
/* $NetBSD: exec_elf32.c,v 1.60 2000/12/11 05:29:02 mycroft Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
* Copyright (c) 1994, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -68,8 +68,6 @@
#define ELFSIZE 32
#endif
#include "opt_compat_ibcs2.h" /* XXX quirk for PT_SHLIB section */
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/malloc.h>
@ -514,7 +512,6 @@ ELFNAME2(exec,makecmds)(struct proc *p, struct exec_package *epp)
* interp[] with a changed path (/emul/xxx/<path>).
*/
if (!epp->ep_esch->u.elf_probe_func) {
p->p_emul = epp->ep_esch->es_emul;
pos = ELFDEFNNAME(NO_ADDR);
} else {
error = (*epp->ep_esch->u.elf_probe_func)(p, epp, eh, interp,
@ -563,13 +560,9 @@ ELFNAME2(exec,makecmds)(struct proc *p, struct exec_package *epp)
break;
case PT_SHLIB:
#ifndef COMPAT_IBCS2 /* SCO has these sections */
error = ENOEXEC;
goto bad;
#endif
/* SCO has these sections. */
case PT_INTERP:
/* Already did this one */
/* Already did this one. */
case PT_DYNAMIC:
case PT_NOTE:
break;

View File

@ -1,4 +1,4 @@
/* $NetBSD: init_main.c,v 1.186 2000/12/08 22:07:36 jdolecek Exp $ */
/* $NetBSD: init_main.c,v 1.187 2000/12/11 05:29:02 mycroft Exp $ */
/*
* Copyright (c) 1995 Christopher G. Demetriou. All rights reserved.
@ -246,6 +246,9 @@ main(void)
p->p_stat = SONPROC;
p->p_nice = NZERO;
p->p_emul = &emul_netbsd;
#ifdef __HAVE_SYSCALL_INTERN
(*p->p_emul->e_syscall_intern)(p);
#endif
strncpy(p->p_comm, "swapper", MAXCOMLEN);
callout_init(&p->p_realit_ch);

View File

@ -1,4 +1,4 @@
/* $NetBSD: kern_exec.c,v 1.132 2000/12/10 12:42:30 jdolecek Exp $ */
/* $NetBSD: kern_exec.c,v 1.133 2000/12/11 05:29:02 mycroft Exp $ */
/*-
* Copyright (C) 1993, 1994, 1996 Christopher G. Demetriou
@ -108,28 +108,38 @@ extern char sigcode[], esigcode[];
#ifdef SYSCALL_DEBUG
extern const char * const syscallnames[];
#endif
#ifdef __HAVE_SYSCALL_INTERN
void syscall_intern __P((struct proc *));
#else
void syscall __P((void));
#endif
const struct emul emul_netbsd = {
"netbsd",
NULL, /* emulation path */
#ifndef __HAVE_MINIMAL_EMUL
EMUL_HAS_SYS___syscall,
NULL,
sendsig,
SYS_syscall,
SYS_MAXSYSCALL,
#endif
sysent,
#ifdef SYSCALL_DEBUG
syscallnames,
#else
NULL,
#endif
sendsig,
sigcode,
esigcode,
NULL,
NULL,
NULL,
EMUL_HAS_SYS___syscall,
syscall
#ifdef __HAVE_SYSCALL_INTERN
syscall_intern,
#else
syscall,
#endif
};
/*
@ -632,7 +642,9 @@ sys_execve(struct proc *p, void *v, register_t *retval)
/* update p_emul, the old value is no longer needed */
p->p_emul = pack.ep_es->es_emul;
#ifdef __HAVE_SYSCALL_INTERN
(*p->p_emul->e_syscall_intern)(p);
#endif
#ifdef KTRACE
if (KTRPOINT(p, KTR_EMUL))
ktremul(p);

View File

@ -1,4 +1,4 @@
/* $NetBSD: kern_fork.c,v 1.78 2000/12/10 11:41:20 jdolecek Exp $ */
/* $NetBSD: kern_fork.c,v 1.79 2000/12/11 05:29:02 mycroft Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1991, 1993
@ -193,6 +193,9 @@ fork1(struct proc *p1, int flags, int exitsig, void *stack, size_t stacksize,
*/
p2->p_flag = P_INMEM | (p1->p_flag & P_SUGID);
p2->p_emul = p1->p_emul;
#ifdef __HAVE_SYSCALL_INTERN
(*p2->p_emul->e_syscall_intern)(p2);
#endif
if (p1->p_flag & P_PROFIL)
startprofclock(p2);
p2->p_cred = pool_get(&pcred_pool, PR_WAITOK);

View File

@ -1,4 +1,4 @@
/* $NetBSD: proc.h,v 1.115 2000/12/09 12:34:14 jdolecek Exp $ */
/* $NetBSD: proc.h,v 1.116 2000/12/11 05:29:03 mycroft Exp $ */
/*-
* Copyright (c) 1986, 1989, 1991, 1993
@ -87,13 +87,17 @@ struct ps_strings;
struct emul {
char e_name[8]; /* Symbolic name */
const char *e_path; /* Extra emulation path (NULL if none)*/
#ifndef __HAVE_MINIMAL_EMUL
int e_flags; /* Miscellaneous flags */
/* Syscall handling function */
int *e_errno; /* Errno array */
/* Signal sending function */
void (*e_sendsig) __P((sig_t, int, sigset_t *, u_long));
int e_nosys; /* Offset of the nosys() syscall */
int e_nsysent; /* Number of system call entries */
#endif
const struct sysent *e_sysent; /* System call array */
const char * const *e_syscallnames; /* System call name array */
void (*e_sendsig) __P((sig_t, int, sigset_t *, u_long));
char *e_sigcode; /* Start of sigcode */
char *e_esigcode; /* End of sigcode */
@ -102,10 +106,11 @@ struct emul {
void (*e_proc_fork) __P((struct proc *p, struct proc *parent));
void (*e_proc_exit) __P((struct proc *));
int e_flags; /* Miscellaneous flags */
/* Syscall handling function */
#ifdef __HAVE_SYSCALL_INTERN
void (*e_syscall_intern) __P((struct proc *));
#else
void (*e_syscall) __P((void));
#endif
};
#define EMUL_HAS_SYS___syscall 0x001 /* has SYS___syscall */