generic sys_ipc wrapper
Subsystems (11)
PATCH 3/6 generic sys_ipc wrapper
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the sys_ipc are nearly identical.
There are slight differences in the types of the parameters, where mips and powerpc as the only 64-bit architectures with sys_ipc use unsigned long for the "third" argument as it gets casted to a pointer later, while it traditionally is an "int" like most other paramters. frv goes even further and uses unsigned long for all parameters execept for "ptr" which is a pointer type everywhere. The change from int to unsigned long for "third" and back to "int" for the others on frv should be fine due to the in-register calling conventions for syscalls (we already had a similar issue with the generic sys_ptrace), but I'd prefer to have the arch maintainers looks over this in details.
Except for that h8300, m68k and m68knommu lack an impplementation of the semtimedop sub call which this patch adds, and various architectures have different strategies for the SHMAT version 1 case which apparently never gets used - at least on i386 it seems superflous as the compat code on x86-64 and ia64 doesn't even bother to implement it.
ipc/syscall.c new file +99 -0
@@ -0,0 +1,99 @@ +/* +* sys_ipc() is the old de-multiplexer for the SysV IPC calls. +* +* This is really horribly ugly, and new architectures should just wire up +* the individual syscalls instead. +*/ +#include <linux/unistd.h> + +#ifdef __ARCH_WANT_SYS_IPC +#include <linux/errno.h> +#include <linux/ipc.h> +#include <linux/shm.h> +#include <linux/syscalls.h> +#include <linux/uaccess.h> + +SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second, + unsigned long, third, void __user *, ptr, long, fifth) +{ +int version, ret; + + version = call >>16 ;/* hack for backward compatibility */ + call &=0xffff ; + +switch (call) { +case SEMOP : +return sys_semtimedop (first, (struct sembuf __user *)ptr, + second,NULL ); +case SEMTIMEDOP : +return sys_semtimedop (first, (struct sembuf __user *)ptr, + second, + (const struct timespec __user *)fifth); + +case SEMGET : +return sys_semget (first, second, third); +case SEMCTL : { +union semun fourth; +if (!ptr) +return -EINVAL ; +if (get_user (fourth.__pad, (void __user *__user *) ptr)) +return -EFAULT ; +return sys_semctl (first, second, third, fourth); + } + +case MSGSND : +return sys_msgsnd (first, (struct msgbuf __user *) ptr, + second, third); +case MSGRCV : +switch (version) { +case 0 : { +struct ipc_kludge tmp; +if (!ptr) +return -EINVAL ; + +if (copy_from_user (&tmp, + (struct ipc_kludge __user *) ptr, +sizeof (tmp))) +return -EFAULT ; +return sys_msgrcv (first, tmp.msgp, second, + tmp.msgtyp, third); + } +default : +return sys_msgrcv (first, + (struct msgbuf __user *) ptr, + second, fifth, third); + } +case MSGGET : +return sys_msgget ((key_t ) first, second); +case MSGCTL : +return sys_msgctl (first, second, (struct msqid_ds __user *)ptr); + +case SHMAT : +switch (version) { +default : { +unsigned long raddr; + ret =do_shmat (first, (char __user *)ptr, + second, &raddr); +if (ret) +return ret; +return put_user (raddr, (unsigned long __user *) third); + } +case 1 : +/* +* This was the entry point for kernel-originating calls +* from iBCS2 in 2.2 days. +*/ +return -EINVAL ; + } +case SHMDT : +return sys_shmdt ((char __user *)ptr); +case SHMGET : +return sys_shmget (first, second, third); +case SHMCTL : +return sys_shmctl (first, second, + (struct shmid_ds __user *) ptr); +default : +return -ENOSYS ; + } +} +#endif
arch/arm/kernel/sys_arm.c +0 -82
88 lines not on this page · raw message
arch/arm/kernel/sys_oabi-compat.c +0 -3
@@ -346,9 +346,6 @@ asmlinkage long sys_oabi_semop(int semidreturn sys_oabi_semtimedop (semid, tsops, nsops,NULL ); } -extern asmlinkage int sys_ipc(uint call, int first, int second, int third, -void __user *ptr,long fifth); - asmlinkage int sys_oabi_ipc(uint call, int first, int second, int third,void __user *ptr,long fifth) {
arch/cris/kernel/sys_cris.c +0 -78
81 lines not on this page · raw message
arch/frv/kernel/sys_frv.c +0 -89
92 lines not on this page · raw message
arch/m32r/kernel/sys_m32r.c +0 -81
87 lines not on this page · raw message
arch/m68k/kernel/sys_m68k.c +0 -81
87 lines not on this page · raw message
arch/mips/kernel/syscall.c +0 -88
94 lines not on this page · raw message
arch/mn10300/kernel/sys_mn10300.c +0 -88
91 lines not on this page · raw message
arch/powerpc/include/asm/syscalls.h +0 -2
@@ -35,8 +35,6 @@ asmlinkage long sys_pipe2(int __user *fiasmlinkage long sys_rt_sigaction (int sig,const struct sigaction __user *act,struct sigaction __user *oact,size_t sigsetsize); -asmlinkage int sys_ipc(uint call, int first, unsigned long second, -long third,void __user *ptr,long fifth);asmlinkage long ppc64_personality (unsigned long personality); asmlinkage int ppc_rtas(struct rtas_args __user *uargs); asmlinkage time_t sys64_time(time_t __user * tloc);
arch/powerpc/kernel/syscalls.c +0 -94
100 lines not on this page · raw message
arch/s390/kernel/entry.h +1 -1
@@ -30,7 +30,7 @@ struct fadvise64_64_args;struct old_sigaction ;long sys_mmap2 (struct s390_mmap_arg_struct __user *arg); -long sys_ipc (uint call,int first,unsigned long second, +long sys_s390_ipc (uint call,int first,unsigned long second,unsigned long third,void __user *ptr);long sys_s390_newuname (struct new_utsname __user *name);long sys_s390_personality (unsigned long personality);
arch/s390/kernel/sys_s390.c +1 -1
@@ -64,7 +64,7 @@ out:* * This is really horribly ugly. */ -SYSCALL_DEFINE5(ipc, uint, call, int, first, unsigned long, second, +SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second, unsigned long, third, void __user *, ptr) {struct ipc_kludge tmp;
arch/s390/kernel/syscalls.S +1 -1
@@ -125,7 +125,7 @@ NI_SYSCALL /* vm86old for i386 */ SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4_wrapper) SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper) /* 115 */ SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) -SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper) +SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper) SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper) SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn) SYSCALL(sys_clone,sys_clone,sys_clone_wrapper) /* 120 */
arch/sh/include/asm/syscalls.h +0 -2
@@ -11,8 +11,6 @@ asmlinkage int old_mmap(unsigned long adasmlinkage long sys_mmap2 (unsigned long addr,unsigned long len,unsigned long prot,unsigned long flags,unsigned long fd,unsigned long pgoff); -asmlinkage int sys_ipc(uint call, int first, int second, -int third,void __user *ptr,long fifth); asmlinkage int sys_uname(struct old_utsname __user *name);#ifdef CONFIG_SUPERH32
arch/sh/kernel/sys_sh.c +0 -104
110 lines not on this page · raw message
arch/sparc/kernel/sys_sparc_32.c +0 -113
119 lines not on this page · raw message
arch/um/sys-i386/syscalls.c +0 -86
92 lines not on this page · raw message
arch/x86/include/asm/syscalls.h +0 -1
@@ -54,7 +54,6 @@ unsigned long sys_sigreturn(struct pt_restruct oldold_utsname ;struct old_utsname ; -asmlinkage int sys_ipc(uint, int, int, int, void __user *, long); asmlinkage int sys_uname(struct old_utsname __user *); asmlinkage int sys_olduname(struct oldold_utsname __user *);
ipc/Makefile +1 -1
@@ -3,7 +3,7 @@ # obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o -obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o ipcns_notifier.o +obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o ipcns_notifier.o syscall.o obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o obj_mq-$(CONFIG_COMPAT) += compat_mq.o obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
arch/h8300/kernel/sys_h8300.c +0 -88
94 lines not on this page · raw message
arch/m68knommu/kernel/sys_m68k.c +0 -86
92 lines not on this page · raw message
arch/sparc/kernel/sys_sparc_64.c +1 -1
@@ -427,7 +427,7 @@ out:* This is really horribly ugly. */ -SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, +SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second, unsigned long, third, void __user *, ptr, long, fifth) {long err;
arch/sparc/kernel/systbls.h +1 -1
@@ -10,7 +10,7 @@ struct new_utsname;extern asmlinkage unsigned long sys_getpagesize (void );extern asmlinkage long sparc_pipe (struct pt_regs *regs); -extern asmlinkage long sys_ipc (unsigned int call,int first, +extern asmlinkage long sys_sparc_ipc (unsigned int call,int first,unsigned long second,unsigned long third,void __user *ptr,long fifth);
arch/sparc/kernel/systbls_64.S +1 -1
@@ -136,7 +136,7 @@ sys_call_table: /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 /*210*/ .word sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo - .word sys_ipc, sys_nis_syscall, sys_clone, sys_ioprio_get, sys_adjtimex + .word sys_sparc_ipc, sys_nis_syscall, sys_clone, sys_ioprio_get, sys_adjtimex /*220*/ .word sys_nis_syscall, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid, sys_setfsgid /*230*/ .word sys_select, sys_nis_syscall, sys_splice, sys_stime, sys_statfs64
arch/x86/kernel/sys_i386_32.c +0 -85
91 lines not on this page · raw message
arch/arm/include/asm/unistd.h +1 -0
@@ -448,6 +448,7 @@#if !defined(CONFIG_AEABI ) || defined(CONFIG_OABI_COMPAT )#define __ARCH_WANT_SYS_TIME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_OLDUMOUNT#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_UTIME
arch/cris/include/asm/unistd.h +1 -0
@@ -352,6 +352,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/frv/include/asm/unistd.h +1 -0
@@ -354,6 +354,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM/* #define __ARCH_WANT_SYS_GETHOSTNAME */ +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE/* #define __ARCH_WANT_SYS_SGETMASK */ /* #define __ARCH_WANT_SYS_SIGNAL */
arch/h8300/include/asm/unistd.h +1 -0
@@ -336,6 +336,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/m32r/include/asm/unistd.h +1 -0
@@ -339,6 +339,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_TIME#define __ARCH_WANT_SYS_UTIME
arch/m68k/include/asm/unistd.h +1 -0
@@ -347,6 +347,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/mips/include/asm/unistd.h +1 -0
@@ -1004,6 +1004,7 @@#define __ARCH_WANT_OLD_READDIR#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_UTIME
arch/mn10300/include/asm/unistd.h +1 -0
@@ -363,6 +363,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/powerpc/include/asm/unistd.h +1 -0
@@ -364,6 +364,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/sh/include/asm/unistd_32.h +1 -0
@@ -358,6 +358,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/sh/include/asm/unistd_64.h +1 -0
@@ -398,6 +398,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
arch/sparc/include/asm/unistd.h +3 -1
@@ -432,7 +432,9 @@#define __ARCH_WANT_SYS_SIGPENDING#define __ARCH_WANT_SYS_SIGPROCMASK#define __ARCH_WANT_SYS_RT_SIGSUSPEND -#ifndef __32bit_syscall_numbers__ +#ifdef __32bit_syscall_numbers__ +#define __ARCH_WANT_SYS_IPC +#else #define __ARCH_WANT_COMPAT_SYS_TIME#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND#endif
arch/x86/include/asm/unistd_32.h +1 -0
@@ -354,6 +354,7 @@#define __ARCH_WANT_STAT64#define __ARCH_WANT_SYS_ALARM#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_IPC#define __ARCH_WANT_SYS_PAUSE#define __ARCH_WANT_SYS_SGETMASK#define __ARCH_WANT_SYS_SIGNAL
include/linux/syscalls.h +2 -0
@@ -684,6 +684,8 @@ asmlinkage long sys_shmat(int shmid, chaasmlinkage long sys_shmget (key_t key,size_t size,int flag);asmlinkage long sys_shmdt (char __user *shmaddr);asmlinkage long sys_shmctl (int shmid,int cmd,struct shmid_ds __user *buf); +asmlinkage long sys_ipc (unsigned int call,int first,int second, +unsigned long third,void __user *ptr,long fifth);asmlinkage long sys_mq_open (const char __user *name,int oflag,mode_t mode,struct mq_attr __user *attr);asmlinkage long sys_mq_unlink (const char __user *name);
Quoted 15 lines · Christoph Hellwig
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the
sys_ipcare nearly identical.There are slight differences in the types of the parameters, where mips and powerpc as the only 64-bit architectures with
sys_ipcuse unsigned long for the "third" argument as it gets casted to a pointer later, while it traditionally is an "int" like most other paramters. frv goes even further and uses unsigned long for all parameters execept for "ptr" which is a pointer type everywhere. The change from int to unsigned long for "third" and back to "int" for the others on frv should be fine due to the in-register calling conventions for syscalls (we already had a similar issue with the genericsys_ptrace), but I'd prefer to have the arch maintainers looks over this in details.
Quoted 8 lines
Except for that h8300, m68k and m68knommu lack an impplementation of the semtimedop sub call which this patch adds, and various architectures have different strategies for the SHMAT version 1 case which apparently never gets used - at least on i386 it seems superflous as the compat code on x86-64 and ia64 doesn't even bother to implement it.
Signed-off-by Christoph Hellwig <[email protected]>
Looks good from an x86 perspective.
Quoted 14 lines · Christoph Hellwig
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the
sys_ipcare nearly identical.There are slight differences in the types of the parameters, where mips and powerpc as the only 64-bit architectures with
sys_ipcuse unsigned long for the "third" argument as it gets casted to a pointer later, while it traditionally is an "int" like most other paramters. frv goes even further and uses unsigned long for all parameters execept for "ptr" which is a pointer type everywhere. The change from int to unsigned long for "third" and back to "int" for the others on frv should be fine due to the in-register calling conventions for syscalls (we already had a similar issue with the genericsys_ptrace), but I'd prefer to have the arch maintainers looks over this in details.
Quoted 1 line
From an ARM perspective, it looks like nothing actually changes, so...
Signature · 3 lines
Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of:
Quoted 14 lines · Christoph Hellwig
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the
sys_ipcare nearly identical.There are slight differences in the types of the parameters, where mips and powerpc as the only 64-bit architectures with
sys_ipcuse unsigned long for the "third" argument as it gets casted to a pointer later, while it traditionally is an "int" like most other paramters. frv goes even further and uses unsigned long for all parameters execept for "ptr" which is a pointer type everywhere. The change from int to unsigned long for "third" and back to "int" for the others on frv should be fine due to the in-register calling conventions for syscalls (we already had a similar issue with the genericsys_ptrace), but I'd prefer to have the arch maintainers looks over this in details.
Quoted 8 lines
Except for that h8300, m68k and m68knommu lack an impplementation of the semtimedop sub call which this patch adds, and various architectures have different strategies for the SHMAT version 1 case which apparently never gets used - at least on i386 it seems superflous as the compat code on x86-64 and ia64 doesn't even bother to implement it.
Signed-off-by Christoph Hellwig <[email protected]>
For the m68knommup parts
Signature · 5 lines
------------------------------------------------------------------------ Greg Ungerer -- Principal Engineer EMAIL: [email protected] SnapGear Group, McAfee PHONE: +61 7 3435 2888 8 Gardner Close FAX: +61 7 3217 5323 Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com
Quoted 14 lines · Christoph Hellwig
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the
sys_ipcare nearly identical.There are slight differences in the types of the parameters, where mips and powerpc as the only 64-bit architectures with
sys_ipcuse unsigned long for the "third" argument as it gets casted to a pointer later, while it traditionally is an "int" like most other paramters. frv goes even further and uses unsigned long for all parameters execept for "ptr" which is a pointer type everywhere. The change from int to unsigned long for "third" and back to "int" for the others on frv should be fine due to the in-register calling conventions for syscalls (we already had a similar issue with the genericsys_ptrace), but I'd prefer to have the arch maintainers looks over this in details.
Quoted 8 lines
Except for that h8300, m68k and m68knommu lack an impplementation of the semtimedop sub call which this patch adds, and various architectures have different strategies for the SHMAT version 1 case which apparently never gets used - at least on i386 it seems superflous as the compat code on x86-64 and ia64 doesn't even bother to implement it.
Signed-off-by Christoph Hellwig <[email protected]>
sh bits look fine, too.
Quoted 14 lines · Christoph Hellwig
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the
sys_ipcare nearly identical.There are slight differences in the types of the parameters, where mips and powerpc as the only 64-bit architectures with
sys_ipcuse unsigned long for the "third" argument as it gets casted to a pointer later, while it traditionally is an "int" like most other paramters. frv goes even further and uses unsigned long for all parameters execept for "ptr" which is a pointer type everywhere. The change from int to unsigned long for "third" and back to "int" for the others on frv should be fine due to the in-register calling conventions for syscalls (we already had a similar issue with the genericsys_ptrace), but I'd prefer to have the arch maintainers looks over this in details.
Quoted 8 lines
Except for that h8300, m68k and m68knommu lack an impplementation of the semtimedop sub call which this patch adds, and various architectures have different strategies for the SHMAT version 1 case which apparently never gets used - at least on i386 it seems superflous as the compat code on x86-64 and ia64 doesn't even bother to implement it.
Signed-off-by Christoph Hellwig <[email protected]>
Quoted 4 lines · Christoph Hellwig
Add a generic implementation of the ipc demultiplexer syscall. Except for s390 and sparc64 all implementations of the
sys_ipcare nearly identical. <...>Signed-off-by Christoph Hellwig <[email protected]>
Thanks Christoph! I had started cleaning this up a few years ago when I was debugging some IPC issues on parisc with the individual calls. Never saw it through though.
emphatically Acked-by: Kyle McMartin <[email protected]>