1 1.12 mrg /* $NetBSD: linux32_ipccall.c,v 1.12 2019/02/21 03:37:18 mrg Exp $ */ 2 1.1 njoly 3 1.1 njoly /* 4 1.1 njoly * Copyright (c) 2008 Nicolas Joly 5 1.1 njoly * All rights reserved. 6 1.1 njoly * 7 1.1 njoly * Redistribution and use in source and binary forms, with or without 8 1.1 njoly * modification, are permitted provided that the following conditions 9 1.1 njoly * are met: 10 1.1 njoly * 1. Redistributions of source code must retain the above copyright 11 1.1 njoly * notice, this list of conditions and the following disclaimer. 12 1.1 njoly * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 njoly * notice, this list of conditions and the following disclaimer in the 14 1.1 njoly * documentation and/or other materials provided with the distribution. 15 1.1 njoly * 16 1.1 njoly * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS 17 1.1 njoly * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 njoly * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 njoly * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 njoly * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 njoly * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 njoly * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 njoly * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 njoly * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 njoly * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 njoly * POSSIBILITY OF SUCH DAMAGE. 27 1.1 njoly */ 28 1.1 njoly 29 1.1 njoly #include <sys/cdefs.h> 30 1.12 mrg __KERNEL_RCSID(0, "$NetBSD: linux32_ipccall.c,v 1.12 2019/02/21 03:37:18 mrg Exp $"); 31 1.1 njoly 32 1.1 njoly #if defined(_KERNEL_OPT) 33 1.1 njoly #include "opt_sysv.h" 34 1.1 njoly #endif 35 1.1 njoly 36 1.1 njoly #include <sys/param.h> 37 1.1 njoly #include <sys/vnode.h> 38 1.5 joerg #include <sys/msg.h> 39 1.1 njoly #include <sys/sem.h> 40 1.1 njoly #include <sys/shm.h> 41 1.1 njoly 42 1.1 njoly #include <sys/syscallargs.h> 43 1.1 njoly 44 1.1 njoly #include <compat/netbsd32/netbsd32.h> 45 1.8 njoly #include <compat/netbsd32/netbsd32_syscallargs.h> 46 1.1 njoly 47 1.5 joerg #include <compat/linux/common/linux_types.h> 48 1.1 njoly #include <compat/linux32/common/linux32_types.h> 49 1.1 njoly #include <compat/linux32/common/linux32_signal.h> 50 1.1 njoly #include <compat/linux32/linux32_syscallargs.h> 51 1.1 njoly #include <compat/linux32/common/linux32_ipc.h> 52 1.1 njoly #include <compat/linux32/common/linux32_sem.h> 53 1.1 njoly #include <compat/linux32/common/linux32_shm.h> 54 1.1 njoly 55 1.1 njoly #define LINUX32_IPC_semop 1 56 1.1 njoly #define LINUX32_IPC_semget 2 57 1.1 njoly #define LINUX32_IPC_semctl 3 58 1.1 njoly #define LINUX32_IPC_msgsnd 11 59 1.1 njoly #define LINUX32_IPC_msgrcv 12 60 1.1 njoly #define LINUX32_IPC_msgget 13 61 1.1 njoly #define LINUX32_IPC_msgctl 14 62 1.1 njoly #define LINUX32_IPC_shmat 21 63 1.1 njoly #define LINUX32_IPC_shmdt 22 64 1.1 njoly #define LINUX32_IPC_shmget 23 65 1.1 njoly #define LINUX32_IPC_shmctl 24 66 1.1 njoly 67 1.1 njoly #ifdef SYSVSEM 68 1.1 njoly static void 69 1.1 njoly bsd_to_linux32_semid_ds(struct semid_ds *, struct linux32_semid_ds *); 70 1.1 njoly static void 71 1.1 njoly bsd_to_linux32_semid64_ds(struct semid_ds *, struct linux32_semid64_ds *); 72 1.1 njoly static void 73 1.1 njoly linux32_to_bsd_semid_ds(struct linux32_semid_ds *, struct semid_ds *); 74 1.1 njoly static void 75 1.1 njoly linux32_to_bsd_semid64_ds(struct linux32_semid64_ds *, struct semid_ds *); 76 1.1 njoly 77 1.1 njoly static int 78 1.1 njoly linux32_semop(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 79 1.1 njoly static int 80 1.1 njoly linux32_semget(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 81 1.1 njoly static int 82 1.1 njoly linux32_semctl(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 83 1.1 njoly #endif /* SYSVSEM */ 84 1.1 njoly 85 1.1 njoly #ifdef SYSVSHM 86 1.1 njoly static void 87 1.1 njoly bsd_to_linux32_shmid_ds(struct shmid_ds *, struct linux32_shmid_ds *); 88 1.1 njoly static void 89 1.1 njoly linux32_to_bsd_shmid_ds(struct linux32_shmid_ds *, struct shmid_ds *); 90 1.1 njoly static void 91 1.1 njoly bsd_to_linux32_shmid64_ds(struct shmid_ds *, struct linux32_shmid64_ds *); 92 1.1 njoly static void 93 1.1 njoly linux32_to_bsd_shmid64_ds(struct linux32_shmid64_ds *, struct shmid_ds *); 94 1.1 njoly 95 1.1 njoly static int 96 1.1 njoly linux32_shmat(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 97 1.1 njoly static int 98 1.1 njoly linux32_shmdt(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 99 1.1 njoly static int 100 1.1 njoly linux32_shmget(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 101 1.1 njoly static int 102 1.1 njoly linux32_shmctl(struct lwp *, const struct linux32_sys_ipc_args *, register_t *); 103 1.1 njoly #endif /* SYSVSHM */ 104 1.1 njoly 105 1.5 joerg #ifdef SYSVMSG 106 1.5 joerg static int linux32_msgsnd(struct lwp *, const struct linux32_sys_ipc_args *, 107 1.5 joerg register_t *); 108 1.5 joerg static int linux32_msgrcv(struct lwp *, const struct linux32_sys_ipc_args *, 109 1.5 joerg register_t *); 110 1.5 joerg static int linux32_msgget(struct lwp *, const struct linux32_sys_ipc_args *, 111 1.5 joerg register_t *); 112 1.5 joerg static int linux32_msgctl(struct lwp *, const struct linux32_sys_ipc_args *, 113 1.5 joerg register_t *); 114 1.5 joerg #endif 115 1.5 joerg 116 1.1 njoly int 117 1.1 njoly linux32_sys_ipc(struct lwp *l, const struct linux32_sys_ipc_args *uap, 118 1.1 njoly register_t *retval) 119 1.1 njoly { 120 1.1 njoly /* { 121 1.1 njoly syscallarg(int) what; 122 1.1 njoly syscallarg(int) a1; 123 1.1 njoly syscallarg(int) a2; 124 1.1 njoly syscallarg(int) a3; 125 1.1 njoly syscallarg(netbsd32_voidp) ptr; 126 1.1 njoly } */ 127 1.1 njoly 128 1.1 njoly switch (SCARG(uap, what)) { 129 1.1 njoly #ifdef SYSVSEM 130 1.1 njoly case LINUX32_IPC_semop: 131 1.10 mbalmer return linux32_semop(l, uap, retval); 132 1.1 njoly case LINUX32_IPC_semget: 133 1.1 njoly return linux32_semget(l, uap, retval); 134 1.1 njoly case LINUX32_IPC_semctl: 135 1.1 njoly return linux32_semctl(l, uap, retval); 136 1.1 njoly #endif /* SYSVSEM */ 137 1.5 joerg #ifdef SYSVMSG 138 1.5 joerg case LINUX32_IPC_msgsnd: 139 1.5 joerg return linux32_msgsnd(l, uap, retval); 140 1.5 joerg case LINUX32_IPC_msgrcv: 141 1.5 joerg return linux32_msgrcv(l, uap, retval); 142 1.5 joerg case LINUX32_IPC_msgget: 143 1.5 joerg return linux32_msgget(l, uap, retval); 144 1.5 joerg case LINUX32_IPC_msgctl: 145 1.5 joerg return linux32_msgctl(l, uap, retval); 146 1.5 joerg #endif 147 1.1 njoly #ifdef SYSVSHM 148 1.1 njoly case LINUX32_IPC_shmat: 149 1.1 njoly return linux32_shmat(l, uap, retval); 150 1.1 njoly case LINUX32_IPC_shmdt: 151 1.1 njoly return linux32_shmdt(l, uap, retval); 152 1.1 njoly case LINUX32_IPC_shmget: 153 1.1 njoly return linux32_shmget(l, uap, retval); 154 1.1 njoly case LINUX32_IPC_shmctl: 155 1.1 njoly return linux32_shmctl(l, uap, retval); 156 1.1 njoly #endif /* SYSVSHM */ 157 1.1 njoly default: 158 1.1 njoly return ENOSYS; 159 1.1 njoly } 160 1.1 njoly } 161 1.1 njoly 162 1.11 dholland #if defined(SYSVSEM) || defined (SYSVMSG) || defined(SYSVSHM) 163 1.1 njoly static void 164 1.1 njoly bsd_to_linux32_ipc_perm(struct ipc_perm *bpp, struct linux32_ipc_perm *lpp) 165 1.1 njoly { 166 1.12 mrg 167 1.12 mrg memset(lpp, 0, sizeof *lpp); 168 1.1 njoly lpp->l_key = bpp->_key; 169 1.1 njoly lpp->l_uid = bpp->uid; 170 1.1 njoly lpp->l_gid = bpp->gid; 171 1.1 njoly lpp->l_cuid = bpp->cuid; 172 1.1 njoly lpp->l_cgid = bpp->cgid; 173 1.1 njoly lpp->l_mode = bpp->mode; 174 1.1 njoly lpp->l_seq = bpp->_seq; 175 1.1 njoly } 176 1.1 njoly 177 1.1 njoly static void 178 1.1 njoly linux32_to_bsd_ipc_perm(struct linux32_ipc_perm *lpp, struct ipc_perm *bpp) 179 1.1 njoly { 180 1.12 mrg 181 1.1 njoly bpp->_key = lpp->l_key; 182 1.1 njoly bpp->uid = lpp->l_uid; 183 1.1 njoly bpp->gid = lpp->l_gid; 184 1.1 njoly bpp->cuid = lpp->l_cuid; 185 1.1 njoly bpp->cgid = lpp->l_cgid; 186 1.1 njoly bpp->mode = lpp->l_mode; 187 1.1 njoly bpp->_seq = lpp->l_seq; 188 1.1 njoly } 189 1.1 njoly 190 1.1 njoly static void 191 1.1 njoly bsd_to_linux32_ipc64_perm(struct ipc_perm *bpp, struct linux32_ipc64_perm *lpp) 192 1.1 njoly { 193 1.12 mrg 194 1.12 mrg memset(lpp, 0, sizeof *lpp); 195 1.1 njoly lpp->l_key = bpp->_key; 196 1.1 njoly lpp->l_uid = bpp->uid; 197 1.1 njoly lpp->l_gid = bpp->gid; 198 1.1 njoly lpp->l_cuid = bpp->cuid; 199 1.1 njoly lpp->l_cgid = bpp->cgid; 200 1.1 njoly lpp->l_mode = bpp->mode; 201 1.1 njoly lpp->l_seq = bpp->_seq; 202 1.1 njoly } 203 1.1 njoly 204 1.1 njoly static void 205 1.1 njoly linux32_to_bsd_ipc64_perm(struct linux32_ipc64_perm *lpp, struct ipc_perm *bpp) 206 1.1 njoly { 207 1.12 mrg 208 1.1 njoly bpp->_key = lpp->l_key; 209 1.1 njoly bpp->uid = lpp->l_uid; 210 1.1 njoly bpp->gid = lpp->l_gid; 211 1.1 njoly bpp->cuid = lpp->l_cuid; 212 1.1 njoly bpp->cgid = lpp->l_cgid; 213 1.1 njoly bpp->mode = lpp->l_mode; 214 1.1 njoly bpp->_seq = lpp->l_seq; 215 1.1 njoly } 216 1.11 dholland #endif /* SYSVSEM, SYSVMSG, or SYSVSHM */ 217 1.1 njoly 218 1.1 njoly #ifdef SYSVSEM 219 1.1 njoly static void 220 1.1 njoly bsd_to_linux32_semid_ds(struct semid_ds *bsp, struct linux32_semid_ds *lsp) 221 1.1 njoly { 222 1.12 mrg 223 1.12 mrg memset(lsp, 0, sizeof *lsp); 224 1.1 njoly bsd_to_linux32_ipc_perm(&bsp->sem_perm, &lsp->l_sem_perm); 225 1.1 njoly lsp->l_sem_otime = bsp->sem_otime; 226 1.1 njoly lsp->l_sem_ctime = bsp->sem_ctime; 227 1.1 njoly lsp->l_sem_nsems = bsp->sem_nsems; 228 1.1 njoly } 229 1.1 njoly 230 1.1 njoly static void 231 1.1 njoly bsd_to_linux32_semid64_ds(struct semid_ds *bsp, struct linux32_semid64_ds *lsp) 232 1.1 njoly { 233 1.12 mrg 234 1.12 mrg memset(lsp, 0, sizeof *lsp); 235 1.1 njoly bsd_to_linux32_ipc64_perm(&bsp->sem_perm, &lsp->l_sem_perm); 236 1.1 njoly lsp->l_sem_otime = bsp->sem_otime; 237 1.1 njoly lsp->l_sem_ctime = bsp->sem_ctime; 238 1.1 njoly lsp->l_sem_nsems = bsp->sem_nsems; 239 1.1 njoly } 240 1.1 njoly 241 1.1 njoly static void 242 1.1 njoly linux32_to_bsd_semid_ds(struct linux32_semid_ds *lsp, struct semid_ds *bsp) 243 1.1 njoly { 244 1.1 njoly linux32_to_bsd_ipc_perm(&lsp->l_sem_perm, &bsp->sem_perm); 245 1.1 njoly bsp->sem_otime = lsp->l_sem_otime; 246 1.1 njoly bsp->sem_ctime = lsp->l_sem_ctime; 247 1.1 njoly bsp->sem_nsems = lsp->l_sem_nsems; 248 1.1 njoly } 249 1.1 njoly 250 1.1 njoly static void 251 1.1 njoly linux32_to_bsd_semid64_ds(struct linux32_semid64_ds *lsp, struct semid_ds *bsp) 252 1.1 njoly { 253 1.1 njoly linux32_to_bsd_ipc64_perm(&lsp->l_sem_perm, &bsp->sem_perm); 254 1.1 njoly bsp->sem_otime = lsp->l_sem_otime; 255 1.1 njoly bsp->sem_ctime = lsp->l_sem_ctime; 256 1.1 njoly bsp->sem_nsems = lsp->l_sem_nsems; 257 1.1 njoly } 258 1.1 njoly 259 1.1 njoly static int 260 1.1 njoly linux32_semop(struct lwp *l, const struct linux32_sys_ipc_args *uap, 261 1.1 njoly register_t *retval) 262 1.1 njoly { 263 1.1 njoly struct sys_semop_args ua; 264 1.1 njoly 265 1.1 njoly SCARG(&ua, semid) = SCARG(uap, a1); 266 1.1 njoly SCARG(&ua, sops) = SCARG_P32(uap, ptr); 267 1.1 njoly SCARG(&ua, nsops) = SCARG(uap, a2); 268 1.1 njoly 269 1.1 njoly return sys_semop(l, &ua, retval); 270 1.1 njoly } 271 1.1 njoly 272 1.1 njoly static int 273 1.1 njoly linux32_semget(struct lwp *l, const struct linux32_sys_ipc_args *uap, 274 1.1 njoly register_t *retval) 275 1.1 njoly { 276 1.1 njoly struct sys_semget_args ua; 277 1.1 njoly 278 1.1 njoly SCARG(&ua, key) = SCARG(uap, a1); 279 1.1 njoly SCARG(&ua, nsems) = SCARG(uap, a2); 280 1.1 njoly SCARG(&ua, semflg) = SCARG(uap, a3); 281 1.1 njoly 282 1.1 njoly return sys_semget(l, &ua, retval); 283 1.1 njoly } 284 1.1 njoly 285 1.1 njoly static int 286 1.1 njoly linux32_semctl(struct lwp *l, const struct linux32_sys_ipc_args *uap, 287 1.1 njoly register_t *retval) 288 1.1 njoly { 289 1.4 njoly int lcmd, cmd, error; 290 1.1 njoly struct semid_ds bs; 291 1.1 njoly struct linux32_semid_ds ls; 292 1.1 njoly struct linux32_semid64_ds ls64; 293 1.1 njoly union linux32_semun lsem; 294 1.1 njoly union __semun bsem; 295 1.1 njoly void *buf = NULL; 296 1.1 njoly 297 1.1 njoly if ((error = copyin(SCARG_P32(uap, ptr), &lsem, sizeof lsem))) 298 1.1 njoly return error; 299 1.1 njoly 300 1.4 njoly lcmd = SCARG(uap, a3); 301 1.4 njoly 302 1.4 njoly switch (lcmd & ~LINUX32_IPC_64) { 303 1.1 njoly case LINUX32_IPC_RMID: 304 1.1 njoly cmd = IPC_RMID; 305 1.1 njoly break; 306 1.1 njoly case LINUX32_IPC_STAT: 307 1.1 njoly cmd = IPC_STAT; 308 1.1 njoly buf = &bs; 309 1.1 njoly break; 310 1.1 njoly case LINUX32_IPC_SET: 311 1.4 njoly if (lcmd & LINUX32_IPC_64) { 312 1.4 njoly error = copyin(NETBSD32PTR64(lsem.l_buf), &ls64, 313 1.4 njoly sizeof ls64); 314 1.4 njoly linux32_to_bsd_semid64_ds(&ls64, &bs); 315 1.4 njoly } else { 316 1.4 njoly error = copyin(NETBSD32PTR64(lsem.l_buf), &ls, 317 1.4 njoly sizeof ls); 318 1.4 njoly linux32_to_bsd_semid_ds(&ls, &bs); 319 1.4 njoly } 320 1.1 njoly if (error) 321 1.1 njoly return error; 322 1.1 njoly cmd = IPC_SET; 323 1.1 njoly buf = &bs; 324 1.1 njoly break; 325 1.1 njoly case LINUX32_GETVAL: 326 1.1 njoly cmd = GETVAL; 327 1.1 njoly break; 328 1.1 njoly case LINUX32_SETVAL: 329 1.1 njoly cmd = SETVAL; 330 1.1 njoly bsem.val = lsem.l_val; 331 1.1 njoly buf = &bsem; 332 1.1 njoly break; 333 1.1 njoly case LINUX32_GETPID: 334 1.1 njoly cmd = GETPID; 335 1.1 njoly break; 336 1.1 njoly case LINUX32_GETNCNT: 337 1.1 njoly cmd = GETNCNT; 338 1.1 njoly break; 339 1.1 njoly case LINUX32_GETZCNT: 340 1.1 njoly cmd = GETZCNT; 341 1.1 njoly break; 342 1.1 njoly case LINUX32_GETALL: 343 1.1 njoly cmd = GETALL; 344 1.1 njoly bsem.array = NETBSD32PTR64(lsem.l_array); 345 1.1 njoly buf = &bsem; 346 1.1 njoly break; 347 1.1 njoly case LINUX32_SETALL: 348 1.1 njoly cmd = SETALL; 349 1.1 njoly bsem.array = NETBSD32PTR64(lsem.l_array); 350 1.1 njoly buf = &bsem; 351 1.1 njoly break; 352 1.1 njoly default: 353 1.1 njoly return EINVAL; 354 1.1 njoly } 355 1.1 njoly 356 1.1 njoly error = semctl1(l, SCARG(uap, a1), SCARG(uap, a2), cmd, buf, retval); 357 1.1 njoly if (error) 358 1.1 njoly return error; 359 1.1 njoly 360 1.4 njoly switch (lcmd) { 361 1.1 njoly case LINUX32_IPC_STAT: 362 1.1 njoly bsd_to_linux32_semid_ds(&bs, &ls); 363 1.1 njoly error = copyout(&ls, NETBSD32PTR64(lsem.l_buf), sizeof ls); 364 1.1 njoly break; 365 1.1 njoly case LINUX32_IPC_STAT|LINUX32_IPC_64: 366 1.1 njoly bsd_to_linux32_semid64_ds(&bs, &ls64); 367 1.1 njoly error = copyout(&ls64, NETBSD32PTR64(lsem.l_buf), sizeof ls64); 368 1.1 njoly break; 369 1.1 njoly default: 370 1.1 njoly break; 371 1.1 njoly } 372 1.1 njoly 373 1.1 njoly return error; 374 1.1 njoly } 375 1.1 njoly #endif /* SYSVSEM */ 376 1.1 njoly 377 1.5 joerg #ifdef SYSVMSG 378 1.5 joerg 379 1.5 joerg static int 380 1.5 joerg linux32_msgsnd(struct lwp *l, const struct linux32_sys_ipc_args *uap, register_t *retval) 381 1.5 joerg { 382 1.8 njoly struct netbsd32_msgsnd_args bma; 383 1.5 joerg 384 1.5 joerg SCARG(&bma, msqid) = SCARG(uap, a1); 385 1.8 njoly SCARG(&bma, msgp) = SCARG(uap, ptr); 386 1.5 joerg SCARG(&bma, msgsz) = SCARG(uap, a2); 387 1.5 joerg SCARG(&bma, msgflg) = SCARG(uap, a3); 388 1.5 joerg 389 1.8 njoly return netbsd32_msgsnd(l, &bma, retval); 390 1.5 joerg } 391 1.5 joerg 392 1.5 joerg /* 393 1.5 joerg * This kludge is used for the 6th argument to the msgrcv system 394 1.5 joerg * call, to get around the maximum of 5 arguments to a syscall in Linux. 395 1.5 joerg */ 396 1.5 joerg struct linux32_msgrcv_msgarg { 397 1.5 joerg netbsd32_pointer_t msg; 398 1.9 njoly netbsd32_long type; 399 1.5 joerg }; 400 1.5 joerg 401 1.5 joerg static int 402 1.5 joerg linux32_msgrcv(struct lwp *l, const struct linux32_sys_ipc_args *uap, register_t *retval) 403 1.5 joerg { 404 1.8 njoly struct netbsd32_msgrcv_args bma; 405 1.5 joerg struct linux32_msgrcv_msgarg kluge; 406 1.5 joerg int error; 407 1.5 joerg 408 1.5 joerg if ((error = copyin(SCARG_P32(uap, ptr), &kluge, sizeof kluge))) 409 1.5 joerg return error; 410 1.5 joerg 411 1.5 joerg SCARG(&bma, msqid) = SCARG(uap, a1); 412 1.8 njoly SCARG(&bma, msgp) = kluge.msg; 413 1.5 joerg SCARG(&bma, msgsz) = SCARG(uap, a2); 414 1.5 joerg SCARG(&bma, msgtyp) = kluge.type; 415 1.5 joerg SCARG(&bma, msgflg) = SCARG(uap, a3); 416 1.5 joerg 417 1.8 njoly return netbsd32_msgrcv(l, &bma, retval); 418 1.5 joerg } 419 1.5 joerg 420 1.5 joerg static int 421 1.5 joerg linux32_msgget(struct lwp *l, const struct linux32_sys_ipc_args *uap, register_t *retval) 422 1.5 joerg { 423 1.5 joerg struct sys_msgget_args bma; 424 1.5 joerg 425 1.5 joerg SCARG(&bma, key) = (key_t)(linux32_key_t)SCARG(uap, a1); 426 1.5 joerg SCARG(&bma, msgflg) = SCARG(uap, a2); 427 1.5 joerg 428 1.5 joerg return sys_msgget(l, &bma, retval); 429 1.5 joerg } 430 1.5 joerg 431 1.5 joerg 432 1.5 joerg static void 433 1.5 joerg linux32_to_bsd_msqid_ds(struct linux32_msqid_ds *lmp, struct msqid_ds *bmp) 434 1.5 joerg { 435 1.5 joerg 436 1.5 joerg memset(bmp, 0, sizeof(*bmp)); 437 1.5 joerg linux32_to_bsd_ipc_perm(&lmp->l_msg_perm, &bmp->msg_perm); 438 1.5 joerg bmp->_msg_cbytes = lmp->l_msg_cbytes; 439 1.5 joerg bmp->msg_qnum = lmp->l_msg_qnum; 440 1.5 joerg bmp->msg_qbytes = lmp->l_msg_qbytes; 441 1.5 joerg bmp->msg_lspid = lmp->l_msg_lspid; 442 1.5 joerg bmp->msg_lrpid = lmp->l_msg_lrpid; 443 1.5 joerg bmp->msg_stime = lmp->l_msg_stime; 444 1.5 joerg bmp->msg_rtime = lmp->l_msg_rtime; 445 1.5 joerg bmp->msg_ctime = lmp->l_msg_ctime; 446 1.5 joerg } 447 1.5 joerg 448 1.6 joerg static void 449 1.5 joerg linux32_to_bsd_msqid64_ds(struct linux32_msqid64_ds *lmp, struct msqid_ds *bmp) 450 1.5 joerg { 451 1.5 joerg 452 1.6 joerg linux32_to_bsd_ipc64_perm(&lmp->l_msg_perm, &bmp->msg_perm); 453 1.12 mrg bmp->_msg_cbytes = lmp->l_msg_cbytes; 454 1.5 joerg bmp->msg_stime = lmp->l_msg_stime; 455 1.5 joerg bmp->msg_rtime = lmp->l_msg_rtime; 456 1.5 joerg bmp->msg_ctime = lmp->l_msg_ctime; 457 1.5 joerg bmp->msg_qnum = lmp->l_msg_qnum; 458 1.5 joerg bmp->msg_qbytes = lmp->l_msg_qbytes; 459 1.5 joerg bmp->msg_lspid = lmp->l_msg_lspid; 460 1.5 joerg bmp->msg_lrpid = lmp->l_msg_lrpid; 461 1.5 joerg } 462 1.5 joerg 463 1.5 joerg static void 464 1.5 joerg bsd_to_linux32_msqid_ds(struct msqid_ds *bmp, struct linux32_msqid_ds *lmp) 465 1.5 joerg { 466 1.5 joerg 467 1.5 joerg memset(lmp, 0, sizeof(*lmp)); 468 1.5 joerg bsd_to_linux32_ipc_perm(&bmp->msg_perm, &lmp->l_msg_perm); 469 1.5 joerg lmp->l_msg_cbytes = bmp->_msg_cbytes; 470 1.5 joerg lmp->l_msg_qnum = bmp->msg_qnum; 471 1.5 joerg lmp->l_msg_qbytes = bmp->msg_qbytes; 472 1.5 joerg lmp->l_msg_lspid = bmp->msg_lspid; 473 1.5 joerg lmp->l_msg_lrpid = bmp->msg_lrpid; 474 1.5 joerg lmp->l_msg_stime = bmp->msg_stime; 475 1.5 joerg lmp->l_msg_rtime = bmp->msg_rtime; 476 1.5 joerg lmp->l_msg_ctime = bmp->msg_ctime; 477 1.5 joerg } 478 1.5 joerg 479 1.6 joerg static void 480 1.5 joerg bsd_to_linux32_msqid64_ds(struct msqid_ds *bmp, struct linux32_msqid64_ds *lmp) 481 1.5 joerg { 482 1.5 joerg 483 1.5 joerg memset(lmp, 0, sizeof(*lmp)); 484 1.6 joerg bsd_to_linux32_ipc64_perm(&bmp->msg_perm, &lmp->l_msg_perm); 485 1.12 mrg lmp->l_msg_cbytes = bmp->_msg_cbytes; 486 1.6 joerg lmp->l_msg_stime = bmp->msg_stime; 487 1.6 joerg lmp->l_msg_rtime = bmp->msg_rtime; 488 1.5 joerg lmp->l_msg_ctime = bmp->msg_ctime; 489 1.5 joerg lmp->l_msg_qnum = bmp->msg_qnum; 490 1.5 joerg lmp->l_msg_qbytes = bmp->msg_qbytes; 491 1.5 joerg lmp->l_msg_lspid = bmp->msg_lspid; 492 1.5 joerg lmp->l_msg_lrpid = bmp->msg_lrpid; 493 1.5 joerg } 494 1.5 joerg 495 1.5 joerg static int 496 1.5 joerg linux32_msgctl(struct lwp *l, const struct linux32_sys_ipc_args *uap, register_t *retval) 497 1.5 joerg { 498 1.5 joerg struct msqid_ds bm, *bmp = NULL; 499 1.5 joerg struct linux32_msqid_ds lm; 500 1.5 joerg struct linux32_msqid64_ds lm64; 501 1.5 joerg int cmd, lcmd, error; 502 1.5 joerg void *data = SCARG_P32(uap, ptr); 503 1.5 joerg 504 1.5 joerg lcmd = SCARG(uap, a2); 505 1.5 joerg 506 1.5 joerg switch (lcmd & ~LINUX32_IPC_64) { 507 1.5 joerg case LINUX32_IPC_STAT: 508 1.5 joerg cmd = IPC_STAT; 509 1.5 joerg bmp = &bm; 510 1.5 joerg break; 511 1.5 joerg case LINUX32_IPC_SET: 512 1.5 joerg if (lcmd & LINUX32_IPC_64) { 513 1.5 joerg error = copyin(data, &lm64, sizeof lm64); 514 1.5 joerg linux32_to_bsd_msqid64_ds(&lm64, &bm); 515 1.5 joerg } else { 516 1.5 joerg error = copyin(data, &lm, sizeof lm); 517 1.5 joerg linux32_to_bsd_msqid_ds(&lm, &bm); 518 1.5 joerg } 519 1.5 joerg if (error) 520 1.5 joerg return error; 521 1.5 joerg cmd = IPC_SET; 522 1.5 joerg bmp = &bm; 523 1.5 joerg break; 524 1.5 joerg case LINUX32_IPC_RMID: 525 1.5 joerg cmd = IPC_RMID; 526 1.5 joerg break; 527 1.5 joerg default: 528 1.5 joerg return EINVAL; 529 1.5 joerg } 530 1.5 joerg 531 1.5 joerg if ((error = msgctl1(l, SCARG(uap, a1), cmd, bmp))) 532 1.5 joerg return error; 533 1.5 joerg 534 1.5 joerg switch (lcmd) { 535 1.5 joerg case LINUX32_IPC_STAT: 536 1.5 joerg bsd_to_linux32_msqid_ds(&bm, &lm); 537 1.5 joerg error = copyout(&lm, data, sizeof lm); 538 1.5 joerg break; 539 1.5 joerg case LINUX32_IPC_STAT|LINUX32_IPC_64: 540 1.5 joerg bsd_to_linux32_msqid64_ds(&bm, &lm64); 541 1.5 joerg error = copyout(&lm64, data, sizeof lm64); 542 1.5 joerg break; 543 1.5 joerg default: 544 1.5 joerg break; 545 1.5 joerg } 546 1.5 joerg 547 1.5 joerg return error; 548 1.5 joerg } 549 1.5 joerg #endif /* SYSVMSG */ 550 1.5 joerg 551 1.1 njoly #ifdef SYSVSHM 552 1.1 njoly static void 553 1.1 njoly bsd_to_linux32_shmid_ds(struct shmid_ds *bsp, struct linux32_shmid_ds *lsp) 554 1.1 njoly { 555 1.12 mrg 556 1.12 mrg memset(lsp, 0, sizeof *lsp); 557 1.1 njoly bsd_to_linux32_ipc_perm(&bsp->shm_perm, &lsp->l_shm_perm); 558 1.1 njoly lsp->l_shm_segsz = bsp->shm_segsz; 559 1.1 njoly lsp->l_shm_atime = bsp->shm_atime; 560 1.1 njoly lsp->l_shm_dtime = bsp->shm_dtime; 561 1.1 njoly lsp->l_shm_ctime = bsp->shm_ctime; 562 1.1 njoly lsp->l_shm_cpid = bsp->shm_cpid; 563 1.1 njoly lsp->l_shm_lpid = bsp->shm_lpid; 564 1.1 njoly lsp->l_shm_nattch = bsp->shm_nattch; 565 1.1 njoly } 566 1.1 njoly 567 1.1 njoly static void 568 1.1 njoly linux32_to_bsd_shmid_ds(struct linux32_shmid_ds *lsp, struct shmid_ds *bsp) 569 1.1 njoly { 570 1.12 mrg 571 1.1 njoly linux32_to_bsd_ipc_perm(&lsp->l_shm_perm, &bsp->shm_perm); 572 1.1 njoly bsp->shm_segsz = lsp->l_shm_segsz; 573 1.1 njoly bsp->shm_atime = lsp->l_shm_atime; 574 1.1 njoly bsp->shm_dtime = lsp->l_shm_dtime; 575 1.1 njoly bsp->shm_ctime = lsp->l_shm_ctime; 576 1.1 njoly bsp->shm_cpid = lsp->l_shm_cpid; 577 1.1 njoly bsp->shm_lpid = lsp->l_shm_lpid; 578 1.1 njoly bsp->shm_nattch = lsp->l_shm_nattch; 579 1.1 njoly } 580 1.1 njoly 581 1.1 njoly static void 582 1.1 njoly bsd_to_linux32_shmid64_ds(struct shmid_ds *bsp, struct linux32_shmid64_ds *lsp) 583 1.1 njoly { 584 1.12 mrg 585 1.12 mrg memset(lsp, 0, sizeof *lsp); 586 1.1 njoly bsd_to_linux32_ipc64_perm(&bsp->shm_perm, &lsp->l_shm_perm); 587 1.1 njoly lsp->l_shm_segsz = bsp->shm_segsz; 588 1.1 njoly lsp->l_shm_atime = bsp->shm_atime; 589 1.1 njoly lsp->l_shm_dtime = bsp->shm_dtime; 590 1.1 njoly lsp->l_shm_ctime = bsp->shm_ctime; 591 1.1 njoly lsp->l_shm_cpid = bsp->shm_cpid; 592 1.1 njoly lsp->l_shm_lpid = bsp->shm_lpid; 593 1.1 njoly lsp->l_shm_nattch = bsp->shm_nattch; 594 1.1 njoly } 595 1.1 njoly 596 1.1 njoly static void 597 1.1 njoly linux32_to_bsd_shmid64_ds(struct linux32_shmid64_ds *lsp, struct shmid_ds *bsp) 598 1.1 njoly { 599 1.12 mrg 600 1.1 njoly linux32_to_bsd_ipc64_perm(&lsp->l_shm_perm, &bsp->shm_perm); 601 1.1 njoly bsp->shm_segsz = lsp->l_shm_segsz; 602 1.1 njoly bsp->shm_atime = lsp->l_shm_atime; 603 1.1 njoly bsp->shm_dtime = lsp->l_shm_dtime; 604 1.1 njoly bsp->shm_ctime = lsp->l_shm_ctime; 605 1.1 njoly bsp->shm_cpid = lsp->l_shm_cpid; 606 1.1 njoly bsp->shm_lpid = lsp->l_shm_lpid; 607 1.1 njoly bsp->shm_nattch = lsp->l_shm_nattch; 608 1.1 njoly } 609 1.1 njoly 610 1.1 njoly static int 611 1.1 njoly linux32_shmat(struct lwp *l, const struct linux32_sys_ipc_args *uap, 612 1.1 njoly register_t *retval) 613 1.1 njoly { 614 1.1 njoly struct sys_shmat_args ua; 615 1.2 scw netbsd32_pointer_t addr32; 616 1.1 njoly int error; 617 1.1 njoly 618 1.1 njoly SCARG(&ua, shmid) = SCARG(uap, a1); 619 1.1 njoly SCARG(&ua, shmaddr) = SCARG_P32(uap, ptr); 620 1.1 njoly SCARG(&ua, shmflg) = SCARG(uap, a2); 621 1.1 njoly 622 1.1 njoly if ((error = sys_shmat(l, &ua, retval))) 623 1.1 njoly return error; 624 1.1 njoly 625 1.2 scw NETBSD32PTR32(addr32, (const void *)(uintptr_t)retval[0]); 626 1.2 scw 627 1.2 scw error = copyout(&addr32, NETBSD32IPTR64(SCARG(uap, a3)), sizeof addr32); 628 1.2 scw if (error == 0) 629 1.2 scw retval[0] = 0; 630 1.1 njoly 631 1.2 scw return error; 632 1.1 njoly } 633 1.1 njoly 634 1.1 njoly static int 635 1.1 njoly linux32_shmdt(struct lwp *l, const struct linux32_sys_ipc_args *uap, 636 1.1 njoly register_t *retval) 637 1.1 njoly { 638 1.1 njoly struct sys_shmdt_args ua; 639 1.1 njoly 640 1.1 njoly SCARG(&ua, shmaddr) = SCARG_P32(uap, ptr); 641 1.1 njoly 642 1.1 njoly return sys_shmdt(l, &ua, retval); 643 1.1 njoly } 644 1.1 njoly 645 1.1 njoly static int 646 1.1 njoly linux32_shmget(struct lwp *l, const struct linux32_sys_ipc_args *uap, 647 1.1 njoly register_t *retval) 648 1.1 njoly { 649 1.1 njoly struct sys_shmget_args ua; 650 1.1 njoly 651 1.1 njoly SCARG(&ua, key) = SCARG(uap, a1); 652 1.1 njoly SCARG(&ua, size) = SCARG(uap, a2); 653 1.1 njoly SCARG(&ua, shmflg) = SCARG(uap, a3) | _SHM_RMLINGER; 654 1.1 njoly 655 1.1 njoly return sys_shmget(l, &ua, retval); 656 1.1 njoly } 657 1.1 njoly 658 1.1 njoly static int 659 1.1 njoly linux32_shmctl(struct lwp *l, const struct linux32_sys_ipc_args *uap, 660 1.1 njoly register_t *retval) 661 1.1 njoly { 662 1.1 njoly int shmid, cmd, error; 663 1.3 njoly struct shmid_ds bs; 664 1.1 njoly struct linux32_shmid_ds ls; 665 1.1 njoly struct linux32_shmid64_ds ls64; 666 1.1 njoly 667 1.1 njoly shmid = SCARG(uap, a1); 668 1.3 njoly cmd = SCARG(uap, a2); 669 1.3 njoly 670 1.3 njoly switch (cmd & ~LINUX32_IPC_64) { 671 1.1 njoly 672 1.1 njoly case LINUX32_SHM_STAT: 673 1.1 njoly return ENOSYS; 674 1.3 njoly 675 1.1 njoly case LINUX32_IPC_STAT: 676 1.3 njoly error = shmctl1(l, shmid, IPC_STAT, &bs); 677 1.3 njoly if (error != 0) 678 1.3 njoly return error; 679 1.3 njoly if (cmd & LINUX32_IPC_64) { 680 1.3 njoly bsd_to_linux32_shmid64_ds(&bs, &ls64); 681 1.3 njoly error = copyout(&ls64, SCARG_P32(uap, ptr), sizeof ls64); 682 1.3 njoly } else { 683 1.3 njoly bsd_to_linux32_shmid_ds(&bs, &ls); 684 1.3 njoly error = copyout(&ls, SCARG_P32(uap, ptr), sizeof ls); 685 1.3 njoly } 686 1.3 njoly return error; 687 1.3 njoly 688 1.1 njoly case LINUX32_IPC_SET: 689 1.3 njoly if (cmd & LINUX32_IPC_64) { 690 1.3 njoly error = copyin(SCARG_P32(uap, ptr), &ls64, sizeof ls64); 691 1.3 njoly linux32_to_bsd_shmid64_ds(&ls64, &bs); 692 1.3 njoly } else { 693 1.3 njoly error = copyin(SCARG_P32(uap, ptr), &ls, sizeof ls); 694 1.3 njoly linux32_to_bsd_shmid_ds(&ls, &bs); 695 1.3 njoly } 696 1.3 njoly if (error != 0) 697 1.1 njoly return error; 698 1.3 njoly return shmctl1(l, shmid, IPC_SET, &bs); 699 1.3 njoly 700 1.3 njoly case LINUX32_IPC_RMID: 701 1.3 njoly return shmctl1(l, shmid, IPC_RMID, NULL); 702 1.3 njoly 703 1.1 njoly case LINUX32_SHM_LOCK: 704 1.3 njoly return shmctl1(l, shmid, SHM_LOCK, NULL); 705 1.3 njoly 706 1.1 njoly case LINUX32_SHM_UNLOCK: 707 1.3 njoly return shmctl1(l, shmid, SHM_UNLOCK, NULL); 708 1.3 njoly 709 1.1 njoly case LINUX32_IPC_INFO: 710 1.1 njoly case LINUX32_SHM_INFO: 711 1.1 njoly return ENOSYS; 712 1.3 njoly 713 1.1 njoly default: 714 1.1 njoly return EINVAL; 715 1.1 njoly } 716 1.1 njoly } 717 1.1 njoly #endif /* SYSVSHM */ 718