diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-01 07:21:43 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-01 07:21:43 -0700 | 
| commit | 08d76760832993050ad8c25e63b56773ef2ca303 (patch) | |
| tree | abdcf148dfe43cd49f30f204f1dac6978107a508 | |
| parent | 5f56886521d6ddd3648777fae44d82382dd8c87f (diff) | |
| parent | 99e621f796d7f0341a51e8cdf32b81663b10b448 (diff) | |
| download | olio-linux-3.10-08d76760832993050ad8c25e63b56773ef2ca303.tar.xz olio-linux-3.10-08d76760832993050ad8c25e63b56773ef2ca303.zip | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull compat cleanup from Al Viro:
 "Mostly about syscall wrappers this time; there will be another pile
  with patches in the same general area from various people, but I'd
  rather push those after both that and vfs.git pile are in."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal:
  syscalls.h: slightly reduce the jungles of macros
  get rid of union semop in sys_semctl(2) arguments
  make do_mremap() static
  sparc: no need to sign-extend in sync_file_range() wrapper
  ppc compat wrappers for add_key(2) and request_key(2) are pointless
  x86: trim sys_ia32.h
  x86: sys32_kill and sys32_mprotect are pointless
  get rid of compat_sys_semctl() and friends in case of ARCH_WANT_OLD_COMPAT_IPC
  merge compat sys_ipc instances
  consolidate compat lookup_dcookie()
  convert vmsplice to COMPAT_SYSCALL_DEFINE
  switch getrusage() to COMPAT_SYSCALL_DEFINE
  switch epoll_pwait to COMPAT_SYSCALL_DEFINE
  convert sendfile{,64} to COMPAT_SYSCALL_DEFINE
  switch signalfd{,4}() to COMPAT_SYSCALL_DEFINE
  make SYSCALL_DEFINE<n>-generated wrappers do asmlinkage_protect
  make HAVE_SYSCALL_WRAPPERS unconditional
  consolidate cond_syscall and SYSCALL_ALIAS declarations
  teach SYSCALL_DEFINE<n> how to deal with long long/unsigned long long
  get rid of duplicate logics in __SC_....[1-6] definitions
87 files changed, 537 insertions, 1487 deletions
| diff --git a/arch/Kconfig b/arch/Kconfig index 1455579791e..99f0e17df42 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -157,9 +157,6 @@ config ARCH_USE_BUILTIN_BSWAP  	 instructions should set this. And it shouldn't hurt to set it  	 on architectures that don't have such instructions. -config HAVE_SYSCALL_WRAPPERS -	bool -  config KRETPROBES  	def_bool y  	depends on KPROBES && HAVE_KRETPROBES diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 8a33ba01301..8629127640c 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -4,7 +4,6 @@ config ALPHA  	select HAVE_AOUT  	select HAVE_IDE  	select HAVE_OPROFILE -	select HAVE_SYSCALL_WRAPPERS  	select HAVE_PCSPKR_PLATFORM  	select HAVE_PERF_EVENTS  	select HAVE_DMA_ATTRS diff --git a/arch/alpha/include/asm/linkage.h b/arch/alpha/include/asm/linkage.h index 291c2d01c44..7cfd06e8c93 100644 --- a/arch/alpha/include/asm/linkage.h +++ b/arch/alpha/include/asm/linkage.h @@ -1,6 +1,8 @@  #ifndef __ASM_LINKAGE_H  #define __ASM_LINKAGE_H -/* Nothing to see here... */ +#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall") +#define SYSCALL_ALIAS(alias, name)					\ +	asm ( #alias " = " #name "\n\t.globl " #alias)  #endif diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index 6d6fe7ab547..43baee17acd 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h @@ -18,16 +18,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* "Conditional" syscalls.  What we want is - -	__attribute__((weak,alias("sys_ni_syscall"))) - -   but that raises the problem of what type to give the symbol.  If we use -   a prototype, it'll conflict with the definition given in this file and -   others.  If we use __typeof, we discover that not all symbols actually -   have declarations.  If we use no prototype, then we get warnings from -   -Wstrict-prototypes.  Ho hum.  */ - -#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall") -  #endif /* _ALPHA_UNISTD_H */ diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index e4ddfb39ca3..141baa3f9a7 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h @@ -44,14 +44,6 @@  #define __ARCH_WANT_SYS_CLONE  /* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") - -/*   * Unimplemented (or alternatively implemented) syscalls   */  #define __IGNORE_fadvise64_64 diff --git a/arch/arm64/kernel/sys32.S b/arch/arm64/kernel/sys32.S index 9416d045a68..db01aa978c4 100644 --- a/arch/arm64/kernel/sys32.S +++ b/arch/arm64/kernel/sys32.S @@ -84,13 +84,6 @@ compat_sys_readahead_wrapper:  	b	sys_readahead  ENDPROC(compat_sys_readahead_wrapper) -compat_sys_lookup_dcookie: -	orr	x0, x0, x1, lsl #32 -	mov	w1, w2 -	mov	w2, w3 -	b	sys_lookup_dcookie -ENDPROC(compat_sys_lookup_dcookie) -  compat_sys_fadvise64_64_wrapper:  	mov	w6, w1  	orr	x1, x2, x3, lsl #32 diff --git a/arch/avr32/include/asm/unistd.h b/arch/avr32/include/asm/unistd.h index dc4d5a93111..c1eb080e45f 100644 --- a/arch/avr32/include/asm/unistd.h +++ b/arch/avr32/include/asm/unistd.h @@ -41,12 +41,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); -  #endif /* __ASM_AVR32_UNISTD_H */ diff --git a/arch/blackfin/include/asm/unistd.h b/arch/blackfin/include/asm/unistd.h index 04e83ea8d5c..c35414bdf7b 100644 --- a/arch/blackfin/include/asm/unistd.h +++ b/arch/blackfin/include/asm/unistd.h @@ -20,12 +20,4 @@  #define __ARCH_WANT_SYS_NICE  #define __ARCH_WANT_SYS_VFORK -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t_" #x "\n\t.set\t_" #x ",_sys_ni_syscall"); -  #endif				/* __ASM_BFIN_UNISTD_H */ diff --git a/arch/cris/include/asm/unistd.h b/arch/cris/include/asm/unistd.h index be57a988bfb..0ff3f688984 100644 --- a/arch/cris/include/asm/unistd.h +++ b/arch/cris/include/asm/unistd.h @@ -34,12 +34,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #endif /* _ASM_CRIS_UNISTD_H_ */ diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h index 4cfcc7bba25..70ec7293dce 100644 --- a/arch/frv/include/asm/unistd.h +++ b/arch/frv/include/asm/unistd.h @@ -31,14 +31,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#ifndef cond_syscall -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -#endif -  #endif /* _ASM_UNISTD_H_ */ diff --git a/arch/h8300/include/asm/linkage.h b/arch/h8300/include/asm/linkage.h index 6f4df7d4618..1d81604fb0a 100644 --- a/arch/h8300/include/asm/linkage.h +++ b/arch/h8300/include/asm/linkage.h @@ -2,7 +2,5 @@  #define _H8300_LINKAGE_H  #undef SYMBOL_NAME_LABEL -#undef SYMBOL_NAME  #define SYMBOL_NAME_LABEL(_name_) _##_name_##: -#define SYMBOL_NAME(_name_) _##_name_  #endif diff --git a/arch/h8300/include/asm/unistd.h b/arch/h8300/include/asm/unistd.h index 6721856d841..ab671ecf519 100644 --- a/arch/h8300/include/asm/unistd.h +++ b/arch/h8300/include/asm/unistd.h @@ -33,11 +33,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - */ -#define cond_syscall(name)						\ -  asm (".weak\t_" #name "\n"				\ -       ".set\t_" #name ",_sys_ni_syscall"); -  #endif /* _ASM_H8300_UNISTD_H_ */ diff --git a/arch/ia64/include/asm/linkage.h b/arch/ia64/include/asm/linkage.h index ef22a45c189..787575701f1 100644 --- a/arch/ia64/include/asm/linkage.h +++ b/arch/ia64/include/asm/linkage.h @@ -11,4 +11,8 @@  #endif +#define cond_syscall(x) asm(".weak\t" #x "#\n" #x "#\t=\tsys_ni_syscall#") +#define SYSCALL_ALIAS(alias, name)					\ +	asm ( #alias "# = " #name "#\n\t.globl " #alias "#") +  #endif diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index 096373800f7..afd45e0d552 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h @@ -46,15 +46,5 @@ asmlinkage unsigned long sys_mmap2(  struct pt_regs;  asmlinkage long sys_ia64_pipe(void); -/* - * "Conditional" syscalls - * - * Note, this macro can only be used in the file which defines sys_ni_syscall, i.e., in - * kernel/sys_ni.c.  This version causes warnings because the declaration isn't a - * proper prototype, but we can't use __typeof__ either, because not all cond_syscall() - * declarations have prototypes at the moment. - */ -#define cond_syscall(x) asmlinkage long x (void) __attribute__((weak,alias("sys_ni_syscall"))) -  #endif /* !__ASSEMBLY__ */  #endif /* _ASM_IA64_UNISTD_H */ diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h index 555629b0526..59db8019345 100644 --- a/arch/m32r/include/asm/unistd.h +++ b/arch/m32r/include/asm/unistd.h @@ -48,14 +48,4 @@  #define __IGNORE_getresgid  #define __IGNORE_chown -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#ifndef cond_syscall -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -#endif -  #endif /* _ASM_M32R_UNISTD_H */ diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 6cd92671ca5..014f288fc81 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h @@ -32,12 +32,4 @@  #define __ARCH_WANT_SYS_FORK  #define __ARCH_WANT_SYS_VFORK -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #endif /* _ASM_M68K_UNISTD_H_ */ diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index b3778391d9c..6dece2d002d 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h @@ -37,13 +37,5 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_FORK -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); -  #endif /* __ASSEMBLY__ */  #endif /* _ASM_MICROBLAZE_UNISTD_H */ diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 007a917a980..e5f3794744f 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1739,7 +1739,6 @@ config 32BIT  config 64BIT  	bool "64-bit kernel"  	depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL -	select HAVE_SYSCALL_WRAPPERS  	help  	  Select this option if you want to build a 64-bit kernel. diff --git a/arch/mips/include/asm/linkage.h b/arch/mips/include/asm/linkage.h index e9a940d1b0c..2767dda9e30 100644 --- a/arch/mips/include/asm/linkage.h +++ b/arch/mips/include/asm/linkage.h @@ -6,5 +6,8 @@  #endif  #define __weak __attribute__((weak)) +#define cond_syscall(x) asm(".weak\t" #x "\n" #x "\t=\tsys_ni_syscall") +#define SYSCALL_ALIAS(alias, name)					\ +	asm ( #alias " = " #name "\n\t.globl " #alias)  #endif diff --git a/arch/mips/include/asm/unistd.h b/arch/mips/include/asm/unistd.h index 64f661e3287..63c9c886173 100644 --- a/arch/mips/include/asm/unistd.h +++ b/arch/mips/include/asm/unistd.h @@ -63,12 +63,4 @@  #endif /* !__ASSEMBLY__ */ -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n" #x "\t=\tsys_ni_syscall") -  #endif /* _ASM_UNISTD_H */ diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index db9655f0889..d1d576b765f 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -119,99 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,  	return sys_pwrite64(fd, buf, count, merge_64(a4, a5));  } -#ifdef CONFIG_SYSVIPC - -SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, -	unsigned long, ptr, unsigned long, fifth) -{ -	int version, err; - -	version = call >> 16; /* hack for backward compatibility */ -	call &= 0xffff; - -	switch (call) { -	case SEMOP: -		/* struct sembuf is the same on 32 and 64bit :)) */ -		err = sys_semtimedop(first, compat_ptr(ptr), second, NULL); -		break; -	case SEMTIMEDOP: -		err = compat_sys_semtimedop(first, compat_ptr(ptr), second, -					    compat_ptr(fifth)); -		break; -	case SEMGET: -		err = sys_semget(first, second, third); -		break; -	case SEMCTL: -		err = compat_sys_semctl(first, second, third, compat_ptr(ptr)); -		break; -	case MSGSND: -		err = compat_sys_msgsnd(first, second, third, compat_ptr(ptr)); -		break; -	case MSGRCV: -		err = compat_sys_msgrcv(first, second, fifth, third, -					version, compat_ptr(ptr)); -		break; -	case MSGGET: -		err = sys_msgget((key_t) first, second); -		break; -	case MSGCTL: -		err = compat_sys_msgctl(first, second, compat_ptr(ptr)); -		break; -	case SHMAT: -		err = compat_sys_shmat(first, second, third, version, -				       compat_ptr(ptr)); -		break; -	case SHMDT: -		err = sys_shmdt(compat_ptr(ptr)); -		break; -	case SHMGET: -		err = sys_shmget(first, (unsigned)second, third); -		break; -	case SHMCTL: -		err = compat_sys_shmctl(first, second, compat_ptr(ptr)); -		break; -	default: -		err = -ENOSYS; -		break; -	} - -	return err; -} - -#else - -SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third, -	u32, ptr, u32, fifth) -{ -	return -ENOSYS; -} - -#endif /* CONFIG_SYSVIPC */ - -#ifdef CONFIG_MIPS32_N32 -SYSCALL_DEFINE4(n32_semctl, int, semid, int, semnum, int, cmd, u32, arg) -{ -	/* compat_sys_semctl expects a pointer to union semun */ -	u32 __user *uptr = compat_alloc_user_space(sizeof(u32)); -	if (put_user(arg, uptr)) -		return -EFAULT; -	return compat_sys_semctl(semid, semnum, cmd, uptr); -} - -SYSCALL_DEFINE4(n32_msgsnd, int, msqid, u32, msgp, unsigned int, msgsz, -	int, msgflg) -{ -	return compat_sys_msgsnd(msqid, msgsz, msgflg, compat_ptr(msgp)); -} - -SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz, -	int, msgtyp, int, msgflg) -{ -	return compat_sys_msgrcv(msqid, msgsz, msgtyp, msgflg, IPC_64, -				 compat_ptr(msgp)); -} -#endif -  SYSCALL_DEFINE1(32_personality, unsigned long, personality)  {  	unsigned int p = personality & 0xffffffff; @@ -226,26 +133,6 @@ SYSCALL_DEFINE1(32_personality, unsigned long, personality)  	return ret;  } -SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd, -	compat_off_t __user *, offset, s32, count) -{ -	mm_segment_t old_fs = get_fs(); -	int ret; -	off_t of; - -	if (offset && get_user(of, offset)) -		return -EFAULT; - -	set_fs(KERNEL_DS); -	ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL, count); -	set_fs(old_fs); - -	if (offset && put_user(of, offset)) -		return -EFAULT; - -	return ret; -} -  asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3,  				   size_t count)  { @@ -279,12 +166,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,  			     merge_64(len_a4, len_a5));  } -asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf, -	size_t len) -{ -	return sys_lookup_dcookie(merge_64(a0, a1), buf, len); -} -  SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags,  		u64, a3, u64, a4, int, dfd, const char	__user *, pathname)  { diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 693d60b0855..edcb6594e7b 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -143,7 +143,7 @@ EXPORT(sysn32_call_table)  	PTR	compat_sys_setitimer  	PTR	sys_alarm  	PTR	sys_getpid -	PTR	sys_32_sendfile +	PTR	compat_sys_sendfile  	PTR	sys_socket			/* 6040 */  	PTR	sys_connect  	PTR	sys_accept @@ -168,11 +168,11 @@ EXPORT(sysn32_call_table)  	PTR	sys_newuname  	PTR	sys_semget  	PTR	sys_semop -	PTR	sys_n32_semctl +	PTR	compat_sys_semctl  	PTR	sys_shmdt			/* 6065 */  	PTR	sys_msgget -	PTR	sys_n32_msgsnd -	PTR	sys_n32_msgrcv +	PTR	compat_sys_msgsnd +	PTR	compat_sys_msgrcv  	PTR	compat_sys_msgctl  	PTR	compat_sys_fcntl		/* 6070 */  	PTR	sys_flock diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index af8887f779f..103bfe570fe 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -309,7 +309,7 @@ sys_call_table:  	PTR	compat_sys_wait4  	PTR	sys_swapoff			/* 4115 */  	PTR	compat_sys_sysinfo -	PTR	sys_32_ipc +	PTR	compat_sys_ipc  	PTR	sys_fsync  	PTR	sys32_sigreturn  	PTR	__sys_clone			/* 4120 */ @@ -399,7 +399,7 @@ sys_call_table:  	PTR	sys_capget  	PTR	sys_capset			/* 4205 */  	PTR	compat_sys_sigaltstack -	PTR	sys_32_sendfile +	PTR	compat_sys_sendfile  	PTR	sys_ni_syscall  	PTR	sys_ni_syscall  	PTR	sys_mips_mmap2			/* 4210 */ @@ -439,7 +439,7 @@ sys_call_table:  	PTR	compat_sys_io_submit  	PTR	sys_io_cancel			/* 4245 */  	PTR	sys_exit_group -	PTR	sys32_lookup_dcookie +	PTR	compat_sys_lookup_dcookie  	PTR	sys_epoll_create  	PTR	sys_epoll_ctl  	PTR	sys_epoll_wait			/* 4250 */ diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index 7f9d9adfa51..9d4e2d1ef90 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h @@ -45,14 +45,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#ifndef cond_syscall -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); -#endif -  #endif /* _ASM_UNISTD_H */ diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index ae9a46cbfd9..74d835820ee 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h @@ -170,12 +170,4 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\  #undef STR -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #endif /* _ASM_PARISC_UNISTD_H_ */ diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 051c8b90231..f517e08e7f0 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c @@ -60,47 +60,6 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,      return -ENOSYS;  } -/* Note: it is necessary to treat out_fd and in_fd as unsigned ints, with the - * corresponding cast to a signed int to insure that the proper conversion - * (sign extension) between the register representation of a signed int (msr in - * 32-bit mode) and the register representation of a signed int (msr in 64-bit - * mode) is performed. - */ -asmlinkage long sys32_sendfile(u32 out_fd, u32 in_fd, -			       compat_off_t __user *offset, compat_size_t count) -{ -	return compat_sys_sendfile((int)out_fd, (int)in_fd, offset, count); -} - -asmlinkage long sys32_sendfile64(u32 out_fd, u32 in_fd, -				 compat_loff_t __user *offset, compat_size_t count) -{ -	return sys_sendfile64((int)out_fd, (int)in_fd, -				(loff_t __user *)offset, count); -} - -asmlinkage long sys32_semctl(int semid, int semnum, int cmd, union semun arg) -{ -        union semun u; -	 -        if (cmd == SETVAL) { -                /* Ugh.  arg is a union of int,ptr,ptr,ptr, so is 8 bytes. -                 * The int should be in the first 4, but our argument -                 * frobbing has left it in the last 4. -                 */ -                u.val = *((int *)&arg + 1); -                return sys_semctl (semid, semnum, cmd, u); -	} -	return sys_semctl (semid, semnum, cmd, arg); -} - -long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char __user *buf, -			  size_t len) -{ -	return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low, -				  buf, len); -} -  asmlinkage long compat_sys_fanotify_mark(int fan_fd, int flags, u32 mask_hi,  					 u32 mask_lo, int fd,  					 const char __user *pathname) diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index f57dc137b8d..0c9107285e6 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S @@ -198,7 +198,7 @@  	ENTRY_SAME(madvise)  	ENTRY_SAME(clone_wrapper)	/* 120 */  	ENTRY_SAME(setdomainname) -	ENTRY_DIFF(sendfile) +	ENTRY_COMP(sendfile)  	/* struct sockaddr... */  	ENTRY_SAME(recvfrom)  	/* struct timex contains longs */ @@ -282,7 +282,7 @@  	ENTRY_COMP(recvmsg)  	ENTRY_SAME(semop)		/* 185 */  	ENTRY_SAME(semget) -	ENTRY_DIFF(semctl) +	ENTRY_COMP(semctl)  	ENTRY_COMP(msgsnd)  	ENTRY_COMP(msgrcv)  	ENTRY_SAME(msgget)		/* 190 */ @@ -304,7 +304,7 @@  	ENTRY_SAME(gettid)  	ENTRY_OURS(readahead)  	ENTRY_SAME(tkill) -	ENTRY_DIFF(sendfile64) +	ENTRY_COMP(sendfile64)  	ENTRY_COMP(futex)		/* 210 */  	ENTRY_COMP(sched_setaffinity)  	ENTRY_COMP(sched_getaffinity) @@ -318,7 +318,7 @@  	ENTRY_SAME(alloc_hugepages)	/* 220 */  	ENTRY_SAME(free_hugepages)  	ENTRY_SAME(exit_group) -	ENTRY_DIFF(lookup_dcookie) +	ENTRY_COMP(lookup_dcookie)  	ENTRY_SAME(epoll_create)  	ENTRY_SAME(epoll_ctl)		/* 225 */  	ENTRY_SAME(epoll_wait) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index ea5bb045983..a0259edae5c 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -114,7 +114,6 @@ config PPC  	select USE_GENERIC_SMP_HELPERS if SMP  	select HAVE_OPROFILE  	select HAVE_DEBUG_KMEMLEAK -	select HAVE_SYSCALL_WRAPPERS if PPC64  	select GENERIC_ATOMIC64 if PPC32  	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE  	select HAVE_PERF_EVENTS diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h new file mode 100644 index 00000000000..b36f650a13f --- /dev/null +++ b/arch/powerpc/include/asm/linkage.h @@ -0,0 +1,13 @@ +#ifndef _ASM_POWERPC_LINKAGE_H +#define _ASM_POWERPC_LINKAGE_H + +#ifdef CONFIG_PPC64 +#define cond_syscall(x) \ +	asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n"		\ +	     "\t.weak ." #x "\n\t.set ." #x ", .sys_ni_syscall\n") +#define SYSCALL_ALIAS(alias, name)					\ +	asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n"	\ +	     "\t.globl ." #alias "\n\t.set ." #alias ", ." #name) +#endif + +#endif	/* _ASM_POWERPC_LINKAGE_H */ diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index ebbec52d21b..43523fe0d8b 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h @@ -190,7 +190,7 @@ SYSCALL_SPU(getcwd)  SYSCALL_SPU(capget)  SYSCALL_SPU(capset)  COMPAT_SYS(sigaltstack) -SYSX_SPU(sys_sendfile,compat_sys_sendfile_wrapper,sys_sendfile) +COMPAT_SYS_SPU(sendfile)  SYSCALL(ni_syscall)  SYSCALL(ni_syscall)  PPC_SYS(vfork) @@ -230,7 +230,7 @@ COMPAT_SYS_SPU(sched_setaffinity)  COMPAT_SYS_SPU(sched_getaffinity)  SYSCALL(ni_syscall)  SYSCALL(ni_syscall) -SYSX(sys_ni_syscall,compat_sys_sendfile64_wrapper,sys_sendfile64) +SYS32ONLY(sendfile64)  COMPAT_SYS_SPU(io_setup)  SYSCALL_SPU(io_destroy)  COMPAT_SYS_SPU(io_getevents) @@ -239,7 +239,7 @@ SYSCALL_SPU(io_cancel)  SYSCALL(set_tid_address)  SYSX_SPU(sys_fadvise64,ppc32_fadvise64,sys_fadvise64)  SYSCALL(exit_group) -SYSX(sys_lookup_dcookie,ppc32_lookup_dcookie,sys_lookup_dcookie) +COMPAT_SYS(lookup_dcookie)  SYSCALL_SPU(epoll_create)  SYSCALL_SPU(epoll_ctl)  SYSCALL_SPU(epoll_wait) @@ -273,8 +273,8 @@ COMPAT_SYS(mq_timedreceive)  COMPAT_SYS(mq_notify)  COMPAT_SYS(mq_getsetattr)  COMPAT_SYS(kexec_load) -COMPAT_SYS(add_key) -COMPAT_SYS(request_key) +SYSCALL(add_key) +SYSCALL(request_key)  COMPAT_SYS(keyctl)  COMPAT_SYS(waitid)  SYSCALL(ioprio_set) diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 1487f0f1229..3ca819f541b 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h @@ -56,11 +56,5 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - */ -#define cond_syscall(x) \ -	asmlinkage long x (void) __attribute__((weak,alias("sys_ni_syscall"))) -  #endif		/* __ASSEMBLY__ */  #endif /* _ASM_POWERPC_UNISTD_H_ */ diff --git a/arch/powerpc/include/uapi/asm/linkage.h b/arch/powerpc/include/uapi/asm/linkage.h deleted file mode 100644 index e1c4ac1cc4b..00000000000 --- a/arch/powerpc/include/uapi/asm/linkage.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_POWERPC_LINKAGE_H -#define _ASM_POWERPC_LINKAGE_H - -/* Nothing to see here... */ - -#endif	/* _ASM_POWERPC_LINKAGE_H */ diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c index d0bafc0cdf0..cd6e19d263b 100644 --- a/arch/powerpc/kernel/sys_ppc32.c +++ b/arch/powerpc/kernel/sys_ppc32.c @@ -61,91 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,  	return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x));  } -#ifdef CONFIG_SYSVIPC -long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr, -	       u32 fifth) -{ -	int version; - -	version = call >> 16; /* hack for backward compatibility */ -	call &= 0xffff; - -	switch (call) { - -	case SEMTIMEDOP: -		if (fifth) -			/* sign extend semid */ -			return compat_sys_semtimedop((int)first, -						     compat_ptr(ptr), second, -						     compat_ptr(fifth)); -		/* else fall through for normal semop() */ -	case SEMOP: -		/* struct sembuf is the same on 32 and 64bit :)) */ -		/* sign extend semid */ -		return sys_semtimedop((int)first, compat_ptr(ptr), second, -				      NULL); -	case SEMGET: -		/* sign extend key, nsems */ -		return sys_semget((int)first, (int)second, third); -	case SEMCTL: -		/* sign extend semid, semnum */ -		return compat_sys_semctl((int)first, (int)second, third, -					 compat_ptr(ptr)); - -	case MSGSND: -		/* sign extend msqid */ -		return compat_sys_msgsnd((int)first, (int)second, third, -					 compat_ptr(ptr)); -	case MSGRCV: -		/* sign extend msqid, msgtyp */ -		return compat_sys_msgrcv((int)first, second, (int)fifth, -					 third, version, compat_ptr(ptr)); -	case MSGGET: -		/* sign extend key */ -		return sys_msgget((int)first, second); -	case MSGCTL: -		/* sign extend msqid */ -		return compat_sys_msgctl((int)first, second, compat_ptr(ptr)); - -	case SHMAT: -		/* sign extend shmid */ -		return compat_sys_shmat((int)first, second, third, version, -					compat_ptr(ptr)); -	case SHMDT: -		return sys_shmdt(compat_ptr(ptr)); -	case SHMGET: -		/* sign extend key_t */ -		return sys_shmget((int)first, second, third); -	case SHMCTL: -		/* sign extend shmid */ -		return compat_sys_shmctl((int)first, second, compat_ptr(ptr)); - -	default: -		return -ENOSYS; -	} - -	return -ENOSYS; -} -#endif - -/* Note: it is necessary to treat out_fd and in_fd as unsigned ints,  - * with the corresponding cast to a signed int to insure that the  - * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) - * and the register representation of a signed int (msr in 64-bit mode) is performed. - */ -asmlinkage long compat_sys_sendfile_wrapper(u32 out_fd, u32 in_fd, -					    compat_off_t __user *offset, u32 count) -{ -	return compat_sys_sendfile((int)out_fd, (int)in_fd, offset, count); -} - -asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd, -					      compat_loff_t __user *offset, u32 count) -{ -	return sys_sendfile((int)out_fd, (int)in_fd, -			    (off_t __user *)offset, count); -} -  unsigned long compat_sys_mmap2(unsigned long addr, size_t len,  			  unsigned long prot, unsigned long flags,  			  unsigned long fd, unsigned long pgoff) @@ -195,13 +110,6 @@ asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long h  	return sys_ftruncate(fd, (high << 32) | low);  } -long ppc32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char __user *buf, -			  size_t len) -{ -	return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low, -				  buf, len); -} -  long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,  		     size_t len, int advice)  { @@ -209,23 +117,6 @@ long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,  			     advice);  } -asmlinkage long compat_sys_add_key(const char __user *_type, -			      const char __user *_description, -			      const void __user *_payload, -			      u32 plen, -			      u32 ringid) -{ -	return sys_add_key(_type, _description, _payload, plen, ringid); -} - -asmlinkage long compat_sys_request_key(const char __user *_type, -				  const char __user *_description, -				  const char __user *_callout_info, -				  u32 destringid) -{ -	return sys_request_key(_type, _description, _callout_info, destringid); -} -  asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags,  				   unsigned offset_hi, unsigned offset_lo,  				   unsigned nbytes_hi, unsigned nbytes_lo) diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index ce640aff61a..2c9789da0e2 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -132,7 +132,6 @@ config S390  	select HAVE_PERF_EVENTS  	select HAVE_REGS_AND_STACK_ACCESS_API  	select HAVE_SYSCALL_TRACEPOINTS -	select HAVE_SYSCALL_WRAPPERS  	select HAVE_UID16 if 32BIT  	select HAVE_VIRT_CPU_ACCOUNTING  	select VIRT_TO_BUS diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h index a6667a95296..65188635355 100644 --- a/arch/s390/include/asm/unistd.h +++ b/arch/s390/include/asm/unistd.h @@ -54,12 +54,4 @@  #define __ARCH_WANT_SYS_VFORK  #define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #endif /* _ASM_S390_UNISTD_H_ */ diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 19f26de27fa..8b6e4f5288a 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -288,51 +288,13 @@ asmlinkage long sys32_getegid16(void)  	return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));  } -/* - * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation. - * - * This is really horribly ugly. - */  #ifdef CONFIG_SYSVIPC -asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) +COMPAT_SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second, +		unsigned long, third, compat_uptr_t, ptr)  {  	if (call >> 16)		/* hack for backward compatibility */  		return -EINVAL; -	switch (call) { -	case SEMTIMEDOP: -		return compat_sys_semtimedop(first, compat_ptr(ptr), -					     second, compat_ptr(third)); -	case SEMOP: -		/* struct sembuf is the same on 32 and 64bit :)) */ -		return sys_semtimedop(first, compat_ptr(ptr), -				      second, NULL); -	case SEMGET: -		return sys_semget(first, second, third); -	case SEMCTL: -		return compat_sys_semctl(first, second, third, -					 compat_ptr(ptr)); -	case MSGSND: -		return compat_sys_msgsnd(first, second, third, -					 compat_ptr(ptr)); -	case MSGRCV: -		return compat_sys_msgrcv(first, second, 0, third, -					 0, compat_ptr(ptr)); -	case MSGGET: -		return sys_msgget((key_t) first, second); -	case MSGCTL: -		return compat_sys_msgctl(first, second, compat_ptr(ptr)); -	case SHMAT: -		return compat_sys_shmat(first, second, third, -					0, compat_ptr(ptr)); -	case SHMDT: -		return sys_shmdt(compat_ptr(ptr)); -	case SHMGET: -		return sys_shmget(first, (unsigned)second, third); -	case SHMCTL: -		return compat_sys_shmctl(first, second, compat_ptr(ptr)); -	} - -	return -ENOSYS; +	return compat_sys_ipc(call, first, second, third, ptr, third);  }  #endif @@ -373,48 +335,6 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun  	return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);  } -asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, size_t count) -{ -	mm_segment_t old_fs = get_fs(); -	int ret; -	off_t of; -	 -	if (offset && get_user(of, offset)) -		return -EFAULT; -		 -	set_fs(KERNEL_DS); -	ret = sys_sendfile(out_fd, in_fd, -			   offset ? (off_t __force __user *) &of : NULL, count); -	set_fs(old_fs); -	 -	if (offset && put_user(of, offset)) -		return -EFAULT; -		 -	return ret; -} - -asmlinkage long sys32_sendfile64(int out_fd, int in_fd, -				compat_loff_t __user *offset, s32 count) -{ -	mm_segment_t old_fs = get_fs(); -	int ret; -	loff_t lof; -	 -	if (offset && get_user(lof, offset)) -		return -EFAULT; -		 -	set_fs(KERNEL_DS); -	ret = sys_sendfile64(out_fd, in_fd, -			     offset ? (loff_t __force __user *) &lof : NULL, -			     count); -	set_fs(old_fs); -	 -	if (offset && put_user(lof, offset)) -		return -EFAULT; -		 -	return ret; -} -  struct stat64_emu31 {  	unsigned long long  st_dev;  	unsigned int    __pad1; diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index 00d92a5a6f6..976518c0592 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h @@ -94,7 +94,6 @@ long sys32_getuid16(void);  long sys32_geteuid16(void);  long sys32_getgid16(void);  long sys32_getegid16(void); -long sys32_ipc(u32 call, int first, int second, int third, u32 ptr);  long sys32_truncate64(const char __user * path, unsigned long high,  		      unsigned long low);  long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low); @@ -106,10 +105,6 @@ long sys32_pread64(unsigned int fd, char __user *ubuf, size_t count,  long sys32_pwrite64(unsigned int fd, const char __user *ubuf,  		    size_t count, u32 poshi, u32 poslo);  compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count); -long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, -		    size_t count); -long sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset, -		      s32 count);  long sys32_stat64(const char __user * filename, struct stat64_emu31 __user * statbuf);  long sys32_lstat64(const char __user * filename,  		   struct stat64_emu31 __user * statbuf); diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 3c98c4dc5ac..17644c8e10e 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -258,11 +258,6 @@ ENTRY(sys32_mmap2_wrapper)  	llgtr	%r2,%r2			# struct mmap_arg_struct_emu31 *  	jg	sys32_mmap2			# branch to system call -ENTRY(compat_sys_getrusage_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# struct rusage_emu31 * -	jg	compat_sys_getrusage	# branch to system call -  ENTRY(compat_sys_gettimeofday_wrapper)  	llgtr	%r2,%r2			# struct timeval_emu31 *  	llgtr	%r3,%r3			# struct timezone * @@ -393,14 +388,6 @@ ENTRY(compat_sys_sysinfo_wrapper)  	llgtr	%r2,%r2			# struct sysinfo_emu31 *  	jg	compat_sys_sysinfo	# branch to system call -ENTRY(sys32_ipc_wrapper) -	llgfr	%r2,%r2			# uint -	lgfr	%r3,%r3			# int -	lgfr	%r4,%r4			# int -	lgfr	%r5,%r5			# int -	llgfr	%r6,%r6			# u32 -	jg	sys32_ipc		# branch to system call -  ENTRY(sys32_fsync_wrapper)  	llgfr	%r2,%r2			# unsigned int  	jg	sys_fsync		# branch to system call @@ -666,13 +653,6 @@ ENTRY(sys32_capset_wrapper)  	llgtr	%r3,%r3			# const cap_user_data_t  	jg	sys_capset		# branch to system call -ENTRY(sys32_sendfile_wrapper) -	lgfr	%r2,%r2			# int -	lgfr	%r3,%r3			# int -	llgtr	%r4,%r4			# __kernel_off_emu31_t * -	llgfr	%r5,%r5			# size_t -	jg	sys32_sendfile		# branch to system call -  #sys32_vfork_wrapper			# done in vfork_glue  ENTRY(sys32_truncate64_wrapper) @@ -938,13 +918,6 @@ ENTRY(sys_epoll_wait_wrapper)  	lgfr	%r5,%r5			# int  	jg	sys_epoll_wait		# branch to system call -ENTRY(sys32_lookup_dcookie_wrapper) -	sllg	%r2,%r2,32		# get high word of 64bit dcookie -	or	%r2,%r3			# get low word of 64bit dcookie -	llgtr	%r3,%r4			# char * -	llgfr	%r4,%r5			# size_t -	jg	sys_lookup_dcookie -  ENTRY(sys32_fadvise64_wrapper)  	lgfr	%r2,%r2			# int  	sllg	%r3,%r3,32		# get high word of 64bit loff_t @@ -1264,29 +1237,12 @@ ENTRY(sys_tee_wrapper)  	llgfr	%r5,%r5			# unsigned int  	jg	sys_tee -ENTRY(compat_sys_vmsplice_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# compat_iovec * -	llgfr	%r4,%r4			# unsigned int -	llgfr	%r5,%r5			# unsigned int -	jg	compat_sys_vmsplice -  ENTRY(sys_getcpu_wrapper)  	llgtr	%r2,%r2			# unsigned *  	llgtr	%r3,%r3			# unsigned *  	llgtr	%r4,%r4			# struct getcpu_cache *  	jg	sys_getcpu -ENTRY(compat_sys_epoll_pwait_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# struct compat_epoll_event * -	lgfr	%r4,%r4			# int -	lgfr	%r5,%r5			# int -	llgtr	%r6,%r6			# compat_sigset_t * -	llgf	%r0,164(%r15)		# compat_size_t -	stg	%r0,160(%r15) -	jg	compat_sys_epoll_pwait -  ENTRY(compat_sys_utimes_wrapper)  	llgtr	%r2,%r2			# char *  	llgtr	%r3,%r3			# struct compat_timeval * @@ -1299,12 +1255,6 @@ ENTRY(compat_sys_utimensat_wrapper)  	lgfr	%r5,%r5			# int  	jg	compat_sys_utimensat -ENTRY(compat_sys_signalfd_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# compat_sigset_t * -	llgfr	%r4,%r4			# compat_size_t -	jg	compat_sys_signalfd -  ENTRY(sys_eventfd_wrapper)  	llgfr	%r2,%r2			# unsigned int  	jg	sys_eventfd @@ -1323,13 +1273,6 @@ ENTRY(sys_timerfd_create_wrapper)  	lgfr	%r3,%r3			# int  	jg	sys_timerfd_create -ENTRY(compat_sys_signalfd4_wrapper) -	lgfr	%r2,%r2			# int -	llgtr	%r3,%r3			# compat_sigset_t * -	llgfr	%r4,%r4			# compat_size_t -	lgfr	%r5,%r5			# int -	jg	compat_sys_signalfd4 -  ENTRY(sys_eventfd2_wrapper)  	llgfr	%r2,%r2			# unsigned int  	lgfr	%r3,%r3			# int @@ -1361,13 +1304,6 @@ ENTRY(sys32_readahead_wrapper)  	lgfr	%r5,%r5			# s32  	jg	sys32_readahead		# branch to system call -ENTRY(sys32_sendfile64_wrapper) -	lgfr	%r2,%r2			# int -	lgfr	%r3,%r3			# int -	llgtr	%r4,%r4			# compat_loff_t * -	lgfr	%r5,%r5			# s32 -	jg	sys32_sendfile64	# branch to system call -  ENTRY(sys_tkill_wrapper)  	lgfr	%r2,%r2			# pid_t  	lgfr	%r3,%r3			# int diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index d0964d22adb..23eb222c165 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c @@ -132,19 +132,9 @@ SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)   * to   *   %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len   */ -SYSCALL_DEFINE(s390_fallocate)(int fd, int mode, loff_t offset, -			       u32 len_high, u32 len_low) +SYSCALL_DEFINE5(s390_fallocate, int, fd, int, mode, loff_t, offset, +			       u32, len_high, u32, len_low)  {  	return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_s390_fallocate(long fd, long mode, loff_t offset, -				   long len_high, long len_low) -{ -	return SYSC_s390_fallocate((int) fd, (int) mode, offset, -				   (u32) len_high, (u32) len_low); -} -SYSCALL_ALIAS(sys_s390_fallocate, SyS_s390_fallocate); -#endif -  #endif diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 630b935d128..d2baabed714 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S @@ -85,7 +85,7 @@ SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)  SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)  SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper)	/* 75 */  SYSCALL(sys_old_getrlimit,sys_getrlimit,compat_sys_old_getrlimit_wrapper) -SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage_wrapper) +SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage)  SYSCALL(sys_gettimeofday,sys_gettimeofday,compat_sys_gettimeofday_wrapper)  SYSCALL(sys_settimeofday,sys_settimeofday,compat_sys_settimeofday_wrapper)  SYSCALL(sys_getgroups16,sys_ni_syscall,sys32_getgroups16_wrapper)	/* 80 old getgroups16 syscall */ @@ -118,14 +118,14 @@ SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper)  SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper)  SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper)  NI_SYSCALL							/* old uname syscall */ -SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,sys32_lookup_dcookie_wrapper)	/* 110 */ +SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,compat_sys_lookup_dcookie)	/* 110 */  SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)  NI_SYSCALL							/* old "idle" system call */  NI_SYSCALL							/* vm86old for i386 */  SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4)  SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)		/* 115 */  SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) -SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper) +SYSCALL(sys_s390_ipc,sys_s390_ipc,compat_sys_s390_ipc)  SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)  SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)  SYSCALL(sys_clone,sys_clone,sys_clone_wrapper)			/* 120 */ @@ -195,7 +195,7 @@ SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)  SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)  SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper)		/* 185 */  SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack) -SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper) +SYSCALL(sys_sendfile,sys_sendfile64,compat_sys_sendfile)  NI_SYSCALL							/* streams1 */  NI_SYSCALL							/* streams2 */  SYSCALL(sys_vfork,sys_vfork,sys_vfork)				/* 190 */ @@ -231,7 +231,7 @@ SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper)  SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper)	/* 220 */  SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper)  SYSCALL(sys_readahead,sys_readahead,sys32_readahead_wrapper) -SYSCALL(sys_sendfile64,sys_ni_syscall,sys32_sendfile64_wrapper) +SYSCALL(sys_sendfile64,sys_ni_syscall,compat_sys_sendfile64)  SYSCALL(sys_setxattr,sys_setxattr,sys32_setxattr_wrapper)  SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper)	/* 225 */  SYSCALL(sys_fsetxattr,sys_fsetxattr,sys32_fsetxattr_wrapper) @@ -317,20 +317,20 @@ SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list)  SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)  SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)  SYSCALL(sys_tee,sys_tee,sys_tee_wrapper) -SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) +SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice)  NI_SYSCALL							/* 310 sys_move_pages */  SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) -SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper) +SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)  SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)  SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)  SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper)	/* 315 */ -SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper) +SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd)  NI_SYSCALL						/* 317 old sys_timer_fd */  SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)  SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_wrapper)  SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */  SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime) -SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4_wrapper) +SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4)  SYSCALL(sys_eventfd2,sys_eventfd2,sys_eventfd2_wrapper)  SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)  SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */ diff --git a/arch/sh/include/asm/unistd.h b/arch/sh/include/asm/unistd.h index 5e90fa2b7ee..e77816c4b9b 100644 --- a/arch/sh/include/asm/unistd.h +++ b/arch/sh/include/asm/unistd.h @@ -30,12 +30,4 @@  # define __ARCH_WANT_SYS_VFORK  # define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -# define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #include <uapi/asm/unistd.h> diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index e5641157464..f5041d741de 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -62,7 +62,6 @@ config SPARC64  	select HAVE_RCU_TABLE_FREE if SMP  	select HAVE_MEMBLOCK  	select HAVE_MEMBLOCK_NODE_MAP -	select HAVE_SYSCALL_WRAPPERS  	select HAVE_ARCH_TRANSPARENT_HUGEPAGE  	select HAVE_DYNAMIC_FTRACE  	select HAVE_FTRACE_MCOUNT_RECORD diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index 5356810bd7e..dfa53fdd5cb 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h @@ -45,12 +45,4 @@  #define __ARCH_WANT_COMPAT_SYS_SENDFILE  #endif -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #endif /* _SPARC_UNISTD_H */ diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index 240a3cecc11..2e680b5245c 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -36,7 +36,6 @@ STUB:	sra	REG1, 0, REG1; \  	jmpl	%g1 + %lo(SYSCALL), %g0; \  	sra	REG3, 0, REG3 -SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)  SIGN1(sys32_readahead, compat_sys_readahead, %o0)  SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)  SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) @@ -46,12 +45,9 @@ SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)  SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)  SIGN1(sys32_select, compat_sys_select, %o0)  SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) -SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1)  SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)  SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)  SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) -SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) -SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)  	.globl		sys32_mmap2  sys32_mmap2: diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index f38f2280fad..3d0ddbc005f 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c @@ -49,71 +49,6 @@  #include <asm/mmu_context.h>  #include <asm/compat_signal.h> -#ifdef CONFIG_SYSVIPC                                                         -asmlinkage long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr, u32 fifth) -{ -	int version; - -	version = call >> 16; /* hack for backward compatibility */ -	call &= 0xffff; - -	switch (call) { -	case SEMTIMEDOP: -		if (fifth) -			/* sign extend semid */ -			return compat_sys_semtimedop((int)first, -						     compat_ptr(ptr), second, -						     compat_ptr(fifth)); -		/* else fall through for normal semop() */ -	case SEMOP: -		/* struct sembuf is the same on 32 and 64bit :)) */ -		/* sign extend semid */ -		return sys_semtimedop((int)first, compat_ptr(ptr), second, -				      NULL); -	case SEMGET: -		/* sign extend key, nsems */ -		return sys_semget((int)first, (int)second, third); -	case SEMCTL: -		/* sign extend semid, semnum */ -		return compat_sys_semctl((int)first, (int)second, third, -					 compat_ptr(ptr)); - -	case MSGSND: -		/* sign extend msqid */ -		return compat_sys_msgsnd((int)first, (int)second, third, -					 compat_ptr(ptr)); -	case MSGRCV: -		/* sign extend msqid, msgtyp */ -		return compat_sys_msgrcv((int)first, second, (int)fifth, -					 third, version, compat_ptr(ptr)); -	case MSGGET: -		/* sign extend key */ -		return sys_msgget((int)first, second); -	case MSGCTL: -		/* sign extend msqid */ -		return compat_sys_msgctl((int)first, second, compat_ptr(ptr)); - -	case SHMAT: -		/* sign extend shmid */ -		return compat_sys_shmat((int)first, second, third, version, -					compat_ptr(ptr)); -	case SHMDT: -		return sys_shmdt(compat_ptr(ptr)); -	case SHMGET: -		/* sign extend key_t */ -		return sys_shmget((int)first, second, third); -	case SHMCTL: -		/* sign extend shmid */ -		return compat_sys_shmctl((int)first, second, compat_ptr(ptr)); - -	default: -		return -ENOSYS; -	} - -	return -ENOSYS; -} -#endif -  asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)  {  	if ((int)high < 0) @@ -303,15 +238,7 @@ long compat_sys_fadvise64_64(int fd,  				advice);  } -long sys32_lookup_dcookie(unsigned long cookie_high, -			  unsigned long cookie_low, -			  char __user *buf, size_t len) -{ -	return sys_lookup_dcookie((cookie_high << 32) | cookie_low, -				  buf, len); -} - -long compat_sync_file_range(int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, int flags) +long sys32_sync_file_range(unsigned int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, unsigned int flags)  {  	return sys_sync_file_range(fd,  				   (off_high << 32) | off_low, diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c index 708bc29d36a..2daaaa6eda2 100644 --- a/arch/sparc/kernel/sys_sparc_64.c +++ b/arch/sparc/kernel/sys_sparc_64.c @@ -353,7 +353,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second  		case SEMCTL: {  			err = sys_semctl(first, second,  					 (int)third | IPC_64, -					 (union semun) ptr); +					 (unsigned long) ptr);  			goto out;  		}  		default: @@ -470,10 +470,6 @@ SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len)  	return vm_munmap(addr, len);  } - -extern unsigned long do_mremap(unsigned long addr, -	unsigned long old_len, unsigned long new_len, -	unsigned long flags, unsigned long new_addr);  SYSCALL_DEFINE5(64_mremap, unsigned long, addr,	unsigned long, old_len,  		unsigned long, new_len, unsigned long, flags, diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 088134834da..8fd93208021 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -23,9 +23,9 @@ sys_call_table32:  /*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod  /*15*/	.word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, compat_sys_lseek  /*20*/	.word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 -/*25*/	.word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause +/*25*/	.word compat_sys_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause  /*30*/	.word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice -	.word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile +	.word sys_chown, sys_sync, sys_kill, compat_sys_newstat, compat_sys_sendfile  /*40*/	.word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid  	.word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16  /*50*/	.word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl @@ -41,7 +41,7 @@ sys_call_table32:  /*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending  	.word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid  /*110*/	.word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall -	.word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd +	.word sys_getgroups, compat_sys_gettimeofday, compat_sys_getrusage, sys_nis_syscall, sys_getcwd  /*120*/	.word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod  	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate  /*130*/	.word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall @@ -59,7 +59,7 @@ sys_call_table32:  /*190*/	.word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl  	.word sys_epoll_wait, sys_ioprio_set, sys_getppid, compat_sys_sparc_sigaction, sys_sgetmask  /*200*/	.word sys_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir -	.word sys32_readahead, sys32_socketcall, sys_syslog, sys32_lookup_dcookie, sys32_fadvise64 +	.word sys32_readahead, sys32_socketcall, sys_syslog, compat_sys_lookup_dcookie, sys32_fadvise64  /*210*/	.word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, compat_sys_sysinfo  	.word compat_sys_ipc, sys32_sigreturn, sys_clone, sys_ioprio_get, compat_sys_adjtimex  /*220*/	.word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 0f712f4e1b3..0e534390236 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -16,7 +16,6 @@ config TILE  	select GENERIC_PENDING_IRQ if SMP  	select GENERIC_IRQ_SHOW  	select HAVE_DEBUG_BUGVERBOSE -	select HAVE_SYSCALL_WRAPPERS if TILEGX  	select VIRT_TO_BUS  	select SYS_HYPERVISOR  	select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c index 6ea4cdb3c6a..ed378416b86 100644 --- a/arch/tile/kernel/compat.c +++ b/arch/tile/kernel/compat.c @@ -56,12 +56,6 @@ COMPAT_SYSCALL_DEFINE6(pwrite64, unsigned int, fd, char __user *, ubuf,  	return sys_pwrite64(fd, ubuf, count, ((loff_t)high << 32) | low);  } -COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, low, u32, high, -                       char __user *, buf, size_t, len) -{ -	return sys_lookup_dcookie(((loff_t)high << 32) | low, buf, len); -} -  COMPAT_SYSCALL_DEFINE6(sync_file_range2, int, fd, unsigned int, flags,                         u32, offset_lo, u32, offset_hi,                         u32, nbytes_lo, u32, nbytes_hi) diff --git a/arch/x86/ia32/Makefile b/arch/x86/ia32/Makefile index 455646e0e53..e785b422b76 100644 --- a/arch/x86/ia32/Makefile +++ b/arch/x86/ia32/Makefile @@ -5,9 +5,6 @@  obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o  obj-$(CONFIG_IA32_EMULATION) += nosyscall.o syscall_ia32.o -sysv-$(CONFIG_SYSVIPC) := ipc32.o -obj-$(CONFIG_IA32_EMULATION) += $(sysv-y) -  obj-$(CONFIG_IA32_AOUT) += ia32_aout.o  audit-class-$(CONFIG_AUDIT) := audit.o diff --git a/arch/x86/ia32/ipc32.c b/arch/x86/ia32/ipc32.c deleted file mode 100644 index 29cdcd02ead..00000000000 --- a/arch/x86/ia32/ipc32.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <linux/kernel.h> -#include <linux/spinlock.h> -#include <linux/list.h> -#include <linux/syscalls.h> -#include <linux/time.h> -#include <linux/sem.h> -#include <linux/msg.h> -#include <linux/shm.h> -#include <linux/ipc.h> -#include <linux/compat.h> -#include <asm/sys_ia32.h> - -asmlinkage long sys32_ipc(u32 call, int first, int second, int third, -			  compat_uptr_t ptr, u32 fifth) -{ -	int version; - -	version = call >> 16; /* hack for backward compatibility */ -	call &= 0xffff; - -	switch (call) { -	case SEMOP: -		/* struct sembuf is the same on 32 and 64bit :)) */ -		return sys_semtimedop(first, compat_ptr(ptr), second, NULL); -	case SEMTIMEDOP: -		return compat_sys_semtimedop(first, compat_ptr(ptr), second, -						compat_ptr(fifth)); -	case SEMGET: -		return sys_semget(first, second, third); -	case SEMCTL: -		return compat_sys_semctl(first, second, third, compat_ptr(ptr)); - -	case MSGSND: -		return compat_sys_msgsnd(first, second, third, compat_ptr(ptr)); -	case MSGRCV: -		return compat_sys_msgrcv(first, second, fifth, third, -					 version, compat_ptr(ptr)); -	case MSGGET: -		return sys_msgget((key_t) first, second); -	case MSGCTL: -		return compat_sys_msgctl(first, second, compat_ptr(ptr)); - -	case SHMAT: -		return compat_sys_shmat(first, second, third, version, -					compat_ptr(ptr)); -	case SHMDT: -		return sys_shmdt(compat_ptr(ptr)); -	case SHMGET: -		return sys_shmget(first, (unsigned)second, third); -	case SHMCTL: -		return compat_sys_shmctl(first, second, compat_ptr(ptr)); -	} -	return -ENOSYS; -} diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index ad7a20cbc69..4e4907c67d9 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c @@ -166,12 +166,6 @@ asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *arg)  			       a.offset>>PAGE_SHIFT);  } -asmlinkage long sys32_mprotect(unsigned long start, size_t len, -			       unsigned long prot) -{ -	return sys_mprotect(start, len, prot); -} -  asmlinkage long sys32_waitpid(compat_pid_t pid, unsigned int __user *stat_addr,  			      int options)  { @@ -194,35 +188,10 @@ asmlinkage long sys32_pwrite(unsigned int fd, const char __user *ubuf,  } -asmlinkage long sys32_sendfile(int out_fd, int in_fd, -			       compat_off_t __user *offset, s32 count) -{ -	mm_segment_t old_fs = get_fs(); -	int ret; -	off_t of; - -	if (offset && get_user(of, offset)) -		return -EFAULT; - -	set_fs(KERNEL_DS); -	ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL, -			   count); -	set_fs(old_fs); - -	if (offset && put_user(of, offset)) -		return -EFAULT; -	return ret; -} -  /*   * Some system calls that need sign extended arguments. This could be   * done by a generic wrapper.   */ -long sys32_kill(int pid, int sig) -{ -	return sys_kill(pid, sig); -} -  long sys32_fadvise64_64(int fd, __u32 offset_low, __u32 offset_high,  			__u32 len_low, __u32 len_high, int advice)  { @@ -246,12 +215,6 @@ long sys32_vm86_warning(void)  	return -ENOSYS;  } -long sys32_lookup_dcookie(u32 addr_low, u32 addr_high, -			  char __user *buf, size_t len) -{ -	return sys_lookup_dcookie(((u64)addr_high << 32) | addr_low, buf, len); -} -  asmlinkage ssize_t sys32_readahead(int fd, unsigned off_lo, unsigned off_hi,  				   size_t count)  { diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index 8459efc3968..0ef202e232d 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h @@ -30,23 +30,14 @@ asmlinkage long sys32_fstatat(unsigned int, const char __user *,  			      struct stat64 __user *, int);  struct mmap_arg_struct32;  asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *); -asmlinkage long sys32_mprotect(unsigned long, size_t, unsigned long); - -asmlinkage long sys32_alarm(unsigned int);  asmlinkage long sys32_waitpid(compat_pid_t, unsigned int __user *, int); -asmlinkage long sys32_sysfs(int, u32, u32);  asmlinkage long sys32_pread(unsigned int, char __user *, u32, u32, u32);  asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32); -asmlinkage long sys32_personality(unsigned long); -asmlinkage long sys32_sendfile(int, int, compat_off_t __user *, s32); - -long sys32_kill(int, int);  long sys32_fadvise64_64(int, __u32, __u32, __u32, __u32, int);  long sys32_vm86_warning(void); -long sys32_lookup_dcookie(u32, u32, char __user *, size_t);  asmlinkage ssize_t sys32_readahead(int, unsigned, unsigned, size_t);  asmlinkage long sys32_sync_file_range(int, unsigned, unsigned, @@ -59,9 +50,6 @@ asmlinkage long sys32_fallocate(int, int, unsigned,  asmlinkage long sys32_sigreturn(void);  asmlinkage long sys32_rt_sigreturn(void); -/* ia32/ipc32.c */ -asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); -  asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int,  				    const char __user *); diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h index 6cf0a9cc60c..5f87b35fd2e 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h @@ -27,8 +27,8 @@ asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);  long sys_rt_sigreturn(void);  /* kernel/tls.c */ -asmlinkage int sys_set_thread_area(struct user_desc __user *); -asmlinkage int sys_get_thread_area(struct user_desc __user *); +asmlinkage long sys_set_thread_area(struct user_desc __user *); +asmlinkage long sys_get_thread_area(struct user_desc __user *);  /* X86_32 only */  #ifdef CONFIG_X86_32 diff --git a/arch/x86/include/asm/unistd.h b/arch/x86/include/asm/unistd.h index 3d5df1c4447..c2a48139c34 100644 --- a/arch/x86/include/asm/unistd.h +++ b/arch/x86/include/asm/unistd.h @@ -50,12 +50,4 @@  # define __ARCH_WANT_SYS_VFORK  # define __ARCH_WANT_SYS_CLONE -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -# define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") -  #endif /* _ASM_X86_UNISTD_H */ diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index 9d9d2f9e77a..f7fec09e3e3 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c @@ -3,13 +3,13 @@  #include <linux/sched.h>  #include <linux/user.h>  #include <linux/regset.h> +#include <linux/syscalls.h>  #include <asm/uaccess.h>  #include <asm/desc.h>  #include <asm/ldt.h>  #include <asm/processor.h>  #include <asm/proto.h> -#include <asm/syscalls.h>  #include "tls.h" @@ -89,11 +89,9 @@ int do_set_thread_area(struct task_struct *p, int idx,  	return 0;  } -asmlinkage int sys_set_thread_area(struct user_desc __user *u_info) +SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info)  { -	int ret = do_set_thread_area(current, -1, u_info, 1); -	asmlinkage_protect(1, ret, u_info); -	return ret; +	return do_set_thread_area(current, -1, u_info, 1);  } @@ -139,11 +137,9 @@ int do_get_thread_area(struct task_struct *p, int idx,  	return 0;  } -asmlinkage int sys_get_thread_area(struct user_desc __user *u_info) +SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info)  { -	int ret = do_get_thread_area(current, -1, u_info); -	asmlinkage_protect(1, ret, u_info); -	return ret; +	return do_get_thread_area(current, -1, u_info);  }  int regset_tls_active(struct task_struct *target, diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index e6d55f0064d..d0d59bfbccc 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl @@ -43,7 +43,7 @@  34	i386	nice			sys_nice  35	i386	ftime  36	i386	sync			sys_sync -37	i386	kill			sys_kill			sys32_kill +37	i386	kill			sys_kill  38	i386	rename			sys_rename  39	i386	mkdir			sys_mkdir  40	i386	rmdir			sys_rmdir @@ -123,7 +123,7 @@  114	i386	wait4			sys_wait4			compat_sys_wait4  115	i386	swapoff			sys_swapoff  116	i386	sysinfo			sys_sysinfo			compat_sys_sysinfo -117	i386	ipc			sys_ipc				sys32_ipc +117	i386	ipc			sys_ipc				compat_sys_ipc  118	i386	fsync			sys_fsync  119	i386	sigreturn		sys_sigreturn			stub32_sigreturn  120	i386	clone			sys_clone			stub32_clone @@ -131,7 +131,7 @@  122	i386	uname			sys_newuname  123	i386	modify_ldt		sys_modify_ldt  124	i386	adjtimex		sys_adjtimex			compat_sys_adjtimex -125	i386	mprotect		sys_mprotect			sys32_mprotect +125	i386	mprotect		sys_mprotect  126	i386	sigprocmask		sys_sigprocmask			compat_sys_sigprocmask  127	i386	create_module  128	i386	init_module		sys_init_module @@ -193,7 +193,7 @@  184	i386	capget			sys_capget  185	i386	capset			sys_capset  186	i386	sigaltstack		sys_sigaltstack			compat_sys_sigaltstack -187	i386	sendfile		sys_sendfile			sys32_sendfile +187	i386	sendfile		sys_sendfile			compat_sys_sendfile  188	i386	getpmsg  189	i386	putpmsg  190	i386	vfork			sys_vfork			stub32_vfork @@ -259,7 +259,7 @@  250	i386	fadvise64		sys_fadvise64			sys32_fadvise64  # 251 is available for reuse (was briefly sys_set_zone_reclaim)  252	i386	exit_group		sys_exit_group -253	i386	lookup_dcookie		sys_lookup_dcookie		sys32_lookup_dcookie +253	i386	lookup_dcookie		sys_lookup_dcookie		compat_sys_lookup_dcookie  254	i386	epoll_create		sys_epoll_create  255	i386	epoll_ctl		sys_epoll_ctl  256	i386	epoll_wait		sys_epoll_wait diff --git a/arch/x86/um/tls_32.c b/arch/x86/um/tls_32.c index 5f5feff3d24..80ffa5b9982 100644 --- a/arch/x86/um/tls_32.c +++ b/arch/x86/um/tls_32.c @@ -5,6 +5,7 @@  #include <linux/percpu.h>  #include <linux/sched.h> +#include <linux/syscalls.h>  #include <asm/uaccess.h>  #include <os.h>  #include <skas.h> @@ -274,7 +275,7 @@ clear:  	goto out;  } -int sys_set_thread_area(struct user_desc __user *user_desc) +SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc)  {  	struct user_desc info;  	int idx, ret; @@ -322,7 +323,7 @@ int ptrace_set_thread_area(struct task_struct *child, int idx,  	return set_tls_entry(child, &info, idx, 0);  } -int sys_get_thread_area(struct user_desc __user *user_desc) +SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)  {  	struct user_desc info;  	int idx, ret; diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h index c38834de9ac..cb4c2ce8d44 100644 --- a/arch/xtensa/include/asm/unistd.h +++ b/arch/xtensa/include/asm/unistd.h @@ -4,14 +4,6 @@  #define __ARCH_WANT_SYS_CLONE  #include <uapi/asm/unistd.h> -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); -  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_UTIME  #define __ARCH_WANT_SYS_LLSEEK @@ -1790,7 +1790,5 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,  			ret = read_events(ioctx, min_nr, nr, events, timeout);  		put_ioctx(ioctx);  	} - -	asmlinkage_protect(5, ret, ctx_id, min_nr, nr, events, timeout);  	return ret;  } diff --git a/fs/compat.c b/fs/compat.c index d487985dd0e..5f83ffa4211 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -44,7 +44,6 @@  #include <linux/signal.h>  #include <linux/poll.h>  #include <linux/mm.h> -#include <linux/eventpoll.h>  #include <linux/fs_struct.h>  #include <linux/slab.h>  #include <linux/pagemap.h> @@ -1253,26 +1252,6 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec,  	return compat_sys_pwritev64(fd, vec, vlen, pos);  } -asmlinkage long -compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32, -		    unsigned int nr_segs, unsigned int flags) -{ -	unsigned i; -	struct iovec __user *iov; -	if (nr_segs > UIO_MAXIOV) -		return -EINVAL; -	iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec)); -	for (i = 0; i < nr_segs; i++) { -		struct compat_iovec v; -		if (get_user(v.iov_base, &iov32[i].iov_base) || -		    get_user(v.iov_len, &iov32[i].iov_len) || -		    put_user(compat_ptr(v.iov_base), &iov[i].iov_base) || -		    put_user(v.iov_len, &iov[i].iov_len)) -			return -EFAULT; -	} -	return sys_vmsplice(fd, iov, nr_segs, flags); -} -  /*   * Exactly like fs/open.c:sys_open(), except that it doesn't set the   * O_LARGEFILE flag. @@ -1658,84 +1637,6 @@ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,  	return ret;  } -#ifdef CONFIG_EPOLL - -asmlinkage long compat_sys_epoll_pwait(int epfd, -			struct compat_epoll_event __user *events, -			int maxevents, int timeout, -			const compat_sigset_t __user *sigmask, -			compat_size_t sigsetsize) -{ -	long err; -	compat_sigset_t csigmask; -	sigset_t ksigmask, sigsaved; - -	/* -	 * If the caller wants a certain signal mask to be set during the wait, -	 * we apply it here. -	 */ -	if (sigmask) { -		if (sigsetsize != sizeof(compat_sigset_t)) -			return -EINVAL; -		if (copy_from_user(&csigmask, sigmask, sizeof(csigmask))) -			return -EFAULT; -		sigset_from_compat(&ksigmask, &csigmask); -		sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP)); -		sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); -	} - -	err = sys_epoll_wait(epfd, events, maxevents, timeout); - -	/* -	 * If we changed the signal mask, we need to restore the original one. -	 * In case we've got a signal while waiting, we do not restore the -	 * signal mask yet, and we allow do_signal() to deliver the signal on -	 * the way back to userspace, before the signal mask is restored. -	 */ -	if (sigmask) { -		if (err == -EINTR) { -			memcpy(¤t->saved_sigmask, &sigsaved, -			       sizeof(sigsaved)); -			set_restore_sigmask(); -		} else -			sigprocmask(SIG_SETMASK, &sigsaved, NULL); -	} - -	return err; -} - -#endif /* CONFIG_EPOLL */ - -#ifdef CONFIG_SIGNALFD - -asmlinkage long compat_sys_signalfd4(int ufd, -				     const compat_sigset_t __user *sigmask, -				     compat_size_t sigsetsize, int flags) -{ -	compat_sigset_t ss32; -	sigset_t tmp; -	sigset_t __user *ksigmask; - -	if (sigsetsize != sizeof(compat_sigset_t)) -		return -EINVAL; -	if (copy_from_user(&ss32, sigmask, sizeof(ss32))) -		return -EFAULT; -	sigset_from_compat(&tmp, &ss32); -	ksigmask = compat_alloc_user_space(sizeof(sigset_t)); -	if (copy_to_user(ksigmask, &tmp, sizeof(sigset_t))) -		return -EFAULT; - -	return sys_signalfd4(ufd, ksigmask, sizeof(sigset_t), flags); -} - -asmlinkage long compat_sys_signalfd(int ufd, -				    const compat_sigset_t __user *sigmask, -				    compat_size_t sigsetsize) -{ -	return compat_sys_signalfd4(ufd, sigmask, sigsetsize, 0); -} -#endif /* CONFIG_SIGNALFD */ -  #ifdef CONFIG_FHANDLE  /*   * Exactly like fs/open.c:sys_open_by_handle_at(), except that it @@ -1747,25 +1648,3 @@ COMPAT_SYSCALL_DEFINE3(open_by_handle_at, int, mountdirfd,  	return do_handle_open(mountdirfd, handle, flags);  }  #endif - -#ifdef __ARCH_WANT_COMPAT_SYS_SENDFILE -asmlinkage long compat_sys_sendfile(int out_fd, int in_fd, -				    compat_off_t __user *offset, compat_size_t count) -{ -	loff_t pos; -	off_t off; -	ssize_t ret; - -	if (offset) { -		if (unlikely(get_user(off, offset))) -			return -EFAULT; -		pos = off; -		ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS); -		if (unlikely(put_user(pos, offset))) -			return -EFAULT; -		return ret; -	} - -	return do_sendfile(out_fd, in_fd, NULL, count, 0); -} -#endif /* __ARCH_WANT_COMPAT_SYS_SENDFILE */ diff --git a/fs/dcookies.c b/fs/dcookies.c index 17c77996782..ab5954b5026 100644 --- a/fs/dcookies.c +++ b/fs/dcookies.c @@ -25,6 +25,7 @@  #include <linux/dcookies.h>  #include <linux/mutex.h>  #include <linux/path.h> +#include <linux/compat.h>  #include <asm/uaccess.h>  /* The dcookies are allocated from a kmem_cache and @@ -145,7 +146,7 @@ out:  /* And here is where the userspace process can look up the cookie value   * to retrieve the path.   */ -SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len) +SYSCALL_DEFINE3(lookup_dcookie, u64, cookie64, char __user *, buf, size_t, len)  {  	unsigned long cookie = (unsigned long)cookie64;  	int err = -EINVAL; @@ -201,12 +202,16 @@ out:  	mutex_unlock(&dcookie_mutex);  	return err;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_lookup_dcookie(u64 cookie64, long buf, long len) + +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, w0, u32, w1, char __user *, buf, size_t, len)  { -	return SYSC_lookup_dcookie(cookie64, (char __user *) buf, (size_t) len); +#ifdef __BIG_ENDIAN +	return sys_lookup_dcookie(((u64)w0 << 32) | w1, buf, len); +#else +	return sys_lookup_dcookie(((u64)w1 << 32) | w0, buf, len); +#endif  } -SYSCALL_ALIAS(sys_lookup_dcookie, SyS_lookup_dcookie);  #endif  static int dcookie_init(void) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 277cc38aeda..deecc7294a6 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -40,6 +40,7 @@  #include <linux/atomic.h>  #include <linux/proc_fs.h>  #include <linux/seq_file.h> +#include <linux/compat.h>  /*   * LOCKING: @@ -1998,6 +1999,52 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,  	return error;  } +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd, +			struct epoll_event __user *, events, +			int, maxevents, int, timeout, +			const compat_sigset_t __user *, sigmask, +			compat_size_t, sigsetsize) +{ +	long err; +	compat_sigset_t csigmask; +	sigset_t ksigmask, sigsaved; + +	/* +	 * If the caller wants a certain signal mask to be set during the wait, +	 * we apply it here. +	 */ +	if (sigmask) { +		if (sigsetsize != sizeof(compat_sigset_t)) +			return -EINVAL; +		if (copy_from_user(&csigmask, sigmask, sizeof(csigmask))) +			return -EFAULT; +		sigset_from_compat(&ksigmask, &csigmask); +		sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP)); +		sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); +	} + +	err = sys_epoll_wait(epfd, events, maxevents, timeout); + +	/* +	 * If we changed the signal mask, we need to restore the original one. +	 * In case we've got a signal while waiting, we do not restore the +	 * signal mask yet, and we allow do_signal() to deliver the signal on +	 * the way back to userspace, before the signal mask is restored. +	 */ +	if (sigmask) { +		if (err == -EINTR) { +			memcpy(¤t->saved_sigmask, &sigsaved, +			       sizeof(sigsaved)); +			set_restore_sigmask(); +		} else +			sigprocmask(SIG_SETMASK, &sigsaved, NULL); +	} + +	return err; +} +#endif +  static int __init eventpoll_init(void)  {  	struct sysinfo si; diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 5d8444268a1..d0be29fa94c 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -755,9 +755,9 @@ out_destroy_group:  	return fd;  } -SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags, -			      __u64 mask, int dfd, -			      const char  __user * pathname) +SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags, +			      __u64, mask, int, dfd, +			      const char  __user *, pathname)  {  	struct inode *inode = NULL;  	struct vfsmount *mnt = NULL; @@ -857,17 +857,6 @@ fput_and_out:  	return ret;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_fanotify_mark(long fanotify_fd, long flags, __u64 mask, -				  long dfd, long pathname) -{ -	return SYSC_fanotify_mark((int) fanotify_fd, (unsigned int) flags, -				  mask, (int) dfd, -				  (const char  __user *) pathname); -} -SYSCALL_ALIAS(sys_fanotify_mark, SyS_fanotify_mark); -#endif -  /*   * fanotify_user_setup - Our initialization function.  Note that we cannot return   * error because we have compiled-in VFS hooks.  So an (unlikely) failure here diff --git a/fs/open.c b/fs/open.c index 68354466879..8c741002f94 100644 --- a/fs/open.c +++ b/fs/open.c @@ -197,10 +197,7 @@ out:  SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)  { -	long ret = do_sys_ftruncate(fd, length, 1); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(2, ret, fd, length); -	return ret; +	return do_sys_ftruncate(fd, length, 1);  }  #ifdef CONFIG_COMPAT @@ -212,32 +209,15 @@ COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)  /* LFS versions of truncate are only needed on 32 bit machines */  #if BITS_PER_LONG == 32 -SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length) +SYSCALL_DEFINE2(truncate64, const char __user *, path, loff_t, length)  {  	return do_sys_truncate(path, length);  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_truncate64(long path, loff_t length) -{ -	return SYSC_truncate64((const char __user *) path, length); -} -SYSCALL_ALIAS(sys_truncate64, SyS_truncate64); -#endif -SYSCALL_DEFINE(ftruncate64)(unsigned int fd, loff_t length) +SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)  { -	long ret = do_sys_ftruncate(fd, length, 0); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(2, ret, fd, length); -	return ret; -} -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_ftruncate64(long fd, loff_t length) -{ -	return SYSC_ftruncate64((unsigned int) fd, length); +	return do_sys_ftruncate(fd, length, 0);  } -SYSCALL_ALIAS(sys_ftruncate64, SyS_ftruncate64); -#endif  #endif /* BITS_PER_LONG == 32 */ @@ -299,7 +279,7 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)  	return ret;  } -SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) +SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)  {  	struct fd f = fdget(fd);  	int error = -EBADF; @@ -311,14 +291,6 @@ SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len)  	return error;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_fallocate(long fd, long mode, loff_t offset, loff_t len) -{ -	return SYSC_fallocate((int)fd, (int)mode, offset, len); -} -SYSCALL_ALIAS(sys_fallocate, SyS_fallocate); -#endif -  /*   * access() needs to use the real uid/gid, not the effective uid/gid.   * We do this by temporarily clearing all FS-related capabilities and @@ -983,29 +955,19 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)  SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)  { -	long ret; -  	if (force_o_largefile())  		flags |= O_LARGEFILE; -	ret = do_sys_open(AT_FDCWD, filename, flags, mode); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(3, ret, filename, flags, mode); -	return ret; +	return do_sys_open(AT_FDCWD, filename, flags, mode);  }  SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,  		umode_t, mode)  { -	long ret; -  	if (force_o_largefile())  		flags |= O_LARGEFILE; -	ret = do_sys_open(dfd, filename, flags, mode); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(4, ret, dfd, filename, flags, mode); -	return ret; +	return do_sys_open(dfd, filename, flags, mode);  }  #ifndef __alpha__ diff --git a/fs/read_write.c b/fs/read_write.c index 7a648911246..8274a794253 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -515,8 +515,8 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,  	return ret;  } -SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf, -			size_t count, loff_t pos) +SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf, +			size_t, count, loff_t, pos)  {  	struct fd f;  	ssize_t ret = -EBADF; @@ -534,17 +534,9 @@ SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf,  	return ret;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_pread64(long fd, long buf, long count, loff_t pos) -{ -	return SYSC_pread64((unsigned int) fd, (char __user *) buf, -			    (size_t) count, pos); -} -SYSCALL_ALIAS(sys_pread64, SyS_pread64); -#endif -SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf, -			 size_t count, loff_t pos) +SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf, +			 size_t, count, loff_t, pos)  {  	struct fd f;  	ssize_t ret = -EBADF; @@ -562,14 +554,6 @@ SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf,  	return ret;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_pwrite64(long fd, long buf, long count, loff_t pos) -{ -	return SYSC_pwrite64((unsigned int) fd, (const char __user *) buf, -			     (size_t) count, pos); -} -SYSCALL_ALIAS(sys_pwrite64, SyS_pwrite64); -#endif  /*   * Reduce an iovec's length in-place.  Return the resulting number of segments @@ -897,8 +881,8 @@ SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,  	return ret;  } -ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count, -		    loff_t max) +static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, +		  	   size_t count, loff_t max)  {  	struct fd in, out;  	struct inode *in_inode, *out_inode; @@ -1022,3 +1006,43 @@ SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, loff_t __user *, offset, si  	return do_sendfile(out_fd, in_fd, NULL, count, 0);  } + +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd, +		compat_off_t __user *, offset, compat_size_t, count) +{ +	loff_t pos; +	off_t off; +	ssize_t ret; + +	if (offset) { +		if (unlikely(get_user(off, offset))) +			return -EFAULT; +		pos = off; +		ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS); +		if (unlikely(put_user(pos, offset))) +			return -EFAULT; +		return ret; +	} + +	return do_sendfile(out_fd, in_fd, NULL, count, 0); +} + +COMPAT_SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, +		compat_loff_t __user *, offset, compat_size_t, count) +{ +	loff_t pos; +	ssize_t ret; + +	if (offset) { +		if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t)))) +			return -EFAULT; +		ret = do_sendfile(out_fd, in_fd, &pos, count, 0); +		if (unlikely(put_user(pos, offset))) +			return -EFAULT; +		return ret; +	} + +	return do_sendfile(out_fd, in_fd, NULL, count, 0); +} +#endif diff --git a/fs/read_write.h b/fs/read_write.h index d3e00ef6742..d07b954c6e0 100644 --- a/fs/read_write.h +++ b/fs/read_write.h @@ -12,5 +12,3 @@ ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,  		unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn);  ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,  		unsigned long nr_segs, loff_t *ppos, io_fn_t fn); -ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count, -		    loff_t max); diff --git a/fs/signalfd.c b/fs/signalfd.c index b5348696173..424b7b65321 100644 --- a/fs/signalfd.c +++ b/fs/signalfd.c @@ -30,6 +30,7 @@  #include <linux/signalfd.h>  #include <linux/syscalls.h>  #include <linux/proc_fs.h> +#include <linux/compat.h>  void signalfd_cleanup(struct sighand_struct *sighand)  { @@ -311,3 +312,33 @@ SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,  {  	return sys_signalfd4(ufd, user_mask, sizemask, 0);  } + +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd, +		     const compat_sigset_t __user *,sigmask, +		     compat_size_t, sigsetsize, +		     int, flags) +{ +	compat_sigset_t ss32; +	sigset_t tmp; +	sigset_t __user *ksigmask; + +	if (sigsetsize != sizeof(compat_sigset_t)) +		return -EINVAL; +	if (copy_from_user(&ss32, sigmask, sizeof(ss32))) +		return -EFAULT; +	sigset_from_compat(&tmp, &ss32); +	ksigmask = compat_alloc_user_space(sizeof(sigset_t)); +	if (copy_to_user(ksigmask, &tmp, sizeof(sigset_t))) +		return -EFAULT; + +	return sys_signalfd4(ufd, ksigmask, sizeof(sigset_t), flags); +} + +COMPAT_SYSCALL_DEFINE3(signalfd, int, ufd, +		     const compat_sigset_t __user *,sigmask, +		     compat_size_t, sigsetsize) +{ +	return compat_sys_signalfd4(ufd, sigmask, sigsetsize, 0); +} +#endif diff --git a/fs/splice.c b/fs/splice.c index 29e394e49dd..6b485b8753b 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -31,6 +31,7 @@  #include <linux/security.h>  #include <linux/gfp.h>  #include <linux/socket.h> +#include <linux/compat.h>  #include "internal.h"  /* @@ -1690,6 +1691,27 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,  	return error;  } +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32, +		    unsigned int, nr_segs, unsigned int, flags) +{ +	unsigned i; +	struct iovec __user *iov; +	if (nr_segs > UIO_MAXIOV) +		return -EINVAL; +	iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec)); +	for (i = 0; i < nr_segs; i++) { +		struct compat_iovec v; +		if (get_user(v.iov_base, &iov32[i].iov_base) || +		    get_user(v.iov_len, &iov32[i].iov_len) || +		    put_user(compat_ptr(v.iov_base), &iov[i].iov_base) || +		    put_user(v.iov_len, &iov[i].iov_len)) +			return -EFAULT; +	} +	return sys_vmsplice(fd, iov, nr_segs, flags); +} +#endif +  SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,  		int, fd_out, loff_t __user *, off_out,  		size_t, len, unsigned int, flags) diff --git a/fs/sync.c b/fs/sync.c index 2c5d6639a66..905f3f6b3d8 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -283,8 +283,8 @@ EXPORT_SYMBOL(generic_write_sync);   * already-instantiated disk blocks, there are no guarantees here that the data   * will be available after a crash.   */ -SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes, -				unsigned int flags) +SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes, +				unsigned int, flags)  {  	int ret;  	struct fd f; @@ -365,29 +365,11 @@ out_put:  out:  	return ret;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_sync_file_range(long fd, loff_t offset, loff_t nbytes, -				    long flags) -{ -	return SYSC_sync_file_range((int) fd, offset, nbytes, -				    (unsigned int) flags); -} -SYSCALL_ALIAS(sys_sync_file_range, SyS_sync_file_range); -#endif  /* It would be nice if people remember that not all the world's an i386     when they introduce new system calls */ -SYSCALL_DEFINE(sync_file_range2)(int fd, unsigned int flags, -				 loff_t offset, loff_t nbytes) +SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags, +				 loff_t, offset, loff_t, nbytes)  {  	return sys_sync_file_range(fd, offset, nbytes, flags);  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_sync_file_range2(long fd, long flags, -				     loff_t offset, loff_t nbytes) -{ -	return SYSC_sync_file_range2((int) fd, (unsigned int) flags, -				     offset, nbytes); -} -SYSCALL_ALIAS(sys_sync_file_range2, SyS_sync_file_range2); -#endif diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h index 4077b5d9ff8..0501fa3f783 100644 --- a/include/asm-generic/unistd.h +++ b/include/asm-generic/unistd.h @@ -9,20 +9,3 @@  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_LLSEEK  #endif - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#ifndef cond_syscall -#ifdef CONFIG_SYMBOL_PREFIX -#define __SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX -#else -#define __SYMBOL_PREFIX -#endif -#define cond_syscall(x) asm(".weak\t" __SYMBOL_PREFIX #x "\n\t" \ -			    ".set\t" __SYMBOL_PREFIX #x "," \ -			    __SYMBOL_PREFIX "sys_ni_syscall") -#endif diff --git a/include/linux/compat.h b/include/linux/compat.h index 377cd8c3395..d53c35352ea 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -27,12 +27,6 @@  #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))  #endif -#define __SC_CCAST1(t1, a1)      __SC_DELOUSE(t1,a1) -#define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__) -#define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__) -#define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__) -#define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__) -#define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__)  #define COMPAT_SYSCALL_DEFINE1(name, ...) \          COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)  #define COMPAT_SYSCALL_DEFINE2(name, ...) \ @@ -46,24 +40,15 @@  #define COMPAT_SYSCALL_DEFINE6(name, ...) \  	COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -  #define COMPAT_SYSCALL_DEFINEx(x, name, ...)				\ -	asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__));	\ -	static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__));	\ -	asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__))	\ +	asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ +	static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ +	asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\  	{								\ -		return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__));	\ +		return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));	\  	}								\  	SYSCALL_ALIAS(compat_sys##name, compat_SyS##name);		\ -	static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)) - -#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */ - -#define COMPAT_SYSCALL_DEFINEx(x, name, ...)				\ -	asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)) - -#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */ +	static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))  #ifndef compat_user_stack_pointer  #define compat_user_stack_pointer() current_user_stack_pointer() @@ -326,21 +311,13 @@ asmlinkage long  compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,  			   compat_size_t __user *len_ptr); -#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC -long compat_sys_semctl(int first, int second, int third, void __user *uptr); -long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); -long compat_sys_msgrcv(int first, int second, int msgtyp, int third, -		int version, void __user *uptr); -long compat_sys_shmat(int first, int second, compat_uptr_t third, int version, -		void __user *uptr); -#else -long compat_sys_semctl(int semid, int semnum, int cmd, int arg); -long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp, +asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32); +asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg); +asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg); +asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,  		compat_ssize_t msgsz, int msgflg); -long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp, +asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,  		compat_ssize_t msgsz, long msgtyp, int msgflg); -long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg); -#endif  long compat_sys_msgctl(int first, int second, void __user *uptr);  long compat_sys_shmctl(int first, int second, void __user *uptr);  long compat_sys_semtimedop(int semid, struct sembuf __user *tsems, @@ -444,13 +421,13 @@ extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,  asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,  				  compat_long_t addr, compat_long_t data); +asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, size_t);  /*   * epoll (fs/eventpoll.c) compat bits follow ...   */ -struct epoll_event; -#define compat_epoll_event	epoll_event +struct epoll_event;	/* fortunately, this one is fixed-layout */  asmlinkage long compat_sys_epoll_pwait(int epfd, -			struct compat_epoll_event __user *events, +			struct epoll_event __user *events,  			int maxevents, int timeout,  			const compat_sigset_t __user *sigmask,  			compat_size_t sigsetsize); @@ -685,6 +662,8 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,  asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,  				    compat_off_t __user *offset, compat_size_t count); +asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd, +				    compat_loff_t __user *offset, compat_size_t count);  asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,  				       compat_stack_t __user *uoss_ptr); diff --git a/include/linux/linkage.h b/include/linux/linkage.h index 807f1e53322..829d66c67fc 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -2,6 +2,7 @@  #define _LINUX_LINKAGE_H  #include <linux/compiler.h> +#include <linux/stringify.h>  #include <asm/linkage.h>  #ifdef __cplusplus @@ -14,6 +15,26 @@  #define asmlinkage CPP_ASMLINKAGE  #endif +#ifndef SYMBOL_NAME +#ifdef CONFIG_SYMBOL_PREFIX +#define SYMBOL_NAME(x) CONFIG_SYMBOL_PREFIX ## x +#else +#define SYMBOL_NAME(x) x +#endif +#endif +#define __SYMBOL_NAME(x) __stringify(SYMBOL_NAME(x)) + +#ifndef cond_syscall +#define cond_syscall(x) asm(".weak\t" __SYMBOL_NAME(x) \ +	"\n\t.set\t" __SYMBOL_NAME(x) "," __SYMBOL_NAME(sys_ni_syscall)); +#endif + +#ifndef SYSCALL_ALIAS +#define SYSCALL_ALIAS(alias, name)				\ +	asm ("\t.globl " __SYMBOL_NAME(alias)			\ +	"\n\t.set\t" __SYMBOL_NAME(alias) "," __SYMBOL_NAME(name)) +#endif +  #define __page_aligned_data	__section(.data..page_aligned) __aligned(PAGE_SIZE)  #define __page_aligned_bss	__section(.bss..page_aligned) __aligned(PAGE_SIZE) diff --git a/include/linux/mm.h b/include/linux/mm.h index c05d7cfbb6b..1a7f19e7f1a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1082,9 +1082,6 @@ extern unsigned long move_page_tables(struct vm_area_struct *vma,  		unsigned long old_addr, struct vm_area_struct *new_vma,  		unsigned long new_addr, unsigned long len,  		bool need_rmap_locks); -extern unsigned long do_mremap(unsigned long addr, -			       unsigned long old_len, unsigned long new_len, -			       unsigned long flags, unsigned long new_addr);  extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,  			      unsigned long end, pgprot_t newprot,  			      int dirty_accountable, int prot_numa); diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 313a8e0a655..4147d700a29 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -78,49 +78,34 @@ struct sigaltstack;  #include <linux/key.h>  #include <trace/syscall.h> -#define __SC_DECL1(t1, a1)	t1 a1 -#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) -#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) -#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__) -#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__) -#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__) - -#define __SC_LONG1(t1, a1) 	long a1 -#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__) -#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__) -#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__) -#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__) -#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__) - -#define __SC_CAST1(t1, a1)	(t1) a1 -#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__) -#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__) -#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__) -#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__) -#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__) +/* + * __MAP - apply a macro to syscall arguments + * __MAP(n, m, t1, a1, t2, a2, ..., tn, an) will expand to + *    m(t1, a1), m(t2, a2), ..., m(tn, an) + * The first argument must be equal to the amount of type/name + * pairs given.  Note that this list of pairs (i.e. the arguments + * of __MAP starting at the third one) is in the same format as + * for SYSCALL_DEFINE<n>/COMPAT_SYSCALL_DEFINE<n> + */ +#define __MAP0(m,...) +#define __MAP1(m,t,a) m(t,a) +#define __MAP2(m,t,a,...) m(t,a), __MAP1(m,__VA_ARGS__) +#define __MAP3(m,t,a,...) m(t,a), __MAP2(m,__VA_ARGS__) +#define __MAP4(m,t,a,...) m(t,a), __MAP3(m,__VA_ARGS__) +#define __MAP5(m,t,a,...) m(t,a), __MAP4(m,__VA_ARGS__) +#define __MAP6(m,t,a,...) m(t,a), __MAP5(m,__VA_ARGS__) +#define __MAP(n,...) __MAP##n(__VA_ARGS__) -#define __SC_TEST(type)		BUILD_BUG_ON(sizeof(type) > sizeof(long)) -#define __SC_TEST1(t1, a1)	__SC_TEST(t1) -#define __SC_TEST2(t2, a2, ...)	__SC_TEST(t2); __SC_TEST1(__VA_ARGS__) -#define __SC_TEST3(t3, a3, ...)	__SC_TEST(t3); __SC_TEST2(__VA_ARGS__) -#define __SC_TEST4(t4, a4, ...)	__SC_TEST(t4); __SC_TEST3(__VA_ARGS__) -#define __SC_TEST5(t5, a5, ...)	__SC_TEST(t5); __SC_TEST4(__VA_ARGS__) -#define __SC_TEST6(t6, a6, ...)	__SC_TEST(t6); __SC_TEST5(__VA_ARGS__) +#define __SC_DECL(t, a)	t a +#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL)) +#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a +#define __SC_CAST(t, a)	(t) a +#define __SC_ARGS(t, a)	a +#define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long))  #ifdef CONFIG_FTRACE_SYSCALLS -#define __SC_STR_ADECL1(t, a)		#a -#define __SC_STR_ADECL2(t, a, ...)	#a, __SC_STR_ADECL1(__VA_ARGS__) -#define __SC_STR_ADECL3(t, a, ...)	#a, __SC_STR_ADECL2(__VA_ARGS__) -#define __SC_STR_ADECL4(t, a, ...)	#a, __SC_STR_ADECL3(__VA_ARGS__) -#define __SC_STR_ADECL5(t, a, ...)	#a, __SC_STR_ADECL4(__VA_ARGS__) -#define __SC_STR_ADECL6(t, a, ...)	#a, __SC_STR_ADECL5(__VA_ARGS__) - -#define __SC_STR_TDECL1(t, a)		#t -#define __SC_STR_TDECL2(t, a, ...)	#t, __SC_STR_TDECL1(__VA_ARGS__) -#define __SC_STR_TDECL3(t, a, ...)	#t, __SC_STR_TDECL2(__VA_ARGS__) -#define __SC_STR_TDECL4(t, a, ...)	#t, __SC_STR_TDECL3(__VA_ARGS__) -#define __SC_STR_TDECL5(t, a, ...)	#t, __SC_STR_TDECL4(__VA_ARGS__) -#define __SC_STR_TDECL6(t, a, ...)	#t, __SC_STR_TDECL5(__VA_ARGS__) +#define __SC_STR_ADECL(t, a)	#a +#define __SC_STR_TDECL(t, a)	#t  extern struct ftrace_event_class event_class_syscall_enter;  extern struct ftrace_event_class event_class_syscall_exit; @@ -155,7 +140,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;  	  __attribute__((section("_ftrace_events")))			\  	*__event_exit_##sname = &event_exit_##sname; -#define SYSCALL_METADATA(sname, nb)				\ +#define SYSCALL_METADATA(sname, nb, ...)			\ +	static const char *types_##sname[] = {			\ +		__MAP(nb,__SC_STR_TDECL,__VA_ARGS__)		\ +	};							\ +	static const char *args_##sname[] = {			\ +		__MAP(nb,__SC_STR_ADECL,__VA_ARGS__)		\ +	};							\  	SYSCALL_TRACE_ENTER_EVENT(sname);			\  	SYSCALL_TRACE_EXIT_EVENT(sname);			\  	static struct syscall_metadata __used			\ @@ -163,8 +154,8 @@ extern struct trace_event_functions exit_syscall_print_funcs;  		.name 		= "sys"#sname,			\  		.syscall_nr	= -1,	/* Filled in at boot */	\  		.nb_args 	= nb,				\ -		.types		= types_##sname,		\ -		.args		= args_##sname,			\ +		.types		= nb ? types_##sname : NULL,	\ +		.args		= nb ? args_##sname : NULL,	\  		.enter_event	= &event_enter_##sname,		\  		.exit_event	= &event_exit_##sname,		\  		.enter_fields	= LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \ @@ -172,26 +163,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;  	static struct syscall_metadata __used			\  	  __attribute__((section("__syscalls_metadata")))	\  	 *__p_syscall_meta_##sname = &__syscall_meta_##sname; +#else +#define SYSCALL_METADATA(sname, nb, ...) +#endif  #define SYSCALL_DEFINE0(sname)					\ -	SYSCALL_TRACE_ENTER_EVENT(_##sname);			\ -	SYSCALL_TRACE_EXIT_EVENT(_##sname);			\ -	static struct syscall_metadata __used			\ -	  __syscall_meta__##sname = {				\ -		.name 		= "sys_"#sname,			\ -		.syscall_nr	= -1,	/* Filled in at boot */	\ -		.nb_args 	= 0,				\ -		.enter_event	= &event_enter__##sname,	\ -		.exit_event	= &event_exit__##sname,		\ -		.enter_fields	= LIST_HEAD_INIT(__syscall_meta__##sname.enter_fields), \ -	};							\ -	static struct syscall_metadata __used			\ -	  __attribute__((section("__syscalls_metadata")))	\ -	 *__p_syscall_meta_##sname = &__syscall_meta__##sname;	\ +	SYSCALL_METADATA(_##sname, 0);				\  	asmlinkage long sys_##sname(void) -#else -#define SYSCALL_DEFINE0(name)	   asmlinkage long sys_##name(void) -#endif  #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)  #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) @@ -200,57 +178,23 @@ extern struct trace_event_functions exit_syscall_print_funcs;  #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)  #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) -#ifdef CONFIG_PPC64 -#define SYSCALL_ALIAS(alias, name)					\ -	asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n"	\ -	     "\t.globl ." #alias "\n\t.set ." #alias ", ." #name) -#else -#if defined(CONFIG_ALPHA) || defined(CONFIG_MIPS) -#define SYSCALL_ALIAS(alias, name)					\ -	asm ( #alias " = " #name "\n\t.globl " #alias) -#else -#define SYSCALL_ALIAS(alias, name)					\ -	asm ("\t.globl " #alias "\n\t.set " #alias ", " #name) -#endif -#endif - -#ifdef CONFIG_FTRACE_SYSCALLS  #define SYSCALL_DEFINEx(x, sname, ...)				\ -	static const char *types_##sname[] = {			\ -		__SC_STR_TDECL##x(__VA_ARGS__)			\ -	};							\ -	static const char *args_##sname[] = {			\ -		__SC_STR_ADECL##x(__VA_ARGS__)			\ -	};							\ -	SYSCALL_METADATA(sname, x);				\ +	SYSCALL_METADATA(sname, x, __VA_ARGS__)			\  	__SYSCALL_DEFINEx(x, sname, __VA_ARGS__) -#else -#define SYSCALL_DEFINEx(x, sname, ...)				\ -	__SYSCALL_DEFINEx(x, sname, __VA_ARGS__) -#endif - -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS - -#define SYSCALL_DEFINE(name) static inline long SYSC_##name +#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)  #define __SYSCALL_DEFINEx(x, name, ...)					\ -	asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));		\ -	static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));	\ -	asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))		\ +	asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));	\ +	static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));	\ +	asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))	\  	{								\ -		__SC_TEST##x(__VA_ARGS__);				\ -		return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));	\ +		long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));	\ +		__MAP(x,__SC_TEST,__VA_ARGS__);				\ +		__PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));	\ +		return ret;						\  	}								\  	SYSCALL_ALIAS(sys##name, SyS##name);				\ -	static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)) - -#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */ - -#define SYSCALL_DEFINE(name) asmlinkage long sys_##name -#define __SYSCALL_DEFINEx(x, name, ...)					\ -	asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)) - -#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */ +	static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))  asmlinkage long sys_time(time_t __user *tloc);  asmlinkage long sys_stime(time_t __user *tptr); @@ -694,7 +638,7 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);  asmlinkage long sys_semget(key_t key, int nsems, int semflg);  asmlinkage long sys_semop(int semid, struct sembuf __user *sops,  				unsigned nsops); -asmlinkage long sys_semctl(int semid, int semnum, int cmd, union semun arg); +asmlinkage long sys_semctl(int semid, int semnum, int cmd, unsigned long arg);  asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops,  				unsigned nsops,  				const struct timespec __user *timeout); diff --git a/ipc/compat.c b/ipc/compat.c index 2547f29dcd1..892f6585dd6 100644 --- a/ipc/compat.c +++ b/ipc/compat.c @@ -240,7 +240,7 @@ static inline int put_compat_semid_ds(struct semid64_ds *s,  static long do_compat_semctl(int first, int second, int third, u32 pad)  { -	union semun fourth; +	unsigned long fourth;  	int err, err2;  	struct semid64_ds s64;  	struct semid64_ds __user *up64; @@ -249,9 +249,13 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)  	memset(&s64, 0, sizeof(s64));  	if ((third & (~IPC_64)) == SETVAL) -		fourth.val = (int) pad; +#ifdef __BIG_ENDIAN +		fourth = (unsigned long)pad << 32; +#else +		fourth = pad; +#endif  	else -		fourth.__pad = compat_ptr(pad); +		fourth = (unsigned long)compat_ptr(pad);  	switch (third & (~IPC_64)) {  	case IPC_INFO:  	case IPC_RMID: @@ -269,7 +273,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)  	case IPC_STAT:  	case SEM_STAT:  		up64 = compat_alloc_user_space(sizeof(s64)); -		fourth.__pad = up64; +		fourth = (unsigned long)up64;  		err = sys_semctl(first, second, third, fourth);  		if (err < 0)  			break; @@ -295,7 +299,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)  		if (err)  			break; -		fourth.__pad = up64; +		fourth = (unsigned long)up64;  		err = sys_semctl(first, second, third, fourth);  		break; @@ -306,7 +310,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)  	return err;  } -long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz) +static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)  {  	struct compat_msgbuf __user *msgp = dest;  	size_t msgsz; @@ -320,77 +324,117 @@ long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)  	return msgsz;  } +#ifndef COMPAT_SHMLBA +#define COMPAT_SHMLBA	SHMLBA +#endif +  #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC -long compat_sys_semctl(int first, int second, int third, void __user *uptr) +COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second, +	u32, third, compat_uptr_t, ptr, u32, fifth)  { +	int version;  	u32 pad; -	if (!uptr) -		return -EINVAL; -	if (get_user(pad, (u32 __user *) uptr)) -		return -EFAULT; -	return do_compat_semctl(first, second, third, pad); -} +	version = call >> 16; /* hack for backward compatibility */ +	call &= 0xffff; -long compat_sys_msgsnd(int first, int second, int third, void __user *uptr) -{ -	struct compat_msgbuf __user *up = uptr; -	long type; +	switch (call) { +	case SEMOP: +		/* struct sembuf is the same on 32 and 64bit :)) */ +		return sys_semtimedop(first, compat_ptr(ptr), second, NULL); +	case SEMTIMEDOP: +		return compat_sys_semtimedop(first, compat_ptr(ptr), second, +						compat_ptr(fifth)); +	case SEMGET: +		return sys_semget(first, second, third); +	case SEMCTL: +		if (!ptr) +			return -EINVAL; +		if (get_user(pad, (u32 __user *) compat_ptr(ptr))) +			return -EFAULT; +		return do_compat_semctl(first, second, third, pad); -	if (first < 0) -		return -EINVAL; -	if (second < 0) -		return -EINVAL; +	case MSGSND: { +		struct compat_msgbuf __user *up = compat_ptr(ptr); +		compat_long_t type; -	if (get_user(type, &up->mtype)) -		return -EFAULT; +		if (first < 0 || second < 0) +			return -EINVAL; -	return do_msgsnd(first, type, up->mtext, second, third); -} +		if (get_user(type, &up->mtype)) +			return -EFAULT; -long compat_sys_msgrcv(int first, int second, int msgtyp, int third, -			   int version, void __user *uptr) -{ -	if (first < 0) -		return -EINVAL; -	if (second < 0) -		return -EINVAL; +		return do_msgsnd(first, type, up->mtext, second, third); +	} +	case MSGRCV: { +		void __user *uptr = compat_ptr(ptr); -	if (!version) { -		struct compat_ipc_kludge ipck; -		if (!uptr) +		if (first < 0 || second < 0)  			return -EINVAL; -		if (copy_from_user (&ipck, uptr, sizeof(ipck))) -			return -EFAULT; -		uptr = compat_ptr(ipck.msgp); -		msgtyp = ipck.msgtyp; + +		if (!version) { +			struct compat_ipc_kludge ipck; +			if (!uptr) +				return -EINVAL; +			if (copy_from_user (&ipck, uptr, sizeof(ipck))) +				return -EFAULT; +			uptr = compat_ptr(ipck.msgp); +			fifth = ipck.msgtyp; +		} +		return do_msgrcv(first, uptr, second, fifth, third, +				 compat_do_msg_fill);  	} -	return do_msgrcv(first, uptr, second, msgtyp, third, -			 compat_do_msg_fill); +	case MSGGET: +		return sys_msgget(first, second); +	case MSGCTL: +		return compat_sys_msgctl(first, second, compat_ptr(ptr)); + +	case SHMAT: { +		int err; +		unsigned long raddr; + +		if (version == 1) +			return -EINVAL; +		err = do_shmat(first, compat_ptr(ptr), second, &raddr, +			       COMPAT_SHMLBA); +		if (err < 0) +			return err; +		return put_user(raddr, (compat_ulong_t *)compat_ptr(third)); +	} +	case SHMDT: +		return sys_shmdt(compat_ptr(ptr)); +	case SHMGET: +		return sys_shmget(first, (unsigned)second, third); +	case SHMCTL: +		return compat_sys_shmctl(first, second, compat_ptr(ptr)); +	} + +	return -ENOSYS;  } -#else -long compat_sys_semctl(int semid, int semnum, int cmd, int arg) +#endif + +COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)  {  	return do_compat_semctl(semid, semnum, cmd, arg);  } -long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp, -		       compat_ssize_t msgsz, int msgflg) +COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp, +		       compat_ssize_t, msgsz, int, msgflg)  { +	struct compat_msgbuf __user *up = compat_ptr(msgp);  	compat_long_t mtype; -	if (get_user(mtype, &msgp->mtype)) +	if (get_user(mtype, &up->mtype))  		return -EFAULT; -	return do_msgsnd(msqid, mtype, msgp->mtext, (ssize_t)msgsz, msgflg); +	return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);  } -long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp, -		       compat_ssize_t msgsz, long msgtyp, int msgflg) +COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp, +		       compat_ssize_t, msgsz, long, msgtyp, int, msgflg)  { -	return do_msgrcv(msqid, msgp, (ssize_t)msgsz, msgtyp, msgflg, -			 compat_do_msg_fill); +	return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, msgtyp, +			 msgflg, compat_do_msg_fill);  } -#endif  static inline int get_compat_msqid64(struct msqid64_ds *m64,  				     struct compat_msqid64_ds __user *up64) @@ -508,28 +552,7 @@ long compat_sys_msgctl(int first, int second, void __user *uptr)  	return err;  } -#ifndef COMPAT_SHMLBA -#define COMPAT_SHMLBA	SHMLBA -#endif - -#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC -long compat_sys_shmat(int first, int second, compat_uptr_t third, int version, -			void __user *uptr) -{ -	int err; -	unsigned long raddr; -	compat_ulong_t __user *uaddr; - -	if (version == 1) -		return -EINVAL; -	err = do_shmat(first, uptr, second, &raddr, COMPAT_SHMLBA); -	if (err < 0) -		return err; -	uaddr = compat_ptr(third); -	return put_user(raddr, uaddr); -} -#else -long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg) +COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)  {  	unsigned long ret;  	long err; @@ -540,7 +563,6 @@ long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg)  	force_successful_syscall_return();  	return (long)ret;  } -#endif  static inline int get_compat_shmid64_ds(struct shmid64_ds *s64,  					struct compat_shmid64_ds __user *up64) diff --git a/ipc/sem.c b/ipc/sem.c index 58d31f1c1eb..5b167d00efa 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -799,7 +799,7 @@ static unsigned long copy_semid_to_user(void __user *buf, struct semid64_ds *in,  }  static int semctl_nolock(struct ipc_namespace *ns, int semid, -			 int cmd, int version, union semun arg) +			 int cmd, int version, void __user *p)  {  	int err;  	struct sem_array *sma; @@ -834,7 +834,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,  		}  		max_id = ipc_get_maxid(&sem_ids(ns));  		up_read(&sem_ids(ns).rw_mutex); -		if (copy_to_user (arg.__buf, &seminfo, sizeof(struct seminfo)))  +		if (copy_to_user(p, &seminfo, sizeof(struct seminfo)))   			return -EFAULT;  		return (max_id < 0) ? 0: max_id;  	} @@ -871,7 +871,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,  		tbuf.sem_ctime  = sma->sem_ctime;  		tbuf.sem_nsems  = sma->sem_nsems;  		sem_unlock(sma); -		if (copy_semid_to_user (arg.buf, &tbuf, version)) +		if (copy_semid_to_user(p, &tbuf, version))  			return -EFAULT;  		return id;  	} @@ -883,8 +883,67 @@ out_unlock:  	return err;  } +static int semctl_setval(struct ipc_namespace *ns, int semid, int semnum, +		unsigned long arg) +{ +	struct sem_undo *un; +	struct sem_array *sma; +	struct sem* curr; +	int err; +	int nsems; +	struct list_head tasks; +	int val; +#if defined(CONFIG_64BIT) && defined(__BIG_ENDIAN) +	/* big-endian 64bit */ +	val = arg >> 32; +#else +	/* 32bit or little-endian 64bit */ +	val = arg; +#endif + +	sma = sem_lock_check(ns, semid); +	if (IS_ERR(sma)) +		return PTR_ERR(sma); + +	INIT_LIST_HEAD(&tasks); +	nsems = sma->sem_nsems; + +	err = -EACCES; +	if (ipcperms(ns, &sma->sem_perm, S_IWUGO)) +		goto out_unlock; + +	err = security_sem_semctl(sma, SETVAL); +	if (err) +		goto out_unlock; + +	err = -EINVAL; +	if(semnum < 0 || semnum >= nsems) +		goto out_unlock; + +	curr = &sma->sem_base[semnum]; + +	err = -ERANGE; +	if (val > SEMVMX || val < 0) +		goto out_unlock; + +	assert_spin_locked(&sma->sem_perm.lock); +	list_for_each_entry(un, &sma->list_id, list_id) +		un->semadj[semnum] = 0; + +	curr->semval = val; +	curr->sempid = task_tgid_vnr(current); +	sma->sem_ctime = get_seconds(); +	/* maybe some queued-up processes were waiting for this */ +	do_smart_update(sma, NULL, 0, 0, &tasks); +	err = 0; +out_unlock: +	sem_unlock(sma); +	wake_up_sem_queue_do(&tasks); +	return err; +} +  static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, -		int cmd, int version, union semun arg) +		int cmd, void __user *p)  {  	struct sem_array *sma;  	struct sem* curr; @@ -903,7 +962,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,  	err = -EACCES;  	if (ipcperms(ns, &sma->sem_perm, -			(cmd == SETVAL || cmd == SETALL) ? S_IWUGO : S_IRUGO)) +			cmd == SETALL ? S_IWUGO : S_IRUGO))  		goto out_unlock;  	err = security_sem_semctl(sma, cmd); @@ -914,7 +973,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,  	switch (cmd) {  	case GETALL:  	{ -		ushort __user *array = arg.array; +		ushort __user *array = p;  		int i;  		if(nsems > SEMMSL_FAST) { @@ -957,7 +1016,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,  			}  		} -		if (copy_from_user (sem_io, arg.array, nsems*sizeof(ushort))) { +		if (copy_from_user (sem_io, p, nsems*sizeof(ushort))) {  			sem_putref(sma);  			err = -EFAULT;  			goto out_free; @@ -991,7 +1050,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,  		err = 0;  		goto out_unlock;  	} -	/* GETVAL, GETPID, GETNCTN, GETZCNT, SETVAL: fall-through */ +	/* GETVAL, GETPID, GETNCTN, GETZCNT: fall-through */  	}  	err = -EINVAL;  	if(semnum < 0 || semnum >= nsems) @@ -1012,27 +1071,6 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,  	case GETZCNT:  		err = count_semzcnt(sma,semnum);  		goto out_unlock; -	case SETVAL: -	{ -		int val = arg.val; -		struct sem_undo *un; - -		err = -ERANGE; -		if (val > SEMVMX || val < 0) -			goto out_unlock; - -		assert_spin_locked(&sma->sem_perm.lock); -		list_for_each_entry(un, &sma->list_id, list_id) -			un->semadj[semnum] = 0; - -		curr->semval = val; -		curr->sempid = task_tgid_vnr(current); -		sma->sem_ctime = get_seconds(); -		/* maybe some queued-up processes were waiting for this */ -		do_smart_update(sma, NULL, 0, 0, &tasks); -		err = 0; -		goto out_unlock; -	}  	}  out_unlock:  	sem_unlock(sma); @@ -1076,7 +1114,7 @@ copy_semid_from_user(struct semid64_ds *out, void __user *buf, int version)   * NOTE: no locks must be held, the rw_mutex is taken inside this function.   */  static int semctl_down(struct ipc_namespace *ns, int semid, -		       int cmd, int version, union semun arg) +		       int cmd, int version, void __user *p)  {  	struct sem_array *sma;  	int err; @@ -1084,7 +1122,7 @@ static int semctl_down(struct ipc_namespace *ns, int semid,  	struct kern_ipc_perm *ipcp;  	if(cmd == IPC_SET) { -		if (copy_semid_from_user(&semid64, arg.buf, version)) +		if (copy_semid_from_user(&semid64, p, version))  			return -EFAULT;  	} @@ -1120,11 +1158,11 @@ out_up:  	return err;  } -SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg) +SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)  { -	int err = -EINVAL;  	int version;  	struct ipc_namespace *ns; +	void __user *p = (void __user *)arg;  	if (semid < 0)  		return -EINVAL; @@ -1137,32 +1175,23 @@ SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg)  	case SEM_INFO:  	case IPC_STAT:  	case SEM_STAT: -		err = semctl_nolock(ns, semid, cmd, version, arg); -		return err; +		return semctl_nolock(ns, semid, cmd, version, p);  	case GETALL:  	case GETVAL:  	case GETPID:  	case GETNCNT:  	case GETZCNT: -	case SETVAL:  	case SETALL: -		err = semctl_main(ns,semid,semnum,cmd,version,arg); -		return err; +		return semctl_main(ns, semid, semnum, cmd, p); +	case SETVAL: +		return semctl_setval(ns, semid, semnum, arg);  	case IPC_RMID:  	case IPC_SET: -		err = semctl_down(ns, semid, cmd, version, arg); -		return err; +		return semctl_down(ns, semid, cmd, version, p);  	default:  		return -EINVAL;  	}  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_semctl(int semid, int semnum, int cmd, union semun arg) -{ -	return SYSC_semctl((int) semid, (int) semnum, (int) cmd, arg); -} -SYSCALL_ALIAS(sys_semctl, SyS_semctl); -#endif  /* If the task doesn't already have a undo_list, then allocate one   * here.  We guarantee there is only one thread using this undo list, diff --git a/ipc/syscall.c b/ipc/syscall.c index 0d1e32ce048..52429489cde 100644 --- a/ipc/syscall.c +++ b/ipc/syscall.c @@ -33,12 +33,12 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,  	case SEMGET:  		return sys_semget(first, second, third);  	case SEMCTL: { -		union semun fourth; +		unsigned long arg;  		if (!ptr)  			return -EINVAL; -		if (get_user(fourth.__pad, (void __user * __user *) ptr)) +		if (get_user(arg, (unsigned long __user *) ptr))  			return -EFAULT; -		return sys_semctl(first, second, third, fourth); +		return sys_semctl(first, second, third, arg);  	}  	case MSGSND: diff --git a/kernel/compat.c b/kernel/compat.c index 1e8f1455117..0a09e481b70 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -516,25 +516,6 @@ int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru)  	return 0;  } -asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru) -{ -	struct rusage r; -	int ret; -	mm_segment_t old_fs = get_fs(); - -	set_fs(KERNEL_DS); -	ret = sys_getrusage(who, (struct rusage __user *) &r); -	set_fs(old_fs); - -	if (ret) -		return ret; - -	if (put_compat_rusage(&r, ru)) -		return -EFAULT; - -	return 0; -} -  COMPAT_SYSCALL_DEFINE4(wait4,  	compat_pid_t, pid,  	compat_uint_t __user *, stat_addr, diff --git a/kernel/exit.c b/kernel/exit.c index 60bc027c61c..6e3151ec900 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -1629,9 +1629,6 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,  	}  	put_pid(pid); - -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(5, ret, which, upid, infop, options, ru);  	return ret;  } @@ -1669,8 +1666,6 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,  	ret = do_wait(&wo);  	put_pid(pid); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(4, ret, upid, stat_addr, options, ru);  	return ret;  } diff --git a/kernel/fork.c b/kernel/fork.c index 339f60dfd62..7d40687b143 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1677,10 +1677,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,  		 int, tls_val)  #endif  { -	long ret = do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr); -	asmlinkage_protect(5, ret, clone_flags, newsp, -			parent_tidptr, child_tidptr, tls_val); -	return ret; +	return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);  }  #endif diff --git a/kernel/sys.c b/kernel/sys.c index afd0f7e125c..b95d3c72ba2 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1851,6 +1851,20 @@ SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)  	return getrusage(current, who, ru);  } +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, ru) +{ +	struct rusage r; + +	if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN && +	    who != RUSAGE_THREAD) +		return -EINVAL; + +	k_getrusage(current, who, &r); +	return put_compat_rusage(&r, ru); +} +#endif +  SYSCALL_DEFINE1(umask, int, mask)  {  	mask = xchg(¤t->fs->umask, mask & S_IRWXUGO); diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index 395084d4ce1..bfd6787b355 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c @@ -20,6 +20,7 @@ cond_syscall(sys_quotactl);  cond_syscall(sys32_quotactl);  cond_syscall(sys_acct);  cond_syscall(sys_lookup_dcookie); +cond_syscall(compat_sys_lookup_dcookie);  cond_syscall(sys_swapon);  cond_syscall(sys_swapoff);  cond_syscall(sys_kexec_load); @@ -155,7 +156,7 @@ cond_syscall(compat_sys_process_vm_writev);  cond_syscall(sys_pciconfig_read);  cond_syscall(sys_pciconfig_write);  cond_syscall(sys_pciconfig_iobase); -cond_syscall(sys32_ipc); +cond_syscall(compat_sys_s390_ipc);  cond_syscall(ppc_rtas);  cond_syscall(sys_spu_run);  cond_syscall(sys_spu_create); diff --git a/kernel/uid16.c b/kernel/uid16.c index d7948eb1022..f6c83d7ef00 100644 --- a/kernel/uid16.c +++ b/kernel/uid16.c @@ -18,67 +18,43 @@  SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)  { -	long ret = sys_chown(filename, low2highuid(user), low2highgid(group)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(3, ret, filename, user, group); -	return ret; +	return sys_chown(filename, low2highuid(user), low2highgid(group));  }  SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)  { -	long ret = sys_lchown(filename, low2highuid(user), low2highgid(group)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(3, ret, filename, user, group); -	return ret; +	return sys_lchown(filename, low2highuid(user), low2highgid(group));  }  SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)  { -	long ret = sys_fchown(fd, low2highuid(user), low2highgid(group)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(3, ret, fd, user, group); -	return ret; +	return sys_fchown(fd, low2highuid(user), low2highgid(group));  }  SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)  { -	long ret = sys_setregid(low2highgid(rgid), low2highgid(egid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(2, ret, rgid, egid); -	return ret; +	return sys_setregid(low2highgid(rgid), low2highgid(egid));  }  SYSCALL_DEFINE1(setgid16, old_gid_t, gid)  { -	long ret = sys_setgid(low2highgid(gid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(1, ret, gid); -	return ret; +	return sys_setgid(low2highgid(gid));  }  SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)  { -	long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(2, ret, ruid, euid); -	return ret; +	return sys_setreuid(low2highuid(ruid), low2highuid(euid));  }  SYSCALL_DEFINE1(setuid16, old_uid_t, uid)  { -	long ret = sys_setuid(low2highuid(uid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(1, ret, uid); -	return ret; +	return sys_setuid(low2highuid(uid));  }  SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)  { -	long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid), +	return sys_setresuid(low2highuid(ruid), low2highuid(euid),  				 low2highuid(suid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(3, ret, ruid, euid, suid); -	return ret;  }  SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp) @@ -100,11 +76,8 @@ SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euid  SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)  { -	long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid), +	return sys_setresgid(low2highgid(rgid), low2highgid(egid),  				 low2highgid(sgid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(3, ret, rgid, egid, sgid); -	return ret;  } @@ -127,18 +100,12 @@ SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egid  SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)  { -	long ret = sys_setfsuid(low2highuid(uid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(1, ret, uid); -	return ret; +	return sys_setfsuid(low2highuid(uid));  }  SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)  { -	long ret = sys_setfsgid(low2highgid(gid)); -	/* avoid REGPARM breakage on x86: */ -	asmlinkage_protect(1, ret, gid); -	return ret; +	return sys_setfsgid(low2highgid(gid));  }  static int groups16_to_user(old_gid_t __user *grouplist, diff --git a/mm/fadvise.c b/mm/fadvise.c index 7e092689a12..3bcfd81db45 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c @@ -25,7 +25,7 @@   * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could   * deactivate the pages and clear PG_Referenced.   */ -SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) +SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)  {  	struct fd f = fdget(fd);  	struct address_space *mapping; @@ -145,26 +145,12 @@ out:  	fdput(f);  	return ret;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_fadvise64_64(long fd, loff_t offset, loff_t len, long advice) -{ -	return SYSC_fadvise64_64((int) fd, offset, len, (int) advice); -} -SYSCALL_ALIAS(sys_fadvise64_64, SyS_fadvise64_64); -#endif  #ifdef __ARCH_WANT_SYS_FADVISE64 -SYSCALL_DEFINE(fadvise64)(int fd, loff_t offset, size_t len, int advice) +SYSCALL_DEFINE4(fadvise64, int, fd, loff_t, offset, size_t, len, int, advice)  {  	return sys_fadvise64_64(fd, offset, len, advice);  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_fadvise64(long fd, loff_t offset, long len, long advice) -{ -	return SYSC_fadvise64((int) fd, offset, (size_t)len, (int)advice); -} -SYSCALL_ALIAS(sys_fadvise64, SyS_fadvise64); -#endif  #endif diff --git a/mm/nommu.c b/mm/nommu.c index fbe3e2f317e..298884dcd6e 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1771,7 +1771,7 @@ unsigned long vm_brk(unsigned long addr, unsigned long len)   *   * MREMAP_FIXED is not supported under NOMMU conditions   */ -unsigned long do_mremap(unsigned long addr, +static unsigned long do_mremap(unsigned long addr,  			unsigned long old_len, unsigned long new_len,  			unsigned long flags, unsigned long new_addr)  { @@ -1806,7 +1806,6 @@ unsigned long do_mremap(unsigned long addr,  	vma->vm_end = vma->vm_start + new_len;  	return vma->vm_start;  } -EXPORT_SYMBOL(do_mremap);  SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,  		unsigned long, new_len, unsigned long, flags, diff --git a/mm/readahead.c b/mm/readahead.c index 7963f239123..daed28dd583 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -576,7 +576,7 @@ do_readahead(struct address_space *mapping, struct file *filp,  	return 0;  } -SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count) +SYSCALL_DEFINE3(readahead, int, fd, loff_t, offset, size_t, count)  {  	ssize_t ret;  	struct fd f; @@ -595,10 +595,3 @@ SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)  	}  	return ret;  } -#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS -asmlinkage long SyS_readahead(long fd, loff_t offset, long count) -{ -	return SYSC_readahead((int) fd, offset, (size_t) count); -} -SYSCALL_ALIAS(sys_readahead, SyS_readahead); -#endif |