Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/parisc/include/asm/futex.h
10818 views
1
#ifndef _ASM_PARISC_FUTEX_H
2
#define _ASM_PARISC_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
11
futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
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;
17
int oldval = 0, ret;
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
26
switch (op) {
27
case FUTEX_OP_SET:
28
case FUTEX_OP_ADD:
29
case FUTEX_OP_OR:
30
case FUTEX_OP_ANDN:
31
case FUTEX_OP_XOR:
32
default:
33
ret = -ENOSYS;
34
}
35
36
pagefault_enable();
37
38
if (!ret) {
39
switch (cmp) {
40
case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break;
41
case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break;
42
case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break;
43
case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break;
44
case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break;
45
case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break;
46
default: ret = -ENOSYS;
47
}
48
}
49
return ret;
50
}
51
52
/* Non-atomic version */
53
static inline int
54
futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
55
u32 oldval, u32 newval)
56
{
57
u32 val;
58
59
/* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is
60
* our gateway page, and causes no end of trouble...
61
*/
62
if (segment_eq(KERNEL_DS, get_fs()) && !uaddr)
63
return -EFAULT;
64
65
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
66
return -EFAULT;
67
68
if (get_user(val, uaddr))
69
return -EFAULT;
70
if (val == oldval && put_user(newval, uaddr))
71
return -EFAULT;
72
*uval = val;
73
return 0;
74
}
75
76
#endif /*__KERNEL__*/
77
#endif /*_ASM_PARISC_FUTEX_H*/
78
79