Move struct syscall_args syscall arguments parameters container into

struct thread.

For all architectures, the syscall trap handlers have to allocate the
structure on the stack.  The structure takes 88 bytes on 64bit arches
which is not negligible.  Also, it cannot be easily found by other
code, which e.g. caused duplication of some members of the structure
to struct thread already.  The change removes td_dbg_sc_code and
td_dbg_sc_nargs which were directly copied from syscall_args.

The structure is put into the copied on fork part of the struct thread
to make the syscall arguments information correct in the child after
fork.

This move will also allow several more uses shortly.

Reviewed by:	jhb (previous version)
Sponsored by:	The FreeBSD Foundation
MFC after:	3 weeks
X-Differential revision:	https://reviews.freebsd.org/D11080
This commit is contained in:
kib 2017-06-12 21:03:23 +00:00
parent 8f34063675
commit e2a14c603f
25 changed files with 121 additions and 86 deletions

View File

@ -829,16 +829,18 @@ dblfault_handler(struct trapframe *frame)
}
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
register_t *argp;
struct syscall_args *sa;
caddr_t params;
int reg, regcnt, error;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
reg = 0;
regcnt = 6;
@ -889,7 +891,6 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
void
amd64_syscall(struct thread *td, int traced)
{
struct syscall_args sa;
int error;
ksiginfo_t ksi;
@ -899,7 +900,7 @@ amd64_syscall(struct thread *td, int traced)
/* NOT REACHED */
}
#endif
error = syscallenter(td, &sa);
error = syscallenter(td);
/*
* Traced syscall.
@ -915,15 +916,16 @@ amd64_syscall(struct thread *td, int traced)
KASSERT(PCB_USER_FPU(td->td_pcb),
("System call %s returning with kernel FPU ctx leaked",
syscallname(td->td_proc, sa.code)));
syscallname(td->td_proc, td->td_sa.code)));
KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td),
("System call %s returning with mangled pcb_save",
syscallname(td->td_proc, sa.code)));
syscallname(td->td_proc, td->td_sa.code)));
KASSERT(td->td_md.md_invl_gen.gen == 0,
("System call %s returning with leaked invl_gen %lu",
syscallname(td->td_proc, sa.code), td->td_md.md_invl_gen.gen));
syscallname(td->td_proc, td->td_sa.code),
td->td_md.md_invl_gen.gen));
syscallret(td, error, &sa);
syscallret(td, error);
/*
* If the user-supplied value of %rip is not a canonical

View File

@ -90,11 +90,15 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cloudabi32_fetch_syscall_args(struct thread *td)
{
struct trapframe *frame = td->td_frame;
struct trapframe *frame;
struct syscall_args *sa;
int error;
frame = td->td_frame;
sa = &td->td_sa;
/* Obtain system call number. */
sa->code = frame->tf_rax;
if (sa->code >= CLOUDABI32_SYS_MAXSYSCALL)

View File

