|
1 #ifndef _LINUX_FUTEX_H |
|
2 #define _LINUX_FUTEX_H |
|
3 |
|
4 #include <linux/compiler.h> |
|
5 #include <linux/types.h> |
|
6 |
|
7 struct inode; |
|
8 struct mm_struct; |
|
9 struct task_struct; |
|
10 union ktime; |
|
11 |
|
12 /* Second argument to futex syscall */ |
|
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 * Support for robust futexes: the kernel cleans up held futexes at |
|
43 * thread exit time. |
|
44 */ |
|
45 |
|
46 /* |
|
47 * Per-lock list entry - embedded in user-space locks, somewhere close |
|
48 * to the futex field. (Note: user-space uses a double-linked list to |
|
49 * achieve O(1) list add and remove, but the kernel only needs to know |
|
50 * about the forward link) |
|
51 * |
|
52 * NOTE: this structure is part of the syscall ABI, and must not be |
|
53 * changed. |
|
54 */ |
|
55 struct robust_list { |
|
56 struct robust_list __user *next; |
|
57 }; |
|
58 |
|
59 /* |
|
60 * Per-thread list head: |
|
61 * |
|
62 * NOTE: this structure is part of the syscall ABI, and must only be |
|
63 * changed if the change is first communicated with the glibc folks. |
|
64 * (When an incompatible change is done, we'll increase the structure |
|
65 * size, which glibc will detect) |
|
66 */ |
|
67 struct robust_list_head { |
|
68 /* |
|
69 * The head of the list. Points back to itself if empty: |
|
70 */ |
|
71 struct robust_list list; |
|
72 |
|
73 /* |
|
74 * This relative offset is set by user-space, it gives the kernel |
|
75 * the relative position of the futex field to examine. This way |
|
76 * we keep userspace flexible, to freely shape its data-structure, |
|
77 * without hardcoding any particular offset into the kernel: |
|
78 */ |
|
79 long futex_offset; |
|
80 |
|
81 /* |
|
82 * The death of the thread may race with userspace setting |
|
83 * up a lock's links. So to handle this race, userspace first |
|
84 * sets this field to the address of the to-be-taken lock, |
|
85 * then does the lock acquire, and then adds itself to the |
|
86 * list, and then clears this field. Hence the kernel will |
|
87 * always have full knowledge of all locks that the thread |
|
88 * _might_ have taken. We check the owner TID in any case, |
|
89 * so only truly owned locks will be handled. |
|
90 */ |
|
91 struct robust_list __user *list_op_pending; |
|
92 }; |
|
93 |
|
94 /* |
|
95 * Are there any waiters for this robust futex: |
|
96 */ |
|
97 #define FUTEX_WAITERS 0x80000000 |
|
98 |
|
99 /* |
|
100 * The kernel signals via this bit that a thread holding a futex |
|
101 * has exited without unlocking the futex. The kernel also does |
|
102 * a FUTEX_WAKE on such futexes, after setting the bit, to wake |
|
103 * up any possible waiters: |
|
104 */ |
|
105 #define FUTEX_OWNER_DIED 0x40000000 |
|
106 |
|
107 /* |
|
108 * The rest of the robust-futex field is for the TID: |
|
109 */ |
|
110 #define FUTEX_TID_MASK 0x3fffffff |
|
111 |
|
112 /* |
|
113 * This limit protects against a deliberately circular list. |
|
114 * (Not worth introducing an rlimit for it) |
|
115 */ |
|
116 #define ROBUST_LIST_LIMIT 2048 |
|
117 |
|
118 /* |
|
119 * bitset with all bits set for the FUTEX_xxx_BITSET OPs to request a |
|
120 * match of any bit. |
|
121 */ |
|
122 #define FUTEX_BITSET_MATCH_ANY 0xffffffff |
|
123 |
|
124 #ifdef __KERNEL__ |
|
125 long do_futex(u32 __user *uaddr, int op, u32 val, union ktime *timeout, |
|
126 u32 __user *uaddr2, u32 val2, u32 val3); |
|
127 |
|
128 extern int |
|
129 handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi); |
|
130 |
|
131 /* |
|
132 * Futexes are matched on equal values of this key. |
|
133 * The key type depends on whether it's a shared or private mapping. |
|
134 * Don't rearrange members without looking at hash_futex(). |
|
135 * |
|
136 * offset is aligned to a multiple of sizeof(u32) (== 4) by definition. |
|
137 * We use the two low order bits of offset to tell what is the kind of key : |
|
138 * 00 : Private process futex (PTHREAD_PROCESS_PRIVATE) |
|
139 * (no reference on an inode or mm) |
|
140 * 01 : Shared futex (PTHREAD_PROCESS_SHARED) |
|
141 * mapped on a file (reference on the underlying inode) |
|
142 * 10 : Shared futex (PTHREAD_PROCESS_SHARED) |
|
143 * (but private mapping on an mm, and reference taken on it) |
|
144 */ |
|
145 |
|
146 #define FUT_OFF_INODE 1 /* We set bit 0 if key has a reference on inode */ |
|
147 #define FUT_OFF_MMSHARED 2 /* We set bit 1 if key has a reference on mm */ |
|
148 |
|
149 union 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 |
|
168 extern void exit_robust_list(struct task_struct *curr); |
|
169 extern void exit_pi_state_list(struct task_struct *curr); |
|
170 extern int futex_cmpxchg_enabled; |
|
171 #else |
|
172 static inline void exit_robust_list(struct task_struct *curr) |
|
173 { |
|
174 } |
|
175 static inline void exit_pi_state_list(struct task_struct *curr) |
|
176 { |
|
177 } |
|
178 #endif |
|
179 #endif /* __KERNEL__ */ |
|
180 |
|
181 #define FUTEX_OP_SET 0 /* *(int *)UADDR2 = OPARG; */ |
|
182 #define FUTEX_OP_ADD 1 /* *(int *)UADDR2 += OPARG; */ |
|
183 #define FUTEX_OP_OR 2 /* *(int *)UADDR2 |= OPARG; */ |
|
184 #define FUTEX_OP_ANDN 3 /* *(int *)UADDR2 &= ~OPARG; */ |
|
185 #define FUTEX_OP_XOR 4 /* *(int *)UADDR2 ^= OPARG; */ |
|
186 |
|
187 #define FUTEX_OP_OPARG_SHIFT 8 /* Use (1 << OPARG) instead of OPARG. */ |
|
188 |
|
189 #define FUTEX_OP_CMP_EQ 0 /* if (oldval == CMPARG) wake */ |
|
190 #define FUTEX_OP_CMP_NE 1 /* if (oldval != CMPARG) wake */ |
|
191 #define FUTEX_OP_CMP_LT 2 /* if (oldval < CMPARG) wake */ |
|
192 #define FUTEX_OP_CMP_LE 3 /* if (oldval <= CMPARG) wake */ |
|
193 #define FUTEX_OP_CMP_GT 4 /* if (oldval > CMPARG) wake */ |
|
194 #define FUTEX_OP_CMP_GE 5 /* if (oldval >= CMPARG) wake */ |
|
195 |
|
196 /* FUTEX_WAKE_OP will perform atomically |
|
197 int oldval = *(int *)UADDR2; |
|
198 *(int *)UADDR2 = oldval OP OPARG; |
|
199 if (oldval CMP CMPARG) |
|
200 wake UADDR2; */ |
|
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 |