1#ifndef _LINUX_FUTEX_H
2#define _LINUX_FUTEX_H
3
4#include <linux/compiler.h>
5#include <linux/types.h>
6
7struct inode;
8struct mm_struct;
9struct task_struct;
10union ktime;
11
12
13
14
15#define FUTEX_WAIT 0
16#define FUTEX_WAKE 1
17#define FUTEX_FD 2
18#define FUTEX_REQUEUE 3
19#define FUTEX_CMP_REQUEUE 4
20#define FUTEX_WAKE_OP 5
21#define FUTEX_LOCK_PI 6
22#define FUTEX_UNLOCK_PI 7
23#define FUTEX_TRYLOCK_PI 8
24#define FUTEX_WAIT_BITSET 9
25#define FUTEX_WAKE_BITSET 10
26
27#define FUTEX_PRIVATE_FLAG 128
28#define FUTEX_CMD_MASK ~FUTEX_PRIVATE_FLAG
29
30#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
31#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
32#define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
33#define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
34#define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
35#define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
36#define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
37#define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
38#define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITS | FUTEX_PRIVATE_FLAG)
39#define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITS | FUTEX_PRIVATE_FLAG)
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55struct robust_list {
56 struct robust_list __user *next;
57};
58
59
60
61
62
63
64
65
66
67struct robust_list_head {
68
69
70
71 struct robust_list list;
72
73
74
75
76
77
78
79 long futex_offset;
80
81
82
83
84
85
86
87
88
89
90
91 struct robust_list __user *list_op_pending;
92};
93
94
95
96
97#define FUTEX_WAITERS 0x80000000
98
99
100
101
102
103
104
105#define FUTEX_OWNER_DIED 0x40000000
106
107
108
109
110#define FUTEX_TID_MASK 0x3fffffff
111
112
113
114
115
116#define ROBUST_LIST_LIMIT 2048
117
118
119
120
121
122#define FUTEX_BITSET_MATCH_ANY 0xffffffff
123
124#ifdef __KERNEL__
125long do_futex(u32 __user *uaddr, int op, u32 val, union ktime *timeout,
126 u32 __user *uaddr2, u32 val2, u32 val3);
127
128extern int
129handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi);
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146#define FUT_OFF_INODE 1
147#define FUT_OFF_MMSHARED 2
148
149union futex_key {
150 struct {
151 unsigned long pgoff;
152 struct inode *inode;
153 int offset;
154 } shared;
155 struct {
156 unsigned long address;
157 struct mm_struct *mm;
158 int offset;
159 } private;
160 struct {
161 unsigned long word;
162 void *ptr;
163 int offset;
164 } both;
165};
166
167#ifdef CONFIG_FUTEX
168extern void exit_robust_list(struct task_struct *curr);
169extern void exit_pi_state_list(struct task_struct *curr);
170extern int futex_cmpxchg_enabled;
171#else
172static inline void exit_robust_list(struct task_struct *curr)
173{
174}
175static inline void exit_pi_state_list(struct task_struct *curr)
176{
177}
178#endif
179#endif
180
181#define FUTEX_OP_SET 0
182#define FUTEX_OP_ADD 1
183#define FUTEX_OP_OR 2
184#define FUTEX_OP_ANDN 3
185#define FUTEX_OP_XOR 4
186
187#define FUTEX_OP_OPARG_SHIFT 8
188
189#define FUTEX_OP_CMP_EQ 0
190#define FUTEX_OP_CMP_NE 1
191#define FUTEX_OP_CMP_LT 2
192#define FUTEX_OP_CMP_LE 3
193#define FUTEX_OP_CMP_GT 4
194#define FUTEX_OP_CMP_GE 5
195
196
197
198
199
200
201
202#define FUTEX_OP(op, oparg, cmp, cmparg) \
203 (((op & 0xf) << 28) | ((cmp & 0xf) << 24) \
204 | ((oparg & 0xfff) << 12) | (cmparg & 0xfff))
205
206#endif
207