@ -87,9 +87,13 @@ cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cloudabi64_fetch_syscall_args(struct thread *td)
{
struct trapframe *frame = td->td_frame;
struct trapframe *frame;
struct syscall_args *sa;
frame = td->td_frame;
sa = &td->td_sa;
/* Obtain system call number. */
sa->code = frame->tf_rax;

View File

@ -105,16 +105,18 @@ ia32_set_syscall_retval(struct thread *td, int error)
}
int
ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
ia32_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
struct syscall_args *sa;
caddr_t params;
u_int32_t args[8], tmp;
int error, i;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
params = (caddr_t)frame->tf_rsp + sizeof(u_int32_t);
sa->code = frame->tf_rax;
@ -175,7 +177,6 @@ void
ia32_syscall(struct trapframe *frame)
{
struct thread *td;
struct syscall_args sa;
register_t orig_tf_rflags;
int error;
ksiginfo_t ksi;
@ -184,7 +185,7 @@ ia32_syscall(struct trapframe *frame)
td = curthread;
td->td_frame = frame;
error = syscallenter(td, &sa);
error = syscallenter(td);
/*
* Traced syscall.
@ -198,7 +199,7 @@ ia32_syscall(struct trapframe *frame)
trapsignal(td, &ksi);
}
syscallret(td, error, &sa);
syscallret(td, error);
}
static void

View File

@ -126,7 +126,7 @@ static boolean_t linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
static void linux_vdso_install(void *param);
static void linux_vdso_deinstall(void *param);
static void linux_set_syscall_retval(struct thread *td, int error);
static int linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
static int linux_fetch_syscall_args(struct thread *td);
static void linux_exec_setregs(struct thread *td, struct image_params *imgp,
u_long stack);
static int linux_vsyscall(struct thread *td);
@ -217,13 +217,15 @@ translate_traps(int signal, int trap_code)
}
static int
linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
linux_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
struct syscall_args *sa;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
sa->args[0] = frame->tf_rdi;
sa->args[1] = frame->tf_rsi;

View File

@ -725,13 +725,15 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
}
static int
linux32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
linux32_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
struct syscall_args *sa;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
sa->args[0] = frame->tf_rbx;
sa->args[1] = frame->tf_rcx;

View File

@ -99,12 +99,14 @@ __FBSDID("$FreeBSD$");
void swi_handler(struct trapframe *);
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct proc *p;
register_t *ap;
struct syscall_args *sa;
int error;
sa = &td->td_sa;
sa->code = td->td_frame->tf_r7;
ap = &td->td_frame->tf_r0;
if (sa->code == SYS_syscall) {
@ -141,15 +143,14 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
static void
syscall(struct thread *td, struct trapframe *frame)
{
struct syscall_args sa;
int error;
sa.nap = 4;
td->td_sa.nap = 4;
error = syscallenter(td, &sa);
error = syscallenter(td);
KASSERT(error != 0 || td->td_ar == NULL,
("returning from syscall with td_ar set!"));
syscallret(td, error, &sa);
syscallret(td, error);
}
void

View File

@ -67,11 +67,15 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cloudabi32_fetch_syscall_args(struct thread *td)
{
struct trapframe *frame = td->td_frame;
struct trapframe *frame;
struct syscall_args *sa;
int error;
frame = td->td_frame;
sa = &td->td_sa;
/* Obtain system call number. */
sa->code = frame->tf_r12;
if (sa->code >= CLOUDABI32_SYS_MAXSYSCALL)

View File

@ -92,15 +92,17 @@ call_trapsignal(struct thread *td, int sig, int code, void *addr)
}
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct proc *p;
register_t *ap;
struct syscall_args *sa;
int nap;
nap = 8;
p = td->td_proc;
ap = td->td_frame->tf_x;
sa = &td->td_sa;
sa->code = td->td_frame->tf_x[8];
@ -132,12 +134,11 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
static void
svc_handler(struct thread *td, struct trapframe *frame)
{
struct syscall_args sa;
int error;
if ((frame->tf_esr & ESR_ELx_ISS_MASK) == 0) {
error = syscallenter(td, &sa);
syscallret(td, error, &sa);
error = syscallenter(td);
syscallret(td, error);
} else {
call_trapsignal(td, SIGILL, ILL_ILLOPN, (void *)frame->tf_elr);
userret(td, frame);

View File

@ -67,11 +67,15 @@ cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cloudabi64_fetch_syscall_args(struct thread *td)
{
struct trapframe *frame = td->td_frame;
struct trapframe *frame;
struct syscall_args *sa;
int i;
frame = td->td_frame;
sa = &td->td_sa;
/* Obtain system call number. */
sa->code = frame->tf_x[8];
if (sa->code >= CLOUDABI64_SYS_MAXSYSCALL)

View File

@ -50,7 +50,7 @@
#define IA32_MAXVMEM 0 /* Unlimited */
struct syscall_args;
int ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
int ia32_fetch_syscall_args(struct thread *td);
void ia32_set_syscall_retval(struct thread *, int);
void ia32_fixlimit(struct rlimit *rl, int which);

View File

@ -85,11 +85,15 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cloudabi32_fetch_syscall_args(struct thread *td)
{
struct trapframe *frame = td->td_frame;
struct trapframe *frame;
struct syscall_args *sa;
int error;
frame = td->td_frame;
sa = &td->td_sa;
/* Obtain system call number. */
sa->code = frame->tf_eax;
if (sa->code >= CLOUDABI32_SYS_MAXSYSCALL)

View File

@ -1012,16 +1012,18 @@ dblfault_handler()
}
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
struct syscall_args *sa;
caddr_t params;
long tmp;
int error;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
params = (caddr_t)frame->tf_esp + sizeof(int);
sa->code = frame->tf_eax;
@ -1082,7 +1084,6 @@ void
syscall(struct trapframe *frame)
{
struct thread *td;
struct syscall_args sa;
register_t orig_tf_eflags;
int error;
ksiginfo_t ksi;
@ -1099,7 +1100,7 @@ syscall(struct trapframe *frame)
td = curthread;
td->td_frame = frame;
error = syscallenter(td, &sa);
error = syscallenter(td);
/*
* Traced syscall.
@ -1115,10 +1116,10 @@ syscall(struct trapframe *frame)
KASSERT(PCB_USER_FPU(td->td_pcb),
("System call %s returning with kernel FPU ctx leaked",
syscallname(td->td_proc, sa.code)));
syscallname(td->td_proc, td->td_sa.code)));
KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td),
("System call %s returning with mangled pcb_save",
syscallname(td->td_proc, sa.code)));
syscallname(td->td_proc, td->td_sa.code)));
syscallret(td, error, &sa);
syscallret(td, error);
}

View File

@ -850,13 +850,15 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
}
static int
linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
linux_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
struct syscall_args *sa;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
sa->code = frame->tf_eax;
sa->args[0] = frame->tf_ebx;

View File

@ -360,8 +360,7 @@ SYSINIT(diagwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 2,
#endif
static int
null_fetch_syscall_args(struct thread *td __unused,
struct syscall_args *sa __unused)
null_fetch_syscall_args(struct thread *td __unused)
{
panic("null_fetch_syscall_args");

View File

@ -1099,7 +1099,7 @@ fork_return(struct thread *td, struct trapframe *frame)
*/
PROC_LOCK(p);
td->td_dbgflags |= TDB_SCX;
_STOPEVENT(p, S_SCX, td->td_dbg_sc_code);
_STOPEVENT(p, S_SCX, td->td_sa.code);
if ((p->p_ptevents & PTRACE_SCX) != 0 ||
(td->td_dbgflags & TDB_BORN) != 0)
ptracestop(td, SIGTRAP, NULL);

View File

@ -80,9 +80,9 @@ _Static_assert(offsetof(struct thread, td_flags) == 0xf4,
"struct thread KBI td_flags");
_Static_assert(offsetof(struct thread, td_pflags) == 0xfc,
"struct thread KBI td_pflags");
_Static_assert(offsetof(struct thread, td_frame) == 0x410,
_Static_assert(offsetof(struct thread, td_frame) == 0x460,
"struct thread KBI td_frame");
_Static_assert(offsetof(struct thread, td_emuldata) == 0x4b8,
_Static_assert(offsetof(struct thread, td_emuldata) == 0x508,
"struct thread KBI td_emuldata");
_Static_assert(offsetof(struct proc, p_flag) == 0xb0,
"struct proc KBI p_flag");
@ -100,9 +100,9 @@ _Static_assert(offsetof(struct thread, td_flags) == 0x9c,
"struct thread KBI td_flags");
_Static_assert(offsetof(struct thread, td_pflags) == 0xa4,
"struct thread KBI td_pflags");
_Static_assert(offsetof(struct thread, td_frame) == 0x2c8,
_Static_assert(offsetof(struct thread, td_frame) == 0x2ec,
"struct thread KBI td_frame");
_Static_assert(offsetof(struct thread, td_emuldata) == 0x314,
_Static_assert(offsetof(struct thread, td_emuldata) == 0x338,
"struct thread KBI td_emuldata");
_Static_assert(offsetof(struct proc, p_flag) == 0x68,
"struct proc KBI p_flag");

View File

@ -53,13 +53,15 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
static inline int
syscallenter(struct thread *td, struct syscall_args *sa)
syscallenter(struct thread *td)
{
struct proc *p;
struct syscall_args *sa;
int error, traced;
VM_CNT_INC(v_syscall);
p = td->td_proc;
sa = &td->td_sa;
td->td_pticks = 0;
if (td->td_cowgen != p->p_cowgen)
@ -72,7 +74,7 @@ syscallenter(struct thread *td, struct syscall_args *sa)
td->td_dbgflags |= TDB_SCE;
PROC_UNLOCK(p);
}
error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
error = (p->p_sysent->sv_fetch_syscall_args)(td);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, sa->narg, sa->args);
@ -86,8 +88,6 @@ syscallenter(struct thread *td, struct syscall_args *sa)
STOPEVENT(p, S_SCE, sa->narg);
if (p->p_flag & P_TRACED) {
PROC_LOCK(p);
td->td_dbg_sc_code = sa->code;
td->td_dbg_sc_narg = sa->narg;
if (p->p_ptevents & PTRACE_SCE)
ptracestop((td), SIGTRAP, NULL);
PROC_UNLOCK(p);
@ -97,11 +97,7 @@ syscallenter(struct thread *td, struct syscall_args *sa)
* Reread syscall number and arguments if
* debugger modified registers or memory.
*/
error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
PROC_LOCK(p);
td->td_dbg_sc_code = sa->code;
td->td_dbg_sc_narg = sa->narg;
PROC_UNLOCK(p);
error = (p->p_sysent->sv_fetch_syscall_args)(td);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, sa->narg, sa->args);
@ -163,9 +159,10 @@ syscallenter(struct thread *td, struct syscall_args *sa)
}
static inline void
syscallret(struct thread *td, int error, struct syscall_args *sa)
syscallret(struct thread *td, int error)
{
struct proc *p, *p2;
struct syscall_args *sa;
ksiginfo_t ksi;
int traced, error1;
@ -173,6 +170,7 @@ syscallret(struct thread *td, int error, struct syscall_args *sa)
("fork() did not clear TDP_FORKING upon completion"));
p = td->td_proc;
sa = &td->td_sa;
if ((trap_enotcap || (p->p_flag2 & P2_TRAPCAP) != 0) &&
IN_CAPABILITY_MODE(td)) {
error1 = (td->td_pflags & TDP_NERRNO) == 0 ? error :

View File

@ -1347,8 +1347,8 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
pl->pl_siglist = td2->td_siglist;
strcpy(pl->pl_tdname, td2->td_name);
if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) != 0) {
pl->pl_syscall_code = td2->td_dbg_sc_code;
pl->pl_syscall_narg = td2->td_dbg_sc_narg;
pl->pl_syscall_code = td2->td_sa.code;
pl->pl_syscall_narg = td2->td_sa.narg;
} else {
pl->pl_syscall_code = 0;
pl->pl_syscall_narg = 0;

View File

@ -334,12 +334,16 @@ static int emulate_unaligned_access(struct trapframe *frame, int mode);
extern void fswintrberr(void); /* XXX */
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct trapframe *locr0 = td->td_frame;
struct trapframe *locr0;
struct sysentvec *se;
struct syscall_args *sa;
int error, nsaved;
locr0 = td->td_frame;
sa = &td->td_sa;
bzero(sa->args, sizeof(sa->args));
/* compute next PC after syscall instruction */
@ -785,19 +789,18 @@ trap(struct trapframe *trapframe)
case T_SYSCALL + T_USER:
{
struct syscall_args sa;
int error;
sa.trapframe = trapframe;
error = syscallenter(td, &sa);
td->td_sa.trapframe = trapframe;
error = syscallenter(td);
#if !defined(SMP) && (defined(DDB) || defined(DEBUG))
if (trp == trapdebug)
trapdebug[TRAPSIZE - 1].code = sa.code;
trapdebug[TRAPSIZE - 1].code = td->td_sa.code;
else
trp[-1].code = sa.code;
trp[-1].code = td->td_sa.code;
#endif
trapdebug_enter(td->td_frame, -sa.code);
trapdebug_enter(td->td_frame, -td->td_sa.code);
/*
* The sync'ing of I & D caches for SYS_ptrace() is
@ -805,7 +808,7 @@ trap(struct trapframe *trapframe)
* instead of being done here under a special check
* for SYS_ptrace().
*/
syscallret(td, error, &sa);
syscallret(td, error);
return (trapframe->pc);
}

View File

@ -496,16 +496,18 @@ handle_onfault(struct trapframe *frame)
}
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct proc *p;
struct trapframe *frame;
struct syscall_args *sa;
caddr_t params;
size_t argsz;
int error, n, i;
p = td->td_proc;
frame = td->td_frame;
sa = &td->td_sa;
sa->code = frame->fixreg[0];
params = (caddr_t)(frame->fixreg + FIRSTARG);
@ -587,7 +589,6 @@ void
syscall(struct trapframe *frame)
{
struct thread *td;
struct syscall_args sa;
int error;
td = curthread;
@ -602,8 +603,8 @@ syscall(struct trapframe *frame)
"r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE));
#endif
error = syscallenter(td, &sa);
syscallret(td, error, &sa);
error = syscallenter(td);
syscallret(td, error);
}
#if defined(__powerpc64__) && defined(AIM)

View File

@ -89,14 +89,16 @@ call_trapsignal(struct thread *td, int sig, int code, void *addr)
}
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct proc *p;
register_t *ap;
struct syscall_args *sa;
int nap;
nap = NARGREG;
p = td->td_proc;
sa = &td->td_sa;
ap = &td->td_frame->tf_a[0];
sa->code = td->td_frame->tf_t[0];
@ -151,15 +153,14 @@ dump_regs(struct trapframe *frame)
static void
svc_handler(struct trapframe *frame)
{
struct syscall_args sa;
struct thread *td;
int error;
td = curthread;
td->td_frame = frame;
error = syscallenter(td, &sa);
syscallret(td, error, &sa);
error = syscallenter(td);
syscallret(td, error);
}
static void

View File

@ -538,17 +538,19 @@ trap_pfault(struct thread *td, struct trapframe *tf)
#define REG_MAXARGS 6
int
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
cpu_fetch_syscall_args(struct thread *td)
{
struct trapframe *tf;
struct proc *p;
register_t *argp;
struct syscall_args *sa;
int reg;
int regcnt;
int error;
p = td->td_proc;
tf = td->td_frame;
sa = &td->td_sa;
reg = 0;
regcnt = REG_MAXARGS;
@ -596,7 +598,6 @@ void
syscall(struct trapframe *tf)
{
struct thread *td;
struct syscall_args sa;
int error;
td = curthread;
@ -612,6 +613,6 @@ syscall(struct trapframe *tf)
td->td_pcb->pcb_tpc = tf->tf_tpc;
TF_DONE(tf);
error = syscallenter(td, &sa);
syscallret(td, error, &sa);
error = syscallenter(td);
syscallret(td, error);
}

View File

@ -142,6 +142,7 @@ struct pargs {
* j - locked by proc slock
* k - only accessed by curthread
* k*- only accessed by curthread and from an interrupt
* kx- only accessed by curthread and by debugger
* l - the attaching proc or attaching proc parent
* m - Giant
* n - not locked, lazy
@ -296,11 +297,11 @@ struct thread {
u_char td_pri_class; /* (t) Scheduling class. */
u_char td_user_pri; /* (t) User pri from estcpu and nice. */
u_char td_base_user_pri; /* (t) Base user pri */
u_int td_dbg_sc_code; /* (c) Syscall code to debugger. */
u_int td_dbg_sc_narg; /* (c) Syscall arg count to debugger.*/
uintptr_t td_rb_list; /* (k) Robust list head. */
uintptr_t td_rbp_list; /* (k) Robust priv list head. */
uintptr_t td_rb_inact; /* (k) Current in-action mutex loc. */
struct syscall_args td_sa; /* (kx) Syscall parameters. Copied on
fork for child tracing. */
#define td_endcopy td_pcb
/*
@ -1053,7 +1054,7 @@ void userret(struct thread *, struct trapframe *);
void cpu_exit(struct thread *);
void exit1(struct thread *, int, int) __dead2;
void cpu_copy_thread(struct thread *td, struct thread *td0);
int cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
int cpu_fetch_syscall_args(struct thread *td);
void cpu_fork(struct thread *, struct proc *, struct thread *, int);
void cpu_fork_kthread_handler(struct thread *, void (*)(void *), void *);
void cpu_set_syscall_retval(struct thread *, int);

View File

@ -119,8 +119,7 @@ struct sysentvec {
u_long *sv_maxssiz;
u_int sv_flags;
void (*sv_set_syscall_retval)(struct thread *, int);
int (*sv_fetch_syscall_args)(struct thread *, struct
syscall_args *);
int (*sv_fetch_syscall_args)(struct thread *);
const char **sv_syscallnames;
vm_offset_t sv_timekeep_base;
vm_offset_t sv_shared_page_base;