NetBSD/sys/compat/netbsd32/netbsd32_netbsd.c
wiz 9c131e8d5c Remove last argument from NDINIT call, following
"Remove cn_lwp from struct componentname.  curlwp should be used
from on.  The NDINIT() macro no longer takes the lwp parameter and
associates the credentials of the calling thread with the namei
structure." from pooka.
2007-12-09 12:50:29 +00:00

2519 lines
58 KiB
C

/* $NetBSD: netbsd32_netbsd.c,v 1.133 2007/12/09 12:50:29 wiz Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
* 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. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: netbsd32_netbsd.c,v 1.133 2007/12/09 12:50:29 wiz Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ddb.h"
#include "opt_ntp.h"
#include "opt_compat_netbsd.h"
#include "opt_compat_43.h"
#include "opt_sysv.h"
#include "opt_nfsserver.h"
#include "opt_syscall_debug.h"
#include "opt_ptrace.h"
#include "fs_lfs.h"
#include "fs_nfs.h"
#endif
/*
* Though COMPAT_OLDSOCK is needed only for COMPAT_43, SunOS, Linux,
* HP-UX, FreeBSD, Ultrix, OSF1, we define it unconditionally so that
* this would be LKM-safe.
*/
#define COMPAT_OLDSOCK /* used by <sys/socket.h> */
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
//#define msg __msg /* Don't ask me! */
#include <sys/malloc.h>
#include <sys/mount.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/socketvar.h>
#include <sys/mbuf.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/signalvar.h>
#include <sys/ptrace.h>
#include <sys/ktrace.h>
#include <sys/trace.h>
#include <sys/resourcevar.h>
#include <sys/pool.h>
#include <sys/vnode.h>
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/namei.h>
#include <sys/dirent.h>
#include <sys/kauth.h>
#include <uvm/uvm_extern.h>
#include <sys/syscallargs.h>
#include <sys/proc.h>
#include <sys/acct.h>
#include <sys/exec.h>
#include <net/if.h>
#include <compat/netbsd32/netbsd32.h>
#include <compat/netbsd32/netbsd32_exec.h>
#include <compat/netbsd32/netbsd32_syscall.h>
#include <compat/netbsd32/netbsd32_syscallargs.h>
#include <compat/netbsd32/netbsd32_conv.h>
#include <machine/frame.h>
#if defined(DDB)
#include <ddb/ddbvar.h>
#endif
extern struct sysent netbsd32_sysent[];
#ifdef SYSCALL_DEBUG
extern const char * const netbsd32_syscallnames[];
#endif
#ifdef __HAVE_SYSCALL_INTERN
void netbsd32_syscall_intern(struct proc *);
#else
void syscall(void);
#endif
#define LIMITCHECK(a, b) ((a) != RLIM_INFINITY && (a) > (b))
#ifdef COMPAT_16
extern char netbsd32_sigcode[], netbsd32_esigcode[];
struct uvm_object *emul_netbsd32_object;
#endif
extern struct sysctlnode netbsd32_sysctl_root;
const struct emul emul_netbsd32 = {
"netbsd32",
"/emul/netbsd32",
#ifndef __HAVE_MINIMAL_EMUL
0,
NULL,
NETBSD32_SYS_syscall,
NETBSD32_SYS_NSYSENT,
#endif
netbsd32_sysent,
#ifdef SYSCALL_DEBUG
netbsd32_syscallnames,
#else
NULL,
#endif
netbsd32_sendsig,
trapsignal,
NULL,
#ifdef COMPAT_16
netbsd32_sigcode,
netbsd32_esigcode,
&emul_netbsd32_object,
#else
NULL,
NULL,
NULL,
#endif
netbsd32_setregs,
NULL,
NULL,
NULL,
NULL,
NULL,
#ifdef __HAVE_SYSCALL_INTERN
netbsd32_syscall_intern,
#else
syscall,
#endif
&netbsd32_sysctl_root,
NULL,
netbsd32_vm_default_addr,
NULL,
sizeof(ucontext32_t),
startlwp32,
};
/*
* below are all the standard NetBSD system calls, in the 32bit
* environment, with the necessary conversions to 64bit before
* calling the real syscall. anything that needs special
* attention is handled elsewhere.
*/
int
netbsd32_exit(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_exit_args /* {
syscallarg(int) rval;
} */ *uap = v;
struct sys_exit_args ua;
NETBSD32TO64_UAP(rval);
return sys_exit(l, &ua, retval);
}
int
netbsd32_read(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_read_args /* {
syscallarg(int) fd;
syscallarg(netbsd32_voidp) buf;
syscallarg(netbsd32_size_t) nbyte;
} */ *uap = v;
struct sys_read_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(buf, void *);
NETBSD32TOX_UAP(nbyte, size_t);
return sys_read(l, &ua, retval);
}
int
netbsd32_write(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_write_args /* {
syscallarg(int) fd;
syscallarg(const netbsd32_voidp) buf;
syscallarg(netbsd32_size_t) nbyte;
} */ *uap = v;
struct sys_write_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(buf, void *);
NETBSD32TOX_UAP(nbyte, size_t);
return sys_write(l, &ua, retval);
}
int
netbsd32_close(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_close_args /* {
syscallarg(int) fd;
} */ *uap = v;
struct sys_close_args ua;
NETBSD32TO64_UAP(fd);
return sys_close(l, &ua, retval);
}
int
netbsd32_open(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_open_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) flags;
syscallarg(mode_t) mode;
} */ *uap = v;
struct sys_open_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
NETBSD32TO64_UAP(mode);
return (sys_open(l, &ua, retval));
}
int
netbsd32_link(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_link_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) link;
} */ *uap = v;
struct sys_link_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(link, const char);
return (sys_link(l, &ua, retval));
}
int
netbsd32_unlink(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_unlink_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_unlink_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_unlink(l, &ua, retval));
}
int
netbsd32_chdir(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_chdir_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_chdir_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_chdir(l, &ua, retval));
}
int
netbsd32_fchdir(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fchdir_args /* {
syscallarg(int) fd;
} */ *uap = v;
struct sys_fchdir_args ua;
NETBSD32TO64_UAP(fd);
return (sys_fchdir(l, &ua, retval));
}
int
netbsd32_mknod(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mknod_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(mode_t) mode;
syscallarg(dev_t) dev;
} */ *uap = v;
struct sys_mknod_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(dev);
NETBSD32TO64_UAP(mode);
return (sys_mknod(l, &ua, retval));
}
int
netbsd32_chmod(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_chmod_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(mode_t) mode;
} */ *uap = v;
struct sys_chmod_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(mode);
return (sys_chmod(l, &ua, retval));
}
int
netbsd32_chown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_chown_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(uid_t) uid;
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys_chown_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(uid);
NETBSD32TO64_UAP(gid);
return (sys_chown(l, &ua, retval));
}
int
netbsd32_break(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_break_args /* {
syscallarg(netbsd32_charp) nsize;
} */ *uap = v;
struct sys_obreak_args ua;
SCARG(&ua, nsize) = SCARG_P32(uap, nsize);
NETBSD32TOP_UAP(nsize, char);
return (sys_obreak(l, &ua, retval));
}
int
netbsd32_mount(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mount_args /* {
syscallarg(const netbsd32_charp) type;
syscallarg(const netbsd32_charp) path;
syscallarg(int) flags;
syscallarg(netbsd32_voidp) data;
} */ *uap = v;
struct compat_40_sys_mount_args ua;
NETBSD32TOP_UAP(type, const char);
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
NETBSD32TOP_UAP(data, void);
return (compat_40_sys_mount(l, &ua, retval));
}
int
netbsd32_unmount(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_unmount_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) flags;
} */ *uap = v;
struct sys_unmount_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
return (sys_unmount(l, &ua, retval));
}
int
netbsd32_setuid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setuid_args /* {
syscallarg(uid_t) uid;
} */ *uap = v;
struct sys_setuid_args ua;
NETBSD32TO64_UAP(uid);
return (sys_setuid(l, &ua, retval));
}
int
netbsd32_ptrace(struct lwp *l, void *v, register_t *retval)
{
#if defined(PTRACE) || defined(_LKM)
struct netbsd32_ptrace_args /* {
syscallarg(int) req;
syscallarg(pid_t) pid;
syscallarg(netbsd32_caddr_t) addr;
syscallarg(int) data;
} */ *uap = v;
struct sys_ptrace_args ua;
NETBSD32TO64_UAP(req);
NETBSD32TO64_UAP(pid);
NETBSD32TOP_UAP(addr, void *);
NETBSD32TO64_UAP(data);
#ifdef _LKM
return (*sysent[SYS_ptrace].sy_call)(l, &ua, retval);
#else
return sys_ptrace(l, &ua, retval);
#endif
#else
return (ENOSYS);
#endif /* PTRACE || _LKM */
}
int
netbsd32_accept(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_accept_args /* {
syscallarg(int) s;
syscallarg(netbsd32_sockaddrp_t) name;
syscallarg(netbsd32_intp) anamelen;
} */ *uap = v;
struct sys_accept_args ua;
NETBSD32TO64_UAP(s);
NETBSD32TOP_UAP(name, struct sockaddr);
NETBSD32TOP_UAP(anamelen, socklen_t);
return (sys_accept(l, &ua, retval));
}
int
netbsd32_getpeername(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getpeername_args /* {
syscallarg(int) fdes;
syscallarg(netbsd32_sockaddrp_t) asa;
syscallarg(netbsd32_intp) alen;
} */ *uap = v;
struct sys_getpeername_args ua;
NETBSD32TO64_UAP(fdes);
NETBSD32TOP_UAP(asa, struct sockaddr);
NETBSD32TOP_UAP(alen, socklen_t);
/* NB: do the protocol specific sockaddrs need to be converted? */
return (sys_getpeername(l, &ua, retval));
}
int
netbsd32_getsockname(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getsockname_args /* {
syscallarg(int) fdes;
syscallarg(netbsd32_sockaddrp_t) asa;
syscallarg(netbsd32_intp) alen;
} */ *uap = v;
struct sys_getsockname_args ua;
NETBSD32TO64_UAP(fdes);
NETBSD32TOP_UAP(asa, struct sockaddr);
NETBSD32TOP_UAP(alen, socklen_t);
return (sys_getsockname(l, &ua, retval));
}
int
netbsd32_access(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_access_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) flags;
} */ *uap = v;
struct sys_access_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
return sys_access(l, &ua, retval);
}
int
netbsd32_chflags(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_chflags_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(netbsd32_u_long) flags;
} */ *uap = v;
struct sys_chflags_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
return (sys_chflags(l, &ua, retval));
}
int
netbsd32_fchflags(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fchflags_args /* {
syscallarg(int) fd;
syscallarg(netbsd32_u_long) flags;
} */ *uap = v;
struct sys_fchflags_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(flags);
return (sys_fchflags(l, &ua, retval));
}
int
netbsd32_lchflags(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lchflags_args /* {
syscallarg(const char *) path;
syscallarg(netbsd32_u_long) flags;
} */ *uap = v;
struct sys_lchflags_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
return (sys_lchflags(l, &ua, retval));
}
int
netbsd32_kill(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_kill_args /* {
syscallarg(int) pid;
syscallarg(int) signum;
} */ *uap = v;
struct sys_kill_args ua;
NETBSD32TO64_UAP(pid);
NETBSD32TO64_UAP(signum);
return (sys_kill(l, &ua, retval));
}
int
netbsd32_dup(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_dup_args /* {
syscallarg(int) fd;
} */ *uap = v;
struct sys_dup_args ua;
NETBSD32TO64_UAP(fd);
return (sys_dup(l, &ua, retval));
}
int
netbsd32_profil(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_profil_args /* {
syscallarg(netbsd32_caddr_t) samples;
syscallarg(netbsd32_size_t) size;
syscallarg(netbsd32_u_long) offset;
syscallarg(u_int) scale;
} */ *uap = v;
struct sys_profil_args ua;
NETBSD32TOP_UAP(samples, void *);
NETBSD32TOX_UAP(size, size_t);
NETBSD32TOX_UAP(offset, u_long);
NETBSD32TO64_UAP(scale);
return (sys_profil(l, &ua, retval));
}
int
netbsd32_ktrace(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_ktrace_args /* {
syscallarg(const netbsd32_charp) fname;
syscallarg(int) ops;
syscallarg(int) facs;
syscallarg(int) pid;
} */ *uap = v;
struct sys_ktrace_args ua;
NETBSD32TOP_UAP(fname, const char);
NETBSD32TO64_UAP(ops);
NETBSD32TO64_UAP(facs);
NETBSD32TO64_UAP(pid);
return (sys_ktrace(l, &ua, retval));
}
int
netbsd32_utrace(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_utrace_args /* {
syscallarg(const netbsd32_charp) label;
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
} */ *uap = v;
struct sys_utrace_args ua;
NETBSD32TOP_UAP(label, const char);
NETBSD32TOP_UAP(addr, void);
NETBSD32TO64_UAP(len);
return (sys_utrace(l, &ua, retval));
}
int
netbsd32___getlogin(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___getlogin_args /* {
syscallarg(netbsd32_charp) namebuf;
syscallarg(u_int) namelen;
} */ *uap = v;
struct sys___getlogin_args ua;
NETBSD32TOP_UAP(namebuf, char);
NETBSD32TO64_UAP(namelen);
return (sys___getlogin(l, &ua, retval));
}
int
netbsd32_setlogin(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setlogin_args /* {
syscallarg(const netbsd32_charp) namebuf;
} */ *uap = v;
struct sys___setlogin_args ua;
NETBSD32TOP_UAP(namebuf, char);
return (sys___setlogin(l, &ua, retval));
}
int
netbsd32_acct(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_acct_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_acct_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_acct(l, &ua, retval));
}
int
netbsd32_revoke(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_revoke_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_revoke_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_revoke(l, &ua, retval));
}
int
netbsd32_symlink(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_symlink_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) link;
} */ *uap = v;
struct sys_symlink_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(link, const char);
return (sys_symlink(l, &ua, retval));
}
int
netbsd32_readlink(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_readlink_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(netbsd32_charp) buf;
syscallarg(netbsd32_size_t) count;
} */ *uap = v;
struct sys_readlink_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(buf, char);
NETBSD32TOX_UAP(count, size_t);
return (sys_readlink(l, &ua, retval));
}
int
netbsd32_umask(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_umask_args /* {
syscallarg(mode_t) newmask;
} */ *uap = v;
struct sys_umask_args ua;
NETBSD32TO64_UAP(newmask);
return (sys_umask(l, &ua, retval));
}
int
netbsd32_chroot(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_chroot_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_chroot_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_chroot(l, &ua, retval));
}
int
netbsd32_sbrk(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_sbrk_args /* {
syscallarg(int) incr;
} */ *uap = v;
struct sys_sbrk_args ua;
NETBSD32TO64_UAP(incr);
return (sys_sbrk(l, &ua, retval));
}
int
netbsd32_sstk(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_sstk_args /* {
syscallarg(int) incr;
} */ *uap = v;
struct sys_sstk_args ua;
NETBSD32TO64_UAP(incr);
return (sys_sstk(l, &ua, retval));
}
int
netbsd32_munmap(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_munmap_args /* {
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
} */ *uap = v;
struct sys_munmap_args ua;
NETBSD32TOP_UAP(addr, void);
NETBSD32TOX_UAP(len, size_t);
return (sys_munmap(l, &ua, retval));
}
int
netbsd32_mprotect(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mprotect_args /* {
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(int) prot;
} */ *uap = v;
struct sys_mprotect_args ua;
NETBSD32TOP_UAP(addr, void);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TO64_UAP(prot);
return (sys_mprotect(l, &ua, retval));
}
int
netbsd32_madvise(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_madvise_args /* {
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(int) behav;
} */ *uap = v;
struct sys_madvise_args ua;
NETBSD32TOP_UAP(addr, void);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TO64_UAP(behav);
return (sys_madvise(l, &ua, retval));
}
int
netbsd32_mincore(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mincore_args /* {
syscallarg(netbsd32_caddr_t) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(netbsd32_charp) vec;
} */ *uap = v;
struct sys_mincore_args ua;
NETBSD32TOP_UAP(addr, void *);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TOP_UAP(vec, char);
return (sys_mincore(l, &ua, retval));
}
/* XXX MOVE ME XXX ? */
int
netbsd32_getgroups(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getgroups_args /* {
syscallarg(int) gidsetsize;
syscallarg(netbsd32_gid_tp) gidset;
} */ *uap = v;
struct sys_getgroups_args ua;
/* Since sizeof (gid_t) == sizeof (netbsd32_gid_t) ... */
NETBSD32TO64_UAP(gidsetsize);
NETBSD32TOP_UAP(gidset, gid_t);
return (sys_getgroups(l, &ua, retval));
}
int
netbsd32_setgroups(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setgroups_args /* {
syscallarg(int) gidsetsize;
syscallarg(const netbsd32_gid_tp) gidset;
} */ *uap = v;
struct sys_setgroups_args ua;
NETBSD32TO64_UAP(gidsetsize);
NETBSD32TOP_UAP(gidset, gid_t);
return (sys_setgroups(l, &ua, retval));
}
int
netbsd32_setpgid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setpgid_args /* {
syscallarg(int) pid;
syscallarg(int) pgid;
} */ *uap = v;
struct sys_setpgid_args ua;
NETBSD32TO64_UAP(pid);
NETBSD32TO64_UAP(pgid);
return (sys_setpgid(l, &ua, retval));
}
int
netbsd32_fcntl(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fcntl_args /* {
syscallarg(int) fd;
syscallarg(int) cmd;
syscallarg(netbsd32_voidp) arg;
} */ *uap = v;
struct sys_fcntl_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(cmd);
NETBSD32TOP_UAP(arg, void);
/* we can do this because `struct flock' doesn't change */
return (sys_fcntl(l, &ua, retval));
}
int
netbsd32_dup2(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_dup2_args /* {
syscallarg(int) from;
syscallarg(int) to;
} */ *uap = v;
struct sys_dup2_args ua;
NETBSD32TO64_UAP(from);
NETBSD32TO64_UAP(to);
return (sys_dup2(l, &ua, retval));
}
int
netbsd32_fsync(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fsync_args /* {
syscallarg(int) fd;
} */ *uap = v;
struct sys_fsync_args ua;
NETBSD32TO64_UAP(fd);
return (sys_fsync(l, &ua, retval));
}
int
netbsd32_setpriority(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setpriority_args /* {
syscallarg(int) which;
syscallarg(int) who;
syscallarg(int) prio;
} */ *uap = v;
struct sys_setpriority_args ua;
NETBSD32TO64_UAP(which);
NETBSD32TO64_UAP(who);
NETBSD32TO64_UAP(prio);
return (sys_setpriority(l, &ua, retval));
}
int
netbsd32_sys___socket30(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_sys___socket30_args /* {
syscallarg(int) domain;
syscallarg(int) type;
syscallarg(int) protocol;
} */ *uap = v;
struct sys___socket30_args ua;
NETBSD32TO64_UAP(domain);
NETBSD32TO64_UAP(type);
NETBSD32TO64_UAP(protocol);
return (sys___socket30(l, &ua, retval));
}
int
netbsd32_connect(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_connect_args /* {
syscallarg(int) s;
syscallarg(const netbsd32_sockaddrp_t) name;
syscallarg(int) namelen;
} */ *uap = v;
struct sys_connect_args ua;
NETBSD32TO64_UAP(s);
NETBSD32TOP_UAP(name, struct sockaddr);
NETBSD32TO64_UAP(namelen);
return (sys_connect(l, &ua, retval));
}
int
netbsd32_getpriority(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getpriority_args /* {
syscallarg(int) which;
syscallarg(int) who;
} */ *uap = v;
struct sys_getpriority_args ua;
NETBSD32TO64_UAP(which);
NETBSD32TO64_UAP(who);
return (sys_getpriority(l, &ua, retval));
}
int
netbsd32_bind(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_bind_args /* {
syscallarg(int) s;
syscallarg(const netbsd32_sockaddrp_t) name;
syscallarg(int) namelen;
} */ *uap = v;
struct sys_bind_args ua;
NETBSD32TO64_UAP(s);
NETBSD32TOP_UAP(name, struct sockaddr);
NETBSD32TO64_UAP(namelen);
return (sys_bind(l, &ua, retval));
}
int
netbsd32_setsockopt(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setsockopt_args /* {
syscallarg(int) s;
syscallarg(int) level;
syscallarg(int) name;
syscallarg(const netbsd32_voidp) val;
syscallarg(int) valsize;
} */ *uap = v;
struct sys_setsockopt_args ua;
NETBSD32TO64_UAP(s);
NETBSD32TO64_UAP(level);
NETBSD32TO64_UAP(name);
NETBSD32TOP_UAP(val, void);
NETBSD32TO64_UAP(valsize);
/* may be more efficient to do this inline. */
return (sys_setsockopt(l, &ua, retval));
}
int
netbsd32_listen(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_listen_args /* {
syscallarg(int) s;
syscallarg(int) backlog;
} */ *uap = v;
struct sys_listen_args ua;
NETBSD32TO64_UAP(s);
NETBSD32TO64_UAP(backlog);
return (sys_listen(l, &ua, retval));
}
int
netbsd32_fchown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fchown_args /* {
syscallarg(int) fd;
syscallarg(uid_t) uid;
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys_fchown_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(uid);
NETBSD32TO64_UAP(gid);
return (sys_fchown(l, &ua, retval));
}
int
netbsd32_fchmod(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fchmod_args /* {
syscallarg(int) fd;
syscallarg(mode_t) mode;
} */ *uap = v;
struct sys_fchmod_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(mode);
return (sys_fchmod(l, &ua, retval));
}
int
netbsd32_setreuid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setreuid_args /* {
syscallarg(uid_t) ruid;
syscallarg(uid_t) euid;
} */ *uap = v;
struct sys_setreuid_args ua;
NETBSD32TO64_UAP(ruid);
NETBSD32TO64_UAP(euid);
return (sys_setreuid(l, &ua, retval));
}
int
netbsd32_setregid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setregid_args /* {
syscallarg(gid_t) rgid;
syscallarg(gid_t) egid;
} */ *uap = v;
struct sys_setregid_args ua;
NETBSD32TO64_UAP(rgid);
NETBSD32TO64_UAP(egid);
return (sys_setregid(l, &ua, retval));
}
int
netbsd32_getsockopt(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getsockopt_args /* {
syscallarg(int) s;
syscallarg(int) level;
syscallarg(int) name;
syscallarg(netbsd32_voidp) val;
syscallarg(netbsd32_intp) avalsize;
} */ *uap = v;
struct sys_getsockopt_args ua;
NETBSD32TO64_UAP(s);
NETBSD32TO64_UAP(level);
NETBSD32TO64_UAP(name);
NETBSD32TOP_UAP(val, void);
NETBSD32TOP_UAP(avalsize, socklen_t);
return (sys_getsockopt(l, &ua, retval));
}
int
netbsd32_rename(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_rename_args /* {
syscallarg(const netbsd32_charp) from;
syscallarg(const netbsd32_charp) to;
} */ *uap = v;
struct sys_rename_args ua;
NETBSD32TOP_UAP(from, const char);
NETBSD32TOP_UAP(to, const char)
return (sys_rename(l, &ua, retval));
}
int
netbsd32_flock(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_flock_args /* {
syscallarg(int) fd;
syscallarg(int) how;
} */ *uap = v;
struct sys_flock_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(how)
return (sys_flock(l, &ua, retval));
}
int
netbsd32_mkfifo(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mkfifo_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(mode_t) mode;
} */ *uap = v;
struct sys_mkfifo_args ua;
NETBSD32TOP_UAP(path, const char)
NETBSD32TO64_UAP(mode);
return (sys_mkfifo(l, &ua, retval));
}
int
netbsd32_shutdown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_shutdown_args /* {
syscallarg(int) s;
syscallarg(int) how;
} */ *uap = v;
struct sys_shutdown_args ua;
NETBSD32TO64_UAP(s)
NETBSD32TO64_UAP(how);
return (sys_shutdown(l, &ua, retval));
}
int
netbsd32_socketpair(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_socketpair_args /* {
syscallarg(int) domain;
syscallarg(int) type;
syscallarg(int) protocol;
syscallarg(netbsd32_intp) rsv;
} */ *uap = v;
struct sys_socketpair_args ua;
NETBSD32TO64_UAP(domain);
NETBSD32TO64_UAP(type);
NETBSD32TO64_UAP(protocol);
NETBSD32TOP_UAP(rsv, int);
/* Since we're just copying out two `int's we can do this */
return (sys_socketpair(l, &ua, retval));
}
int
netbsd32_mkdir(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mkdir_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(mode_t) mode;
} */ *uap = v;
struct sys_mkdir_args ua;
NETBSD32TOP_UAP(path, const char)
NETBSD32TO64_UAP(mode);
return (sys_mkdir(l, &ua, retval));
}
int
netbsd32_rmdir(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_rmdir_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_rmdir_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_rmdir(l, &ua, retval));
}
int
netbsd32_quotactl(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_quotactl_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) cmd;
syscallarg(int) uid;
syscallarg(netbsd32_caddr_t) arg;
} */ *uap = v;
struct sys_quotactl_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(cmd);
NETBSD32TO64_UAP(uid);
NETBSD32TOP_UAP(arg, void *);
return (sys_quotactl(l, &ua, retval));
}
#if defined(NFS) || defined(NFSSERVER)
int
netbsd32_nfssvc(struct lwp *l, void *v, register_t *retval)
{
#if 0
struct netbsd32_nfssvc_args /* {
syscallarg(int) flag;
syscallarg(netbsd32_voidp) argp;
} */ *uap = v;
struct sys_nfssvc_args ua;
NETBSD32TO64_UAP(flag);
NETBSD32TOP_UAP(argp, void);
return (sys_nfssvc(l, &ua, retval));
#else
/* Why would we want to support a 32-bit nfsd? */
return (ENOSYS);
#endif
}
#endif
int
netbsd32___getfh30(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___getfh30_args /* {
syscallarg(const netbsd32_charp) fname;
syscallarg(netbsd32_fhandlep_t) fhp;
syscallarg(netbsd32_size_tp) fh_size;
} */ *uap = v;
struct vnode *vp;
fhandle_t *fh;
int error;
struct nameidata nd;
netbsd32_size_t sz32;
size_t sz;
/*
* Must be super user
*/
error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_FILEHANDLE,
0, NULL, NULL, NULL);
if (error)
return (error);
fh = NULL;
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | TRYEMULROOT, UIO_USERSPACE,
SCARG_P32(uap, fname));
error = namei(&nd);
if (error)
return (error);
vp = nd.ni_vp;
error = copyin(SCARG_P32(uap, fh_size), &sz32,
sizeof(netbsd32_size_t));
if (!error) {
fh = malloc(sz32, M_TEMP, M_WAITOK);
if (fh == NULL)
return EINVAL;
sz = sz32;
error = vfs_composefh(vp, fh, &sz);
sz32 = sz;
}
vput(vp);
if (error == E2BIG)
copyout(&sz, SCARG_P32(uap, fh_size), sizeof(size_t));
if (error == 0) {
error = copyout(&sz32, SCARG_P32(uap, fh_size),
sizeof(netbsd32_size_t));
if (!error)
error = copyout(fh, SCARG_P32(uap, fhp), sz);
}
free(fh, M_TEMP);
return (error);
}
int
netbsd32_pread(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_pread_args /* {
syscallarg(int) fd;
syscallarg(netbsd32_voidp) buf;
syscallarg(netbsd32_size_t) nbyte;
syscallarg(int) pad;
syscallarg(off_t) offset;
} */ *uap = v;
struct sys_pread_args ua;
ssize_t rt;
int error;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(buf, void);
NETBSD32TOX_UAP(nbyte, size_t);
NETBSD32TO64_UAP(pad);
NETBSD32TO64_UAP(offset);
error = sys_pread(l, &ua, (register_t *)&rt);
*retval = rt;
return (error);
}
int
netbsd32_pwrite(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_pwrite_args /* {
syscallarg(int) fd;
syscallarg(const netbsd32_voidp) buf;
syscallarg(netbsd32_size_t) nbyte;
syscallarg(int) pad;
syscallarg(off_t) offset;
} */ *uap = v;
struct sys_pwrite_args ua;
ssize_t rt;
int error;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(buf, void);
NETBSD32TOX_UAP(nbyte, size_t);
NETBSD32TO64_UAP(pad);
NETBSD32TO64_UAP(offset);
error = sys_pwrite(l, &ua, (register_t *)&rt);
*retval = rt;
return (error);
}
int
netbsd32_setgid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setgid_args /* {
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys_setgid_args ua;
NETBSD32TO64_UAP(gid);
return (sys_setgid(l, v, retval));
}
int
netbsd32_setegid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setegid_args /* {
syscallarg(gid_t) egid;
} */ *uap = v;
struct sys_setegid_args ua;
NETBSD32TO64_UAP(egid);
return (sys_setegid(l, v, retval));
}
int
netbsd32_seteuid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_seteuid_args /* {
syscallarg(gid_t) euid;
} */ *uap = v;
struct sys_seteuid_args ua;
NETBSD32TO64_UAP(euid);
return (sys_seteuid(l, v, retval));
}
#ifdef LFS
int
netbsd32_sys_lfs_bmapv(struct lwp *l, void *v, register_t *retval)
{
return (ENOSYS); /* XXX */
}
int
netbsd32_sys_lfs_markv(struct lwp *l, void *v, register_t *retval)
{
return (ENOSYS); /* XXX */
}
int
netbsd32_sys_lfs_segclean(struct lwp *l, void *v, register_t *retval)
{
return (ENOSYS); /* XXX */
}
int
netbsd32_sys_lfs_segwait(struct lwp *l, void *v, register_t *retval)
{
return (ENOSYS); /* XXX */
}
#endif
int
netbsd32_pathconf(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_pathconf_args /* {
syscallarg(int) fd;
syscallarg(int) name;
} */ *uap = v;
struct sys_pathconf_args ua;
long rt;
int error;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(name);
error = sys_pathconf(l, &ua, (register_t *)&rt);
*retval = rt;
return (error);
}
int
netbsd32_fpathconf(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fpathconf_args /* {
syscallarg(int) fd;
syscallarg(int) name;
} */ *uap = v;
struct sys_fpathconf_args ua;
long rt;
int error;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(name);
error = sys_fpathconf(l, &ua, (register_t *)&rt);
*retval = rt;
return (error);
}
int
netbsd32_getrlimit(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getrlimit_args /* {
syscallarg(int) which;
syscallarg(netbsd32_rlimitp_t) rlp;
} */ *uap = v;
int which = SCARG(uap, which);
if ((u_int)which >= RLIM_NLIMITS)
return (EINVAL);
return (copyout(&l->l_proc->p_rlimit[which],
SCARG_P32(uap, rlp), sizeof(struct rlimit)));
}
int
netbsd32_setrlimit(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setrlimit_args /* {
syscallarg(int) which;
syscallarg(const netbsd32_rlimitp_t) rlp;
} */ *uap = v;
int which = SCARG(uap, which);
struct rlimit alim;
int error;
error = copyin(SCARG_P32(uap, rlp), &alim, sizeof(struct rlimit));
if (error)
return (error);
switch (which) {
case RLIMIT_DATA:
if (LIMITCHECK(alim.rlim_cur, MAXDSIZ32))
alim.rlim_cur = MAXDSIZ32;
if (LIMITCHECK(alim.rlim_max, MAXDSIZ32))
alim.rlim_max = MAXDSIZ32;
break;
case RLIMIT_STACK:
if (LIMITCHECK(alim.rlim_cur, MAXSSIZ32))
alim.rlim_cur = MAXSSIZ32;
if (LIMITCHECK(alim.rlim_max, MAXSSIZ32))
alim.rlim_max = MAXSSIZ32;
default:
break;
}
return (dosetrlimit(l, l->l_proc, which, &alim));
}
int
netbsd32_mmap(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mmap_args /* {
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(int) prot;
syscallarg(int) flags;
syscallarg(int) fd;
syscallarg(netbsd32_long) pad;
syscallarg(off_t) pos;
} */ *uap = v;
struct sys_mmap_args ua;
int error;
NETBSD32TOP_UAP(addr, void);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TO64_UAP(prot);
NETBSD32TO64_UAP(flags);
NETBSD32TO64_UAP(fd);
NETBSD32TOX_UAP(pad, long);
NETBSD32TOX_UAP(pos, off_t);
error = sys_mmap(l, &ua, retval);
if ((u_long)*retval > (u_long)UINT_MAX) {
printf("netbsd32_mmap: retval out of range: 0x%lx",
(u_long)*retval);
/* Should try to recover and return an error here. */
}
return (error);
}
int
netbsd32_lseek(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lseek_args /* {
syscallarg(int) fd;
syscallarg(int) pad;
syscallarg(off_t) offset;
syscallarg(int) whence;
} */ *uap = v;
struct sys_lseek_args ua;
int rv;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(pad);
NETBSD32TO64_UAP(offset);
NETBSD32TO64_UAP(whence);
rv = sys_lseek(l, &ua, retval);
#ifdef NETBSD32_OFF_T_RETURN
if (rv == 0)
NETBSD32_OFF_T_RETURN(retval);
#endif
return rv;
}
int
netbsd32_truncate(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_truncate_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) pad;
syscallarg(off_t) length;
} */ *uap = v;
struct sys_truncate_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(pad);
NETBSD32TO64_UAP(length);
return (sys_truncate(l, &ua, retval));
}
int
netbsd32_ftruncate(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_ftruncate_args /* {
syscallarg(int) fd;
syscallarg(int) pad;
syscallarg(off_t) length;
} */ *uap = v;
struct sys_ftruncate_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(pad);
NETBSD32TO64_UAP(length);
return (sys_ftruncate(l, &ua, retval));
}
int
netbsd32_mlock(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mlock_args /* {
syscallarg(const netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
} */ *uap = v;
struct sys_mlock_args ua;
NETBSD32TOP_UAP(addr, const void);
NETBSD32TO64_UAP(len);
return (sys_mlock(l, &ua, retval));
}
int
netbsd32_munlock(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_munlock_args /* {
syscallarg(const netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
} */ *uap = v;
struct sys_munlock_args ua;
NETBSD32TOP_UAP(addr, const void);
NETBSD32TO64_UAP(len);
return (sys_munlock(l, &ua, retval));
}
int
netbsd32_undelete(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_undelete_args /* {
syscallarg(const netbsd32_charp) path;
} */ *uap = v;
struct sys_undelete_args ua;
NETBSD32TOP_UAP(path, const char);
return (sys_undelete(l, &ua, retval));
}
int
netbsd32_getpgid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getpgid_args /* {
syscallarg(pid_t) pid;
} */ *uap = v;
struct sys_getpgid_args ua;
NETBSD32TO64_UAP(pid);
return (sys_getpgid(l, &ua, retval));
}
int
netbsd32_reboot(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_reboot_args /* {
syscallarg(int) opt;
syscallarg(netbsd32_charp) bootstr;
} */ *uap = v;
struct sys_reboot_args ua;
NETBSD32TO64_UAP(opt);
NETBSD32TOP_UAP(bootstr, char);
return (sys_reboot(l, &ua, retval));
}
#include <sys/poll.h>
int
netbsd32_poll(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_poll_args /* {
syscallarg(netbsd32_pollfdp_t) fds;
syscallarg(u_int) nfds;
syscallarg(int) timeout;
} */ *uap = v;
struct sys_poll_args ua;
NETBSD32TOP_UAP(fds, struct pollfd);
NETBSD32TO64_UAP(nfds);
NETBSD32TO64_UAP(timeout);
return (sys_poll(l, &ua, retval));
}
int
netbsd32_fdatasync(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fdatasync_args /* {
syscallarg(int) fd;
} */ *uap = v;
struct sys_fdatasync_args ua;
NETBSD32TO64_UAP(fd);
return (sys_fdatasync(l, &ua, retval));
}
int
netbsd32___posix_rename(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___posix_rename_args /* {
syscallarg(const netbsd32_charp) from;
syscallarg(const netbsd32_charp) to;
} */ *uap = v;
struct sys___posix_rename_args ua;
NETBSD32TOP_UAP(from, const char);
NETBSD32TOP_UAP(to, const char);
return (sys___posix_rename(l, &ua, retval));
}
int
netbsd32_swapctl(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_swapctl_args /* {
syscallarg(int) cmd;
syscallarg(const netbsd32_voidp) arg;
syscallarg(int) misc;
} */ *uap = v;
struct sys_swapctl_args ua;
NETBSD32TO64_UAP(cmd);
NETBSD32TOP_UAP(arg, void);
NETBSD32TO64_UAP(misc);
return (sys_swapctl(l, &ua, retval));
}
int
netbsd32_minherit(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_minherit_args /* {
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(int) inherit;
} */ *uap = v;
struct sys_minherit_args ua;
NETBSD32TOP_UAP(addr, void);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TO64_UAP(inherit);
return (sys_minherit(l, &ua, retval));
}
int
netbsd32_lchmod(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lchmod_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(mode_t) mode;
} */ *uap = v;
struct sys_lchmod_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(mode);
return (sys_lchmod(l, &ua, retval));
}
int
netbsd32_lchown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lchown_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(uid_t) uid;
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys_lchown_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(uid);
NETBSD32TO64_UAP(gid);
return (sys_lchown(l, &ua, retval));
}
int
netbsd32___msync13(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___msync13_args /* {
syscallarg(netbsd32_voidp) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(int) flags;
} */ *uap = v;
struct sys___msync13_args ua;
NETBSD32TOP_UAP(addr, void);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TO64_UAP(flags);
return (sys___msync13(l, &ua, retval));
}
int
netbsd32___posix_chown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___posix_chown_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(uid_t) uid;
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys___posix_chown_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(uid);
NETBSD32TO64_UAP(gid);
return (sys___posix_chown(l, &ua, retval));
}
int
netbsd32___posix_fchown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___posix_fchown_args /* {
syscallarg(int) fd;
syscallarg(uid_t) uid;
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys___posix_fchown_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(uid);
NETBSD32TO64_UAP(gid);
return (sys___posix_fchown(l, &ua, retval));
}
int
netbsd32___posix_lchown(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___posix_lchown_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(uid_t) uid;
syscallarg(gid_t) gid;
} */ *uap = v;
struct sys___posix_lchown_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(uid);
NETBSD32TO64_UAP(gid);
return (sys___posix_lchown(l, &ua, retval));
}
int
netbsd32_getsid(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getsid_args /* {
syscallarg(pid_t) pid;
} */ *uap = v;
struct sys_getsid_args ua;
NETBSD32TO64_UAP(pid);
return (sys_getsid(l, &ua, retval));
}
int
netbsd32_fktrace(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fktrace_args /* {
syscallarg(const int) fd;
syscallarg(int) ops;
syscallarg(int) facs;
syscallarg(int) pid;
} */ *uap = v;
#if 0
struct sys_fktrace_args ua;
#else
/* XXXX */
struct sys_fktrace_noconst_args {
syscallarg(int) fd;
syscallarg(int) ops;
syscallarg(int) facs;
syscallarg(int) pid;
} ua;
#endif
NETBSD32TOX_UAP(fd, int);
NETBSD32TO64_UAP(ops);
NETBSD32TO64_UAP(facs);
NETBSD32TO64_UAP(pid);
return (sys_fktrace(l, &ua, retval));
}
int netbsd32___sigpending14(l, v, retval)
struct lwp *l;
void *v;
register_t *retval;
{
struct netbsd32___sigpending14_args /* {
syscallarg(sigset_t *) set;
} */ *uap = v;
struct sys___sigpending14_args ua;
NETBSD32TOP_UAP(set, sigset_t);
return (sys___sigpending14(l, &ua, retval));
}
int netbsd32___sigprocmask14(l, v, retval)
struct lwp *l;
void *v;
register_t *retval;
{
struct netbsd32___sigprocmask14_args /* {
syscallarg(int) how;
syscallarg(const sigset_t *) set;
syscallarg(sigset_t *) oset;
} */ *uap = v;
struct sys___sigprocmask14_args ua;
NETBSD32TO64_UAP(how);
NETBSD32TOP_UAP(set, sigset_t);
NETBSD32TOP_UAP(oset, sigset_t);
return (sys___sigprocmask14(l, &ua, retval));
}
int netbsd32___sigsuspend14(l, v, retval)
struct lwp *l;
void *v;
register_t *retval;
{
struct netbsd32___sigsuspend14_args /* {
syscallarg(const sigset_t *) set;
} */ *uap = v;
struct sys___sigsuspend14_args ua;
NETBSD32TOP_UAP(set, sigset_t);
return (sys___sigsuspend14(l, &ua, retval));
};
int netbsd32_fchroot(l, v, retval)
struct lwp *l;
void *v;
register_t *retval;
{
struct netbsd32_fchroot_args /* {
syscallarg(int) fd;
} */ *uap = v;
struct sys_fchroot_args ua;
NETBSD32TO64_UAP(fd);
return (sys_fchroot(l, &ua, retval));
}
/*
* Open a file given a file handle.
*
* Check permissions, allocate an open file structure,
* and call the device open routine if any.
*/
int
netbsd32___fhopen40(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___fhopen40_args /* {
syscallarg(const netbsd32_pointer_t *) fhp;
syscallarg(netbsd32_size_t) fh_size;
syscallarg(int) flags;
} */ *uap = v;
struct sys___fhopen40_args ua;
NETBSD32TOP_UAP(fhp, fhandle_t);
NETBSD32TO64_UAP(fh_size);
NETBSD32TO64_UAP(flags);
return (sys___fhopen40(l, &ua, retval));
}
/* virtual memory syscalls */
int
netbsd32_ovadvise(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_ovadvise_args /* {
syscallarg(int) anom;
} */ *uap = v;
struct sys_ovadvise_args ua;
NETBSD32TO64_UAP(anom);
return (sys_ovadvise(l, &ua, retval));
}
void
netbsd32_adjust_limits(struct proc *p)
{
static const struct {
int id;
rlim_t lim;
} lm[] = {
{ RLIMIT_DATA, MAXDSIZ32 },
{ RLIMIT_STACK, MAXSSIZ32 },
};
size_t i;
struct plimit *lim;
struct rlimit *rlim;
/*
* We can only reduce the current limits, we cannot stop external
* processes from changing them (eg via sysctl) later on.
* So there is no point trying to lock out such changes here.
*
* If we assume that rlim_cur/max are accessed using atomic
* operations, we don't need to lock against any other updates
* that might happen if the plimit structure is shared writable
* between multiple processes.
*/
/* Scan to determine is any limits are out of range */
lim = p->p_limit;
for (i = 0; ; i++) {
if (i >= __arraycount(lm))
/* All in range */
return;
rlim = lim->pl_rlimit + lm[i].id;
if (LIMITCHECK(rlim->rlim_cur, lm[i].lim))
break;
if (LIMITCHECK(rlim->rlim_max, lm[i].lim))
break;
}
lim_privatise(p, false);
lim = p->p_limit;
for (i = 0; i < __arraycount(lm); i++) {
rlim = lim->pl_rlimit + lm[i].id;
if (LIMITCHECK(rlim->rlim_cur, lm[i].lim))
rlim->rlim_cur = lm[i].lim;
if (LIMITCHECK(rlim->rlim_max, lm[i].lim))
rlim->rlim_max = lm[i].lim;
}
}
int
netbsd32_uuidgen(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_uuidgen_args /* {
syscallarg(netbsd32_uuidp_t) store;
syscallarg(int) count;
} */ *uap = v;
struct sys_uuidgen_args ua;
NETBSD32TOP_UAP(store, struct uuid);
NETBSD32TO64_UAP(count);
return (sys_uuidgen(l, &ua, retval));
}
int
netbsd32_extattrctl(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattrctl_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) cmd;
syscallarg(const netbsd32_charp) filename;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
} */ *uap = v;
struct sys_extattrctl_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(cmd);
NETBSD32TOP_UAP(filename, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
return sys_extattrctl(l, &ua, retval);
}
int
netbsd32_extattr_set_fd(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_set_fd_args /* {
syscallarg(int) fd;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
syscallarg(const netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_set_fd_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
NETBSD32TOP_UAP(data, const void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_set_fd(l, &ua, retval);
}
int
netbsd32_extattr_set_file(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_set_file_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
syscallarg(const netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_set_file_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
NETBSD32TOP_UAP(data, const void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_set_file(l, &ua, retval);
}
int
netbsd32_extattr_set_link(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_set_link_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
syscallarg(const netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_set_link_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
NETBSD32TOP_UAP(data, const void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_set_link(l, &ua, retval);
}
int
netbsd32_extattr_get_fd(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_get_fd_args /* {
syscallarg(int) fd;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
syscallarg(netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_get_fd_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
NETBSD32TOP_UAP(data, void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_get_fd(l, &ua, retval);
}
int
netbsd32_extattr_get_file(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_get_file_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
syscallarg(netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_get_file_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
NETBSD32TOP_UAP(data, void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_get_file(l, &ua, retval);
}
int
netbsd32_extattr_get_link(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_get_link_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
syscallarg(netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_get_link_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
NETBSD32TOP_UAP(data, void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_get_link(l, &ua, retval);
}
int
netbsd32_extattr_delete_fd(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_delete_fd_args /* {
syscallarg(int) fd;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
} */ *uap = v;
struct sys_extattr_delete_fd_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
return sys_extattr_delete_fd(l, &ua, retval);
}
int
netbsd32_extattr_delete_file(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_delete_file_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
} */ *uap = v;
struct sys_extattr_delete_file_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
return sys_extattr_delete_file(l, &ua, retval);
}
int
netbsd32_extattr_delete_link(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_delete_link_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(const netbsd32_charp) attrname;
} */ *uap = v;
struct sys_extattr_delete_link_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(attrname, const char);
return sys_extattr_delete_link(l, &ua, retval);
}
int
netbsd32_extattr_list_fd(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_list_fd_args /* {
syscallarg(int) fd;
syscallarg(int) attrnamespace;
syscallarg(netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_list_fd_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(data, void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_list_fd(l, &ua, retval);
}
int
netbsd32_extattr_list_file(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_list_file_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_list_file_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(data, void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_list_file(l, &ua, retval);
}
int
netbsd32_extattr_list_link(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_extattr_list_link_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(int) attrnamespace;
syscallarg(netbsd32_voidp) data;
syscallarg(netbsd32_size_t) nbytes;
} */ *uap = v;
struct sys_extattr_list_link_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(attrnamespace);
NETBSD32TOP_UAP(data, void);
NETBSD32TOX_UAP(nbytes, size_t);
return sys_extattr_list_link(l, &ua, retval);
}
int
netbsd32_mlockall(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_mlockall_args /* {
syscallarg(int) flags;
} */ *uap = v;
struct sys_mlockall_args ua;
NETBSD32TO64_UAP(flags);
return (sys_mlockall(l, &ua, retval));
}
int
netbsd32___clone(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32___clone_args /* {
syscallarg(int) flags;
syscallarg(netbsd32_voidp) stack;
} */ *uap = v;
struct sys___clone_args ua;
NETBSD32TO64_UAP(flags);
NETBSD32TOP_UAP(stack, void);
return sys___clone(l, &ua, retval);
}
int
netbsd32_fsync_range(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fsync_range_args /* {
syscallarg(int) fd;
syscallarg(int) flags;
syscallarg(off_t) start;
syscallarg(off_t) length;
} */ *uap = v;
struct sys_fsync_range_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TO64_UAP(flags);
NETBSD32TO64_UAP(start);
NETBSD32TO64_UAP(length);
return (sys_fsync_range(l, &ua, retval));
}
int
netbsd32_rasctl(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_rasctl_args /* {
syscallarg(netbsd32_caddr_t) addr;
syscallarg(netbsd32_size_t) len;
syscallarg(int) op;
} */ *uap = v;
struct sys_rasctl_args ua;
NETBSD32TOP_UAP(addr, void *);
NETBSD32TOX_UAP(len, size_t);
NETBSD32TO64_UAP(op);
return sys_rasctl(l, &ua, retval);
}
int
netbsd32_setxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_setxattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) name;
syscallarg(netbsd32_voidp) value;
syscallarg(netbsd32_size_t) size;
syscallarg(int) flags;
} */ *uap = v;
struct sys_setxattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(name, const char);
NETBSD32TOP_UAP(value, void);
NETBSD32TOX_UAP(size, size_t);
NETBSD32TO64_UAP(flags);
return sys_setxattr(l, &ua, retval);
}
int
netbsd32_lsetxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lsetxattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) name;
syscallarg(netbsd32_voidp) value;
syscallarg(netbsd32_size_t) size;
syscallarg(int) flags;
} */ *uap = v;
struct sys_lsetxattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(name, const char);
NETBSD32TOP_UAP(value, void);
NETBSD32TOX_UAP(size, size_t);
NETBSD32TO64_UAP(flags);
return sys_lsetxattr(l, &ua, retval);
}
int
netbsd32_fsetxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fsetxattr_args /* {
syscallarg(int) fd;
syscallarg(const netbsd32_charp) name;
syscallarg(netbsd32_voidp) value;
syscallarg(netbsd32_size_t) size;
syscallarg(int) flags;
} */ *uap = v;
struct sys_fsetxattr_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(name, const char);
NETBSD32TOP_UAP(value, void);
NETBSD32TOX_UAP(size, size_t);
NETBSD32TO64_UAP(flags);
return sys_fsetxattr(l, &ua, retval);
}
int
netbsd32_getxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_getxattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) name;
syscallarg(netbsd32_voidp) value;
syscallarg(netbsd32_size_t) size;
} */ *uap = v;
struct sys_getxattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(name, const char);
NETBSD32TOP_UAP(value, void);
NETBSD32TOX_UAP(size, size_t);
return sys_getxattr(l, &ua, retval);
}
int
netbsd32_lgetxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lgetxattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) name;
syscallarg(netbsd32_voidp) value;
syscallarg(netbsd32_size_t) size;
} */ *uap = v;
struct sys_lgetxattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(name, const char);
NETBSD32TOP_UAP(value, void);
NETBSD32TOX_UAP(size, size_t);
return sys_lgetxattr(l, &ua, retval);
}
int
netbsd32_fgetxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fgetxattr_args /* {
syscallarg(int) fd;
syscallarg(const netbsd32_charp) name;
syscallarg(netbsd32_voidp) value;
syscallarg(netbsd32_size_t) size;
} */ *uap = v;
struct sys_fgetxattr_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(name, const char);
NETBSD32TOP_UAP(value, void);
NETBSD32TOX_UAP(size, size_t);
return sys_fgetxattr(l, &ua, retval);
}
int
netbsd32_listxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_listxattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(netbsd32_charp) list;
syscallarg(netbsd32_size_t) size;
} */ *uap = v;
struct sys_listxattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(list, char);
NETBSD32TOX_UAP(size, size_t);
return sys_listxattr(l, &ua, retval);
}
int
netbsd32_llistxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_llistxattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(netbsd32_charp) list;
syscallarg(netbsd32_size_t) size;
} */ *uap = v;
struct sys_llistxattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(list, char);
NETBSD32TOX_UAP(size, size_t);
return sys_llistxattr(l, &ua, retval);
}
int
netbsd32_flistxattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_flistxattr_args /* {
syscallarg(int) fd;
syscallarg(netbsd32_charp) list;
syscallarg(netbsd32_size_t) size;
} */ *uap = v;
struct sys_flistxattr_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(list, char);
NETBSD32TOX_UAP(size, size_t);
return sys_flistxattr(l, &ua, retval);
}
int
netbsd32_removexattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_removexattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) name;
} */ *uap = v;
struct sys_removexattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(name, const char);
return sys_removexattr(l, &ua, retval);
}
int
netbsd32_lremovexattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_lremovexattr_args /* {
syscallarg(const netbsd32_charp) path;
syscallarg(const netbsd32_charp) name;
} */ *uap = v;
struct sys_lremovexattr_args ua;
NETBSD32TOP_UAP(path, const char);
NETBSD32TOP_UAP(name, const char);
return sys_lremovexattr(l, &ua, retval);
}
int
netbsd32_fremovexattr(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_fremovexattr_args /* {
syscallarg(int) fd;
syscallarg(const netbsd32_charp) name;
} */ *uap = v;
struct sys_fremovexattr_args ua;
NETBSD32TO64_UAP(fd);
NETBSD32TOP_UAP(name, const char);
return sys_fremovexattr(l, &ua, retval);
}
/*
* MI indirect system call support.
* Only used if the MD netbsd32_syscall.c doesn't intercept the calls.
*/
#define NETBSD32_SYSCALL
#undef SYS_NSYSENT
#define SYS_NSYSENT NETBSD32_SYS_NSYSENT
#define SYS_SYSCALL netbsd32_sys_syscall
#include "../../kern/sys_syscall.c"
#undef SYS_SYSCALL
#define SYS_SYSCALL netbsd32_sys___syscall
#include "../../kern/sys_syscall.c"
#undef SYS_SYSCALL