Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
[sfrench/cifs-2.6.git] / include / asm-mips / compat-signal.h
1 #ifndef __ASM_COMPAT_SIGNAL_H
2 #define __ASM_COMPAT_SIGNAL_H
3
4 #include <linux/bug.h>
5 #include <linux/compat.h>
6 #include <linux/compiler.h>
7
8 static inline int __copy_conv_sigset_to_user(compat_sigset_t __user *d,
9         const sigset_t *s)
10 {
11         int err;
12
13         BUG_ON(sizeof(*d) != sizeof(*s));
14         BUG_ON(_NSIG_WORDS != 2);
15
16         err  = __put_user(s->sig[0],       &d->sig[0]);
17         err |= __put_user(s->sig[0] >> 32, &d->sig[1]);
18         err |= __put_user(s->sig[1],       &d->sig[2]);
19         err |= __put_user(s->sig[1] >> 32, &d->sig[3]);
20
21         return err;
22 }
23
24 static inline int __copy_conv_sigset_from_user(sigset_t *d,
25         const compat_sigset_t __user *s)
26 {
27         int err;
28         union sigset_u {
29                 sigset_t        s;
30                 compat_sigset_t c;
31         } *u = (union sigset_u *) d;
32
33         BUG_ON(sizeof(*d) != sizeof(*s));
34         BUG_ON(_NSIG_WORDS != 2);
35
36         if (unlikely(!access_ok(VERIFY_READ, d, sizeof(*d))))
37                 return -EFAULT;
38
39 #ifdef CONFIG_CPU_BIG_ENDIAN
40         err  = __get_user(u->c.sig[1], &s->sig[0]);
41         err |= __get_user(u->c.sig[0], &s->sig[1]);
42         err |= __get_user(u->c.sig[3], &s->sig[2]);
43         err |= __get_user(u->c.sig[2], &s->sig[3]);
44 #endif
45 #ifdef CONFIG_CPU_LITTLE_ENDIAN
46         err  = __get_user(u->c.sig[0], &s->sig[0]);
47         err |= __get_user(u->c.sig[1], &s->sig[1]);
48         err |= __get_user(u->c.sig[2], &s->sig[2]);
49         err |= __get_user(u->c.sig[3], &s->sig[3]);
50 #endif
51
52         return err;
53 }
54
55 #endif /* __ASM_COMPAT_SIGNAL_H */