xref: /netbsd-src/sys/compat/netbsd32/netbsd32_netbsd.c (revision fff57c5525bbe431aee7bdb3983954f0627a42cb)
1 /*	$NetBSD: netbsd32_netbsd.c,v 1.144 2008/05/29 14:51:26 mrg 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  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: netbsd32_netbsd.c,v 1.144 2008/05/29 14:51:26 mrg Exp $");
31 
32 #if defined(_KERNEL_OPT)
33 #include "opt_ddb.h"
34 #include "opt_ntp.h"
35 #include "opt_compat_netbsd.h"
36 #include "opt_compat_43.h"
37 #include "opt_sysv.h"
38 #include "opt_nfsserver.h"
39 #include "opt_syscall_debug.h"
40 #include "opt_ptrace.h"
41 
42 #include "fs_lfs.h"
43 #include "fs_nfs.h"
44 #endif
45 
46 /*
47  * Though COMPAT_OLDSOCK is needed only for COMPAT_43, SunOS, Linux,
48  * HP-UX, FreeBSD, Ultrix, OSF1, we define it unconditionally so that
49  * this would be LKM-safe.
50  */
51 #define COMPAT_OLDSOCK /* used by <sys/socket.h> */
52 
53 #include <sys/param.h>
54 #include <sys/systm.h>
55 #include <sys/kernel.h>
56 //#define msg __msg /* Don't ask me! */
57 #include <sys/malloc.h>
58 #include <sys/mount.h>
59 #include <sys/socket.h>
60 #include <sys/sockio.h>
61 #include <sys/socketvar.h>
62 #include <sys/mbuf.h>
63 #include <sys/stat.h>
64 #include <sys/time.h>
65 #include <sys/signalvar.h>
66 #include <sys/ptrace.h>
67 #include <sys/ktrace.h>
68 #include <sys/trace.h>
69 #include <sys/resourcevar.h>
70 #include <sys/pool.h>
71 #include <sys/vnode.h>
72 #include <sys/file.h>
73 #include <sys/filedesc.h>
74 #include <sys/namei.h>
75 #include <sys/dirent.h>
76 #include <sys/kauth.h>
77 
78 #include <uvm/uvm_extern.h>
79 
80 #include <sys/syscallargs.h>
81 #include <sys/proc.h>
82 #include <sys/acct.h>
83 #include <sys/exec.h>
84 
85 #include <net/if.h>
86 
87 #include <compat/netbsd32/netbsd32.h>
88 #include <compat/netbsd32/netbsd32_exec.h>
89 #include <compat/netbsd32/netbsd32_syscall.h>
90 #include <compat/netbsd32/netbsd32_syscallargs.h>
91 #include <compat/netbsd32/netbsd32_conv.h>
92 
93 #include <machine/frame.h>
94 
95 #if defined(DDB)
96 #include <ddb/ddbvar.h>
97 #endif
98 
99 extern struct sysent netbsd32_sysent[];
100 #ifdef SYSCALL_DEBUG
101 extern const char * const netbsd32_syscallnames[];
102 #endif
103 #ifdef __HAVE_SYSCALL_INTERN
104 void netbsd32_syscall_intern(struct proc *);
105 #else
106 void syscall(void);
107 #endif
108 
109 #define LIMITCHECK(a, b) ((a) != RLIM_INFINITY && (a) > (b))
110 
111 #ifdef COMPAT_16
112 extern char netbsd32_sigcode[], netbsd32_esigcode[];
113 struct uvm_object *emul_netbsd32_object;
114 #endif
115 
116 extern struct sysctlnode netbsd32_sysctl_root;
117 
118 const struct emul emul_netbsd32 = {
119 	"netbsd32",
120 	"/emul/netbsd32",
121 #ifndef __HAVE_MINIMAL_EMUL
122 	0,
123 	NULL,
124 	NETBSD32_SYS_syscall,
125 	NETBSD32_SYS_NSYSENT,
126 #endif
127 	netbsd32_sysent,
128 #ifdef SYSCALL_DEBUG
129 	netbsd32_syscallnames,
130 #else
131 	NULL,
132 #endif
133 	netbsd32_sendsig,
134 	trapsignal,
135 	NULL,
136 #ifdef COMPAT_16
137 	netbsd32_sigcode,
138 	netbsd32_esigcode,
139 	&emul_netbsd32_object,
140 #else
141 	NULL,
142 	NULL,
143 	NULL,
144 #endif
145 	netbsd32_setregs,
146 	NULL,
147 	NULL,
148 	NULL,
149 	NULL,
150 	NULL,
151 #ifdef __HAVE_SYSCALL_INTERN
152 	netbsd32_syscall_intern,
153 #else
154 	syscall,
155 #endif
156 	&netbsd32_sysctl_root,
157 	NULL,
158 
159 	netbsd32_vm_default_addr,
160 	NULL,
161 	sizeof(ucontext32_t),
162 	startlwp32,
163 };
164 
165 /*
166  * below are all the standard NetBSD system calls, in the 32bit
167  * environment, with the necessary conversions to 64bit before
168  * calling the real syscall.  anything that needs special
169  * attention is handled elsewhere.
170  */
171 
172 int
173 netbsd32_exit(struct lwp *l, const struct netbsd32_exit_args *uap, register_t *retval)
174 {
175 	/* {
176 		syscallarg(int) rval;
177 	} */
178 	struct sys_exit_args ua;
179 
180 	NETBSD32TO64_UAP(rval);
181 	return sys_exit(l, &ua, retval);
182 }
183 
184 int
185 netbsd32_read(struct lwp *l, const struct netbsd32_read_args *uap, register_t *retval)
186 {
187 	/* {
188 		syscallarg(int) fd;
189 		syscallarg(netbsd32_voidp) buf;
190 		syscallarg(netbsd32_size_t) nbyte;
191 	} */
192 	struct sys_read_args ua;
193 
194 	NETBSD32TO64_UAP(fd);
195 	NETBSD32TOP_UAP(buf, void *);
196 	NETBSD32TOX_UAP(nbyte, size_t);
197 	return sys_read(l, &ua, retval);
198 }
199 
200 int
201 netbsd32_write(struct lwp *l, const struct netbsd32_write_args *uap, register_t *retval)
202 {
203 	/* {
204 		syscallarg(int) fd;
205 		syscallarg(const netbsd32_voidp) buf;
206 		syscallarg(netbsd32_size_t) nbyte;
207 	} */
208 	struct sys_write_args ua;
209 
210 	NETBSD32TO64_UAP(fd);
211 	NETBSD32TOP_UAP(buf, void *);
212 	NETBSD32TOX_UAP(nbyte, size_t);
213 	return sys_write(l, &ua, retval);
214 }
215 
216 int
217 netbsd32_close(struct lwp *l, const struct netbsd32_close_args *uap, register_t *retval)
218 {
219 	/* {
220 		syscallarg(int) fd;
221 	} */
222 	struct sys_close_args ua;
223 
224 	NETBSD32TO64_UAP(fd);
225 	return sys_close(l, &ua, retval);
226 }
227 
228 int
229 netbsd32_open(struct lwp *l, const struct netbsd32_open_args *uap, register_t *retval)
230 {
231 	/* {
232 		syscallarg(const netbsd32_charp) path;
233 		syscallarg(int) flags;
234 		syscallarg(mode_t) mode;
235 	} */
236 	struct sys_open_args ua;
237 
238 	NETBSD32TOP_UAP(path, const char);
239 	NETBSD32TO64_UAP(flags);
240 	NETBSD32TO64_UAP(mode);
241 
242 	return (sys_open(l, &ua, retval));
243 }
244 
245 int
246 netbsd32_link(struct lwp *l, const struct netbsd32_link_args *uap, register_t *retval)
247 {
248 	/* {
249 		syscallarg(const netbsd32_charp) path;
250 		syscallarg(const netbsd32_charp) link;
251 	} */
252 	struct sys_link_args ua;
253 
254 	NETBSD32TOP_UAP(path, const char);
255 	NETBSD32TOP_UAP(link, const char);
256 	return (sys_link(l, &ua, retval));
257 }
258 
259 int
260 netbsd32_unlink(struct lwp *l, const struct netbsd32_unlink_args *uap, register_t *retval)
261 {
262 	/* {
263 		syscallarg(const netbsd32_charp) path;
264 	} */
265 	struct sys_unlink_args ua;
266 
267 	NETBSD32TOP_UAP(path, const char);
268 
269 	return (sys_unlink(l, &ua, retval));
270 }
271 
272 int
273 netbsd32_chdir(struct lwp *l, const struct netbsd32_chdir_args *uap, register_t *retval)
274 {
275 	/* {
276 		syscallarg(const netbsd32_charp) path;
277 	} */
278 	struct sys_chdir_args ua;
279 
280 	NETBSD32TOP_UAP(path, const char);
281 
282 	return (sys_chdir(l, &ua, retval));
283 }
284 
285 int
286 netbsd32_fchdir(struct lwp *l, const struct netbsd32_fchdir_args *uap, register_t *retval)
287 {
288 	/* {
289 		syscallarg(int) fd;
290 	} */
291 	struct sys_fchdir_args ua;
292 
293 	NETBSD32TO64_UAP(fd);
294 
295 	return (sys_fchdir(l, &ua, retval));
296 }
297 
298 int
299 netbsd32_mknod(struct lwp *l, const struct netbsd32_mknod_args *uap, register_t *retval)
300 {
301 	/* {
302 		syscallarg(const netbsd32_charp) path;
303 		syscallarg(mode_t) mode;
304 		syscallarg(dev_t) dev;
305 	} */
306 	struct sys_mknod_args ua;
307 
308 	NETBSD32TOP_UAP(path, const char);
309 	NETBSD32TO64_UAP(dev);
310 	NETBSD32TO64_UAP(mode);
311 
312 	return (sys_mknod(l, &ua, retval));
313 }
314 
315 int
316 netbsd32_chmod(struct lwp *l, const struct netbsd32_chmod_args *uap, register_t *retval)
317 {
318 	/* {
319 		syscallarg(const netbsd32_charp) path;
320 		syscallarg(mode_t) mode;
321 	} */
322 	struct sys_chmod_args ua;
323 
324 	NETBSD32TOP_UAP(path, const char);
325 	NETBSD32TO64_UAP(mode);
326 
327 	return (sys_chmod(l, &ua, retval));
328 }
329 
330 int
331 netbsd32_chown(struct lwp *l, const struct netbsd32_chown_args *uap, register_t *retval)
332 {
333 	/* {
334 		syscallarg(const netbsd32_charp) path;
335 		syscallarg(uid_t) uid;
336 		syscallarg(gid_t) gid;
337 	} */
338 	struct sys_chown_args ua;
339 
340 	NETBSD32TOP_UAP(path, const char);
341 	NETBSD32TO64_UAP(uid);
342 	NETBSD32TO64_UAP(gid);
343 
344 	return (sys_chown(l, &ua, retval));
345 }
346 
347 int
348 netbsd32_break(struct lwp *l, const struct netbsd32_break_args *uap, register_t *retval)
349 {
350 	/* {
351 		syscallarg(netbsd32_charp) nsize;
352 	} */
353 	struct sys_obreak_args ua;
354 
355 	SCARG(&ua, nsize) = SCARG_P32(uap, nsize);
356 	NETBSD32TOP_UAP(nsize, char);
357 	return (sys_obreak(l, &ua, retval));
358 }
359 
360 int
361 netbsd32_mount(struct lwp *l, const struct netbsd32_mount_args *uap, register_t *retval)
362 {
363 	/* {
364 		syscallarg(const netbsd32_charp) type;
365 		syscallarg(const netbsd32_charp) path;
366 		syscallarg(int) flags;
367 		syscallarg(netbsd32_voidp) data;
368 	} */
369 	struct compat_40_sys_mount_args ua;
370 
371 	NETBSD32TOP_UAP(type, const char);
372 	NETBSD32TOP_UAP(path, const char);
373 	NETBSD32TO64_UAP(flags);
374 	NETBSD32TOP_UAP(data, void);
375 	return (compat_40_sys_mount(l, &ua, retval));
376 }
377 
378 int
379 netbsd32_unmount(struct lwp *l, const struct netbsd32_unmount_args *uap, register_t *retval)
380 {
381 	/* {
382 		syscallarg(const netbsd32_charp) path;
383 		syscallarg(int) flags;
384 	} */
385 	struct sys_unmount_args ua;
386 
387 	NETBSD32TOP_UAP(path, const char);
388 	NETBSD32TO64_UAP(flags);
389 	return (sys_unmount(l, &ua, retval));
390 }
391 
392 int
393 netbsd32_setuid(struct lwp *l, const struct netbsd32_setuid_args *uap, register_t *retval)
394 {
395 	/* {
396 		syscallarg(uid_t) uid;
397 	} */
398 	struct sys_setuid_args ua;
399 
400 	NETBSD32TO64_UAP(uid);
401 	return (sys_setuid(l, &ua, retval));
402 }
403 
404 int
405 netbsd32_ptrace(struct lwp *l, const struct netbsd32_ptrace_args *uap, register_t *retval)
406 {
407 #if defined(PTRACE) || defined(_LKM)
408 	/* {
409 		syscallarg(int) req;
410 		syscallarg(pid_t) pid;
411 		syscallarg(netbsd32_caddr_t) addr;
412 		syscallarg(int) data;
413 	} */
414 	struct sys_ptrace_args ua;
415 
416 	NETBSD32TO64_UAP(req);
417 	NETBSD32TO64_UAP(pid);
418 	NETBSD32TOP_UAP(addr, void *);
419 	NETBSD32TO64_UAP(data);
420 #ifdef _LKM
421 	return (*sysent[SYS_ptrace].sy_call)(l, &ua, retval);
422 #else
423 	return sys_ptrace(l, &ua, retval);
424 #endif
425 #else
426 	return (ENOSYS);
427 #endif /* PTRACE || _LKM */
428 }
429 
430 int
431 netbsd32_accept(struct lwp *l, const struct netbsd32_accept_args *uap, register_t *retval)
432 {
433 	/* {
434 		syscallarg(int) s;
435 		syscallarg(netbsd32_sockaddrp_t) name;
436 		syscallarg(netbsd32_intp) anamelen;
437 	} */
438 	struct sys_accept_args ua;
439 
440 	NETBSD32TO64_UAP(s);
441 	NETBSD32TOP_UAP(name, struct sockaddr);
442 	NETBSD32TOP_UAP(anamelen, socklen_t);
443 	return (sys_accept(l, &ua, retval));
444 }
445 
446 int
447 netbsd32_getpeername(struct lwp *l, const struct netbsd32_getpeername_args *uap, register_t *retval)
448 {
449 	/* {
450 		syscallarg(int) fdes;
451 		syscallarg(netbsd32_sockaddrp_t) asa;
452 		syscallarg(netbsd32_intp) alen;
453 	} */
454 	struct sys_getpeername_args ua;
455 
456 	NETBSD32TO64_UAP(fdes);
457 	NETBSD32TOP_UAP(asa, struct sockaddr);
458 	NETBSD32TOP_UAP(alen, socklen_t);
459 /* NB: do the protocol specific sockaddrs need to be converted? */
460 	return (sys_getpeername(l, &ua, retval));
461 }
462 
463 int
464 netbsd32_getsockname(struct lwp *l, const struct netbsd32_getsockname_args *uap, register_t *retval)
465 {
466 	/* {
467 		syscallarg(int) fdes;
468 		syscallarg(netbsd32_sockaddrp_t) asa;
469 		syscallarg(netbsd32_intp) alen;
470 	} */
471 	struct sys_getsockname_args ua;
472 
473 	NETBSD32TO64_UAP(fdes);
474 	NETBSD32TOP_UAP(asa, struct sockaddr);
475 	NETBSD32TOP_UAP(alen, socklen_t);
476 	return (sys_getsockname(l, &ua, retval));
477 }
478 
479 int
480 netbsd32_access(struct lwp *l, const struct netbsd32_access_args *uap, register_t *retval)
481 {
482 	/* {
483 		syscallarg(const netbsd32_charp) path;
484 		syscallarg(int) flags;
485 	} */
486 	struct sys_access_args ua;
487 
488 	NETBSD32TOP_UAP(path, const char);
489 	NETBSD32TO64_UAP(flags);
490 
491 	return sys_access(l, &ua, retval);
492 }
493 
494 int
495 netbsd32_chflags(struct lwp *l, const struct netbsd32_chflags_args *uap, register_t *retval)
496 {
497 	/* {
498 		syscallarg(const netbsd32_charp) path;
499 		syscallarg(netbsd32_u_long) flags;
500 	} */
501 	struct sys_chflags_args ua;
502 
503 	NETBSD32TOP_UAP(path, const char);
504 	NETBSD32TO64_UAP(flags);
505 
506 	return (sys_chflags(l, &ua, retval));
507 }
508 
509 int
510 netbsd32_fchflags(struct lwp *l, const struct netbsd32_fchflags_args *uap, register_t *retval)
511 {
512 	/* {
513 		syscallarg(int) fd;
514 		syscallarg(netbsd32_u_long) flags;
515 	} */
516 	struct sys_fchflags_args ua;
517 
518 	NETBSD32TO64_UAP(fd);
519 	NETBSD32TO64_UAP(flags);
520 
521 	return (sys_fchflags(l, &ua, retval));
522 }
523 
524 int
525 netbsd32_lchflags(struct lwp *l, const struct netbsd32_lchflags_args *uap, register_t *retval)
526 {
527 	/* {
528 		syscallarg(const char *) path;
529 		syscallarg(netbsd32_u_long) flags;
530 	} */
531 	struct sys_lchflags_args ua;
532 
533 	NETBSD32TOP_UAP(path, const char);
534 	NETBSD32TO64_UAP(flags);
535 
536 	return (sys_lchflags(l, &ua, retval));
537 }
538 
539 int
540 netbsd32_kill(struct lwp *l, const struct netbsd32_kill_args *uap, register_t *retval)
541 {
542 	/* {
543 		syscallarg(int) pid;
544 		syscallarg(int) signum;
545 	} */
546 	struct sys_kill_args ua;
547 
548 	NETBSD32TO64_UAP(pid);
549 	NETBSD32TO64_UAP(signum);
550 
551 	return (sys_kill(l, &ua, retval));
552 }
553 
554 int
555 netbsd32_dup(struct lwp *l, const struct netbsd32_dup_args *uap, register_t *retval)
556 {
557 	/* {
558 		syscallarg(int) fd;
559 	} */
560 	struct sys_dup_args ua;
561 
562 	NETBSD32TO64_UAP(fd);
563 
564 	return (sys_dup(l, &ua, retval));
565 }
566 
567 int
568 netbsd32_profil(struct lwp *l, const struct netbsd32_profil_args *uap, register_t *retval)
569 {
570 	/* {
571 		syscallarg(netbsd32_caddr_t) samples;
572 		syscallarg(netbsd32_size_t) size;
573 		syscallarg(netbsd32_u_long) offset;
574 		syscallarg(u_int) scale;
575 	} */
576 	struct sys_profil_args ua;
577 
578 	NETBSD32TOP_UAP(samples, void *);
579 	NETBSD32TOX_UAP(size, size_t);
580 	NETBSD32TOX_UAP(offset, u_long);
581 	NETBSD32TO64_UAP(scale);
582 	return (sys_profil(l, &ua, retval));
583 }
584 
585 int
586 netbsd32_ktrace(struct lwp *l, const struct netbsd32_ktrace_args *uap, register_t *retval)
587 {
588 	/* {
589 		syscallarg(const netbsd32_charp) fname;
590 		syscallarg(int) ops;
591 		syscallarg(int) facs;
592 		syscallarg(int) pid;
593 	} */
594 	struct sys_ktrace_args ua;
595 
596 	NETBSD32TOP_UAP(fname, const char);
597 	NETBSD32TO64_UAP(ops);
598 	NETBSD32TO64_UAP(facs);
599 	NETBSD32TO64_UAP(pid);
600 	return (sys_ktrace(l, &ua, retval));
601 }
602 
603 int
604 netbsd32_utrace(struct lwp *l, const struct netbsd32_utrace_args *uap, register_t *retval)
605 {
606 	/* {
607 		syscallarg(const netbsd32_charp) label;
608 		syscallarg(netbsd32_voidp) addr;
609 		syscallarg(netbsd32_size_t) len;
610 	} */
611 	struct sys_utrace_args ua;
612 
613 	NETBSD32TOP_UAP(label, const char);
614 	NETBSD32TOP_UAP(addr, void);
615 	NETBSD32TO64_UAP(len);
616 	return (sys_utrace(l, &ua, retval));
617 }
618 
619 int
620 netbsd32___getlogin(struct lwp *l, const struct netbsd32___getlogin_args *uap, register_t *retval)
621 {
622 	/* {
623 		syscallarg(netbsd32_charp) namebuf;
624 		syscallarg(u_int) namelen;
625 	} */
626 	struct sys___getlogin_args ua;
627 
628 	NETBSD32TOP_UAP(namebuf, char);
629 	NETBSD32TO64_UAP(namelen);
630 	return (sys___getlogin(l, &ua, retval));
631 }
632 
633 int
634 netbsd32_setlogin(struct lwp *l, const struct netbsd32_setlogin_args *uap, register_t *retval)
635 {
636 	/* {
637 		syscallarg(const netbsd32_charp) namebuf;
638 	} */
639 	struct sys___setlogin_args ua;
640 
641 	NETBSD32TOP_UAP(namebuf, char);
642 	return (sys___setlogin(l, &ua, retval));
643 }
644 
645 int
646 netbsd32_acct(struct lwp *l, const struct netbsd32_acct_args *uap, register_t *retval)
647 {
648 	/* {
649 		syscallarg(const netbsd32_charp) path;
650 	} */
651 	struct sys_acct_args ua;
652 
653 	NETBSD32TOP_UAP(path, const char);
654 	return (sys_acct(l, &ua, retval));
655 }
656 
657 int
658 netbsd32_revoke(struct lwp *l, const struct netbsd32_revoke_args *uap, register_t *retval)
659 {
660 	/* {
661 		syscallarg(const netbsd32_charp) path;
662 	} */
663 	struct sys_revoke_args ua;
664 
665 	NETBSD32TOP_UAP(path, const char);
666 
667 	return (sys_revoke(l, &ua, retval));
668 }
669 
670 int
671 netbsd32_symlink(struct lwp *l, const struct netbsd32_symlink_args *uap, register_t *retval)
672 {
673 	/* {
674 		syscallarg(const netbsd32_charp) path;
675 		syscallarg(const netbsd32_charp) link;
676 	} */
677 	struct sys_symlink_args ua;
678 
679 	NETBSD32TOP_UAP(path, const char);
680 	NETBSD32TOP_UAP(link, const char);
681 
682 	return (sys_symlink(l, &ua, retval));
683 }
684 
685 int
686 netbsd32_readlink(struct lwp *l, const struct netbsd32_readlink_args *uap, register_t *retval)
687 {
688 	/* {
689 		syscallarg(const netbsd32_charp) path;
690 		syscallarg(netbsd32_charp) buf;
691 		syscallarg(netbsd32_size_t) count;
692 	} */
693 	struct sys_readlink_args ua;
694 
695 	NETBSD32TOP_UAP(path, const char);
696 	NETBSD32TOP_UAP(buf, char);
697 	NETBSD32TOX_UAP(count, size_t);
698 
699 	return (sys_readlink(l, &ua, retval));
700 }
701 
702 int
703 netbsd32_umask(struct lwp *l, const struct netbsd32_umask_args *uap, register_t *retval)
704 {
705 	/* {
706 		syscallarg(mode_t) newmask;
707 	} */
708 	struct sys_umask_args ua;
709 
710 	NETBSD32TO64_UAP(newmask);
711 	return (sys_umask(l, &ua, retval));
712 }
713 
714 int
715 netbsd32_chroot(struct lwp *l, const struct netbsd32_chroot_args *uap, register_t *retval)
716 {
717 	/* {
718 		syscallarg(const netbsd32_charp) path;
719 	} */
720 	struct sys_chroot_args ua;
721 
722 	NETBSD32TOP_UAP(path, const char);
723 	return (sys_chroot(l, &ua, retval));
724 }
725 
726 int
727 netbsd32_sbrk(struct lwp *l, const struct netbsd32_sbrk_args *uap, register_t *retval)
728 {
729 	/* {
730 		syscallarg(int) incr;
731 	} */
732 	struct sys_sbrk_args ua;
733 
734 	NETBSD32TO64_UAP(incr);
735 	return (sys_sbrk(l, &ua, retval));
736 }
737 
738 int
739 netbsd32_sstk(struct lwp *l, const struct netbsd32_sstk_args *uap, register_t *retval)
740 {
741 	/* {
742 		syscallarg(int) incr;
743 	} */
744 	struct sys_sstk_args ua;
745 
746 	NETBSD32TO64_UAP(incr);
747 	return (sys_sstk(l, &ua, retval));
748 }
749 
750 int
751 netbsd32_munmap(struct lwp *l, const struct netbsd32_munmap_args *uap, register_t *retval)
752 {
753 	/* {
754 		syscallarg(netbsd32_voidp) addr;
755 		syscallarg(netbsd32_size_t) len;
756 	} */
757 	struct sys_munmap_args ua;
758 
759 	NETBSD32TOP_UAP(addr, void);
760 	NETBSD32TOX_UAP(len, size_t);
761 	return (sys_munmap(l, &ua, retval));
762 }
763 
764 int
765 netbsd32_mprotect(struct lwp *l, const struct netbsd32_mprotect_args *uap, register_t *retval)
766 {
767 	/* {
768 		syscallarg(netbsd32_voidp) addr;
769 		syscallarg(netbsd32_size_t) len;
770 		syscallarg(int) prot;
771 	} */
772 	struct sys_mprotect_args ua;
773 
774 	NETBSD32TOP_UAP(addr, void);
775 	NETBSD32TOX_UAP(len, size_t);
776 	NETBSD32TO64_UAP(prot);
777 	return (sys_mprotect(l, &ua, retval));
778 }
779 
780 int
781 netbsd32_madvise(struct lwp *l, const struct netbsd32_madvise_args *uap, register_t *retval)
782 {
783 	/* {
784 		syscallarg(netbsd32_voidp) addr;
785 		syscallarg(netbsd32_size_t) len;
786 		syscallarg(int) behav;
787 	} */
788 	struct sys_madvise_args ua;
789 
790 	NETBSD32TOP_UAP(addr, void);
791 	NETBSD32TOX_UAP(len, size_t);
792 	NETBSD32TO64_UAP(behav);
793 	return (sys_madvise(l, &ua, retval));
794 }
795 
796 int
797 netbsd32_mincore(struct lwp *l, const struct netbsd32_mincore_args *uap, register_t *retval)
798 {
799 	/* {
800 		syscallarg(netbsd32_caddr_t) addr;
801 		syscallarg(netbsd32_size_t) len;
802 		syscallarg(netbsd32_charp) vec;
803 	} */
804 	struct sys_mincore_args ua;
805 
806 	NETBSD32TOP_UAP(addr, void *);
807 	NETBSD32TOX_UAP(len, size_t);
808 	NETBSD32TOP_UAP(vec, char);
809 	return (sys_mincore(l, &ua, retval));
810 }
811 
812 /* XXX MOVE ME XXX ? */
813 int
814 netbsd32_getgroups(struct lwp *l, const struct netbsd32_getgroups_args *uap, register_t *retval)
815 {
816 	/* {
817 		syscallarg(int) gidsetsize;
818 		syscallarg(netbsd32_gid_tp) gidset;
819 	} */
820 	struct sys_getgroups_args ua;
821 
822 	/* Since sizeof (gid_t) == sizeof (netbsd32_gid_t) ... */
823 
824 	NETBSD32TO64_UAP(gidsetsize);
825 	NETBSD32TOP_UAP(gidset, gid_t);
826 	return (sys_getgroups(l, &ua, retval));
827 }
828 
829 int
830 netbsd32_setgroups(struct lwp *l, const struct netbsd32_setgroups_args *uap, register_t *retval)
831 {
832 	/* {
833 		syscallarg(int) gidsetsize;
834 		syscallarg(const netbsd32_gid_tp) gidset;
835 	} */
836 	struct sys_setgroups_args ua;
837 
838 	NETBSD32TO64_UAP(gidsetsize);
839 	NETBSD32TOP_UAP(gidset, gid_t);
840 	return (sys_setgroups(l, &ua, retval));
841 }
842 
843 int
844 netbsd32_setpgid(struct lwp *l, const struct netbsd32_setpgid_args *uap, register_t *retval)
845 {
846 	/* {
847 		syscallarg(int) pid;
848 		syscallarg(int) pgid;
849 	} */
850 	struct sys_setpgid_args ua;
851 
852 	NETBSD32TO64_UAP(pid);
853 	NETBSD32TO64_UAP(pgid);
854 	return (sys_setpgid(l, &ua, retval));
855 }
856 
857 int
858 netbsd32_fcntl(struct lwp *l, const struct netbsd32_fcntl_args *uap, register_t *retval)
859 {
860 	/* {
861 		syscallarg(int) fd;
862 		syscallarg(int) cmd;
863 		syscallarg(netbsd32_voidp) arg;
864 	} */
865 	struct sys_fcntl_args ua;
866 
867 	NETBSD32TO64_UAP(fd);
868 	NETBSD32TO64_UAP(cmd);
869 	NETBSD32TOP_UAP(arg, void);
870 	/* we can do this because `struct flock' doesn't change */
871 	return (sys_fcntl(l, &ua, retval));
872 }
873 
874 int
875 netbsd32_dup2(struct lwp *l, const struct netbsd32_dup2_args *uap, register_t *retval)
876 {
877 	/* {
878 		syscallarg(int) from;
879 		syscallarg(int) to;
880 	} */
881 	struct sys_dup2_args ua;
882 
883 	NETBSD32TO64_UAP(from);
884 	NETBSD32TO64_UAP(to);
885 	return (sys_dup2(l, &ua, retval));
886 }
887 
888 int
889 netbsd32_fsync(struct lwp *l, const struct netbsd32_fsync_args *uap, register_t *retval)
890 {
891 	/* {
892 		syscallarg(int) fd;
893 	} */
894 	struct sys_fsync_args ua;
895 
896 	NETBSD32TO64_UAP(fd);
897 	return (sys_fsync(l, &ua, retval));
898 }
899 
900 int
901 netbsd32_setpriority(struct lwp *l, const struct netbsd32_setpriority_args *uap, register_t *retval)
902 {
903 	/* {
904 		syscallarg(int) which;
905 		syscallarg(int) who;
906 		syscallarg(int) prio;
907 	} */
908 	struct sys_setpriority_args ua;
909 
910 	NETBSD32TO64_UAP(which);
911 	NETBSD32TO64_UAP(who);
912 	NETBSD32TO64_UAP(prio);
913 	return (sys_setpriority(l, &ua, retval));
914 }
915 
916 int
917 netbsd32_sys___socket30(struct lwp *l, const struct netbsd32_sys___socket30_args *uap, register_t *retval)
918 {
919 	/* {
920 		syscallarg(int) domain;
921 		syscallarg(int) type;
922 		syscallarg(int) protocol;
923 	} */
924 	struct sys___socket30_args ua;
925 
926 	NETBSD32TO64_UAP(domain);
927 	NETBSD32TO64_UAP(type);
928 	NETBSD32TO64_UAP(protocol);
929 	return (sys___socket30(l, &ua, retval));
930 }
931 
932 int
933 netbsd32_connect(struct lwp *l, const struct netbsd32_connect_args *uap, register_t *retval)
934 {
935 	/* {
936 		syscallarg(int) s;
937 		syscallarg(const netbsd32_sockaddrp_t) name;
938 		syscallarg(int) namelen;
939 	} */
940 	struct sys_connect_args ua;
941 
942 	NETBSD32TO64_UAP(s);
943 	NETBSD32TOP_UAP(name, struct sockaddr);
944 	NETBSD32TO64_UAP(namelen);
945 	return (sys_connect(l, &ua, retval));
946 }
947 
948 int
949 netbsd32_getpriority(struct lwp *l, const struct netbsd32_getpriority_args *uap, register_t *retval)
950 {
951 	/* {
952 		syscallarg(int) which;
953 		syscallarg(int) who;
954 	} */
955 	struct sys_getpriority_args ua;
956 
957 	NETBSD32TO64_UAP(which);
958 	NETBSD32TO64_UAP(who);
959 	return (sys_getpriority(l, &ua, retval));
960 }
961 
962 int
963 netbsd32_bind(struct lwp *l, const struct netbsd32_bind_args *uap, register_t *retval)
964 {
965 	/* {
966 		syscallarg(int) s;
967 		syscallarg(const netbsd32_sockaddrp_t) name;
968 		syscallarg(int) namelen;
969 	} */
970 	struct sys_bind_args ua;
971 
972 	NETBSD32TO64_UAP(s);
973 	NETBSD32TOP_UAP(name, struct sockaddr);
974 	NETBSD32TO64_UAP(namelen);
975 	return (sys_bind(l, &ua, retval));
976 }
977 
978 int
979 netbsd32_setsockopt(struct lwp *l, const struct netbsd32_setsockopt_args *uap, register_t *retval)
980 {
981 	/* {
982 		syscallarg(int) s;
983 		syscallarg(int) level;
984 		syscallarg(int) name;
985 		syscallarg(const netbsd32_voidp) val;
986 		syscallarg(int) valsize;
987 	} */
988 	struct sys_setsockopt_args ua;
989 
990 	NETBSD32TO64_UAP(s);
991 	NETBSD32TO64_UAP(level);
992 	NETBSD32TO64_UAP(name);
993 	NETBSD32TOP_UAP(val, void);
994 	NETBSD32TO64_UAP(valsize);
995 	/* may be more efficient to do this inline. */
996 	return (sys_setsockopt(l, &ua, retval));
997 }
998 
999 int
1000 netbsd32_listen(struct lwp *l, const struct netbsd32_listen_args *uap, register_t *retval)
1001 {
1002 	/* {
1003 		syscallarg(int) s;
1004 		syscallarg(int) backlog;
1005 	} */
1006 	struct sys_listen_args ua;
1007 
1008 	NETBSD32TO64_UAP(s);
1009 	NETBSD32TO64_UAP(backlog);
1010 	return (sys_listen(l, &ua, retval));
1011 }
1012 
1013 int
1014 netbsd32_fchown(struct lwp *l, const struct netbsd32_fchown_args *uap, register_t *retval)
1015 {
1016 	/* {
1017 		syscallarg(int) fd;
1018 		syscallarg(uid_t) uid;
1019 		syscallarg(gid_t) gid;
1020 	} */
1021 	struct sys_fchown_args ua;
1022 
1023 	NETBSD32TO64_UAP(fd);
1024 	NETBSD32TO64_UAP(uid);
1025 	NETBSD32TO64_UAP(gid);
1026 	return (sys_fchown(l, &ua, retval));
1027 }
1028 
1029 int
1030 netbsd32_fchmod(struct lwp *l, const struct netbsd32_fchmod_args *uap, register_t *retval)
1031 {
1032 	/* {
1033 		syscallarg(int) fd;
1034 		syscallarg(mode_t) mode;
1035 	} */
1036 	struct sys_fchmod_args ua;
1037 
1038 	NETBSD32TO64_UAP(fd);
1039 	NETBSD32TO64_UAP(mode);
1040 	return (sys_fchmod(l, &ua, retval));
1041 }
1042 
1043 int
1044 netbsd32_setreuid(struct lwp *l, const struct netbsd32_setreuid_args *uap, register_t *retval)
1045 {
1046 	/* {
1047 		syscallarg(uid_t) ruid;
1048 		syscallarg(uid_t) euid;
1049 	} */
1050 	struct sys_setreuid_args ua;
1051 
1052 	NETBSD32TO64_UAP(ruid);
1053 	NETBSD32TO64_UAP(euid);
1054 	return (sys_setreuid(l, &ua, retval));
1055 }
1056 
1057 int
1058 netbsd32_setregid(struct lwp *l, const struct netbsd32_setregid_args *uap, register_t *retval)
1059 {
1060 	/* {
1061 		syscallarg(gid_t) rgid;
1062 		syscallarg(gid_t) egid;
1063 	} */
1064 	struct sys_setregid_args ua;
1065 
1066 	NETBSD32TO64_UAP(rgid);
1067 	NETBSD32TO64_UAP(egid);
1068 	return (sys_setregid(l, &ua, retval));
1069 }
1070 
1071 int
1072 netbsd32_getsockopt(struct lwp *l, const struct netbsd32_getsockopt_args *uap, register_t *retval)
1073 {
1074 	/* {
1075 		syscallarg(int) s;
1076 		syscallarg(int) level;
1077 		syscallarg(int) name;
1078 		syscallarg(netbsd32_voidp) val;
1079 		syscallarg(netbsd32_intp) avalsize;
1080 	} */
1081 	struct sys_getsockopt_args ua;
1082 
1083 	NETBSD32TO64_UAP(s);
1084 	NETBSD32TO64_UAP(level);
1085 	NETBSD32TO64_UAP(name);
1086 	NETBSD32TOP_UAP(val, void);
1087 	NETBSD32TOP_UAP(avalsize, socklen_t);
1088 	return (sys_getsockopt(l, &ua, retval));
1089 }
1090 
1091 int
1092 netbsd32_rename(struct lwp *l, const struct netbsd32_rename_args *uap, register_t *retval)
1093 {
1094 	/* {
1095 		syscallarg(const netbsd32_charp) from;
1096 		syscallarg(const netbsd32_charp) to;
1097 	} */
1098 	struct sys_rename_args ua;
1099 
1100 	NETBSD32TOP_UAP(from, const char);
1101 	NETBSD32TOP_UAP(to, const char)
1102 
1103 	return (sys_rename(l, &ua, retval));
1104 }
1105 
1106 int
1107 netbsd32_flock(struct lwp *l, const struct netbsd32_flock_args *uap, register_t *retval)
1108 {
1109 	/* {
1110 		syscallarg(int) fd;
1111 		syscallarg(int) how;
1112 	} */
1113 	struct sys_flock_args ua;
1114 
1115 	NETBSD32TO64_UAP(fd);
1116 	NETBSD32TO64_UAP(how)
1117 
1118 	return (sys_flock(l, &ua, retval));
1119 }
1120 
1121 int
1122 netbsd32_mkfifo(struct lwp *l, const struct netbsd32_mkfifo_args *uap, register_t *retval)
1123 {
1124 	/* {
1125 		syscallarg(const netbsd32_charp) path;
1126 		syscallarg(mode_t) mode;
1127 	} */
1128 	struct sys_mkfifo_args ua;
1129 
1130 	NETBSD32TOP_UAP(path, const char)
1131 	NETBSD32TO64_UAP(mode);
1132 	return (sys_mkfifo(l, &ua, retval));
1133 }
1134 
1135 int
1136 netbsd32_shutdown(struct lwp *l, const struct netbsd32_shutdown_args *uap, register_t *retval)
1137 {
1138 	/* {
1139 		syscallarg(int) s;
1140 		syscallarg(int) how;
1141 	} */
1142 	struct sys_shutdown_args ua;
1143 
1144 	NETBSD32TO64_UAP(s)
1145 	NETBSD32TO64_UAP(how);
1146 	return (sys_shutdown(l, &ua, retval));
1147 }
1148 
1149 int
1150 netbsd32_socketpair(struct lwp *l, const struct netbsd32_socketpair_args *uap, register_t *retval)
1151 {
1152 	/* {
1153 		syscallarg(int) domain;
1154 		syscallarg(int) type;
1155 		syscallarg(int) protocol;
1156 		syscallarg(netbsd32_intp) rsv;
1157 	} */
1158 	struct sys_socketpair_args ua;
1159 
1160 	NETBSD32TO64_UAP(domain);
1161 	NETBSD32TO64_UAP(type);
1162 	NETBSD32TO64_UAP(protocol);
1163 	NETBSD32TOP_UAP(rsv, int);
1164 	/* Since we're just copying out two `int's we can do this */
1165 	return (sys_socketpair(l, &ua, retval));
1166 }
1167 
1168 int
1169 netbsd32_mkdir(struct lwp *l, const struct netbsd32_mkdir_args *uap, register_t *retval)
1170 {
1171 	/* {
1172 		syscallarg(const netbsd32_charp) path;
1173 		syscallarg(mode_t) mode;
1174 	} */
1175 	struct sys_mkdir_args ua;
1176 
1177 	NETBSD32TOP_UAP(path, const char)
1178 	NETBSD32TO64_UAP(mode);
1179 	return (sys_mkdir(l, &ua, retval));
1180 }
1181 
1182 int
1183 netbsd32_rmdir(struct lwp *l, const struct netbsd32_rmdir_args *uap, register_t *retval)
1184 {
1185 	/* {
1186 		syscallarg(const netbsd32_charp) path;
1187 	} */
1188 	struct sys_rmdir_args ua;
1189 
1190 	NETBSD32TOP_UAP(path, const char);
1191 	return (sys_rmdir(l, &ua, retval));
1192 }
1193 
1194 int
1195 netbsd32_quotactl(struct lwp *l, const struct netbsd32_quotactl_args *uap, register_t *retval)
1196 {
1197 	/* {
1198 		syscallarg(const netbsd32_charp) path;
1199 		syscallarg(int) cmd;
1200 		syscallarg(int) uid;
1201 		syscallarg(netbsd32_caddr_t) arg;
1202 	} */
1203 	struct sys_quotactl_args ua;
1204 
1205 	NETBSD32TOP_UAP(path, const char);
1206 	NETBSD32TO64_UAP(cmd);
1207 	NETBSD32TO64_UAP(uid);
1208 	NETBSD32TOP_UAP(arg, void *);
1209 	return (sys_quotactl(l, &ua, retval));
1210 }
1211 
1212 #if defined(NFS) || defined(NFSSERVER)
1213 int
1214 netbsd32_nfssvc(struct lwp *l, const struct netbsd32_nfssvc_args *uap, register_t *retval)
1215 {
1216 #if 0
1217 	/* {
1218 		syscallarg(int) flag;
1219 		syscallarg(netbsd32_voidp) argp;
1220 	} */
1221 	struct sys_nfssvc_args ua;
1222 
1223 	NETBSD32TO64_UAP(flag);
1224 	NETBSD32TOP_UAP(argp, void);
1225 	return (sys_nfssvc(l, &ua, retval));
1226 #else
1227 	/* Why would we want to support a 32-bit nfsd? */
1228 	return (ENOSYS);
1229 #endif
1230 }
1231 #endif
1232 
1233 int
1234 netbsd32___getfh30(struct lwp *l, const struct netbsd32___getfh30_args *uap, register_t *retval)
1235 {
1236 	/* {
1237 		syscallarg(const netbsd32_charp) fname;
1238 		syscallarg(netbsd32_fhandlep_t) fhp;
1239 		syscallarg(netbsd32_size_tp) fh_size;
1240 	} */
1241 	struct vnode *vp;
1242 	fhandle_t *fh;
1243 	int error;
1244 	struct nameidata nd;
1245 	netbsd32_size_t sz32;
1246 	size_t sz;
1247 
1248 	/*
1249 	 * Must be super user
1250 	 */
1251 	error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_FILEHANDLE,
1252 	    0, NULL, NULL, NULL);
1253 	if (error)
1254 		return (error);
1255 	fh = NULL;
1256 	NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | TRYEMULROOT, UIO_USERSPACE,
1257 	    SCARG_P32(uap, fname));
1258 	error = namei(&nd);
1259 	if (error)
1260 		return (error);
1261 	vp = nd.ni_vp;
1262 	error = copyin(SCARG_P32(uap, fh_size), &sz32,
1263 	    sizeof(netbsd32_size_t));
1264 	if (!error) {
1265 		fh = malloc(sz32, M_TEMP, M_WAITOK);
1266 		if (fh == NULL)
1267 			return EINVAL;
1268 		sz = sz32;
1269 		error = vfs_composefh(vp, fh, &sz);
1270 		sz32 = sz;
1271 	}
1272 	vput(vp);
1273 	if (error == E2BIG)
1274 		copyout(&sz, SCARG_P32(uap, fh_size), sizeof(size_t));
1275 	if (error == 0) {
1276 		error = copyout(&sz32, SCARG_P32(uap, fh_size),
1277 		    sizeof(netbsd32_size_t));
1278 		if (!error)
1279 			error = copyout(fh, SCARG_P32(uap, fhp), sz);
1280 	}
1281 	free(fh, M_TEMP);
1282 	return (error);
1283 }
1284 
1285 int
1286 netbsd32_pread(struct lwp *l, const struct netbsd32_pread_args *uap, register_t *retval)
1287 {
1288 	/* {
1289 		syscallarg(int) fd;
1290 		syscallarg(netbsd32_voidp) buf;
1291 		syscallarg(netbsd32_size_t) nbyte;
1292 		syscallarg(int) pad;
1293 		syscallarg(off_t) offset;
1294 	} */
1295 	struct sys_pread_args ua;
1296 
1297 	NETBSD32TO64_UAP(fd);
1298 	NETBSD32TOP_UAP(buf, void);
1299 	NETBSD32TOX_UAP(nbyte, size_t);
1300 	NETBSD32TO64_UAP(pad);
1301 	NETBSD32TO64_UAP(offset);
1302 	return sys_pread(l, &ua, retval);
1303 }
1304 
1305 int
1306 netbsd32_pwrite(struct lwp *l, const struct netbsd32_pwrite_args *uap, register_t *retval)
1307 {
1308 	/* {
1309 		syscallarg(int) fd;
1310 		syscallarg(const netbsd32_voidp) buf;
1311 		syscallarg(netbsd32_size_t) nbyte;
1312 		syscallarg(int) pad;
1313 		syscallarg(off_t) offset;
1314 	} */
1315 	struct sys_pwrite_args ua;
1316 
1317 	NETBSD32TO64_UAP(fd);
1318 	NETBSD32TOP_UAP(buf, void);
1319 	NETBSD32TOX_UAP(nbyte, size_t);
1320 	NETBSD32TO64_UAP(pad);
1321 	NETBSD32TO64_UAP(offset);
1322 	return sys_pwrite(l, &ua, retval);
1323 }
1324 
1325 int
1326 netbsd32_setgid(struct lwp *l, const struct netbsd32_setgid_args *uap, register_t *retval)
1327 {
1328 	/* {
1329 		syscallarg(gid_t) gid;
1330 	} */
1331 	struct sys_setgid_args ua;
1332 
1333 	NETBSD32TO64_UAP(gid);
1334 	return (sys_setgid(l, &ua, retval));
1335 }
1336 
1337 int
1338 netbsd32_setegid(struct lwp *l, const struct netbsd32_setegid_args *uap, register_t *retval)
1339 {
1340 	/* {
1341 		syscallarg(gid_t) egid;
1342 	} */
1343 	struct sys_setegid_args ua;
1344 
1345 	NETBSD32TO64_UAP(egid);
1346 	return (sys_setegid(l, &ua, retval));
1347 }
1348 
1349 int
1350 netbsd32_seteuid(struct lwp *l, const struct netbsd32_seteuid_args *uap, register_t *retval)
1351 {
1352 	/* {
1353 		syscallarg(gid_t) euid;
1354 	} */
1355 	struct sys_seteuid_args ua;
1356 
1357 	NETBSD32TO64_UAP(euid);
1358 	return (sys_seteuid(l, &ua, retval));
1359 }
1360 
1361 #ifdef LFS
1362 int
1363 netbsd32_sys_lfs_bmapv(struct lwp *l, const struct netbsd32_sys_lfs_bmapv_args *v, register_t *retval)
1364 {
1365 
1366 	return (ENOSYS);	/* XXX */
1367 }
1368 
1369 int
1370 netbsd32_sys_lfs_markv(struct lwp *l, const struct netbsd32_sys_lfs_markv_args *v, register_t *retval)
1371 {
1372 
1373 	return (ENOSYS);	/* XXX */
1374 }
1375 
1376 int
1377 netbsd32_sys_lfs_segclean(struct lwp *l, const struct netbsd32_sys_lfs_segclean_args *v, register_t *retval)
1378 {
1379 
1380 	return (ENOSYS);	/* XXX */
1381 }
1382 
1383 int
1384 netbsd32_sys_lfs_segwait(struct lwp *l, const struct netbsd32_sys_lfs_segwait_args *v, register_t *retval)
1385 {
1386 
1387 	return (ENOSYS);	/* XXX */
1388 }
1389 #endif
1390 
1391 int
1392 netbsd32_pathconf(struct lwp *l, const struct netbsd32_pathconf_args *uap, register_t *retval)
1393 {
1394 	/* {
1395 		syscallarg(int) fd;
1396 		syscallarg(int) name;
1397 	} */
1398 	struct sys_pathconf_args ua;
1399 
1400 	NETBSD32TOP_UAP(path, const char);
1401 	NETBSD32TO64_UAP(name);
1402 	return sys_pathconf(l, &ua, retval);
1403 }
1404 
1405 int
1406 netbsd32_fpathconf(struct lwp *l, const struct netbsd32_fpathconf_args *uap, register_t *retval)
1407 {
1408 	/* {
1409 		syscallarg(int) fd;
1410 		syscallarg(int) name;
1411 	} */
1412 	struct sys_fpathconf_args ua;
1413 
1414 	NETBSD32TO64_UAP(fd);
1415 	NETBSD32TO64_UAP(name);
1416 	return sys_fpathconf(l, &ua, retval);
1417 }
1418 
1419 int
1420 netbsd32_getrlimit(struct lwp *l, const struct netbsd32_getrlimit_args *uap, register_t *retval)
1421 {
1422 	/* {
1423 		syscallarg(int) which;
1424 		syscallarg(netbsd32_rlimitp_t) rlp;
1425 	} */
1426 	int which = SCARG(uap, which);
1427 
1428 	if ((u_int)which >= RLIM_NLIMITS)
1429 		return (EINVAL);
1430 	return (copyout(&l->l_proc->p_rlimit[which],
1431 	    SCARG_P32(uap, rlp), sizeof(struct rlimit)));
1432 }
1433 
1434 int
1435 netbsd32_setrlimit(struct lwp *l, const struct netbsd32_setrlimit_args *uap, register_t *retval)
1436 {
1437 	/* {
1438 		syscallarg(int) which;
1439 		syscallarg(const netbsd32_rlimitp_t) rlp;
1440 	} */
1441 		int which = SCARG(uap, which);
1442 	struct rlimit alim;
1443 	int error;
1444 
1445 	error = copyin(SCARG_P32(uap, rlp), &alim, sizeof(struct rlimit));
1446 	if (error)
1447 		return (error);
1448 
1449 	switch (which) {
1450 	case RLIMIT_DATA:
1451 		if (LIMITCHECK(alim.rlim_cur, MAXDSIZ32))
1452 			alim.rlim_cur = MAXDSIZ32;
1453 		if (LIMITCHECK(alim.rlim_max, MAXDSIZ32))
1454 			alim.rlim_max = MAXDSIZ32;
1455 		break;
1456 
1457 	case RLIMIT_STACK:
1458 		if (LIMITCHECK(alim.rlim_cur, MAXSSIZ32))
1459 			alim.rlim_cur = MAXSSIZ32;
1460 		if (LIMITCHECK(alim.rlim_max, MAXSSIZ32))
1461 			alim.rlim_max = MAXSSIZ32;
1462 	default:
1463 		break;
1464 	}
1465 
1466 	return (dosetrlimit(l, l->l_proc, which, &alim));
1467 }
1468 
1469 int
1470 netbsd32_mmap(struct lwp *l, const struct netbsd32_mmap_args *uap, register_t *retval)
1471 {
1472 	/* {
1473 		syscallarg(netbsd32_voidp) addr;
1474 		syscallarg(netbsd32_size_t) len;
1475 		syscallarg(int) prot;
1476 		syscallarg(int) flags;
1477 		syscallarg(int) fd;
1478 		syscallarg(netbsd32_long) pad;
1479 		syscallarg(off_t) pos;
1480 	} */
1481 	struct sys_mmap_args ua;
1482 	int error;
1483 
1484 	NETBSD32TOP_UAP(addr, void);
1485 	NETBSD32TOX_UAP(len, size_t);
1486 	NETBSD32TO64_UAP(prot);
1487 	NETBSD32TO64_UAP(flags);
1488 	NETBSD32TO64_UAP(fd);
1489 	NETBSD32TOX_UAP(pad, long);
1490 	NETBSD32TOX_UAP(pos, off_t);
1491 	error = sys_mmap(l, &ua, retval);
1492 	if ((u_long)*retval > (u_long)UINT_MAX) {
1493 		printf("netbsd32_mmap: retval out of range: 0x%lx",
1494 		    (u_long)*retval);
1495 		/* Should try to recover and return an error here. */
1496 	}
1497 	return (error);
1498 }
1499 
1500 int
1501 netbsd32_mremap(struct lwp *l, const struct netbsd32_mremap_args *uap, register_t *retval)
1502 {
1503 	/* {
1504 		syscallarg(void *) old_address;
1505 		syscallarg(size_t) old_size;
1506 		syscallarg(void *) new_address;
1507 		syscallarg(size_t) new_size;
1508 		syscallarg(int) flags;
1509 	} */
1510 	struct sys_mremap_args ua;
1511 
1512 	NETBSD32TOP_UAP(old_address, void);
1513 	NETBSD32TOX_UAP(old_size, size_t);
1514 	NETBSD32TOP_UAP(new_address, void);
1515 	NETBSD32TOX_UAP(new_size, size_t);
1516 	NETBSD32TO64_UAP(flags);
1517 
1518 	return sys_mremap(l, &ua, retval);
1519 }
1520 
1521 int
1522 netbsd32_lseek(struct lwp *l, const struct netbsd32_lseek_args *uap, register_t *retval)
1523 {
1524 	/* {
1525 		syscallarg(int) fd;
1526 		syscallarg(int) pad;
1527 		syscallarg(off_t) offset;
1528 		syscallarg(int) whence;
1529 	} */
1530 	struct sys_lseek_args ua;
1531 	union {
1532 	    register_t retval64[2];
1533 	    register32_t retval32[4];
1534 	} newpos;
1535 	int rv;
1536 
1537 	NETBSD32TO64_UAP(fd);
1538 	NETBSD32TO64_UAP(pad);
1539 	NETBSD32TO64_UAP(offset);
1540 	NETBSD32TO64_UAP(whence);
1541 	rv = sys_lseek(l, &ua, newpos.retval64);
1542 
1543 	/*
1544 	 * We have to split the 64 bit value into 2 halves which will
1545 	 * end up in separate 32 bit registers.
1546 	 * This should DTRT on big and little-endian systems provided that
1547 	 * gcc's 'strict aliasing' tests don't decide that the retval32[]
1548 	 * entries can't have been assigned to, so need not be read!
1549 	 */
1550 	retval[0] = newpos.retval32[0];
1551 	retval[1] = newpos.retval32[1];
1552 
1553 	return rv;
1554 }
1555 
1556 int
1557 netbsd32_truncate(struct lwp *l, const struct netbsd32_truncate_args *uap, register_t *retval)
1558 {
1559 	/* {
1560 		syscallarg(const netbsd32_charp) path;
1561 		syscallarg(int) pad;
1562 		syscallarg(off_t) length;
1563 	} */
1564 	struct sys_truncate_args ua;
1565 
1566 	NETBSD32TOP_UAP(path, const char);
1567 	NETBSD32TO64_UAP(pad);
1568 	NETBSD32TO64_UAP(length);
1569 	return (sys_truncate(l, &ua, retval));
1570 }
1571 
1572 int
1573 netbsd32_ftruncate(struct lwp *l, const struct netbsd32_ftruncate_args *uap, register_t *retval)
1574 {
1575 	/* {
1576 		syscallarg(int) fd;
1577 		syscallarg(int) pad;
1578 		syscallarg(off_t) length;
1579 	} */
1580 	struct sys_ftruncate_args ua;
1581 
1582 	NETBSD32TO64_UAP(fd);
1583 	NETBSD32TO64_UAP(pad);
1584 	NETBSD32TO64_UAP(length);
1585 	return (sys_ftruncate(l, &ua, retval));
1586 }
1587 
1588 int
1589 netbsd32_mlock(struct lwp *l, const struct netbsd32_mlock_args *uap, register_t *retval)
1590 {
1591 	/* {
1592 		syscallarg(const netbsd32_voidp) addr;
1593 		syscallarg(netbsd32_size_t) len;
1594 	} */
1595 	struct sys_mlock_args ua;
1596 
1597 	NETBSD32TOP_UAP(addr, const void);
1598 	NETBSD32TO64_UAP(len);
1599 	return (sys_mlock(l, &ua, retval));
1600 }
1601 
1602 int
1603 netbsd32_munlock(struct lwp *l, const struct netbsd32_munlock_args *uap, register_t *retval)
1604 {
1605 	/* {
1606 		syscallarg(const netbsd32_voidp) addr;
1607 		syscallarg(netbsd32_size_t) len;
1608 	} */
1609 	struct sys_munlock_args ua;
1610 
1611 	NETBSD32TOP_UAP(addr, const void);
1612 	NETBSD32TO64_UAP(len);
1613 	return (sys_munlock(l, &ua, retval));
1614 }
1615 
1616 int
1617 netbsd32_undelete(struct lwp *l, const struct netbsd32_undelete_args *uap, register_t *retval)
1618 {
1619 	/* {
1620 		syscallarg(const netbsd32_charp) path;
1621 	} */
1622 	struct sys_undelete_args ua;
1623 
1624 	NETBSD32TOP_UAP(path, const char);
1625 	return (sys_undelete(l, &ua, retval));
1626 }
1627 
1628 int
1629 netbsd32_getpgid(struct lwp *l, const struct netbsd32_getpgid_args *uap, register_t *retval)
1630 {
1631 	/* {
1632 		syscallarg(pid_t) pid;
1633 	} */
1634 	struct sys_getpgid_args ua;
1635 
1636 	NETBSD32TO64_UAP(pid);
1637 	return (sys_getpgid(l, &ua, retval));
1638 }
1639 
1640 int
1641 netbsd32_reboot(struct lwp *l, const struct netbsd32_reboot_args *uap, register_t *retval)
1642 {
1643 	/* {
1644 		syscallarg(int) opt;
1645 		syscallarg(netbsd32_charp) bootstr;
1646 	} */
1647 	struct sys_reboot_args ua;
1648 
1649 	NETBSD32TO64_UAP(opt);
1650 	NETBSD32TOP_UAP(bootstr, char);
1651 	return (sys_reboot(l, &ua, retval));
1652 }
1653 
1654 #include <sys/poll.h>
1655 int
1656 netbsd32_poll(struct lwp *l, const struct netbsd32_poll_args *uap, register_t *retval)
1657 {
1658 	/* {
1659 		syscallarg(netbsd32_pollfdp_t) fds;
1660 		syscallarg(u_int) nfds;
1661 		syscallarg(int) timeout;
1662 	} */
1663 	struct sys_poll_args ua;
1664 
1665 	NETBSD32TOP_UAP(fds, struct pollfd);
1666 	NETBSD32TO64_UAP(nfds);
1667 	NETBSD32TO64_UAP(timeout);
1668 
1669 	return (sys_poll(l, &ua, retval));
1670 }
1671 
1672 int
1673 netbsd32_fdatasync(struct lwp *l, const struct netbsd32_fdatasync_args *uap, register_t *retval)
1674 {
1675 	/* {
1676 		syscallarg(int) fd;
1677 	} */
1678 	struct sys_fdatasync_args ua;
1679 
1680 	NETBSD32TO64_UAP(fd);
1681 	return (sys_fdatasync(l, &ua, retval));
1682 }
1683 
1684 int
1685 netbsd32___posix_rename(struct lwp *l, const struct netbsd32___posix_rename_args *uap, register_t *retval)
1686 {
1687 	/* {
1688 		syscallarg(const netbsd32_charp) from;
1689 		syscallarg(const netbsd32_charp) to;
1690 	} */
1691 	struct sys___posix_rename_args ua;
1692 
1693 	NETBSD32TOP_UAP(from, const char);
1694 	NETBSD32TOP_UAP(to, const char);
1695 	return (sys___posix_rename(l, &ua, retval));
1696 }
1697 
1698 int
1699 netbsd32_swapctl(struct lwp *l, const struct netbsd32_swapctl_args *uap, register_t *retval)
1700 {
1701 	/* {
1702 		syscallarg(int) cmd;
1703 		syscallarg(const netbsd32_voidp) arg;
1704 		syscallarg(int) misc;
1705 	} */
1706 	struct sys_swapctl_args ua;
1707 
1708 	NETBSD32TO64_UAP(cmd);
1709 	NETBSD32TOP_UAP(arg, void);
1710 	NETBSD32TO64_UAP(misc);
1711 	return (sys_swapctl(l, &ua, retval));
1712 }
1713 
1714 int
1715 netbsd32_minherit(struct lwp *l, const struct netbsd32_minherit_args *uap, register_t *retval)
1716 {
1717 	/* {
1718 		syscallarg(netbsd32_voidp) addr;
1719 		syscallarg(netbsd32_size_t) len;
1720 		syscallarg(int) inherit;
1721 	} */
1722 	struct sys_minherit_args ua;
1723 
1724 	NETBSD32TOP_UAP(addr, void);
1725 	NETBSD32TOX_UAP(len, size_t);
1726 	NETBSD32TO64_UAP(inherit);
1727 	return (sys_minherit(l, &ua, retval));
1728 }
1729 
1730 int
1731 netbsd32_lchmod(struct lwp *l, const struct netbsd32_lchmod_args *uap, register_t *retval)
1732 {
1733 	/* {
1734 		syscallarg(const netbsd32_charp) path;
1735 		syscallarg(mode_t) mode;
1736 	} */
1737 	struct sys_lchmod_args ua;
1738 
1739 	NETBSD32TOP_UAP(path, const char);
1740 	NETBSD32TO64_UAP(mode);
1741 	return (sys_lchmod(l, &ua, retval));
1742 }
1743 
1744 int
1745 netbsd32_lchown(struct lwp *l, const struct netbsd32_lchown_args *uap, register_t *retval)
1746 {
1747 	/* {
1748 		syscallarg(const netbsd32_charp) path;
1749 		syscallarg(uid_t) uid;
1750 		syscallarg(gid_t) gid;
1751 	} */
1752 	struct sys_lchown_args ua;
1753 
1754 	NETBSD32TOP_UAP(path, const char);
1755 	NETBSD32TO64_UAP(uid);
1756 	NETBSD32TO64_UAP(gid);
1757 	return (sys_lchown(l, &ua, retval));
1758 }
1759 
1760 int
1761 netbsd32___msync13(struct lwp *l, const struct netbsd32___msync13_args *uap, register_t *retval)
1762 {
1763 	/* {
1764 		syscallarg(netbsd32_voidp) addr;
1765 		syscallarg(netbsd32_size_t) len;
1766 		syscallarg(int) flags;
1767 	} */
1768 	struct sys___msync13_args ua;
1769 
1770 	NETBSD32TOP_UAP(addr, void);
1771 	NETBSD32TOX_UAP(len, size_t);
1772 	NETBSD32TO64_UAP(flags);
1773 	return (sys___msync13(l, &ua, retval));
1774 }
1775 
1776 int
1777 netbsd32___posix_chown(struct lwp *l, const struct netbsd32___posix_chown_args *uap, register_t *retval)
1778 {
1779 	/* {
1780 		syscallarg(const netbsd32_charp) path;
1781 		syscallarg(uid_t) uid;
1782 		syscallarg(gid_t) gid;
1783 	} */
1784 	struct sys___posix_chown_args ua;
1785 
1786 	NETBSD32TOP_UAP(path, const char);
1787 	NETBSD32TO64_UAP(uid);
1788 	NETBSD32TO64_UAP(gid);
1789 	return (sys___posix_chown(l, &ua, retval));
1790 }
1791 
1792 int
1793 netbsd32___posix_fchown(struct lwp *l, const struct netbsd32___posix_fchown_args *uap, register_t *retval)
1794 {
1795 	/* {
1796 		syscallarg(int) fd;
1797 		syscallarg(uid_t) uid;
1798 		syscallarg(gid_t) gid;
1799 	} */
1800 	struct sys___posix_fchown_args ua;
1801 
1802 	NETBSD32TO64_UAP(fd);
1803 	NETBSD32TO64_UAP(uid);
1804 	NETBSD32TO64_UAP(gid);
1805 	return (sys___posix_fchown(l, &ua, retval));
1806 }
1807 
1808 int
1809 netbsd32___posix_lchown(struct lwp *l, const struct netbsd32___posix_lchown_args *uap, register_t *retval)
1810 {
1811 	/* {
1812 		syscallarg(const netbsd32_charp) path;
1813 		syscallarg(uid_t) uid;
1814 		syscallarg(gid_t) gid;
1815 	} */
1816 	struct sys___posix_lchown_args ua;
1817 
1818 	NETBSD32TOP_UAP(path, const char);
1819 	NETBSD32TO64_UAP(uid);
1820 	NETBSD32TO64_UAP(gid);
1821 	return (sys___posix_lchown(l, &ua, retval));
1822 }
1823 
1824 int
1825 netbsd32_getsid(struct lwp *l, const struct netbsd32_getsid_args *uap, register_t *retval)
1826 {
1827 	/* {
1828 		syscallarg(pid_t) pid;
1829 	} */
1830 	struct sys_getsid_args ua;
1831 
1832 	NETBSD32TO64_UAP(pid);
1833 	return (sys_getsid(l, &ua, retval));
1834 }
1835 
1836 int
1837 netbsd32_fktrace(struct lwp *l, const struct netbsd32_fktrace_args *uap, register_t *retval)
1838 {
1839 	/* {
1840 		syscallarg(int) fd;
1841 		syscallarg(int) ops;
1842 		syscallarg(int) facs;
1843 		syscallarg(int) pid;
1844 	} */
1845 	struct sys_fktrace_args ua;
1846 
1847 	NETBSD32TOX_UAP(fd, int);
1848 	NETBSD32TO64_UAP(ops);
1849 	NETBSD32TO64_UAP(facs);
1850 	NETBSD32TO64_UAP(pid);
1851 	return (sys_fktrace(l, &ua, retval));
1852 }
1853 
1854 int
1855 netbsd32___sigpending14(struct lwp *l, const struct netbsd32___sigpending14_args *uap, register_t *retval)
1856 {
1857 	/* {
1858 		syscallarg(sigset_t *) set;
1859 	} */
1860 	struct sys___sigpending14_args ua;
1861 
1862 	NETBSD32TOP_UAP(set, sigset_t);
1863 	return (sys___sigpending14(l, &ua, retval));
1864 }
1865 
1866 int
1867 netbsd32___sigprocmask14(struct lwp *l, const struct netbsd32___sigprocmask14_args *uap, register_t *retval)
1868 {
1869 	/* {
1870 		syscallarg(int) how;
1871 		syscallarg(const sigset_t *) set;
1872 		syscallarg(sigset_t *) oset;
1873 	} */
1874 	struct sys___sigprocmask14_args ua;
1875 
1876 	NETBSD32TO64_UAP(how);
1877 	NETBSD32TOP_UAP(set, sigset_t);
1878 	NETBSD32TOP_UAP(oset, sigset_t);
1879 	return (sys___sigprocmask14(l, &ua, retval));
1880 }
1881 
1882 int
1883 netbsd32___sigsuspend14(struct lwp *l, const struct netbsd32___sigsuspend14_args *uap, register_t *retval)
1884 {
1885 	/* {
1886 		syscallarg(const sigset_t *) set;
1887 	} */
1888 	struct sys___sigsuspend14_args ua;
1889 
1890 	NETBSD32TOP_UAP(set, sigset_t);
1891 	return (sys___sigsuspend14(l, &ua, retval));
1892 };
1893 
1894 int
1895 netbsd32_fchroot(struct lwp *l, const struct netbsd32_fchroot_args *uap, register_t *retval)
1896 {
1897 	/* {
1898 		syscallarg(int) fd;
1899 	} */
1900 	struct sys_fchroot_args ua;
1901 
1902 	NETBSD32TO64_UAP(fd);
1903 	return (sys_fchroot(l, &ua, retval));
1904 }
1905 
1906 /*
1907  * Open a file given a file handle.
1908  *
1909  * Check permissions, allocate an open file structure,
1910  * and call the device open routine if any.
1911  */
1912 int
1913 netbsd32___fhopen40(struct lwp *l, const struct netbsd32___fhopen40_args *uap, register_t *retval)
1914 {
1915 	/* {
1916 		syscallarg(const netbsd32_pointer_t *) fhp;
1917 		syscallarg(netbsd32_size_t) fh_size;
1918 		syscallarg(int) flags;
1919 	} */
1920 	struct sys___fhopen40_args ua;
1921 
1922 	NETBSD32TOP_UAP(fhp, fhandle_t);
1923 	NETBSD32TO64_UAP(fh_size);
1924 	NETBSD32TO64_UAP(flags);
1925 	return (sys___fhopen40(l, &ua, retval));
1926 }
1927 
1928 /* virtual memory syscalls */
1929 int
1930 netbsd32_ovadvise(struct lwp *l, const struct netbsd32_ovadvise_args *uap, register_t *retval)
1931 {
1932 	/* {
1933 		syscallarg(int) anom;
1934 	} */
1935 	struct sys_ovadvise_args ua;
1936 
1937 	NETBSD32TO64_UAP(anom);
1938 	return (sys_ovadvise(l, &ua, retval));
1939 }
1940 
1941 void
1942 netbsd32_adjust_limits(struct proc *p)
1943 {
1944 	static const struct {
1945 		int id;
1946 		rlim_t lim;
1947 	} lm[] = {
1948 		{ RLIMIT_DATA,	MAXDSIZ32 },
1949 		{ RLIMIT_STACK, MAXSSIZ32 },
1950 	};
1951 	size_t i;
1952 	struct plimit *lim;
1953 	struct rlimit *rlim;
1954 
1955 	/*
1956 	 * We can only reduce the current limits, we cannot stop external
1957 	 * processes from changing them (eg via sysctl) later on.
1958 	 * So there is no point trying to lock out such changes here.
1959 	 *
1960 	 * If we assume that rlim_cur/max are accessed using atomic
1961 	 * operations, we don't need to lock against any other updates
1962 	 * that might happen if the plimit structure is shared writable
1963 	 * between multiple processes.
1964 	 */
1965 
1966 	/* Scan to determine is any limits are out of range */
1967 	lim = p->p_limit;
1968 	for (i = 0; ; i++) {
1969 		if (i >= __arraycount(lm))
1970 			/* All in range */
1971 			return;
1972 		rlim = lim->pl_rlimit + lm[i].id;
1973 		if (LIMITCHECK(rlim->rlim_cur, lm[i].lim))
1974 			break;
1975 		if (LIMITCHECK(rlim->rlim_max, lm[i].lim))
1976 			break;
1977 	}
1978 
1979 	lim_privatise(p, false);
1980 
1981 	lim = p->p_limit;
1982 	for (i = 0; i < __arraycount(lm); i++) {
1983 		rlim = lim->pl_rlimit + lm[i].id;
1984 		if (LIMITCHECK(rlim->rlim_cur, lm[i].lim))
1985 			rlim->rlim_cur = lm[i].lim;
1986 		if (LIMITCHECK(rlim->rlim_max, lm[i].lim))
1987 			rlim->rlim_max = lm[i].lim;
1988 	}
1989 }
1990 
1991 int
1992 netbsd32_uuidgen(struct lwp *l, const struct netbsd32_uuidgen_args *uap, register_t *retval)
1993 {
1994 	/* {
1995 		syscallarg(netbsd32_uuidp_t) store;
1996 		syscallarg(int) count;
1997 	} */
1998 	struct sys_uuidgen_args ua;
1999 
2000 	NETBSD32TOP_UAP(store, struct uuid);
2001 	NETBSD32TO64_UAP(count);
2002 	return (sys_uuidgen(l, &ua, retval));
2003 }
2004 
2005 int
2006 netbsd32_extattrctl(struct lwp *l, const struct netbsd32_extattrctl_args *uap, register_t *retval)
2007 {
2008 	/* {
2009 		syscallarg(const netbsd32_charp) path;
2010 		syscallarg(int) cmd;
2011 		syscallarg(const netbsd32_charp) filename;
2012 		syscallarg(int) attrnamespace;
2013 		syscallarg(const netbsd32_charp) attrname;
2014 	} */
2015 	struct sys_extattrctl_args ua;
2016 
2017 	NETBSD32TOP_UAP(path, const char);
2018 	NETBSD32TO64_UAP(cmd);
2019 	NETBSD32TOP_UAP(filename, const char);
2020 	NETBSD32TO64_UAP(attrnamespace);
2021 	NETBSD32TOP_UAP(attrname, const char);
2022 	return sys_extattrctl(l, &ua, retval);
2023 }
2024 
2025 int
2026 netbsd32_extattr_set_fd(struct lwp *l, const struct netbsd32_extattr_set_fd_args *uap, register_t *retval)
2027 {
2028 	/* {
2029 		syscallarg(int) fd;
2030 		syscallarg(int) attrnamespace;
2031 		syscallarg(const netbsd32_charp) attrname;
2032 		syscallarg(const netbsd32_voidp) data;
2033 		syscallarg(netbsd32_size_t) nbytes;
2034 	} */
2035 	struct sys_extattr_set_fd_args ua;
2036 
2037 	NETBSD32TO64_UAP(fd);
2038 	NETBSD32TO64_UAP(attrnamespace);
2039 	NETBSD32TOP_UAP(attrname, const char);
2040 	NETBSD32TOP_UAP(data, const void);
2041 	NETBSD32TOX_UAP(nbytes, size_t);
2042 	return sys_extattr_set_fd(l, &ua, retval);
2043 }
2044 
2045 int
2046 netbsd32_extattr_set_file(struct lwp *l, const struct netbsd32_extattr_set_file_args *uap, register_t *retval)
2047 {
2048 	/* {
2049 		syscallarg(const netbsd32_charp) path;
2050 		syscallarg(int) attrnamespace;
2051 		syscallarg(const netbsd32_charp) attrname;
2052 		syscallarg(const netbsd32_voidp) data;
2053 		syscallarg(netbsd32_size_t) nbytes;
2054 	} */
2055 	struct sys_extattr_set_file_args ua;
2056 
2057 	NETBSD32TOP_UAP(path, const char);
2058 	NETBSD32TO64_UAP(attrnamespace);
2059 	NETBSD32TOP_UAP(attrname, const char);
2060 	NETBSD32TOP_UAP(data, const void);
2061 	NETBSD32TOX_UAP(nbytes, size_t);
2062 	return sys_extattr_set_file(l, &ua, retval);
2063 }
2064 
2065 int
2066 netbsd32_extattr_set_link(struct lwp *l, const struct netbsd32_extattr_set_link_args *uap, register_t *retval)
2067 {
2068 	/* {
2069 		syscallarg(const netbsd32_charp) path;
2070 		syscallarg(int) attrnamespace;
2071 		syscallarg(const netbsd32_charp) attrname;
2072 		syscallarg(const netbsd32_voidp) data;
2073 		syscallarg(netbsd32_size_t) nbytes;
2074 	} */
2075 	struct sys_extattr_set_link_args ua;
2076 
2077 	NETBSD32TOP_UAP(path, const char);
2078 	NETBSD32TO64_UAP(attrnamespace);
2079 	NETBSD32TOP_UAP(attrname, const char);
2080 	NETBSD32TOP_UAP(data, const void);
2081 	NETBSD32TOX_UAP(nbytes, size_t);
2082 	return sys_extattr_set_link(l, &ua, retval);
2083 }
2084 
2085 int
2086 netbsd32_extattr_get_fd(struct lwp *l, const struct netbsd32_extattr_get_fd_args *uap, register_t *retval)
2087 {
2088 	/* {
2089 		syscallarg(int) fd;
2090 		syscallarg(int) attrnamespace;
2091 		syscallarg(const netbsd32_charp) attrname;
2092 		syscallarg(netbsd32_voidp) data;
2093 		syscallarg(netbsd32_size_t) nbytes;
2094 	} */
2095 	struct sys_extattr_get_fd_args ua;
2096 
2097 	NETBSD32TO64_UAP(fd);
2098 	NETBSD32TO64_UAP(attrnamespace);
2099 	NETBSD32TOP_UAP(attrname, const char);
2100 	NETBSD32TOP_UAP(data, void);
2101 	NETBSD32TOX_UAP(nbytes, size_t);
2102 	return sys_extattr_get_fd(l, &ua, retval);
2103 }
2104 
2105 int
2106 netbsd32_extattr_get_file(struct lwp *l, const struct netbsd32_extattr_get_file_args *uap, register_t *retval)
2107 {
2108 	/* {
2109 		syscallarg(const netbsd32_charp) path;
2110 		syscallarg(int) attrnamespace;
2111 		syscallarg(const netbsd32_charp) attrname;
2112 		syscallarg(netbsd32_voidp) data;
2113 		syscallarg(netbsd32_size_t) nbytes;
2114 	} */
2115 	struct sys_extattr_get_file_args ua;
2116 
2117 	NETBSD32TOP_UAP(path, const char);
2118 	NETBSD32TO64_UAP(attrnamespace);
2119 	NETBSD32TOP_UAP(attrname, const char);
2120 	NETBSD32TOP_UAP(data, void);
2121 	NETBSD32TOX_UAP(nbytes, size_t);
2122 	return sys_extattr_get_file(l, &ua, retval);
2123 }
2124 
2125 int
2126 netbsd32_extattr_get_link(struct lwp *l, const struct netbsd32_extattr_get_link_args *uap, register_t *retval)
2127 {
2128 	/* {
2129 		syscallarg(const netbsd32_charp) path;
2130 		syscallarg(int) attrnamespace;
2131 		syscallarg(const netbsd32_charp) attrname;
2132 		syscallarg(netbsd32_voidp) data;
2133 		syscallarg(netbsd32_size_t) nbytes;
2134 	} */
2135 	struct sys_extattr_get_link_args ua;
2136 
2137 	NETBSD32TOP_UAP(path, const char);
2138 	NETBSD32TO64_UAP(attrnamespace);
2139 	NETBSD32TOP_UAP(attrname, const char);
2140 	NETBSD32TOP_UAP(data, void);
2141 	NETBSD32TOX_UAP(nbytes, size_t);
2142 	return sys_extattr_get_link(l, &ua, retval);
2143 }
2144 
2145 int
2146 netbsd32_extattr_delete_fd(struct lwp *l, const struct netbsd32_extattr_delete_fd_args *uap, register_t *retval)
2147 {
2148 	/* {
2149 		syscallarg(int) fd;
2150 		syscallarg(int) attrnamespace;
2151 		syscallarg(const netbsd32_charp) attrname;
2152 	} */
2153 	struct sys_extattr_delete_fd_args ua;
2154 
2155 	NETBSD32TO64_UAP(fd);
2156 	NETBSD32TO64_UAP(attrnamespace);
2157 	NETBSD32TOP_UAP(attrname, const char);
2158 	return sys_extattr_delete_fd(l, &ua, retval);
2159 }
2160 
2161 int
2162 netbsd32_extattr_delete_file(struct lwp *l, const struct netbsd32_extattr_delete_file_args *uap, register_t *retval)
2163 {
2164 	/* {
2165 		syscallarg(const netbsd32_charp) path;
2166 		syscallarg(int) attrnamespace;
2167 		syscallarg(const netbsd32_charp) attrname;
2168 	} */
2169 	struct sys_extattr_delete_file_args ua;
2170 
2171 	NETBSD32TOP_UAP(path, const char);
2172 	NETBSD32TO64_UAP(attrnamespace);
2173 	NETBSD32TOP_UAP(attrname, const char);
2174 	return sys_extattr_delete_file(l, &ua, retval);
2175 }
2176 
2177 int
2178 netbsd32_extattr_delete_link(struct lwp *l, const struct netbsd32_extattr_delete_link_args *uap, register_t *retval)
2179 {
2180 	/* {
2181 		syscallarg(const netbsd32_charp) path;
2182 		syscallarg(int) attrnamespace;
2183 		syscallarg(const netbsd32_charp) attrname;
2184 	} */
2185 	struct sys_extattr_delete_link_args ua;
2186 
2187 	NETBSD32TOP_UAP(path, const char);
2188 	NETBSD32TO64_UAP(attrnamespace);
2189 	NETBSD32TOP_UAP(attrname, const char);
2190 	return sys_extattr_delete_link(l, &ua, retval);
2191 }
2192 
2193 int
2194 netbsd32_extattr_list_fd(struct lwp *l, const struct netbsd32_extattr_list_fd_args *uap, register_t *retval)
2195 {
2196 	/* {
2197 		syscallarg(int) fd;
2198 		syscallarg(int) attrnamespace;
2199 		syscallarg(netbsd32_voidp) data;
2200 		syscallarg(netbsd32_size_t) nbytes;
2201 	} */
2202 	struct sys_extattr_list_fd_args ua;
2203 
2204 	NETBSD32TO64_UAP(fd);
2205 	NETBSD32TO64_UAP(attrnamespace);
2206 	NETBSD32TOP_UAP(data, void);
2207 	NETBSD32TOX_UAP(nbytes, size_t);
2208 	return sys_extattr_list_fd(l, &ua, retval);
2209 }
2210 
2211 int
2212 netbsd32_extattr_list_file(struct lwp *l, const struct netbsd32_extattr_list_file_args *uap, register_t *retval)
2213 {
2214 	/* {
2215 		syscallarg(const netbsd32_charp) path;
2216 		syscallarg(int) attrnamespace;
2217 		syscallarg(netbsd32_voidp) data;
2218 		syscallarg(netbsd32_size_t) nbytes;
2219 	} */
2220 	struct sys_extattr_list_file_args ua;
2221 
2222 	NETBSD32TOP_UAP(path, const char);
2223 	NETBSD32TO64_UAP(attrnamespace);
2224 	NETBSD32TOP_UAP(data, void);
2225 	NETBSD32TOX_UAP(nbytes, size_t);
2226 	return sys_extattr_list_file(l, &ua, retval);
2227 }
2228 
2229 int
2230 netbsd32_extattr_list_link(struct lwp *l, const struct netbsd32_extattr_list_link_args *uap, register_t *retval)
2231 {
2232 	/* {
2233 		syscallarg(const netbsd32_charp) path;
2234 		syscallarg(int) attrnamespace;
2235 		syscallarg(netbsd32_voidp) data;
2236 		syscallarg(netbsd32_size_t) nbytes;
2237 	} */
2238 	struct sys_extattr_list_link_args ua;
2239 
2240 	NETBSD32TOP_UAP(path, const char);
2241 	NETBSD32TO64_UAP(attrnamespace);
2242 	NETBSD32TOP_UAP(data, void);
2243 	NETBSD32TOX_UAP(nbytes, size_t);
2244 	return sys_extattr_list_link(l, &ua, retval);
2245 }
2246 
2247 int
2248 netbsd32_mlockall(struct lwp *l, const struct netbsd32_mlockall_args *uap, register_t *retval)
2249 {
2250 	/* {
2251 		syscallarg(int) flags;
2252 	} */
2253 	struct sys_mlockall_args ua;
2254 
2255 	NETBSD32TO64_UAP(flags);
2256 	return (sys_mlockall(l, &ua, retval));
2257 }
2258 
2259 int
2260 netbsd32___clone(struct lwp *l, const struct netbsd32___clone_args *uap, register_t *retval)
2261 {
2262 	/*  {
2263 		syscallarg(int) flags;
2264 		syscallarg(netbsd32_voidp) stack;
2265 	} */
2266 	struct sys___clone_args ua;
2267 
2268 	NETBSD32TO64_UAP(flags);
2269 	NETBSD32TOP_UAP(stack, void);
2270 	return sys___clone(l, &ua, retval);
2271 }
2272 
2273 int
2274 netbsd32_fsync_range(struct lwp *l, const struct netbsd32_fsync_range_args *uap, register_t *retval)
2275 {
2276 	/* {
2277 		syscallarg(int) fd;
2278 		syscallarg(int) flags;
2279 		syscallarg(off_t) start;
2280 		syscallarg(off_t) length;
2281 	} */
2282 	struct sys_fsync_range_args ua;
2283 
2284 	NETBSD32TO64_UAP(fd);
2285 	NETBSD32TO64_UAP(flags);
2286 	NETBSD32TO64_UAP(start);
2287 	NETBSD32TO64_UAP(length);
2288 	return (sys_fsync_range(l, &ua, retval));
2289 }
2290 
2291 int
2292 netbsd32_rasctl(struct lwp *l, const struct netbsd32_rasctl_args *uap, register_t *retval)
2293 {
2294 	/* {
2295 		syscallarg(netbsd32_caddr_t) addr;
2296 		syscallarg(netbsd32_size_t) len;
2297 		syscallarg(int) op;
2298 	} */
2299 	struct sys_rasctl_args ua;
2300 
2301 	NETBSD32TOP_UAP(addr, void *);
2302 	NETBSD32TOX_UAP(len, size_t);
2303 	NETBSD32TO64_UAP(op);
2304 	return sys_rasctl(l, &ua, retval);
2305 }
2306 
2307 int
2308 netbsd32_setxattr(struct lwp *l, const struct netbsd32_setxattr_args *uap, register_t *retval)
2309 {
2310 	/* {
2311 		syscallarg(const netbsd32_charp) path;
2312 		syscallarg(const netbsd32_charp) name;
2313 		syscallarg(netbsd32_voidp) value;
2314 		syscallarg(netbsd32_size_t) size;
2315 		syscallarg(int) flags;
2316 	} */
2317 	struct sys_setxattr_args ua;
2318 	NETBSD32TOP_UAP(path, const char);
2319 	NETBSD32TOP_UAP(name, const char);
2320 	NETBSD32TOP_UAP(value, void);
2321 	NETBSD32TOX_UAP(size, size_t);
2322 	NETBSD32TO64_UAP(flags);
2323 	return sys_setxattr(l, &ua, retval);
2324 }
2325 
2326 int
2327 netbsd32_lsetxattr(struct lwp *l, const struct netbsd32_lsetxattr_args *uap, register_t *retval)
2328 {
2329 	/* {
2330 		syscallarg(const netbsd32_charp) path;
2331 		syscallarg(const netbsd32_charp) name;
2332 		syscallarg(netbsd32_voidp) value;
2333 		syscallarg(netbsd32_size_t) size;
2334 		syscallarg(int) flags;
2335 	} */
2336 	struct sys_lsetxattr_args ua;
2337 	NETBSD32TOP_UAP(path, const char);
2338 	NETBSD32TOP_UAP(name, const char);
2339 	NETBSD32TOP_UAP(value, void);
2340 	NETBSD32TOX_UAP(size, size_t);
2341 	NETBSD32TO64_UAP(flags);
2342 	return sys_lsetxattr(l, &ua, retval);
2343 }
2344 
2345 int
2346 netbsd32_fsetxattr(struct lwp *l, const struct netbsd32_fsetxattr_args *uap, register_t *retval)
2347 {
2348 	/* {
2349 		syscallarg(int) fd;
2350 		syscallarg(const netbsd32_charp) name;
2351 		syscallarg(netbsd32_voidp) value;
2352 		syscallarg(netbsd32_size_t) size;
2353 		syscallarg(int) flags;
2354 	} */
2355 	struct sys_fsetxattr_args ua;
2356 	NETBSD32TO64_UAP(fd);
2357 	NETBSD32TOP_UAP(name, const char);
2358 	NETBSD32TOP_UAP(value, void);
2359 	NETBSD32TOX_UAP(size, size_t);
2360 	NETBSD32TO64_UAP(flags);
2361 	return sys_fsetxattr(l, &ua, retval);
2362 }
2363 
2364 int
2365 netbsd32_getxattr(struct lwp *l, const struct netbsd32_getxattr_args *uap, register_t *retval)
2366 {
2367 	/* {
2368 		syscallarg(const netbsd32_charp) path;
2369 		syscallarg(const netbsd32_charp) name;
2370 		syscallarg(netbsd32_voidp) value;
2371 		syscallarg(netbsd32_size_t) size;
2372 	} */
2373 	struct sys_getxattr_args ua;
2374 	NETBSD32TOP_UAP(path, const char);
2375 	NETBSD32TOP_UAP(name, const char);
2376 	NETBSD32TOP_UAP(value, void);
2377 	NETBSD32TOX_UAP(size, size_t);
2378 	return sys_getxattr(l, &ua, retval);
2379 }
2380 
2381 int
2382 netbsd32_lgetxattr(struct lwp *l, const struct netbsd32_lgetxattr_args *uap, register_t *retval)
2383 {
2384 	/* {
2385 		syscallarg(const netbsd32_charp) path;
2386 		syscallarg(const netbsd32_charp) name;
2387 		syscallarg(netbsd32_voidp) value;
2388 		syscallarg(netbsd32_size_t) size;
2389 	} */
2390 	struct sys_lgetxattr_args ua;
2391 	NETBSD32TOP_UAP(path, const char);
2392 	NETBSD32TOP_UAP(name, const char);
2393 	NETBSD32TOP_UAP(value, void);
2394 	NETBSD32TOX_UAP(size, size_t);
2395 	return sys_lgetxattr(l, &ua, retval);
2396 }
2397 
2398 int
2399 netbsd32_fgetxattr(struct lwp *l, const struct netbsd32_fgetxattr_args *uap, register_t *retval)
2400 {
2401 	/* {
2402 		syscallarg(int) fd;
2403 		syscallarg(const netbsd32_charp) name;
2404 		syscallarg(netbsd32_voidp) value;
2405 		syscallarg(netbsd32_size_t) size;
2406 	} */
2407 	struct sys_fgetxattr_args ua;
2408 	NETBSD32TO64_UAP(fd);
2409 	NETBSD32TOP_UAP(name, const char);
2410 	NETBSD32TOP_UAP(value, void);
2411 	NETBSD32TOX_UAP(size, size_t);
2412 	return sys_fgetxattr(l, &ua, retval);
2413 }
2414 
2415 int
2416 netbsd32_listxattr(struct lwp *l, const struct netbsd32_listxattr_args *uap, register_t *retval)
2417 {
2418 	/* {
2419 		syscallarg(const netbsd32_charp) path;
2420 		syscallarg(netbsd32_charp) list;
2421 		syscallarg(netbsd32_size_t) size;
2422 	} */
2423 	struct sys_listxattr_args ua;
2424 	NETBSD32TOP_UAP(path, const char);
2425 	NETBSD32TOP_UAP(list, char);
2426 	NETBSD32TOX_UAP(size, size_t);
2427 	return sys_listxattr(l, &ua, retval);
2428 }
2429 
2430 int
2431 netbsd32_llistxattr(struct lwp *l, const struct netbsd32_llistxattr_args *uap, register_t *retval)
2432 {
2433 	/* {
2434 		syscallarg(const netbsd32_charp) path;
2435 		syscallarg(netbsd32_charp) list;
2436 		syscallarg(netbsd32_size_t) size;
2437 	} */
2438 	struct sys_llistxattr_args ua;
2439 	NETBSD32TOP_UAP(path, const char);
2440 	NETBSD32TOP_UAP(list, char);
2441 	NETBSD32TOX_UAP(size, size_t);
2442 	return sys_llistxattr(l, &ua, retval);
2443 }
2444 
2445 int
2446 netbsd32_flistxattr(struct lwp *l, const struct netbsd32_flistxattr_args *uap, register_t *retval)
2447 {
2448 	/* {
2449 		syscallarg(int) fd;
2450 		syscallarg(netbsd32_charp) list;
2451 		syscallarg(netbsd32_size_t) size;
2452 	} */
2453 	struct sys_flistxattr_args ua;
2454 	NETBSD32TO64_UAP(fd);
2455 	NETBSD32TOP_UAP(list, char);
2456 	NETBSD32TOX_UAP(size, size_t);
2457 	return sys_flistxattr(l, &ua, retval);
2458 }
2459 
2460 int
2461 netbsd32_removexattr(struct lwp *l, const struct netbsd32_removexattr_args *uap, register_t *retval)
2462 {
2463 	/* {
2464 		syscallarg(const netbsd32_charp) path;
2465 		syscallarg(const netbsd32_charp) name;
2466 	} */
2467 	struct sys_removexattr_args ua;
2468 	NETBSD32TOP_UAP(path, const char);
2469 	NETBSD32TOP_UAP(name, const char);
2470 	return sys_removexattr(l, &ua, retval);
2471 }
2472 
2473 int
2474 netbsd32_lremovexattr(struct lwp *l, const struct netbsd32_lremovexattr_args *uap, register_t *retval)
2475 {
2476 	/* {
2477 		syscallarg(const netbsd32_charp) path;
2478 		syscallarg(const netbsd32_charp) name;
2479 	} */
2480 	struct sys_lremovexattr_args ua;
2481 	NETBSD32TOP_UAP(path, const char);
2482 	NETBSD32TOP_UAP(name, const char);
2483 	return sys_lremovexattr(l, &ua, retval);
2484 }
2485 
2486 int
2487 netbsd32_fremovexattr(struct lwp *l, const struct netbsd32_fremovexattr_args *uap, register_t *retval)
2488 {
2489 	/* {
2490 		syscallarg(int) fd;
2491 		syscallarg(const netbsd32_charp) name;
2492 	} */
2493 	struct sys_fremovexattr_args ua;
2494 	NETBSD32TO64_UAP(fd);
2495 	NETBSD32TOP_UAP(name, const char);
2496 	return sys_fremovexattr(l, &ua, retval);
2497 }
2498 
2499 int
2500 netbsd32___posix_fadvise50(struct lwp *l,
2501 	const struct netbsd32___posix_fadvise50_args *uap, register_t *retval)
2502 {
2503 	/* {
2504 		syscallarg(int) fd;
2505 		syscallarg(int) pad;
2506 		syscallarg(off_t) offset;
2507 		syscallarg(off_t) len;
2508 		syscallarg(int) advice;
2509 	} */
2510 
2511 	return do_posix_fadvise(SCARG(uap, fd), SCARG(uap, offset),
2512 	    SCARG(uap, len), SCARG(uap, advice));
2513 }
2514 
2515 /*
2516  * MI indirect system call support.
2517  * Only used if the MD netbsd32_syscall.c doesn't intercept the calls.
2518  */
2519 
2520 #define NETBSD32_SYSCALL
2521 #undef SYS_NSYSENT
2522 #define SYS_NSYSENT NETBSD32_SYS_NSYSENT
2523 
2524 #define SYS_SYSCALL netbsd32_sys_syscall
2525 #include "../../kern/sys_syscall.c"
2526 #undef SYS_SYSCALL
2527 
2528 #define SYS_SYSCALL netbsd32_sys___syscall
2529 #include "../../kern/sys_syscall.c"
2530 #undef SYS_SYSCALL
2531