Commit | Line | Data |
---|---|---|
3363fbdd MS |
1 | #ifndef _ASM_S390_FUTEX_H |
2 | #define _ASM_S390_FUTEX_H | |
4732efbe | 3 | |
3363fbdd | 4 | #include <linux/futex.h> |
d8ad075e | 5 | #include <linux/uaccess.h> |
3363fbdd | 6 | #include <asm/errno.h> |
3363fbdd | 7 | |
4f41c2b4 HC |
8 | int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newval); |
9 | int __futex_atomic_op_inuser(int op, u32 __user *uaddr, int oparg, int *old); | |
10 | ||
11 | static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) | |
3363fbdd MS |
12 | { |
13 | int op = (encoded_op >> 28) & 7; | |
14 | int cmp = (encoded_op >> 24) & 15; | |
15 | int oparg = (encoded_op << 8) >> 20; | |
16 | int cmparg = (encoded_op << 20) >> 20; | |
d02765d1 GS |
17 | int oldval, ret; |
18 | ||
3363fbdd MS |
19 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) |
20 | oparg = 1 << oparg; | |
21 | ||
d8ad075e | 22 | pagefault_disable(); |
4f41c2b4 | 23 | ret = __futex_atomic_op_inuser(op, uaddr, oparg, &oldval); |
d8ad075e | 24 | pagefault_enable(); |
3363fbdd MS |
25 | |
26 | if (!ret) { | |
27 | switch (cmp) { | |
28 | case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; | |
29 | case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; | |
30 | case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; | |
31 | case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; | |
32 | case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; | |
33 | case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; | |
34 | default: ret = -ENOSYS; | |
35 | } | |
36 | } | |
37 | return ret; | |
38 | } | |
39 | ||
3363fbdd | 40 | #endif /* _ASM_S390_FUTEX_H */ |