Loading...
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_SH_FUTEX_IRQ_H
3#define __ASM_SH_FUTEX_IRQ_H
4
5static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval,
6 u32 __user *uaddr,
7 u32 oldval, u32 newval)
8{
9 unsigned long flags;
10 int ret;
11 u32 prev = 0;
12
13 local_irq_save(flags);
14
15 ret = get_user(prev, uaddr);
16 if (!ret && oldval == prev)
17 ret = put_user(newval, uaddr);
18
19 local_irq_restore(flags);
20
21 *uval = prev;
22 return ret;
23}
24
25#endif /* __ASM_SH_FUTEX_IRQ_H */
1#ifndef __ASM_SH_FUTEX_IRQ_H
2#define __ASM_SH_FUTEX_IRQ_H
3
4
5static inline int atomic_futex_op_xchg_set(int oparg, u32 __user *uaddr,
6 int *oldval)
7{
8 unsigned long flags;
9 int ret;
10
11 local_irq_save(flags);
12
13 ret = get_user(*oldval, uaddr);
14 if (!ret)
15 ret = put_user(oparg, uaddr);
16
17 local_irq_restore(flags);
18
19 return ret;
20}
21
22static inline int atomic_futex_op_xchg_add(int oparg, u32 __user *uaddr,
23 int *oldval)
24{
25 unsigned long flags;
26 int ret;
27
28 local_irq_save(flags);
29
30 ret = get_user(*oldval, uaddr);
31 if (!ret)
32 ret = put_user(*oldval + oparg, uaddr);
33
34 local_irq_restore(flags);
35
36 return ret;
37}
38
39static inline int atomic_futex_op_xchg_or(int oparg, u32 __user *uaddr,
40 int *oldval)
41{
42 unsigned long flags;
43 int ret;
44
45 local_irq_save(flags);
46
47 ret = get_user(*oldval, uaddr);
48 if (!ret)
49 ret = put_user(*oldval | oparg, uaddr);
50
51 local_irq_restore(flags);
52
53 return ret;
54}
55
56static inline int atomic_futex_op_xchg_and(int oparg, u32 __user *uaddr,
57 int *oldval)
58{
59 unsigned long flags;
60 int ret;
61
62 local_irq_save(flags);
63
64 ret = get_user(*oldval, uaddr);
65 if (!ret)
66 ret = put_user(*oldval & oparg, uaddr);
67
68 local_irq_restore(flags);
69
70 return ret;
71}
72
73static inline int atomic_futex_op_xchg_xor(int oparg, u32 __user *uaddr,
74 int *oldval)
75{
76 unsigned long flags;
77 int ret;
78
79 local_irq_save(flags);
80
81 ret = get_user(*oldval, uaddr);
82 if (!ret)
83 ret = put_user(*oldval ^ oparg, uaddr);
84
85 local_irq_restore(flags);
86
87 return ret;
88}
89
90static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval,
91 u32 __user *uaddr,
92 u32 oldval, u32 newval)
93{
94 unsigned long flags;
95 int ret;
96 u32 prev = 0;
97
98 local_irq_save(flags);
99
100 ret = get_user(prev, uaddr);
101 if (!ret && oldval == prev)
102 ret = put_user(newval, uaddr);
103
104 local_irq_restore(flags);
105
106 *uval = prev;
107 return ret;
108}
109
110#endif /* __ASM_SH_FUTEX_IRQ_H */