1 1.23 hannken /* $NetBSD: netbsd32_ipc.c,v 1.23 2025/05/23 09:47:34 hannken Exp $ */ 2 1.1 mrg 3 1.1 mrg /* 4 1.1 mrg * Copyright (c) 1998, 2001 Matthew R. Green 5 1.1 mrg * All rights reserved. 6 1.1 mrg * 7 1.1 mrg * Redistribution and use in source and binary forms, with or without 8 1.1 mrg * modification, are permitted provided that the following conditions 9 1.1 mrg * are met: 10 1.1 mrg * 1. Redistributions of source code must retain the above copyright 11 1.1 mrg * notice, this list of conditions and the following disclaimer. 12 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 mrg * notice, this list of conditions and the following disclaimer in the 14 1.1 mrg * documentation and/or other materials provided with the distribution. 15 1.1 mrg * 16 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 mrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 mrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 mrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 mrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 1.1 mrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 1.1 mrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 1.1 mrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 1.1 mrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 mrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 mrg * SUCH DAMAGE. 27 1.1 mrg */ 28 1.3 lukem 29 1.3 lukem #include <sys/cdefs.h> 30 1.23 hannken __KERNEL_RCSID(0, "$NetBSD: netbsd32_ipc.c,v 1.23 2025/05/23 09:47:34 hannken Exp $"); 31 1.1 mrg 32 1.2 mrg #if defined(_KERNEL_OPT) 33 1.1 mrg #include "opt_sysv.h" 34 1.1 mrg #endif 35 1.1 mrg 36 1.1 mrg #include <sys/param.h> 37 1.1 mrg #include <sys/systm.h> 38 1.1 mrg #include <sys/ipc.h> 39 1.1 mrg #include <sys/msg.h> 40 1.1 mrg #include <sys/sem.h> 41 1.1 mrg #include <sys/shm.h> 42 1.1 mrg #include <sys/mount.h> 43 1.18 pgoyette #include <sys/module.h> 44 1.6 christos #include <sys/dirent.h> 45 1.18 pgoyette #include <sys/syscallvar.h> 46 1.1 mrg 47 1.1 mrg #include <sys/syscallargs.h> 48 1.1 mrg #include <sys/proc.h> 49 1.1 mrg 50 1.1 mrg #include <compat/netbsd32/netbsd32.h> 51 1.18 pgoyette #include <compat/netbsd32/netbsd32_syscall.h> 52 1.1 mrg #include <compat/netbsd32/netbsd32_syscallargs.h> 53 1.1 mrg #include <compat/netbsd32/netbsd32_conv.h> 54 1.1 mrg 55 1.18 pgoyette #define _PKG_ENTRY(name) \ 56 1.18 pgoyette { NETBSD32_SYS_ ## name, 0, (sy_call_t *)name } 57 1.18 pgoyette 58 1.18 pgoyette #define _PKG_ENTRY2(code, name) \ 59 1.18 pgoyette { NETBSD32_SYS_ ## code, 0, (sy_call_t *)name } 60 1.18 pgoyette 61 1.18 pgoyette static const struct syscall_package compat_sysvipc_syscalls[] = { 62 1.18 pgoyette #if defined(SYSVSEM) 63 1.18 pgoyette _PKG_ENTRY(netbsd32_____semctl50), 64 1.18 pgoyette _PKG_ENTRY(netbsd32_semget), 65 1.18 pgoyette _PKG_ENTRY(netbsd32_semop), 66 1.18 pgoyette _PKG_ENTRY(netbsd32_semconfig), 67 1.21 martin _PKG_ENTRY(netbsd32_semtimedop), 68 1.18 pgoyette #endif /* SYSVSEM */ 69 1.18 pgoyette 70 1.18 pgoyette #if defined(SYSVSHM) 71 1.18 pgoyette _PKG_ENTRY(netbsd32_shmat), 72 1.18 pgoyette _PKG_ENTRY(netbsd32___shmctl50), 73 1.18 pgoyette _PKG_ENTRY(netbsd32_shmdt), 74 1.18 pgoyette _PKG_ENTRY(netbsd32_shmget), 75 1.18 pgoyette #endif /* SYSVSHM */ 76 1.18 pgoyette 77 1.18 pgoyette #if defined(SYSVMSG) 78 1.18 pgoyette _PKG_ENTRY(netbsd32___msgctl50), 79 1.18 pgoyette _PKG_ENTRY(netbsd32_msgget), 80 1.18 pgoyette _PKG_ENTRY(netbsd32_msgsnd), 81 1.18 pgoyette _PKG_ENTRY(netbsd32_msgrcv), 82 1.18 pgoyette #endif /* SYSVMSG */ 83 1.18 pgoyette { 0, 0, NULL } 84 1.18 pgoyette }; 85 1.18 pgoyette 86 1.19 pgoyette MODULE(MODULE_CLASS_EXEC, compat_netbsd32_sysvipc, 87 1.19 pgoyette "compat_netbsd32,sysv_ipc"); 88 1.18 pgoyette 89 1.21 martin #ifdef SEM_DEBUG 90 1.21 martin #define SEM_PRINTF(a) printf a 91 1.21 martin #else 92 1.21 martin #define SEM_PRINTF(a) 93 1.21 martin #endif 94 1.21 martin 95 1.18 pgoyette static int 96 1.18 pgoyette compat_netbsd32_sysvipc_modcmd(modcmd_t cmd, void *arg) 97 1.18 pgoyette { 98 1.18 pgoyette int error; 99 1.18 pgoyette 100 1.18 pgoyette switch (cmd) { 101 1.18 pgoyette case MODULE_CMD_INIT: 102 1.18 pgoyette error = syscall_establish(&emul_netbsd32, 103 1.18 pgoyette compat_sysvipc_syscalls); 104 1.18 pgoyette break; 105 1.18 pgoyette case MODULE_CMD_FINI: 106 1.18 pgoyette error = syscall_disestablish(&emul_netbsd32, 107 1.18 pgoyette compat_sysvipc_syscalls); 108 1.18 pgoyette break; 109 1.18 pgoyette default: 110 1.18 pgoyette error = ENOTTY; 111 1.18 pgoyette break; 112 1.18 pgoyette } 113 1.18 pgoyette return error; 114 1.18 pgoyette } 115 1.18 pgoyette 116 1.1 mrg #if defined(SYSVSEM) 117 1.12 dsl 118 1.1 mrg int 119 1.22 riastrad netbsd32_____semctl50(struct lwp *l, 120 1.22 riastrad const struct netbsd32_____semctl50_args *uap, 121 1.22 riastrad register_t *retval) 122 1.12 dsl { 123 1.14 dsl /* { 124 1.1 mrg syscallarg(int) semid; 125 1.1 mrg syscallarg(int) semnum; 126 1.1 mrg syscallarg(int) cmd; 127 1.8 cube syscallarg(netbsd32_semunp_t) arg; 128 1.14 dsl } */ 129 1.8 cube struct semid_ds sembuf; 130 1.8 cube struct netbsd32_semid_ds sembuf32; 131 1.8 cube int cmd, error; 132 1.8 cube void *pass_arg; 133 1.8 cube union __semun karg; 134 1.8 cube union netbsd32_semun karg32; 135 1.1 mrg 136 1.8 cube cmd = SCARG(uap, cmd); 137 1.1 mrg 138 1.1 mrg switch (cmd) { 139 1.1 mrg case IPC_SET: 140 1.1 mrg case IPC_STAT: 141 1.8 cube pass_arg = &sembuf; 142 1.1 mrg break; 143 1.1 mrg 144 1.8 cube case GETALL: 145 1.8 cube case SETVAL: 146 1.8 cube case SETALL: 147 1.8 cube pass_arg = &karg; 148 1.1 mrg break; 149 1.8 cube default: 150 1.8 cube pass_arg = NULL; 151 1.1 mrg break; 152 1.8 cube } 153 1.1 mrg 154 1.8 cube if (pass_arg) { 155 1.16 christos error = copyin(SCARG_P32(uap, arg), &karg32, sizeof(karg32)); 156 1.16 christos if (error) 157 1.16 christos return error; 158 1.8 cube if (pass_arg == &karg) { 159 1.8 cube switch (cmd) { 160 1.8 cube case GETALL: 161 1.8 cube case SETALL: 162 1.8 cube karg.array = NETBSD32PTR64(karg32.array); 163 1.8 cube break; 164 1.8 cube case SETVAL: 165 1.8 cube karg.val = karg32.val; 166 1.1 mrg break; 167 1.8 cube } 168 1.8 cube } 169 1.8 cube if (cmd == IPC_SET) { 170 1.8 cube error = copyin(NETBSD32PTR64(karg32.buf), &sembuf32, 171 1.8 cube sizeof(sembuf32)); 172 1.8 cube if (error) 173 1.20 simonb return error; 174 1.8 cube netbsd32_to_semid_ds(&sembuf32, &sembuf); 175 1.1 mrg } 176 1.8 cube } 177 1.1 mrg 178 1.9 ad error = semctl1(l, SCARG(uap, semid), SCARG(uap, semnum), cmd, 179 1.8 cube pass_arg, retval); 180 1.1 mrg 181 1.8 cube if (error == 0 && cmd == IPC_STAT) { 182 1.8 cube netbsd32_from_semid_ds(&sembuf, &sembuf32); 183 1.8 cube error = copyout(&sembuf32, NETBSD32PTR64(karg32.buf), 184 1.8 cube sizeof(sembuf32)); 185 1.1 mrg } 186 1.1 mrg 187 1.20 simonb return error; 188 1.1 mrg } 189 1.1 mrg 190 1.1 mrg int 191 1.22 riastrad netbsd32_semget(struct lwp *l, const struct netbsd32_semget_args *uap, 192 1.22 riastrad register_t *retval) 193 1.1 mrg { 194 1.14 dsl /* { 195 1.1 mrg syscallarg(netbsd32_key_t) key; 196 1.1 mrg syscallarg(int) nsems; 197 1.1 mrg syscallarg(int) semflg; 198 1.14 dsl } */ 199 1.1 mrg struct sys_semget_args ua; 200 1.1 mrg 201 1.1 mrg NETBSD32TOX_UAP(key, key_t); 202 1.1 mrg NETBSD32TO64_UAP(nsems); 203 1.1 mrg NETBSD32TO64_UAP(semflg); 204 1.20 simonb return sys_semget(l, &ua, retval); 205 1.1 mrg } 206 1.1 mrg 207 1.21 martin #define SMALL_SOPS 8 208 1.21 martin 209 1.21 martin CTASSERT(sizeof(struct netbsd32_sembuf) == sizeof(struct sembuf)); 210 1.21 martin 211 1.21 martin static int 212 1.22 riastrad netbsd32_do_semop(struct lwp *l, int semid, const netbsd32_sembufp_t usops, 213 1.22 riastrad size_t nsops, const struct netbsd32_timespec *utimeout, register_t *retval) 214 1.21 martin { 215 1.21 martin struct netbsd32_sembuf small_sops[SMALL_SOPS]; 216 1.21 martin struct netbsd32_sembuf *sops; 217 1.21 martin struct netbsd32_timespec ts32; 218 1.21 martin struct timespec timeout; 219 1.21 martin int error; 220 1.21 martin 221 1.21 martin do_semop_init(); 222 1.21 martin 223 1.23 hannken SEM_PRINTF(("do_semop(%d, %p, %zu)\n", semid, NETBSD32PTR64(usops), 224 1.23 hannken nsops)); 225 1.21 martin 226 1.21 martin if (nsops <= SMALL_SOPS) { 227 1.21 martin sops = small_sops; 228 1.21 martin } else if (seminfo.semopm > 0 && nsops <= (size_t)seminfo.semopm) { 229 1.21 martin sops = kmem_alloc(nsops * sizeof(*sops), KM_SLEEP); 230 1.21 martin } else { 231 1.21 martin SEM_PRINTF(("too many sops (max=%d, nsops=%zu)\n", 232 1.21 martin seminfo.semopm, nsops)); 233 1.21 martin return (E2BIG); 234 1.21 martin } 235 1.21 martin 236 1.21 martin /* netbsd32_sembuf == sembuf, see CTASSERT above */ 237 1.21 martin error = copyin(NETBSD32PTR64(usops), sops, nsops * sizeof(sops[0])); 238 1.21 martin if (error) { 239 1.21 martin SEM_PRINTF(("error = %d from copyin(%p, %p, %zu)\n", error, 240 1.23 hannken NETBSD32PTR64(usops), &sops, nsops * sizeof(sops[0]))); 241 1.21 martin if (sops != small_sops) 242 1.21 martin kmem_free(sops, nsops * sizeof(*sops)); 243 1.21 martin return error; 244 1.21 martin } 245 1.21 martin 246 1.21 martin if (utimeout) { 247 1.21 martin error = copyin(utimeout, &ts32, sizeof(ts32)); 248 1.21 martin if (error) { 249 1.21 martin SEM_PRINTF(("error = %d from copyin(%p, %p, %zu)\n", 250 1.21 martin error, utimeout, &ts32, sizeof(ts32))); 251 1.21 martin return error; 252 1.21 martin } 253 1.21 martin netbsd32_to_timespec(&ts32, &timeout); 254 1.21 martin } 255 1.21 martin 256 1.21 martin error = do_semop1(l, semid, (struct sembuf*)sops, nsops, 257 1.21 martin utimeout ? &timeout : NULL, retval); 258 1.21 martin 259 1.21 martin if (sops != small_sops) 260 1.21 martin kmem_free(sops, nsops * sizeof(*sops)); 261 1.21 martin 262 1.21 martin return error; 263 1.21 martin } 264 1.21 martin 265 1.1 mrg int 266 1.22 riastrad netbsd32_semop(struct lwp *l, const struct netbsd32_semop_args *uap, 267 1.22 riastrad register_t *retval) 268 1.1 mrg { 269 1.14 dsl /* { 270 1.1 mrg syscallarg(int) semid; 271 1.1 mrg syscallarg(netbsd32_sembufp_t) sops; 272 1.1 mrg syscallarg(netbsd32_size_t) nsops; 273 1.14 dsl } */ 274 1.1 mrg 275 1.21 martin return netbsd32_do_semop(l, SCARG(uap, semid), SCARG(uap,sops), 276 1.21 martin SCARG(uap, nsops), NULL, retval); 277 1.21 martin } 278 1.21 martin 279 1.21 martin int 280 1.22 riastrad netbsd32_semtimedop(struct lwp *l, const struct netbsd32_semtimedop_args *uap, 281 1.22 riastrad register_t *retval) 282 1.21 martin { 283 1.21 martin /* { 284 1.21 martin syscallarg(int) semid; 285 1.21 martin syscallarg(netbsd32_sembufp_t) sops; 286 1.21 martin syscallarg(netbsd32_size_t) nsops; 287 1.21 martin syscallarg(netbsd32_timespecp_t) timeout; 288 1.21 martin } */ 289 1.21 martin 290 1.21 martin return netbsd32_do_semop(l, SCARG(uap, semid), SCARG(uap,sops), 291 1.21 martin SCARG(uap, nsops), SCARG_P32(uap,timeout), retval); 292 1.1 mrg } 293 1.1 mrg 294 1.1 mrg int 295 1.22 riastrad netbsd32_semconfig(struct lwp *l, const struct netbsd32_semconfig_args *uap, 296 1.22 riastrad register_t *retval) 297 1.1 mrg { 298 1.14 dsl /* { 299 1.1 mrg syscallarg(int) flag; 300 1.14 dsl } */ 301 1.1 mrg struct sys_semconfig_args ua; 302 1.1 mrg 303 1.1 mrg NETBSD32TO64_UAP(flag); 304 1.20 simonb return sys_semconfig(l, &ua, retval); 305 1.1 mrg } 306 1.1 mrg #endif /* SYSVSEM */ 307 1.1 mrg 308 1.1 mrg #if defined(SYSVMSG) 309 1.1 mrg 310 1.1 mrg int 311 1.16 christos netbsd32___msgctl50(struct lwp *l, const struct netbsd32___msgctl50_args *uap, 312 1.16 christos register_t *retval) 313 1.1 mrg { 314 1.14 dsl /* { 315 1.1 mrg syscallarg(int) msqid; 316 1.1 mrg syscallarg(int) cmd; 317 1.1 mrg syscallarg(netbsd32_msqid_dsp_t) buf; 318 1.14 dsl } */ 319 1.1 mrg struct msqid_ds ds; 320 1.8 cube struct netbsd32_msqid_ds ds32; 321 1.8 cube int error, cmd; 322 1.8 cube 323 1.8 cube cmd = SCARG(uap, cmd); 324 1.8 cube if (cmd == IPC_SET) { 325 1.11 dsl error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32)); 326 1.8 cube if (error) 327 1.8 cube return error; 328 1.8 cube netbsd32_to_msqid_ds(&ds32, &ds); 329 1.8 cube } 330 1.8 cube 331 1.9 ad error = msgctl1(l, SCARG(uap, msqid), cmd, 332 1.8 cube (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL); 333 1.8 cube 334 1.8 cube if (error == 0 && cmd == IPC_STAT) { 335 1.8 cube netbsd32_from_msqid_ds(&ds, &ds32); 336 1.11 dsl error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32)); 337 1.8 cube } 338 1.1 mrg 339 1.8 cube return error; 340 1.1 mrg } 341 1.1 mrg 342 1.1 mrg int 343 1.22 riastrad netbsd32_msgget(struct lwp *l, const struct netbsd32_msgget_args *uap, 344 1.22 riastrad register_t *retval) 345 1.1 mrg { 346 1.14 dsl /* { 347 1.1 mrg syscallarg(netbsd32_key_t) key; 348 1.1 mrg syscallarg(int) msgflg; 349 1.14 dsl } */ 350 1.1 mrg struct sys_msgget_args ua; 351 1.1 mrg 352 1.1 mrg NETBSD32TOX_UAP(key, key_t); 353 1.1 mrg NETBSD32TO64_UAP(msgflg); 354 1.8 cube return sys_msgget(l, &ua, retval); 355 1.8 cube } 356 1.8 cube 357 1.8 cube static int 358 1.8 cube netbsd32_msgsnd_fetch_type(const void *src, void *dst, size_t size) 359 1.8 cube { 360 1.8 cube netbsd32_long l32; 361 1.8 cube long *l = dst; 362 1.8 cube int error; 363 1.8 cube 364 1.8 cube KASSERT(size == sizeof(netbsd32_long)); 365 1.8 cube 366 1.8 cube error = copyin(src, &l32, sizeof(l32)); 367 1.8 cube if (!error) 368 1.8 cube *l = l32; 369 1.8 cube return error; 370 1.1 mrg } 371 1.1 mrg 372 1.1 mrg int 373 1.22 riastrad netbsd32_msgsnd(struct lwp *l, const struct netbsd32_msgsnd_args *uap, 374 1.22 riastrad register_t *retval) 375 1.1 mrg { 376 1.14 dsl /* { 377 1.1 mrg syscallarg(int) msqid; 378 1.1 mrg syscallarg(const netbsd32_voidp) msgp; 379 1.1 mrg syscallarg(netbsd32_size_t) msgsz; 380 1.1 mrg syscallarg(int) msgflg; 381 1.14 dsl } */ 382 1.1 mrg 383 1.9 ad return msgsnd1(l, SCARG(uap, msqid), 384 1.11 dsl SCARG_P32(uap, msgp), SCARG(uap, msgsz), 385 1.8 cube SCARG(uap, msgflg), sizeof(netbsd32_long), 386 1.8 cube netbsd32_msgsnd_fetch_type); 387 1.8 cube } 388 1.8 cube 389 1.8 cube static int 390 1.8 cube netbsd32_msgrcv_put_type(const void *src, void *dst, size_t size) 391 1.8 cube { 392 1.8 cube netbsd32_long l32; 393 1.8 cube const long *l = src; 394 1.8 cube 395 1.8 cube KASSERT(size == sizeof(netbsd32_long)); 396 1.8 cube 397 1.8 cube l32 = (netbsd32_long)(*l); 398 1.8 cube return copyout(&l32, dst, sizeof(l32)); 399 1.1 mrg } 400 1.1 mrg 401 1.1 mrg int 402 1.22 riastrad netbsd32_msgrcv(struct lwp *l, const struct netbsd32_msgrcv_args *uap, 403 1.22 riastrad register_t *retval) 404 1.1 mrg { 405 1.14 dsl /* { 406 1.1 mrg syscallarg(int) msqid; 407 1.1 mrg syscallarg(netbsd32_voidp) msgp; 408 1.1 mrg syscallarg(netbsd32_size_t) msgsz; 409 1.1 mrg syscallarg(netbsd32_long) msgtyp; 410 1.1 mrg syscallarg(int) msgflg; 411 1.14 dsl } */ 412 1.1 mrg 413 1.9 ad return msgrcv1(l, SCARG(uap, msqid), 414 1.11 dsl SCARG_P32(uap, msgp), SCARG(uap, msgsz), 415 1.8 cube SCARG(uap, msgtyp), SCARG(uap, msgflg), sizeof(netbsd32_long), 416 1.8 cube netbsd32_msgrcv_put_type, retval); 417 1.1 mrg } 418 1.1 mrg #endif /* SYSVMSG */ 419 1.1 mrg 420 1.1 mrg #if defined(SYSVSHM) 421 1.1 mrg 422 1.1 mrg int 423 1.22 riastrad netbsd32_shmat(struct lwp *l, const struct netbsd32_shmat_args *uap, 424 1.22 riastrad register_t *retval) 425 1.1 mrg { 426 1.14 dsl /* { 427 1.1 mrg syscallarg(int) shmid; 428 1.1 mrg syscallarg(const netbsd32_voidp) shmaddr; 429 1.1 mrg syscallarg(int) shmflg; 430 1.14 dsl } */ 431 1.1 mrg struct sys_shmat_args ua; 432 1.1 mrg 433 1.1 mrg NETBSD32TO64_UAP(shmid); 434 1.1 mrg NETBSD32TOP_UAP(shmaddr, void); 435 1.1 mrg NETBSD32TO64_UAP(shmflg); 436 1.8 cube return sys_shmat(l, &ua, retval); 437 1.1 mrg } 438 1.1 mrg 439 1.1 mrg int 440 1.16 christos netbsd32___shmctl50(struct lwp *l, const struct netbsd32___shmctl50_args *uap, 441 1.16 christos register_t *retval) 442 1.1 mrg { 443 1.14 dsl /* { 444 1.1 mrg syscallarg(int) shmid; 445 1.1 mrg syscallarg(int) cmd; 446 1.1 mrg syscallarg(netbsd32_shmid_dsp_t) buf; 447 1.14 dsl } */ 448 1.1 mrg struct shmid_ds ds; 449 1.8 cube struct netbsd32_shmid_ds ds32; 450 1.8 cube int error, cmd; 451 1.8 cube 452 1.8 cube cmd = SCARG(uap, cmd); 453 1.8 cube if (cmd == IPC_SET) { 454 1.11 dsl error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32)); 455 1.8 cube if (error) 456 1.8 cube return error; 457 1.8 cube netbsd32_to_shmid_ds(&ds32, &ds); 458 1.8 cube } 459 1.8 cube 460 1.9 ad error = shmctl1(l, SCARG(uap, shmid), cmd, 461 1.8 cube (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL); 462 1.8 cube 463 1.8 cube if (error == 0 && cmd == IPC_STAT) { 464 1.8 cube netbsd32_from_shmid_ds(&ds, &ds32); 465 1.11 dsl error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32)); 466 1.8 cube } 467 1.1 mrg 468 1.8 cube return error; 469 1.1 mrg } 470 1.1 mrg 471 1.1 mrg int 472 1.22 riastrad netbsd32_shmdt(struct lwp *l, const struct netbsd32_shmdt_args *uap, 473 1.22 riastrad register_t *retval) 474 1.1 mrg { 475 1.14 dsl /* { 476 1.1 mrg syscallarg(const netbsd32_voidp) shmaddr; 477 1.14 dsl } */ 478 1.1 mrg struct sys_shmdt_args ua; 479 1.1 mrg 480 1.1 mrg NETBSD32TOP_UAP(shmaddr, const char); 481 1.20 simonb return sys_shmdt(l, &ua, retval); 482 1.1 mrg } 483 1.1 mrg 484 1.1 mrg int 485 1.22 riastrad netbsd32_shmget(struct lwp *l, const struct netbsd32_shmget_args *uap, 486 1.22 riastrad register_t *retval) 487 1.1 mrg { 488 1.14 dsl /* { 489 1.1 mrg syscallarg(netbsd32_key_t) key; 490 1.1 mrg syscallarg(netbsd32_size_t) size; 491 1.1 mrg syscallarg(int) shmflg; 492 1.14 dsl } */ 493 1.1 mrg struct sys_shmget_args ua; 494 1.1 mrg 495 1.17 njoly NETBSD32TOX_UAP(key, key_t); 496 1.17 njoly NETBSD32TOX_UAP(size, size_t); 497 1.1 mrg NETBSD32TO64_UAP(shmflg); 498 1.20 simonb return sys_shmget(l, &ua, retval); 499 1.1 mrg } 500 1.1 mrg #endif /* SYSVSHM */ 501