Home | History | Annotate | Line # | Download | only in netbsd32
netbsd32_compat_43.c revision 1.8.2.3
      1  1.8.2.3  bouyer /*	$NetBSD: netbsd32_compat_43.c,v 1.8.2.3 2001/02/11 19:14:10 bouyer Exp $	*/
      2      1.1     mrg 
      3      1.1     mrg /*
      4      1.1     mrg  * Copyright (c) 1998 Matthew R. Green
      5      1.1     mrg  * All rights reserved.
      6      1.1     mrg  *
      7      1.1     mrg  * Redistribution and use in source and binary forms, with or without
      8      1.1     mrg  * modification, are permitted provided that the following conditions
      9      1.1     mrg  * are met:
     10      1.1     mrg  * 1. Redistributions of source code must retain the above copyright
     11      1.1     mrg  *    notice, this list of conditions and the following disclaimer.
     12      1.1     mrg  * 2. Redistributions in binary form must reproduce the above copyright
     13      1.1     mrg  *    notice, this list of conditions and the following disclaimer in the
     14      1.1     mrg  *    documentation and/or other materials provided with the distribution.
     15      1.1     mrg  * 3. The name of the author may not be used to endorse or promote products
     16      1.1     mrg  *    derived from this software without specific prior written permission.
     17      1.1     mrg  *
     18      1.1     mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19      1.1     mrg  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20      1.1     mrg  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21      1.1     mrg  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22      1.7     mrg  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     23      1.1     mrg  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     24      1.1     mrg  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     25      1.1     mrg  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     26      1.7     mrg  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     27      1.1     mrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28      1.1     mrg  * SUCH DAMAGE.
     29      1.1     mrg  */
     30      1.1     mrg 
     31  1.8.2.2  bouyer #if defined(_KERNEL) && !defined(_LKM)
     32  1.8.2.2  bouyer #include "opt_compat_43.h"
     33  1.8.2.2  bouyer #endif
     34  1.8.2.2  bouyer 
     35      1.1     mrg #include <sys/param.h>
     36      1.1     mrg #include <sys/systm.h>
     37      1.1     mrg #include <sys/fcntl.h>
     38      1.1     mrg #include <sys/malloc.h>
     39      1.1     mrg #include <sys/mount.h>
     40      1.1     mrg #include <sys/proc.h>
     41      1.1     mrg #include <sys/stat.h>
     42      1.1     mrg #include <sys/syscallargs.h>
     43      1.1     mrg #include <sys/time.h>
     44      1.1     mrg #include <sys/ucred.h>
     45  1.8.2.1  bouyer #include <uvm/uvm_extern.h>
     46      1.1     mrg #include <sys/sysctl.h>
     47      1.3     mrg #include <sys/swap.h>
     48      1.1     mrg 
     49      1.5     mrg #include <compat/netbsd32/netbsd32.h>
     50      1.5     mrg #include <compat/netbsd32/netbsd32_syscallargs.h>
     51      1.1     mrg 
     52  1.8.2.1  bouyer int compat_43_netbsd32_sethostid __P((struct proc *, void *, register_t *));
     53  1.8.2.1  bouyer int compat_43_netbsd32_killpg __P((struct proc *, void *, register_t *retval));
     54  1.8.2.1  bouyer int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
     55  1.8.2.1  bouyer int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
     56  1.8.2.1  bouyer 
     57  1.8.2.3  bouyer void
     58      1.5     mrg netbsd32_from_stat43(sp43, sp32)
     59      1.1     mrg 	struct stat43 *sp43;
     60      1.5     mrg 	struct netbsd32_stat43 *sp32;
     61      1.1     mrg {
     62      1.1     mrg 
     63      1.1     mrg 	sp32->st_dev = sp43->st_dev;
     64      1.1     mrg 	sp32->st_ino = sp43->st_ino;
     65      1.1     mrg 	sp32->st_mode = sp43->st_mode;
     66      1.1     mrg 	sp32->st_nlink = sp43->st_nlink;
     67      1.1     mrg 	sp32->st_uid = sp43->st_uid;
     68      1.1     mrg 	sp32->st_gid = sp43->st_gid;
     69      1.1     mrg 	sp32->st_rdev = sp43->st_rdev;
     70      1.1     mrg 	sp32->st_size = sp43->st_size;
     71      1.1     mrg 	sp32->st_atimespec.tv_sec = sp43->st_atimespec.tv_sec;
     72      1.1     mrg 	sp32->st_atimespec.tv_nsec = sp43->st_atimespec.tv_nsec;
     73      1.1     mrg 	sp32->st_mtimespec.tv_sec = sp43->st_mtimespec.tv_sec;
     74      1.1     mrg 	sp32->st_mtimespec.tv_nsec = sp43->st_mtimespec.tv_nsec;
     75      1.1     mrg 	sp32->st_ctimespec.tv_sec = sp43->st_ctimespec.tv_sec;
     76      1.1     mrg 	sp32->st_ctimespec.tv_nsec = sp43->st_ctimespec.tv_nsec;
     77      1.1     mrg 	sp32->st_blksize = sp43->st_blksize;
     78      1.1     mrg 	sp32->st_blocks = sp43->st_blocks;
     79      1.1     mrg 	sp32->st_flags = sp43->st_flags;
     80      1.1     mrg 	sp32->st_gen = sp43->st_gen;
     81      1.1     mrg }
     82      1.1     mrg 
     83      1.1     mrg /* file system syscalls */
     84      1.1     mrg int
     85      1.8     eeh compat_43_netbsd32_ocreat(p, v, retval)
     86      1.1     mrg 	struct proc *p;
     87      1.1     mrg 	void *v;
     88      1.1     mrg 	register_t *retval;
     89      1.1     mrg {
     90      1.8     eeh 	struct compat_43_netbsd32_ocreat_args /* {
     91      1.5     mrg 		syscallarg(const netbsd32_charp) path;
     92      1.1     mrg 		syscallarg(mode_t) mode;
     93      1.1     mrg 	} */ *uap = v;
     94      1.1     mrg 	struct sys_open_args  ua;
     95      1.1     mrg 	caddr_t sg;
     96      1.1     mrg 
     97      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
     98      1.6     mrg 	NETBSD32TO64_UAP(mode);
     99      1.1     mrg 	SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC;
    100      1.1     mrg 	sg = stackgap_init(p->p_emul);
    101  1.8.2.2  bouyer 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
    102      1.1     mrg 
    103      1.1     mrg 	return (sys_open(p, &ua, retval));
    104      1.1     mrg }
    105      1.1     mrg 
    106      1.1     mrg int
    107      1.8     eeh compat_43_netbsd32_olseek(p, v, retval)
    108      1.1     mrg 	struct proc *p;
    109      1.1     mrg 	void *v;
    110      1.1     mrg 	register_t *retval;
    111      1.1     mrg {
    112      1.8     eeh 	struct compat_43_netbsd32_olseek_args /* {
    113      1.1     mrg 		syscallarg(int) fd;
    114      1.5     mrg 		syscallarg(netbsd32_long) offset;
    115      1.1     mrg 		syscallarg(int) whence;
    116      1.1     mrg 	} */ *uap = v;
    117      1.1     mrg 	struct sys_lseek_args ua;
    118      1.1     mrg 	int rv;
    119      1.1     mrg 	off_t rt;
    120      1.1     mrg 
    121      1.1     mrg 	SCARG(&ua, fd) = SCARG(uap, fd);
    122      1.6     mrg 	NETBSD32TOX_UAP(offset, long);
    123      1.6     mrg 	NETBSD32TO64_UAP(whence);
    124      1.1     mrg 	rv = sys_lseek(p, &ua, (register_t *)&rt);
    125      1.5     mrg 	*(netbsd32_long *)retval = rt;
    126      1.1     mrg 
    127      1.1     mrg 	return (rv);
    128      1.1     mrg }
    129      1.1     mrg 
    130      1.1     mrg int
    131      1.8     eeh compat_43_netbsd32_stat43(p, v, retval)
    132      1.1     mrg 	struct proc *p;
    133      1.1     mrg 	void *v;
    134      1.1     mrg 	register_t *retval;
    135      1.1     mrg {
    136      1.8     eeh 	struct compat_43_netbsd32_stat43_args /* {
    137      1.5     mrg 		syscallarg(const netbsd32_charp) path;
    138      1.5     mrg 		syscallarg(netbsd32_stat43p_t) ub;
    139      1.1     mrg 	} */ *uap = v;
    140  1.8.2.3  bouyer 	struct stat43 sb43, *sgsbp;
    141  1.8.2.3  bouyer 	struct netbsd32_stat43 sb32;
    142      1.1     mrg 	struct compat_43_sys_stat_args ua;
    143  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    144  1.8.2.3  bouyer 	int rv, error;
    145      1.1     mrg 
    146      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
    147  1.8.2.3  bouyer 	SCARG(&ua, ub) = sgsbp = stackgap_alloc(&sg, sizeof(sb43));
    148  1.8.2.2  bouyer 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
    149      1.1     mrg 	rv = compat_43_sys_stat(p, &ua, retval);
    150      1.1     mrg 
    151  1.8.2.3  bouyer 	error = copyin(sgsbp, &sb43, sizeof(sb43));
    152  1.8.2.3  bouyer 	if (error)
    153  1.8.2.3  bouyer 		return error;
    154  1.8.2.3  bouyer 	netbsd32_from_stat43(&sb43, &sb32);
    155  1.8.2.3  bouyer 	error = copyout(&sb32, (char *)(u_long)SCARG(uap, ub), sizeof(sb32));
    156  1.8.2.3  bouyer 	if (error)
    157  1.8.2.3  bouyer 		return error;
    158      1.1     mrg 
    159      1.1     mrg 	return (rv);
    160      1.1     mrg }
    161      1.1     mrg 
    162      1.1     mrg int
    163      1.8     eeh compat_43_netbsd32_lstat43(p, v, retval)
    164      1.1     mrg 	struct proc *p;
    165      1.1     mrg 	void *v;
    166      1.1     mrg 	register_t *retval;
    167      1.1     mrg {
    168      1.8     eeh 	struct compat_43_netbsd32_lstat43_args /* {
    169      1.5     mrg 		syscallarg(const netbsd32_charp) path;
    170      1.5     mrg 		syscallarg(netbsd32_stat43p_t) ub;
    171      1.1     mrg 	} */ *uap = v;
    172  1.8.2.3  bouyer 	struct stat43 sb43, *sgsbp;
    173  1.8.2.3  bouyer 	struct netbsd32_stat43 sb32;
    174      1.1     mrg 	struct compat_43_sys_lstat_args ua;
    175  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    176  1.8.2.3  bouyer 	int rv, error;
    177      1.1     mrg 
    178      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
    179  1.8.2.3  bouyer 	SCARG(&ua, ub) = sgsbp = stackgap_alloc(&sg, sizeof(sb43));
    180  1.8.2.2  bouyer 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
    181      1.1     mrg 	rv = compat_43_sys_stat(p, &ua, retval);
    182      1.1     mrg 
    183  1.8.2.3  bouyer 	error = copyin(sgsbp, &sb43, sizeof(sb43));
    184  1.8.2.3  bouyer 	if (error)
    185  1.8.2.3  bouyer 		return error;
    186  1.8.2.3  bouyer 	netbsd32_from_stat43(&sb43, &sb32);
    187  1.8.2.3  bouyer 	error = copyout(&sb32, (char *)(u_long)SCARG(uap, ub), sizeof(sb32));
    188  1.8.2.3  bouyer 	if (error)
    189  1.8.2.3  bouyer 		return error;
    190      1.1     mrg 
    191      1.1     mrg 	return (rv);
    192      1.1     mrg }
    193      1.1     mrg 
    194      1.1     mrg int
    195      1.8     eeh compat_43_netbsd32_fstat43(p, v, retval)
    196      1.1     mrg 	struct proc *p;
    197      1.1     mrg 	void *v;
    198      1.1     mrg 	register_t *retval;
    199      1.1     mrg {
    200      1.8     eeh 	struct compat_43_netbsd32_fstat43_args /* {
    201      1.1     mrg 		syscallarg(int) fd;
    202      1.5     mrg 		syscallarg(netbsd32_stat43p_t) sb;
    203      1.1     mrg 	} */ *uap = v;
    204  1.8.2.3  bouyer 	struct stat43 sb43, *sgsbp;
    205  1.8.2.3  bouyer 	struct netbsd32_stat43 sb32;
    206      1.1     mrg 	struct compat_43_sys_fstat_args ua;
    207  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    208  1.8.2.3  bouyer 	int rv, error;
    209      1.1     mrg 
    210      1.6     mrg 	NETBSD32TO64_UAP(fd);
    211  1.8.2.3  bouyer 	SCARG(&ua, sb) = sgsbp = stackgap_alloc(&sg, sizeof(sb43));
    212      1.1     mrg 	rv = compat_43_sys_fstat(p, &ua, retval);
    213      1.1     mrg 
    214  1.8.2.3  bouyer 	error = copyin(sgsbp, &sb43, sizeof(sb43));
    215  1.8.2.3  bouyer 	if (error)
    216  1.8.2.3  bouyer 		return error;
    217  1.8.2.3  bouyer 	netbsd32_from_stat43(&sb43, &sb32);
    218  1.8.2.3  bouyer 	error = copyout(&sb32, (char *)(u_long)SCARG(uap, sb), sizeof(sb32));
    219  1.8.2.3  bouyer 	if (error)
    220  1.8.2.3  bouyer 		return error;
    221      1.1     mrg 
    222      1.1     mrg 	return (rv);
    223      1.1     mrg }
    224      1.1     mrg 
    225      1.1     mrg int
    226      1.8     eeh compat_43_netbsd32_otruncate(p, v, retval)
    227      1.1     mrg 	struct proc *p;
    228      1.1     mrg 	void *v;
    229      1.1     mrg 	register_t *retval;
    230      1.1     mrg {
    231      1.8     eeh 	struct compat_43_netbsd32_otruncate_args /* {
    232      1.5     mrg 		syscallarg(const netbsd32_charp) path;
    233      1.5     mrg 		syscallarg(netbsd32_long) length;
    234      1.1     mrg 	} */ *uap = v;
    235      1.1     mrg 	struct sys_truncate_args ua;
    236      1.1     mrg 
    237      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
    238      1.6     mrg 	NETBSD32TO64_UAP(length);
    239      1.1     mrg 	return (sys_ftruncate(p, &ua, retval));
    240      1.1     mrg }
    241      1.1     mrg 
    242      1.1     mrg int
    243      1.8     eeh compat_43_netbsd32_oftruncate(p, v, retval)
    244      1.1     mrg 	struct proc *p;
    245      1.1     mrg 	void *v;
    246      1.1     mrg 	register_t *retval;
    247      1.1     mrg {
    248      1.8     eeh 	struct compat_43_netbsd32_oftruncate_args /* {
    249      1.1     mrg 		syscallarg(int) fd;
    250      1.5     mrg 		syscallarg(netbsd32_long) length;
    251      1.1     mrg 	} */ *uap = v;
    252      1.1     mrg 	struct sys_ftruncate_args ua;
    253      1.1     mrg 
    254      1.6     mrg 	NETBSD32TO64_UAP(fd);
    255      1.6     mrg 	NETBSD32TO64_UAP(length);
    256      1.1     mrg 	return (sys_ftruncate(p, &ua, retval));
    257      1.1     mrg }
    258      1.1     mrg 
    259      1.1     mrg int
    260      1.8     eeh compat_43_netbsd32_ogetdirentries(p, v, retval)
    261      1.1     mrg 	struct proc *p;
    262      1.1     mrg 	void *v;
    263      1.1     mrg 	register_t *retval;
    264      1.1     mrg {
    265      1.8     eeh 	struct compat_43_netbsd32_ogetdirentries_args /* {
    266      1.1     mrg 		syscallarg(int) fd;
    267      1.5     mrg 		syscallarg(netbsd32_charp) buf;
    268      1.1     mrg 		syscallarg(u_int) count;
    269      1.5     mrg 		syscallarg(netbsd32_longp) basep;
    270      1.1     mrg 	} */ *uap = v;
    271      1.1     mrg 	struct compat_43_sys_getdirentries_args ua;
    272      1.1     mrg 
    273      1.6     mrg 	NETBSD32TO64_UAP(fd);
    274      1.6     mrg 	NETBSD32TOP_UAP(buf, char);
    275      1.6     mrg 	NETBSD32TO64_UAP(count);
    276      1.6     mrg 	NETBSD32TOP_UAP(basep, long);
    277      1.1     mrg 	return (compat_43_sys_getdirentries(p, &ua, retval));
    278      1.1     mrg }
    279      1.1     mrg 
    280      1.1     mrg /* kernel syscalls */
    281      1.1     mrg int
    282      1.8     eeh compat_43_netbsd32_ogetkerninfo(p, v, retval)
    283      1.1     mrg 	struct proc *p;
    284      1.1     mrg 	void *v;
    285      1.1     mrg 	register_t *retval;
    286      1.1     mrg {
    287      1.8     eeh 	struct compat_43_netbsd32_ogetkerninfo_args /* {
    288      1.1     mrg 		syscallarg(int) op;
    289      1.5     mrg 		syscallarg(netbsd32_charp) where;
    290      1.5     mrg 		syscallarg(netbsd32_intp) size;
    291      1.1     mrg 		syscallarg(int) arg;
    292      1.1     mrg 	} */ *uap = v;
    293      1.1     mrg 	struct compat_43_sys_getkerninfo_args ua;
    294      1.1     mrg 
    295      1.6     mrg 	NETBSD32TO64_UAP(op);
    296      1.6     mrg 	NETBSD32TOP_UAP(where, char);
    297      1.6     mrg 	NETBSD32TOP_UAP(size, int);
    298      1.6     mrg 	NETBSD32TO64_UAP(arg);
    299      1.1     mrg 	return (compat_43_sys_getkerninfo(p, &ua, retval));
    300      1.1     mrg }
    301      1.1     mrg 
    302      1.1     mrg int
    303      1.8     eeh compat_43_netbsd32_ogethostname(p, v, retval)
    304      1.1     mrg 	struct proc *p;
    305      1.1     mrg 	void *v;
    306      1.1     mrg 	register_t *retval;
    307      1.1     mrg {
    308      1.8     eeh 	struct compat_43_netbsd32_ogethostname_args /* {
    309      1.5     mrg 		syscallarg(netbsd32_charp) hostname;
    310      1.1     mrg 		syscallarg(u_int) len;
    311      1.1     mrg 	} */ *uap = v;
    312      1.1     mrg 	int name;
    313      1.1     mrg 	size_t sz;
    314      1.1     mrg 
    315      1.1     mrg 	name = KERN_HOSTNAME;
    316      1.1     mrg 	sz = SCARG(uap, len);
    317      1.1     mrg 	return (kern_sysctl(&name, 1, (char *)(u_long)SCARG(uap, hostname),
    318      1.1     mrg 	    &sz, 0, 0, p));
    319      1.1     mrg }
    320      1.1     mrg 
    321      1.1     mrg int
    322      1.8     eeh compat_43_netbsd32_osethostname(p, v, retval)
    323      1.1     mrg 	struct proc *p;
    324      1.1     mrg 	void *v;
    325      1.1     mrg 	register_t *retval;
    326      1.1     mrg {
    327      1.8     eeh 	struct compat_43_netbsd32_osethostname_args /* {
    328      1.5     mrg 		syscallarg(netbsd32_charp) hostname;
    329      1.1     mrg 		syscallarg(u_int) len;
    330      1.1     mrg 	} */ *uap = v;
    331      1.1     mrg 	int name;
    332      1.1     mrg 	int error;
    333      1.1     mrg 
    334      1.1     mrg 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
    335      1.1     mrg 		return (error);
    336      1.1     mrg 	name = KERN_HOSTNAME;
    337      1.1     mrg 	return (kern_sysctl(&name, 1, 0, 0, (char *)(u_long)SCARG(uap,
    338      1.1     mrg 	    hostname), SCARG(uap, len), p));
    339      1.1     mrg }
    340      1.1     mrg 
    341      1.1     mrg int
    342      1.8     eeh compat_43_netbsd32_sethostid(p, v, retval)
    343      1.4     eeh 	struct proc *p;
    344      1.4     eeh 	void *v;
    345      1.4     eeh 	register_t *retval;
    346      1.4     eeh {
    347      1.8     eeh 	struct compat_43_netbsd32_sethostid_args /* {
    348      1.4     eeh 		syscallarg(int32_t) hostid;
    349      1.4     eeh 	} */ *uap = v;
    350      1.4     eeh 	struct compat_43_sys_sethostid_args ua;
    351      1.4     eeh 
    352      1.6     mrg 	NETBSD32TO64_UAP(hostid);
    353      1.4     eeh 	return (compat_43_sys_sethostid(p, &ua, retval));
    354      1.4     eeh }
    355      1.4     eeh 
    356      1.4     eeh int
    357      1.8     eeh compat_43_netbsd32_ogetrlimit(p, v, retval)
    358      1.1     mrg 	struct proc *p;
    359      1.1     mrg 	void *v;
    360      1.1     mrg 	register_t *retval;
    361      1.1     mrg {
    362      1.8     eeh 	struct compat_43_netbsd32_ogetrlimit_args /* {
    363      1.1     mrg 		syscallarg(int) which;
    364      1.5     mrg 		syscallarg(netbsd32_orlimitp_t) rlp;
    365      1.1     mrg 	} */ *uap = v;
    366      1.1     mrg 	struct compat_43_sys_getrlimit_args ua;
    367      1.1     mrg 
    368      1.6     mrg 	NETBSD32TO64_UAP(which);
    369      1.6     mrg 	NETBSD32TOP_UAP(rlp, struct orlimit);
    370      1.1     mrg 	return (compat_43_sys_getrlimit(p, &ua, retval));
    371      1.1     mrg }
    372      1.1     mrg 
    373      1.1     mrg int
    374      1.8     eeh compat_43_netbsd32_osetrlimit(p, v, retval)
    375      1.1     mrg 	struct proc *p;
    376      1.1     mrg 	void *v;
    377      1.1     mrg 	register_t *retval;
    378      1.1     mrg {
    379      1.8     eeh 	struct compat_43_netbsd32_osetrlimit_args /* {
    380      1.1     mrg 		syscallarg(int) which;
    381      1.5     mrg 		syscallarg(netbsd32_orlimitp_t) rlp;
    382      1.1     mrg 	} */ *uap = v;
    383      1.1     mrg 	struct compat_43_sys_setrlimit_args ua;
    384      1.1     mrg 
    385      1.6     mrg 	NETBSD32TO64_UAP(which);
    386      1.6     mrg 	NETBSD32TOP_UAP(rlp, struct orlimit);
    387      1.1     mrg 	return (compat_43_sys_setrlimit(p, &ua, retval));
    388      1.1     mrg }
    389      1.1     mrg 
    390      1.4     eeh int
    391      1.8     eeh compat_43_netbsd32_killpg(p, v, retval)
    392      1.4     eeh 	struct proc *p;
    393      1.4     eeh 	void *v;
    394      1.4     eeh 	register_t *retval;
    395      1.4     eeh {
    396      1.8     eeh 	struct compat_43_netbsd32_killpg_args /* {
    397      1.4     eeh 		syscallarg(int) pgid;
    398      1.4     eeh 		syscallarg(int) signum;
    399      1.4     eeh 	} */ *uap = v;
    400      1.4     eeh 	struct compat_43_sys_killpg_args ua;
    401      1.4     eeh 
    402      1.6     mrg 	NETBSD32TO64_UAP(pgid);
    403      1.6     mrg 	NETBSD32TO64_UAP(signum);
    404      1.4     eeh 	return (compat_43_sys_killpg(p, &ua, retval));
    405      1.4     eeh }
    406      1.4     eeh 
    407      1.1     mrg /* virtual memory syscalls */
    408      1.1     mrg int
    409      1.8     eeh compat_43_netbsd32_ommap(p, v, retval)
    410      1.1     mrg 	struct proc *p;
    411      1.1     mrg 	void *v;
    412      1.1     mrg 	register_t *retval;
    413      1.1     mrg {
    414      1.8     eeh 	struct compat_43_netbsd32_ommap_args /* {
    415      1.5     mrg 		syscallarg(netbsd32_caddr_t) addr;
    416      1.5     mrg 		syscallarg(netbsd32_size_t) len;
    417      1.1     mrg 		syscallarg(int) prot;
    418      1.1     mrg 		syscallarg(int) flags;
    419      1.1     mrg 		syscallarg(int) fd;
    420      1.5     mrg 		syscallarg(netbsd32_long) pos;
    421      1.1     mrg 	} */ *uap = v;
    422      1.1     mrg 	struct compat_43_sys_mmap_args ua;
    423      1.1     mrg 
    424      1.6     mrg 	NETBSD32TOX64_UAP(addr, caddr_t);
    425      1.6     mrg 	NETBSD32TOX_UAP(len, size_t);
    426      1.6     mrg 	NETBSD32TO64_UAP(prot);
    427      1.6     mrg 	NETBSD32TO64_UAP(flags);
    428      1.6     mrg 	NETBSD32TO64_UAP(fd);
    429      1.6     mrg 	NETBSD32TOX_UAP(pos, long);
    430      1.2     mrg 	return (compat_43_sys_mmap(p, &ua, retval));
    431      1.4     eeh }
    432      1.4     eeh 
    433      1.1     mrg /* network syscalls */
    434      1.1     mrg int
    435      1.8     eeh compat_43_netbsd32_oaccept(p, v, retval)
    436      1.1     mrg 	struct proc *p;
    437      1.1     mrg 	void *v;
    438      1.1     mrg 	register_t *retval;
    439      1.1     mrg {
    440      1.8     eeh 	struct compat_43_netbsd32_oaccept_args /* {
    441      1.1     mrg 		syscallarg(int) s;
    442      1.5     mrg 		syscallarg(netbsd32_caddr_t) name;
    443      1.5     mrg 		syscallarg(netbsd32_intp) anamelen;
    444      1.1     mrg 	} */ *uap = v;
    445      1.1     mrg 	struct compat_43_sys_accept_args ua;
    446      1.1     mrg 
    447      1.6     mrg 	NETBSD32TOX_UAP(s, int);
    448      1.6     mrg 	NETBSD32TOX64_UAP(name, caddr_t);
    449      1.6     mrg 	NETBSD32TOP_UAP(anamelen, int);
    450      1.2     mrg 	return (compat_43_sys_accept(p, &ua, retval));
    451      1.1     mrg }
    452      1.1     mrg 
    453      1.1     mrg int
    454      1.8     eeh compat_43_netbsd32_osend(p, v, retval)
    455      1.1     mrg 	struct proc *p;
    456      1.1     mrg 	void *v;
    457      1.1     mrg 	register_t *retval;
    458      1.1     mrg {
    459      1.8     eeh 	struct compat_43_netbsd32_osend_args /* {
    460      1.1     mrg 		syscallarg(int) s;
    461      1.5     mrg 		syscallarg(netbsd32_caddr_t) buf;
    462      1.1     mrg 		syscallarg(int) len;
    463      1.1     mrg 		syscallarg(int) flags;
    464      1.1     mrg 	} */ *uap = v;
    465      1.1     mrg 	struct compat_43_sys_send_args ua;
    466      1.1     mrg 
    467      1.6     mrg 	NETBSD32TO64_UAP(s);
    468      1.6     mrg 	NETBSD32TOX64_UAP(buf, caddr_t);
    469      1.6     mrg 	NETBSD32TO64_UAP(len);
    470      1.6     mrg 	NETBSD32TO64_UAP(flags);
    471      1.2     mrg 	return (compat_43_sys_send(p, &ua, retval));
    472      1.1     mrg }
    473      1.1     mrg 
    474      1.1     mrg int
    475      1.8     eeh compat_43_netbsd32_orecv(p, v, retval)
    476      1.1     mrg 	struct proc *p;
    477      1.1     mrg 	void *v;
    478      1.1     mrg 	register_t *retval;
    479      1.1     mrg {
    480      1.8     eeh 	struct compat_43_netbsd32_orecv_args /* {
    481      1.1     mrg 		syscallarg(int) s;
    482      1.5     mrg 		syscallarg(netbsd32_caddr_t) buf;
    483      1.1     mrg 		syscallarg(int) len;
    484      1.1     mrg 		syscallarg(int) flags;
    485      1.1     mrg 	} */ *uap = v;
    486      1.1     mrg 	struct compat_43_sys_recv_args ua;
    487      1.1     mrg 
    488      1.6     mrg 	NETBSD32TO64_UAP(s);
    489      1.6     mrg 	NETBSD32TOX64_UAP(buf, caddr_t);
    490      1.6     mrg 	NETBSD32TO64_UAP(len);
    491      1.6     mrg 	NETBSD32TO64_UAP(flags);
    492      1.2     mrg 	return (compat_43_sys_recv(p, &ua, retval));
    493      1.1     mrg }
    494      1.1     mrg 
    495      1.1     mrg /*
    496      1.1     mrg  * XXX convert these to use a common iovec code to the native
    497      1.1     mrg  * netbsd call.
    498      1.1     mrg  */
    499      1.1     mrg int
    500      1.8     eeh compat_43_netbsd32_orecvmsg(p, v, retval)
    501      1.1     mrg 	struct proc *p;
    502      1.1     mrg 	void *v;
    503      1.1     mrg 	register_t *retval;
    504      1.1     mrg {
    505      1.8     eeh 	struct compat_43_netbsd32_orecvmsg_args /* {
    506      1.1     mrg 		syscallarg(int) s;
    507      1.5     mrg 		syscallarg(netbsd32_omsghdrp_t) msg;
    508      1.1     mrg 		syscallarg(int) flags;
    509      1.1     mrg 	} */ *uap = v;
    510      1.1     mrg 	struct compat_43_sys_recvmsg_args ua;
    511  1.8.2.3  bouyer 	struct omsghdr omh, *sgsbp;
    512  1.8.2.3  bouyer 	struct netbsd32_omsghdr omh32;
    513  1.8.2.3  bouyer 	struct iovec iov, *sgsbp2;
    514  1.8.2.3  bouyer 	struct netbsd32_iovec iov32, *iovec32p;
    515  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    516  1.8.2.3  bouyer 	int i, error, rv;
    517      1.1     mrg 
    518      1.6     mrg 	NETBSD32TO64_UAP(s);
    519      1.6     mrg 	NETBSD32TO64_UAP(flags);
    520      1.1     mrg 
    521  1.8.2.3  bouyer 	/*
    522  1.8.2.3  bouyer 	 * this is annoying:
    523  1.8.2.3  bouyer 	 *	- copyin the msghdr32 struct
    524  1.8.2.3  bouyer 	 *	- stackgap_alloc a msghdr struct
    525  1.8.2.3  bouyer 	 *	- convert msghdr32 to msghdr:
    526  1.8.2.3  bouyer 	 *		- stackgap_alloc enough space for iovec's
    527  1.8.2.3  bouyer 	 *		- copy in each iov32, and convert to iov
    528  1.8.2.3  bouyer 	 *		- copyout converted iov
    529  1.8.2.3  bouyer 	 *	- copyout converted msghdr
    530  1.8.2.3  bouyer 	 *	- do real syscall
    531  1.8.2.3  bouyer 	 *	- copyin the msghdr struct
    532  1.8.2.3  bouyer 	 *	- convert msghdr to msghdr32
    533  1.8.2.3  bouyer 	 *		- copyin each iov and convert to iov32
    534  1.8.2.3  bouyer 	 *		- copyout converted iov32
    535  1.8.2.3  bouyer 	 *	- copyout converted msghdr32
    536  1.8.2.3  bouyer 	 */
    537  1.8.2.3  bouyer 	error = copyin((caddr_t)(u_long)SCARG(uap, msg), &omh32, sizeof(omh32));
    538  1.8.2.3  bouyer 	if (error)
    539  1.8.2.3  bouyer 		return (error);
    540  1.8.2.3  bouyer 
    541  1.8.2.3  bouyer 	SCARG(&ua, msg) = sgsbp = stackgap_alloc(&sg, sizeof(omh));
    542  1.8.2.3  bouyer 	omh.msg_name = (caddr_t)(u_long)omh32.msg_name;
    543  1.8.2.3  bouyer 	omh.msg_namelen = omh32.msg_namelen;
    544  1.8.2.3  bouyer 	omh.msg_iovlen = (size_t)omh32.msg_iovlen;
    545  1.8.2.3  bouyer 	omh.msg_iov = sgsbp2 = stackgap_alloc(&sg, sizeof(struct iovec) * omh.msg_iovlen);
    546  1.8.2.3  bouyer 	iovec32p = (struct netbsd32_iovec *)(u_long)omh32.msg_iov;
    547  1.8.2.3  bouyer 	for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
    548  1.8.2.3  bouyer 		error = copyin(iovec32p, &iov32, sizeof(iov32));
    549  1.8.2.3  bouyer 		if (error)
    550  1.8.2.3  bouyer 			return (error);
    551  1.8.2.3  bouyer 		iov.iov_base = (struct iovec *)(u_long)iovec32p->iov_base;
    552  1.8.2.3  bouyer 		iov.iov_len = (size_t)iovec32p->iov_len;
    553  1.8.2.3  bouyer 		error = copyout(&iov, sgsbp2, sizeof(iov));
    554  1.8.2.3  bouyer 		if (error)
    555  1.8.2.3  bouyer 			return (error);
    556      1.1     mrg 	}
    557  1.8.2.3  bouyer 	omh.msg_accrights = (caddr_t)(u_long)omh32.msg_accrights;
    558  1.8.2.3  bouyer 	omh.msg_accrightslen = omh32.msg_accrightslen;
    559  1.8.2.3  bouyer 	error = copyout(&omh, sgsbp, sizeof(omh));
    560  1.8.2.3  bouyer 	if (error)
    561  1.8.2.3  bouyer 		return (error);
    562      1.1     mrg 
    563  1.8.2.3  bouyer 	rv = compat_43_sys_recvmsg(p, &ua, retval);
    564      1.1     mrg 
    565  1.8.2.3  bouyer 	error = copyin(sgsbp, &omh, sizeof(omh));
    566  1.8.2.3  bouyer 	if (error)
    567  1.8.2.3  bouyer 		return error;
    568  1.8.2.3  bouyer 	omh32.msg_name = (netbsd32_caddr_t)(u_long)omh.msg_name;
    569  1.8.2.3  bouyer 	omh32.msg_namelen = omh.msg_namelen;
    570  1.8.2.3  bouyer 	omh32.msg_iovlen = (netbsd32_size_t)omh.msg_iovlen;
    571  1.8.2.3  bouyer 	iovec32p = (struct netbsd32_iovec *)(u_long)omh32.msg_iov;
    572  1.8.2.3  bouyer 	sgsbp2 = omh.msg_iov;
    573  1.8.2.3  bouyer 	for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
    574  1.8.2.3  bouyer 		error = copyin(sgsbp2, &iov, sizeof(iov));
    575  1.8.2.3  bouyer 		if (error)
    576  1.8.2.3  bouyer 			return (error);
    577  1.8.2.3  bouyer 		iov32.iov_base = (netbsd32_iovecp_t)(u_long)iov.iov_base;
    578  1.8.2.3  bouyer 		iov32.iov_len = (netbsd32_size_t)iov.iov_len;
    579  1.8.2.3  bouyer 		error = copyout(&iov32, iovec32p, sizeof(iov32));
    580  1.8.2.3  bouyer 		if (error)
    581  1.8.2.3  bouyer 			return (error);
    582  1.8.2.3  bouyer 	}
    583  1.8.2.3  bouyer 	omh32.msg_accrights = (netbsd32_caddr_t)(u_long)omh.msg_accrights;
    584  1.8.2.3  bouyer 	omh32.msg_accrightslen = omh.msg_accrightslen;
    585  1.8.2.3  bouyer 
    586  1.8.2.3  bouyer 	error = copyout(&omh32, (char *)(u_long)SCARG(uap, msg), sizeof(omh32));
    587  1.8.2.3  bouyer 	if (error)
    588  1.8.2.3  bouyer 		return error;
    589  1.8.2.3  bouyer 
    590  1.8.2.3  bouyer 	return (rv);
    591      1.1     mrg }
    592      1.1     mrg 
    593      1.1     mrg int
    594      1.8     eeh compat_43_netbsd32_osendmsg(p, v, retval)
    595      1.1     mrg 	struct proc *p;
    596      1.1     mrg 	void *v;
    597      1.1     mrg 	register_t *retval;
    598      1.1     mrg {
    599      1.8     eeh 	struct compat_43_netbsd32_osendmsg_args /* {
    600      1.1     mrg 		syscallarg(int) s;
    601      1.5     mrg 		syscallarg(netbsd32_caddr_t) msg;
    602      1.1     mrg 		syscallarg(int) flags;
    603      1.1     mrg 	} */ *uap = v;
    604  1.8.2.3  bouyer 	struct compat_43_sys_recvmsg_args ua;
    605  1.8.2.3  bouyer 	struct omsghdr omh, *sgsbp;
    606  1.8.2.3  bouyer 	struct netbsd32_omsghdr omh32;
    607  1.8.2.3  bouyer 	struct iovec iov, *sgsbp2;
    608  1.8.2.3  bouyer 	struct netbsd32_iovec iov32, *iovec32p;
    609  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    610  1.8.2.3  bouyer 	int i, error, rv;
    611      1.1     mrg 
    612      1.6     mrg 	NETBSD32TO64_UAP(s);
    613      1.6     mrg 	NETBSD32TO64_UAP(flags);
    614      1.1     mrg 
    615  1.8.2.3  bouyer 	/*
    616  1.8.2.3  bouyer 	 * this is annoying:
    617  1.8.2.3  bouyer 	 *	- copyin the msghdr32 struct
    618  1.8.2.3  bouyer 	 *	- stackgap_alloc a msghdr struct
    619  1.8.2.3  bouyer 	 *	- convert msghdr32 to msghdr:
    620  1.8.2.3  bouyer 	 *		- stackgap_alloc enough space for iovec's
    621  1.8.2.3  bouyer 	 *		- copy in each iov32, and convert to iov
    622  1.8.2.3  bouyer 	 *		- copyout converted iov
    623  1.8.2.3  bouyer 	 *	- copyout converted msghdr
    624  1.8.2.3  bouyer 	 *	- do real syscall
    625  1.8.2.3  bouyer 	 *	- copyin the msghdr struct
    626  1.8.2.3  bouyer 	 *	- convert msghdr to msghdr32
    627  1.8.2.3  bouyer 	 *		- copyin each iov and convert to iov32
    628  1.8.2.3  bouyer 	 *		- copyout converted iov32
    629  1.8.2.3  bouyer 	 *	- copyout converted msghdr32
    630  1.8.2.3  bouyer 	 */
    631  1.8.2.3  bouyer 	error = copyin((caddr_t)(u_long)SCARG(uap, msg), &omh32, sizeof(omh32));
    632  1.8.2.3  bouyer 	if (error)
    633  1.8.2.3  bouyer 		return (error);
    634  1.8.2.3  bouyer 
    635  1.8.2.3  bouyer 	SCARG(&ua, msg) = sgsbp = stackgap_alloc(&sg, sizeof(omh));
    636  1.8.2.3  bouyer 	omh.msg_name = (caddr_t)(u_long)omh32.msg_name;
    637  1.8.2.3  bouyer 	omh.msg_namelen = omh32.msg_namelen;
    638  1.8.2.3  bouyer 	omh.msg_iovlen = (size_t)omh32.msg_iovlen;
    639  1.8.2.3  bouyer 	omh.msg_iov = sgsbp2 = stackgap_alloc(&sg, sizeof(struct iovec) * omh.msg_iovlen);
    640  1.8.2.3  bouyer 	iovec32p = (struct netbsd32_iovec *)(u_long)omh32.msg_iov;
    641  1.8.2.3  bouyer 	for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
    642  1.8.2.3  bouyer 		error = copyin(iovec32p, &iov32, sizeof(iov32));
    643  1.8.2.3  bouyer 		if (error)
    644  1.8.2.3  bouyer 			return (error);
    645  1.8.2.3  bouyer 		iov.iov_base = (struct iovec *)(u_long)iovec32p->iov_base;
    646  1.8.2.3  bouyer 		iov.iov_len = (size_t)iovec32p->iov_len;
    647  1.8.2.3  bouyer 		error = copyout(&iov, sgsbp2, sizeof(iov));
    648  1.8.2.3  bouyer 		if (error)
    649  1.8.2.3  bouyer 			return (error);
    650      1.1     mrg 	}
    651  1.8.2.3  bouyer 	omh.msg_accrights = (caddr_t)(u_long)omh32.msg_accrights;
    652  1.8.2.3  bouyer 	omh.msg_accrightslen = omh32.msg_accrightslen;
    653  1.8.2.3  bouyer 	error = copyout(&omh, sgsbp, sizeof(omh));
    654  1.8.2.3  bouyer 	if (error)
    655  1.8.2.3  bouyer 		return (error);
    656  1.8.2.3  bouyer 
    657  1.8.2.3  bouyer 	rv = compat_43_sys_sendmsg(p, &ua, retval);
    658  1.8.2.3  bouyer 
    659  1.8.2.3  bouyer 	error = copyin(sgsbp, &omh, sizeof(omh));
    660  1.8.2.3  bouyer 	if (error)
    661  1.8.2.3  bouyer 		return error;
    662  1.8.2.3  bouyer 	omh32.msg_name = (netbsd32_caddr_t)(u_long)omh.msg_name;
    663  1.8.2.3  bouyer 	omh32.msg_namelen = omh.msg_namelen;
    664  1.8.2.3  bouyer 	omh32.msg_iovlen = (netbsd32_size_t)omh.msg_iovlen;
    665  1.8.2.3  bouyer 	iovec32p = (struct netbsd32_iovec *)(u_long)omh32.msg_iov;
    666  1.8.2.3  bouyer 	sgsbp2 = omh.msg_iov;
    667  1.8.2.3  bouyer 	for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
    668  1.8.2.3  bouyer 		error = copyin(sgsbp2, &iov, sizeof(iov));
    669  1.8.2.3  bouyer 		if (error)
    670  1.8.2.3  bouyer 			return (error);
    671  1.8.2.3  bouyer 		iov32.iov_base = (netbsd32_iovecp_t)(u_long)iov.iov_base;
    672  1.8.2.3  bouyer 		iov32.iov_len = (netbsd32_size_t)iov.iov_len;
    673  1.8.2.3  bouyer 		error = copyout(&iov32, iovec32p, sizeof(iov32));
    674  1.8.2.3  bouyer 		if (error)
    675  1.8.2.3  bouyer 			return (error);
    676  1.8.2.3  bouyer 	}
    677  1.8.2.3  bouyer 	omh32.msg_accrights = (netbsd32_caddr_t)(u_long)omh.msg_accrights;
    678  1.8.2.3  bouyer 	omh32.msg_accrightslen = omh.msg_accrightslen;
    679      1.1     mrg 
    680  1.8.2.3  bouyer 	error = copyout(&omh32, (char *)(u_long)SCARG(uap, msg), sizeof(omh32));
    681  1.8.2.3  bouyer 	if (error)
    682  1.8.2.3  bouyer 		return error;
    683      1.1     mrg 
    684  1.8.2.3  bouyer 	return (rv);
    685      1.1     mrg }
    686      1.1     mrg 
    687      1.1     mrg int
    688      1.8     eeh compat_43_netbsd32_orecvfrom(p, v, retval)
    689      1.1     mrg 	struct proc *p;
    690      1.1     mrg 	void *v;
    691      1.1     mrg 	register_t *retval;
    692      1.1     mrg {
    693      1.8     eeh 	struct compat_43_netbsd32_orecvfrom_args /* {
    694      1.1     mrg 		syscallarg(int) s;
    695      1.5     mrg 		syscallarg(netbsd32_caddr_t) buf;
    696      1.5     mrg 		syscallarg(netbsd32_size_t) len;
    697      1.1     mrg 		syscallarg(int) flags;
    698      1.5     mrg 		syscallarg(netbsd32_caddr_t) from;
    699      1.5     mrg 		syscallarg(netbsd32_intp) fromlenaddr;
    700      1.1     mrg 	} */ *uap = v;
    701      1.1     mrg 	struct compat_43_sys_recvfrom_args ua;
    702      1.1     mrg 
    703      1.6     mrg 	NETBSD32TO64_UAP(s);
    704      1.6     mrg 	NETBSD32TOX64_UAP(buf, caddr_t);
    705      1.6     mrg 	NETBSD32TOX_UAP(len, size_t);
    706      1.6     mrg 	NETBSD32TO64_UAP(flags);
    707      1.6     mrg 	NETBSD32TOX64_UAP(from, caddr_t);
    708      1.6     mrg 	NETBSD32TOP_UAP(fromlenaddr, int);
    709      1.1     mrg 	return (compat_43_sys_recvfrom(p, &ua, retval));
    710      1.1     mrg }
    711      1.1     mrg 
    712      1.1     mrg int
    713      1.8     eeh compat_43_netbsd32_ogetsockname(p, v, retval)
    714      1.1     mrg 	struct proc *p;
    715      1.1     mrg 	void *v;
    716      1.1     mrg 	register_t *retval;
    717      1.1     mrg {
    718      1.8     eeh 	struct compat_43_netbsd32_ogetsockname_args /* {
    719      1.1     mrg 		syscallarg(int) fdec;
    720      1.5     mrg 		syscallarg(netbsd32_caddr_t) asa;
    721      1.5     mrg 		syscallarg(netbsd32_intp) alen;
    722      1.1     mrg 	} */ *uap = v;
    723      1.1     mrg 	struct compat_43_sys_getsockname_args ua;
    724      1.1     mrg 
    725      1.6     mrg 	NETBSD32TO64_UAP(fdec);
    726      1.6     mrg 	NETBSD32TOX64_UAP(asa, caddr_t);
    727      1.6     mrg 	NETBSD32TOP_UAP(alen, int);
    728      1.1     mrg 	return (compat_43_sys_getsockname(p, &ua, retval));
    729      1.1     mrg }
    730      1.1     mrg 
    731      1.1     mrg int
    732      1.8     eeh compat_43_netbsd32_ogetpeername(p, v, retval)
    733      1.1     mrg 	struct proc *p;
    734      1.1     mrg 	void *v;
    735      1.1     mrg 	register_t *retval;
    736      1.1     mrg {
    737      1.8     eeh 	struct compat_43_netbsd32_ogetpeername_args /* {
    738      1.1     mrg 		syscallarg(int) fdes;
    739      1.5     mrg 		syscallarg(netbsd32_caddr_t) asa;
    740      1.5     mrg 		syscallarg(netbsd32_intp) alen;
    741      1.1     mrg 	} */ *uap = v;
    742      1.1     mrg 	struct compat_43_sys_getpeername_args ua;
    743      1.1     mrg 
    744      1.6     mrg 	NETBSD32TO64_UAP(fdes);
    745      1.6     mrg 	NETBSD32TOX64_UAP(asa, caddr_t);
    746      1.6     mrg 	NETBSD32TOP_UAP(alen, int);
    747      1.1     mrg 	return (compat_43_sys_getpeername(p, &ua, retval));
    748      1.1     mrg }
    749      1.1     mrg 
    750      1.1     mrg /* signal syscalls */
    751      1.1     mrg int
    752      1.8     eeh compat_43_netbsd32_osigvec(p, v, retval)
    753      1.1     mrg 	struct proc *p;
    754      1.1     mrg 	void *v;
    755      1.1     mrg 	register_t *retval;
    756      1.1     mrg {
    757      1.8     eeh 	struct compat_43_netbsd32_osigvec_args /* {
    758      1.1     mrg 		syscallarg(int) signum;
    759      1.5     mrg 		syscallarg(netbsd32_sigvecp_t) nsv;
    760      1.5     mrg 		syscallarg(netbsd32_sigvecp_t) osv;
    761      1.1     mrg 	} */ *uap = v;
    762      1.1     mrg 	struct compat_43_sys_sigvec_args ua;
    763  1.8.2.3  bouyer 	struct netbsd32_sigvec sv32;
    764  1.8.2.3  bouyer 	struct sigvec sv, *sgnsvp, *sgosvp;
    765  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    766  1.8.2.3  bouyer 	int rv, error;
    767      1.1     mrg 
    768      1.6     mrg 	NETBSD32TO64_UAP(signum);
    769      1.1     mrg 	if (SCARG(uap, osv))
    770  1.8.2.3  bouyer 		SCARG(&ua, osv) = sgosvp = stackgap_alloc(&sg, sizeof(sv));
    771      1.1     mrg 	else
    772      1.1     mrg 		SCARG(&ua, osv) = NULL;
    773      1.1     mrg 	if (SCARG(uap, nsv)) {
    774  1.8.2.3  bouyer 		SCARG(&ua, nsv) = sgnsvp = stackgap_alloc(&sg, sizeof(sv));
    775  1.8.2.3  bouyer 		error = copyin((caddr_t)(u_long)SCARG(uap, nsv), &sv32, sizeof(sv32));
    776  1.8.2.3  bouyer 		if (error)
    777  1.8.2.3  bouyer 			return (error);
    778  1.8.2.3  bouyer 		sv.sv_handler = (void *)(u_long)sv32.sv_handler;
    779  1.8.2.3  bouyer 		sv.sv_mask = sv32.sv_mask;
    780  1.8.2.3  bouyer 		sv.sv_flags = sv32.sv_flags;
    781  1.8.2.3  bouyer 		error = copyout(&sv, sgnsvp, sizeof(sv));
    782  1.8.2.3  bouyer 		if (error)
    783  1.8.2.3  bouyer 			return (error);
    784      1.1     mrg 	} else
    785      1.1     mrg 		SCARG(&ua, nsv) = NULL;
    786      1.1     mrg 	rv = compat_43_sys_sigvec(p, &ua, retval);
    787      1.1     mrg 	if (rv)
    788      1.1     mrg 		return (rv);
    789      1.1     mrg 
    790      1.1     mrg 	if (SCARG(uap, osv)) {
    791  1.8.2.3  bouyer 		error = copyin(sgosvp, &sv, sizeof(sv));
    792  1.8.2.3  bouyer 		if (error)
    793  1.8.2.3  bouyer 			return (error);
    794  1.8.2.3  bouyer 		sv32.sv_handler = (netbsd32_sigvecp_t)(u_long)sv.sv_handler;
    795  1.8.2.3  bouyer 		sv32.sv_mask = sv.sv_mask;
    796  1.8.2.3  bouyer 		sv32.sv_flags = sv.sv_flags;
    797  1.8.2.3  bouyer 		error = copyout(&sv32, (caddr_t)(u_long)SCARG(uap, osv), sizeof(sv32));
    798  1.8.2.3  bouyer 		if (error)
    799  1.8.2.3  bouyer 			return (error);
    800      1.1     mrg 	}
    801      1.1     mrg 
    802      1.1     mrg 	return (0);
    803      1.4     eeh }
    804      1.4     eeh 
    805      1.4     eeh int
    806      1.8     eeh compat_43_netbsd32_sigblock(p, v, retval)
    807      1.4     eeh 	struct proc *p;
    808      1.4     eeh 	void *v;
    809      1.4     eeh 	register_t *retval;
    810      1.4     eeh {
    811      1.8     eeh 	struct compat_43_netbsd32_sigblock_args /* {
    812      1.4     eeh 		syscallarg(int) mask;
    813      1.4     eeh 	} */ *uap = v;
    814      1.4     eeh 	struct compat_43_sys_sigblock_args ua;
    815      1.4     eeh 
    816      1.6     mrg 	NETBSD32TO64_UAP(mask);
    817      1.4     eeh 	return (compat_43_sys_sigblock(p, &ua, retval));
    818      1.4     eeh }
    819      1.4     eeh 
    820      1.4     eeh int
    821      1.8     eeh compat_43_netbsd32_sigsetmask(p, v, retval)
    822      1.4     eeh 	struct proc *p;
    823      1.4     eeh 	void *v;
    824      1.4     eeh 	register_t *retval;
    825      1.4     eeh {
    826      1.8     eeh 	struct compat_43_netbsd32_sigsetmask_args /* {
    827      1.4     eeh 		syscallarg(int) mask;
    828      1.4     eeh 	} */ *uap = v;
    829      1.4     eeh 	struct compat_43_sys_sigsetmask_args ua;
    830      1.4     eeh 
    831      1.6     mrg 	NETBSD32TO64_UAP(mask);
    832      1.4     eeh 	return (compat_43_sys_sigsetmask(p, &ua, retval));
    833      1.1     mrg }
    834      1.1     mrg 
    835      1.1     mrg int
    836      1.8     eeh compat_43_netbsd32_osigstack(p, v, retval)
    837      1.1     mrg 	struct proc *p;
    838      1.1     mrg 	void *v;
    839      1.1     mrg 	register_t *retval;
    840      1.1     mrg {
    841      1.8     eeh 	struct compat_43_netbsd32_osigstack_args /* {
    842      1.5     mrg 		syscallarg(netbsd32_sigstackp_t) nss;
    843      1.5     mrg 		syscallarg(netbsd32_sigstackp_t) oss;
    844      1.1     mrg 	} */ *uap = v;
    845      1.1     mrg 	struct compat_43_sys_sigstack_args ua;
    846  1.8.2.3  bouyer 	struct netbsd32_sigstack ss32;
    847  1.8.2.3  bouyer 	struct sigstack ss, *sgossp, *sgnssp;
    848  1.8.2.3  bouyer 	caddr_t sg = stackgap_init(p->p_emul);
    849  1.8.2.3  bouyer 	int error, rv;
    850      1.1     mrg 
    851      1.1     mrg 	if (SCARG(uap, oss))
    852  1.8.2.3  bouyer 		SCARG(&ua, oss) = sgossp = stackgap_alloc(&sg, sizeof(ss));
    853      1.1     mrg 	else
    854      1.1     mrg 		SCARG(&ua, oss) = NULL;
    855      1.1     mrg 	if (SCARG(uap, nss)) {
    856  1.8.2.3  bouyer 		SCARG(&ua, nss) = sgnssp = stackgap_alloc(&sg, sizeof(ss));
    857  1.8.2.3  bouyer 		error = copyin((caddr_t)(u_long)SCARG(uap, nss), &ss32, sizeof(ss32));
    858  1.8.2.3  bouyer 		if (error)
    859  1.8.2.3  bouyer 			return (error);
    860  1.8.2.3  bouyer 		ss.ss_sp = (void *)(u_long)ss32.ss_sp;
    861  1.8.2.3  bouyer 		ss.ss_onstack = ss32.ss_onstack;
    862  1.8.2.3  bouyer 		error = copyout(&ss, sgnssp, sizeof(ss));
    863  1.8.2.3  bouyer 		if (error)
    864  1.8.2.3  bouyer 			return (error);
    865      1.1     mrg 	} else
    866      1.1     mrg 		SCARG(&ua, nss) = NULL;
    867      1.1     mrg 
    868      1.1     mrg 	rv = compat_43_sys_sigstack(p, &ua, retval);
    869      1.1     mrg 	if (rv)
    870      1.1     mrg 		return (rv);
    871      1.1     mrg 
    872      1.1     mrg 	if (SCARG(uap, oss)) {
    873  1.8.2.3  bouyer 		error = copyin(sgossp, &ss, sizeof(ss));
    874  1.8.2.3  bouyer 		if (error)
    875  1.8.2.3  bouyer 			return (error);
    876  1.8.2.3  bouyer 		ss32.ss_sp = (netbsd32_sigstackp_t)(u_long)ss.ss_sp;
    877  1.8.2.3  bouyer 		ss32.ss_onstack = ss.ss_onstack;
    878  1.8.2.3  bouyer 		error = copyout(&ss32, (caddr_t)(u_long)SCARG(uap, oss), sizeof(ss32));
    879  1.8.2.3  bouyer 		if (error)
    880  1.8.2.3  bouyer 			return (error);
    881      1.1     mrg 	}
    882      1.1     mrg 
    883      1.1     mrg 	return (0);
    884      1.1     mrg }
    885