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
 
 #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"
 
        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);
 }
 
 
        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,
 
 
 #include <linux/percpu.h>
 #include <linux/sched.h>
+#include <linux/syscalls.h>
 #include <asm/uaccess.h>
 #include <os.h>
 #include <skas.h>
        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;
        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;
 
                        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;
 }
 
 
 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
 
 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 */
 
 
 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__
 
 #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 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__))
 
        }
 
        put_pid(pid);
-
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(5, ret, which, upid, infop, options, ru);
        return ret;
 }
 
        ret = do_wait(&wo);
        put_pid(pid);
 
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(4, ret, upid, stat_addr, options, ru);
        return ret;
 }
 
 
                 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
 
 
 
 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)
 
 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;
 }
 
 
 
 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,