make SYSCALL_DEFINE<n>-generated wrappers do asmlinkage_protect
Al Viro [Mon, 21 Jan 2013 20:25:54 +0000 (15:25 -0500)]
... and switch i386 to HAVE_SYSCALL_WRAPPERS, killing open-coded
uses of asmlinkage_protect() in a bunch of syscalls.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

arch/x86/include/asm/syscalls.h
arch/x86/kernel/tls.c
arch/x86/um/tls_32.c
fs/aio.c
fs/open.c
include/linux/syscalls.h
kernel/exit.c
kernel/fork.c
kernel/uid16.c

index 6cf0a9c..5f87b35 100644 (file)
@@ -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
index 9d9d2f9..f7fec09 100644 (file)
@@ -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,
index 5f5feff..80ffa5b 100644 (file)
@@ -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;
index 3f941f2..c3ebb98 100644 (file)
--- a/fs/aio.c
+++ b/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;
 }
index a539224..8c74100 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -197,10 +197,7 @@ out:
 
 SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
 {
-       long ret = do_sys_ftruncate(fd, length, 1);
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(2, ret, fd, length);
-       return ret;
+       return do_sys_ftruncate(fd, length, 1);
 }
 
 #ifdef CONFIG_COMPAT
@@ -219,10 +216,7 @@ SYSCALL_DEFINE2(truncate64, const char __user *, path, 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);
 }
 #endif /* BITS_PER_LONG == 32 */
 
@@ -961,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__
index 3b6fc13..9660a8b 100644 (file)
@@ -99,6 +99,7 @@ struct sigaltstack;
 #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
@@ -200,13 +201,16 @@ extern struct trace_event_functions exit_syscall_print_funcs;
 
 #define SYSCALL_DEFINE(name) static inline long SYSC_##name
 
+#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
 #define __SYSCALL_DEFINEx(x, name, ...)                                        \
        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__))       \
        {                                                               \
+               long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));  \
                __MAP(x,__SC_TEST,__VA_ARGS__);                         \
-               return SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));      \
+               __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));       \
+               return ret;                                             \
        }                                                               \
        SYSCALL_ALIAS(sys##name, SyS##name);                            \
        static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
index 51e485c..25d0108 100644 (file)
@@ -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;
 }
 
index 8d932b1..e1f34ab 100644 (file)
@@ -1674,10 +1674,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
 
index d7948eb..f6c83d7 100644 (file)
 
 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,