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