Home | History | Annotate | Line # | Download | only in netbsd32
netbsd32_compat_43.c revision 1.8.2.2
      1  1.8.2.2  bouyer /*	$NetBSD: netbsd32_compat_43.c,v 1.8.2.2 2000/12/08 09:08:33 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 static void netbsd32_from_stat43 __P((struct stat43 *, struct netbsd32_stat43 *));
     53  1.8.2.1  bouyer int compat_43_netbsd32_sethostid __P((struct proc *, void *, register_t *));
     54  1.8.2.1  bouyer int compat_43_netbsd32_killpg __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 int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
     57  1.8.2.1  bouyer 
     58  1.8.2.1  bouyer static void
     59      1.5     mrg netbsd32_from_stat43(sp43, sp32)
     60      1.1     mrg 	struct stat43 *sp43;
     61      1.5     mrg 	struct netbsd32_stat43 *sp32;
     62      1.1     mrg {
     63      1.1     mrg 
     64      1.1     mrg 	sp32->st_dev = sp43->st_dev;
     65      1.1     mrg 	sp32->st_ino = sp43->st_ino;
     66      1.1     mrg 	sp32->st_mode = sp43->st_mode;
     67      1.1     mrg 	sp32->st_nlink = sp43->st_nlink;
     68      1.1     mrg 	sp32->st_uid = sp43->st_uid;
     69      1.1     mrg 	sp32->st_gid = sp43->st_gid;
     70      1.1     mrg 	sp32->st_rdev = sp43->st_rdev;
     71      1.1     mrg 	sp32->st_size = sp43->st_size;
     72      1.1     mrg 	sp32->st_atimespec.tv_sec = sp43->st_atimespec.tv_sec;
     73      1.1     mrg 	sp32->st_atimespec.tv_nsec = sp43->st_atimespec.tv_nsec;
     74      1.1     mrg 	sp32->st_mtimespec.tv_sec = sp43->st_mtimespec.tv_sec;
     75      1.1     mrg 	sp32->st_mtimespec.tv_nsec = sp43->st_mtimespec.tv_nsec;
     76      1.1     mrg 	sp32->st_ctimespec.tv_sec = sp43->st_ctimespec.tv_sec;
     77      1.1     mrg 	sp32->st_ctimespec.tv_nsec = sp43->st_ctimespec.tv_nsec;
     78      1.1     mrg 	sp32->st_blksize = sp43->st_blksize;
     79      1.1     mrg 	sp32->st_blocks = sp43->st_blocks;
     80      1.1     mrg 	sp32->st_flags = sp43->st_flags;
     81      1.1     mrg 	sp32->st_gen = sp43->st_gen;
     82      1.1     mrg }
     83      1.1     mrg 
     84      1.1     mrg /* file system syscalls */
     85      1.1     mrg int
     86      1.8     eeh compat_43_netbsd32_ocreat(p, v, retval)
     87      1.1     mrg 	struct proc *p;
     88      1.1     mrg 	void *v;
     89      1.1     mrg 	register_t *retval;
     90      1.1     mrg {
     91      1.8     eeh 	struct compat_43_netbsd32_ocreat_args /* {
     92      1.5     mrg 		syscallarg(const netbsd32_charp) path;
     93      1.1     mrg 		syscallarg(mode_t) mode;
     94      1.1     mrg 	} */ *uap = v;
     95      1.1     mrg 	struct sys_open_args  ua;
     96      1.1     mrg 	caddr_t sg;
     97      1.1     mrg 
     98      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
     99      1.6     mrg 	NETBSD32TO64_UAP(mode);
    100      1.1     mrg 	SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC;
    101      1.1     mrg 	sg = stackgap_init(p->p_emul);
    102  1.8.2.2  bouyer 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
    103      1.1     mrg 
    104      1.1     mrg 	return (sys_open(p, &ua, retval));
    105      1.1     mrg }
    106      1.1     mrg 
    107      1.1     mrg int
    108      1.8     eeh compat_43_netbsd32_olseek(p, v, retval)
    109      1.1     mrg 	struct proc *p;
    110      1.1     mrg 	void *v;
    111      1.1     mrg 	register_t *retval;
    112      1.1     mrg {
    113      1.8     eeh 	struct compat_43_netbsd32_olseek_args /* {
    114      1.1     mrg 		syscallarg(int) fd;
    115      1.5     mrg 		syscallarg(netbsd32_long) offset;
    116      1.1     mrg 		syscallarg(int) whence;
    117      1.1     mrg 	} */ *uap = v;
    118      1.1     mrg 	struct sys_lseek_args ua;
    119      1.1     mrg 	int rv;
    120      1.1     mrg 	off_t rt;
    121      1.1     mrg 
    122      1.1     mrg 	SCARG(&ua, fd) = SCARG(uap, fd);
    123      1.6     mrg 	NETBSD32TOX_UAP(offset, long);
    124      1.6     mrg 	NETBSD32TO64_UAP(whence);
    125      1.1     mrg 	rv = sys_lseek(p, &ua, (register_t *)&rt);
    126      1.5     mrg 	*(netbsd32_long *)retval = rt;
    127      1.1     mrg 
    128      1.1     mrg 	return (rv);
    129      1.1     mrg }
    130      1.1     mrg 
    131      1.1     mrg int
    132      1.8     eeh compat_43_netbsd32_stat43(p, v, retval)
    133      1.1     mrg 	struct proc *p;
    134      1.1     mrg 	void *v;
    135      1.1     mrg 	register_t *retval;
    136      1.1     mrg {
    137      1.8     eeh 	struct compat_43_netbsd32_stat43_args /* {
    138      1.5     mrg 		syscallarg(const netbsd32_charp) path;
    139      1.5     mrg 		syscallarg(netbsd32_stat43p_t) ub;
    140      1.1     mrg 	} */ *uap = v;
    141      1.5     mrg 	struct netbsd32_stat43 *sp32;
    142      1.1     mrg 	struct stat43 sb43;
    143      1.1     mrg 	struct stat43 *sp43 = &sb43;
    144      1.1     mrg 	struct compat_43_sys_stat_args ua;
    145      1.1     mrg 	caddr_t sg;
    146      1.1     mrg 	int rv;
    147      1.1     mrg 
    148      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
    149      1.1     mrg 	SCARG(&ua, ub) = &sb43;
    150      1.1     mrg 	sg = stackgap_init(p->p_emul);
    151  1.8.2.2  bouyer 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
    152      1.1     mrg 
    153      1.1     mrg 	rv = compat_43_sys_stat(p, &ua, retval);
    154      1.1     mrg 
    155      1.5     mrg 	sp32 = (struct netbsd32_stat43 *)(u_long)SCARG(uap, ub);
    156      1.5     mrg 	netbsd32_from_stat43(sp43, sp32);
    157      1.1     mrg 
    158      1.1     mrg 	return (rv);
    159      1.1     mrg }
    160      1.1     mrg 
    161      1.1     mrg int
    162      1.8     eeh compat_43_netbsd32_lstat43(p, v, retval)
    163      1.1     mrg 	struct proc *p;
    164      1.1     mrg 	void *v;
    165      1.1     mrg 	register_t *retval;
    166      1.1     mrg {
    167      1.8     eeh 	struct compat_43_netbsd32_lstat43_args /* {
    168      1.5     mrg 		syscallarg(const netbsd32_charp) path;
    169      1.5     mrg 		syscallarg(netbsd32_stat43p_t) ub;
    170      1.1     mrg 	} */ *uap = v;
    171      1.5     mrg 	struct netbsd32_stat43 *sp32;
    172      1.1     mrg 	struct stat43 sb43;
    173      1.1     mrg 	struct stat43 *sp43 = &sb43;
    174      1.1     mrg 	struct compat_43_sys_lstat_args ua;
    175      1.1     mrg 	caddr_t sg;
    176      1.1     mrg 	int rv;
    177      1.1     mrg 
    178      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
    179      1.1     mrg 	SCARG(&ua, ub) = &sb43;
    180      1.1     mrg 	sg = stackgap_init(p->p_emul);
    181  1.8.2.2  bouyer 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
    182      1.1     mrg 
    183      1.1     mrg 	rv = compat_43_sys_stat(p, &ua, retval);
    184      1.1     mrg 
    185      1.5     mrg 	sp32 = (struct netbsd32_stat43 *)(u_long)SCARG(uap, ub);
    186      1.5     mrg 	netbsd32_from_stat43(sp43, sp32);
    187      1.1     mrg 
    188      1.1     mrg 	return (rv);
    189      1.1     mrg }
    190      1.1     mrg 
    191      1.1     mrg int
    192      1.8     eeh compat_43_netbsd32_fstat43(p, v, retval)
    193      1.1     mrg 	struct proc *p;
    194      1.1     mrg 	void *v;
    195      1.1     mrg 	register_t *retval;
    196      1.1     mrg {
    197      1.8     eeh 	struct compat_43_netbsd32_fstat43_args /* {
    198      1.1     mrg 		syscallarg(int) fd;
    199      1.5     mrg 		syscallarg(netbsd32_stat43p_t) sb;
    200      1.1     mrg 	} */ *uap = v;
    201      1.5     mrg 	struct netbsd32_stat43 *sp32;
    202      1.1     mrg 	struct stat43 sb43;
    203      1.1     mrg 	struct stat43 *sp43 = &sb43;
    204      1.1     mrg 	struct compat_43_sys_fstat_args ua;
    205      1.1     mrg 	int rv;
    206      1.1     mrg 
    207      1.6     mrg 	NETBSD32TO64_UAP(fd);
    208      1.1     mrg 	SCARG(&ua, sb) = &sb43;
    209      1.1     mrg 	rv = compat_43_sys_fstat(p, &ua, retval);
    210      1.1     mrg 
    211      1.5     mrg 	sp32 = (struct netbsd32_stat43 *)(u_long)SCARG(uap, sb);
    212      1.5     mrg 	netbsd32_from_stat43(sp43, sp32);
    213      1.1     mrg 
    214      1.1     mrg 	return (rv);
    215      1.1     mrg }
    216      1.1     mrg 
    217      1.1     mrg int
    218      1.8     eeh compat_43_netbsd32_otruncate(p, v, retval)
    219      1.1     mrg 	struct proc *p;
    220      1.1     mrg 	void *v;
    221      1.1     mrg 	register_t *retval;
    222      1.1     mrg {
    223      1.8     eeh 	struct compat_43_netbsd32_otruncate_args /* {
    224      1.5     mrg 		syscallarg(const netbsd32_charp) path;
    225      1.5     mrg 		syscallarg(netbsd32_long) length;
    226      1.1     mrg 	} */ *uap = v;
    227      1.1     mrg 	struct sys_truncate_args ua;
    228      1.1     mrg 
    229      1.6     mrg 	NETBSD32TOP_UAP(path, const char);
    230      1.6     mrg 	NETBSD32TO64_UAP(length);
    231      1.1     mrg 	return (sys_ftruncate(p, &ua, retval));
    232      1.1     mrg }
    233      1.1     mrg 
    234      1.1     mrg int
    235      1.8     eeh compat_43_netbsd32_oftruncate(p, v, retval)
    236      1.1     mrg 	struct proc *p;
    237      1.1     mrg 	void *v;
    238      1.1     mrg 	register_t *retval;
    239      1.1     mrg {
    240      1.8     eeh 	struct compat_43_netbsd32_oftruncate_args /* {
    241      1.1     mrg 		syscallarg(int) fd;
    242      1.5     mrg 		syscallarg(netbsd32_long) length;
    243      1.1     mrg 	} */ *uap = v;
    244      1.1     mrg 	struct sys_ftruncate_args ua;
    245      1.1     mrg 
    246      1.6     mrg 	NETBSD32TO64_UAP(fd);
    247      1.6     mrg 	NETBSD32TO64_UAP(length);
    248      1.1     mrg 	return (sys_ftruncate(p, &ua, retval));
    249      1.1     mrg }
    250      1.1     mrg 
    251      1.1     mrg int
    252      1.8     eeh compat_43_netbsd32_ogetdirentries(p, v, retval)
    253      1.1     mrg 	struct proc *p;
    254      1.1     mrg 	void *v;
    255      1.1     mrg 	register_t *retval;
    256      1.1     mrg {
    257      1.8     eeh 	struct compat_43_netbsd32_ogetdirentries_args /* {
    258      1.1     mrg 		syscallarg(int) fd;
    259      1.5     mrg 		syscallarg(netbsd32_charp) buf;
    260      1.1     mrg 		syscallarg(u_int) count;
    261      1.5     mrg 		syscallarg(netbsd32_longp) basep;
    262      1.1     mrg 	} */ *uap = v;
    263      1.1     mrg 	struct compat_43_sys_getdirentries_args ua;
    264      1.1     mrg 
    265      1.6     mrg 	NETBSD32TO64_UAP(fd);
    266      1.6     mrg 	NETBSD32TOP_UAP(buf, char);
    267      1.6     mrg 	NETBSD32TO64_UAP(count);
    268      1.6     mrg 	NETBSD32TOP_UAP(basep, long);
    269      1.1     mrg 	return (compat_43_sys_getdirentries(p, &ua, retval));
    270      1.1     mrg }
    271      1.1     mrg 
    272      1.1     mrg /* kernel syscalls */
    273      1.1     mrg int
    274      1.8     eeh compat_43_netbsd32_ogetkerninfo(p, v, retval)
    275      1.1     mrg 	struct proc *p;
    276      1.1     mrg 	void *v;
    277      1.1     mrg 	register_t *retval;
    278      1.1     mrg {
    279      1.8     eeh 	struct compat_43_netbsd32_ogetkerninfo_args /* {
    280      1.1     mrg 		syscallarg(int) op;
    281      1.5     mrg 		syscallarg(netbsd32_charp) where;
    282      1.5     mrg 		syscallarg(netbsd32_intp) size;
    283      1.1     mrg 		syscallarg(int) arg;
    284      1.1     mrg 	} */ *uap = v;
    285      1.1     mrg 	struct compat_43_sys_getkerninfo_args ua;
    286      1.1     mrg 
    287      1.6     mrg 	NETBSD32TO64_UAP(op);
    288      1.6     mrg 	NETBSD32TOP_UAP(where, char);
    289      1.6     mrg 	NETBSD32TOP_UAP(size, int);
    290      1.6     mrg 	NETBSD32TO64_UAP(arg);
    291      1.1     mrg 	return (compat_43_sys_getkerninfo(p, &ua, retval));
    292      1.1     mrg }
    293      1.1     mrg 
    294      1.1     mrg int
    295      1.8     eeh compat_43_netbsd32_ogethostname(p, v, retval)
    296      1.1     mrg 	struct proc *p;
    297      1.1     mrg 	void *v;
    298      1.1     mrg 	register_t *retval;
    299      1.1     mrg {
    300      1.8     eeh 	struct compat_43_netbsd32_ogethostname_args /* {
    301      1.5     mrg 		syscallarg(netbsd32_charp) hostname;
    302      1.1     mrg 		syscallarg(u_int) len;
    303      1.1     mrg 	} */ *uap = v;
    304      1.1     mrg 	int name;
    305      1.1     mrg 	size_t sz;
    306      1.1     mrg 
    307      1.1     mrg 	name = KERN_HOSTNAME;
    308      1.1     mrg 	sz = SCARG(uap, len);
    309      1.1     mrg 	return (kern_sysctl(&name, 1, (char *)(u_long)SCARG(uap, hostname),
    310      1.1     mrg 	    &sz, 0, 0, p));
    311      1.1     mrg }
    312      1.1     mrg 
    313      1.1     mrg int
    314      1.8     eeh compat_43_netbsd32_osethostname(p, v, retval)
    315      1.1     mrg 	struct proc *p;
    316      1.1     mrg 	void *v;
    317      1.1     mrg 	register_t *retval;
    318      1.1     mrg {
    319      1.8     eeh 	struct compat_43_netbsd32_osethostname_args /* {
    320      1.5     mrg 		syscallarg(netbsd32_charp) hostname;
    321      1.1     mrg 		syscallarg(u_int) len;
    322      1.1     mrg 	} */ *uap = v;
    323      1.1     mrg 	int name;
    324      1.1     mrg 	int error;
    325      1.1     mrg 
    326      1.1     mrg 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
    327      1.1     mrg 		return (error);
    328      1.1     mrg 	name = KERN_HOSTNAME;
    329      1.1     mrg 	return (kern_sysctl(&name, 1, 0, 0, (char *)(u_long)SCARG(uap,
    330      1.1     mrg 	    hostname), SCARG(uap, len), p));
    331      1.1     mrg }
    332      1.1     mrg 
    333      1.1     mrg int
    334      1.8     eeh compat_43_netbsd32_sethostid(p, v, retval)
    335      1.4     eeh 	struct proc *p;
    336      1.4     eeh 	void *v;
    337      1.4     eeh 	register_t *retval;
    338      1.4     eeh {
    339      1.8     eeh 	struct compat_43_netbsd32_sethostid_args /* {
    340      1.4     eeh 		syscallarg(int32_t) hostid;
    341      1.4     eeh 	} */ *uap = v;
    342      1.4     eeh 	struct compat_43_sys_sethostid_args ua;
    343      1.4     eeh 
    344      1.6     mrg 	NETBSD32TO64_UAP(hostid);
    345      1.4     eeh 	return (compat_43_sys_sethostid(p, &ua, retval));
    346      1.4     eeh }
    347      1.4     eeh 
    348      1.4     eeh int
    349      1.8     eeh compat_43_netbsd32_ogetrlimit(p, v, retval)
    350      1.1     mrg 	struct proc *p;
    351      1.1     mrg 	void *v;
    352      1.1     mrg 	register_t *retval;
    353      1.1     mrg {
    354      1.8     eeh 	struct compat_43_netbsd32_ogetrlimit_args /* {
    355      1.1     mrg 		syscallarg(int) which;
    356      1.5     mrg 		syscallarg(netbsd32_orlimitp_t) rlp;
    357      1.1     mrg 	} */ *uap = v;
    358      1.1     mrg 	struct compat_43_sys_getrlimit_args ua;
    359      1.1     mrg 
    360      1.6     mrg 	NETBSD32TO64_UAP(which);
    361      1.6     mrg 	NETBSD32TOP_UAP(rlp, struct orlimit);
    362      1.1     mrg 	return (compat_43_sys_getrlimit(p, &ua, retval));
    363      1.1     mrg }
    364      1.1     mrg 
    365      1.1     mrg int
    366      1.8     eeh compat_43_netbsd32_osetrlimit(p, v, retval)
    367      1.1     mrg 	struct proc *p;
    368      1.1     mrg 	void *v;
    369      1.1     mrg 	register_t *retval;
    370      1.1     mrg {
    371      1.8     eeh 	struct compat_43_netbsd32_osetrlimit_args /* {
    372      1.1     mrg 		syscallarg(int) which;
    373      1.5     mrg 		syscallarg(netbsd32_orlimitp_t) rlp;
    374      1.1     mrg 	} */ *uap = v;
    375      1.1     mrg 	struct compat_43_sys_setrlimit_args ua;
    376      1.1     mrg 
    377      1.6     mrg 	NETBSD32TO64_UAP(which);
    378      1.6     mrg 	NETBSD32TOP_UAP(rlp, struct orlimit);
    379      1.1     mrg 	return (compat_43_sys_setrlimit(p, &ua, retval));
    380      1.1     mrg }
    381      1.1     mrg 
    382      1.4     eeh int
    383      1.8     eeh compat_43_netbsd32_killpg(p, v, retval)
    384      1.4     eeh 	struct proc *p;
    385      1.4     eeh 	void *v;
    386      1.4     eeh 	register_t *retval;
    387      1.4     eeh {
    388      1.8     eeh 	struct compat_43_netbsd32_killpg_args /* {
    389      1.4     eeh 		syscallarg(int) pgid;
    390      1.4     eeh 		syscallarg(int) signum;
    391      1.4     eeh 	} */ *uap = v;
    392      1.4     eeh 	struct compat_43_sys_killpg_args ua;
    393      1.4     eeh 
    394      1.6     mrg 	NETBSD32TO64_UAP(pgid);
    395      1.6     mrg 	NETBSD32TO64_UAP(signum);
    396      1.4     eeh 	return (compat_43_sys_killpg(p, &ua, retval));
    397      1.4     eeh }
    398      1.4     eeh 
    399      1.1     mrg /* virtual memory syscalls */
    400      1.1     mrg int
    401      1.8     eeh compat_43_netbsd32_ommap(p, v, retval)
    402      1.1     mrg 	struct proc *p;
    403      1.1     mrg 	void *v;
    404      1.1     mrg 	register_t *retval;
    405      1.1     mrg {
    406      1.8     eeh 	struct compat_43_netbsd32_ommap_args /* {
    407      1.5     mrg 		syscallarg(netbsd32_caddr_t) addr;
    408      1.5     mrg 		syscallarg(netbsd32_size_t) len;
    409      1.1     mrg 		syscallarg(int) prot;
    410      1.1     mrg 		syscallarg(int) flags;
    411      1.1     mrg 		syscallarg(int) fd;
    412      1.5     mrg 		syscallarg(netbsd32_long) pos;
    413      1.1     mrg 	} */ *uap = v;
    414      1.1     mrg 	struct compat_43_sys_mmap_args ua;
    415      1.1     mrg 
    416      1.6     mrg 	NETBSD32TOX64_UAP(addr, caddr_t);
    417      1.6     mrg 	NETBSD32TOX_UAP(len, size_t);
    418      1.6     mrg 	NETBSD32TO64_UAP(prot);
    419      1.6     mrg 	NETBSD32TO64_UAP(flags);
    420      1.6     mrg 	NETBSD32TO64_UAP(fd);
    421      1.6     mrg 	NETBSD32TOX_UAP(pos, long);
    422      1.2     mrg 	return (compat_43_sys_mmap(p, &ua, retval));
    423      1.4     eeh }
    424      1.4     eeh 
    425      1.1     mrg /* network syscalls */
    426      1.1     mrg int
    427      1.8     eeh compat_43_netbsd32_oaccept(p, v, retval)
    428      1.1     mrg 	struct proc *p;
    429      1.1     mrg 	void *v;
    430      1.1     mrg 	register_t *retval;
    431      1.1     mrg {
    432      1.8     eeh 	struct compat_43_netbsd32_oaccept_args /* {
    433      1.1     mrg 		syscallarg(int) s;
    434      1.5     mrg 		syscallarg(netbsd32_caddr_t) name;
    435      1.5     mrg 		syscallarg(netbsd32_intp) anamelen;
    436      1.1     mrg 	} */ *uap = v;
    437      1.1     mrg 	struct compat_43_sys_accept_args ua;
    438      1.1     mrg 
    439      1.6     mrg 	NETBSD32TOX_UAP(s, int);
    440      1.6     mrg 	NETBSD32TOX64_UAP(name, caddr_t);
    441      1.6     mrg 	NETBSD32TOP_UAP(anamelen, int);
    442      1.2     mrg 	return (compat_43_sys_accept(p, &ua, retval));
    443      1.1     mrg }
    444      1.1     mrg 
    445      1.1     mrg int
    446      1.8     eeh compat_43_netbsd32_osend(p, v, retval)
    447      1.1     mrg 	struct proc *p;
    448      1.1     mrg 	void *v;
    449      1.1     mrg 	register_t *retval;
    450      1.1     mrg {
    451      1.8     eeh 	struct compat_43_netbsd32_osend_args /* {
    452      1.1     mrg 		syscallarg(int) s;
    453      1.5     mrg 		syscallarg(netbsd32_caddr_t) buf;
    454      1.1     mrg 		syscallarg(int) len;
    455      1.1     mrg 		syscallarg(int) flags;
    456      1.1     mrg 	} */ *uap = v;
    457      1.1     mrg 	struct compat_43_sys_send_args ua;
    458      1.1     mrg 
    459      1.6     mrg 	NETBSD32TO64_UAP(s);
    460      1.6     mrg 	NETBSD32TOX64_UAP(buf, caddr_t);
    461      1.6     mrg 	NETBSD32TO64_UAP(len);
    462      1.6     mrg 	NETBSD32TO64_UAP(flags);
    463      1.2     mrg 	return (compat_43_sys_send(p, &ua, retval));
    464      1.1     mrg }
    465      1.1     mrg 
    466      1.1     mrg int
    467      1.8     eeh compat_43_netbsd32_orecv(p, v, retval)
    468      1.1     mrg 	struct proc *p;
    469      1.1     mrg 	void *v;
    470      1.1     mrg 	register_t *retval;
    471      1.1     mrg {
    472      1.8     eeh 	struct compat_43_netbsd32_orecv_args /* {
    473      1.1     mrg 		syscallarg(int) s;
    474      1.5     mrg 		syscallarg(netbsd32_caddr_t) buf;
    475      1.1     mrg 		syscallarg(int) len;
    476      1.1     mrg 		syscallarg(int) flags;
    477      1.1     mrg 	} */ *uap = v;
    478      1.1     mrg 	struct compat_43_sys_recv_args ua;
    479      1.1     mrg 
    480      1.6     mrg 	NETBSD32TO64_UAP(s);
    481      1.6     mrg 	NETBSD32TOX64_UAP(buf, caddr_t);
    482      1.6     mrg 	NETBSD32TO64_UAP(len);
    483      1.6     mrg 	NETBSD32TO64_UAP(flags);
    484      1.2     mrg 	return (compat_43_sys_recv(p, &ua, retval));
    485      1.1     mrg }
    486      1.1     mrg 
    487      1.1     mrg /*
    488      1.1     mrg  * XXX convert these to use a common iovec code to the native
    489      1.1     mrg  * netbsd call.
    490      1.1     mrg  */
    491      1.1     mrg int
    492      1.8     eeh compat_43_netbsd32_orecvmsg(p, v, retval)
    493      1.1     mrg 	struct proc *p;
    494      1.1     mrg 	void *v;
    495      1.1     mrg 	register_t *retval;
    496      1.1     mrg {
    497      1.8     eeh 	struct compat_43_netbsd32_orecvmsg_args /* {
    498      1.1     mrg 		syscallarg(int) s;
    499      1.5     mrg 		syscallarg(netbsd32_omsghdrp_t) msg;
    500      1.1     mrg 		syscallarg(int) flags;
    501      1.1     mrg 	} */ *uap = v;
    502      1.1     mrg 	struct compat_43_sys_recvmsg_args ua;
    503      1.1     mrg 	struct omsghdr omh;
    504      1.1     mrg 	struct omsghdr *omhp = &omh;
    505      1.5     mrg 	struct netbsd32_omsghdr *omhp32;
    506      1.1     mrg 	struct iovec *iovec43p;
    507      1.5     mrg 	struct netbsd32_iovec *iovec32p;
    508      1.1     mrg 	int i;
    509      1.1     mrg 
    510      1.6     mrg 	NETBSD32TO64_UAP(s);
    511      1.6     mrg 	NETBSD32TO64_UAP(flags);
    512      1.1     mrg 
    513      1.1     mrg 	SCARG(&ua, msg) = omhp;
    514      1.5     mrg 	omhp32 = (struct netbsd32_omsghdr *)(u_long)SCARG(uap, msg);
    515      1.1     mrg 	omhp->msg_name = (caddr_t)(u_long)omhp32->msg_name;
    516      1.1     mrg 	omhp->msg_namelen = omhp32->msg_namelen;
    517      1.1     mrg 	omhp->msg_iovlen = (size_t)omhp32->msg_iovlen;
    518      1.1     mrg 	MALLOC(omhp->msg_iov, struct iovec *, sizeof(struct iovec) * omhp->msg_iovlen, M_TEMP, M_WAITOK);
    519      1.1     mrg 	iovec43p = omhp->msg_iov;
    520      1.5     mrg 	iovec32p = (struct netbsd32_iovec *)(u_long)omhp32->msg_iov;
    521      1.1     mrg 	for (i = 0; i < omhp->msg_iovlen; i++, iovec43p++, iovec32p++) {
    522      1.1     mrg 		iovec43p->iov_base = (struct iovec *)(u_long)iovec32p->iov_base;
    523      1.1     mrg 		iovec43p->iov_len = (size_t)iovec32p->iov_len;
    524      1.1     mrg 	}
    525      1.1     mrg 
    526      1.1     mrg 	omhp->msg_accrights = (caddr_t)(u_long)omhp32->msg_accrights;
    527      1.1     mrg 	omhp->msg_accrightslen = omhp32->msg_accrightslen;
    528      1.1     mrg 
    529      1.1     mrg 	return (compat_43_sys_recvmsg(p, &ua, retval));
    530      1.1     mrg }
    531      1.1     mrg 
    532      1.1     mrg int
    533      1.8     eeh compat_43_netbsd32_osendmsg(p, v, retval)
    534      1.1     mrg 	struct proc *p;
    535      1.1     mrg 	void *v;
    536      1.1     mrg 	register_t *retval;
    537      1.1     mrg {
    538      1.8     eeh 	struct compat_43_netbsd32_osendmsg_args /* {
    539      1.1     mrg 		syscallarg(int) s;
    540      1.5     mrg 		syscallarg(netbsd32_caddr_t) msg;
    541      1.1     mrg 		syscallarg(int) flags;
    542      1.1     mrg 	} */ *uap = v;
    543      1.1     mrg 	struct compat_43_sys_sendmsg_args ua;
    544      1.1     mrg 	struct omsghdr omh;
    545      1.1     mrg 	struct omsghdr *omhp = &omh;
    546      1.5     mrg 	struct netbsd32_omsghdr *omhp32;
    547      1.1     mrg 	struct iovec *iovec43p;
    548      1.5     mrg 	struct netbsd32_iovec *iovec32p;
    549      1.1     mrg 	int i;
    550      1.1     mrg 
    551      1.6     mrg 	NETBSD32TO64_UAP(s);
    552      1.6     mrg 	NETBSD32TO64_UAP(flags);
    553      1.1     mrg 
    554      1.1     mrg 	SCARG(&ua, msg) = (caddr_t)(u_long)omhp;
    555      1.5     mrg 	omhp32 = (struct netbsd32_omsghdr *)(u_long)SCARG(uap, msg);
    556      1.1     mrg 	omhp->msg_name = (caddr_t)(u_long)omhp32->msg_name;
    557      1.1     mrg 	omhp->msg_namelen = omhp32->msg_namelen;
    558      1.1     mrg 	omhp->msg_iovlen = (size_t)omhp32->msg_iovlen;
    559      1.1     mrg 	MALLOC(omhp->msg_iov, struct iovec *, sizeof(struct iovec) * omhp->msg_iovlen, M_TEMP, M_WAITOK);
    560      1.1     mrg 	iovec43p = omhp->msg_iov;
    561      1.5     mrg 	iovec32p = (struct netbsd32_iovec *)(u_long)omhp32->msg_iov;
    562      1.1     mrg 	for (i = 0; i < omhp->msg_iovlen; i++, iovec43p++, iovec32p++) {
    563      1.1     mrg 		iovec43p->iov_base = (void *)(u_long)iovec32p->iov_base;
    564      1.1     mrg 		iovec43p->iov_len = (size_t)iovec32p->iov_len;
    565      1.1     mrg 	}
    566      1.1     mrg 
    567      1.1     mrg 	omhp->msg_accrights = (caddr_t)(u_long)omhp32->msg_accrights;
    568      1.1     mrg 	omhp->msg_accrightslen = omhp32->msg_accrightslen;
    569      1.1     mrg 
    570      1.1     mrg 	return (compat_43_sys_sendmsg(p, &ua, retval));
    571      1.1     mrg }
    572      1.1     mrg 
    573      1.1     mrg int
    574      1.8     eeh compat_43_netbsd32_orecvfrom(p, v, retval)
    575      1.1     mrg 	struct proc *p;
    576      1.1     mrg 	void *v;
    577      1.1     mrg 	register_t *retval;
    578      1.1     mrg {
    579      1.8     eeh 	struct compat_43_netbsd32_orecvfrom_args /* {
    580      1.1     mrg 		syscallarg(int) s;
    581      1.5     mrg 		syscallarg(netbsd32_caddr_t) buf;
    582      1.5     mrg 		syscallarg(netbsd32_size_t) len;
    583      1.1     mrg 		syscallarg(int) flags;
    584      1.5     mrg 		syscallarg(netbsd32_caddr_t) from;
    585      1.5     mrg 		syscallarg(netbsd32_intp) fromlenaddr;
    586      1.1     mrg 	} */ *uap = v;
    587      1.1     mrg 	struct compat_43_sys_recvfrom_args ua;
    588      1.1     mrg 
    589      1.6     mrg 	NETBSD32TO64_UAP(s);
    590      1.6     mrg 	NETBSD32TOX64_UAP(buf, caddr_t);
    591      1.6     mrg 	NETBSD32TOX_UAP(len, size_t);
    592      1.6     mrg 	NETBSD32TO64_UAP(flags);
    593      1.6     mrg 	NETBSD32TOX64_UAP(from, caddr_t);
    594      1.6     mrg 	NETBSD32TOP_UAP(fromlenaddr, int);
    595      1.1     mrg 	return (compat_43_sys_recvfrom(p, &ua, retval));
    596      1.1     mrg }
    597      1.1     mrg 
    598      1.1     mrg int
    599      1.8     eeh compat_43_netbsd32_ogetsockname(p, v, retval)
    600      1.1     mrg 	struct proc *p;
    601      1.1     mrg 	void *v;
    602      1.1     mrg 	register_t *retval;
    603      1.1     mrg {
    604      1.8     eeh 	struct compat_43_netbsd32_ogetsockname_args /* {
    605      1.1     mrg 		syscallarg(int) fdec;
    606      1.5     mrg 		syscallarg(netbsd32_caddr_t) asa;
    607      1.5     mrg 		syscallarg(netbsd32_intp) alen;
    608      1.1     mrg 	} */ *uap = v;
    609      1.1     mrg 	struct compat_43_sys_getsockname_args ua;
    610      1.1     mrg 
    611      1.6     mrg 	NETBSD32TO64_UAP(fdec);
    612      1.6     mrg 	NETBSD32TOX64_UAP(asa, caddr_t);
    613      1.6     mrg 	NETBSD32TOP_UAP(alen, int);
    614      1.1     mrg 	return (compat_43_sys_getsockname(p, &ua, retval));
    615      1.1     mrg }
    616      1.1     mrg 
    617      1.1     mrg int
    618      1.8     eeh compat_43_netbsd32_ogetpeername(p, v, retval)
    619      1.1     mrg 	struct proc *p;
    620      1.1     mrg 	void *v;
    621      1.1     mrg 	register_t *retval;
    622      1.1     mrg {
    623      1.8     eeh 	struct compat_43_netbsd32_ogetpeername_args /* {
    624      1.1     mrg 		syscallarg(int) fdes;
    625      1.5     mrg 		syscallarg(netbsd32_caddr_t) asa;
    626      1.5     mrg 		syscallarg(netbsd32_intp) alen;
    627      1.1     mrg 	} */ *uap = v;
    628      1.1     mrg 	struct compat_43_sys_getpeername_args ua;
    629      1.1     mrg 
    630      1.6     mrg 	NETBSD32TO64_UAP(fdes);
    631      1.6     mrg 	NETBSD32TOX64_UAP(asa, caddr_t);
    632      1.6     mrg 	NETBSD32TOP_UAP(alen, int);
    633      1.1     mrg 	return (compat_43_sys_getpeername(p, &ua, retval));
    634      1.1     mrg }
    635      1.1     mrg 
    636      1.1     mrg /* signal syscalls */
    637      1.1     mrg int
    638      1.8     eeh compat_43_netbsd32_osigvec(p, v, retval)
    639      1.1     mrg 	struct proc *p;
    640      1.1     mrg 	void *v;
    641      1.1     mrg 	register_t *retval;
    642      1.1     mrg {
    643      1.8     eeh 	struct compat_43_netbsd32_osigvec_args /* {
    644      1.1     mrg 		syscallarg(int) signum;
    645      1.5     mrg 		syscallarg(netbsd32_sigvecp_t) nsv;
    646      1.5     mrg 		syscallarg(netbsd32_sigvecp_t) osv;
    647      1.1     mrg 	} */ *uap = v;
    648      1.1     mrg 	struct compat_43_sys_sigvec_args ua;
    649      1.5     mrg 	struct netbsd32_sigvec *sv32p;
    650      1.1     mrg 	struct sigvec nsv, osv;
    651      1.1     mrg 	int rv;
    652      1.1     mrg 
    653      1.6     mrg 	NETBSD32TO64_UAP(signum);
    654      1.1     mrg 	if (SCARG(uap, osv))
    655      1.1     mrg 		SCARG(&ua, osv) = &osv;
    656      1.1     mrg 	else
    657      1.1     mrg 		SCARG(&ua, osv) = NULL;
    658      1.1     mrg 	if (SCARG(uap, nsv)) {
    659      1.1     mrg 		SCARG(&ua, nsv) = &nsv;
    660      1.5     mrg 		sv32p = (struct netbsd32_sigvec *)(u_long)SCARG(uap, nsv);
    661      1.1     mrg 		nsv.sv_handler = (void *)(u_long)sv32p->sv_handler;
    662      1.1     mrg 		nsv.sv_mask = sv32p->sv_mask;
    663      1.1     mrg 		nsv.sv_flags = sv32p->sv_flags;
    664      1.1     mrg 	} else
    665      1.1     mrg 		SCARG(&ua, nsv) = NULL;
    666      1.1     mrg 	rv = compat_43_sys_sigvec(p, &ua, retval);
    667      1.1     mrg 	if (rv)
    668      1.1     mrg 		return (rv);
    669      1.1     mrg 
    670      1.1     mrg 	if (SCARG(uap, osv)) {
    671      1.5     mrg 		sv32p = (struct netbsd32_sigvec *)(u_long)SCARG(uap, osv);
    672      1.5     mrg 		sv32p->sv_handler = (netbsd32_sigvecp_t)(u_long)osv.sv_handler;
    673      1.1     mrg 		sv32p->sv_mask = osv.sv_mask;
    674      1.1     mrg 		sv32p->sv_flags = osv.sv_flags;
    675      1.1     mrg 	}
    676      1.1     mrg 
    677      1.1     mrg 	return (0);
    678      1.4     eeh }
    679      1.4     eeh 
    680      1.4     eeh int
    681      1.8     eeh compat_43_netbsd32_sigblock(p, v, retval)
    682      1.4     eeh 	struct proc *p;
    683      1.4     eeh 	void *v;
    684      1.4     eeh 	register_t *retval;
    685      1.4     eeh {
    686      1.8     eeh 	struct compat_43_netbsd32_sigblock_args /* {
    687      1.4     eeh 		syscallarg(int) mask;
    688      1.4     eeh 	} */ *uap = v;
    689      1.4     eeh 	struct compat_43_sys_sigblock_args ua;
    690      1.4     eeh 
    691      1.6     mrg 	NETBSD32TO64_UAP(mask);
    692      1.4     eeh 	return (compat_43_sys_sigblock(p, &ua, retval));
    693      1.4     eeh }
    694      1.4     eeh 
    695      1.4     eeh int
    696      1.8     eeh compat_43_netbsd32_sigsetmask(p, v, retval)
    697      1.4     eeh 	struct proc *p;
    698      1.4     eeh 	void *v;
    699      1.4     eeh 	register_t *retval;
    700      1.4     eeh {
    701      1.8     eeh 	struct compat_43_netbsd32_sigsetmask_args /* {
    702      1.4     eeh 		syscallarg(int) mask;
    703      1.4     eeh 	} */ *uap = v;
    704      1.4     eeh 	struct compat_43_sys_sigsetmask_args ua;
    705      1.4     eeh 
    706      1.6     mrg 	NETBSD32TO64_UAP(mask);
    707      1.4     eeh 	return (compat_43_sys_sigsetmask(p, &ua, retval));
    708      1.1     mrg }
    709      1.1     mrg 
    710      1.1     mrg int
    711      1.8     eeh compat_43_netbsd32_osigstack(p, v, retval)
    712      1.1     mrg 	struct proc *p;
    713      1.1     mrg 	void *v;
    714      1.1     mrg 	register_t *retval;
    715      1.1     mrg {
    716      1.8     eeh 	struct compat_43_netbsd32_osigstack_args /* {
    717      1.5     mrg 		syscallarg(netbsd32_sigstackp_t) nss;
    718      1.5     mrg 		syscallarg(netbsd32_sigstackp_t) oss;
    719      1.1     mrg 	} */ *uap = v;
    720      1.1     mrg 	struct compat_43_sys_sigstack_args ua;
    721      1.5     mrg 	struct netbsd32_sigstack *ss32p;
    722      1.1     mrg 	struct sigstack nss, oss;
    723      1.1     mrg 	int rv;
    724      1.1     mrg 
    725      1.1     mrg 	if (SCARG(uap, oss))
    726      1.1     mrg 		SCARG(&ua, oss) = &oss;
    727      1.1     mrg 	else
    728      1.1     mrg 		SCARG(&ua, oss) = NULL;
    729      1.1     mrg 	if (SCARG(uap, nss)) {
    730      1.1     mrg 		SCARG(&ua, nss) = &nss;
    731      1.5     mrg 		ss32p = (struct netbsd32_sigstack *)(u_long)SCARG(uap, nss);
    732      1.1     mrg 		nss.ss_sp = (void *)(u_long)ss32p->ss_sp;
    733      1.1     mrg 		nss.ss_onstack = ss32p->ss_onstack;
    734      1.1     mrg 	} else
    735      1.1     mrg 		SCARG(&ua, nss) = NULL;
    736      1.1     mrg 
    737      1.1     mrg 	rv = compat_43_sys_sigstack(p, &ua, retval);
    738      1.1     mrg 	if (rv)
    739      1.1     mrg 		return (rv);
    740      1.1     mrg 
    741      1.1     mrg 	if (SCARG(uap, oss)) {
    742      1.5     mrg 		ss32p = (struct netbsd32_sigstack *)(u_long)SCARG(uap, oss);
    743      1.5     mrg 		ss32p->ss_sp = (netbsd32_sigstackp_t)(u_long)oss.ss_sp;
    744      1.1     mrg 		ss32p->ss_onstack = oss.ss_onstack;
    745      1.1     mrg 	}
    746      1.1     mrg 
    747      1.1     mrg 	return (0);
    748      1.1     mrg }
    749