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