Commit 08d76760 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 5f568865 99e621f7
...@@ -157,9 +157,6 @@ config ARCH_USE_BUILTIN_BSWAP ...@@ -157,9 +157,6 @@ config ARCH_USE_BUILTIN_BSWAP
instructions should set this. And it shouldn't hurt to set it instructions should set this. And it shouldn't hurt to set it
on architectures that don't have such instructions. on architectures that don't have such instructions.
config HAVE_SYSCALL_WRAPPERS
bool
config KRETPROBES config KRETPROBES
def_bool y def_bool y
depends on KPROBES && HAVE_KRETPROBES depends on KPROBES && HAVE_KRETPROBES
......
...@@ -4,7 +4,6 @@ config ALPHA ...@@ -4,7 +4,6 @@ config ALPHA
select HAVE_AOUT select HAVE_AOUT
select HAVE_IDE select HAVE_IDE
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_SYSCALL_WRAPPERS
select HAVE_PCSPKR_PLATFORM select HAVE_PCSPKR_PLATFORM
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
select HAVE_DMA_ATTRS select HAVE_DMA_ATTRS
......
#ifndef __ASM_LINKAGE_H #ifndef __ASM_LINKAGE_H
#define __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 #endif
...@@ -18,16 +18,4 @@ ...@@ -18,16 +18,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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 */ #endif /* _ALPHA_UNISTD_H */
...@@ -43,14 +43,6 @@ ...@@ -43,14 +43,6 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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 * Unimplemented (or alternatively implemented) syscalls
*/ */
......
...@@ -84,13 +84,6 @@ compat_sys_readahead_wrapper: ...@@ -84,13 +84,6 @@ compat_sys_readahead_wrapper:
b sys_readahead b sys_readahead
ENDPROC(compat_sys_readahead_wrapper) 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: compat_sys_fadvise64_64_wrapper:
mov w6, w1 mov w6, w1
orr x1, x2, x3, lsl #32 orr x1, x2, x3, lsl #32
......
...@@ -41,12 +41,4 @@ ...@@ -41,12 +41,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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 */ #endif /* __ASM_AVR32_UNISTD_H */
...@@ -20,12 +20,4 @@ ...@@ -20,12 +20,4 @@
#define __ARCH_WANT_SYS_NICE #define __ARCH_WANT_SYS_NICE
#define __ARCH_WANT_SYS_VFORK #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 */ #endif /* __ASM_BFIN_UNISTD_H */
...@@ -34,12 +34,4 @@ ...@@ -34,12 +34,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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_ */ #endif /* _ASM_CRIS_UNISTD_H_ */
...@@ -31,14 +31,4 @@ ...@@ -31,14 +31,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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_ */ #endif /* _ASM_UNISTD_H_ */
...@@ -2,7 +2,5 @@ ...@@ -2,7 +2,5 @@
#define _H8300_LINKAGE_H #define _H8300_LINKAGE_H
#undef SYMBOL_NAME_LABEL #undef SYMBOL_NAME_LABEL
#undef SYMBOL_NAME
#define SYMBOL_NAME_LABEL(_name_) _##_name_##: #define SYMBOL_NAME_LABEL(_name_) _##_name_##:
#define SYMBOL_NAME(_name_) _##_name_
#endif #endif
...@@ -33,11 +33,4 @@ ...@@ -33,11 +33,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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_ */ #endif /* _ASM_H8300_UNISTD_H_ */
...@@ -11,4 +11,8 @@ ...@@ -11,4 +11,8 @@
#endif #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 #endif
...@@ -46,15 +46,5 @@ asmlinkage unsigned long sys_mmap2( ...@@ -46,15 +46,5 @@ asmlinkage unsigned long sys_mmap2(
struct pt_regs; struct pt_regs;
asmlinkage long sys_ia64_pipe(void); 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 /* !__ASSEMBLY__ */
#endif /* _ASM_IA64_UNISTD_H */ #endif /* _ASM_IA64_UNISTD_H */
...@@ -48,14 +48,4 @@ ...@@ -48,14 +48,4 @@
#define __IGNORE_getresgid #define __IGNORE_getresgid
#define __IGNORE_chown #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 */ #endif /* _ASM_M32R_UNISTD_H */
...@@ -32,12 +32,4 @@ ...@@ -32,12 +32,4 @@
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #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_ */ #endif /* _ASM_M68K_UNISTD_H_ */
...@@ -37,13 +37,5 @@ ...@@ -37,13 +37,5 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_FORK #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 /* __ASSEMBLY__ */
#endif /* _ASM_MICROBLAZE_UNISTD_H */ #endif /* _ASM_MICROBLAZE_UNISTD_H */
...@@ -1739,7 +1739,6 @@ config 32BIT ...@@ -1739,7 +1739,6 @@ config 32BIT
config 64BIT config 64BIT
bool "64-bit kernel" bool "64-bit kernel"
depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL
select HAVE_SYSCALL_WRAPPERS
help help
Select this option if you want to build a 64-bit kernel. Select this option if you want to build a 64-bit kernel.
......
...@@ -6,5 +6,8 @@ ...@@ -6,5 +6,8 @@
#endif #endif
#define __weak __attribute__((weak)) #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 #endif
...@@ -63,12 +63,4 @@ ...@@ -63,12 +63,4 @@
#endif /* !__ASSEMBLY__ */ #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 */ #endif /* _ASM_UNISTD_H */
...@@ -119,99 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf, ...@@ -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)); 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) SYSCALL_DEFINE1(32_personality, unsigned long, personality)
{ {
unsigned int p = personality & 0xffffffff; unsigned int p = personality & 0xffffffff;
...@@ -226,26 +133,6 @@ SYSCALL_DEFINE1(32_personality, unsigned long, personality) ...@@ -226,26 +133,6 @@ SYSCALL_DEFINE1(32_personality, unsigned long, personality)
return ret; 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, asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3,
size_t count) size_t count)
{ {
...@@ -279,12 +166,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2, ...@@ -279,12 +166,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,
merge_64(len_a4, len_a5)); 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, SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags,
u64, a3, u64, a4, int, dfd, const char __user *, pathname) u64, a3, u64, a4, int, dfd, const char __user *, pathname)
{ {
......
...@@ -143,7 +143,7 @@ EXPORT(sysn32_call_table) ...@@ -143,7 +143,7 @@ EXPORT(sysn32_call_table)
PTR compat_sys_setitimer PTR compat_sys_setitimer
PTR sys_alarm PTR sys_alarm
PTR sys_getpid PTR sys_getpid
PTR sys_32_sendfile PTR compat_sys_sendfile
PTR sys_socket /* 6040 */ PTR sys_socket /* 6040 */
PTR sys_connect PTR sys_connect
PTR sys_accept PTR sys_accept
...@@ -168,11 +168,11 @@ EXPORT(sysn32_call_table) ...@@ -168,11 +168,11 @@ EXPORT(sysn32_call_table)
PTR sys_newuname PTR sys_newuname
PTR sys_semget PTR sys_semget
PTR sys_semop PTR sys_semop
PTR sys_n32_semctl PTR compat_sys_semctl
PTR sys_shmdt /* 6065 */ PTR sys_shmdt /* 6065 */
PTR sys_msgget PTR sys_msgget
PTR sys_n32_msgsnd PTR compat_sys_msgsnd
PTR sys_n32_msgrcv PTR compat_sys_msgrcv
PTR compat_sys_msgctl PTR compat_sys_msgctl
PTR compat_sys_fcntl /* 6070 */ PTR compat_sys_fcntl /* 6070 */
PTR sys_flock PTR sys_flock
......
...@@ -309,7 +309,7 @@ sys_call_table: ...@@ -309,7 +309,7 @@ sys_call_table:
PTR compat_sys_wait4 PTR compat_sys_wait4
PTR sys_swapoff /* 4115 */ PTR sys_swapoff /* 4115 */
PTR compat_sys_sysinfo PTR compat_sys_sysinfo
PTR sys_32_ipc PTR compat_sys_ipc
PTR sys_fsync PTR sys_fsync
PTR sys32_sigreturn PTR sys32_sigreturn
PTR __sys_clone /* 4120 */ PTR __sys_clone /* 4120 */
...@@ -399,7 +399,7 @@ sys_call_table: ...@@ -399,7 +399,7 @@ sys_call_table:
PTR sys_capget PTR sys_capget
PTR sys_capset /* 4205 */ PTR sys_capset /* 4205 */
PTR compat_sys_sigaltstack PTR compat_sys_sigaltstack
PTR sys_32_sendfile PTR compat_sys_sendfile
PTR sys_ni_syscall PTR sys_ni_syscall
PTR sys_ni_syscall PTR sys_ni_syscall
PTR sys_mips_mmap2 /* 4210 */ PTR sys_mips_mmap2 /* 4210 */
...@@ -439,7 +439,7 @@ sys_call_table: ...@@ -439,7 +439,7 @@ sys_call_table:
PTR compat_sys_io_submit PTR compat_sys_io_submit
PTR sys_io_cancel /* 4245 */ PTR sys_io_cancel /* 4245 */
PTR sys_exit_group PTR sys_exit_group
PTR sys32_lookup_dcookie PTR compat_sys_lookup_dcookie
PTR sys_epoll_create PTR sys_epoll_create
PTR sys_epoll_ctl PTR sys_epoll_ctl
PTR sys_epoll_wait /* 4250 */ PTR sys_epoll_wait /* 4250 */
......
...@@ -45,14 +45,4 @@ ...@@ -45,14 +45,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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 */ #endif /* _ASM_UNISTD_H */
...@@ -170,12 +170,4 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ ...@@ -170,12 +170,4 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
#undef STR #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_ */ #endif /* _ASM_PARISC_UNISTD_H_ */
...@@ -60,47 +60,6 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23, ...@@ -60,47 +60,6 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,
return -ENOSYS; 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, asmlinkage long compat_sys_fanotify_mark(int fan_fd, int flags, u32 mask_hi,
u32 mask_lo, int fd, u32 mask_lo, int fd,
const char __user *pathname) const char __user *pathname)
......
...@@ -198,7 +198,7 @@ ...@@ -198,7 +198,7 @@
ENTRY_SAME(madvise) ENTRY_SAME(madvise)
ENTRY_SAME(clone_wrapper) /* 120 */ ENTRY_SAME(clone_wrapper) /* 120 */
ENTRY_SAME(setdomainname) ENTRY_SAME(setdomainname)
ENTRY_DIFF(sendfile) ENTRY_COMP(sendfile)
/* struct sockaddr... */ /* struct sockaddr... */
ENTRY_SAME(recvfrom) ENTRY_SAME(recvfrom)
/* struct timex contains longs */ /* struct timex contains longs */
...@@ -282,7 +282,7 @@ ...@@ -282,7 +282,7 @@
ENTRY_COMP(recvmsg) ENTRY_COMP(recvmsg)
ENTRY_SAME(semop) /* 185 */ ENTRY_SAME(semop) /* 185 */
ENTRY_SAME(semget) ENTRY_SAME(semget)
ENTRY_DIFF(semctl) ENTRY_COMP(semctl)
ENTRY_COMP(msgsnd) ENTRY_COMP(msgsnd)
ENTRY_COMP(msgrcv) ENTRY_COMP(msgrcv)
ENTRY_SAME(msgget) /* 190 */ ENTRY_SAME(msgget) /* 190 */
...@@ -304,7 +304,7 @@ ...@@ -304,7 +304,7 @@
ENTRY_SAME(gettid) ENTRY_SAME(gettid)
ENTRY_OURS(readahead) ENTRY_OURS(readahead)
ENTRY_SAME(tkill) ENTRY_SAME(tkill)
ENTRY_DIFF(sendfile64) ENTRY_COMP(sendfile64)
ENTRY_COMP(futex) /* 210 */ ENTRY_COMP(futex) /* 210 */
ENTRY_COMP(sched_setaffinity) ENTRY_COMP(sched_setaffinity)
ENTRY_COMP(sched_getaffinity) ENTRY_COMP(sched_getaffinity)
...@@ -318,7 +318,7 @@ ...@@ -318,7 +318,7 @@
ENTRY_SAME(alloc_hugepages) /* 220 */ ENTRY_SAME(alloc_hugepages) /* 220 */
ENTRY_SAME(free_hugepages) ENTRY_SAME(free_hugepages)
ENTRY_SAME(exit_group) ENTRY_SAME(exit_group)
ENTRY_DIFF(lookup_dcookie) ENTRY_COMP(lookup_dcookie)
ENTRY_SAME(epoll_create) ENTRY_SAME(epoll_create)
ENTRY_SAME(epoll_ctl) /* 225 */ ENTRY_SAME(epoll_ctl) /* 225 */
ENTRY_SAME(epoll_wait) ENTRY_SAME(epoll_wait)
......
...@@ -114,7 +114,6 @@ config PPC ...@@ -114,7 +114,6 @@ config PPC
select USE_GENERIC_SMP_HELPERS if SMP select USE_GENERIC_SMP_HELPERS if SMP
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
select HAVE_SYSCALL_WRAPPERS if PPC64
select GENERIC_ATOMIC64 if PPC32 select GENERIC_ATOMIC64 if PPC32
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
......
#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 */
...@@ -190,7 +190,7 @@ SYSCALL_SPU(getcwd) ...@@ -190,7 +190,7 @@ SYSCALL_SPU(getcwd)
SYSCALL_SPU(capget) SYSCALL_SPU(capget)
SYSCALL_SPU(capset) SYSCALL_SPU(capset)
COMPAT_SYS(sigaltstack) COMPAT_SYS(sigaltstack)
SYSX_SPU(sys_sendfile,compat_sys_sendfile_wrapper,sys_sendfile) COMPAT_SYS_SPU(sendfile)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
PPC_SYS(vfork) PPC_SYS(vfork)
...@@ -230,7 +230,7 @@ COMPAT_SYS_SPU(sched_setaffinity) ...@@ -230,7 +230,7 @@ COMPAT_SYS_SPU(sched_setaffinity)
COMPAT_SYS_SPU(sched_getaffinity) COMPAT_SYS_SPU(sched_getaffinity)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSCALL(ni_syscall) SYSCALL(ni_syscall)
SYSX(sys_ni_syscall,compat_sys_sendfile64_wrapper,sys_sendfile64) SYS32ONLY(sendfile64)
COMPAT_SYS_SPU(io_setup) COMPAT_SYS_SPU(io_setup)
SYSCALL_SPU(io_destroy) SYSCALL_SPU(io_destroy)
COMPAT_SYS_SPU(io_getevents) COMPAT_SYS_SPU(io_getevents)
...@@ -239,7 +239,7 @@ SYSCALL_SPU(io_cancel) ...@@ -239,7 +239,7 @@ SYSCALL_SPU(io_cancel)
SYSCALL(set_tid_address) SYSCALL(set_tid_address)
SYSX_SPU(sys_fadvise64,ppc32_fadvise64,sys_fadvise64) SYSX_SPU(sys_fadvise64,ppc32_fadvise64,sys_fadvise64)
SYSCALL(exit_group) SYSCALL(exit_group)
SYSX(sys_lookup_dcookie,ppc32_lookup_dcookie,sys_lookup_dcookie) COMPAT_SYS(lookup_dcookie)
SYSCALL_SPU(epoll_create) SYSCALL_SPU(epoll_create)
SYSCALL_SPU(epoll_ctl) SYSCALL_SPU(epoll_ctl)
SYSCALL_SPU(epoll_wait) SYSCALL_SPU(epoll_wait)
...@@ -273,8 +273,8 @@ COMPAT_SYS(mq_timedreceive) ...@@ -273,8 +273,8 @@ COMPAT_SYS(mq_timedreceive)
COMPAT_SYS(mq_notify) COMPAT_SYS(mq_notify)
COMPAT_SYS(mq_getsetattr) COMPAT_SYS(mq_getsetattr)
COMPAT_SYS(kexec_load) COMPAT_SYS(kexec_load)
COMPAT_SYS(add_key) SYSCALL(add_key)
COMPAT_SYS(request_key) SYSCALL(request_key)
COMPAT_SYS(keyctl) COMPAT_SYS(keyctl)
COMPAT_SYS(waitid) COMPAT_SYS(waitid)
SYSCALL(ioprio_set) SYSCALL(ioprio_set)
......
...@@ -56,11 +56,5 @@ ...@@ -56,11 +56,5 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE
/*
* "Conditional" syscalls
*/
#define cond_syscall(x) \
asmlinkage long x (void) __attribute__((weak,alias("sys_ni_syscall")))
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* _ASM_POWERPC_UNISTD_H_ */ #endif /* _ASM_POWERPC_UNISTD_H_ */
#ifndef _ASM_POWERPC_LINKAGE_H
#define _ASM_POWERPC_LINKAGE_H
/* Nothing to see here... */
#endif /* _ASM_POWERPC_LINKAGE_H */
...@@ -61,91 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp, ...@@ -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)); 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 compat_sys_mmap2(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff) unsigned long fd, unsigned long pgoff)
...@@ -195,13 +110,6 @@ asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long h ...@@ -195,13 +110,6 @@ asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long h
return sys_ftruncate(fd, (high << 32) | low); 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, long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,
size_t len, int advice) size_t len, int advice)
{ {
...@@ -209,23 +117,6 @@ long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low, ...@@ -209,23 +117,6 @@ long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,
advice); 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, asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags,
unsigned offset_hi, unsigned offset_lo, unsigned offset_hi, unsigned offset_lo,
unsigned nbytes_hi, unsigned nbytes_lo) unsigned nbytes_hi, unsigned nbytes_lo)
......
...@@ -132,7 +132,6 @@ config S390 ...@@ -132,7 +132,6 @@ config S390
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_SYSCALL_TRACEPOINTS select HAVE_SYSCALL_TRACEPOINTS
select HAVE_SYSCALL_WRAPPERS
select HAVE_UID16 if 32BIT select HAVE_UID16 if 32BIT
select HAVE_VIRT_CPU_ACCOUNTING select HAVE_VIRT_CPU_ACCOUNTING
select VIRT_TO_BUS select VIRT_TO_BUS
......
...@@ -54,12 +54,4 @@ ...@@ -54,12 +54,4 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE #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_ */ #endif /* _ASM_S390_UNISTD_H_ */
...@@ -288,51 +288,13 @@ asmlinkage long sys32_getegid16(void) ...@@ -288,51 +288,13 @@ asmlinkage long sys32_getegid16(void)
return high2lowgid(from_kgid_munged(current_user_ns(), current_egid())); 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 #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 */ if (call >> 16) /* hack for backward compatibility */
return -EINVAL; return -EINVAL;
switch (call) { return compat_sys_ipc(call, first, second, third, ptr, third);
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;
} }
#endif #endif
...@@ -373,48 +335,6 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun ...@@ -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); 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 { struct stat64_emu31 {
unsigned long long st_dev; unsigned long long st_dev;
unsigned int __pad1; unsigned int __pad1;
......
...@@ -94,7 +94,6 @@ long sys32_getuid16(void); ...@@ -94,7 +94,6 @@ long sys32_getuid16(void);
long sys32_geteuid16(void); long sys32_geteuid16(void);
long sys32_getgid16(void); long sys32_getgid16(void);
long sys32_getegid16(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, long sys32_truncate64(const char __user * path, unsigned long high,
unsigned long low); unsigned long low);
long sys32_ftruncate64(unsigned int fd, 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, ...@@ -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, long sys32_pwrite64(unsigned int fd, const char __user *ubuf,
size_t count, u32 poshi, u32 poslo); size_t count, u32 poshi, u32 poslo);
compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count); 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_stat64(const char __user * filename, struct stat64_emu31 __user * statbuf);
long sys32_lstat64(const char __user * filename, long sys32_lstat64(const char __user * filename,
struct stat64_emu31 __user * statbuf); struct stat64_emu31 __user * statbuf);
......
...@@ -258,11 +258,6 @@ ENTRY(sys32_mmap2_wrapper) ...@@ -258,11 +258,6 @@ ENTRY(sys32_mmap2_wrapper)
llgtr %r2,%r2 # struct mmap_arg_struct_emu31 * llgtr %r2,%r2 # struct mmap_arg_struct_emu31 *
jg sys32_mmap2 # branch to system call 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) ENTRY(compat_sys_gettimeofday_wrapper)
llgtr %r2,%r2 # struct timeval_emu31 * llgtr %r2,%r2 # struct timeval_emu31 *
llgtr %r3,%r3 # struct timezone * llgtr %r3,%r3 # struct timezone *
...@@ -393,14 +388,6 @@ ENTRY(compat_sys_sysinfo_wrapper) ...@@ -393,14 +388,6 @@ ENTRY(compat_sys_sysinfo_wrapper)
llgtr %r2,%r2 # struct sysinfo_emu31 * llgtr %r2,%r2 # struct sysinfo_emu31 *
jg compat_sys_sysinfo # branch to system call 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) ENTRY(sys32_fsync_wrapper)
llgfr %r2,%r2 # unsigned int llgfr %r2,%r2 # unsigned int
jg sys_fsync # branch to system call jg sys_fsync # branch to system call
...@@ -666,13 +653,6 @@ ENTRY(sys32_capset_wrapper) ...@@ -666,13 +653,6 @@ ENTRY(sys32_capset_wrapper)
llgtr %r3,%r3 # const cap_user_data_t llgtr %r3,%r3 # const cap_user_data_t
jg sys_capset # branch to system call 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 #sys32_vfork_wrapper # done in vfork_glue
ENTRY(sys32_truncate64_wrapper) ENTRY(sys32_truncate64_wrapper)
...@@ -938,13 +918,6 @@ ENTRY(sys_epoll_wait_wrapper) ...@@ -938,13 +918,6 @@ ENTRY(sys_epoll_wait_wrapper)
lgfr %r5,%r5 # int lgfr %r5,%r5 # int
jg sys_epoll_wait # branch to system call 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) ENTRY(sys32_fadvise64_wrapper)
lgfr %r2,%r2 # int lgfr %r2,%r2 # int
sllg %r3,%r3,32 # get high word of 64bit loff_t sllg %r3,%r3,32 # get high word of 64bit loff_t
...@@ -1264,29 +1237,12 @@ ENTRY(sys_tee_wrapper) ...@@ -1264,29 +1237,12 @@ ENTRY(sys_tee_wrapper)
llgfr %r5,%r5 # unsigned int llgfr %r5,%r5 # unsigned int
jg sys_tee 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) ENTRY(sys_getcpu_wrapper)
llgtr %r2,%r2 # unsigned * llgtr %r2,%r2 # unsigned *
llgtr %r3,%r3 # unsigned * llgtr %r3,%r3 # unsigned *
llgtr %r4,%r4 # struct getcpu_cache * llgtr %r4,%r4 # struct getcpu_cache *
jg sys_getcpu 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) ENTRY(compat_sys_utimes_wrapper)
llgtr %r2,%r2 # char * llgtr %r2,%r2 # char *
llgtr %r3,%r3 # struct compat_timeval * llgtr %r3,%r3 # struct compat_timeval *
...@@ -1299,12 +1255,6 @@ ENTRY(compat_sys_utimensat_wrapper) ...@@ -1299,12 +1255,6 @@ ENTRY(compat_sys_utimensat_wrapper)
lgfr %r5,%r5 # int lgfr %r5,%r5 # int
jg compat_sys_utimensat 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) ENTRY(sys_eventfd_wrapper)
llgfr %r2,%r2 # unsigned int llgfr %r2,%r2 # unsigned int
jg sys_eventfd jg sys_eventfd
...@@ -1323,13 +1273,6 @@ ENTRY(sys_timerfd_create_wrapper) ...@@ -1323,13 +1273,6 @@ ENTRY(sys_timerfd_create_wrapper)
lgfr %r3,%r3 # int lgfr %r3,%r3 # int
jg sys_timerfd_create 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) ENTRY(sys_eventfd2_wrapper)
llgfr %r2,%r2 # unsigned int llgfr %r2,%r2 # unsigned int
lgfr %r3,%r3 # int lgfr %r3,%r3 # int
...@@ -1361,13 +1304,6 @@ ENTRY(sys32_readahead_wrapper) ...@@ -1361,13 +1304,6 @@ ENTRY(sys32_readahead_wrapper)
lgfr %r5,%r5 # s32 lgfr %r5,%r5 # s32
jg sys32_readahead # branch to system call 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) ENTRY(sys_tkill_wrapper)
lgfr %r2,%r2 # pid_t lgfr %r2,%r2 # pid_t
lgfr %r3,%r3 # int lgfr %r3,%r3 # int
......
...@@ -132,19 +132,9 @@ SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args) ...@@ -132,19 +132,9 @@ SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)
* to * to
* %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len * %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len
*/ */
SYSCALL_DEFINE(s390_fallocate)(int fd, int mode, loff_t offset, SYSCALL_DEFINE5(s390_fallocate, int, fd, int, mode, loff_t, offset,
u32 len_high, u32 len_low) u32, len_high, u32, len_low)
{ {
return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | 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 #endif
...@@ -85,7 +85,7 @@ SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper) ...@@ -85,7 +85,7 @@ SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)
SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper) SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)
SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper) /* 75 */ SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper) /* 75 */
SYSCALL(sys_old_getrlimit,sys_getrlimit,compat_sys_old_getrlimit_wrapper) 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_gettimeofday,sys_gettimeofday,compat_sys_gettimeofday_wrapper)
SYSCALL(sys_settimeofday,sys_settimeofday,compat_sys_settimeofday_wrapper) SYSCALL(sys_settimeofday,sys_settimeofday,compat_sys_settimeofday_wrapper)
SYSCALL(sys_getgroups16,sys_ni_syscall,sys32_getgroups16_wrapper) /* 80 old getgroups16 syscall */ 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) ...@@ -118,14 +118,14 @@ SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper)
SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper) SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper)
SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper) SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper)
NI_SYSCALL /* old uname syscall */ 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) SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)
NI_SYSCALL /* old "idle" system call */ NI_SYSCALL /* old "idle" system call */
NI_SYSCALL /* vm86old for i386 */ NI_SYSCALL /* vm86old for i386 */
SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4) SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4)
SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper) /* 115 */ SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper) /* 115 */
SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) 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_fsync,sys_fsync,sys32_fsync_wrapper)
SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn) SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)
SYSCALL(sys_clone,sys_clone,sys_clone_wrapper) /* 120 */ SYSCALL(sys_clone,sys_clone,sys_clone_wrapper) /* 120 */
...@@ -195,7 +195,7 @@ SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper) ...@@ -195,7 +195,7 @@ SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)
SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper) SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)
SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper) /* 185 */ SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper) /* 185 */
SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack) 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 /* streams1 */
NI_SYSCALL /* streams2 */ NI_SYSCALL /* streams2 */
SYSCALL(sys_vfork,sys_vfork,sys_vfork) /* 190 */ SYSCALL(sys_vfork,sys_vfork,sys_vfork) /* 190 */
...@@ -231,7 +231,7 @@ SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper) ...@@ -231,7 +231,7 @@ SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper)
SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper) /* 220 */ SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper) /* 220 */
SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper) SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper)
SYSCALL(sys_readahead,sys_readahead,sys32_readahead_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_setxattr,sys_setxattr,sys32_setxattr_wrapper)
SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */
SYSCALL(sys_fsetxattr,sys_fsetxattr,sys32_fsetxattr_wrapper) 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) ...@@ -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_splice,sys_splice,sys_splice_wrapper)
SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_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_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 */ NI_SYSCALL /* 310 sys_move_pages */
SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) 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_utimes,sys_utimes,compat_sys_utimes_wrapper)
SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper) SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */ 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 */ NI_SYSCALL /* 317 old sys_timer_fd */
SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper) SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)
SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_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_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */
SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime) 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_eventfd2,sys_eventfd2,sys_eventfd2_wrapper)
SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper) SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)
SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */ SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */
......
...@@ -30,12 +30,4 @@ ...@@ -30,12 +30,4 @@
# define __ARCH_WANT_SYS_VFORK # define __ARCH_WANT_SYS_VFORK
# define __ARCH_WANT_SYS_CLONE # 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> #include <uapi/asm/unistd.h>
...@@ -62,7 +62,6 @@ config SPARC64 ...@@ -62,7 +62,6 @@ config SPARC64
select HAVE_RCU_TABLE_FREE if SMP select HAVE_RCU_TABLE_FREE if SMP
select HAVE_MEMBLOCK select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP select HAVE_MEMBLOCK_NODE_MAP
select HAVE_SYSCALL_WRAPPERS
select HAVE_ARCH_TRANSPARENT_HUGEPAGE select HAVE_ARCH_TRANSPARENT_HUGEPAGE
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE_MCOUNT_RECORD select HAVE_FTRACE_MCOUNT_RECORD
......
...@@ -45,12 +45,4 @@ ...@@ -45,12 +45,4 @@
#define __ARCH_WANT_COMPAT_SYS_SENDFILE #define __ARCH_WANT_COMPAT_SYS_SENDFILE
#endif #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 */ #endif /* _SPARC_UNISTD_H */
...@@ -36,7 +36,6 @@ STUB: sra REG1, 0, REG1; \ ...@@ -36,7 +36,6 @@ STUB: sra REG1, 0, REG1; \
jmpl %g1 + %lo(SYSCALL), %g0; \ jmpl %g1 + %lo(SYSCALL), %g0; \
sra REG3, 0, REG3 sra REG3, 0, REG3
SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)
SIGN1(sys32_readahead, compat_sys_readahead, %o0) SIGN1(sys32_readahead, compat_sys_readahead, %o0)
SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4) SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)
SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5)
...@@ -46,12 +45,9 @@ SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) ...@@ -46,12 +45,9 @@ SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)
SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)
SIGN1(sys32_select, compat_sys_select, %o0) SIGN1(sys32_select, compat_sys_select, %o0)
SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) 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_recvfrom, compat_sys_recvfrom, %o0)
SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
SIGN1(sys32_sendmsg, compat_sys_sendmsg, %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 .globl sys32_mmap2
sys32_mmap2: sys32_mmap2:
......
...@@ -49,71 +49,6 @@ ...@@ -49,71 +49,6 @@
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
#include <asm/compat_signal.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) asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)
{ {
if ((int)high < 0) if ((int)high < 0)
...@@ -303,15 +238,7 @@ long compat_sys_fadvise64_64(int fd, ...@@ -303,15 +238,7 @@ long compat_sys_fadvise64_64(int fd,
advice); advice);
} }
long sys32_lookup_dcookie(unsigned long cookie_high, 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)
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)
{ {
return sys_sync_file_range(fd, return sys_sync_file_range(fd,
(off_high << 32) | off_low, (off_high << 32) | off_low,
......
...@@ -353,7 +353,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second ...@@ -353,7 +353,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
case SEMCTL: { case SEMCTL: {
err = sys_semctl(first, second, err = sys_semctl(first, second,
(int)third | IPC_64, (int)third | IPC_64,
(union semun) ptr); (unsigned long) ptr);
goto out; goto out;
} }
default: default:
...@@ -470,10 +470,6 @@ SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) ...@@ -470,10 +470,6 @@ SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len)
return vm_munmap(addr, 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, SYSCALL_DEFINE5(64_mremap, unsigned long, addr, unsigned long, old_len,
unsigned long, new_len, unsigned long, flags, unsigned long, new_len, unsigned long, flags,
......
...@@ -23,9 +23,9 @@ sys_call_table32: ...@@ -23,9 +23,9 @@ sys_call_table32:
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod /*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 /*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 /*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 /*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 /*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 .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 /*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl
...@@ -41,7 +41,7 @@ sys_call_table32: ...@@ -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 /*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 .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 /*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 /*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 .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 /*130*/ .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
...@@ -59,7 +59,7 @@ sys_call_table32: ...@@ -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 /*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 .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 /*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 /*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 .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 /*220*/ .word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid
......
...@@ -16,7 +16,6 @@ config TILE ...@@ -16,7 +16,6 @@ config TILE
select GENERIC_PENDING_IRQ if SMP select GENERIC_PENDING_IRQ if SMP
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select HAVE_DEBUG_BUGVERBOSE select HAVE_DEBUG_BUGVERBOSE
select HAVE_SYSCALL_WRAPPERS if TILEGX
select VIRT_TO_BUS select VIRT_TO_BUS
select SYS_HYPERVISOR select SYS_HYPERVISOR
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
......
...@@ -56,12 +56,6 @@ COMPAT_SYSCALL_DEFINE6(pwrite64, unsigned int, fd, char __user *, ubuf, ...@@ -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); 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, COMPAT_SYSCALL_DEFINE6(sync_file_range2, int, fd, unsigned int, flags,
u32, offset_lo, u32, offset_hi, u32, offset_lo, u32, offset_hi,
u32, nbytes_lo, u32, nbytes_hi) u32, nbytes_lo, u32, nbytes_hi)
......
...@@ -5,9 +5,6 @@ ...@@ -5,9 +5,6 @@
obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o
obj-$(CONFIG_IA32_EMULATION) += nosyscall.o syscall_ia32.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 obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
audit-class-$(CONFIG_AUDIT) := audit.o audit-class-$(CONFIG_AUDIT) := audit.o
......
#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;
}
...@@ -166,12 +166,6 @@ asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *arg) ...@@ -166,12 +166,6 @@ asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *arg)
a.offset>>PAGE_SHIFT); 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, asmlinkage long sys32_waitpid(compat_pid_t pid, unsigned int __user *stat_addr,
int options) int options)
{ {
...@@ -194,35 +188,10 @@ asmlinkage long sys32_pwrite(unsigned int fd, const char __user *ubuf, ...@@ -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 * Some system calls that need sign extended arguments. This could be
* done by a generic wrapper. * 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, long sys32_fadvise64_64(int fd, __u32 offset_low, __u32 offset_high,
__u32 len_low, __u32 len_high, int advice) __u32 len_low, __u32 len_high, int advice)
{ {
...@@ -246,12 +215,6 @@ long sys32_vm86_warning(void) ...@@ -246,12 +215,6 @@ long sys32_vm86_warning(void)
return -ENOSYS; 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, asmlinkage ssize_t sys32_readahead(int fd, unsigned off_lo, unsigned off_hi,
size_t count) size_t count)
{ {
......
...@@ -30,23 +30,14 @@ asmlinkage long sys32_fstatat(unsigned int, const char __user *, ...@@ -30,23 +30,14 @@ asmlinkage long sys32_fstatat(unsigned int, const char __user *,
struct stat64 __user *, int); struct stat64 __user *, int);
struct mmap_arg_struct32; struct mmap_arg_struct32;
asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *); 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_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_pread(unsigned int, char __user *, u32, u32, u32);
asmlinkage long sys32_pwrite(unsigned int, const 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_fadvise64_64(int, __u32, __u32, __u32, __u32, int);
long sys32_vm86_warning(void); 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 ssize_t sys32_readahead(int, unsigned, unsigned, size_t);
asmlinkage long sys32_sync_file_range(int, unsigned, unsigned, asmlinkage long sys32_sync_file_range(int, unsigned, unsigned,
...@@ -59,9 +50,6 @@ asmlinkage long sys32_fallocate(int, int, unsigned, ...@@ -59,9 +50,6 @@ asmlinkage long sys32_fallocate(int, int, unsigned,
asmlinkage long sys32_sigreturn(void); asmlinkage long sys32_sigreturn(void);
asmlinkage long sys32_rt_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, asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int,
const char __user *); const char __user *);
......
...@@ -27,8 +27,8 @@ asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); ...@@ -27,8 +27,8 @@ asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);
long sys_rt_sigreturn(void); long sys_rt_sigreturn(void);
/* kernel/tls.c */ /* kernel/tls.c */
asmlinkage int sys_set_thread_area(struct user_desc __user *); asmlinkage long sys_set_thread_area(struct user_desc __user *);
asmlinkage int sys_get_thread_area(struct user_desc __user *); asmlinkage long sys_get_thread_area(struct user_desc __user *);
/* X86_32 only */ /* X86_32 only */
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
......
...@@ -50,12 +50,4 @@ ...@@ -50,12 +50,4 @@
# define __ARCH_WANT_SYS_VFORK # define __ARCH_WANT_SYS_VFORK
# define __ARCH_WANT_SYS_CLONE # 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 */ #endif /* _ASM_X86_UNISTD_H */
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/user.h> #include <linux/user.h>
#include <linux/regset.h> #include <linux/regset.h>
#include <linux/syscalls.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/ldt.h> #include <asm/ldt.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/proto.h> #include <asm/proto.h>
#include <asm/syscalls.h>
#include "tls.h" #include "tls.h"
...@@ -89,11 +89,9 @@ int do_set_thread_area(struct task_struct *p, int idx, ...@@ -89,11 +89,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
return 0; 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); return do_set_thread_area(current, -1, u_info, 1);
asmlinkage_protect(1, ret, u_info);
return ret;
} }
...@@ -139,11 +137,9 @@ int do_get_thread_area(struct task_struct *p, int idx, ...@@ -139,11 +137,9 @@ int do_get_thread_area(struct task_struct *p, int idx,
return 0; 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); return do_get_thread_area(current, -1, u_info);
asmlinkage_protect(1, ret, u_info);
return ret;
} }
int regset_tls_active(struct task_struct *target, int regset_tls_active(struct task_struct *target,
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
34 i386 nice sys_nice 34 i386 nice sys_nice
35 i386 ftime 35 i386 ftime
36 i386 sync sys_sync 36 i386 sync sys_sync
37 i386 kill sys_kill sys32_kill 37 i386 kill sys_kill
38 i386 rename sys_rename 38 i386 rename sys_rename
39 i386 mkdir sys_mkdir 39 i386 mkdir sys_mkdir
40 i386 rmdir sys_rmdir 40 i386 rmdir sys_rmdir
...@@ -123,7 +123,7 @@ ...@@ -123,7 +123,7 @@
114 i386 wait4 sys_wait4 compat_sys_wait4 114 i386 wait4 sys_wait4 compat_sys_wait4
115 i386 swapoff sys_swapoff 115 i386 swapoff sys_swapoff
116 i386 sysinfo sys_sysinfo compat_sys_sysinfo 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 118 i386 fsync sys_fsync
119 i386 sigreturn sys_sigreturn stub32_sigreturn 119 i386 sigreturn sys_sigreturn stub32_sigreturn
120 i386 clone sys_clone stub32_clone 120 i386 clone sys_clone stub32_clone
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
122 i386 uname sys_newuname 122 i386 uname sys_newuname
123 i386 modify_ldt sys_modify_ldt 123 i386 modify_ldt sys_modify_ldt
124 i386 adjtimex sys_adjtimex compat_sys_adjtimex 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 126 i386 sigprocmask sys_sigprocmask compat_sys_sigprocmask
127 i386 create_module 127 i386 create_module
128 i386 init_module sys_init_module 128 i386 init_module sys_init_module
...@@ -193,7 +193,7 @@ ...@@ -193,7 +193,7 @@
184 i386 capget sys_capget 184 i386 capget sys_capget
185 i386 capset sys_capset 185 i386 capset sys_capset
186 i386 sigaltstack sys_sigaltstack compat_sys_sigaltstack 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 188 i386 getpmsg
189 i386 putpmsg 189 i386 putpmsg
190 i386 vfork sys_vfork stub32_vfork 190 i386 vfork sys_vfork stub32_vfork
...@@ -259,7 +259,7 @@ ...@@ -259,7 +259,7 @@
250 i386 fadvise64 sys_fadvise64 sys32_fadvise64 250 i386 fadvise64 sys_fadvise64 sys32_fadvise64
# 251 is available for reuse (was briefly sys_set_zone_reclaim) # 251 is available for reuse (was briefly sys_set_zone_reclaim)
252 i386 exit_group sys_exit_group 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 254 i386 epoll_create sys_epoll_create
255 i386 epoll_ctl sys_epoll_ctl 255 i386 epoll_ctl sys_epoll_ctl
256 i386 epoll_wait sys_epoll_wait 256 i386 epoll_wait sys_epoll_wait
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/percpu.h> #include <linux/percpu.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/syscalls.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <os.h> #include <os.h>
#include <skas.h> #include <skas.h>
...@@ -274,7 +275,7 @@ static int get_tls_entry(struct task_struct *task, struct user_desc *info, ...@@ -274,7 +275,7 @@ static int get_tls_entry(struct task_struct *task, struct user_desc *info,
goto out; 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; struct user_desc info;
int idx, ret; int idx, ret;
...@@ -322,7 +323,7 @@ int ptrace_set_thread_area(struct task_struct *child, int idx, ...@@ -322,7 +323,7 @@ int ptrace_set_thread_area(struct task_struct *child, int idx,
return set_tls_entry(child, &info, idx, 0); 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; struct user_desc info;
int idx, ret; int idx, ret;
......
...@@ -4,14 +4,6 @@ ...@@ -4,14 +4,6 @@
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE
#include <uapi/asm/unistd.h> #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_STAT64
#define __ARCH_WANT_SYS_UTIME #define __ARCH_WANT_SYS_UTIME
#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_LLSEEK
......
...@@ -1790,7 +1790,5 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id, ...@@ -1790,7 +1790,5 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,
ret = read_events(ioctx, min_nr, nr, events, timeout); ret = read_events(ioctx, min_nr, nr, events, timeout);
put_ioctx(ioctx); put_ioctx(ioctx);
} }
asmlinkage_protect(5, ret, ctx_id, min_nr, nr, events, timeout);
return ret; return ret;
} }
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#include <linux/signal.h> #include <linux/signal.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/eventpoll.h>
#include <linux/fs_struct.h> #include <linux/fs_struct.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
...@@ -1253,26 +1252,6 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, ...@@ -1253,26 +1252,6 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec,
return compat_sys_pwritev64(fd, vec, vlen, pos); 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 * Exactly like fs/open.c:sys_open(), except that it doesn't set the
* O_LARGEFILE flag. * O_LARGEFILE flag.
...@@ -1658,84 +1637,6 @@ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds, ...@@ -1658,84 +1637,6 @@ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
return ret; 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(&current->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 #ifdef CONFIG_FHANDLE
/* /*
* Exactly like fs/open.c:sys_open_by_handle_at(), except that it * 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, ...@@ -1747,25 +1648,3 @@ COMPAT_SYSCALL_DEFINE3(open_by_handle_at, int, mountdirfd,
return do_handle_open(mountdirfd, handle, flags); return do_handle_open(mountdirfd, handle, flags);
} }
#endif #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 */
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/dcookies.h> #include <linux/dcookies.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/path.h> #include <linux/path.h>
#include <linux/compat.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
/* The dcookies are allocated from a kmem_cache and /* The dcookies are allocated from a kmem_cache and
...@@ -145,7 +146,7 @@ int get_dcookie(struct path *path, unsigned long *cookie) ...@@ -145,7 +146,7 @@ int get_dcookie(struct path *path, unsigned long *cookie)
/* And here is where the userspace process can look up the cookie value /* And here is where the userspace process can look up the cookie value
* to retrieve the path. * 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; unsigned long cookie = (unsigned long)cookie64;
int err = -EINVAL; int err = -EINVAL;
...@@ -201,12 +202,16 @@ SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len) ...@@ -201,12 +202,16 @@ SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len)
mutex_unlock(&dcookie_mutex); mutex_unlock(&dcookie_mutex);
return err; 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 #endif
static int dcookie_init(void) static int dcookie_init(void)
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/compat.h>
/* /*
* LOCKING: * LOCKING:
...@@ -1998,6 +1999,52 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events, ...@@ -1998,6 +1999,52 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
return error; 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(&current->saved_sigmask, &sigsaved,
sizeof(sigsaved));
set_restore_sigmask();
} else
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
}
return err;
}
#endif
static int __init eventpoll_init(void) static int __init eventpoll_init(void)
{ {
struct sysinfo si; struct sysinfo si;
......
...@@ -755,9 +755,9 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) ...@@ -755,9 +755,9 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags)
return fd; return fd;
} }
SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags, SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
__u64 mask, int dfd, __u64, mask, int, dfd,
const char __user * pathname) const char __user *, pathname)
{ {
struct inode *inode = NULL; struct inode *inode = NULL;
struct vfsmount *mnt = NULL; struct vfsmount *mnt = NULL;
...@@ -857,17 +857,6 @@ SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags, ...@@ -857,17 +857,6 @@ SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags,
return ret; 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 * fanotify_user_setup - Our initialization function. Note that we cannot return
* error because we have compiled-in VFS hooks. So an (unlikely) failure here * error because we have compiled-in VFS hooks. So an (unlikely) failure here
......
...@@ -197,10 +197,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) ...@@ -197,10 +197,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length) SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
{ {
long ret = do_sys_ftruncate(fd, length, 1); return do_sys_ftruncate(fd, length, 1);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(2, ret, fd, length);
return ret;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
...@@ -212,32 +209,15 @@ COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length) ...@@ -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 */ /* LFS versions of truncate are only needed on 32 bit machines */
#if BITS_PER_LONG == 32 #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); 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); return 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);
} }
SYSCALL_ALIAS(sys_ftruncate64, SyS_ftruncate64);
#endif
#endif /* BITS_PER_LONG == 32 */ #endif /* BITS_PER_LONG == 32 */
...@@ -299,7 +279,7 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) ...@@ -299,7 +279,7 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
return ret; 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); struct fd f = fdget(fd);
int error = -EBADF; int error = -EBADF;
...@@ -311,14 +291,6 @@ SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) ...@@ -311,14 +291,6 @@ SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len)
return error; 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. * access() needs to use the real uid/gid, not the effective uid/gid.
* We do this by temporarily clearing all FS-related capabilities and * 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) ...@@ -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) SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{ {
long ret;
if (force_o_largefile()) if (force_o_largefile())
flags |= O_LARGEFILE; flags |= O_LARGEFILE;
ret = do_sys_open(AT_FDCWD, filename, flags, mode); return do_sys_open(AT_FDCWD, filename, flags, mode);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(3, ret, filename, flags, mode);
return ret;
} }
SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
umode_t, mode) umode_t, mode)
{ {
long ret;
if (force_o_largefile()) if (force_o_largefile())
flags |= O_LARGEFILE; flags |= O_LARGEFILE;
ret = do_sys_open(dfd, filename, flags, mode); return do_sys_open(dfd, filename, flags, mode);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(4, ret, dfd, filename, flags, mode);
return ret;
} }
#ifndef __alpha__ #ifndef __alpha__
......
...@@ -515,8 +515,8 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, ...@@ -515,8 +515,8 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
return ret; return ret;
} }
SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf, SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf,
size_t count, loff_t pos) size_t, count, loff_t, pos)
{ {
struct fd f; struct fd f;
ssize_t ret = -EBADF; ssize_t ret = -EBADF;
...@@ -534,17 +534,9 @@ SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf, ...@@ -534,17 +534,9 @@ SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf,
return ret; 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, SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf,
size_t count, loff_t pos) size_t, count, loff_t, pos)
{ {
struct fd f; struct fd f;
ssize_t ret = -EBADF; ssize_t ret = -EBADF;
...@@ -562,14 +554,6 @@ SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf, ...@@ -562,14 +554,6 @@ SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf,
return ret; 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 * 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, ...@@ -897,8 +881,8 @@ SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,
return ret; return ret;
} }
ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count, static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
loff_t max) size_t count, loff_t max)
{ {
struct fd in, out; struct fd in, out;
struct inode *in_inode, *out_inode; struct inode *in_inode, *out_inode;
...@@ -1022,3 +1006,43 @@ SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, loff_t __user *, offset, si ...@@ -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); 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
...@@ -12,5 +12,3 @@ ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov, ...@@ -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); 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, ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
unsigned long nr_segs, loff_t *ppos, io_fn_t fn); 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);
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/signalfd.h> #include <linux/signalfd.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/compat.h>
void signalfd_cleanup(struct sighand_struct *sighand) void signalfd_cleanup(struct sighand_struct *sighand)
{ {
...@@ -311,3 +312,33 @@ SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask, ...@@ -311,3 +312,33 @@ SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,
{ {
return sys_signalfd4(ufd, user_mask, sizemask, 0); 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
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/security.h> #include <linux/security.h>
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/compat.h>
#include "internal.h" #include "internal.h"
/* /*
...@@ -1690,6 +1691,27 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov, ...@@ -1690,6 +1691,27 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
return error; 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, SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
int, fd_out, loff_t __user *, off_out, int, fd_out, loff_t __user *, off_out,
size_t, len, unsigned int, flags) size_t, len, unsigned int, flags)
......
...@@ -283,8 +283,8 @@ EXPORT_SYMBOL(generic_write_sync); ...@@ -283,8 +283,8 @@ EXPORT_SYMBOL(generic_write_sync);
* already-instantiated disk blocks, there are no guarantees here that the data * already-instantiated disk blocks, there are no guarantees here that the data
* will be available after a crash. * will be available after a crash.
*/ */
SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes, SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
unsigned int flags) unsigned int, flags)
{ {
int ret; int ret;
struct fd f; struct fd f;
...@@ -365,29 +365,11 @@ SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes, ...@@ -365,29 +365,11 @@ SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes,
out: out:
return ret; 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 /* It would be nice if people remember that not all the world's an i386
when they introduce new system calls */ when they introduce new system calls */
SYSCALL_DEFINE(sync_file_range2)(int fd, unsigned int flags, SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
loff_t offset, loff_t nbytes) loff_t, offset, loff_t, nbytes)
{ {
return sys_sync_file_range(fd, offset, nbytes, flags); 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
...@@ -9,20 +9,3 @@ ...@@ -9,20 +9,3 @@
#define __ARCH_WANT_STAT64 #define __ARCH_WANT_STAT64
#define __ARCH_WANT_SYS_LLSEEK #define __ARCH_WANT_SYS_LLSEEK
#endif #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
...@@ -27,12 +27,6 @@ ...@@ -27,12 +27,6 @@
#define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))
#endif #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, ...) \ #define COMPAT_SYSCALL_DEFINE1(name, ...) \
COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define COMPAT_SYSCALL_DEFINE2(name, ...) \ #define COMPAT_SYSCALL_DEFINE2(name, ...) \
...@@ -46,24 +40,15 @@ ...@@ -46,24 +40,15 @@
#define COMPAT_SYSCALL_DEFINE6(name, ...) \ #define COMPAT_SYSCALL_DEFINE6(name, ...) \
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)); \ asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)); \ static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
asmlinkage long compat_SyS##name(__SC_LONG##x(__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); \ SYSCALL_ALIAS(compat_sys##name, compat_SyS##name); \
static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)) static inline long C_SYSC##name(__MAP(x,__SC_DECL,__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 */
#ifndef compat_user_stack_pointer #ifndef compat_user_stack_pointer
#define compat_user_stack_pointer() current_user_stack_pointer() #define compat_user_stack_pointer() current_user_stack_pointer()
...@@ -326,21 +311,13 @@ asmlinkage long ...@@ -326,21 +311,13 @@ asmlinkage long
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
compat_size_t __user *len_ptr); compat_size_t __user *len_ptr);
#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32);
long compat_sys_semctl(int first, int second, int third, void __user *uptr); asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
long compat_sys_msgrcv(int first, int second, int msgtyp, int third, asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
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,
compat_ssize_t msgsz, int msgflg); 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); 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_msgctl(int first, int second, void __user *uptr);
long compat_sys_shmctl(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, 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, ...@@ -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, asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
compat_long_t addr, compat_long_t data); 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 ... * epoll (fs/eventpoll.c) compat bits follow ...
*/ */
struct epoll_event; struct epoll_event; /* fortunately, this one is fixed-layout */
#define compat_epoll_event epoll_event
asmlinkage long compat_sys_epoll_pwait(int epfd, asmlinkage long compat_sys_epoll_pwait(int epfd,
struct compat_epoll_event __user *events, struct epoll_event __user *events,
int maxevents, int timeout, int maxevents, int timeout,
const compat_sigset_t __user *sigmask, const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize); compat_size_t sigsetsize);
...@@ -685,6 +662,8 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid, ...@@ -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, asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
compat_off_t __user *offset, compat_size_t count); 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, asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
compat_stack_t __user *uoss_ptr); compat_stack_t __user *uoss_ptr);
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define _LINUX_LINKAGE_H #define _LINUX_LINKAGE_H
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/stringify.h>
#include <asm/linkage.h> #include <asm/linkage.h>
#ifdef __cplusplus #ifdef __cplusplus
...@@ -14,6 +15,26 @@ ...@@ -14,6 +15,26 @@
#define asmlinkage CPP_ASMLINKAGE #define asmlinkage CPP_ASMLINKAGE
#endif #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_data __section(.data..page_aligned) __aligned(PAGE_SIZE)
#define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE) #define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE)
......
...@@ -1082,9 +1082,6 @@ extern unsigned long move_page_tables(struct vm_area_struct *vma, ...@@ -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 old_addr, struct vm_area_struct *new_vma,
unsigned long new_addr, unsigned long len, unsigned long new_addr, unsigned long len,
bool need_rmap_locks); 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, extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,
unsigned long end, pgprot_t newprot, unsigned long end, pgprot_t newprot,
int dirty_accountable, int prot_numa); int dirty_accountable, int prot_numa);
......
...@@ -78,49 +78,34 @@ struct sigaltstack; ...@@ -78,49 +78,34 @@ struct sigaltstack;
#include <linux/key.h> #include <linux/key.h>
#include <trace/syscall.h> #include <trace/syscall.h>
#define __SC_DECL1(t1, a1) t1 a1 /*
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) * __MAP - apply a macro to syscall arguments
#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) * __MAP(n, m, t1, a1, t2, a2, ..., tn, an) will expand to
#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__) * m(t1, a1), m(t2, a2), ..., m(tn, an)
#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__) * The first argument must be equal to the amount of type/name
#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__) * 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
#define __SC_LONG1(t1, a1) long a1 * for SYSCALL_DEFINE<n>/COMPAT_SYSCALL_DEFINE<n>
#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__) */
#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__) #define __MAP0(m,...)
#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__) #define __MAP1(m,t,a) m(t,a)
#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__) #define __MAP2(m,t,a,...) m(t,a), __MAP1(m,__VA_ARGS__)
#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__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 __SC_CAST1(t1, a1) (t1) a1 #define __MAP5(m,t,a,...) m(t,a), __MAP4(m,__VA_ARGS__)
#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__) #define __MAP6(m,t,a,...) m(t,a), __MAP5(m,__VA_ARGS__)
#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__) #define __MAP(n,...) __MAP##n(__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_DECL(t, a) t a
#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__) #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_TEST(type) BUILD_BUG_ON(sizeof(type) > sizeof(long)) #define __SC_CAST(t, a) (t) a
#define __SC_TEST1(t1, a1) __SC_TEST(t1) #define __SC_ARGS(t, a) a
#define __SC_TEST2(t2, a2, ...) __SC_TEST(t2); __SC_TEST1(__VA_ARGS__) #define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long))
#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__)
#ifdef CONFIG_FTRACE_SYSCALLS #ifdef CONFIG_FTRACE_SYSCALLS
#define __SC_STR_ADECL1(t, a) #a #define __SC_STR_ADECL(t, a) #a
#define __SC_STR_ADECL2(t, a, ...) #a, __SC_STR_ADECL1(__VA_ARGS__) #define __SC_STR_TDECL(t, a) #t
#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__)
extern struct ftrace_event_class event_class_syscall_enter; extern struct ftrace_event_class event_class_syscall_enter;
extern struct ftrace_event_class event_class_syscall_exit; extern struct ftrace_event_class event_class_syscall_exit;
...@@ -155,7 +140,13 @@ extern struct trace_event_functions exit_syscall_print_funcs; ...@@ -155,7 +140,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;
__attribute__((section("_ftrace_events"))) \ __attribute__((section("_ftrace_events"))) \
*__event_exit_##sname = &event_exit_##sname; *__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_ENTER_EVENT(sname); \
SYSCALL_TRACE_EXIT_EVENT(sname); \ SYSCALL_TRACE_EXIT_EVENT(sname); \
static struct syscall_metadata __used \ static struct syscall_metadata __used \
...@@ -163,8 +154,8 @@ extern struct trace_event_functions exit_syscall_print_funcs; ...@@ -163,8 +154,8 @@ extern struct trace_event_functions exit_syscall_print_funcs;
.name = "sys"#sname, \ .name = "sys"#sname, \
.syscall_nr = -1, /* Filled in at boot */ \ .syscall_nr = -1, /* Filled in at boot */ \
.nb_args = nb, \ .nb_args = nb, \
.types = types_##sname, \ .types = nb ? types_##sname : NULL, \
.args = args_##sname, \ .args = nb ? args_##sname : NULL, \
.enter_event = &event_enter_##sname, \ .enter_event = &event_enter_##sname, \
.exit_event = &event_exit_##sname, \ .exit_event = &event_exit_##sname, \
.enter_fields = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \ .enter_fields = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \
...@@ -172,26 +163,13 @@ extern struct trace_event_functions exit_syscall_print_funcs; ...@@ -172,26 +163,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;
static struct syscall_metadata __used \ static struct syscall_metadata __used \
__attribute__((section("__syscalls_metadata"))) \ __attribute__((section("__syscalls_metadata"))) \
*__p_syscall_meta_##sname = &__syscall_meta_##sname; *__p_syscall_meta_##sname = &__syscall_meta_##sname;
#else
#define SYSCALL_METADATA(sname, nb, ...)
#endif
#define SYSCALL_DEFINE0(sname) \ #define SYSCALL_DEFINE0(sname) \
SYSCALL_TRACE_ENTER_EVENT(_##sname); \ SYSCALL_METADATA(_##sname, 0); \
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; \
asmlinkage long sys_##sname(void) 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_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##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; ...@@ -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_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##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, ...) \ #define SYSCALL_DEFINEx(x, sname, ...) \
static const char *types_##sname[] = { \ SYSCALL_METADATA(sname, x, __VA_ARGS__) \
__SC_STR_TDECL##x(__VA_ARGS__) \
}; \
static const char *args_##sname[] = { \
__SC_STR_ADECL##x(__VA_ARGS__) \
}; \
SYSCALL_METADATA(sname, x); \
__SYSCALL_DEFINEx(x, sname, __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, ...) \ #define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \ asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \ static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \ asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
{ \ { \
__SC_TEST##x(__VA_ARGS__); \ long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
return (long) SYSC##name(__SC_CAST##x(__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); \ SYSCALL_ALIAS(sys##name, SyS##name); \
static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)) static inline long SYSC##name(__MAP(x,__SC_DECL,__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 */
asmlinkage long sys_time(time_t __user *tloc); asmlinkage long sys_time(time_t __user *tloc);
asmlinkage long sys_stime(time_t __user *tptr); 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); ...@@ -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_semget(key_t key, int nsems, int semflg);
asmlinkage long sys_semop(int semid, struct sembuf __user *sops, asmlinkage long sys_semop(int semid, struct sembuf __user *sops,
unsigned nsops); 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, asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops,
unsigned nsops, unsigned nsops,
const struct timespec __user *timeout); const struct timespec __user *timeout);
......
...@@ -240,7 +240,7 @@ static inline int put_compat_semid_ds(struct semid64_ds *s, ...@@ -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) static long do_compat_semctl(int first, int second, int third, u32 pad)
{ {
union semun fourth; unsigned long fourth;
int err, err2; int err, err2;
struct semid64_ds s64; struct semid64_ds s64;
struct semid64_ds __user *up64; struct semid64_ds __user *up64;
...@@ -249,9 +249,13 @@ static long do_compat_semctl(int first, int second, int third, u32 pad) ...@@ -249,9 +249,13 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
memset(&s64, 0, sizeof(s64)); memset(&s64, 0, sizeof(s64));
if ((third & (~IPC_64)) == SETVAL) if ((third & (~IPC_64)) == SETVAL)
fourth.val = (int) pad; #ifdef __BIG_ENDIAN
fourth = (unsigned long)pad << 32;
#else
fourth = pad;
#endif
else else
fourth.__pad = compat_ptr(pad); fourth = (unsigned long)compat_ptr(pad);
switch (third & (~IPC_64)) { switch (third & (~IPC_64)) {
case IPC_INFO: case IPC_INFO:
case IPC_RMID: case IPC_RMID:
...@@ -269,7 +273,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad) ...@@ -269,7 +273,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
case IPC_STAT: case IPC_STAT:
case SEM_STAT: case SEM_STAT:
up64 = compat_alloc_user_space(sizeof(s64)); up64 = compat_alloc_user_space(sizeof(s64));
fourth.__pad = up64; fourth = (unsigned long)up64;
err = sys_semctl(first, second, third, fourth); err = sys_semctl(first, second, third, fourth);
if (err < 0) if (err < 0)
break; break;
...@@ -295,7 +299,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad) ...@@ -295,7 +299,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
if (err) if (err)
break; break;
fourth.__pad = up64; fourth = (unsigned long)up64;
err = sys_semctl(first, second, third, fourth); err = sys_semctl(first, second, third, fourth);
break; break;
...@@ -306,7 +310,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad) ...@@ -306,7 +310,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
return err; 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; struct compat_msgbuf __user *msgp = dest;
size_t msgsz; size_t msgsz;
...@@ -320,77 +324,117 @@ long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz) ...@@ -320,77 +324,117 @@ long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
return msgsz; return msgsz;
} }
#ifndef COMPAT_SHMLBA
#define COMPAT_SHMLBA SHMLBA
#endif
#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC #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; u32 pad;
if (!uptr) version = call >> 16; /* hack for backward compatibility */
return -EINVAL; call &= 0xffff;
if (get_user(pad, (u32 __user *) uptr))
return -EFAULT; switch (call) {
return do_compat_semctl(first, second, third, pad); 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);
long compat_sys_msgsnd(int first, int second, int third, void __user *uptr) case MSGSND: {
{ struct compat_msgbuf __user *up = compat_ptr(ptr);
struct compat_msgbuf __user *up = uptr; compat_long_t type;
long type;
if (first < 0) if (first < 0 || second < 0)
return -EINVAL; return -EINVAL;
if (second < 0)
return -EINVAL;
if (get_user(type, &up->mtype)) if (get_user(type, &up->mtype))
return -EFAULT; return -EFAULT;
return do_msgsnd(first, type, up->mtext, second, third); return do_msgsnd(first, type, up->mtext, second, third);
} }
case MSGRCV: {
void __user *uptr = compat_ptr(ptr);
long compat_sys_msgrcv(int first, int second, int msgtyp, int third, if (first < 0 || second < 0)
int version, void __user *uptr)
{
if (first < 0)
return -EINVAL;
if (second < 0)
return -EINVAL;
if (!version) {
struct compat_ipc_kludge ipck;
if (!uptr)
return -EINVAL; return -EINVAL;
if (copy_from_user (&ipck, uptr, sizeof(ipck)))
return -EFAULT; if (!version) {
uptr = compat_ptr(ipck.msgp); struct compat_ipc_kludge ipck;
msgtyp = ipck.msgtyp; 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, case MSGGET:
compat_do_msg_fill); 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 #endif
long compat_sys_semctl(int semid, int semnum, int cmd, int arg)
COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
{ {
return do_compat_semctl(semid, semnum, cmd, arg); return do_compat_semctl(semid, semnum, cmd, arg);
} }
long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp, COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
compat_ssize_t msgsz, int msgflg) compat_ssize_t, msgsz, int, msgflg)
{ {
struct compat_msgbuf __user *up = compat_ptr(msgp);
compat_long_t mtype; compat_long_t mtype;
if (get_user(mtype, &msgp->mtype)) if (get_user(mtype, &up->mtype))
return -EFAULT; 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_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
compat_ssize_t msgsz, long msgtyp, int msgflg) compat_ssize_t, msgsz, long, msgtyp, int, msgflg)
{ {
return do_msgrcv(msqid, msgp, (ssize_t)msgsz, msgtyp, msgflg, return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, msgtyp,
compat_do_msg_fill); msgflg, compat_do_msg_fill);
} }
#endif
static inline int get_compat_msqid64(struct msqid64_ds *m64, static inline int get_compat_msqid64(struct msqid64_ds *m64,
struct compat_msqid64_ds __user *up64) struct compat_msqid64_ds __user *up64)
...@@ -508,28 +552,7 @@ long compat_sys_msgctl(int first, int second, void __user *uptr) ...@@ -508,28 +552,7 @@ long compat_sys_msgctl(int first, int second, void __user *uptr)
return err; return err;
} }
#ifndef COMPAT_SHMLBA COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)
#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)
{ {
unsigned long ret; unsigned long ret;
long err; long err;
...@@ -540,7 +563,6 @@ long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg) ...@@ -540,7 +563,6 @@ long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg)
force_successful_syscall_return(); force_successful_syscall_return();
return (long)ret; return (long)ret;
} }
#endif
static inline int get_compat_shmid64_ds(struct shmid64_ds *s64, static inline int get_compat_shmid64_ds(struct shmid64_ds *s64,
struct compat_shmid64_ds __user *up64) struct compat_shmid64_ds __user *up64)
......
...@@ -799,7 +799,7 @@ static unsigned long copy_semid_to_user(void __user *buf, struct semid64_ds *in, ...@@ -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, 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; int err;
struct sem_array *sma; struct sem_array *sma;
...@@ -834,7 +834,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid, ...@@ -834,7 +834,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
} }
max_id = ipc_get_maxid(&sem_ids(ns)); max_id = ipc_get_maxid(&sem_ids(ns));
up_read(&sem_ids(ns).rw_mutex); 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 -EFAULT;
return (max_id < 0) ? 0: max_id; return (max_id < 0) ? 0: max_id;
} }
...@@ -871,7 +871,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid, ...@@ -871,7 +871,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
tbuf.sem_ctime = sma->sem_ctime; tbuf.sem_ctime = sma->sem_ctime;
tbuf.sem_nsems = sma->sem_nsems; tbuf.sem_nsems = sma->sem_nsems;
sem_unlock(sma); sem_unlock(sma);
if (copy_semid_to_user (arg.buf, &tbuf, version)) if (copy_semid_to_user(p, &tbuf, version))
return -EFAULT; return -EFAULT;
return id; return id;
} }
...@@ -883,8 +883,67 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid, ...@@ -883,8 +883,67 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
return err; 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, 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_array *sma;
struct sem* curr; struct sem* curr;
...@@ -903,7 +962,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, ...@@ -903,7 +962,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
err = -EACCES; err = -EACCES;
if (ipcperms(ns, &sma->sem_perm, if (ipcperms(ns, &sma->sem_perm,
(cmd == SETVAL || cmd == SETALL) ? S_IWUGO : S_IRUGO)) cmd == SETALL ? S_IWUGO : S_IRUGO))
goto out_unlock; goto out_unlock;
err = security_sem_semctl(sma, cmd); err = security_sem_semctl(sma, cmd);
...@@ -914,7 +973,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, ...@@ -914,7 +973,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
switch (cmd) { switch (cmd) {
case GETALL: case GETALL:
{ {
ushort __user *array = arg.array; ushort __user *array = p;
int i; int i;
if(nsems > SEMMSL_FAST) { if(nsems > SEMMSL_FAST) {
...@@ -957,7 +1016,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, ...@@ -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); sem_putref(sma);
err = -EFAULT; err = -EFAULT;
goto out_free; goto out_free;
...@@ -991,7 +1050,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, ...@@ -991,7 +1050,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
err = 0; err = 0;
goto out_unlock; goto out_unlock;
} }
/* GETVAL, GETPID, GETNCTN, GETZCNT, SETVAL: fall-through */ /* GETVAL, GETPID, GETNCTN, GETZCNT: fall-through */
} }
err = -EINVAL; err = -EINVAL;
if(semnum < 0 || semnum >= nsems) if(semnum < 0 || semnum >= nsems)
...@@ -1012,27 +1071,6 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum, ...@@ -1012,27 +1071,6 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
case GETZCNT: case GETZCNT:
err = count_semzcnt(sma,semnum); err = count_semzcnt(sma,semnum);
goto out_unlock; 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: out_unlock:
sem_unlock(sma); sem_unlock(sma);
...@@ -1076,7 +1114,7 @@ copy_semid_from_user(struct semid64_ds *out, void __user *buf, int version) ...@@ -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. * NOTE: no locks must be held, the rw_mutex is taken inside this function.
*/ */
static int semctl_down(struct ipc_namespace *ns, int semid, 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; struct sem_array *sma;
int err; int err;
...@@ -1084,7 +1122,7 @@ static int semctl_down(struct ipc_namespace *ns, int semid, ...@@ -1084,7 +1122,7 @@ static int semctl_down(struct ipc_namespace *ns, int semid,
struct kern_ipc_perm *ipcp; struct kern_ipc_perm *ipcp;
if(cmd == IPC_SET) { if(cmd == IPC_SET) {
if (copy_semid_from_user(&semid64, arg.buf, version)) if (copy_semid_from_user(&semid64, p, version))
return -EFAULT; return -EFAULT;
} }
...@@ -1120,11 +1158,11 @@ static int semctl_down(struct ipc_namespace *ns, int semid, ...@@ -1120,11 +1158,11 @@ static int semctl_down(struct ipc_namespace *ns, int semid,
return err; 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; int version;
struct ipc_namespace *ns; struct ipc_namespace *ns;
void __user *p = (void __user *)arg;
if (semid < 0) if (semid < 0)
return -EINVAL; return -EINVAL;
...@@ -1137,32 +1175,23 @@ SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg) ...@@ -1137,32 +1175,23 @@ SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg)
case SEM_INFO: case SEM_INFO:
case IPC_STAT: case IPC_STAT:
case SEM_STAT: case SEM_STAT:
err = semctl_nolock(ns, semid, cmd, version, arg); return semctl_nolock(ns, semid, cmd, version, p);
return err;
case GETALL: case GETALL:
case GETVAL: case GETVAL:
case GETPID: case GETPID:
case GETNCNT: case GETNCNT:
case GETZCNT: case GETZCNT:
case SETVAL:
case SETALL: case SETALL:
err = semctl_main(ns,semid,semnum,cmd,version,arg); return semctl_main(ns, semid, semnum, cmd, p);
return err; case SETVAL:
return semctl_setval(ns, semid, semnum, arg);
case IPC_RMID: case IPC_RMID:
case IPC_SET: case IPC_SET:
err = semctl_down(ns, semid, cmd, version, arg); return semctl_down(ns, semid, cmd, version, p);
return err;
default: default:
return -EINVAL; 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 /* 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, * here. We guarantee there is only one thread using this undo list,
......
...@@ -33,12 +33,12 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, ...@@ -33,12 +33,12 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
case SEMGET: case SEMGET:
return sys_semget(first, second, third); return sys_semget(first, second, third);
case SEMCTL: { case SEMCTL: {
union semun fourth; unsigned long arg;
if (!ptr) if (!ptr)
return -EINVAL; return -EINVAL;
if (get_user(fourth.__pad, (void __user * __user *) ptr)) if (get_user(arg, (unsigned long __user *) ptr))
return -EFAULT; return -EFAULT;
return sys_semctl(first, second, third, fourth); return sys_semctl(first, second, third, arg);
} }
case MSGSND: case MSGSND:
......
...@@ -516,25 +516,6 @@ int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru) ...@@ -516,25 +516,6 @@ int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru)
return 0; 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_SYSCALL_DEFINE4(wait4,
compat_pid_t, pid, compat_pid_t, pid,
compat_uint_t __user *, stat_addr, compat_uint_t __user *, stat_addr,
......
...@@ -1629,9 +1629,6 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, ...@@ -1629,9 +1629,6 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
} }
put_pid(pid); put_pid(pid);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(5, ret, which, upid, infop, options, ru);
return ret; return ret;
} }
...@@ -1669,8 +1666,6 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr, ...@@ -1669,8 +1666,6 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
ret = do_wait(&wo); ret = do_wait(&wo);
put_pid(pid); put_pid(pid);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(4, ret, upid, stat_addr, options, ru);
return ret; return ret;
} }
......
...@@ -1677,10 +1677,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, ...@@ -1677,10 +1677,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
int, tls_val) int, tls_val)
#endif #endif
{ {
long ret = do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr); return 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;
} }
#endif #endif
......
...@@ -1851,6 +1851,20 @@ SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru) ...@@ -1851,6 +1851,20 @@ SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)
return getrusage(current, who, 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) SYSCALL_DEFINE1(umask, int, mask)
{ {
mask = xchg(&current->fs->umask, mask & S_IRWXUGO); mask = xchg(&current->fs->umask, mask & S_IRWXUGO);
......
...@@ -20,6 +20,7 @@ cond_syscall(sys_quotactl); ...@@ -20,6 +20,7 @@ cond_syscall(sys_quotactl);
cond_syscall(sys32_quotactl); cond_syscall(sys32_quotactl);
cond_syscall(sys_acct); cond_syscall(sys_acct);
cond_syscall(sys_lookup_dcookie); cond_syscall(sys_lookup_dcookie);
cond_syscall(compat_sys_lookup_dcookie);
cond_syscall(sys_swapon); cond_syscall(sys_swapon);
cond_syscall(sys_swapoff); cond_syscall(sys_swapoff);
cond_syscall(sys_kexec_load); cond_syscall(sys_kexec_load);
...@@ -155,7 +156,7 @@ cond_syscall(compat_sys_process_vm_writev); ...@@ -155,7 +156,7 @@ cond_syscall(compat_sys_process_vm_writev);
cond_syscall(sys_pciconfig_read); cond_syscall(sys_pciconfig_read);
cond_syscall(sys_pciconfig_write); cond_syscall(sys_pciconfig_write);
cond_syscall(sys_pciconfig_iobase); cond_syscall(sys_pciconfig_iobase);
cond_syscall(sys32_ipc); cond_syscall(compat_sys_s390_ipc);
cond_syscall(ppc_rtas); cond_syscall(ppc_rtas);
cond_syscall(sys_spu_run); cond_syscall(sys_spu_run);
cond_syscall(sys_spu_create); cond_syscall(sys_spu_create);
......
...@@ -18,67 +18,43 @@ ...@@ -18,67 +18,43 @@
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
{ {
long ret = sys_chown(filename, low2highuid(user), low2highgid(group)); return sys_chown(filename, low2highuid(user), low2highgid(group));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(3, ret, filename, user, group);
return ret;
} }
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, 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)); return sys_lchown(filename, low2highuid(user), low2highgid(group));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(3, ret, filename, user, group);
return ret;
} }
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
{ {
long ret = sys_fchown(fd, low2highuid(user), low2highgid(group)); return sys_fchown(fd, low2highuid(user), low2highgid(group));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(3, ret, fd, user, group);
return ret;
} }
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
{ {
long ret = sys_setregid(low2highgid(rgid), low2highgid(egid)); return sys_setregid(low2highgid(rgid), low2highgid(egid));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(2, ret, rgid, egid);
return ret;
} }
SYSCALL_DEFINE1(setgid16, old_gid_t, gid) SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
{ {
long ret = sys_setgid(low2highgid(gid)); return sys_setgid(low2highgid(gid));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(1, ret, gid);
return ret;
} }
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
{ {
long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid)); return sys_setreuid(low2highuid(ruid), low2highuid(euid));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(2, ret, ruid, euid);
return ret;
} }
SYSCALL_DEFINE1(setuid16, old_uid_t, uid) SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
{ {
long ret = sys_setuid(low2highuid(uid)); return sys_setuid(low2highuid(uid));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(1, ret, uid);
return ret;
} }
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) 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)); 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) 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 ...@@ -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) 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)); 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 ...@@ -127,18 +100,12 @@ SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egid
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
{ {
long ret = sys_setfsuid(low2highuid(uid)); return sys_setfsuid(low2highuid(uid));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(1, ret, uid);
return ret;
} }
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
{ {
long ret = sys_setfsgid(low2highgid(gid)); return sys_setfsgid(low2highgid(gid));
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(1, ret, gid);
return ret;
} }
static int groups16_to_user(old_gid_t __user *grouplist, static int groups16_to_user(old_gid_t __user *grouplist,
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
* POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could
* deactivate the pages and clear PG_Referenced. * 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 fd f = fdget(fd);
struct address_space *mapping; struct address_space *mapping;
...@@ -145,26 +145,12 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) ...@@ -145,26 +145,12 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice)
fdput(f); fdput(f);
return ret; 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 #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); 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 #endif
...@@ -1771,7 +1771,7 @@ unsigned long vm_brk(unsigned long addr, unsigned long len) ...@@ -1771,7 +1771,7 @@ unsigned long vm_brk(unsigned long addr, unsigned long len)
* *
* MREMAP_FIXED is not supported under NOMMU conditions * 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 old_len, unsigned long new_len,
unsigned long flags, unsigned long new_addr) unsigned long flags, unsigned long new_addr)
{ {
...@@ -1806,7 +1806,6 @@ unsigned long do_mremap(unsigned long addr, ...@@ -1806,7 +1806,6 @@ unsigned long do_mremap(unsigned long addr,
vma->vm_end = vma->vm_start + new_len; vma->vm_end = vma->vm_start + new_len;
return vma->vm_start; return vma->vm_start;
} }
EXPORT_SYMBOL(do_mremap);
SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
unsigned long, new_len, unsigned long, flags, unsigned long, new_len, unsigned long, flags,
......
...@@ -576,7 +576,7 @@ do_readahead(struct address_space *mapping, struct file *filp, ...@@ -576,7 +576,7 @@ do_readahead(struct address_space *mapping, struct file *filp,
return 0; 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; ssize_t ret;
struct fd f; struct fd f;
...@@ -595,10 +595,3 @@ SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count) ...@@ -595,10 +595,3 @@ SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)
} }
return ret; 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment