Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/s390/include/asm/futex.h
10819 views
1
#ifndef _ASM_S390_FUTEX_H
2
#define _ASM_S390_FUTEX_H
3
4
#ifdef __KERNEL__
5
6
#include <linux/futex.h>
7
#include <linux/uaccess.h>
8
#include <asm/errno.h>
9
10
static inline int futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
11
{
12
int op = (encoded_op >> 28) & 7;
13
int cmp = (encoded_op >> 24) & 15;
14
int oparg = (encoded_op << 8) >> 20;
15
int cmparg = (encoded_op << 20) >> 20;
16
int oldval, ret;
17
18
if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
19
oparg = 1 << oparg;
20
21
if (! access_ok (VERIFY_WRITE, uaddr, sizeof(u32)))
22
return -EFAULT;
23
24
pagefault_disable();
25
ret = uaccess.futex_atomic_op(op, uaddr, oparg, &oldval);
26
pagefault_enable();
27
28
if (!ret) {
29
switch (cmp) {
30
case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break;
31
case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break;
32
case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break;
33
case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break;
34
case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break;
35
case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break;
36
default: ret = -ENOSYS;
37
}
38
}
39
return ret;
40
}
41
42
static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
43
u32 oldval, u32 newval)
44
{
45
if (! access_ok (VERIFY_WRITE, uaddr, sizeof(u32)))
46
return -EFAULT;
47
48
return uaccess.futex_atomic_cmpxchg(uval, uaddr, oldval, newval);
49
}
50
51
#endif /* __KERNEL__ */
52
#endif /* _ASM_S390_FUTEX_H */
53
54