1 #ifndef __ASM_SH_FUTEX_H
2 #define __ASM_SH_FUTEX_H
6 #include <linux/futex.h>
7 #include <linux/uaccess.h>
10 #include <asm/futex-irq.h>
12 static inline int futex_atomic_op_inuser(int encoded_op
, int __user
*uaddr
)
14 int op
= (encoded_op
>> 28) & 7;
15 int cmp
= (encoded_op
>> 24) & 15;
16 int oparg
= (encoded_op
<< 8) >> 20;
17 int cmparg
= (encoded_op
<< 20) >> 20;
20 if (encoded_op
& (FUTEX_OP_OPARG_SHIFT
<< 28))
23 if (!access_ok(VERIFY_WRITE
, uaddr
, sizeof(int)))
30 ret
= atomic_futex_op_xchg_set(oparg
, uaddr
, &oldval
);
33 ret
= atomic_futex_op_xchg_add(oparg
, uaddr
, &oldval
);
36 ret
= atomic_futex_op_xchg_or(oparg
, uaddr
, &oldval
);
39 ret
= atomic_futex_op_xchg_and(~oparg
, uaddr
, &oldval
);
42 ret
= atomic_futex_op_xchg_xor(oparg
, uaddr
, &oldval
);
53 case FUTEX_OP_CMP_EQ
: ret
= (oldval
== cmparg
); break;
54 case FUTEX_OP_CMP_NE
: ret
= (oldval
!= cmparg
); break;
55 case FUTEX_OP_CMP_LT
: ret
= (oldval
< cmparg
); break;
56 case FUTEX_OP_CMP_GE
: ret
= (oldval
>= cmparg
); break;
57 case FUTEX_OP_CMP_LE
: ret
= (oldval
<= cmparg
); break;
58 case FUTEX_OP_CMP_GT
: ret
= (oldval
> cmparg
); break;
59 default: ret
= -ENOSYS
;
67 futex_atomic_cmpxchg_inatomic(int __user
*uaddr
, int oldval
, int newval
)
69 if (!access_ok(VERIFY_WRITE
, uaddr
, sizeof(int)))
72 return atomic_futex_op_cmpxchg_inatomic(uaddr
, oldval
, newval
);
75 #endif /* __KERNEL__ */
76 #endif /* __ASM_SH_FUTEX_H */