1 /* $NetBSD: linux32_ipccall.c,v 1.9 2009/11/18 15:19:24 njoly Exp $ */
4 * Copyright (c) 2008 Nicolas Joly
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: linux32_ipccall.c,v 1.9 2009/11/18 15:19:24 njoly Exp $");
32 #if defined(_KERNEL_OPT)
36 #include <sys/param.h>
37 #include <sys/vnode.h>
42 #include <sys/syscallargs.h>
44 #include <compat/netbsd32/netbsd32.h>
45 #include <compat/netbsd32/netbsd32_syscallargs.h>
47 #include <compat/linux/common/linux_types.h>
48 #include <compat/linux32/common/linux32_types.h>
49 #include <compat/linux32/common/linux32_signal.h>
50 #include <compat/linux32/linux32_syscallargs.h>
51 #include <compat/linux32/common/linux32_ipc.h>
52 #include <compat/linux32/common/linux32_sem.h>
53 #include <compat/linux32/common/linux32_shm.h>
55 #define LINUX32_IPC_semop 1
56 #define LINUX32_IPC_semget 2
57 #define LINUX32_IPC_semctl 3
58 #define LINUX32_IPC_msgsnd 11
59 #define LINUX32_IPC_msgrcv 12
60 #define LINUX32_IPC_msgget 13
61 #define LINUX32_IPC_msgctl 14
62 #define LINUX32_IPC_shmat 21
63 #define LINUX32_IPC_shmdt 22
64 #define LINUX32_IPC_shmget 23
65 #define LINUX32_IPC_shmctl 24
69 bsd_to_linux32_semid_ds(struct semid_ds
*, struct linux32_semid_ds
*);
71 bsd_to_linux32_semid64_ds(struct semid_ds
*, struct linux32_semid64_ds
*);
73 linux32_to_bsd_semid_ds(struct linux32_semid_ds
*, struct semid_ds
*);
75 linux32_to_bsd_semid64_ds(struct linux32_semid64_ds
*, struct semid_ds
*);
78 linux32_semop(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
80 linux32_semget(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
82 linux32_semctl(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
87 bsd_to_linux32_shmid_ds(struct shmid_ds
*, struct linux32_shmid_ds
*);
89 linux32_to_bsd_shmid_ds(struct linux32_shmid_ds
*, struct shmid_ds
*);
91 bsd_to_linux32_shmid64_ds(struct shmid_ds
*, struct linux32_shmid64_ds
*);
93 linux32_to_bsd_shmid64_ds(struct linux32_shmid64_ds
*, struct shmid_ds
*);
96 linux32_shmat(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
98 linux32_shmdt(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
100 linux32_shmget(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
102 linux32_shmctl(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
106 static int linux32_msgsnd(struct lwp
*, const struct linux32_sys_ipc_args
*,
108 static int linux32_msgrcv(struct lwp
*, const struct linux32_sys_ipc_args
*,
110 static int linux32_msgget(struct lwp
*, const struct linux32_sys_ipc_args
*,
112 static int linux32_msgctl(struct lwp
*, const struct linux32_sys_ipc_args
*,
117 linux32_sys_ipc(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
121 syscallarg(int) what;
125 syscallarg(netbsd32_voidp) ptr;
128 switch (SCARG(uap
, what
)) {
130 case LINUX32_IPC_semop
:
131 return linux32_semop(l
, uap
, retval
);
132 case LINUX32_IPC_semget
:
133 return linux32_semget(l
, uap
, retval
);
134 case LINUX32_IPC_semctl
:
135 return linux32_semctl(l
, uap
, retval
);
138 case LINUX32_IPC_msgsnd
:
139 return linux32_msgsnd(l
, uap
, retval
);
140 case LINUX32_IPC_msgrcv
:
141 return linux32_msgrcv(l
, uap
, retval
);
142 case LINUX32_IPC_msgget
:
143 return linux32_msgget(l
, uap
, retval
);
144 case LINUX32_IPC_msgctl
:
145 return linux32_msgctl(l
, uap
, retval
);
148 case LINUX32_IPC_shmat
:
149 return linux32_shmat(l
, uap
, retval
);
150 case LINUX32_IPC_shmdt
:
151 return linux32_shmdt(l
, uap
, retval
);
152 case LINUX32_IPC_shmget
:
153 return linux32_shmget(l
, uap
, retval
);
154 case LINUX32_IPC_shmctl
:
155 return linux32_shmctl(l
, uap
, retval
);
164 bsd_to_linux32_ipc_perm(struct ipc_perm
*bpp
, struct linux32_ipc_perm
*lpp
)
166 lpp
->l_key
= bpp
->_key
;
167 lpp
->l_uid
= bpp
->uid
;
168 lpp
->l_gid
= bpp
->gid
;
169 lpp
->l_cuid
= bpp
->cuid
;
170 lpp
->l_cgid
= bpp
->cgid
;
171 lpp
->l_mode
= bpp
->mode
;
172 lpp
->l_seq
= bpp
->_seq
;
176 linux32_to_bsd_ipc_perm(struct linux32_ipc_perm
*lpp
, struct ipc_perm
*bpp
)
178 bpp
->_key
= lpp
->l_key
;
179 bpp
->uid
= lpp
->l_uid
;
180 bpp
->gid
= lpp
->l_gid
;
181 bpp
->cuid
= lpp
->l_cuid
;
182 bpp
->cgid
= lpp
->l_cgid
;
183 bpp
->mode
= lpp
->l_mode
;
184 bpp
->_seq
= lpp
->l_seq
;
188 bsd_to_linux32_ipc64_perm(struct ipc_perm
*bpp
, struct linux32_ipc64_perm
*lpp
)
190 lpp
->l_key
= bpp
->_key
;
191 lpp
->l_uid
= bpp
->uid
;
192 lpp
->l_gid
= bpp
->gid
;
193 lpp
->l_cuid
= bpp
->cuid
;
194 lpp
->l_cgid
= bpp
->cgid
;
195 lpp
->l_mode
= bpp
->mode
;
196 lpp
->l_seq
= bpp
->_seq
;
200 linux32_to_bsd_ipc64_perm(struct linux32_ipc64_perm
*lpp
, struct ipc_perm
*bpp
)
202 bpp
->_key
= lpp
->l_key
;
203 bpp
->uid
= lpp
->l_uid
;
204 bpp
->gid
= lpp
->l_gid
;
205 bpp
->cuid
= lpp
->l_cuid
;
206 bpp
->cgid
= lpp
->l_cgid
;
207 bpp
->mode
= lpp
->l_mode
;
208 bpp
->_seq
= lpp
->l_seq
;
213 bsd_to_linux32_semid_ds(struct semid_ds
*bsp
, struct linux32_semid_ds
*lsp
)
215 bsd_to_linux32_ipc_perm(&bsp
->sem_perm
, &lsp
->l_sem_perm
);
216 lsp
->l_sem_otime
= bsp
->sem_otime
;
217 lsp
->l_sem_ctime
= bsp
->sem_ctime
;
218 lsp
->l_sem_nsems
= bsp
->sem_nsems
;
219 NETBSD32PTR32(lsp
->l_sem_base
, bsp
->_sem_base
);
223 bsd_to_linux32_semid64_ds(struct semid_ds
*bsp
, struct linux32_semid64_ds
*lsp
)
225 bsd_to_linux32_ipc64_perm(&bsp
->sem_perm
, &lsp
->l_sem_perm
);
226 lsp
->l_sem_otime
= bsp
->sem_otime
;
227 lsp
->l_sem_ctime
= bsp
->sem_ctime
;
228 lsp
->l_sem_nsems
= bsp
->sem_nsems
;
232 linux32_to_bsd_semid_ds(struct linux32_semid_ds
*lsp
, struct semid_ds
*bsp
)
234 linux32_to_bsd_ipc_perm(&lsp
->l_sem_perm
, &bsp
->sem_perm
);
235 bsp
->sem_otime
= lsp
->l_sem_otime
;
236 bsp
->sem_ctime
= lsp
->l_sem_ctime
;
237 bsp
->sem_nsems
= lsp
->l_sem_nsems
;
238 bsp
->_sem_base
= NETBSD32PTR64(lsp
->l_sem_base
);
242 linux32_to_bsd_semid64_ds(struct linux32_semid64_ds
*lsp
, struct semid_ds
*bsp
)
244 linux32_to_bsd_ipc64_perm(&lsp
->l_sem_perm
, &bsp
->sem_perm
);
245 bsp
->sem_otime
= lsp
->l_sem_otime
;
246 bsp
->sem_ctime
= lsp
->l_sem_ctime
;
247 bsp
->sem_nsems
= lsp
->l_sem_nsems
;
251 linux32_semop(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
254 struct sys_semop_args ua
;
256 SCARG(&ua
, semid
) = SCARG(uap
, a1
);
257 SCARG(&ua
, sops
) = SCARG_P32(uap
, ptr
);
258 SCARG(&ua
, nsops
) = SCARG(uap
, a2
);
260 return sys_semop(l
, &ua
, retval
);
264 linux32_semget(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
267 struct sys_semget_args ua
;
269 SCARG(&ua
, key
) = SCARG(uap
, a1
);
270 SCARG(&ua
, nsems
) = SCARG(uap
, a2
);
271 SCARG(&ua
, semflg
) = SCARG(uap
, a3
);
273 return sys_semget(l
, &ua
, retval
);
277 linux32_semctl(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
280 int lcmd
, cmd
, error
;
282 struct linux32_semid_ds ls
;
283 struct linux32_semid64_ds ls64
;
284 union linux32_semun lsem
;
288 if ((error
= copyin(SCARG_P32(uap
, ptr
), &lsem
, sizeof lsem
)))
291 lcmd
= SCARG(uap
, a3
);
293 switch (lcmd
& ~LINUX32_IPC_64
) {
294 case LINUX32_IPC_RMID
:
297 case LINUX32_IPC_STAT
:
301 case LINUX32_IPC_SET
:
302 if (lcmd
& LINUX32_IPC_64
) {
303 error
= copyin(NETBSD32PTR64(lsem
.l_buf
), &ls64
,
305 linux32_to_bsd_semid64_ds(&ls64
, &bs
);
307 error
= copyin(NETBSD32PTR64(lsem
.l_buf
), &ls
,
309 linux32_to_bsd_semid_ds(&ls
, &bs
);
321 bsem
.val
= lsem
.l_val
;
327 case LINUX32_GETNCNT
:
330 case LINUX32_GETZCNT
:
335 bsem
.array
= NETBSD32PTR64(lsem
.l_array
);
340 bsem
.array
= NETBSD32PTR64(lsem
.l_array
);
347 error
= semctl1(l
, SCARG(uap
, a1
), SCARG(uap
, a2
), cmd
, buf
, retval
);
352 case LINUX32_IPC_STAT
:
353 bsd_to_linux32_semid_ds(&bs
, &ls
);
354 error
= copyout(&ls
, NETBSD32PTR64(lsem
.l_buf
), sizeof ls
);
356 case LINUX32_IPC_STAT
|LINUX32_IPC_64
:
357 bsd_to_linux32_semid64_ds(&bs
, &ls64
);
358 error
= copyout(&ls64
, NETBSD32PTR64(lsem
.l_buf
), sizeof ls64
);
371 linux32_msgsnd(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
373 struct netbsd32_msgsnd_args bma
;
375 SCARG(&bma
, msqid
) = SCARG(uap
, a1
);
376 SCARG(&bma
, msgp
) = SCARG(uap
, ptr
);
377 SCARG(&bma
, msgsz
) = SCARG(uap
, a2
);
378 SCARG(&bma
, msgflg
) = SCARG(uap
, a3
);
380 return netbsd32_msgsnd(l
, &bma
, retval
);
384 * This kludge is used for the 6th argument to the msgrcv system
385 * call, to get around the maximum of 5 arguments to a syscall in Linux.
387 struct linux32_msgrcv_msgarg
{
388 netbsd32_pointer_t msg
;
393 linux32_msgrcv(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
395 struct netbsd32_msgrcv_args bma
;
396 struct linux32_msgrcv_msgarg kluge
;
399 if ((error
= copyin(SCARG_P32(uap
, ptr
), &kluge
, sizeof kluge
)))
402 SCARG(&bma
, msqid
) = SCARG(uap
, a1
);
403 SCARG(&bma
, msgp
) = kluge
.msg
;
404 SCARG(&bma
, msgsz
) = SCARG(uap
, a2
);
405 SCARG(&bma
, msgtyp
) = kluge
.type
;
406 SCARG(&bma
, msgflg
) = SCARG(uap
, a3
);
408 return netbsd32_msgrcv(l
, &bma
, retval
);
412 linux32_msgget(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
414 struct sys_msgget_args bma
;
416 SCARG(&bma
, key
) = (key_t
)(linux32_key_t
)SCARG(uap
, a1
);
417 SCARG(&bma
, msgflg
) = SCARG(uap
, a2
);
419 return sys_msgget(l
, &bma
, retval
);
424 linux32_to_bsd_msqid_ds(struct linux32_msqid_ds
*lmp
, struct msqid_ds
*bmp
)
427 memset(bmp
, 0, sizeof(*bmp
));
428 linux32_to_bsd_ipc_perm(&lmp
->l_msg_perm
, &bmp
->msg_perm
);
429 bmp
->_msg_first
= NETBSD32PTR64(lmp
->l_msg_first
);
430 bmp
->_msg_last
= NETBSD32PTR64(lmp
->l_msg_last
);
431 bmp
->_msg_cbytes
= lmp
->l_msg_cbytes
;
432 bmp
->msg_qnum
= lmp
->l_msg_qnum
;
433 bmp
->msg_qbytes
= lmp
->l_msg_qbytes
;
434 bmp
->msg_lspid
= lmp
->l_msg_lspid
;
435 bmp
->msg_lrpid
= lmp
->l_msg_lrpid
;
436 bmp
->msg_stime
= lmp
->l_msg_stime
;
437 bmp
->msg_rtime
= lmp
->l_msg_rtime
;
438 bmp
->msg_ctime
= lmp
->l_msg_ctime
;
442 linux32_to_bsd_msqid64_ds(struct linux32_msqid64_ds
*lmp
, struct msqid_ds
*bmp
)
445 memset(bmp
, 0, sizeof(*bmp
));
446 linux32_to_bsd_ipc64_perm(&lmp
->l_msg_perm
, &bmp
->msg_perm
);
447 bmp
->msg_stime
= lmp
->l_msg_stime
;
448 bmp
->msg_rtime
= lmp
->l_msg_rtime
;
449 bmp
->msg_ctime
= lmp
->l_msg_ctime
;
450 bmp
->_msg_cbytes
= lmp
->l_msg_cbytes
;
451 bmp
->msg_qnum
= lmp
->l_msg_qnum
;
452 bmp
->msg_qbytes
= lmp
->l_msg_qbytes
;
453 bmp
->msg_lspid
= lmp
->l_msg_lspid
;
454 bmp
->msg_lrpid
= lmp
->l_msg_lrpid
;
458 bsd_to_linux32_msqid_ds(struct msqid_ds
*bmp
, struct linux32_msqid_ds
*lmp
)
461 memset(lmp
, 0, sizeof(*lmp
));
462 bsd_to_linux32_ipc_perm(&bmp
->msg_perm
, &lmp
->l_msg_perm
);
463 NETBSD32PTR32(lmp
->l_msg_first
, bmp
->_msg_first
);
464 NETBSD32PTR32(lmp
->l_msg_last
, bmp
->_msg_last
);
465 lmp
->l_msg_cbytes
= bmp
->_msg_cbytes
;
466 lmp
->l_msg_qnum
= bmp
->msg_qnum
;
467 lmp
->l_msg_qbytes
= bmp
->msg_qbytes
;
468 lmp
->l_msg_lspid
= bmp
->msg_lspid
;
469 lmp
->l_msg_lrpid
= bmp
->msg_lrpid
;
470 lmp
->l_msg_stime
= bmp
->msg_stime
;
471 lmp
->l_msg_rtime
= bmp
->msg_rtime
;
472 lmp
->l_msg_ctime
= bmp
->msg_ctime
;
476 bsd_to_linux32_msqid64_ds(struct msqid_ds
*bmp
, struct linux32_msqid64_ds
*lmp
)
479 memset(lmp
, 0, sizeof(*lmp
));
480 bsd_to_linux32_ipc64_perm(&bmp
->msg_perm
, &lmp
->l_msg_perm
);
481 lmp
->l_msg_stime
= bmp
->msg_stime
;
482 lmp
->l_msg_rtime
= bmp
->msg_rtime
;
483 lmp
->l_msg_ctime
= bmp
->msg_ctime
;
484 lmp
->l_msg_cbytes
= bmp
->_msg_cbytes
;
485 lmp
->l_msg_qnum
= bmp
->msg_qnum
;
486 lmp
->l_msg_qbytes
= bmp
->msg_qbytes
;
487 lmp
->l_msg_lspid
= bmp
->msg_lspid
;
488 lmp
->l_msg_lrpid
= bmp
->msg_lrpid
;
492 linux32_msgctl(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
494 struct msqid_ds bm
, *bmp
= NULL
;
495 struct linux32_msqid_ds lm
;
496 struct linux32_msqid64_ds lm64
;
497 int cmd
, lcmd
, error
;
498 void *data
= SCARG_P32(uap
, ptr
);
500 lcmd
= SCARG(uap
, a2
);
502 switch (lcmd
& ~LINUX32_IPC_64
) {
503 case LINUX32_IPC_STAT
:
507 case LINUX32_IPC_SET
:
508 if (lcmd
& LINUX32_IPC_64
) {
509 error
= copyin(data
, &lm64
, sizeof lm64
);
510 linux32_to_bsd_msqid64_ds(&lm64
, &bm
);
512 error
= copyin(data
, &lm
, sizeof lm
);
513 linux32_to_bsd_msqid_ds(&lm
, &bm
);
520 case LINUX32_IPC_RMID
:
527 if ((error
= msgctl1(l
, SCARG(uap
, a1
), cmd
, bmp
)))
531 case LINUX32_IPC_STAT
:
532 bsd_to_linux32_msqid_ds(&bm
, &lm
);
533 error
= copyout(&lm
, data
, sizeof lm
);
535 case LINUX32_IPC_STAT
|LINUX32_IPC_64
:
536 bsd_to_linux32_msqid64_ds(&bm
, &lm64
);
537 error
= copyout(&lm64
, data
, sizeof lm64
);
549 bsd_to_linux32_shmid_ds(struct shmid_ds
*bsp
, struct linux32_shmid_ds
*lsp
)
551 bsd_to_linux32_ipc_perm(&bsp
->shm_perm
, &lsp
->l_shm_perm
);
552 lsp
->l_shm_segsz
= bsp
->shm_segsz
;
553 lsp
->l_shm_atime
= bsp
->shm_atime
;
554 lsp
->l_shm_dtime
= bsp
->shm_dtime
;
555 lsp
->l_shm_ctime
= bsp
->shm_ctime
;
556 lsp
->l_shm_cpid
= bsp
->shm_cpid
;
557 lsp
->l_shm_lpid
= bsp
->shm_lpid
;
558 lsp
->l_shm_nattch
= bsp
->shm_nattch
;
559 NETBSD32PTR32(lsp
->l_private2
, bsp
->_shm_internal
);
563 linux32_to_bsd_shmid_ds(struct linux32_shmid_ds
*lsp
, struct shmid_ds
*bsp
)
565 linux32_to_bsd_ipc_perm(&lsp
->l_shm_perm
, &bsp
->shm_perm
);
566 bsp
->shm_segsz
= lsp
->l_shm_segsz
;
567 bsp
->shm_atime
= lsp
->l_shm_atime
;
568 bsp
->shm_dtime
= lsp
->l_shm_dtime
;
569 bsp
->shm_ctime
= lsp
->l_shm_ctime
;
570 bsp
->shm_cpid
= lsp
->l_shm_cpid
;
571 bsp
->shm_lpid
= lsp
->l_shm_lpid
;
572 bsp
->shm_nattch
= lsp
->l_shm_nattch
;
573 bsp
->_shm_internal
= NETBSD32PTR64(lsp
->l_private2
);
577 bsd_to_linux32_shmid64_ds(struct shmid_ds
*bsp
, struct linux32_shmid64_ds
*lsp
)
579 bsd_to_linux32_ipc64_perm(&bsp
->shm_perm
, &lsp
->l_shm_perm
);
580 lsp
->l_shm_segsz
= bsp
->shm_segsz
;
581 lsp
->l_shm_atime
= bsp
->shm_atime
;
582 lsp
->l_shm_dtime
= bsp
->shm_dtime
;
583 lsp
->l_shm_ctime
= bsp
->shm_ctime
;
584 lsp
->l_shm_cpid
= bsp
->shm_cpid
;
585 lsp
->l_shm_lpid
= bsp
->shm_lpid
;
586 lsp
->l_shm_nattch
= bsp
->shm_nattch
;
587 lsp
->l___unused5
= NETBSD32PTR32I(bsp
->_shm_internal
);
591 linux32_to_bsd_shmid64_ds(struct linux32_shmid64_ds
*lsp
, struct shmid_ds
*bsp
)
593 linux32_to_bsd_ipc64_perm(&lsp
->l_shm_perm
, &bsp
->shm_perm
);
594 bsp
->shm_segsz
= lsp
->l_shm_segsz
;
595 bsp
->shm_atime
= lsp
->l_shm_atime
;
596 bsp
->shm_dtime
= lsp
->l_shm_dtime
;
597 bsp
->shm_ctime
= lsp
->l_shm_ctime
;
598 bsp
->shm_cpid
= lsp
->l_shm_cpid
;
599 bsp
->shm_lpid
= lsp
->l_shm_lpid
;
600 bsp
->shm_nattch
= lsp
->l_shm_nattch
;
601 bsp
->_shm_internal
= NETBSD32IPTR64(lsp
->l___unused5
);
605 linux32_shmat(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
608 struct sys_shmat_args ua
;
609 netbsd32_pointer_t addr32
;
612 SCARG(&ua
, shmid
) = SCARG(uap
, a1
);
613 SCARG(&ua
, shmaddr
) = SCARG_P32(uap
, ptr
);
614 SCARG(&ua
, shmflg
) = SCARG(uap
, a2
);
616 if ((error
= sys_shmat(l
, &ua
, retval
)))
619 NETBSD32PTR32(addr32
, (const void *)(uintptr_t)retval
[0]);
621 error
= copyout(&addr32
, NETBSD32IPTR64(SCARG(uap
, a3
)), sizeof addr32
);
629 linux32_shmdt(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
632 struct sys_shmdt_args ua
;
634 SCARG(&ua
, shmaddr
) = SCARG_P32(uap
, ptr
);
636 return sys_shmdt(l
, &ua
, retval
);
640 linux32_shmget(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
643 struct sys_shmget_args ua
;
645 SCARG(&ua
, key
) = SCARG(uap
, a1
);
646 SCARG(&ua
, size
) = SCARG(uap
, a2
);
647 SCARG(&ua
, shmflg
) = SCARG(uap
, a3
) | _SHM_RMLINGER
;
649 return sys_shmget(l
, &ua
, retval
);
653 linux32_shmctl(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
656 int shmid
, cmd
, error
;
658 struct linux32_shmid_ds ls
;
659 struct linux32_shmid64_ds ls64
;
661 shmid
= SCARG(uap
, a1
);
662 cmd
= SCARG(uap
, a2
);
664 switch (cmd
& ~LINUX32_IPC_64
) {
666 case LINUX32_SHM_STAT
:
669 case LINUX32_IPC_STAT
:
670 error
= shmctl1(l
, shmid
, IPC_STAT
, &bs
);
673 if (cmd
& LINUX32_IPC_64
) {
674 bsd_to_linux32_shmid64_ds(&bs
, &ls64
);
675 error
= copyout(&ls64
, SCARG_P32(uap
, ptr
), sizeof ls64
);
677 bsd_to_linux32_shmid_ds(&bs
, &ls
);
678 error
= copyout(&ls
, SCARG_P32(uap
, ptr
), sizeof ls
);
682 case LINUX32_IPC_SET
:
683 if (cmd
& LINUX32_IPC_64
) {
684 error
= copyin(SCARG_P32(uap
, ptr
), &ls64
, sizeof ls64
);
685 linux32_to_bsd_shmid64_ds(&ls64
, &bs
);
687 error
= copyin(SCARG_P32(uap
, ptr
), &ls
, sizeof ls
);
688 linux32_to_bsd_shmid_ds(&ls
, &bs
);
692 return shmctl1(l
, shmid
, IPC_SET
, &bs
);
694 case LINUX32_IPC_RMID
:
695 return shmctl1(l
, shmid
, IPC_RMID
, NULL
);
697 case LINUX32_SHM_LOCK
:
698 return shmctl1(l
, shmid
, SHM_LOCK
, NULL
);
700 case LINUX32_SHM_UNLOCK
:
701 return shmctl1(l
, shmid
, SHM_UNLOCK
, NULL
);
703 case LINUX32_IPC_INFO
:
704 case LINUX32_SHM_INFO
: