Home | History | Annotate | Line # | Download | only in netbsd32
netbsd32_compat_50.c revision 1.24.2.1.6.1
      1  1.24.2.1.6.1    martin /*	$NetBSD: netbsd32_compat_50.c,v 1.24.2.1.6.1 2020/01/21 19:23:37 martin Exp $	*/
      2           1.2  christos 
      3           1.2  christos /*-
      4           1.2  christos  * Copyright (c) 2008 The NetBSD Foundation, Inc.
      5           1.2  christos  * All rights reserved.
      6           1.2  christos  *
      7           1.2  christos  * This code is derived from software contributed to The NetBSD Foundation
      8           1.2  christos  * by Christos Zoulas.
      9           1.2  christos  *
     10           1.2  christos  * Redistribution and use in source and binary forms, with or without
     11           1.2  christos  * modification, are permitted provided that the following conditions
     12           1.2  christos  * are met:
     13           1.2  christos  * 1. Redistributions of source code must retain the above copyright
     14           1.2  christos  *    notice, this list of conditions and the following disclaimer.
     15           1.2  christos  * 2. Redistributions in binary form must reproduce the above copyright
     16           1.2  christos  *    notice, this list of conditions and the following disclaimer in the
     17           1.2  christos  *    documentation and/or other materials provided with the distribution.
     18           1.2  christos  * 3. All advertising materials mentioning features or use of this software
     19           1.2  christos  *    must display the following acknowledgement:
     20           1.2  christos  *        This product includes software developed by the NetBSD
     21           1.2  christos  *        Foundation, Inc. and its contributors.
     22           1.2  christos  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23           1.2  christos  *    contributors may be used to endorse or promote products derived
     24           1.2  christos  *    from this software without specific prior written permission.
     25           1.2  christos  *
     26           1.2  christos  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27           1.2  christos  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28           1.2  christos  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29           1.2  christos  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30           1.2  christos  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31           1.2  christos  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32           1.2  christos  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33           1.2  christos  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34           1.2  christos  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35           1.2  christos  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36           1.2  christos  * POSSIBILITY OF SUCH DAMAGE.
     37           1.2  christos  */
     38           1.2  christos #include <sys/cdefs.h>
     39  1.24.2.1.6.1    martin __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50.c,v 1.24.2.1.6.1 2020/01/21 19:23:37 martin Exp $");
     40           1.2  christos 
     41           1.2  christos #if defined(_KERNEL_OPT)
     42           1.2  christos #include "opt_sysv.h"
     43           1.8     njoly #endif
     44           1.2  christos 
     45           1.2  christos #include <sys/param.h>
     46           1.2  christos #include <sys/systm.h>
     47           1.2  christos #include <sys/mount.h>
     48           1.2  christos #include <sys/socket.h>
     49           1.2  christos #include <sys/socketvar.h>
     50           1.2  christos #include <sys/stat.h>
     51           1.2  christos #include <sys/time.h>
     52           1.2  christos #include <sys/ktrace.h>
     53           1.2  christos #include <sys/eventvar.h>
     54           1.2  christos #include <sys/resourcevar.h>
     55           1.2  christos #include <sys/vnode.h>
     56           1.2  christos #include <sys/file.h>
     57           1.2  christos #include <sys/filedesc.h>
     58           1.2  christos #include <sys/poll.h>
     59           1.2  christos #include <sys/namei.h>
     60           1.2  christos #include <sys/statvfs.h>
     61           1.2  christos #include <sys/syscallargs.h>
     62           1.2  christos #include <sys/proc.h>
     63           1.2  christos #include <sys/dirent.h>
     64           1.2  christos #include <sys/kauth.h>
     65           1.2  christos #include <sys/vfs_syscalls.h>
     66           1.2  christos #include <sys/ipc.h>
     67           1.2  christos #include <sys/msg.h>
     68           1.2  christos #include <sys/sem.h>
     69           1.2  christos #include <sys/shm.h>
     70           1.2  christos 
     71           1.2  christos #include <compat/netbsd32/netbsd32.h>
     72           1.2  christos #include <compat/netbsd32/netbsd32_syscallargs.h>
     73           1.2  christos #include <compat/netbsd32/netbsd32_conv.h>
     74           1.2  christos #include <compat/sys/mount.h>
     75           1.2  christos #include <compat/sys/time.h>
     76           1.2  christos 
     77           1.2  christos 
     78           1.2  christos /*
     79           1.2  christos  * Common routine to set access and modification times given a vnode.
     80           1.2  christos  */
     81           1.2  christos static int
     82           1.2  christos get_utimes32(const netbsd32_timeval50p_t *tptr, struct timeval *tv,
     83           1.2  christos     struct timeval **tvp)
     84           1.2  christos {
     85           1.2  christos 	int error;
     86           1.2  christos 	struct netbsd32_timeval50 tv32[2];
     87           1.2  christos 
     88           1.2  christos 	if (tptr == NULL) {
     89           1.2  christos 		*tvp = NULL;
     90           1.2  christos 		return 0;
     91           1.2  christos 	}
     92           1.2  christos 
     93           1.2  christos 	error = copyin(tptr, tv32, sizeof(tv32));
     94           1.2  christos 	if (error)
     95           1.2  christos 		return error;
     96           1.2  christos 	netbsd32_to_timeval50(&tv32[0], &tv[0]);
     97           1.2  christos 	netbsd32_to_timeval50(&tv32[1], &tv[1]);
     98           1.2  christos 
     99           1.2  christos 	*tvp = tv;
    100           1.2  christos 	return 0;
    101           1.2  christos }
    102           1.2  christos 
    103           1.2  christos int
    104           1.2  christos compat_50_netbsd32_mknod(struct lwp *l,
    105           1.2  christos     const struct compat_50_netbsd32_mknod_args *uap, register_t *retval)
    106           1.2  christos {
    107           1.2  christos 	/* {
    108           1.2  christos 		syscallarg(netbsd32_charp) path;
    109           1.2  christos 		syscallarg(mode_t) mode;
    110           1.2  christos 		syscallarg(uint32_t) dev;
    111           1.2  christos 	} */
    112           1.2  christos 	return do_sys_mknod(l, SCARG_P32(uap, path), SCARG(uap, mode),
    113           1.5      haad 	    SCARG(uap, dev), retval, UIO_USERSPACE);
    114           1.2  christos }
    115           1.2  christos 
    116           1.2  christos int
    117           1.2  christos compat_50_netbsd32_select(struct lwp *l,
    118           1.2  christos     const struct compat_50_netbsd32_select_args *uap, register_t *retval)
    119           1.2  christos {
    120           1.2  christos 	/* {
    121           1.2  christos 		syscallarg(int) nd;
    122           1.2  christos 		syscallarg(netbsd32_fd_setp_t) in;
    123           1.2  christos 		syscallarg(netbsd32_fd_setp_t) ou;
    124           1.2  christos 		syscallarg(netbsd32_fd_setp_t) ex;
    125           1.2  christos 		syscallarg(netbsd32_timeval50p_t) tv;
    126           1.2  christos 	} */
    127           1.2  christos 	int error;
    128           1.2  christos 	struct netbsd32_timeval50 tv32;
    129           1.4  christos 	struct timespec ats, *ts = NULL;
    130           1.2  christos 
    131           1.2  christos 	if (SCARG_P32(uap, tv)) {
    132           1.2  christos 		error = copyin(SCARG_P32(uap, tv), &tv32, sizeof(tv32));
    133           1.2  christos 		if (error != 0)
    134           1.2  christos 			return error;
    135           1.4  christos 		ats.tv_sec = tv32.tv_sec;
    136           1.4  christos 		ats.tv_nsec = tv32.tv_usec * 1000;
    137           1.4  christos 		ts = &ats;
    138           1.2  christos 	}
    139           1.2  christos 
    140           1.7     rmind 	return selcommon(retval, SCARG(uap, nd), SCARG_P32(uap, in),
    141           1.4  christos 	    SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, NULL);
    142           1.2  christos 	return 0;
    143           1.2  christos }
    144           1.2  christos 
    145           1.2  christos int
    146           1.2  christos compat_50_netbsd32_gettimeofday(struct lwp *l,
    147           1.2  christos     const struct compat_50_netbsd32_gettimeofday_args *uap, register_t *retval)
    148           1.2  christos {
    149           1.2  christos 	/* {
    150           1.2  christos 		syscallarg(netbsd32_timeval50p_t) tp;
    151           1.2  christos 		syscallarg(netbsd32_timezonep_t) tzp;
    152           1.2  christos 	} */
    153           1.2  christos 	struct timeval atv;
    154           1.2  christos 	struct netbsd32_timeval50 tv32;
    155           1.2  christos 	int error = 0;
    156           1.2  christos 	struct netbsd32_timezone tzfake;
    157           1.2  christos 
    158           1.2  christos 	if (SCARG_P32(uap, tp)) {
    159           1.2  christos 		microtime(&atv);
    160           1.2  christos 		netbsd32_from_timeval50(&atv, &tv32);
    161           1.2  christos 		error = copyout(&tv32, SCARG_P32(uap, tp), sizeof(tv32));
    162           1.2  christos 		if (error)
    163           1.2  christos 			return error;
    164           1.2  christos 	}
    165           1.2  christos 	if (SCARG_P32(uap, tzp)) {
    166           1.2  christos 		/*
    167           1.2  christos 		 * NetBSD has no kernel notion of time zone, so we just
    168           1.2  christos 		 * fake up a timezone struct and return it if demanded.
    169           1.2  christos 		 */
    170           1.2  christos 		tzfake.tz_minuteswest = 0;
    171           1.2  christos 		tzfake.tz_dsttime = 0;
    172           1.2  christos 		error = copyout(&tzfake, SCARG_P32(uap, tzp), sizeof(tzfake));
    173           1.2  christos 	}
    174           1.2  christos 	return error;
    175           1.2  christos }
    176           1.2  christos 
    177           1.2  christos int
    178           1.2  christos compat_50_netbsd32_settimeofday(struct lwp *l,
    179           1.2  christos     const struct compat_50_netbsd32_settimeofday_args *uap, register_t *retval)
    180           1.2  christos {
    181           1.2  christos 	/* {
    182           1.2  christos 		syscallarg(const netbsd32_timeval50p_t) tv;
    183           1.2  christos 		syscallarg(const netbsd32_timezonep_t) tzp;
    184           1.2  christos 	} */
    185           1.2  christos 	struct netbsd32_timeval50 atv32;
    186           1.2  christos 	struct timeval atv;
    187           1.2  christos 	struct timespec ats;
    188           1.2  christos 	int error;
    189           1.2  christos 	struct proc *p = l->l_proc;
    190           1.2  christos 
    191           1.2  christos 	/* Verify all parameters before changing time. */
    192           1.2  christos 
    193           1.2  christos 	/*
    194           1.2  christos 	 * NetBSD has no kernel notion of time zone, and only an
    195           1.2  christos 	 * obsolete program would try to set it, so we log a warning.
    196           1.2  christos 	 */
    197           1.2  christos 	if (SCARG_P32(uap, tzp))
    198           1.2  christos 		printf("pid %d attempted to set the "
    199           1.2  christos 		    "(obsolete) kernel time zone\n", p->p_pid);
    200           1.2  christos 
    201           1.2  christos 	if (SCARG_P32(uap, tv) == 0)
    202           1.2  christos 		return 0;
    203           1.2  christos 
    204           1.2  christos 	if ((error = copyin(SCARG_P32(uap, tv), &atv32, sizeof(atv32))) != 0)
    205           1.2  christos 		return error;
    206           1.2  christos 
    207           1.2  christos 	netbsd32_to_timeval50(&atv32, &atv);
    208           1.2  christos 	TIMEVAL_TO_TIMESPEC(&atv, &ats);
    209           1.2  christos 	return settime(p, &ats);
    210           1.2  christos }
    211           1.2  christos 
    212           1.2  christos int
    213           1.2  christos compat_50_netbsd32_utimes(struct lwp *l,
    214           1.2  christos     const struct compat_50_netbsd32_utimes_args *uap, register_t *retval)
    215           1.2  christos {
    216           1.2  christos 	/* {
    217           1.2  christos 		syscallarg(const netbsd32_charp) path;
    218           1.2  christos 		syscallarg(const netbsd32_timeval50p_t) tptr;
    219           1.2  christos 	} */
    220           1.2  christos 	int error;
    221           1.2  christos 	struct timeval tv[2], *tvp;
    222           1.2  christos 
    223           1.2  christos 	error = get_utimes32(SCARG_P32(uap, tptr), tv, &tvp);
    224           1.2  christos 	if (error != 0)
    225           1.2  christos 		return error;
    226           1.2  christos 
    227           1.2  christos 	return do_sys_utimes(l, NULL, SCARG_P32(uap, path), FOLLOW,
    228           1.2  christos 	    tvp, UIO_SYSSPACE);
    229           1.2  christos }
    230           1.2  christos 
    231           1.2  christos int
    232           1.2  christos compat_50_netbsd32_adjtime(struct lwp *l,
    233           1.2  christos     const struct compat_50_netbsd32_adjtime_args *uap, register_t *retval)
    234           1.2  christos {
    235           1.2  christos 	/* {
    236           1.2  christos 		syscallarg(const netbsd32_timeval50p_t) delta;
    237           1.2  christos 		syscallarg(netbsd32_timeval50p_t) olddelta;
    238           1.2  christos 	} */
    239           1.2  christos 	struct netbsd32_timeval50 atv;
    240           1.2  christos 	int error;
    241           1.2  christos 
    242           1.2  christos 	extern int time_adjusted;     /* in kern_ntptime.c */
    243           1.2  christos 	extern int64_t time_adjtime;  /* in kern_ntptime.c */
    244           1.2  christos 
    245           1.2  christos 	if ((error = kauth_authorize_system(l->l_cred,
    246           1.2  christos 	    KAUTH_SYSTEM_TIME, KAUTH_REQ_SYSTEM_TIME_ADJTIME, NULL, NULL,
    247           1.2  christos 	    NULL)) != 0)
    248           1.2  christos 		return (error);
    249           1.2  christos 
    250           1.2  christos 	if (SCARG_P32(uap, olddelta)) {
    251      1.24.2.1    martin 		mutex_spin_enter(&timecounter_lock);
    252           1.2  christos 		atv.tv_sec = time_adjtime / 1000000;
    253           1.2  christos 		atv.tv_usec = time_adjtime % 1000000;
    254           1.2  christos 		if (atv.tv_usec < 0) {
    255           1.2  christos 			atv.tv_usec += 1000000;
    256           1.2  christos 			atv.tv_sec--;
    257           1.2  christos 		}
    258      1.24.2.1    martin 		mutex_spin_exit(&timecounter_lock);
    259      1.24.2.1    martin 
    260      1.24.2.1    martin 		error = copyout(&atv, SCARG_P32(uap, olddelta), sizeof(atv));
    261           1.2  christos 		if (error)
    262           1.2  christos 			return (error);
    263           1.2  christos 	}
    264           1.2  christos 
    265           1.2  christos 	if (SCARG_P32(uap, delta)) {
    266      1.24.2.1    martin 		error = copyin(SCARG_P32(uap, delta), &atv, sizeof(atv));
    267           1.2  christos 		if (error)
    268           1.2  christos 			return (error);
    269           1.2  christos 
    270      1.24.2.1    martin 		mutex_spin_enter(&timecounter_lock);
    271           1.2  christos 		time_adjtime = (int64_t)atv.tv_sec * 1000000 + atv.tv_usec;
    272           1.2  christos 		if (time_adjtime)
    273           1.2  christos 			/* We need to save the system time during shutdown */
    274           1.2  christos 			time_adjusted |= 1;
    275      1.24.2.1    martin 		mutex_spin_exit(&timecounter_lock);
    276           1.2  christos 	}
    277           1.2  christos 
    278           1.2  christos 	return 0;
    279           1.2  christos }
    280           1.2  christos 
    281           1.2  christos int
    282           1.2  christos compat_50_netbsd32_futimes(struct lwp *l,
    283           1.2  christos     const struct compat_50_netbsd32_futimes_args *uap, register_t *retval)
    284           1.2  christos {
    285           1.2  christos 	/* {
    286           1.2  christos 		syscallarg(int) fd;
    287           1.2  christos 		syscallarg(const netbsd32_timeval50p_t) tptr;
    288           1.2  christos 	} */
    289           1.2  christos 	int error;
    290           1.2  christos 	file_t *fp;
    291           1.2  christos 	struct timeval tv[2], *tvp;
    292           1.2  christos 
    293           1.2  christos 	error = get_utimes32(SCARG_P32(uap, tptr), tv, &tvp);
    294           1.2  christos 	if (error != 0)
    295           1.2  christos 		return error;
    296           1.2  christos 
    297           1.2  christos 	/* fd_getvnode() will use the descriptor for us */
    298           1.2  christos 	if ((error = fd_getvnode(SCARG(uap, fd), &fp)) != 0)
    299           1.2  christos 		return error;
    300           1.2  christos 
    301           1.2  christos 	error = do_sys_utimes(l, fp->f_data, NULL, 0, tvp, UIO_SYSSPACE);
    302           1.2  christos 
    303           1.2  christos 	fd_putfile(SCARG(uap, fd));
    304           1.2  christos 	return error;
    305           1.2  christos }
    306           1.2  christos 
    307           1.2  christos int
    308           1.2  christos compat_50_netbsd32_clock_gettime(struct lwp *l,
    309           1.2  christos     const struct compat_50_netbsd32_clock_gettime_args *uap, register_t *retval)
    310           1.2  christos {
    311           1.2  christos 	/* {
    312           1.2  christos 		syscallarg(netbsd32_clockid_t) clock_id;
    313           1.2  christos 		syscallarg(netbsd32_timespec50p_t) tp;
    314           1.2  christos 	} */
    315          1.15     njoly 	int error;
    316           1.2  christos 	struct timespec ats;
    317           1.2  christos 	struct netbsd32_timespec50 ts32;
    318           1.2  christos 
    319          1.15     njoly 	error = clock_gettime1(SCARG(uap, clock_id), &ats);
    320          1.15     njoly 	if (error != 0)
    321          1.15     njoly 		return error;
    322           1.2  christos 
    323           1.2  christos 	netbsd32_from_timespec50(&ats, &ts32);
    324           1.2  christos 	return copyout(&ts32, SCARG_P32(uap, tp), sizeof(ts32));
    325           1.2  christos }
    326           1.2  christos 
    327           1.2  christos int
    328           1.2  christos compat_50_netbsd32_clock_settime(struct lwp *l,
    329           1.2  christos     const struct compat_50_netbsd32_clock_settime_args *uap, register_t *retval)
    330           1.2  christos {
    331           1.2  christos 	/* {
    332           1.2  christos 		syscallarg(netbsd32_clockid_t) clock_id;
    333           1.2  christos 		syscallarg(const netbsd32_timespec50p_t) tp;
    334           1.2  christos 	} */
    335           1.2  christos 	struct netbsd32_timespec50 ts32;
    336           1.2  christos 	struct timespec ats;
    337           1.2  christos 	int error;
    338           1.2  christos 
    339           1.2  christos 	if ((error = copyin(SCARG_P32(uap, tp), &ts32, sizeof(ts32))) != 0)
    340           1.2  christos 		return (error);
    341           1.2  christos 
    342           1.2  christos 	netbsd32_to_timespec50(&ts32, &ats);
    343          1.13     njoly 	return clock_settime1(l->l_proc, SCARG(uap, clock_id), &ats, true);
    344           1.2  christos }
    345           1.2  christos 
    346           1.2  christos int
    347           1.2  christos compat_50_netbsd32_clock_getres(struct lwp *l,
    348           1.2  christos     const struct compat_50_netbsd32_clock_getres_args *uap, register_t *retval)
    349           1.2  christos {
    350           1.2  christos 	/* {
    351           1.2  christos 		syscallarg(netbsd32_clockid_t) clock_id;
    352           1.2  christos 		syscallarg(netbsd32_timespec50p_t) tp;
    353           1.2  christos 	} */
    354           1.2  christos 	struct netbsd32_timespec50 ts32;
    355           1.2  christos 	struct timespec ts;
    356           1.2  christos 	int error = 0;
    357           1.2  christos 
    358          1.14     njoly 	error = clock_getres1(SCARG(uap, clock_id), &ts);
    359          1.14     njoly 	if (error != 0)
    360          1.14     njoly 		return error;
    361           1.2  christos 
    362           1.2  christos 	if (SCARG_P32(uap, tp)) {
    363           1.2  christos 		netbsd32_from_timespec50(&ts, &ts32);
    364          1.12     njoly 		error = copyout(&ts32, SCARG_P32(uap, tp), sizeof(ts32));
    365           1.2  christos 	}
    366           1.2  christos 
    367           1.2  christos 	return error;
    368           1.2  christos }
    369           1.2  christos 
    370           1.2  christos int
    371           1.2  christos compat_50_netbsd32_timer_settime(struct lwp *l,
    372           1.2  christos     const struct compat_50_netbsd32_timer_settime_args *uap, register_t *retval)
    373           1.2  christos {
    374           1.2  christos 	/* {
    375           1.2  christos 		syscallarg(netbsd32_timer_t) timerid;
    376           1.2  christos 		syscallarg(int) flags;
    377           1.2  christos 		syscallarg(const netbsd32_itimerspec50p_t) value;
    378           1.2  christos 		syscallarg(netbsd32_itimerspec50p_t) ovalue;
    379           1.2  christos 	} */
    380           1.2  christos 	int error;
    381           1.2  christos 	struct itimerspec value, ovalue, *ovp = NULL;
    382           1.2  christos 	struct netbsd32_itimerspec50 its32;
    383           1.2  christos 
    384           1.2  christos 	if ((error = copyin(SCARG_P32(uap, value), &its32, sizeof(its32))) != 0)
    385           1.2  christos 		return (error);
    386           1.2  christos 	netbsd32_to_timespec50(&its32.it_interval, &value.it_interval);
    387           1.2  christos 	netbsd32_to_timespec50(&its32.it_value, &value.it_value);
    388           1.2  christos 
    389           1.2  christos 	if (SCARG_P32(uap, ovalue))
    390           1.2  christos 		ovp = &ovalue;
    391           1.2  christos 
    392           1.2  christos 	if ((error = dotimer_settime(SCARG(uap, timerid), &value, ovp,
    393           1.2  christos 	    SCARG(uap, flags), l->l_proc)) != 0)
    394           1.2  christos 		return error;
    395           1.2  christos 
    396           1.2  christos 	if (ovp) {
    397           1.2  christos 		netbsd32_from_timespec50(&ovp->it_interval, &its32.it_interval);
    398           1.2  christos 		netbsd32_from_timespec50(&ovp->it_value, &its32.it_value);
    399           1.2  christos 		return copyout(&its32, SCARG_P32(uap, ovalue), sizeof(its32));
    400           1.2  christos 	}
    401           1.2  christos 	return 0;
    402           1.2  christos }
    403           1.2  christos 
    404           1.2  christos int
    405           1.2  christos compat_50_netbsd32_timer_gettime(struct lwp *l, const struct compat_50_netbsd32_timer_gettime_args *uap, register_t *retval)
    406           1.2  christos {
    407           1.2  christos 	/* {
    408           1.2  christos 		syscallarg(netbsd32_timer_t) timerid;
    409           1.2  christos 		syscallarg(netbsd32_itimerspec50p_t) value;
    410           1.2  christos 	} */
    411           1.2  christos 	int error;
    412           1.2  christos 	struct itimerspec its;
    413           1.2  christos 	struct netbsd32_itimerspec50 its32;
    414           1.2  christos 
    415           1.2  christos 	if ((error = dotimer_gettime(SCARG(uap, timerid), l->l_proc,
    416           1.2  christos 	    &its)) != 0)
    417           1.2  christos 		return error;
    418           1.2  christos 
    419           1.2  christos 	netbsd32_from_timespec50(&its.it_interval, &its32.it_interval);
    420           1.2  christos 	netbsd32_from_timespec50(&its.it_value, &its32.it_value);
    421           1.2  christos 
    422           1.2  christos 	return copyout(&its32, SCARG_P32(uap, value), sizeof(its32));
    423           1.2  christos }
    424           1.2  christos 
    425           1.2  christos int
    426           1.2  christos compat_50_netbsd32_nanosleep(struct lwp *l,
    427           1.2  christos     const struct compat_50_netbsd32_nanosleep_args *uap, register_t *retval)
    428           1.2  christos {
    429           1.2  christos 	/* {
    430           1.2  christos 		syscallarg(const netbsd32_timespec50p_t) rqtp;
    431           1.2  christos 		syscallarg(netbsd32_timespecp_t) rmtp;
    432           1.2  christos 	} */
    433           1.2  christos 	struct netbsd32_timespec50 ts32;
    434          1.11     njoly 	struct timespec rqt, rmt;
    435          1.11     njoly 	int error, error1;
    436           1.2  christos 
    437           1.2  christos 	error = copyin(SCARG_P32(uap, rqtp), &ts32, sizeof(ts32));
    438           1.2  christos 	if (error)
    439           1.2  christos 		return (error);
    440           1.2  christos 	netbsd32_to_timespec50(&ts32, &rqt);
    441           1.2  christos 
    442          1.21  christos 	error = nanosleep1(l, CLOCK_MONOTONIC, 0, &rqt,
    443          1.21  christos 	    SCARG_P32(uap, rmtp) ? &rmt : NULL);
    444          1.11     njoly 	if (SCARG_P32(uap, rmtp) == NULL || (error != 0 && error != EINTR))
    445          1.11     njoly 		return error;
    446           1.2  christos 
    447          1.11     njoly 	netbsd32_from_timespec50(&rmt, &ts32);
    448          1.11     njoly 	error1 = copyout(&ts32, SCARG_P32(uap,rmtp), sizeof(ts32));
    449          1.11     njoly 	return error1 ? error1 : error;
    450           1.2  christos }
    451           1.2  christos 
    452           1.2  christos static int
    453           1.2  christos compat_50_netbsd32_sigtimedwait_put_info(const void *src, void *dst, size_t size)
    454           1.2  christos {
    455           1.2  christos 	const siginfo_t *info = src;
    456           1.2  christos 	siginfo32_t info32;
    457           1.2  christos 
    458           1.2  christos 	netbsd32_si_to_si32(&info32, info);
    459           1.2  christos 
    460           1.2  christos 	return copyout(&info32, dst, sizeof(info32));
    461           1.2  christos }
    462           1.2  christos 
    463           1.2  christos static int
    464           1.2  christos compat_50_netbsd32_sigtimedwait_fetch_timeout(const void *src, void *dst, size_t size)
    465           1.2  christos {
    466           1.2  christos 	struct timespec *ts = dst;
    467           1.2  christos 	struct netbsd32_timespec50 ts32;
    468           1.2  christos 	int error;
    469           1.2  christos 
    470           1.2  christos 	error = copyin(src, &ts32, sizeof(ts32));
    471           1.2  christos 	if (error)
    472           1.2  christos 		return error;
    473           1.2  christos 
    474           1.2  christos 	netbsd32_to_timespec50(&ts32, ts);
    475           1.2  christos 	return 0;
    476           1.2  christos }
    477           1.2  christos 
    478           1.2  christos static int
    479           1.2  christos compat_50_netbsd32_sigtimedwait_put_timeout(const void *src, void *dst, size_t size)
    480           1.2  christos {
    481           1.2  christos 	const struct timespec *ts = src;
    482           1.2  christos 	struct netbsd32_timespec50 ts32;
    483           1.2  christos 
    484           1.2  christos 	netbsd32_from_timespec50(ts, &ts32);
    485           1.2  christos 
    486           1.2  christos 	return copyout(&ts32, dst, sizeof(ts32));
    487           1.2  christos }
    488           1.2  christos 
    489           1.2  christos int
    490           1.2  christos compat_50_netbsd32___sigtimedwait(struct lwp *l,
    491           1.2  christos     const struct compat_50_netbsd32___sigtimedwait_args *uap, register_t *retval)
    492           1.2  christos {
    493           1.2  christos 	/* {
    494           1.2  christos 		syscallarg(netbsd32_sigsetp_t) set;
    495           1.2  christos 		syscallarg(netbsd32_siginfop_t) info;
    496           1.2  christos 		syscallarg(netbsd32_timespec50p_t) timeout;
    497           1.2  christos 	} */
    498           1.2  christos 	struct sys_____sigtimedwait50_args ua;
    499          1.17  drochner 	int res;
    500           1.2  christos 
    501           1.2  christos 	NETBSD32TOP_UAP(set, const sigset_t);
    502           1.2  christos 	NETBSD32TOP_UAP(info, siginfo_t);
    503           1.2  christos 	NETBSD32TOP_UAP(timeout, struct timespec);
    504           1.2  christos 
    505          1.17  drochner 	res = sigtimedwait1(l, &ua, retval,
    506          1.20  christos 	    copyin,
    507           1.2  christos 	    compat_50_netbsd32_sigtimedwait_put_info,
    508           1.2  christos 	    compat_50_netbsd32_sigtimedwait_fetch_timeout,
    509           1.2  christos 	    compat_50_netbsd32_sigtimedwait_put_timeout);
    510          1.17  drochner 	if (!res)
    511          1.17  drochner 		*retval = 0; /* XXX NetBSD<=5 was not POSIX compliant */
    512          1.17  drochner 	return res;
    513           1.2  christos }
    514           1.2  christos 
    515           1.2  christos int
    516           1.2  christos compat_50_netbsd32_lutimes(struct lwp *l,
    517           1.2  christos     const struct compat_50_netbsd32_lutimes_args *uap, register_t *retval)
    518           1.2  christos {
    519           1.2  christos 	/* {
    520           1.2  christos 		syscallarg(const netbsd32_charp) path;
    521           1.2  christos 		syscallarg(const netbsd32_timeval50p_t) tptr;
    522           1.2  christos 	} */
    523           1.2  christos 	int error;
    524           1.2  christos 	struct timeval tv[2], *tvp;
    525           1.2  christos 
    526           1.2  christos 	error = get_utimes32(SCARG_P32(uap, tptr), tv, &tvp);
    527           1.2  christos 	if (error != 0)
    528           1.2  christos 		return error;
    529           1.2  christos 
    530           1.2  christos 	return do_sys_utimes(l, NULL, SCARG_P32(uap, path), NOFOLLOW,
    531           1.2  christos 	    tvp, UIO_SYSSPACE);
    532           1.2  christos }
    533           1.2  christos 
    534           1.2  christos int
    535           1.2  christos compat_50_netbsd32__lwp_park(struct lwp *l,
    536           1.2  christos     const struct compat_50_netbsd32__lwp_park_args *uap, register_t *retval)
    537           1.2  christos {
    538           1.2  christos 	/* {
    539           1.2  christos 		syscallarg(const netbsd32_timespec50p) ts;
    540           1.2  christos 		syscallarg(lwpid_t) unpark;
    541           1.2  christos 		syscallarg(netbsd32_voidp) hint;
    542           1.2  christos 		syscallarg(netbsd32_voidp) unparkhint;
    543           1.2  christos 	} */
    544           1.2  christos 	struct timespec ts, *tsp;
    545           1.2  christos 	struct netbsd32_timespec50 ts32;
    546           1.2  christos 	int error;
    547           1.2  christos 
    548           1.2  christos 	if (SCARG_P32(uap, ts) == NULL)
    549           1.2  christos 		tsp = NULL;
    550           1.2  christos 	else {
    551           1.2  christos 		error = copyin(SCARG_P32(uap, ts), &ts32, sizeof ts32);
    552           1.2  christos 		if (error != 0)
    553           1.2  christos 			return error;
    554           1.2  christos 		netbsd32_to_timespec50(&ts32, &ts);
    555           1.2  christos 		tsp = &ts;
    556           1.2  christos 	}
    557           1.2  christos 
    558           1.2  christos 	if (SCARG(uap, unpark) != 0) {
    559           1.2  christos 		error = lwp_unpark(SCARG(uap, unpark),
    560           1.2  christos 		    SCARG_P32(uap, unparkhint));
    561           1.2  christos 		if (error != 0)
    562           1.2  christos 			return error;
    563           1.2  christos 	}
    564           1.2  christos 
    565          1.23  christos 	return lwp_park(CLOCK_REALTIME, TIMER_ABSTIME, tsp,
    566          1.23  christos 	    SCARG_P32(uap, hint));
    567           1.2  christos 	return 0;
    568           1.2  christos }
    569           1.2  christos 
    570           1.2  christos static int
    571           1.2  christos netbsd32_kevent_fetch_timeout(const void *src, void *dest, size_t length)
    572           1.2  christos {
    573           1.2  christos 	struct netbsd32_timespec50 ts32;
    574           1.2  christos 	int error;
    575           1.2  christos 
    576           1.2  christos 	KASSERT(length == sizeof(struct timespec50));
    577           1.2  christos 
    578           1.2  christos 	error = copyin(src, &ts32, sizeof(ts32));
    579           1.2  christos 	if (error)
    580           1.2  christos 		return error;
    581           1.2  christos 	netbsd32_to_timespec50(&ts32, (struct timespec *)dest);
    582           1.2  christos 	return 0;
    583           1.2  christos }
    584           1.2  christos 
    585           1.2  christos static int
    586           1.2  christos netbsd32_kevent_fetch_changes(void *private, const struct kevent *changelist,
    587           1.2  christos     struct kevent *changes, size_t index, int n)
    588           1.2  christos {
    589           1.2  christos 	const struct netbsd32_kevent *src =
    590           1.2  christos 	    (const struct netbsd32_kevent *)changelist;
    591           1.2  christos 	struct netbsd32_kevent *kev32, *changes32 = private;
    592           1.2  christos 	int error, i;
    593           1.2  christos 
    594           1.2  christos 	error = copyin(src + index, changes32, n * sizeof(*changes32));
    595           1.2  christos 	if (error)
    596           1.2  christos 		return error;
    597           1.2  christos 	for (i = 0, kev32 = changes32; i < n; i++, kev32++, changes++)
    598           1.2  christos 		netbsd32_to_kevent(kev32, changes);
    599           1.2  christos 	return 0;
    600           1.2  christos }
    601           1.2  christos 
    602           1.2  christos static int
    603           1.2  christos netbsd32_kevent_put_events(void *private, struct kevent *events,
    604           1.2  christos     struct kevent *eventlist, size_t index, int n)
    605           1.2  christos {
    606           1.2  christos 	struct netbsd32_kevent *kev32, *events32 = private;
    607           1.2  christos 	int i;
    608           1.2  christos 
    609           1.2  christos 	for (i = 0, kev32 = events32; i < n; i++, kev32++, events++)
    610           1.2  christos 		netbsd32_from_kevent(events, kev32);
    611           1.2  christos 	kev32 = (struct netbsd32_kevent *)eventlist;
    612           1.2  christos 	return  copyout(events32, kev32, n * sizeof(*events32));
    613           1.2  christos }
    614           1.2  christos 
    615           1.2  christos int
    616           1.2  christos compat_50_netbsd32_kevent(struct lwp *l,
    617           1.2  christos     const struct compat_50_netbsd32_kevent_args *uap, register_t *retval)
    618           1.2  christos {
    619           1.2  christos 	/* {
    620           1.2  christos 		syscallarg(int) fd;
    621           1.2  christos 		syscallarg(netbsd32_keventp_t) changelist;
    622           1.2  christos 		syscallarg(netbsd32_size_t) nchanges;
    623           1.2  christos 		syscallarg(netbsd32_keventp_t) eventlist;
    624           1.2  christos 		syscallarg(netbsd32_size_t) nevents;
    625           1.2  christos 		syscallarg(netbsd32_timespec50p_t) timeout;
    626           1.2  christos 	} */
    627           1.2  christos 	int error;
    628           1.2  christos 	size_t maxalloc, nchanges, nevents;
    629           1.2  christos 	struct kevent_ops netbsd32_kevent_ops = {
    630          1.19     joerg 		.keo_fetch_timeout = netbsd32_kevent_fetch_timeout,
    631          1.19     joerg 		.keo_fetch_changes = netbsd32_kevent_fetch_changes,
    632          1.19     joerg 		.keo_put_events = netbsd32_kevent_put_events,
    633           1.2  christos 	};
    634           1.2  christos 
    635           1.2  christos 	nchanges = SCARG(uap, nchanges);
    636           1.2  christos 	nevents = SCARG(uap, nevents);
    637          1.24      maxv 	maxalloc = KQ_NEVENTS;
    638          1.24      maxv 
    639           1.2  christos 	netbsd32_kevent_ops.keo_private =
    640          1.16     rmind 	    kmem_alloc(maxalloc * sizeof(struct netbsd32_kevent), KM_SLEEP);
    641           1.2  christos 
    642           1.2  christos 	error = kevent1(retval, SCARG(uap, fd),
    643           1.2  christos 	    NETBSD32PTR64(SCARG(uap, changelist)), nchanges,
    644           1.2  christos 	    NETBSD32PTR64(SCARG(uap, eventlist)), nevents,
    645           1.2  christos 	    NETBSD32PTR64(SCARG(uap, timeout)), &netbsd32_kevent_ops);
    646           1.2  christos 
    647          1.16     rmind 	kmem_free(netbsd32_kevent_ops.keo_private,
    648          1.16     rmind 	    maxalloc * sizeof(struct netbsd32_kevent));
    649           1.2  christos 	return error;
    650           1.2  christos }
    651           1.2  christos 
    652           1.2  christos int
    653           1.2  christos compat_50_netbsd32_pselect(struct lwp *l,
    654           1.2  christos     const struct compat_50_netbsd32_pselect_args *uap, register_t *retval)
    655           1.2  christos {
    656           1.2  christos 	/* {
    657           1.2  christos 		syscallarg(int) nd;
    658           1.2  christos 		syscallarg(netbsd32_fd_setp_t) in;
    659           1.2  christos 		syscallarg(netbsd32_fd_setp_t) ou;
    660           1.2  christos 		syscallarg(netbsd32_fd_setp_t) ex;
    661           1.2  christos 		syscallarg(const netbsd32_timespec50p_t) ts;
    662           1.2  christos 		syscallarg(const netbsd32_sigsetp_t) mask;
    663           1.2  christos 	} */
    664           1.2  christos 	int error;
    665           1.2  christos 	struct netbsd32_timespec50 ts32;
    666           1.4  christos 	struct timespec ats, *ts = NULL;
    667           1.2  christos 	sigset_t amask, *mask = NULL;
    668           1.2  christos 
    669           1.2  christos 	if (SCARG_P32(uap, ts)) {
    670           1.2  christos 		error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32));
    671           1.2  christos 		if (error != 0)
    672           1.2  christos 			return error;
    673           1.4  christos 		netbsd32_to_timespec50(&ts32, &ats);
    674           1.4  christos 		ts = &ats;
    675           1.2  christos 	}
    676           1.2  christos 	if (SCARG_P32(uap, mask)) {
    677           1.2  christos 		error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask));
    678           1.2  christos 		if (error != 0)
    679           1.2  christos 			return error;
    680           1.2  christos 		mask = &amask;
    681           1.2  christos 	}
    682           1.2  christos 
    683           1.7     rmind 	return selcommon(retval, SCARG(uap, nd), SCARG_P32(uap, in),
    684           1.4  christos 	    SCARG_P32(uap, ou), SCARG_P32(uap, ex), ts, mask);
    685           1.2  christos 	return 0;
    686           1.2  christos }
    687           1.2  christos 
    688           1.2  christos int
    689           1.2  christos compat_50_netbsd32_pollts(struct lwp *l,
    690           1.2  christos     const struct compat_50_netbsd32_pollts_args *uap, register_t *retval)
    691           1.2  christos {
    692           1.2  christos 	/* {
    693           1.2  christos 		syscallarg(struct netbsd32_pollfdp_t) fds;
    694           1.2  christos 		syscallarg(u_int) nfds;
    695           1.2  christos 		syscallarg(const netbsd32_timespec50p_t) ts;
    696           1.2  christos 		syscallarg(const netbsd32_sigsetp_t) mask;
    697           1.2  christos 	} */
    698           1.2  christos 	int error;
    699           1.2  christos 	struct netbsd32_timespec50 ts32;
    700           1.4  christos 	struct timespec ats, *ts = NULL;
    701           1.2  christos 	sigset_t amask, *mask = NULL;
    702           1.2  christos 
    703           1.2  christos 	if (SCARG_P32(uap, ts)) {
    704           1.2  christos 		error = copyin(SCARG_P32(uap, ts), &ts32, sizeof(ts32));
    705           1.2  christos 		if (error != 0)
    706           1.2  christos 			return error;
    707           1.4  christos 		netbsd32_to_timespec50(&ts32, &ats);
    708           1.4  christos 		ts = &ats;
    709           1.2  christos 	}
    710           1.2  christos 	if (NETBSD32PTR64( SCARG(uap, mask))) {
    711           1.2  christos 		error = copyin(SCARG_P32(uap, mask), &amask, sizeof(amask));
    712           1.2  christos 		if (error != 0)
    713           1.2  christos 			return error;
    714           1.2  christos 		mask = &amask;
    715           1.2  christos 	}
    716           1.2  christos 
    717           1.7     rmind 	return pollcommon(retval, SCARG_P32(uap, fds),
    718           1.4  christos 	    SCARG(uap, nfds), ts, mask);
    719           1.2  christos }
    720           1.2  christos 
    721           1.2  christos int
    722           1.2  christos compat_50_netbsd32___stat30(struct lwp *l,
    723           1.2  christos     const struct compat_50_netbsd32___stat30_args *uap, register_t *retval)
    724           1.2  christos {
    725           1.2  christos 	/* {
    726           1.2  christos 		syscallarg(const netbsd32_charp) path;
    727           1.2  christos 		syscallarg(netbsd32_stat50p_t) ub;
    728           1.2  christos 	} */
    729           1.2  christos 	struct netbsd32_stat50 sb32;
    730           1.2  christos 	struct stat sb;
    731           1.2  christos 	int error;
    732           1.2  christos 	const char *path;
    733           1.2  christos 
    734           1.2  christos 	path = SCARG_P32(uap, path);
    735           1.2  christos 
    736           1.2  christos 	error = do_sys_stat(path, FOLLOW, &sb);
    737           1.2  christos 	if (error)
    738           1.2  christos 		return error;
    739           1.2  christos 	netbsd32_from___stat50(&sb, &sb32);
    740           1.2  christos 	error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32));
    741           1.2  christos 	return error;
    742           1.2  christos }
    743           1.2  christos 
    744           1.2  christos int
    745           1.2  christos compat_50_netbsd32___fstat30(struct lwp *l,
    746           1.2  christos     const struct compat_50_netbsd32___fstat30_args *uap, register_t *retval)
    747           1.2  christos {
    748           1.2  christos 	/* {
    749           1.2  christos 		syscallarg(int) fd;
    750           1.2  christos 		syscallarg(netbsd32_stat50p_t) sb;
    751           1.2  christos 	} */
    752           1.2  christos 	struct netbsd32_stat50 sb32;
    753           1.2  christos 	struct stat ub;
    754           1.3     njoly 	int error;
    755           1.2  christos 
    756           1.3     njoly 	error = do_sys_fstat(SCARG(uap, fd), &ub);
    757           1.2  christos 	if (error == 0) {
    758           1.2  christos 		netbsd32_from___stat50(&ub, &sb32);
    759           1.2  christos 		error = copyout(&sb32, SCARG_P32(uap, sb), sizeof(sb32));
    760           1.2  christos 	}
    761           1.2  christos 	return error;
    762           1.2  christos }
    763           1.2  christos 
    764           1.2  christos int
    765           1.2  christos compat_50_netbsd32___lstat30(struct lwp *l,
    766           1.2  christos     const struct compat_50_netbsd32___lstat30_args *uap, register_t *retval)
    767           1.2  christos {
    768           1.2  christos 	/* {
    769           1.2  christos 		syscallarg(const netbsd32_charp) path;
    770           1.2  christos 		syscallarg(netbsd32_stat50p_t) ub;
    771           1.2  christos 	} */
    772           1.2  christos 	struct netbsd32_stat50 sb32;
    773           1.2  christos 	struct stat sb;
    774           1.2  christos 	int error;
    775           1.2  christos 	const char *path;
    776           1.2  christos 
    777           1.2  christos 	path = SCARG_P32(uap, path);
    778           1.2  christos 
    779           1.2  christos 	error = do_sys_stat(path, NOFOLLOW, &sb);
    780           1.2  christos 	if (error)
    781           1.2  christos 		return error;
    782           1.2  christos 	netbsd32_from___stat50(&sb, &sb32);
    783           1.2  christos 	error = copyout(&sb32, SCARG_P32(uap, ub), sizeof(sb32));
    784           1.2  christos 	return error;
    785           1.2  christos }
    786           1.2  christos 
    787           1.2  christos int
    788           1.2  christos compat_50_netbsd32___fhstat40(struct lwp *l, const struct compat_50_netbsd32___fhstat40_args *uap, register_t *retval)
    789           1.2  christos {
    790           1.2  christos 	/* {
    791           1.2  christos 		syscallarg(const netbsd32_pointer_t) fhp;
    792           1.2  christos 		syscallarg(netbsd32_size_t) fh_size;
    793           1.2  christos 		syscallarg(netbsd32_stat50p_t) sb;
    794           1.2  christos 	} */
    795           1.2  christos 	struct stat sb;
    796           1.2  christos 	struct netbsd32_stat50 sb32;
    797           1.2  christos 	int error;
    798           1.2  christos 
    799           1.2  christos 	error = do_fhstat(l, SCARG_P32(uap, fhp), SCARG(uap, fh_size), &sb);
    800  1.24.2.1.6.1    martin 	if (error == 0) {
    801           1.2  christos 		netbsd32_from___stat50(&sb, &sb32);
    802  1.24.2.1.6.1    martin 		error = copyout(&sb32, SCARG_P32(uap, sb), sizeof(sb32));
    803           1.2  christos 	}
    804           1.2  christos 	return error;
    805           1.2  christos }
    806           1.2  christos 
    807           1.2  christos int
    808           1.2  christos compat_50_netbsd32_wait4(struct lwp *l, const struct compat_50_netbsd32_wait4_args *uap, register_t *retval)
    809           1.2  christos {
    810           1.2  christos 	/* {
    811           1.2  christos 		syscallarg(int) pid;
    812           1.2  christos 		syscallarg(netbsd32_intp) status;
    813           1.2  christos 		syscallarg(int) options;
    814           1.2  christos 		syscallarg(netbsd32_rusage50p_t) rusage;
    815           1.2  christos 	} */
    816           1.6     rmind 	int error, status, pid = SCARG(uap, pid);
    817           1.6     rmind 	struct netbsd32_rusage50 ru32;
    818           1.6     rmind 	struct rusage ru;
    819           1.2  christos 
    820           1.6     rmind 	error = do_sys_wait(&pid, &status, SCARG(uap, options),
    821           1.6     rmind 	    SCARG_P32(uap, rusage) != NULL ? &ru : NULL);
    822           1.2  christos 
    823           1.2  christos 	retval[0] = pid;
    824           1.2  christos 	if (pid == 0)
    825           1.2  christos 		return error;
    826           1.2  christos 
    827           1.2  christos 	if (SCARG_P32(uap, rusage)) {
    828           1.2  christos 		netbsd32_from_rusage50(&ru, &ru32);
    829           1.2  christos 		error = copyout(&ru32, SCARG_P32(uap, rusage), sizeof(ru32));
    830           1.2  christos 	}
    831           1.2  christos 
    832           1.2  christos 	if (error == 0 && SCARG_P32(uap, status))
    833           1.2  christos 		error = copyout(&status, SCARG_P32(uap, status), sizeof(status));
    834           1.2  christos 
    835           1.2  christos 	return error;
    836           1.2  christos }
    837           1.2  christos 
    838           1.2  christos 
    839           1.2  christos int
    840           1.2  christos compat_50_netbsd32_getrusage(struct lwp *l, const struct compat_50_netbsd32_getrusage_args *uap, register_t *retval)
    841           1.2  christos {
    842           1.2  christos 	/* {
    843           1.2  christos 		syscallarg(int) who;
    844           1.2  christos 		syscallarg(netbsd32_rusage50p_t) rusage;
    845           1.2  christos 	} */
    846          1.22     njoly 	int error;
    847           1.2  christos 	struct proc *p = l->l_proc;
    848          1.22     njoly 	struct rusage ru;
    849          1.22     njoly 	struct netbsd32_rusage50 ru32;
    850           1.2  christos 
    851          1.22     njoly 	error = getrusage1(p, SCARG(uap, who), &ru);
    852          1.22     njoly 	if (error != 0)
    853          1.22     njoly 		return error;
    854           1.2  christos 
    855          1.22     njoly 	netbsd32_from_rusage50(&ru, &ru32);
    856          1.22     njoly 	return copyout(&ru32, SCARG_P32(uap, rusage), sizeof(ru32));
    857           1.2  christos }
    858           1.2  christos 
    859           1.2  christos int
    860           1.2  christos compat_50_netbsd32_setitimer(struct lwp *l,
    861           1.2  christos     const struct compat_50_netbsd32_setitimer_args *uap, register_t *retval)
    862           1.2  christos {
    863           1.2  christos 	/* {
    864           1.2  christos 		syscallarg(int) which;
    865           1.2  christos 		syscallarg(const netbsd32_itimerval50p_t) itv;
    866           1.2  christos 		syscallarg(netbsd32_itimerval50p_t) oitv;
    867           1.2  christos 	} */
    868           1.2  christos 	struct proc *p = l->l_proc;
    869           1.2  christos 	struct netbsd32_itimerval50 s32it, *itv32;
    870           1.2  christos 	int which = SCARG(uap, which);
    871           1.2  christos 	struct compat_50_netbsd32_getitimer_args getargs;
    872           1.2  christos 	struct itimerval aitv;
    873           1.2  christos 	int error;
    874           1.2  christos 
    875           1.2  christos 	if ((u_int)which > ITIMER_PROF)
    876           1.2  christos 		return (EINVAL);
    877           1.2  christos 	itv32 = SCARG_P32(uap, itv);
    878           1.2  christos 	if (itv32) {
    879           1.2  christos 		if ((error = copyin(itv32, &s32it, sizeof(s32it))))
    880           1.2  christos 			return (error);
    881           1.2  christos 		netbsd32_to_itimerval50(&s32it, &aitv);
    882           1.2  christos 	}
    883           1.2  christos 	if (SCARG_P32(uap, oitv) != 0) {
    884           1.2  christos 		SCARG(&getargs, which) = which;
    885           1.2  christos 		SCARG(&getargs, itv) = SCARG(uap, oitv);
    886           1.2  christos 		if ((error = compat_50_netbsd32_getitimer(l, &getargs, retval)) != 0)
    887           1.2  christos 			return (error);
    888           1.2  christos 	}
    889           1.2  christos 	if (itv32 == 0)
    890           1.2  christos 		return 0;
    891           1.2  christos 
    892           1.2  christos 	return dosetitimer(p, which, &aitv);
    893           1.2  christos }
    894           1.2  christos 
    895           1.2  christos int
    896           1.2  christos compat_50_netbsd32_getitimer(struct lwp *l, const struct compat_50_netbsd32_getitimer_args *uap, register_t *retval)
    897           1.2  christos {
    898           1.2  christos 	/* {
    899           1.2  christos 		syscallarg(int) which;
    900           1.2  christos 		syscallarg(netbsd32_itimerval50p_t) itv;
    901           1.2  christos 	} */
    902           1.2  christos 	struct proc *p = l->l_proc;
    903           1.2  christos 	struct netbsd32_itimerval50 s32it;
    904           1.2  christos 	struct itimerval aitv;
    905           1.2  christos 	int error;
    906           1.2  christos 
    907           1.2  christos 	error = dogetitimer(p, SCARG(uap, which), &aitv);
    908           1.2  christos 	if (error)
    909           1.2  christos 		return error;
    910           1.2  christos 
    911           1.2  christos 	netbsd32_from_itimerval50(&aitv, &s32it);
    912           1.2  christos 	return copyout(&s32it, SCARG_P32(uap, itv), sizeof(s32it));
    913           1.2  christos }
    914           1.2  christos 
    915           1.2  christos #if defined(SYSVSEM)
    916           1.2  christos 
    917           1.2  christos int
    918           1.2  christos compat_50_netbsd32___semctl14(struct lwp *l, const struct compat_50_netbsd32___semctl14_args *uap, register_t *retval)
    919           1.2  christos {
    920           1.2  christos 	return do_netbsd32___semctl14(l, uap, retval, NULL);
    921           1.2  christos }
    922           1.2  christos 
    923           1.2  christos int
    924           1.2  christos do_netbsd32___semctl14(struct lwp *l, const struct compat_50_netbsd32___semctl14_args *uap, register_t *retval, void *vkarg)
    925           1.2  christos {
    926           1.2  christos 	/* {
    927           1.2  christos 		syscallarg(int) semid;
    928           1.2  christos 		syscallarg(int) semnum;
    929           1.2  christos 		syscallarg(int) cmd;
    930           1.2  christos 		syscallarg(netbsd32_semun50p_t) arg;
    931           1.2  christos 	} */
    932           1.2  christos 	struct semid_ds sembuf;
    933           1.2  christos 	struct netbsd32_semid_ds50 sembuf32;
    934           1.2  christos 	int cmd, error;
    935           1.2  christos 	void *pass_arg;
    936           1.2  christos 	union __semun karg;
    937           1.2  christos 	union netbsd32_semun50 karg32;
    938           1.2  christos 
    939           1.2  christos 	cmd = SCARG(uap, cmd);
    940           1.2  christos 
    941           1.2  christos 	switch (cmd) {
    942           1.2  christos 	case IPC_SET:
    943           1.2  christos 	case IPC_STAT:
    944           1.2  christos 		pass_arg = &sembuf;
    945           1.2  christos 		break;
    946           1.2  christos 
    947           1.2  christos 	case GETALL:
    948           1.2  christos 	case SETVAL:
    949           1.2  christos 	case SETALL:
    950           1.2  christos 		pass_arg = &karg;
    951           1.2  christos 		break;
    952           1.2  christos 	default:
    953           1.2  christos 		pass_arg = NULL;
    954           1.2  christos 		break;
    955           1.2  christos 	}
    956           1.2  christos 
    957           1.2  christos 	if (pass_arg) {
    958           1.2  christos 		if (vkarg != NULL)
    959           1.2  christos 			karg32 = *(union netbsd32_semun50 *)vkarg;
    960           1.2  christos 		else {
    961           1.2  christos 			error = copyin(SCARG_P32(uap, arg), &karg32,
    962           1.2  christos 					sizeof(karg32));
    963           1.2  christos 			if (error)
    964           1.2  christos 				return error;
    965           1.2  christos 		}
    966           1.2  christos 		if (pass_arg == &karg) {
    967           1.2  christos 			switch (cmd) {
    968           1.2  christos 			case GETALL:
    969           1.2  christos 			case SETALL:
    970           1.2  christos 				karg.array = NETBSD32PTR64(karg32.array);
    971           1.2  christos 				break;
    972           1.2  christos 			case SETVAL:
    973           1.2  christos 				karg.val = karg32.val;
    974           1.2  christos 				break;
    975           1.2  christos 			}
    976           1.2  christos 		}
    977           1.2  christos 		if (cmd == IPC_SET) {
    978           1.2  christos 			error = copyin(NETBSD32PTR64(karg32.buf), &sembuf32,
    979           1.2  christos 			    sizeof(sembuf32));
    980           1.2  christos 			if (error)
    981           1.2  christos 				return (error);
    982           1.2  christos 			netbsd32_to_semid_ds50(&sembuf32, &sembuf);
    983           1.2  christos 		}
    984           1.2  christos 	}
    985           1.2  christos 
    986           1.2  christos 	error = semctl1(l, SCARG(uap, semid), SCARG(uap, semnum), cmd,
    987           1.2  christos 	    pass_arg, retval);
    988           1.2  christos 
    989           1.2  christos 	if (error == 0 && cmd == IPC_STAT) {
    990           1.2  christos 		netbsd32_from_semid_ds50(&sembuf, &sembuf32);
    991           1.2  christos 		error = copyout(&sembuf32, NETBSD32PTR64(karg32.buf),
    992           1.2  christos 		    sizeof(sembuf32));
    993           1.2  christos 	}
    994           1.2  christos 
    995           1.2  christos 	return (error);
    996           1.2  christos }
    997           1.2  christos #endif
    998           1.2  christos 
    999           1.2  christos #if defined(SYSVMSG)
   1000           1.2  christos 
   1001           1.2  christos int
   1002           1.2  christos compat_50_netbsd32___msgctl13(struct lwp *l, const struct compat_50_netbsd32___msgctl13_args *uap, register_t *retval)
   1003           1.2  christos {
   1004           1.2  christos 	/* {
   1005           1.2  christos 		syscallarg(int) msqid;
   1006           1.2  christos 		syscallarg(int) cmd;
   1007           1.2  christos 		syscallarg(netbsd32_msqid_ds50p_t) buf;
   1008           1.2  christos 	} */
   1009           1.2  christos 	struct msqid_ds ds;
   1010           1.2  christos 	struct netbsd32_msqid_ds50 ds32;
   1011           1.2  christos 	int error, cmd;
   1012           1.2  christos 
   1013           1.2  christos 	cmd = SCARG(uap, cmd);
   1014           1.2  christos 	if (cmd == IPC_SET) {
   1015           1.2  christos 		error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32));
   1016           1.2  christos 		if (error)
   1017           1.2  christos 			return error;
   1018           1.2  christos 		netbsd32_to_msqid_ds50(&ds32, &ds);
   1019           1.2  christos 	}
   1020           1.2  christos 
   1021           1.2  christos 	error = msgctl1(l, SCARG(uap, msqid), cmd,
   1022           1.2  christos 	    (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL);
   1023           1.2  christos 
   1024           1.2  christos 	if (error == 0 && cmd == IPC_STAT) {
   1025           1.2  christos 		netbsd32_from_msqid_ds50(&ds, &ds32);
   1026           1.2  christos 		error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32));
   1027           1.2  christos 	}
   1028           1.2  christos 
   1029           1.2  christos 	return error;
   1030           1.2  christos }
   1031           1.2  christos #endif
   1032           1.2  christos 
   1033           1.2  christos #if defined(SYSVSHM)
   1034           1.2  christos 
   1035           1.2  christos int
   1036           1.2  christos compat_50_netbsd32___shmctl13(struct lwp *l, const struct compat_50_netbsd32___shmctl13_args *uap, register_t *retval)
   1037           1.2  christos {
   1038           1.2  christos 	/* {
   1039           1.2  christos 		syscallarg(int) shmid;
   1040           1.2  christos 		syscallarg(int) cmd;
   1041           1.2  christos 		syscallarg(netbsd32_shmid_ds50p_t) buf;
   1042           1.2  christos 	} */
   1043           1.2  christos 	struct shmid_ds ds;
   1044           1.2  christos 	struct netbsd32_shmid_ds50 ds32;
   1045           1.2  christos 	int error, cmd;
   1046           1.2  christos 
   1047           1.2  christos 	cmd = SCARG(uap, cmd);
   1048           1.2  christos 	if (cmd == IPC_SET) {
   1049           1.2  christos 		error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32));
   1050           1.2  christos 		if (error)
   1051           1.2  christos 			return error;
   1052           1.2  christos 		netbsd32_to_shmid_ds50(&ds32, &ds);
   1053           1.2  christos 	}
   1054           1.2  christos 
   1055           1.2  christos 	error = shmctl1(l, SCARG(uap, shmid), cmd,
   1056           1.2  christos 	    (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL);
   1057           1.2  christos 
   1058           1.2  christos 	if (error == 0 && cmd == IPC_STAT) {
   1059           1.2  christos 		netbsd32_from_shmid_ds50(&ds, &ds32);
   1060           1.2  christos 		error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32));
   1061           1.2  christos 	}
   1062           1.2  christos 
   1063           1.2  christos 	return error;
   1064           1.2  christos }
   1065           1.2  christos #endif
   1066          1.18    bouyer 
   1067          1.18    bouyer int
   1068          1.18    bouyer compat_50_netbsd32_quotactl(struct lwp *l, const struct compat_50_netbsd32_quotactl_args *uap, register_t *retval)
   1069          1.18    bouyer {
   1070          1.18    bouyer 	/* {
   1071          1.18    bouyer 		syscallarg(const netbsd32_charp) path;
   1072          1.18    bouyer 		syscallarg(int) cmd;
   1073          1.18    bouyer 		syscallarg(int) uid;
   1074          1.18    bouyer 		syscallarg(netbsd32_voidp) arg;
   1075          1.18    bouyer 	} */
   1076          1.18    bouyer 	struct compat_50_sys_quotactl_args ua;
   1077          1.18    bouyer 
   1078          1.18    bouyer 	NETBSD32TOP_UAP(path, const char);
   1079          1.18    bouyer 	NETBSD32TO64_UAP(cmd);
   1080          1.18    bouyer 	NETBSD32TO64_UAP(uid);
   1081          1.18    bouyer 	NETBSD32TOP_UAP(arg, void *);
   1082          1.18    bouyer 	return (compat_50_sys_quotactl(l, &ua, retval));
   1083          1.18    bouyer }
   1084