]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - kernel/compat.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
[karo-tx-linux.git] / kernel / compat.c
index f4bddb90018614b878ae67ac8775ba0295e46cd1..19971d8c72993af7f322767df7f21bdc33fd36bb 100644 (file)
@@ -290,8 +290,8 @@ static inline long put_compat_itimerval(struct compat_itimerval __user *o,
                 __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
 }
 
-asmlinkage long compat_sys_getitimer(int which,
-               struct compat_itimerval __user *it)
+COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
+               struct compat_itimerval __user *it)
 {
        struct itimerval kit;
        int error;
@@ -302,9 +302,9 @@ asmlinkage long compat_sys_getitimer(int which,
        return error;
 }
 
-asmlinkage long compat_sys_setitimer(int which,
-               struct compat_itimerval __user *in,
-               struct compat_itimerval __user *out)
+COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
+               struct compat_itimerval __user *in,
+               struct compat_itimerval __user *out)
 {
        struct itimerval kin, kout;
        int error;
@@ -381,9 +381,9 @@ static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set)
        memcpy(blocked->sig, &set, sizeof(set));
 }
 
-asmlinkage long compat_sys_sigprocmask(int how,
-                                      compat_old_sigset_t __user *nset,
-                                      compat_old_sigset_t __user *oset)
+COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how,
+                      compat_old_sigset_t __user *, nset,
+                      compat_old_sigset_t __user *, oset)
 {
        old_sigset_t old_set, new_set;
        sigset_t new_blocked;
@@ -971,7 +971,7 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
 }
 
 void
-sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
+sigset_from_compat(sigset_t *set, const compat_sigset_t *compat)
 {
        switch (_NSIG_WORDS) {
        case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 );
@@ -982,10 +982,20 @@ sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
 }
 EXPORT_SYMBOL_GPL(sigset_from_compat);
 
-asmlinkage long
-compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
-               struct compat_siginfo __user *uinfo,
-               struct compat_timespec __user *uts, compat_size_t sigsetsize)
+void
+sigset_to_compat(compat_sigset_t *compat, const sigset_t *set)
+{
+       switch (_NSIG_WORDS) {
+       case 4: compat->sig[7] = (set->sig[3] >> 32); compat->sig[6] = set->sig[3];
+       case 3: compat->sig[5] = (set->sig[2] >> 32); compat->sig[4] = set->sig[2];
+       case 2: compat->sig[3] = (set->sig[1] >> 32); compat->sig[2] = set->sig[1];
+       case 1: compat->sig[1] = (set->sig[0] >> 32); compat->sig[0] = set->sig[0];
+       }
+}
+
+COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
+               struct compat_siginfo __user *, uinfo,
+               struct compat_timespec __user *, uts, compat_size_t, sigsetsize)
 {
        compat_sigset_t s32;
        sigset_t s;
@@ -1013,18 +1023,6 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
        }
 
        return ret;
-
-}
-
-asmlinkage long
-compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,
-                            struct compat_siginfo __user *uinfo)
-{
-       siginfo_t info;
-
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-       return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
 }
 
 #ifdef __ARCH_WANT_COMPAT_SYS_TIME
@@ -1067,23 +1065,6 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr)
 
 #endif /* __ARCH_WANT_COMPAT_SYS_TIME */
 
-#ifdef __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
-asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat_size_t sigsetsize)
-{
-       sigset_t newset;
-       compat_sigset_t newset32;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t)))
-               return -EFAULT;
-       sigset_from_compat(&newset, &newset32);
-       return sigsuspend(&newset);
-}
-#endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */
-
 asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)
 {
        struct timex txc;
@@ -1222,9 +1203,9 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info)
        return 0;
 }
 
-#ifdef __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
-asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
-                                                struct compat_timespec __user *interval)
+COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval,
+                      compat_pid_t, pid,
+                      struct compat_timespec __user *, interval)
 {
        struct timespec t;
        int ret;
@@ -1237,7 +1218,6 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
                return -EFAULT;
        return ret;
 }
-#endif /* __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL */
 
 /*
  * Allocate user-space memory for the duration of a single system call,