Home | History | Annotate | Line # | Download | only in common
linux32_ipccall.c revision 1.11.60.1
      1  1.11.60.1  christos /* $NetBSD: linux32_ipccall.c,v 1.11.60.1 2019/06/10 22:07:01 christos 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.11.60.1  christos __KERNEL_RCSID(0, "$NetBSD: linux32_ipccall.c,v 1.11.60.1 2019/06/10 22:07:01 christos 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.11.60.1  christos 
    167  1.11.60.1  christos 	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.11.60.1  christos 
    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.11.60.1  christos 
    194  1.11.60.1  christos 	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.11.60.1  christos 
    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.11.60.1  christos 
    223  1.11.60.1  christos 	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.11.60.1  christos 
    234  1.11.60.1  christos 	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.11.60.1  christos 	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.11.60.1  christos 	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.11.60.1  christos 
    556  1.11.60.1  christos 	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.11.60.1  christos 
    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.11.60.1  christos 
    585  1.11.60.1  christos 	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.11.60.1  christos 
    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