diff options
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linux/linux_ipc.c | 64 | ||||
-rw-r--r-- | sys/compat/svr4/svr4_ipc.c | 115 | ||||
-rw-r--r-- | sys/compat/svr4/syscalls.master | 2 |
3 files changed, 60 insertions, 121 deletions
diff --git a/sys/compat/linux/linux_ipc.c b/sys/compat/linux/linux_ipc.c index 0989847..2e6dabf 100644 --- a/sys/compat/linux/linux_ipc.c +++ b/sys/compat/linux/linux_ipc.c @@ -491,69 +491,56 @@ int linux_semctl(struct thread *td, struct linux_semctl_args *args) { struct l_semid_ds linux_semid; - struct __semctl_args /* { - int semid; - int semnum; - int cmd; - union semun *arg; - } */ bsd_args; struct l_seminfo linux_seminfo; - int error; - union semun *unptr; - caddr_t sg; - - sg = stackgap_init(); - - /* Make sure the arg parameter can be copied in. */ - unptr = stackgap_alloc(&sg, sizeof(union semun)); - bcopy(&args->arg, unptr, sizeof(union semun)); - - bsd_args.semid = args->semid; - bsd_args.semnum = args->semnum; - bsd_args.arg = unptr; + struct semid_ds semid; + union semun semun; + int cmd, error; switch (args->cmd & ~LINUX_IPC_64) { case LINUX_IPC_RMID: - bsd_args.cmd = IPC_RMID; + cmd = IPC_RMID; break; case LINUX_GETNCNT: - bsd_args.cmd = GETNCNT; + cmd = GETNCNT; break; case LINUX_GETPID: - bsd_args.cmd = GETPID; + cmd = GETPID; break; case LINUX_GETVAL: - bsd_args.cmd = GETVAL; + cmd = GETVAL; break; case LINUX_GETZCNT: - bsd_args.cmd = GETZCNT; + cmd = GETZCNT; break; case LINUX_SETVAL: - bsd_args.cmd = SETVAL; + cmd = SETVAL; + semun.val = args->arg.val; break; case LINUX_IPC_SET: - bsd_args.cmd = IPC_SET; + cmd = IPC_SET; error = linux_semid_pullup(args->cmd & LINUX_IPC_64, &linux_semid, (caddr_t)PTRIN(args->arg.buf)); if (error) return (error); - unptr->buf = stackgap_alloc(&sg, sizeof(struct semid_ds)); - linux_to_bsd_semid_ds(&linux_semid, unptr->buf); - return __semctl(td, &bsd_args); + linux_to_bsd_semid_ds(&linux_semid, &semid); + semun.buf = &semid; + return kern_semctl(td, args->semid, args->semnum, cmd, &semun, + UIO_SYSSPACE); case LINUX_IPC_STAT: case LINUX_SEM_STAT: if((args->cmd & ~LINUX_IPC_64) == LINUX_IPC_STAT) - bsd_args.cmd = IPC_STAT; + cmd = IPC_STAT; else - bsd_args.cmd = SEM_STAT; - unptr->buf = stackgap_alloc(&sg, sizeof(struct semid_ds)); - error = __semctl(td, &bsd_args); + cmd = SEM_STAT; + semun.buf = &semid; + error = kern_semctl(td, args->semid, args->semnum, cmd, &semun, + UIO_SYSSPACE); if (error) - return error; - td->td_retval[0] = (bsd_args.cmd == SEM_STAT) ? - IXSEQ_TO_IPCID(bsd_args.semid, unptr->buf->sem_perm) : + return (error); + td->td_retval[0] = (cmd == SEM_STAT) ? + IXSEQ_TO_IPCID(args->semid, semid.sem_perm) : 0; - bsd_to_linux_semid_ds(unptr->buf, &linux_semid); + bsd_to_linux_semid_ds(&semid, &linux_semid); return (linux_semid_pushdown(args->cmd & LINUX_IPC_64, &linux_semid, (caddr_t)PTRIN(args->arg.buf))); case LINUX_IPC_INFO: @@ -580,7 +567,8 @@ linux_semctl(struct thread *td, struct linux_semctl_args *args) args->cmd & ~LINUX_IPC_64); return EINVAL; } - return __semctl(td, &bsd_args); + return kern_semctl(td, args->semid, args->semnum, cmd, &semun, + UIO_USERSPACE); } int diff --git a/sys/compat/svr4/svr4_ipc.c b/sys/compat/svr4/svr4_ipc.c index 0b6acbf..9eeaf24 100644 --- a/sys/compat/svr4/svr4_ipc.c +++ b/sys/compat/svr4/svr4_ipc.c @@ -105,8 +105,6 @@ static void bsd_to_svr4_semid_ds(const struct semid_ds *, struct svr4_semid_ds *); static void svr4_to_bsd_semid_ds(const struct svr4_semid_ds *, struct semid_ds *); -static int svr4_setsemun(caddr_t *sgp, union semun **argp, - union semun *usp); static int svr4_semop(struct thread *, void *); static int svr4_semget(struct thread *, void *); static int svr4_semctl(struct thread *, void *); @@ -194,16 +192,6 @@ svr4_to_bsd_semid_ds(sds, bds) bds->sem_pad2 = sds->sem_pad2; } -static int -svr4_setsemun(sgp, argp, usp) - caddr_t *sgp; - union semun **argp; - union semun *usp; -{ - *argp = stackgap_alloc(sgp, sizeof(union semun)); - return copyout((caddr_t)usp, *argp, sizeof(union semun)); -} - struct svr4_sys_semctl_args { int what; int semid; @@ -217,108 +205,71 @@ svr4_semctl(td, v) struct thread *td; void *v; { - int error; struct svr4_sys_semctl_args *uap = v; - struct __semctl_args ap; struct svr4_semid_ds ss; - struct semid_ds bs, *bsp; - caddr_t sg = stackgap_init(); - - ap.semid = uap->semid; - ap.semnum = uap->semnum; + struct semid_ds bs; + union semun semun; + int cmd, error; switch (uap->cmd) { case SVR4_SEM_GETZCNT: + cmd = GETZCNT; + break; + case SVR4_SEM_GETNCNT: + cmd = GETNCNT; + break; + case SVR4_SEM_GETPID: + cmd = GETPID; + break; + case SVR4_SEM_GETVAL: - switch (uap->cmd) { - case SVR4_SEM_GETZCNT: - ap.cmd = GETZCNT; - break; - case SVR4_SEM_GETNCNT: - ap.cmd = GETNCNT; - break; - case SVR4_SEM_GETPID: - ap.cmd = GETPID; - break; - case SVR4_SEM_GETVAL: - ap.cmd = GETVAL; - break; - } - return __semctl(td, &ap); + cmd = GETVAL; + break; case SVR4_SEM_SETVAL: - error = svr4_setsemun(&sg, &ap.arg, &uap->arg); - if (error) - return error; - ap.cmd = SETVAL; - return __semctl(td, &ap); + cmd = SETVAL; + break; case SVR4_SEM_GETALL: - error = svr4_setsemun(&sg, &ap.arg, &uap->arg); - if (error) - return error; - ap.cmd = GETVAL; - return __semctl(td, &ap); + cmd = GETVAL; + break; case SVR4_SEM_SETALL: - error = svr4_setsemun(&sg, &ap.arg, &uap->arg); - if (error) - return error; - ap.cmd = SETVAL; - return __semctl(td, &ap); + cmd = SETVAL; + break; case SVR4_IPC_STAT: - ap.cmd = IPC_STAT; - bsp = stackgap_alloc(&sg, sizeof(bs)); - error = svr4_setsemun(&sg, &ap.arg, - (union semun *)&bsp); + cmd = IPC_STAT; + semun.buf = &bs; + error = kern_semctl(td, uap->semid, uap->semnum, cmd, &semun, + UIO_SYSSPACE); if (error) - return error; - if ((error = __semctl(td, &ap)) != 0) - return error; - error = copyin((caddr_t)bsp, (caddr_t)&bs, sizeof(bs)); - if (error) return error; bsd_to_svr4_semid_ds(&bs, &ss); return copyout(&ss, uap->arg.buf, sizeof(ss)); case SVR4_IPC_SET: - ap.cmd = IPC_SET; - bsp = stackgap_alloc(&sg, sizeof(bs)); - error = svr4_setsemun(&sg, &ap.arg, - (union semun *)&bsp); - if (error) - return error; + cmd = IPC_SET; error = copyin(uap->arg.buf, (caddr_t) &ss, sizeof ss); if (error) return error; svr4_to_bsd_semid_ds(&ss, &bs); - error = copyout(&bs, bsp, sizeof(bs)); - if (error) - return error; - return __semctl(td, &ap); + semun.buf = &bs; + return kern_semctl(td, uap->semid, uap->semnum, cmd, &semun, + UIO_SYSSPACE); case SVR4_IPC_RMID: - ap.cmd = IPC_RMID; - bsp = stackgap_alloc(&sg, sizeof(bs)); - error = svr4_setsemun(&sg, &ap.arg, - (union semun *)&bsp); - if (error) - return error; - error = copyin(uap->arg.buf, &ss, sizeof ss); - if (error) - return error; - svr4_to_bsd_semid_ds(&ss, &bs); - error = copyout(&bs, bsp, sizeof(bs)); - if (error) - return error; - return __semctl(td, &ap); + cmd = IPC_RMID; + break; default: return EINVAL; } + + return kern_semctl(td, uap->semid, uap->semnum, cmd, &uap->arg, + UIO_USERSPACE); } struct svr4_sys_semget_args { diff --git a/sys/compat/svr4/syscalls.master b/sys/compat/svr4/syscalls.master index 4086a36..944ec75 100644 --- a/sys/compat/svr4/syscalls.master +++ b/sys/compat/svr4/syscalls.master @@ -102,7 +102,7 @@ 51 AUE_NULL UNIMPL acct 52 AUE_NULL STD { int svr4_sys_shmsys(int what, int a2, \ int a3, int a4, int a5); } -53 AUE_NULL STD { int svr4_sys_semsys(int what, int a2, \ +53 AUE_NULL MSTD { int svr4_sys_semsys(int what, int a2, \ int a3, int a4, int a5); } 54 AUE_NULL STD { int svr4_sys_ioctl(int fd, u_long com, \ caddr_t data); } |