1 /* $NetBSD: linux32_ipccall.c,v 1.5 2009/11/16 08:49:32 joerg 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.5 2009/11/16 08:49:32 joerg 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>
46 #include <compat/linux/common/linux_types.h>
47 #include <compat/linux32/common/linux32_types.h>
48 #include <compat/linux32/common/linux32_signal.h>
49 #include <compat/linux32/linux32_syscallargs.h>
50 #include <compat/linux32/common/linux32_ipc.h>
51 #include <compat/linux32/common/linux32_sem.h>
52 #include <compat/linux32/common/linux32_shm.h>
54 #define LINUX32_IPC_semop 1
55 #define LINUX32_IPC_semget 2
56 #define LINUX32_IPC_semctl 3
57 #define LINUX32_IPC_msgsnd 11
58 #define LINUX32_IPC_msgrcv 12
59 #define LINUX32_IPC_msgget 13
60 #define LINUX32_IPC_msgctl 14
61 #define LINUX32_IPC_shmat 21
62 #define LINUX32_IPC_shmdt 22
63 #define LINUX32_IPC_shmget 23
64 #define LINUX32_IPC_shmctl 24
68 bsd_to_linux32_semid_ds(struct semid_ds
*, struct linux32_semid_ds
*);
70 bsd_to_linux32_semid64_ds(struct semid_ds
*, struct linux32_semid64_ds
*);
72 linux32_to_bsd_semid_ds(struct linux32_semid_ds
*, struct semid_ds
*);
74 linux32_to_bsd_semid64_ds(struct linux32_semid64_ds
*, struct semid_ds
*);
77 linux32_semop(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
79 linux32_semget(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
81 linux32_semctl(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
86 bsd_to_linux32_shmid_ds(struct shmid_ds
*, struct linux32_shmid_ds
*);
88 linux32_to_bsd_shmid_ds(struct linux32_shmid_ds
*, struct shmid_ds
*);
90 bsd_to_linux32_shmid64_ds(struct shmid_ds
*, struct linux32_shmid64_ds
*);
92 linux32_to_bsd_shmid64_ds(struct linux32_shmid64_ds
*, struct shmid_ds
*);
95 linux32_shmat(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
97 linux32_shmdt(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
99 linux32_shmget(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
101 linux32_shmctl(struct lwp
*, const struct linux32_sys_ipc_args
*, register_t
*);
105 static int linux32_msgsnd(struct lwp
*, const struct linux32_sys_ipc_args
*,
107 static int linux32_msgrcv(struct lwp
*, const struct linux32_sys_ipc_args
*,
109 static int linux32_msgget(struct lwp
*, const struct linux32_sys_ipc_args
*,
111 static int linux32_msgctl(struct lwp
*, const struct linux32_sys_ipc_args
*,
116 linux32_sys_ipc(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
120 syscallarg(int) what;
124 syscallarg(netbsd32_voidp) ptr;
127 switch (SCARG(uap
, what
)) {
129 case LINUX32_IPC_semop
:
130 return linux32_semop(l
, uap
, retval
);;
131 case LINUX32_IPC_semget
:
132 return linux32_semget(l
, uap
, retval
);
133 case LINUX32_IPC_semctl
:
134 return linux32_semctl(l
, uap
, retval
);
137 case LINUX32_IPC_msgsnd
:
138 return linux32_msgsnd(l
, uap
, retval
);
139 case LINUX32_IPC_msgrcv
:
140 return linux32_msgrcv(l
, uap
, retval
);
141 case LINUX32_IPC_msgget
:
142 return linux32_msgget(l
, uap
, retval
);
143 case LINUX32_IPC_msgctl
:
144 return linux32_msgctl(l
, uap
, retval
);
147 case LINUX32_IPC_shmat
:
148 return linux32_shmat(l
, uap
, retval
);
149 case LINUX32_IPC_shmdt
:
150 return linux32_shmdt(l
, uap
, retval
);
151 case LINUX32_IPC_shmget
:
152 return linux32_shmget(l
, uap
, retval
);
153 case LINUX32_IPC_shmctl
:
154 return linux32_shmctl(l
, uap
, retval
);
163 bsd_to_linux32_ipc_perm(struct ipc_perm
*bpp
, struct linux32_ipc_perm
*lpp
)
165 lpp
->l_key
= bpp
->_key
;
166 lpp
->l_uid
= bpp
->uid
;
167 lpp
->l_gid
= bpp
->gid
;
168 lpp
->l_cuid
= bpp
->cuid
;
169 lpp
->l_cgid
= bpp
->cgid
;
170 lpp
->l_mode
= bpp
->mode
;
171 lpp
->l_seq
= bpp
->_seq
;
175 linux32_to_bsd_ipc_perm(struct linux32_ipc_perm
*lpp
, struct ipc_perm
*bpp
)
177 bpp
->_key
= lpp
->l_key
;
178 bpp
->uid
= lpp
->l_uid
;
179 bpp
->gid
= lpp
->l_gid
;
180 bpp
->cuid
= lpp
->l_cuid
;
181 bpp
->cgid
= lpp
->l_cgid
;
182 bpp
->mode
= lpp
->l_mode
;
183 bpp
->_seq
= lpp
->l_seq
;
187 bsd_to_linux32_ipc64_perm(struct ipc_perm
*bpp
, struct linux32_ipc64_perm
*lpp
)
189 lpp
->l_key
= bpp
->_key
;
190 lpp
->l_uid
= bpp
->uid
;
191 lpp
->l_gid
= bpp
->gid
;
192 lpp
->l_cuid
= bpp
->cuid
;
193 lpp
->l_cgid
= bpp
->cgid
;
194 lpp
->l_mode
= bpp
->mode
;
195 lpp
->l_seq
= bpp
->_seq
;
199 linux32_to_bsd_ipc64_perm(struct linux32_ipc64_perm
*lpp
, struct ipc_perm
*bpp
)
201 bpp
->_key
= lpp
->l_key
;
202 bpp
->uid
= lpp
->l_uid
;
203 bpp
->gid
= lpp
->l_gid
;
204 bpp
->cuid
= lpp
->l_cuid
;
205 bpp
->cgid
= lpp
->l_cgid
;
206 bpp
->mode
= lpp
->l_mode
;
207 bpp
->_seq
= lpp
->l_seq
;
212 bsd_to_linux32_semid_ds(struct semid_ds
*bsp
, struct linux32_semid_ds
*lsp
)
214 bsd_to_linux32_ipc_perm(&bsp
->sem_perm
, &lsp
->l_sem_perm
);
215 lsp
->l_sem_otime
= bsp
->sem_otime
;
216 lsp
->l_sem_ctime
= bsp
->sem_ctime
;
217 lsp
->l_sem_nsems
= bsp
->sem_nsems
;
218 NETBSD32PTR32(lsp
->l_sem_base
, bsp
->_sem_base
);
222 bsd_to_linux32_semid64_ds(struct semid_ds
*bsp
, struct linux32_semid64_ds
*lsp
)
224 bsd_to_linux32_ipc64_perm(&bsp
->sem_perm
, &lsp
->l_sem_perm
);
225 lsp
->l_sem_otime
= bsp
->sem_otime
;
226 lsp
->l_sem_ctime
= bsp
->sem_ctime
;
227 lsp
->l_sem_nsems
= bsp
->sem_nsems
;
231 linux32_to_bsd_semid_ds(struct linux32_semid_ds
*lsp
, struct semid_ds
*bsp
)
233 linux32_to_bsd_ipc_perm(&lsp
->l_sem_perm
, &bsp
->sem_perm
);
234 bsp
->sem_otime
= lsp
->l_sem_otime
;
235 bsp
->sem_ctime
= lsp
->l_sem_ctime
;
236 bsp
->sem_nsems
= lsp
->l_sem_nsems
;
237 bsp
->_sem_base
= NETBSD32PTR64(lsp
->l_sem_base
);
241 linux32_to_bsd_semid64_ds(struct linux32_semid64_ds
*lsp
, struct semid_ds
*bsp
)
243 linux32_to_bsd_ipc64_perm(&lsp
->l_sem_perm
, &bsp
->sem_perm
);
244 bsp
->sem_otime
= lsp
->l_sem_otime
;
245 bsp
->sem_ctime
= lsp
->l_sem_ctime
;
246 bsp
->sem_nsems
= lsp
->l_sem_nsems
;
250 linux32_semop(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
253 struct sys_semop_args ua
;
255 SCARG(&ua
, semid
) = SCARG(uap
, a1
);
256 SCARG(&ua
, sops
) = SCARG_P32(uap
, ptr
);
257 SCARG(&ua
, nsops
) = SCARG(uap
, a2
);
259 return sys_semop(l
, &ua
, retval
);
263 linux32_semget(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
266 struct sys_semget_args ua
;
268 SCARG(&ua
, key
) = SCARG(uap
, a1
);
269 SCARG(&ua
, nsems
) = SCARG(uap
, a2
);
270 SCARG(&ua
, semflg
) = SCARG(uap
, a3
);
272 return sys_semget(l
, &ua
, retval
);
276 linux32_semctl(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
279 int lcmd
, cmd
, error
;
281 struct linux32_semid_ds ls
;
282 struct linux32_semid64_ds ls64
;
283 union linux32_semun lsem
;
287 if ((error
= copyin(SCARG_P32(uap
, ptr
), &lsem
, sizeof lsem
)))
290 lcmd
= SCARG(uap
, a3
);
292 switch (lcmd
& ~LINUX32_IPC_64
) {
293 case LINUX32_IPC_RMID
:
296 case LINUX32_IPC_STAT
:
300 case LINUX32_IPC_SET
:
301 if (lcmd
& LINUX32_IPC_64
) {
302 error
= copyin(NETBSD32PTR64(lsem
.l_buf
), &ls64
,
304 linux32_to_bsd_semid64_ds(&ls64
, &bs
);
306 error
= copyin(NETBSD32PTR64(lsem
.l_buf
), &ls
,
308 linux32_to_bsd_semid_ds(&ls
, &bs
);
320 bsem
.val
= lsem
.l_val
;
326 case LINUX32_GETNCNT
:
329 case LINUX32_GETZCNT
:
334 bsem
.array
= NETBSD32PTR64(lsem
.l_array
);
339 bsem
.array
= NETBSD32PTR64(lsem
.l_array
);
346 error
= semctl1(l
, SCARG(uap
, a1
), SCARG(uap
, a2
), cmd
, buf
, retval
);
351 case LINUX32_IPC_STAT
:
352 bsd_to_linux32_semid_ds(&bs
, &ls
);
353 error
= copyout(&ls
, NETBSD32PTR64(lsem
.l_buf
), sizeof ls
);
355 case LINUX32_IPC_STAT
|LINUX32_IPC_64
:
356 bsd_to_linux32_semid64_ds(&bs
, &ls64
);
357 error
= copyout(&ls64
, NETBSD32PTR64(lsem
.l_buf
), sizeof ls64
);
370 linux32_msgsnd(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
372 struct sys_msgsnd_args bma
;
374 SCARG(&bma
, msqid
) = SCARG(uap
, a1
);
375 SCARG(&bma
, msgp
) = SCARG_P32(uap
, ptr
);
376 SCARG(&bma
, msgsz
) = SCARG(uap
, a2
);
377 SCARG(&bma
, msgflg
) = SCARG(uap
, a3
);
379 printf("linux32_msgsnd: %d %zu\n", SCARG(&bma
, msqid
), SCARG(&bma
, msgsz
));
381 return sys_msgsnd(l
, &bma
, retval
);
385 * This kludge is used for the 6th argument to the msgrcv system
386 * call, to get around the maximum of 5 arguments to a syscall in Linux.
388 struct linux32_msgrcv_msgarg
{
389 netbsd32_pointer_t msg
;
394 linux32_msgrcv(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
396 struct sys_msgrcv_args bma
;
397 struct linux32_msgrcv_msgarg kluge
;
400 if ((error
= copyin(SCARG_P32(uap
, ptr
), &kluge
, sizeof kluge
)))
403 SCARG(&bma
, msqid
) = SCARG(uap
, a1
);
404 SCARG(&bma
, msgp
) = NETBSD32PTR64(kluge
.msg
);
405 SCARG(&bma
, msgsz
) = SCARG(uap
, a2
);
406 SCARG(&bma
, msgtyp
) = kluge
.type
;
407 SCARG(&bma
, msgflg
) = SCARG(uap
, a3
);
409 printf("linux32_msgrcv: %d %zu\n", SCARG(&bma
, msqid
), SCARG(&bma
, msgsz
));
411 return sys_msgrcv(l
, &bma
, retval
);
415 linux32_msgget(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
417 struct sys_msgget_args bma
;
419 SCARG(&bma
, key
) = (key_t
)(linux32_key_t
)SCARG(uap
, a1
);
420 SCARG(&bma
, msgflg
) = SCARG(uap
, a2
);
422 return sys_msgget(l
, &bma
, retval
);
427 linux32_to_bsd_msqid_ds(struct linux32_msqid_ds
*lmp
, struct msqid_ds
*bmp
)
430 memset(bmp
, 0, sizeof(*bmp
));
431 linux32_to_bsd_ipc_perm(&lmp
->l_msg_perm
, &bmp
->msg_perm
);
432 bmp
->_msg_first
= NETBSD32PTR64(lmp
->l_msg_first
);
433 bmp
->_msg_last
= NETBSD32PTR64(lmp
->l_msg_last
);
434 bmp
->_msg_cbytes
= lmp
->l_msg_cbytes
;
435 bmp
->msg_qnum
= lmp
->l_msg_qnum
;
436 bmp
->msg_qbytes
= lmp
->l_msg_qbytes
;
437 bmp
->msg_lspid
= lmp
->l_msg_lspid
;
438 bmp
->msg_lrpid
= lmp
->l_msg_lrpid
;
439 bmp
->msg_stime
= lmp
->l_msg_stime
;
440 bmp
->msg_rtime
= lmp
->l_msg_rtime
;
441 bmp
->msg_ctime
= lmp
->l_msg_ctime
;
445 linux32_to_bsd_msqid64_ds(struct linux32_msqid64_ds
*lmp
, struct msqid_ds
*bmp
)
448 memset(bmp
, 0, sizeof(*bmp
));
449 linux32_to_bsd_ipc64_perm(&lmp
->l_msg_perm
, &bmp
->msg_perm
);
450 bmp
->msg_stime
= lmp
->l_msg_stime
;
451 bmp
->msg_rtime
= lmp
->l_msg_rtime
;
452 bmp
->msg_ctime
= lmp
->l_msg_ctime
;
453 bmp
->_msg_cbytes
= lmp
->l_msg_cbytes
;
454 bmp
->msg_qnum
= lmp
->l_msg_qnum
;
455 bmp
->msg_qbytes
= lmp
->l_msg_qbytes
;
456 bmp
->msg_lspid
= lmp
->l_msg_lspid
;
457 bmp
->msg_lrpid
= lmp
->l_msg_lrpid
;
461 bsd_to_linux32_msqid_ds(struct msqid_ds
*bmp
, struct linux32_msqid_ds
*lmp
)
464 memset(lmp
, 0, sizeof(*lmp
));
465 bsd_to_linux32_ipc_perm(&bmp
->msg_perm
, &lmp
->l_msg_perm
);
466 NETBSD32PTR32(lmp
->l_msg_first
, bmp
->_msg_first
);
467 NETBSD32PTR32(lmp
->l_msg_last
, bmp
->_msg_last
);
468 lmp
->l_msg_cbytes
= bmp
->_msg_cbytes
;
469 lmp
->l_msg_qnum
= bmp
->msg_qnum
;
470 lmp
->l_msg_qbytes
= bmp
->msg_qbytes
;
471 lmp
->l_msg_lspid
= bmp
->msg_lspid
;
472 lmp
->l_msg_lrpid
= bmp
->msg_lrpid
;
473 lmp
->l_msg_stime
= bmp
->msg_stime
;
474 lmp
->l_msg_rtime
= bmp
->msg_rtime
;
475 lmp
->l_msg_ctime
= bmp
->msg_ctime
;
479 bsd_to_linux32_msqid64_ds(struct msqid_ds
*bmp
, struct linux32_msqid64_ds
*lmp
)
482 memset(lmp
, 0, sizeof(*lmp
));
483 bsd_to_linux32_ipc64_perm(&bmp
->msg_perm
, &lmp
->l_msg_perm
);
484 lmp
->l_msg_stime
= bmp
->msg_stime
;
485 lmp
->l_msg_rtime
= bmp
->msg_rtime
;
486 lmp
->l_msg_ctime
= bmp
->msg_ctime
;
487 lmp
->l_msg_cbytes
= bmp
->_msg_cbytes
;
488 lmp
->l_msg_qnum
= bmp
->msg_qnum
;
489 lmp
->l_msg_qbytes
= bmp
->msg_qbytes
;
490 lmp
->l_msg_lspid
= bmp
->msg_lspid
;
491 lmp
->l_msg_lrpid
= bmp
->msg_lrpid
;
495 linux32_msgctl(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
, register_t
*retval
)
497 struct msqid_ds bm
, *bmp
= NULL
;
498 struct linux32_msqid_ds lm
;
499 struct linux32_msqid64_ds lm64
;
500 int cmd
, lcmd
, error
;
501 void *data
= SCARG_P32(uap
, ptr
);
503 lcmd
= SCARG(uap
, a2
);
505 switch (lcmd
& ~LINUX32_IPC_64
) {
506 case LINUX32_IPC_STAT
:
510 case LINUX32_IPC_SET
:
511 if (lcmd
& LINUX32_IPC_64
) {
512 error
= copyin(data
, &lm64
, sizeof lm64
);
513 linux32_to_bsd_msqid64_ds(&lm64
, &bm
);
515 error
= copyin(data
, &lm
, sizeof lm
);
516 linux32_to_bsd_msqid_ds(&lm
, &bm
);
523 case LINUX32_IPC_RMID
:
530 if ((error
= msgctl1(l
, SCARG(uap
, a1
), cmd
, bmp
)))
534 case LINUX32_IPC_STAT
:
535 bsd_to_linux32_msqid_ds(&bm
, &lm
);
536 error
= copyout(&lm
, data
, sizeof lm
);
538 case LINUX32_IPC_STAT
|LINUX32_IPC_64
:
539 bsd_to_linux32_msqid64_ds(&bm
, &lm64
);
540 error
= copyout(&lm64
, data
, sizeof lm64
);
552 bsd_to_linux32_shmid_ds(struct shmid_ds
*bsp
, struct linux32_shmid_ds
*lsp
)
554 bsd_to_linux32_ipc_perm(&bsp
->shm_perm
, &lsp
->l_shm_perm
);
555 lsp
->l_shm_segsz
= bsp
->shm_segsz
;
556 lsp
->l_shm_atime
= bsp
->shm_atime
;
557 lsp
->l_shm_dtime
= bsp
->shm_dtime
;
558 lsp
->l_shm_ctime
= bsp
->shm_ctime
;
559 lsp
->l_shm_cpid
= bsp
->shm_cpid
;
560 lsp
->l_shm_lpid
= bsp
->shm_lpid
;
561 lsp
->l_shm_nattch
= bsp
->shm_nattch
;
562 NETBSD32PTR32(lsp
->l_private2
, bsp
->_shm_internal
);
566 linux32_to_bsd_shmid_ds(struct linux32_shmid_ds
*lsp
, struct shmid_ds
*bsp
)
568 linux32_to_bsd_ipc_perm(&lsp
->l_shm_perm
, &bsp
->shm_perm
);
569 bsp
->shm_segsz
= lsp
->l_shm_segsz
;
570 bsp
->shm_atime
= lsp
->l_shm_atime
;
571 bsp
->shm_dtime
= lsp
->l_shm_dtime
;
572 bsp
->shm_ctime
= lsp
->l_shm_ctime
;
573 bsp
->shm_cpid
= lsp
->l_shm_cpid
;
574 bsp
->shm_lpid
= lsp
->l_shm_lpid
;
575 bsp
->shm_nattch
= lsp
->l_shm_nattch
;
576 bsp
->_shm_internal
= NETBSD32PTR64(lsp
->l_private2
);
580 bsd_to_linux32_shmid64_ds(struct shmid_ds
*bsp
, struct linux32_shmid64_ds
*lsp
)
582 bsd_to_linux32_ipc64_perm(&bsp
->shm_perm
, &lsp
->l_shm_perm
);
583 lsp
->l_shm_segsz
= bsp
->shm_segsz
;
584 lsp
->l_shm_atime
= bsp
->shm_atime
;
585 lsp
->l_shm_dtime
= bsp
->shm_dtime
;
586 lsp
->l_shm_ctime
= bsp
->shm_ctime
;
587 lsp
->l_shm_cpid
= bsp
->shm_cpid
;
588 lsp
->l_shm_lpid
= bsp
->shm_lpid
;
589 lsp
->l_shm_nattch
= bsp
->shm_nattch
;
590 lsp
->l___unused5
= NETBSD32PTR32I(bsp
->_shm_internal
);
594 linux32_to_bsd_shmid64_ds(struct linux32_shmid64_ds
*lsp
, struct shmid_ds
*bsp
)
596 linux32_to_bsd_ipc64_perm(&lsp
->l_shm_perm
, &bsp
->shm_perm
);
597 bsp
->shm_segsz
= lsp
->l_shm_segsz
;
598 bsp
->shm_atime
= lsp
->l_shm_atime
;
599 bsp
->shm_dtime
= lsp
->l_shm_dtime
;
600 bsp
->shm_ctime
= lsp
->l_shm_ctime
;
601 bsp
->shm_cpid
= lsp
->l_shm_cpid
;
602 bsp
->shm_lpid
= lsp
->l_shm_lpid
;
603 bsp
->shm_nattch
= lsp
->l_shm_nattch
;
604 bsp
->_shm_internal
= NETBSD32IPTR64(lsp
->l___unused5
);
608 linux32_shmat(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
611 struct sys_shmat_args ua
;
612 netbsd32_pointer_t addr32
;
615 SCARG(&ua
, shmid
) = SCARG(uap
, a1
);
616 SCARG(&ua
, shmaddr
) = SCARG_P32(uap
, ptr
);
617 SCARG(&ua
, shmflg
) = SCARG(uap
, a2
);
619 if ((error
= sys_shmat(l
, &ua
, retval
)))
622 NETBSD32PTR32(addr32
, (const void *)(uintptr_t)retval
[0]);
624 error
= copyout(&addr32
, NETBSD32IPTR64(SCARG(uap
, a3
)), sizeof addr32
);
632 linux32_shmdt(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
635 struct sys_shmdt_args ua
;
637 SCARG(&ua
, shmaddr
) = SCARG_P32(uap
, ptr
);
639 return sys_shmdt(l
, &ua
, retval
);
643 linux32_shmget(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
646 struct sys_shmget_args ua
;
648 SCARG(&ua
, key
) = SCARG(uap
, a1
);
649 SCARG(&ua
, size
) = SCARG(uap
, a2
);
650 SCARG(&ua
, shmflg
) = SCARG(uap
, a3
) | _SHM_RMLINGER
;
652 return sys_shmget(l
, &ua
, retval
);
656 linux32_shmctl(struct lwp
*l
, const struct linux32_sys_ipc_args
*uap
,
659 int shmid
, cmd
, error
;
661 struct linux32_shmid_ds ls
;
662 struct linux32_shmid64_ds ls64
;
664 shmid
= SCARG(uap
, a1
);
665 cmd
= SCARG(uap
, a2
);
667 switch (cmd
& ~LINUX32_IPC_64
) {
669 case LINUX32_SHM_STAT
:
672 case LINUX32_IPC_STAT
:
673 error
= shmctl1(l
, shmid
, IPC_STAT
, &bs
);
676 if (cmd
& LINUX32_IPC_64
) {
677 bsd_to_linux32_shmid64_ds(&bs
, &ls64
);
678 error
= copyout(&ls64
, SCARG_P32(uap
, ptr
), sizeof ls64
);
680 bsd_to_linux32_shmid_ds(&bs
, &ls
);
681 error
= copyout(&ls
, SCARG_P32(uap
, ptr
), sizeof ls
);
685 case LINUX32_IPC_SET
:
686 if (cmd
& LINUX32_IPC_64
) {
687 error
= copyin(SCARG_P32(uap
, ptr
), &ls64
, sizeof ls64
);
688 linux32_to_bsd_shmid64_ds(&ls64
, &bs
);
690 error
= copyin(SCARG_P32(uap
, ptr
), &ls
, sizeof ls
);
691 linux32_to_bsd_shmid_ds(&ls
, &bs
);
695 return shmctl1(l
, shmid
, IPC_SET
, &bs
);
697 case LINUX32_IPC_RMID
:
698 return shmctl1(l
, shmid
, IPC_RMID
, NULL
);
700 case LINUX32_SHM_LOCK
:
701 return shmctl1(l
, shmid
, SHM_LOCK
, NULL
);
703 case LINUX32_SHM_UNLOCK
:
704 return shmctl1(l
, shmid
, SHM_UNLOCK
, NULL
);
706 case LINUX32_IPC_INFO
:
707 case LINUX32_SHM_INFO
: