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