1#ifndef __LINUX_BITMAP_H
2#define __LINUX_BITMAP_H
3
4#ifndef __ASSEMBLY__
5
6#include <linux/types.h>
7#include <linux/bitops.h>
8#include <linux/string.h>
9#include <linux/kernel.h>
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90extern int __bitmap_empty(const unsigned long *bitmap, unsigned int nbits);
91extern int __bitmap_full(const unsigned long *bitmap, unsigned int nbits);
92extern int __bitmap_equal(const unsigned long *bitmap1,
93 const unsigned long *bitmap2, unsigned int nbits);
94extern void __bitmap_complement(unsigned long *dst, const unsigned long *src,
95 unsigned int nbits);
96extern void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
97 unsigned int shift, unsigned int nbits);
98extern void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
99 unsigned int shift, unsigned int nbits);
100extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
101 const unsigned long *bitmap2, unsigned int nbits);
102extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
103 const unsigned long *bitmap2, unsigned int nbits);
104extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
105 const unsigned long *bitmap2, unsigned int nbits);
106extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
107 const unsigned long *bitmap2, unsigned int nbits);
108extern int __bitmap_intersects(const unsigned long *bitmap1,
109 const unsigned long *bitmap2, unsigned int nbits);
110extern int __bitmap_subset(const unsigned long *bitmap1,
111 const unsigned long *bitmap2, unsigned int nbits);
112extern int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
113
114extern void bitmap_set(unsigned long *map, unsigned int start, int len);
115extern void bitmap_clear(unsigned long *map, unsigned int start, int len);
116
117extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
118 unsigned long size,
119 unsigned long start,
120 unsigned int nr,
121 unsigned long align_mask,
122 unsigned long align_offset);
123
124
125
126
127
128
129
130
131
132
133
134
135
136static inline unsigned long
137bitmap_find_next_zero_area(unsigned long *map,
138 unsigned long size,
139 unsigned long start,
140 unsigned int nr,
141 unsigned long align_mask)
142{
143 return bitmap_find_next_zero_area_off(map, size, start, nr,
144 align_mask, 0);
145}
146
147extern int __bitmap_parse(const char *buf, unsigned int buflen, int is_user,
148 unsigned long *dst, int nbits);
149extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
150 unsigned long *dst, int nbits);
151extern int bitmap_parselist(const char *buf, unsigned long *maskp,
152 int nmaskbits);
153extern int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
154 unsigned long *dst, int nbits);
155extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
156 const unsigned long *old, const unsigned long *new, unsigned int nbits);
157extern int bitmap_bitremap(int oldbit,
158 const unsigned long *old, const unsigned long *new, int bits);
159extern void bitmap_onto(unsigned long *dst, const unsigned long *orig,
160 const unsigned long *relmap, unsigned int bits);
161extern void bitmap_fold(unsigned long *dst, const unsigned long *orig,
162 unsigned int sz, unsigned int nbits);
163extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order);
164extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order);
165extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
166#ifdef __BIG_ENDIAN
167extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits);
168#else
169#define bitmap_copy_le bitmap_copy
170#endif
171extern unsigned int bitmap_ord_to_pos(const unsigned long *bitmap, unsigned int ord, unsigned int nbits);
172extern int bitmap_print_to_pagebuf(bool list, char *buf,
173 const unsigned long *maskp, int nmaskbits);
174
175#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
176#define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
177
178#define small_const_nbits(nbits) \
179 (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
180
181static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
182{
183 if (small_const_nbits(nbits))
184 *dst = 0UL;
185 else {
186 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
187 memset(dst, 0, len);
188 }
189}
190
191static inline void bitmap_fill(unsigned long *dst, unsigned int nbits)
192{
193 unsigned int nlongs = BITS_TO_LONGS(nbits);
194 if (!small_const_nbits(nbits)) {
195 unsigned int len = (nlongs - 1) * sizeof(unsigned long);
196 memset(dst, 0xff, len);
197 }
198 dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
199}
200
201static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
202 unsigned int nbits)
203{
204 if (small_const_nbits(nbits))
205 *dst = *src;
206 else {
207 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
208 memcpy(dst, src, len);
209 }
210}
211
212static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
213 const unsigned long *src2, unsigned int nbits)
214{
215 if (small_const_nbits(nbits))
216 return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0;
217 return __bitmap_and(dst, src1, src2, nbits);
218}
219
220static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
221 const unsigned long *src2, unsigned int nbits)
222{
223 if (small_const_nbits(nbits))
224 *dst = *src1 | *src2;
225 else
226 __bitmap_or(dst, src1, src2, nbits);
227}
228
229static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
230 const unsigned long *src2, unsigned int nbits)
231{
232 if (small_const_nbits(nbits))
233 *dst = *src1 ^ *src2;
234 else
235 __bitmap_xor(dst, src1, src2, nbits);
236}
237
238static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
239 const unsigned long *src2, unsigned int nbits)
240{
241 if (small_const_nbits(nbits))
242 return (*dst = *src1 & ~(*src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
243 return __bitmap_andnot(dst, src1, src2, nbits);
244}
245
246static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
247 unsigned int nbits)
248{
249 if (small_const_nbits(nbits))
250 *dst = ~(*src);
251 else
252 __bitmap_complement(dst, src, nbits);
253}
254
255static inline int bitmap_equal(const unsigned long *src1,
256 const unsigned long *src2, unsigned int nbits)
257{
258 if (small_const_nbits(nbits))
259 return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
260 else
261 return __bitmap_equal(src1, src2, nbits);
262}
263
264static inline int bitmap_intersects(const unsigned long *src1,
265 const unsigned long *src2, unsigned int nbits)
266{
267 if (small_const_nbits(nbits))
268 return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
269 else
270 return __bitmap_intersects(src1, src2, nbits);
271}
272
273static inline int bitmap_subset(const unsigned long *src1,
274 const unsigned long *src2, unsigned int nbits)
275{
276 if (small_const_nbits(nbits))
277 return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
278 else
279 return __bitmap_subset(src1, src2, nbits);
280}
281
282static inline int bitmap_empty(const unsigned long *src, unsigned nbits)
283{
284 if (small_const_nbits(nbits))
285 return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
286
287 return find_first_bit(src, nbits) == nbits;
288}
289
290static inline int bitmap_full(const unsigned long *src, unsigned int nbits)
291{
292 if (small_const_nbits(nbits))
293 return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
294
295 return find_first_zero_bit(src, nbits) == nbits;
296}
297
298static inline int bitmap_weight(const unsigned long *src, unsigned int nbits)
299{
300 if (small_const_nbits(nbits))
301 return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
302 return __bitmap_weight(src, nbits);
303}
304
305static inline void bitmap_shift_right(unsigned long *dst, const unsigned long *src,
306 unsigned int shift, int nbits)
307{
308 if (small_const_nbits(nbits))
309 *dst = (*src & BITMAP_LAST_WORD_MASK(nbits)) >> shift;
310 else
311 __bitmap_shift_right(dst, src, shift, nbits);
312}
313
314static inline void bitmap_shift_left(unsigned long *dst, const unsigned long *src,
315 unsigned int shift, unsigned int nbits)
316{
317 if (small_const_nbits(nbits))
318 *dst = (*src << shift) & BITMAP_LAST_WORD_MASK(nbits);
319 else
320 __bitmap_shift_left(dst, src, shift, nbits);
321}
322
323static inline int bitmap_parse(const char *buf, unsigned int buflen,
324 unsigned long *maskp, int nmaskbits)
325{
326 return __bitmap_parse(buf, buflen, 0, maskp, nmaskbits);
327}
328
329#endif
330
331#endif
332