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