d6e7c3b4119a6bb301ae9340c02fdef68e95e204
[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 #ifdef CONFIG_CPU_BIG_ENDIAN
37         err  = __get_user(u->c.sig[1], &s->sig[0]);
38         err |= __get_user(u->c.sig[0], &s->sig[1]);
39         err |= __get_user(u->c.sig[3], &s->sig[2]);
40         err |= __get_user(u->c.sig[2], &s->sig[3]);
41 #endif
42 #ifdef CONFIG_CPU_LITTLE_ENDIAN
43         err  = __get_user(u->c.sig[0], &s->sig[0]);
44         err |= __get_user(u->c.sig[1], &s->sig[1]);
45         err |= __get_user(u->c.sig[2], &s->sig[2]);
46         err |= __get_user(u->c.sig[3], &s->sig[3]);
47 #endif
48
49         return err;
50 }
51
52 #endif /* __ASM_COMPAT_SIGNAL_H */