xref: /netbsd-src/sys/compat/netbsd32/netbsd32_netbsd.c (revision 17306b8fd0952c7489f93f0230818481e5a1e2c9)
1 /*	$NetBSD: netbsd32_netbsd.c,v 1.60 2001/06/19 00:36:21 fvdl Exp $	*/
2 
3 /*
4  * Copyright (c) 1998, 2001 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_OPT)
32 #include "opt_ddb.h"
33 #include "opt_ktrace.h"
34 #include "opt_ntp.h"
35 #include "opt_compat_netbsd.h"
36 #include "opt_compat_43.h"
37 #include "opt_sysv.h"
38 
39 #include "fs_lfs.h"
40 #include "fs_nfs.h"
41 #endif
42 
43 /*
44  * Though COMPAT_OLDSOCK is needed only for COMPAT_43, SunOS, Linux,
45  * HP-UX, FreeBSD, Ultrix, OSF1, we define it unconditionally so that
46  * this would be LKM-safe.
47  */
48 #define COMPAT_OLDSOCK /* used by <sys/socket.h> */
49 
50 #include <sys/param.h>
51 #include <sys/systm.h>
52 #include <sys/kernel.h>
53 //#define msg __msg /* Don't ask me! */
54 #include <sys/malloc.h>
55 #include <sys/mount.h>
56 #include <sys/socket.h>
57 #include <sys/sockio.h>
58 #include <sys/socketvar.h>
59 #include <sys/mbuf.h>
60 #include <sys/stat.h>
61 #include <sys/time.h>
62 #include <sys/signalvar.h>
63 #include <sys/ptrace.h>
64 #include <sys/ktrace.h>
65 #include <sys/trace.h>
66 #include <sys/resourcevar.h>
67 #include <sys/pool.h>
68 #include <sys/vnode.h>
69 #include <sys/file.h>
70 #include <sys/filedesc.h>
71 #include <sys/namei.h>
72 
73 #include <uvm/uvm_extern.h>
74 
75 #include <sys/syscallargs.h>
76 #include <sys/proc.h>
77 #include <sys/acct.h>
78 #include <sys/exec.h>
79 
80 #include <net/if.h>
81 
82 #include <compat/netbsd32/netbsd32.h>
83 #include <compat/netbsd32/netbsd32_syscall.h>
84 #include <compat/netbsd32/netbsd32_syscallargs.h>
85 #include <compat/netbsd32/netbsd32_conv.h>
86 
87 #include <machine/frame.h>
88 
89 #if defined(DDB)
90 #include <ddb/ddbvar.h>
91 #endif
92 
93 extern char netbsd32_sigcode[], netbsd32_esigcode[];
94 extern struct sysent netbsd32_sysent[];
95 #ifdef SYSCALL_DEBUG
96 extern const char * const netbsd32_syscallnames[];
97 #endif
98 #ifdef __HAVE_SYSCALL_INTERN
99 void netbsd32_syscall_intern __P((struct proc *));
100 #else
101 void syscall __P((void));
102 #endif
103 
104 const struct emul emul_netbsd32 = {
105 	"netbsd32",
106 	"/emul/netbsd32",
107 #ifndef __HAVE_MINIMAL_EMUL
108 	0,
109 	NULL,
110 	netbsd32_SYS_syscall,
111 	netbsd32_SYS_MAXSYSCALL,
112 #endif
113 	netbsd32_sysent,
114 #ifdef SYSCALL_DEBUG
115 	netbsd32_syscallnames,
116 #else
117 	NULL,
118 #endif
119 	netbsd32_sendsig,
120 	trapsignal,
121 	netbsd32_sigcode,
122 	netbsd32_esigcode,
123 	NULL,
124 	NULL,
125 	NULL,
126 #ifdef __HAVE_SYSCALL_INTERN
127 	netbsd32_syscall_intern,
128 #else
129 	syscall,
130 #endif
131 };
132 
133 /*
134  * below are all the standard NetBSD system calls, in the 32bit
135  * environment, with the necessary conversions to 64bit before
136  * calling the real syscall.  anything that needs special
137  * attention is handled elsewhere.
138  */
139 
140 int
141 netbsd32_exit(p, v, retval)
142 	struct proc *p;
143 	void *v;
144 	register_t *retval;
145 {
146 	struct netbsd32_exit_args /* {
147 		syscallarg(int) rval;
148 	} */ *uap = v;
149 	struct sys_exit_args ua;
150 
151 	NETBSD32TO64_UAP(rval);
152 	return sys_exit(p, &ua, retval);
153 }
154 
155 int
156 netbsd32_read(p, v, retval)
157 	struct proc *p;
158 	void *v;
159 	register_t *retval;
160 {
161 	struct netbsd32_read_args /* {
162 		syscallarg(int) fd;
163 		syscallarg(netbsd32_voidp) buf;
164 		syscallarg(netbsd32_size_t) nbyte;
165 	} */ *uap = v;
166 	struct sys_read_args ua;
167 
168 	NETBSD32TO64_UAP(fd);
169 	NETBSD32TOP_UAP(buf, void *);
170 	NETBSD32TOX_UAP(nbyte, size_t);
171 	return sys_read(p, &ua, retval);
172 }
173 
174 int
175 netbsd32_write(p, v, retval)
176 	struct proc *p;
177 	void *v;
178 	register_t *retval;
179 {
180 	struct netbsd32_write_args /* {
181 		syscallarg(int) fd;
182 		syscallarg(const netbsd32_voidp) buf;
183 		syscallarg(netbsd32_size_t) nbyte;
184 	} */ *uap = v;
185 	struct sys_write_args ua;
186 
187 	NETBSD32TO64_UAP(fd);
188 	NETBSD32TOP_UAP(buf, void *);
189 	NETBSD32TOX_UAP(nbyte, size_t);
190 	return sys_write(p, &ua, retval);
191 }
192 
193 int
194 netbsd32_close(p, v, retval)
195 	struct proc *p;
196 	void *v;
197 	register_t *retval;
198 {
199 	struct netbsd32_close_args /* {
200 		syscallarg(int) fd;
201 	} */ *uap = v;
202 	struct sys_close_args ua;
203 
204 	NETBSD32TO64_UAP(fd);
205 	return sys_close(p, &ua, retval);
206 }
207 
208 int
209 netbsd32_open(p, v, retval)
210 	struct proc *p;
211 	void *v;
212 	register_t *retval;
213 {
214 	struct netbsd32_open_args /* {
215 		syscallarg(const netbsd32_charp) path;
216 		syscallarg(int) flags;
217 		syscallarg(mode_t) mode;
218 	} */ *uap = v;
219 	struct sys_open_args ua;
220 	caddr_t sg;
221 
222 	NETBSD32TOP_UAP(path, const char);
223 	NETBSD32TO64_UAP(flags);
224 	NETBSD32TO64_UAP(mode);
225 	sg = stackgap_init(p->p_emul);
226 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
227 
228 	return (sys_open(p, &ua, retval));
229 }
230 
231 int
232 netbsd32_link(p, v, retval)
233 	struct proc *p;
234 	void *v;
235 	register_t *retval;
236 {
237 	struct netbsd32_link_args /* {
238 		syscallarg(const netbsd32_charp) path;
239 		syscallarg(const netbsd32_charp) link;
240 	} */ *uap = v;
241 	struct sys_link_args ua;
242 
243 	NETBSD32TOP_UAP(path, const char);
244 	NETBSD32TOP_UAP(link, const char);
245 	return (sys_link(p, &ua, retval));
246 }
247 
248 int
249 netbsd32_unlink(p, v, retval)
250 	struct proc *p;
251 	void *v;
252 	register_t *retval;
253 {
254 	struct netbsd32_unlink_args /* {
255 		syscallarg(const netbsd32_charp) path;
256 	} */ *uap = v;
257 	struct sys_unlink_args ua;
258 
259 	NETBSD32TOP_UAP(path, const char);
260 
261 	return (sys_unlink(p, &ua, retval));
262 }
263 
264 int
265 netbsd32_chdir(p, v, retval)
266 	struct proc *p;
267 	void *v;
268 	register_t *retval;
269 {
270 	struct netbsd32_chdir_args /* {
271 		syscallarg(const netbsd32_charp) path;
272 	} */ *uap = v;
273 	struct sys_chdir_args ua;
274 
275 	NETBSD32TOP_UAP(path, const char);
276 
277 	return (sys_chdir(p, &ua, retval));
278 }
279 
280 int
281 netbsd32_fchdir(p, v, retval)
282 	struct proc *p;
283 	void *v;
284 	register_t *retval;
285 {
286 	struct netbsd32_fchdir_args /* {
287 		syscallarg(int) fd;
288 	} */ *uap = v;
289 	struct sys_fchdir_args ua;
290 
291 	NETBSD32TO64_UAP(fd);
292 
293 	return (sys_fchdir(p, &ua, retval));
294 }
295 
296 int
297 netbsd32_mknod(p, v, retval)
298 	struct proc *p;
299 	void *v;
300 	register_t *retval;
301 {
302 	struct netbsd32_mknod_args /* {
303 		syscallarg(const netbsd32_charp) path;
304 		syscallarg(mode_t) mode;
305 		syscallarg(dev_t) dev;
306 	} */ *uap = v;
307 	struct sys_mknod_args ua;
308 
309 	NETBSD32TOP_UAP(path, const char);
310 	NETBSD32TO64_UAP(dev);
311 	NETBSD32TO64_UAP(mode);
312 
313 	return (sys_mknod(p, &ua, retval));
314 }
315 
316 int
317 netbsd32_chmod(p, v, retval)
318 	struct proc *p;
319 	void *v;
320 	register_t *retval;
321 {
322 	struct netbsd32_chmod_args /* {
323 		syscallarg(const netbsd32_charp) path;
324 		syscallarg(mode_t) mode;
325 	} */ *uap = v;
326 	struct sys_chmod_args ua;
327 
328 	NETBSD32TOP_UAP(path, const char);
329 	NETBSD32TO64_UAP(mode);
330 
331 	return (sys_chmod(p, &ua, retval));
332 }
333 
334 int
335 netbsd32_chown(p, v, retval)
336 	struct proc *p;
337 	void *v;
338 	register_t *retval;
339 {
340 	struct netbsd32_chown_args /* {
341 		syscallarg(const netbsd32_charp) path;
342 		syscallarg(uid_t) uid;
343 		syscallarg(gid_t) gid;
344 	} */ *uap = v;
345 	struct sys_chown_args ua;
346 
347 	NETBSD32TOP_UAP(path, const char);
348 	NETBSD32TO64_UAP(uid);
349 	NETBSD32TO64_UAP(gid);
350 
351 	return (sys_chown(p, &ua, retval));
352 }
353 
354 int
355 netbsd32_break(p, v, retval)
356 	struct proc *p;
357 	void *v;
358 	register_t *retval;
359 {
360 	struct netbsd32_break_args /* {
361 		syscallarg(netbsd32_charp) nsize;
362 	} */ *uap = v;
363 	struct sys_obreak_args ua;
364 
365 	SCARG(&ua, nsize) = (char *)(u_long)SCARG(uap, nsize);
366 	NETBSD32TOP_UAP(nsize, char);
367 	return (sys_obreak(p, &ua, retval));
368 }
369 
370 int
371 netbsd32_mount(p, v, retval)
372 	struct proc *p;
373 	void *v;
374 	register_t *retval;
375 {
376 	struct netbsd32_mount_args /* {
377 		syscallarg(const netbsd32_charp) type;
378 		syscallarg(const netbsd32_charp) path;
379 		syscallarg(int) flags;
380 		syscallarg(netbsd32_voidp) data;
381 	} */ *uap = v;
382 	struct sys_mount_args ua;
383 
384 	NETBSD32TOP_UAP(type, const char);
385 	NETBSD32TOP_UAP(path, const char);
386 	NETBSD32TO64_UAP(flags);
387 	NETBSD32TOP_UAP(data, void);
388 	return (sys_mount(p, &ua, retval));
389 }
390 
391 int
392 netbsd32_unmount(p, v, retval)
393 	struct proc *p;
394 	void *v;
395 	register_t *retval;
396 {
397 	struct netbsd32_unmount_args /* {
398 		syscallarg(const netbsd32_charp) path;
399 		syscallarg(int) flags;
400 	} */ *uap = v;
401 	struct sys_unmount_args ua;
402 
403 	NETBSD32TOP_UAP(path, const char);
404 	NETBSD32TO64_UAP(flags);
405 	return (sys_unmount(p, &ua, retval));
406 }
407 
408 int
409 netbsd32_setuid(p, v, retval)
410 	struct proc *p;
411 	void *v;
412 	register_t *retval;
413 {
414 	struct netbsd32_setuid_args /* {
415 		syscallarg(uid_t) uid;
416 	} */ *uap = v;
417 	struct sys_setuid_args ua;
418 
419 	NETBSD32TO64_UAP(uid);
420 	return (sys_setuid(p, &ua, retval));
421 }
422 
423 int
424 netbsd32_ptrace(p, v, retval)
425 	struct proc *p;
426 	void *v;
427 	register_t *retval;
428 {
429 	struct netbsd32_ptrace_args /* {
430 		syscallarg(int) req;
431 		syscallarg(pid_t) pid;
432 		syscallarg(netbsd32_caddr_t) addr;
433 		syscallarg(int) data;
434 	} */ *uap = v;
435 	struct sys_ptrace_args ua;
436 
437 	NETBSD32TO64_UAP(req);
438 	NETBSD32TO64_UAP(pid);
439 	NETBSD32TOX64_UAP(addr, caddr_t);
440 	NETBSD32TO64_UAP(data);
441 	return (sys_ptrace(p, &ua, retval));
442 }
443 
444 int
445 netbsd32_accept(p, v, retval)
446 	struct proc *p;
447 	void *v;
448 	register_t *retval;
449 {
450 	struct netbsd32_accept_args /* {
451 		syscallarg(int) s;
452 		syscallarg(netbsd32_sockaddrp_t) name;
453 		syscallarg(netbsd32_intp) anamelen;
454 	} */ *uap = v;
455 	struct sys_accept_args ua;
456 
457 	NETBSD32TO64_UAP(s);
458 	NETBSD32TOP_UAP(name, struct sockaddr);
459 	NETBSD32TOP_UAP(anamelen, int);
460 	return (sys_accept(p, &ua, retval));
461 }
462 
463 int
464 netbsd32_getpeername(p, v, retval)
465 	struct proc *p;
466 	void *v;
467 	register_t *retval;
468 {
469 	struct netbsd32_getpeername_args /* {
470 		syscallarg(int) fdes;
471 		syscallarg(netbsd32_sockaddrp_t) asa;
472 		syscallarg(netbsd32_intp) alen;
473 	} */ *uap = v;
474 	struct sys_getpeername_args ua;
475 
476 	NETBSD32TO64_UAP(fdes);
477 	NETBSD32TOP_UAP(asa, struct sockaddr);
478 	NETBSD32TOP_UAP(alen, int);
479 /* NB: do the protocol specific sockaddrs need to be converted? */
480 	return (sys_getpeername(p, &ua, retval));
481 }
482 
483 int
484 netbsd32_getsockname(p, v, retval)
485 	struct proc *p;
486 	void *v;
487 	register_t *retval;
488 {
489 	struct netbsd32_getsockname_args /* {
490 		syscallarg(int) fdes;
491 		syscallarg(netbsd32_sockaddrp_t) asa;
492 		syscallarg(netbsd32_intp) alen;
493 	} */ *uap = v;
494 	struct sys_getsockname_args ua;
495 
496 	NETBSD32TO64_UAP(fdes);
497 	NETBSD32TOP_UAP(asa, struct sockaddr);
498 	NETBSD32TOP_UAP(alen, int);
499 	return (sys_getsockname(p, &ua, retval));
500 }
501 
502 int
503 netbsd32_access(p, v, retval)
504 	struct proc *p;
505 	void *v;
506 	register_t *retval;
507 {
508 	struct netbsd32_access_args /* {
509 		syscallarg(const netbsd32_charp) path;
510 		syscallarg(int) flags;
511 	} */ *uap = v;
512 	struct sys_access_args ua;
513 	caddr_t sg;
514 
515 	NETBSD32TOP_UAP(path, const char);
516 	NETBSD32TO64_UAP(flags);
517 	sg = stackgap_init(p->p_emul);
518 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
519 
520 	return (sys_access(p, &ua, retval));
521 }
522 
523 int
524 netbsd32_chflags(p, v, retval)
525 	struct proc *p;
526 	void *v;
527 	register_t *retval;
528 {
529 	struct netbsd32_chflags_args /* {
530 		syscallarg(const netbsd32_charp) path;
531 		syscallarg(netbsd32_u_long) flags;
532 	} */ *uap = v;
533 	struct sys_chflags_args ua;
534 
535 	NETBSD32TOP_UAP(path, const char);
536 	NETBSD32TO64_UAP(flags);
537 
538 	return (sys_chflags(p, &ua, retval));
539 }
540 
541 int
542 netbsd32_fchflags(p, v, retval)
543 	struct proc *p;
544 	void *v;
545 	register_t *retval;
546 {
547 	struct netbsd32_fchflags_args /* {
548 		syscallarg(int) fd;
549 		syscallarg(netbsd32_u_long) flags;
550 	} */ *uap = v;
551 	struct sys_fchflags_args ua;
552 
553 	NETBSD32TO64_UAP(fd);
554 	NETBSD32TO64_UAP(flags);
555 
556 	return (sys_fchflags(p, &ua, retval));
557 }
558 
559 int
560 netbsd32_lchflags(p, v, retval)
561 	struct proc *p;
562 	void *v;
563 	register_t *retval;
564 {
565 	struct netbsd32_lchflags_args /* {
566 		syscallarg(int) fd;
567 		syscallarg(netbsd32_u_long) flags;
568 	} */ *uap = v;
569 	struct sys_lchflags_args ua;
570 
571 	NETBSD32TOP_UAP(path, const char);
572 	NETBSD32TO64_UAP(flags);
573 
574 	return (sys_lchflags(p, &ua, retval));
575 }
576 
577 int
578 netbsd32_kill(p, v, retval)
579 	struct proc *p;
580 	void *v;
581 	register_t *retval;
582 {
583 	struct netbsd32_kill_args /* {
584 		syscallarg(int) pid;
585 		syscallarg(int) signum;
586 	} */ *uap = v;
587 	struct sys_kill_args ua;
588 
589 	NETBSD32TO64_UAP(pid);
590 	NETBSD32TO64_UAP(signum);
591 
592 	return (sys_kill(p, &ua, retval));
593 }
594 
595 int
596 netbsd32_dup(p, v, retval)
597 	struct proc *p;
598 	void *v;
599 	register_t *retval;
600 {
601 	struct netbsd32_dup_args /* {
602 		syscallarg(int) fd;
603 	} */ *uap = v;
604 	struct sys_dup_args ua;
605 
606 	NETBSD32TO64_UAP(fd);
607 
608 	return (sys_dup(p, &ua, retval));
609 }
610 
611 int
612 netbsd32_profil(p, v, retval)
613 	struct proc *p;
614 	void *v;
615 	register_t *retval;
616 {
617 	struct netbsd32_profil_args /* {
618 		syscallarg(netbsd32_caddr_t) samples;
619 		syscallarg(netbsd32_size_t) size;
620 		syscallarg(netbsd32_u_long) offset;
621 		syscallarg(u_int) scale;
622 	} */ *uap = v;
623 	struct sys_profil_args ua;
624 
625 	NETBSD32TOX64_UAP(samples, caddr_t);
626 	NETBSD32TOX_UAP(size, size_t);
627 	NETBSD32TOX_UAP(offset, u_long);
628 	NETBSD32TO64_UAP(scale);
629 	return (sys_profil(p, &ua, retval));
630 }
631 
632 #ifdef KTRACE
633 int
634 netbsd32_ktrace(p, v, retval)
635 	struct proc *p;
636 	void *v;
637 	register_t *retval;
638 {
639 	struct netbsd32_ktrace_args /* {
640 		syscallarg(const netbsd32_charp) fname;
641 		syscallarg(int) ops;
642 		syscallarg(int) facs;
643 		syscallarg(int) pid;
644 	} */ *uap = v;
645 	struct sys_ktrace_args ua;
646 
647 	NETBSD32TOP_UAP(fname, const char);
648 	NETBSD32TO64_UAP(ops);
649 	NETBSD32TO64_UAP(facs);
650 	NETBSD32TO64_UAP(pid);
651 	return (sys_ktrace(p, &ua, retval));
652 }
653 #endif /* KTRACE */
654 
655 int
656 netbsd32_utrace(p, v, retval)
657 	struct proc *p;
658 	void *v;
659 	register_t *retval;
660 {
661 	struct netbsd32_utrace_args /* {
662 		syscallarg(const netbsd32_charp) label;
663 		syscallarg(netbsd32_voidp) addr;
664 		syscallarg(netbsd32_size_t) len;
665 	} */ *uap = v;
666 	struct sys_utrace_args ua;
667 
668 	NETBSD32TOP_UAP(label, const char);
669 	NETBSD32TOP_UAP(addr, void);
670 	NETBSD32TO64_UAP(len);
671 	return (sys_utrace(p, &ua, retval));
672 }
673 
674 int
675 netbsd32___getlogin(p, v, retval)
676 	struct proc *p;
677 	void *v;
678 	register_t *retval;
679 {
680 	struct netbsd32___getlogin_args /* {
681 		syscallarg(netbsd32_charp) namebuf;
682 		syscallarg(u_int) namelen;
683 	} */ *uap = v;
684 	struct sys___getlogin_args ua;
685 
686 	NETBSD32TOP_UAP(namebuf, char);
687 	NETBSD32TO64_UAP(namelen);
688 	return (sys___getlogin(p, &ua, retval));
689 }
690 
691 int
692 netbsd32_setlogin(p, v, retval)
693 	struct proc *p;
694 	void *v;
695 	register_t *retval;
696 {
697 	struct netbsd32_setlogin_args /* {
698 		syscallarg(const netbsd32_charp) namebuf;
699 	} */ *uap = v;
700 	struct sys_setlogin_args ua;
701 
702 	NETBSD32TOP_UAP(namebuf, char);
703 	return (sys_setlogin(p, &ua, retval));
704 }
705 
706 int
707 netbsd32_acct(p, v, retval)
708 	struct proc *p;
709 	void *v;
710 	register_t *retval;
711 {
712 	struct netbsd32_acct_args /* {
713 		syscallarg(const netbsd32_charp) path;
714 	} */ *uap = v;
715 	struct sys_acct_args ua;
716 
717 	NETBSD32TOP_UAP(path, const char);
718 	return (sys_acct(p, &ua, retval));
719 }
720 
721 int
722 netbsd32_revoke(p, v, retval)
723 	struct proc *p;
724 	void *v;
725 	register_t *retval;
726 {
727 	struct netbsd32_revoke_args /* {
728 		syscallarg(const netbsd32_charp) path;
729 	} */ *uap = v;
730 	struct sys_revoke_args ua;
731 	caddr_t sg;
732 
733 	NETBSD32TOP_UAP(path, const char);
734 	sg = stackgap_init(p->p_emul);
735 	CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
736 
737 	return (sys_revoke(p, &ua, retval));
738 }
739 
740 int
741 netbsd32_symlink(p, v, retval)
742 	struct proc *p;
743 	void *v;
744 	register_t *retval;
745 {
746 	struct netbsd32_symlink_args /* {
747 		syscallarg(const netbsd32_charp) path;
748 		syscallarg(const netbsd32_charp) link;
749 	} */ *uap = v;
750 	struct sys_symlink_args ua;
751 
752 	NETBSD32TOP_UAP(path, const char);
753 	NETBSD32TOP_UAP(link, const char);
754 
755 	return (sys_symlink(p, &ua, retval));
756 }
757 
758 int
759 netbsd32_readlink(p, v, retval)
760 	struct proc *p;
761 	void *v;
762 	register_t *retval;
763 {
764 	struct netbsd32_readlink_args /* {
765 		syscallarg(const netbsd32_charp) path;
766 		syscallarg(netbsd32_charp) buf;
767 		syscallarg(netbsd32_size_t) count;
768 	} */ *uap = v;
769 	struct sys_readlink_args ua;
770 	caddr_t sg;
771 
772 	NETBSD32TOP_UAP(path, const char);
773 	NETBSD32TOP_UAP(buf, char);
774 	NETBSD32TOX_UAP(count, size_t);
775 	sg = stackgap_init(p->p_emul);
776 	CHECK_ALT_SYMLINK(p, &sg, SCARG(&ua, path));
777 
778 	return (sys_readlink(p, &ua, retval));
779 }
780 
781 int
782 netbsd32_umask(p, v, retval)
783 	struct proc *p;
784 	void *v;
785 	register_t *retval;
786 {
787 	struct netbsd32_umask_args /* {
788 		syscallarg(mode_t) newmask;
789 	} */ *uap = v;
790 	struct sys_umask_args ua;
791 
792 	NETBSD32TO64_UAP(newmask);
793 	return (sys_umask(p, &ua, retval));
794 }
795 
796 int
797 netbsd32_chroot(p, v, retval)
798 	struct proc *p;
799 	void *v;
800 	register_t *retval;
801 {
802 	struct netbsd32_chroot_args /* {
803 		syscallarg(const netbsd32_charp) path;
804 	} */ *uap = v;
805 	struct sys_chroot_args ua;
806 
807 	NETBSD32TOP_UAP(path, const char);
808 	return (sys_chroot(p, &ua, retval));
809 }
810 
811 int
812 netbsd32_sbrk(p, v, retval)
813 	struct proc *p;
814 	void *v;
815 	register_t *retval;
816 {
817 	struct netbsd32_sbrk_args /* {
818 		syscallarg(int) incr;
819 	} */ *uap = v;
820 	struct sys_sbrk_args ua;
821 
822 	NETBSD32TO64_UAP(incr);
823 	return (sys_sbrk(p, &ua, retval));
824 }
825 
826 int
827 netbsd32_sstk(p, v, retval)
828 	struct proc *p;
829 	void *v;
830 	register_t *retval;
831 {
832 	struct netbsd32_sstk_args /* {
833 		syscallarg(int) incr;
834 	} */ *uap = v;
835 	struct sys_sstk_args ua;
836 
837 	NETBSD32TO64_UAP(incr);
838 	return (sys_sstk(p, &ua, retval));
839 }
840 
841 int
842 netbsd32_munmap(p, v, retval)
843 	struct proc *p;
844 	void *v;
845 	register_t *retval;
846 {
847 	struct netbsd32_munmap_args /* {
848 		syscallarg(netbsd32_voidp) addr;
849 		syscallarg(netbsd32_size_t) len;
850 	} */ *uap = v;
851 	struct sys_munmap_args ua;
852 
853 	NETBSD32TOP_UAP(addr, void);
854 	NETBSD32TOX_UAP(len, size_t);
855 	return (sys_munmap(p, &ua, retval));
856 }
857 
858 int
859 netbsd32_mprotect(p, v, retval)
860 	struct proc *p;
861 	void *v;
862 	register_t *retval;
863 {
864 	struct netbsd32_mprotect_args /* {
865 		syscallarg(netbsd32_voidp) addr;
866 		syscallarg(netbsd32_size_t) len;
867 		syscallarg(int) prot;
868 	} */ *uap = v;
869 	struct sys_mprotect_args ua;
870 
871 	NETBSD32TOP_UAP(addr, void);
872 	NETBSD32TOX_UAP(len, size_t);
873 	NETBSD32TO64_UAP(prot);
874 	return (sys_mprotect(p, &ua, retval));
875 }
876 
877 int
878 netbsd32_madvise(p, v, retval)
879 	struct proc *p;
880 	void *v;
881 	register_t *retval;
882 {
883 	struct netbsd32_madvise_args /* {
884 		syscallarg(netbsd32_voidp) addr;
885 		syscallarg(netbsd32_size_t) len;
886 		syscallarg(int) behav;
887 	} */ *uap = v;
888 	struct sys_madvise_args ua;
889 
890 	NETBSD32TOP_UAP(addr, void);
891 	NETBSD32TOX_UAP(len, size_t);
892 	NETBSD32TO64_UAP(behav);
893 	return (sys_madvise(p, &ua, retval));
894 }
895 
896 int
897 netbsd32_mincore(p, v, retval)
898 	struct proc *p;
899 	void *v;
900 	register_t *retval;
901 {
902 	struct netbsd32_mincore_args /* {
903 		syscallarg(netbsd32_caddr_t) addr;
904 		syscallarg(netbsd32_size_t) len;
905 		syscallarg(netbsd32_charp) vec;
906 	} */ *uap = v;
907 	struct sys_mincore_args ua;
908 
909 	NETBSD32TOX64_UAP(addr, caddr_t);
910 	NETBSD32TOX_UAP(len, size_t);
911 	NETBSD32TOP_UAP(vec, char);
912 	return (sys_mincore(p, &ua, retval));
913 }
914 
915 /* XXX MOVE ME XXX ? */
916 int
917 netbsd32_getgroups(p, v, retval)
918 	struct proc *p;
919 	void *v;
920 	register_t *retval;
921 {
922 	struct netbsd32_getgroups_args /* {
923 		syscallarg(int) gidsetsize;
924 		syscallarg(netbsd32_gid_tp) gidset;
925 	} */ *uap = v;
926 	struct pcred *pc = p->p_cred;
927 	int ngrp;
928 	int error;
929 
930 	ngrp = SCARG(uap, gidsetsize);
931 	if (ngrp == 0) {
932 		*retval = pc->pc_ucred->cr_ngroups;
933 		return (0);
934 	}
935 	if (ngrp < pc->pc_ucred->cr_ngroups)
936 		return (EINVAL);
937 	ngrp = pc->pc_ucred->cr_ngroups;
938 	/* Should convert gid_t to netbsd32_gid_t, but they're the same */
939 	error = copyout((caddr_t)pc->pc_ucred->cr_groups,
940 			(caddr_t)(u_long)SCARG(uap, gidset),
941 			ngrp * sizeof(gid_t));
942 	if (error)
943 		return (error);
944 	*retval = ngrp;
945 	return (0);
946 }
947 
948 int
949 netbsd32_setgroups(p, v, retval)
950 	struct proc *p;
951 	void *v;
952 	register_t *retval;
953 {
954 	struct netbsd32_setgroups_args /* {
955 		syscallarg(int) gidsetsize;
956 		syscallarg(const netbsd32_gid_tp) gidset;
957 	} */ *uap = v;
958 	struct sys_setgroups_args ua;
959 
960 	NETBSD32TO64_UAP(gidsetsize);
961 	NETBSD32TOP_UAP(gidset, gid_t);
962 	return (sys_setgroups(p, &ua, retval));
963 }
964 
965 int
966 netbsd32_setpgid(p, v, retval)
967 	struct proc *p;
968 	void *v;
969 	register_t *retval;
970 {
971 	struct netbsd32_setpgid_args /* {
972 		syscallarg(int) pid;
973 		syscallarg(int) pgid;
974 	} */ *uap = v;
975 	struct sys_setpgid_args ua;
976 
977 	NETBSD32TO64_UAP(pid);
978 	NETBSD32TO64_UAP(pgid);
979 	return (sys_setpgid(p, &ua, retval));
980 }
981 
982 int
983 netbsd32_fcntl(p, v, retval)
984 	struct proc *p;
985 	void *v;
986 	register_t *retval;
987 {
988 	struct netbsd32_fcntl_args /* {
989 		syscallarg(int) fd;
990 		syscallarg(int) cmd;
991 		syscallarg(netbsd32_voidp) arg;
992 	} */ *uap = v;
993 	struct sys_fcntl_args ua;
994 
995 	NETBSD32TO64_UAP(fd);
996 	NETBSD32TO64_UAP(cmd);
997 	NETBSD32TOP_UAP(arg, void);
998 	/* we can do this because `struct flock' doesn't change */
999 	return (sys_fcntl(p, &ua, retval));
1000 }
1001 
1002 int
1003 netbsd32_dup2(p, v, retval)
1004 	struct proc *p;
1005 	void *v;
1006 	register_t *retval;
1007 {
1008 	struct netbsd32_dup2_args /* {
1009 		syscallarg(int) from;
1010 		syscallarg(int) to;
1011 	} */ *uap = v;
1012 	struct sys_dup2_args ua;
1013 
1014 	NETBSD32TO64_UAP(from);
1015 	NETBSD32TO64_UAP(to);
1016 	return (sys_dup2(p, &ua, retval));
1017 }
1018 
1019 int
1020 netbsd32_fsync(p, v, retval)
1021 	struct proc *p;
1022 	void *v;
1023 	register_t *retval;
1024 {
1025 	struct netbsd32_fsync_args /* {
1026 		syscallarg(int) fd;
1027 	} */ *uap = v;
1028 	struct sys_fsync_args ua;
1029 
1030 	NETBSD32TO64_UAP(fd);
1031 	return (sys_fsync(p, &ua, retval));
1032 }
1033 
1034 int
1035 netbsd32_setpriority(p, v, retval)
1036 	struct proc *p;
1037 	void *v;
1038 	register_t *retval;
1039 {
1040 	struct netbsd32_setpriority_args /* {
1041 		syscallarg(int) which;
1042 		syscallarg(int) who;
1043 		syscallarg(int) prio;
1044 	} */ *uap = v;
1045 	struct sys_setpriority_args ua;
1046 
1047 	NETBSD32TO64_UAP(which);
1048 	NETBSD32TO64_UAP(who);
1049 	NETBSD32TO64_UAP(prio);
1050 	return (sys_setpriority(p, &ua, retval));
1051 }
1052 
1053 int
1054 netbsd32_socket(p, v, retval)
1055 	struct proc *p;
1056 	void *v;
1057 	register_t *retval;
1058 {
1059 	struct netbsd32_socket_args /* {
1060 		syscallarg(int) domain;
1061 		syscallarg(int) type;
1062 		syscallarg(int) protocol;
1063 	} */ *uap = v;
1064 	struct sys_socket_args ua;
1065 
1066 	NETBSD32TO64_UAP(domain);
1067 	NETBSD32TO64_UAP(type);
1068 	NETBSD32TO64_UAP(protocol);
1069 	return (sys_socket(p, &ua, retval));
1070 }
1071 
1072 int
1073 netbsd32_connect(p, v, retval)
1074 	struct proc *p;
1075 	void *v;
1076 	register_t *retval;
1077 {
1078 	struct netbsd32_connect_args /* {
1079 		syscallarg(int) s;
1080 		syscallarg(const netbsd32_sockaddrp_t) name;
1081 		syscallarg(int) namelen;
1082 	} */ *uap = v;
1083 	struct sys_connect_args ua;
1084 
1085 	NETBSD32TO64_UAP(s);
1086 	NETBSD32TOP_UAP(name, struct sockaddr);
1087 	NETBSD32TO64_UAP(namelen);
1088 	return (sys_connect(p, &ua, retval));
1089 }
1090 
1091 int
1092 netbsd32_getpriority(p, v, retval)
1093 	struct proc *p;
1094 	void *v;
1095 	register_t *retval;
1096 {
1097 	struct netbsd32_getpriority_args /* {
1098 		syscallarg(int) which;
1099 		syscallarg(int) who;
1100 	} */ *uap = v;
1101 	struct sys_getpriority_args ua;
1102 
1103 	NETBSD32TO64_UAP(which);
1104 	NETBSD32TO64_UAP(who);
1105 	return (sys_getpriority(p, &ua, retval));
1106 }
1107 
1108 int
1109 netbsd32_bind(p, v, retval)
1110 	struct proc *p;
1111 	void *v;
1112 	register_t *retval;
1113 {
1114 	struct netbsd32_bind_args /* {
1115 		syscallarg(int) s;
1116 		syscallarg(const netbsd32_sockaddrp_t) name;
1117 		syscallarg(int) namelen;
1118 	} */ *uap = v;
1119 	struct sys_bind_args ua;
1120 
1121 	NETBSD32TO64_UAP(s);
1122 	NETBSD32TOP_UAP(name, struct sockaddr);
1123 	NETBSD32TO64_UAP(namelen);
1124 	return (sys_bind(p, &ua, retval));
1125 }
1126 
1127 int
1128 netbsd32_setsockopt(p, v, retval)
1129 	struct proc *p;
1130 	void *v;
1131 	register_t *retval;
1132 {
1133 	struct netbsd32_setsockopt_args /* {
1134 		syscallarg(int) s;
1135 		syscallarg(int) level;
1136 		syscallarg(int) name;
1137 		syscallarg(const netbsd32_voidp) val;
1138 		syscallarg(int) valsize;
1139 	} */ *uap = v;
1140 	struct sys_setsockopt_args ua;
1141 
1142 	NETBSD32TO64_UAP(s);
1143 	NETBSD32TO64_UAP(level);
1144 	NETBSD32TO64_UAP(name);
1145 	NETBSD32TOP_UAP(val, void);
1146 	NETBSD32TO64_UAP(valsize);
1147 	/* may be more efficient to do this inline. */
1148 	return (sys_setsockopt(p, &ua, retval));
1149 }
1150 
1151 int
1152 netbsd32_listen(p, v, retval)
1153 	struct proc *p;
1154 	void *v;
1155 	register_t *retval;
1156 {
1157 	struct netbsd32_listen_args /* {
1158 		syscallarg(int) s;
1159 		syscallarg(int) backlog;
1160 	} */ *uap = v;
1161 	struct sys_listen_args ua;
1162 
1163 	NETBSD32TO64_UAP(s);
1164 	NETBSD32TO64_UAP(backlog);
1165 	return (sys_listen(p, &ua, retval));
1166 }
1167 
1168 int
1169 netbsd32_fchown(p, v, retval)
1170 	struct proc *p;
1171 	void *v;
1172 	register_t *retval;
1173 {
1174 	struct netbsd32_fchown_args /* {
1175 		syscallarg(int) fd;
1176 		syscallarg(uid_t) uid;
1177 		syscallarg(gid_t) gid;
1178 	} */ *uap = v;
1179 	struct sys_fchown_args ua;
1180 
1181 	NETBSD32TO64_UAP(fd);
1182 	NETBSD32TO64_UAP(uid);
1183 	NETBSD32TO64_UAP(gid);
1184 	return (sys_fchown(p, &ua, retval));
1185 }
1186 
1187 int
1188 netbsd32_fchmod(p, v, retval)
1189 	struct proc *p;
1190 	void *v;
1191 	register_t *retval;
1192 {
1193 	struct netbsd32_fchmod_args /* {
1194 		syscallarg(int) fd;
1195 		syscallarg(mode_t) mode;
1196 	} */ *uap = v;
1197 	struct sys_fchmod_args ua;
1198 
1199 	NETBSD32TO64_UAP(fd);
1200 	NETBSD32TO64_UAP(mode);
1201 	return (sys_fchmod(p, &ua, retval));
1202 }
1203 
1204 int
1205 netbsd32_setreuid(p, v, retval)
1206 	struct proc *p;
1207 	void *v;
1208 	register_t *retval;
1209 {
1210 	struct netbsd32_setreuid_args /* {
1211 		syscallarg(uid_t) ruid;
1212 		syscallarg(uid_t) euid;
1213 	} */ *uap = v;
1214 	struct sys_setreuid_args ua;
1215 
1216 	NETBSD32TO64_UAP(ruid);
1217 	NETBSD32TO64_UAP(euid);
1218 	return (sys_setreuid(p, &ua, retval));
1219 }
1220 
1221 int
1222 netbsd32_setregid(p, v, retval)
1223 	struct proc *p;
1224 	void *v;
1225 	register_t *retval;
1226 {
1227 	struct netbsd32_setregid_args /* {
1228 		syscallarg(gid_t) rgid;
1229 		syscallarg(gid_t) egid;
1230 	} */ *uap = v;
1231 	struct sys_setregid_args ua;
1232 
1233 	NETBSD32TO64_UAP(rgid);
1234 	NETBSD32TO64_UAP(egid);
1235 	return (sys_setregid(p, &ua, retval));
1236 }
1237 
1238 int
1239 netbsd32_getsockopt(p, v, retval)
1240 	struct proc *p;
1241 	void *v;
1242 	register_t *retval;
1243 {
1244 	struct netbsd32_getsockopt_args /* {
1245 		syscallarg(int) s;
1246 		syscallarg(int) level;
1247 		syscallarg(int) name;
1248 		syscallarg(netbsd32_voidp) val;
1249 		syscallarg(netbsd32_intp) avalsize;
1250 	} */ *uap = v;
1251 	struct sys_getsockopt_args ua;
1252 
1253 	NETBSD32TO64_UAP(s);
1254 	NETBSD32TO64_UAP(level);
1255 	NETBSD32TO64_UAP(name);
1256 	NETBSD32TOP_UAP(val, void);
1257 	NETBSD32TOP_UAP(avalsize, int);
1258 	return (sys_getsockopt(p, &ua, retval));
1259 }
1260 
1261 int
1262 netbsd32_rename(p, v, retval)
1263 	struct proc *p;
1264 	void *v;
1265 	register_t *retval;
1266 {
1267 	struct netbsd32_rename_args /* {
1268 		syscallarg(const netbsd32_charp) from;
1269 		syscallarg(const netbsd32_charp) to;
1270 	} */ *uap = v;
1271 	struct sys_rename_args ua;
1272 
1273 	NETBSD32TOP_UAP(from, const char);
1274 	NETBSD32TOP_UAP(to, const char)
1275 
1276 	return (sys_rename(p, &ua, retval));
1277 }
1278 
1279 int
1280 netbsd32_flock(p, v, retval)
1281 	struct proc *p;
1282 	void *v;
1283 	register_t *retval;
1284 {
1285 	struct netbsd32_flock_args /* {
1286 		syscallarg(int) fd;
1287 		syscallarg(int) how;
1288 	} */ *uap = v;
1289 	struct sys_flock_args ua;
1290 
1291 	NETBSD32TO64_UAP(fd);
1292 	NETBSD32TO64_UAP(how)
1293 
1294 	return (sys_flock(p, &ua, retval));
1295 }
1296 
1297 int
1298 netbsd32_mkfifo(p, v, retval)
1299 	struct proc *p;
1300 	void *v;
1301 	register_t *retval;
1302 {
1303 	struct netbsd32_mkfifo_args /* {
1304 		syscallarg(const netbsd32_charp) path;
1305 		syscallarg(mode_t) mode;
1306 	} */ *uap = v;
1307 	struct sys_mkfifo_args ua;
1308 
1309 	NETBSD32TOP_UAP(path, const char)
1310 	NETBSD32TO64_UAP(mode);
1311 	return (sys_mkfifo(p, &ua, retval));
1312 }
1313 
1314 int
1315 netbsd32_shutdown(p, v, retval)
1316 	struct proc *p;
1317 	void *v;
1318 	register_t *retval;
1319 {
1320 	struct netbsd32_shutdown_args /* {
1321 		syscallarg(int) s;
1322 		syscallarg(int) how;
1323 	} */ *uap = v;
1324 	struct sys_shutdown_args ua;
1325 
1326 	NETBSD32TO64_UAP(s)
1327 	NETBSD32TO64_UAP(how);
1328 	return (sys_shutdown(p, &ua, retval));
1329 }
1330 
1331 int
1332 netbsd32_socketpair(p, v, retval)
1333 	struct proc *p;
1334 	void *v;
1335 	register_t *retval;
1336 {
1337 	struct netbsd32_socketpair_args /* {
1338 		syscallarg(int) domain;
1339 		syscallarg(int) type;
1340 		syscallarg(int) protocol;
1341 		syscallarg(netbsd32_intp) rsv;
1342 	} */ *uap = v;
1343 	struct sys_socketpair_args ua;
1344 
1345 	NETBSD32TO64_UAP(domain);
1346 	NETBSD32TO64_UAP(type);
1347 	NETBSD32TO64_UAP(protocol);
1348 	NETBSD32TOP_UAP(rsv, int);
1349 	/* Since we're just copying out two `int's we can do this */
1350 	return (sys_socketpair(p, &ua, retval));
1351 }
1352 
1353 int
1354 netbsd32_mkdir(p, v, retval)
1355 	struct proc *p;
1356 	void *v;
1357 	register_t *retval;
1358 {
1359 	struct netbsd32_mkdir_args /* {
1360 		syscallarg(const netbsd32_charp) path;
1361 		syscallarg(mode_t) mode;
1362 	} */ *uap = v;
1363 	struct sys_mkdir_args ua;
1364 
1365 	NETBSD32TOP_UAP(path, const char)
1366 	NETBSD32TO64_UAP(mode);
1367 	return (sys_mkdir(p, &ua, retval));
1368 }
1369 
1370 int
1371 netbsd32_rmdir(p, v, retval)
1372 	struct proc *p;
1373 	void *v;
1374 	register_t *retval;
1375 {
1376 	struct netbsd32_rmdir_args /* {
1377 		syscallarg(const netbsd32_charp) path;
1378 	} */ *uap = v;
1379 	struct sys_rmdir_args ua;
1380 
1381 	NETBSD32TOP_UAP(path, const char);
1382 	return (sys_rmdir(p, &ua, retval));
1383 }
1384 
1385 int
1386 netbsd32_quotactl(p, v, retval)
1387 	struct proc *p;
1388 	void *v;
1389 	register_t *retval;
1390 {
1391 	struct netbsd32_quotactl_args /* {
1392 		syscallarg(const netbsd32_charp) path;
1393 		syscallarg(int) cmd;
1394 		syscallarg(int) uid;
1395 		syscallarg(netbsd32_caddr_t) arg;
1396 	} */ *uap = v;
1397 	struct sys_quotactl_args ua;
1398 
1399 	NETBSD32TOP_UAP(path, const char);
1400 	NETBSD32TO64_UAP(cmd);
1401 	NETBSD32TO64_UAP(uid);
1402 	NETBSD32TOX64_UAP(arg, caddr_t);
1403 	return (sys_quotactl(p, &ua, retval));
1404 }
1405 
1406 #if defined(NFS) || defined(NFSSERVER)
1407 int
1408 netbsd32_nfssvc(p, v, retval)
1409 	struct proc *p;
1410 	void *v;
1411 	register_t *retval;
1412 {
1413 #if 0
1414 	struct netbsd32_nfssvc_args /* {
1415 		syscallarg(int) flag;
1416 		syscallarg(netbsd32_voidp) argp;
1417 	} */ *uap = v;
1418 	struct sys_nfssvc_args ua;
1419 
1420 	NETBSD32TO64_UAP(flag);
1421 	NETBSD32TOP_UAP(argp, void);
1422 	return (sys_nfssvc(p, &ua, retval));
1423 #else
1424 	/* Why would we want to support a 32-bit nfsd? */
1425 	return (ENOSYS);
1426 #endif
1427 }
1428 #endif
1429 
1430 #if defined(NFS) || defined(NFSSERVER)
1431 int
1432 netbsd32_getfh(p, v, retval)
1433 	struct proc *p;
1434 	void *v;
1435 	register_t *retval;
1436 {
1437 	struct netbsd32_getfh_args /* {
1438 		syscallarg(const netbsd32_charp) fname;
1439 		syscallarg(netbsd32_fhandlep_t) fhp;
1440 	} */ *uap = v;
1441 	struct sys_getfh_args ua;
1442 
1443 	NETBSD32TOP_UAP(fname, const char);
1444 	NETBSD32TOP_UAP(fhp, struct fhandle);
1445 	/* Lucky for us a fhandlep_t doesn't change sizes */
1446 	return (sys_getfh(p, &ua, retval));
1447 }
1448 #endif
1449 
1450 int
1451 netbsd32_sysarch(p, v, retval)
1452 	struct proc *p;
1453 	void *v;
1454 	register_t *retval;
1455 {
1456 	struct netbsd32_sysarch_args /* {
1457 		syscallarg(int) op;
1458 		syscallarg(netbsd32_voidp) parms;
1459 	} */ *uap = v;
1460 
1461 	switch (SCARG(uap, op)) {
1462 	default:
1463 		printf("(%s) netbsd32_sysarch(%d)\n", MACHINE, SCARG(uap, op));
1464 		return EINVAL;
1465 	}
1466 }
1467 
1468 int
1469 netbsd32_pread(p, v, retval)
1470 	struct proc *p;
1471 	void *v;
1472 	register_t *retval;
1473 {
1474 	struct netbsd32_pread_args /* {
1475 		syscallarg(int) fd;
1476 		syscallarg(netbsd32_voidp) buf;
1477 		syscallarg(netbsd32_size_t) nbyte;
1478 		syscallarg(int) pad;
1479 		syscallarg(off_t) offset;
1480 	} */ *uap = v;
1481 	struct sys_pread_args ua;
1482 	ssize_t rt;
1483 	int error;
1484 
1485 	NETBSD32TO64_UAP(fd);
1486 	NETBSD32TOP_UAP(buf, void);
1487 	NETBSD32TOX_UAP(nbyte, size_t);
1488 	NETBSD32TO64_UAP(pad);
1489 	NETBSD32TO64_UAP(offset);
1490 	error = sys_pread(p, &ua, (register_t *)&rt);
1491 	*retval = rt;
1492 	return (error);
1493 }
1494 
1495 int
1496 netbsd32_pwrite(p, v, retval)
1497 	struct proc *p;
1498 	void *v;
1499 	register_t *retval;
1500 {
1501 	struct netbsd32_pwrite_args /* {
1502 		syscallarg(int) fd;
1503 		syscallarg(const netbsd32_voidp) buf;
1504 		syscallarg(netbsd32_size_t) nbyte;
1505 		syscallarg(int) pad;
1506 		syscallarg(off_t) offset;
1507 	} */ *uap = v;
1508 	struct sys_pwrite_args ua;
1509 	ssize_t rt;
1510 	int error;
1511 
1512 	NETBSD32TO64_UAP(fd);
1513 	NETBSD32TOP_UAP(buf, void);
1514 	NETBSD32TOX_UAP(nbyte, size_t);
1515 	NETBSD32TO64_UAP(pad);
1516 	NETBSD32TO64_UAP(offset);
1517 	error = sys_pwrite(p, &ua, (register_t *)&rt);
1518 	*retval = rt;
1519 	return (error);
1520 }
1521 
1522 int
1523 netbsd32_setgid(p, v, retval)
1524 	struct proc *p;
1525 	void *v;
1526 	register_t *retval;
1527 {
1528 	struct netbsd32_setgid_args /* {
1529 		syscallarg(gid_t) gid;
1530 	} */ *uap = v;
1531 	struct sys_setgid_args ua;
1532 
1533 	NETBSD32TO64_UAP(gid);
1534 	return (sys_setgid(p, v, retval));
1535 }
1536 
1537 int
1538 netbsd32_setegid(p, v, retval)
1539 	struct proc *p;
1540 	void *v;
1541 	register_t *retval;
1542 {
1543 	struct netbsd32_setegid_args /* {
1544 		syscallarg(gid_t) egid;
1545 	} */ *uap = v;
1546 	struct sys_setegid_args ua;
1547 
1548 	NETBSD32TO64_UAP(egid);
1549 	return (sys_setegid(p, v, retval));
1550 }
1551 
1552 int
1553 netbsd32_seteuid(p, v, retval)
1554 	struct proc *p;
1555 	void *v;
1556 	register_t *retval;
1557 {
1558 	struct netbsd32_seteuid_args /* {
1559 		syscallarg(gid_t) euid;
1560 	} */ *uap = v;
1561 	struct sys_seteuid_args ua;
1562 
1563 	NETBSD32TO64_UAP(euid);
1564 	return (sys_seteuid(p, v, retval));
1565 }
1566 
1567 #ifdef LFS
1568 int
1569 netbsd32_sys_lfs_bmapv(p, v, retval)
1570 	struct proc *p;
1571 	void *v;
1572 	register_t *retval;
1573 {
1574 
1575 	return (ENOSYS);	/* XXX */
1576 }
1577 
1578 int
1579 netbsd32_sys_lfs_markv(p, v, retval)
1580 	struct proc *p;
1581 	void *v;
1582 	register_t *retval;
1583 {
1584 
1585 	return (ENOSYS);	/* XXX */
1586 }
1587 
1588 int
1589 netbsd32_sys_lfs_segclean(p, v, retval)
1590 	struct proc *p;
1591 	void *v;
1592 	register_t *retval;
1593 {
1594 
1595 	return (ENOSYS);	/* XXX */
1596 }
1597 
1598 int
1599 netbsd32_sys_lfs_segwait(p, v, retval)
1600 	struct proc *p;
1601 	void *v;
1602 	register_t *retval;
1603 {
1604 
1605 	return (ENOSYS);	/* XXX */
1606 }
1607 #endif
1608 
1609 int
1610 netbsd32_pathconf(p, v, retval)
1611 	struct proc *p;
1612 	void *v;
1613 	register_t *retval;
1614 {
1615 	struct netbsd32_pathconf_args /* {
1616 		syscallarg(int) fd;
1617 		syscallarg(int) name;
1618 	} */ *uap = v;
1619 	struct sys_pathconf_args ua;
1620 	long rt;
1621 	int error;
1622 
1623 	NETBSD32TOP_UAP(path, const char);
1624 	NETBSD32TO64_UAP(name);
1625 	error = sys_pathconf(p, &ua, (register_t *)&rt);
1626 	*retval = rt;
1627 	return (error);
1628 }
1629 
1630 int
1631 netbsd32_fpathconf(p, v, retval)
1632 	struct proc *p;
1633 	void *v;
1634 	register_t *retval;
1635 {
1636 	struct netbsd32_fpathconf_args /* {
1637 		syscallarg(int) fd;
1638 		syscallarg(int) name;
1639 	} */ *uap = v;
1640 	struct sys_fpathconf_args ua;
1641 	long rt;
1642 	int error;
1643 
1644 	NETBSD32TO64_UAP(fd);
1645 	NETBSD32TO64_UAP(name);
1646 	error = sys_fpathconf(p, &ua, (register_t *)&rt);
1647 	*retval = rt;
1648 	return (error);
1649 }
1650 
1651 int
1652 netbsd32_getrlimit(p, v, retval)
1653 	struct proc *p;
1654 	void *v;
1655 	register_t *retval;
1656 {
1657 	struct netbsd32_getrlimit_args /* {
1658 		syscallarg(int) which;
1659 		syscallarg(netbsd32_rlimitp_t) rlp;
1660 	} */ *uap = v;
1661 	int which = SCARG(uap, which);
1662 
1663 	if ((u_int)which >= RLIM_NLIMITS)
1664 		return (EINVAL);
1665 	return (copyout(&p->p_rlimit[which], (caddr_t)(u_long)SCARG(uap, rlp),
1666 	    sizeof(struct rlimit)));
1667 }
1668 
1669 int
1670 netbsd32_setrlimit(p, v, retval)
1671 	struct proc *p;
1672 	void *v;
1673 	register_t *retval;
1674 {
1675 	struct netbsd32_setrlimit_args /* {
1676 		syscallarg(int) which;
1677 		syscallarg(const netbsd32_rlimitp_t) rlp;
1678 	} */ *uap = v;
1679 		int which = SCARG(uap, which);
1680 	struct rlimit alim;
1681 	int error;
1682 
1683 	error = copyin((caddr_t)(u_long)SCARG(uap, rlp), &alim, sizeof(struct rlimit));
1684 	if (error)
1685 		return (error);
1686 	return (dosetrlimit(p, p->p_cred, which, &alim));
1687 }
1688 
1689 int
1690 netbsd32_mmap(p, v, retval)
1691 	struct proc *p;
1692 	void *v;
1693 	register_t *retval;
1694 {
1695 	struct netbsd32_mmap_args /* {
1696 		syscallarg(netbsd32_voidp) addr;
1697 		syscallarg(netbsd32_size_t) len;
1698 		syscallarg(int) prot;
1699 		syscallarg(int) flags;
1700 		syscallarg(int) fd;
1701 		syscallarg(netbsd32_long) pad;
1702 		syscallarg(off_t) pos;
1703 	} */ *uap = v;
1704 	struct sys_mmap_args ua;
1705 	void *rt;
1706 	int error;
1707 
1708 	NETBSD32TOP_UAP(addr, void);
1709 	NETBSD32TOX_UAP(len, size_t);
1710 	NETBSD32TO64_UAP(prot);
1711 	NETBSD32TO64_UAP(flags);
1712 	NETBSD32TO64_UAP(fd);
1713 	NETBSD32TOX_UAP(pad, long);
1714 	NETBSD32TOX_UAP(pos, off_t);
1715 	error = sys_mmap(p, &ua, (register_t *)&rt);
1716 	if ((u_long)rt > (u_long)UINT_MAX) {
1717 		printf("netbsd32_mmap: retval out of range: %p", rt);
1718 		/* Should try to recover and return an error here. */
1719 	}
1720 	*retval = (netbsd32_voidp)(u_long)rt;
1721 	return (error);
1722 }
1723 
1724 int
1725 netbsd32_lseek(p, v, retval)
1726 	struct proc *p;
1727 	void *v;
1728 	register_t *retval;
1729 {
1730 	struct netbsd32_lseek_args /* {
1731 		syscallarg(int) fd;
1732 		syscallarg(int) pad;
1733 		syscallarg(off_t) offset;
1734 		syscallarg(int) whence;
1735 	} */ *uap = v;
1736 	struct sys_lseek_args ua;
1737 
1738 	NETBSD32TO64_UAP(fd);
1739 	NETBSD32TO64_UAP(pad);
1740 	NETBSD32TO64_UAP(offset);
1741 	NETBSD32TO64_UAP(whence);
1742 	return (sys_lseek(p, &ua, retval));
1743 }
1744 
1745 int
1746 netbsd32_truncate(p, v, retval)
1747 	struct proc *p;
1748 	void *v;
1749 	register_t *retval;
1750 {
1751 	struct netbsd32_truncate_args /* {
1752 		syscallarg(const netbsd32_charp) path;
1753 		syscallarg(int) pad;
1754 		syscallarg(off_t) length;
1755 	} */ *uap = v;
1756 	struct sys_truncate_args ua;
1757 
1758 	NETBSD32TOP_UAP(path, const char);
1759 	NETBSD32TO64_UAP(pad);
1760 	NETBSD32TO64_UAP(length);
1761 	return (sys_truncate(p, &ua, retval));
1762 }
1763 
1764 int
1765 netbsd32_ftruncate(p, v, retval)
1766 	struct proc *p;
1767 	void *v;
1768 	register_t *retval;
1769 {
1770 	struct netbsd32_ftruncate_args /* {
1771 		syscallarg(int) fd;
1772 		syscallarg(int) pad;
1773 		syscallarg(off_t) length;
1774 	} */ *uap = v;
1775 	struct sys_ftruncate_args ua;
1776 
1777 	NETBSD32TO64_UAP(fd);
1778 	NETBSD32TO64_UAP(pad);
1779 	NETBSD32TO64_UAP(length);
1780 	return (sys_ftruncate(p, &ua, retval));
1781 }
1782 
1783 int
1784 netbsd32_mlock(p, v, retval)
1785 	struct proc *p;
1786 	void *v;
1787 	register_t *retval;
1788 {
1789 	struct netbsd32_mlock_args /* {
1790 		syscallarg(const netbsd32_voidp) addr;
1791 		syscallarg(netbsd32_size_t) len;
1792 	} */ *uap = v;
1793 	struct sys_mlock_args ua;
1794 
1795 	NETBSD32TOP_UAP(addr, const void);
1796 	NETBSD32TO64_UAP(len);
1797 	return (sys_mlock(p, &ua, retval));
1798 }
1799 
1800 int
1801 netbsd32_munlock(p, v, retval)
1802 	struct proc *p;
1803 	void *v;
1804 	register_t *retval;
1805 {
1806 	struct netbsd32_munlock_args /* {
1807 		syscallarg(const netbsd32_voidp) addr;
1808 		syscallarg(netbsd32_size_t) len;
1809 	} */ *uap = v;
1810 	struct sys_munlock_args ua;
1811 
1812 	NETBSD32TOP_UAP(addr, const void);
1813 	NETBSD32TO64_UAP(len);
1814 	return (sys_munlock(p, &ua, retval));
1815 }
1816 
1817 int
1818 netbsd32_undelete(p, v, retval)
1819 	struct proc *p;
1820 	void *v;
1821 	register_t *retval;
1822 {
1823 	struct netbsd32_undelete_args /* {
1824 		syscallarg(const netbsd32_charp) path;
1825 	} */ *uap = v;
1826 	struct sys_undelete_args ua;
1827 
1828 	NETBSD32TOP_UAP(path, const char);
1829 	return (sys_undelete(p, &ua, retval));
1830 }
1831 
1832 int
1833 netbsd32_getpgid(p, v, retval)
1834 	struct proc *p;
1835 	void *v;
1836 	register_t *retval;
1837 {
1838 	struct netbsd32_getpgid_args /* {
1839 		syscallarg(pid_t) pid;
1840 	} */ *uap = v;
1841 	struct sys_getpgid_args ua;
1842 
1843 	NETBSD32TO64_UAP(pid);
1844 	return (sys_getpgid(p, &ua, retval));
1845 }
1846 
1847 int
1848 netbsd32_reboot(p, v, retval)
1849 	struct proc *p;
1850 	void *v;
1851 	register_t *retval;
1852 {
1853 	struct netbsd32_reboot_args /* {
1854 		syscallarg(int) opt;
1855 		syscallarg(netbsd32_charp) bootstr;
1856 	} */ *uap = v;
1857 	struct sys_reboot_args ua;
1858 
1859 	NETBSD32TO64_UAP(opt);
1860 	NETBSD32TOP_UAP(bootstr, char);
1861 	return (sys_reboot(p, &ua, retval));
1862 }
1863 
1864 int
1865 netbsd32_poll(p, v, retval)
1866 	struct proc *p;
1867 	void *v;
1868 	register_t *retval;
1869 {
1870 	struct netbsd32_poll_args /* {
1871 		syscallarg(netbsd32_pollfdp_t) fds;
1872 		syscallarg(u_int) nfds;
1873 		syscallarg(int) timeout;
1874 	} */ *uap = v;
1875 	struct sys_poll_args ua;
1876 
1877 	NETBSD32TOP_UAP(fds, struct pollfd);
1878 	NETBSD32TO64_UAP(nfds);
1879 	NETBSD32TO64_UAP(timeout);
1880 	return (sys_poll(p, &ua, retval));
1881 }
1882 
1883 int
1884 netbsd32_fdatasync(p, v, retval)
1885 	struct proc *p;
1886 	void *v;
1887 	register_t *retval;
1888 {
1889 	struct netbsd32_fdatasync_args /* {
1890 		syscallarg(int) fd;
1891 	} */ *uap = v;
1892 	struct sys_fdatasync_args ua;
1893 
1894 	NETBSD32TO64_UAP(fd);
1895 	return (sys_fdatasync(p, &ua, retval));
1896 }
1897 
1898 int
1899 netbsd32___posix_rename(p, v, retval)
1900 	struct proc *p;
1901 	void *v;
1902 	register_t *retval;
1903 {
1904 	struct netbsd32___posix_rename_args /* {
1905 		syscallarg(const netbsd32_charp) from;
1906 		syscallarg(const netbsd32_charp) to;
1907 	} */ *uap = v;
1908 	struct sys___posix_rename_args ua;
1909 
1910 	NETBSD32TOP_UAP(from, const char);
1911 	NETBSD32TOP_UAP(to, const char);
1912 	return (sys___posix_rename(p, &ua, retval));
1913 }
1914 
1915 int
1916 netbsd32_swapctl(p, v, retval)
1917 	struct proc *p;
1918 	void *v;
1919 	register_t *retval;
1920 {
1921 	struct netbsd32_swapctl_args /* {
1922 		syscallarg(int) cmd;
1923 		syscallarg(const netbsd32_voidp) arg;
1924 		syscallarg(int) misc;
1925 	} */ *uap = v;
1926 	struct sys_swapctl_args ua;
1927 
1928 	NETBSD32TO64_UAP(cmd);
1929 	NETBSD32TOP_UAP(arg, const void);
1930 	NETBSD32TO64_UAP(misc);
1931 	return (sys_swapctl(p, &ua, retval));
1932 }
1933 
1934 int
1935 netbsd32_minherit(p, v, retval)
1936 	struct proc *p;
1937 	void *v;
1938 	register_t *retval;
1939 {
1940 	struct netbsd32_minherit_args /* {
1941 		syscallarg(netbsd32_voidp) addr;
1942 		syscallarg(netbsd32_size_t) len;
1943 		syscallarg(int) inherit;
1944 	} */ *uap = v;
1945 	struct sys_minherit_args ua;
1946 
1947 	NETBSD32TOP_UAP(addr, void);
1948 	NETBSD32TOX_UAP(len, size_t);
1949 	NETBSD32TO64_UAP(inherit);
1950 	return (sys_minherit(p, &ua, retval));
1951 }
1952 
1953 int
1954 netbsd32_lchmod(p, v, retval)
1955 	struct proc *p;
1956 	void *v;
1957 	register_t *retval;
1958 {
1959 	struct netbsd32_lchmod_args /* {
1960 		syscallarg(const netbsd32_charp) path;
1961 		syscallarg(mode_t) mode;
1962 	} */ *uap = v;
1963 	struct sys_lchmod_args ua;
1964 
1965 	NETBSD32TOP_UAP(path, const char);
1966 	NETBSD32TO64_UAP(mode);
1967 	return (sys_lchmod(p, &ua, retval));
1968 }
1969 
1970 int
1971 netbsd32_lchown(p, v, retval)
1972 	struct proc *p;
1973 	void *v;
1974 	register_t *retval;
1975 {
1976 	struct netbsd32_lchown_args /* {
1977 		syscallarg(const netbsd32_charp) path;
1978 		syscallarg(uid_t) uid;
1979 		syscallarg(gid_t) gid;
1980 	} */ *uap = v;
1981 	struct sys_lchown_args ua;
1982 
1983 	NETBSD32TOP_UAP(path, const char);
1984 	NETBSD32TO64_UAP(uid);
1985 	NETBSD32TO64_UAP(gid);
1986 	return (sys_lchown(p, &ua, retval));
1987 }
1988 
1989 int
1990 netbsd32___msync13(p, v, retval)
1991 	struct proc *p;
1992 	void *v;
1993 	register_t *retval;
1994 {
1995 	struct netbsd32___msync13_args /* {
1996 		syscallarg(netbsd32_voidp) addr;
1997 		syscallarg(netbsd32_size_t) len;
1998 		syscallarg(int) flags;
1999 	} */ *uap = v;
2000 	struct sys___msync13_args ua;
2001 
2002 	NETBSD32TOP_UAP(addr, void);
2003 	NETBSD32TOX_UAP(len, size_t);
2004 	NETBSD32TO64_UAP(flags);
2005 	return (sys___msync13(p, &ua, retval));
2006 }
2007 
2008 int
2009 netbsd32___posix_chown(p, v, retval)
2010 	struct proc *p;
2011 	void *v;
2012 	register_t *retval;
2013 {
2014 	struct netbsd32___posix_chown_args /* {
2015 		syscallarg(const netbsd32_charp) path;
2016 		syscallarg(uid_t) uid;
2017 		syscallarg(gid_t) gid;
2018 	} */ *uap = v;
2019 	struct sys___posix_chown_args ua;
2020 
2021 	NETBSD32TOP_UAP(path, const char);
2022 	NETBSD32TO64_UAP(uid);
2023 	NETBSD32TO64_UAP(gid);
2024 	return (sys___posix_chown(p, &ua, retval));
2025 }
2026 
2027 int
2028 netbsd32___posix_fchown(p, v, retval)
2029 	struct proc *p;
2030 	void *v;
2031 	register_t *retval;
2032 {
2033 	struct netbsd32___posix_fchown_args /* {
2034 		syscallarg(int) fd;
2035 		syscallarg(uid_t) uid;
2036 		syscallarg(gid_t) gid;
2037 	} */ *uap = v;
2038 	struct sys___posix_fchown_args ua;
2039 
2040 	NETBSD32TO64_UAP(fd);
2041 	NETBSD32TO64_UAP(uid);
2042 	NETBSD32TO64_UAP(gid);
2043 	return (sys___posix_fchown(p, &ua, retval));
2044 }
2045 
2046 int
2047 netbsd32___posix_lchown(p, v, retval)
2048 	struct proc *p;
2049 	void *v;
2050 	register_t *retval;
2051 {
2052 	struct netbsd32___posix_lchown_args /* {
2053 		syscallarg(const netbsd32_charp) path;
2054 		syscallarg(uid_t) uid;
2055 		syscallarg(gid_t) gid;
2056 	} */ *uap = v;
2057 	struct sys___posix_lchown_args ua;
2058 
2059 	NETBSD32TOP_UAP(path, const char);
2060 	NETBSD32TO64_UAP(uid);
2061 	NETBSD32TO64_UAP(gid);
2062 	return (sys___posix_lchown(p, &ua, retval));
2063 }
2064 
2065 int
2066 netbsd32_getsid(p, v, retval)
2067 	struct proc *p;
2068 	void *v;
2069 	register_t *retval;
2070 {
2071 	struct netbsd32_getsid_args /* {
2072 		syscallarg(pid_t) pid;
2073 	} */ *uap = v;
2074 	struct sys_getsid_args ua;
2075 
2076 	NETBSD32TO64_UAP(pid);
2077 	return (sys_getsid(p, &ua, retval));
2078 }
2079 
2080 #ifdef KTRACE
2081 int
2082 netbsd32_fktrace(p, v, retval)
2083 	struct proc *p;
2084 	void *v;
2085 	register_t *retval;
2086 {
2087 	struct netbsd32_fktrace_args /* {
2088 		syscallarg(const int) fd;
2089 		syscallarg(int) ops;
2090 		syscallarg(int) facs;
2091 		syscallarg(int) pid;
2092 	} */ *uap = v;
2093 #if 0
2094 	struct sys_fktrace_args ua;
2095 #else
2096 	/* XXXX */
2097 	struct sys_fktrace_noconst_args {
2098 		syscallarg(int) fd;
2099 		syscallarg(int) ops;
2100 		syscallarg(int) facs;
2101 		syscallarg(int) pid;
2102 	} ua;
2103 #endif
2104 
2105 	NETBSD32TOX_UAP(fd, int);
2106 	NETBSD32TO64_UAP(ops);
2107 	NETBSD32TO64_UAP(facs);
2108 	NETBSD32TO64_UAP(pid);
2109 	return (sys_fktrace(p, &ua, retval));
2110 }
2111 #endif /* KTRACE */
2112 
2113 int netbsd32___sigpending14(p, v, retval)
2114 	struct proc *p;
2115 	void   *v;
2116 	register_t *retval;
2117 {
2118 	struct netbsd32___sigpending14_args /* {
2119 		syscallarg(sigset_t *) set;
2120 	} */ *uap = v;
2121 	struct sys___sigpending14_args ua;
2122 
2123 	NETBSD32TOP_UAP(set, sigset_t);
2124 	return (sys___sigpending14(p, &ua, retval));
2125 }
2126 
2127 int netbsd32___sigprocmask14(p, v, retval)
2128 	struct proc *p;
2129 	void   *v;
2130 	register_t *retval;
2131 {
2132 	struct netbsd32___sigprocmask14_args /* {
2133 		syscallarg(int) how;
2134 		syscallarg(const sigset_t *) set;
2135 		syscallarg(sigset_t *) oset;
2136 	} */ *uap = v;
2137 	struct sys___sigprocmask14_args ua;
2138 
2139 	NETBSD32TO64_UAP(how);
2140 	NETBSD32TOP_UAP(set, sigset_t);
2141 	NETBSD32TOP_UAP(oset, sigset_t);
2142 	return (sys___sigprocmask14(p, &ua, retval));
2143 }
2144 
2145 int netbsd32___sigsuspend14(p, v, retval)
2146 	struct proc *p;
2147 	void   *v;
2148 	register_t *retval;
2149 {
2150 	struct netbsd32___sigsuspend14_args /* {
2151 		syscallarg(const sigset_t *) set;
2152 	} */ *uap = v;
2153 	struct sys___sigsuspend14_args ua;
2154 
2155 	NETBSD32TOP_UAP(set, sigset_t);
2156 	return (sys___sigsuspend14(p, &ua, retval));
2157 };
2158 
2159 int netbsd32_fchroot(p, v, retval)
2160 	struct proc *p;
2161 	void *v;
2162 	register_t *retval;
2163 {
2164 	struct netbsd32_fchroot_args /* {
2165 		syscallarg(int) fd;
2166 	} */ *uap = v;
2167 	struct sys_fchroot_args ua;
2168 
2169 	NETBSD32TO64_UAP(fd);
2170 	return (sys_fchroot(p, &ua, retval));
2171 }
2172 
2173 /*
2174  * Open a file given a file handle.
2175  *
2176  * Check permissions, allocate an open file structure,
2177  * and call the device open routine if any.
2178  */
2179 int
2180 netbsd32_fhopen(p, v, retval)
2181 	struct proc *p;
2182 	void *v;
2183 	register_t *retval;
2184 {
2185 	struct netbsd32_fhopen_args /* {
2186 		syscallarg(const fhandle_t *) fhp;
2187 		syscallarg(int) flags;
2188 	} */ *uap = v;
2189 	struct sys_fhopen_args ua;
2190 
2191 	NETBSD32TOP_UAP(fhp, fhandle_t);
2192 	NETBSD32TO64_UAP(flags);
2193 	return (sys_fhopen(p, &ua, retval));
2194 }
2195 
2196 int netbsd32_fhstat(p, v, retval)
2197 	struct proc *p;
2198 	void *v;
2199 	register_t *retval;
2200 {
2201 	struct netbsd32_fhstat_args /* {
2202 		syscallarg(const netbsd32_fhandlep_t) fhp;
2203 		syscallarg(struct stat *) sb;
2204 	} */ *uap = v;
2205 	struct sys_fhstat_args ua;
2206 
2207 	NETBSD32TOP_UAP(fhp, const fhandle_t);
2208 	NETBSD32TOP_UAP(sb, struct stat);
2209 	return (sys_fhstat(p, &ua, retval));
2210 }
2211 
2212 int netbsd32_fhstatfs(p, v, retval)
2213 	struct proc *p;
2214 	void *v;
2215 	register_t *retval;
2216 {
2217 	struct netbsd32_fhstatfs_args /* {
2218 		syscallarg(const netbsd32_fhandlep_t) fhp;
2219 		syscallarg(struct statfs *) buf;
2220 	} */ *uap = v;
2221 	struct sys_fhstatfs_args ua;
2222 
2223 	NETBSD32TOP_UAP(fhp, const fhandle_t);
2224 	NETBSD32TOP_UAP(buf, struct statfs);
2225 	return (sys_fhstatfs(p, &ua, retval));
2226 }
2227 
2228 /* virtual memory syscalls */
2229 int
2230 netbsd32_ovadvise(p, v, retval)
2231 	struct proc *p;
2232 	void *v;
2233 	register_t *retval;
2234 {
2235 	struct netbsd32_ovadvise_args /* {
2236 		syscallarg(int) anom;
2237 	} */ *uap = v;
2238 	struct sys_ovadvise_args ua;
2239 
2240 	NETBSD32TO64_UAP(anom);
2241 	return (sys_ovadvise(p, &ua, retval));
2242 }
2243 
2244