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