Merge tag 'powerpc-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[linux-2.6-microblaze.git] / include / linux / compat.h
index f0d2dd3..acac0b5 100644 (file)
@@ -467,6 +467,34 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
                unsafe_put_user(__s->sig[0], &__c->sig[0], label);      \
        }                                                               \
 } while (0)
+
+#define unsafe_get_compat_sigset(set, compat, label) do {              \
+       const compat_sigset_t __user *__c = compat;                     \
+       compat_sigset_word hi, lo;                                      \
+       sigset_t *__s = set;                                            \
+                                                                       \
+       switch (_NSIG_WORDS) {                                          \
+       case 4:                                                         \
+               unsafe_get_user(lo, &__c->sig[7], label);               \
+               unsafe_get_user(hi, &__c->sig[6], label);               \
+               __s->sig[3] = hi | (((long)lo) << 32);                  \
+               fallthrough;                                            \
+       case 3:                                                         \
+               unsafe_get_user(lo, &__c->sig[5], label);               \
+               unsafe_get_user(hi, &__c->sig[4], label);               \
+               __s->sig[2] = hi | (((long)lo) << 32);                  \
+               fallthrough;                                            \
+       case 2:                                                         \
+               unsafe_get_user(lo, &__c->sig[3], label);               \
+               unsafe_get_user(hi, &__c->sig[2], label);               \
+               __s->sig[1] = hi | (((long)lo) << 32);                  \
+               fallthrough;                                            \
+       case 1:                                                         \
+               unsafe_get_user(lo, &__c->sig[1], label);               \
+               unsafe_get_user(hi, &__c->sig[0], label);               \
+               __s->sig[0] = hi | (((long)lo) << 32);                  \
+       }                                                               \
+} while (0)
 #else
 #define unsafe_put_compat_sigset(compat, set, label) do {              \
        compat_sigset_t __user *__c = compat;                           \
@@ -474,6 +502,13 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
                                                                        \
        unsafe_copy_to_user(__c, __s, sizeof(*__c), label);             \
 } while (0)
+
+#define unsafe_get_compat_sigset(set, compat, label) do {              \
+       const compat_sigset_t __user *__c = compat;                     \
+       sigset_t *__s = set;                                            \
+                                                                       \
+       unsafe_copy_from_user(__s, __c, sizeof(*__c), label);           \
+} while (0)
 #endif
 
 extern int compat_ptrace_request(struct task_struct *child,