1
2#ifndef __LINUX_BITMAP_H
3#define __LINUX_BITMAP_H
4
5#ifndef __ASSEMBLY__
6
7#include <linux/types.h>
8#include <linux/bitops.h>
9#include <linux/string.h>
10#include <linux/kernel.h>
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
90
91
92
93
94
95
96
97
98
99
100
101
102extern int __bitmap_empty(const unsigned long *bitmap, unsigned int nbits);
103extern int __bitmap_full(const unsigned long *bitmap, unsigned int nbits);
104extern int __bitmap_equal(const unsigned long *bitmap1,
105 const unsigned long *bitmap2, unsigned int nbits);
106extern void __bitmap_complement(unsigned long *dst, const unsigned long *src,
107 unsigned int nbits);
108extern void __bitmap_shift_right(unsigned long *dst, const unsigned long *src,
109 unsigned int shift, unsigned int nbits);
110extern void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
111 unsigned int shift, unsigned int nbits);
112extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
113 const unsigned long *bitmap2, unsigned int nbits);
114extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
115 const unsigned long *bitmap2, unsigned int nbits);
116extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
117 const unsigned long *bitmap2, unsigned int nbits);
118extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
119 const unsigned long *bitmap2, unsigned int nbits);
120extern int __bitmap_intersects(const unsigned long *bitmap1,
121 const unsigned long *bitmap2, unsigned int nbits);
122extern int __bitmap_subset(const unsigned long *bitmap1,
123 const unsigned long *bitmap2, unsigned int nbits);
124extern int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
125extern void __bitmap_set(unsigned long *map, unsigned int start, int len);
126extern void __bitmap_clear(unsigned long *map, unsigned int start, int len);
127
128extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
129 unsigned long size,
130 unsigned long start,
131 unsigned int nr,
132 unsigned long align_mask,
133 unsigned long align_offset);
134
135
136
137
138
139
140
141
142
143
144
145
146
147static inline unsigned long
148bitmap_find_next_zero_area(unsigned long *map,
149 unsigned long size,
150 unsigned long start,
151 unsigned int nr,
152 unsigned long align_mask)
153{
154 return bitmap_find_next_zero_area_off(map, size, start, nr,
155 align_mask, 0);
156}
157
158extern int __bitmap_parse(const char *buf, unsigned int buflen, int is_user,
159 unsigned long *dst, int nbits);
160extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
161 unsigned long *dst, int nbits);
162extern int bitmap_parselist(const char *buf, unsigned long *maskp,
163 int nmaskbits);
164extern int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
165 unsigned long *dst, int nbits);
166extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
167 const unsigned long *old, const unsigned long *new, unsigned int nbits);
168extern int bitmap_bitremap(int oldbit,
169 const unsigned long *old, const unsigned long *new, int bits);
170extern void bitmap_onto(unsigned long *dst, const unsigned long *orig,
171 const unsigned long *relmap, unsigned int bits);
172extern void bitmap_fold(unsigned long *dst, const unsigned long *orig,
173 unsigned int sz, unsigned int nbits);
174extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order);
175extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order);
176extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order);
177extern unsigned int bitmap_from_u32array(unsigned long *bitmap,
178 unsigned int nbits,
179 const u32 *buf,
180 unsigned int nwords);
181extern unsigned int bitmap_to_u32array(u32 *buf,
182 unsigned int nwords,
183 const unsigned long *bitmap,
184 unsigned int nbits);
185#ifdef __BIG_ENDIAN
186extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits);
187#else
188#define bitmap_copy_le bitmap_copy
189#endif
190extern unsigned int bitmap_ord_to_pos(const unsigned long *bitmap, unsigned int ord, unsigned int nbits);
191extern int bitmap_print_to_pagebuf(bool list, char *buf,
192 const unsigned long *maskp, int nmaskbits);
193
194#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
195#define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
196
197#define small_const_nbits(nbits) \
198 (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
199
200static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
201{
202 if (small_const_nbits(nbits))
203 *dst = 0UL;
204 else {
205 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
206 memset(dst, 0, len);
207 }
208}
209
210static inline void bitmap_fill(unsigned long *dst, unsigned int nbits)
211{
212 unsigned int nlongs = BITS_TO_LONGS(nbits);
213 if (!small_const_nbits(nbits)) {
214 unsigned int len = (nlongs - 1) * sizeof(unsigned long);
215 memset(dst, 0xff, len);
216 }
217 dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
218}
219
220static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
221 unsigned int nbits)
222{
223 if (small_const_nbits(nbits))
224 *dst = *src;
225 else {
226 unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
227 memcpy(dst, src, len);
228 }
229}
230
231static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
232 const unsigned long *src2, unsigned int nbits)
233{
234 if (small_const_nbits(nbits))
235 return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0;
236 return __bitmap_and(dst, src1, src2, nbits);
237}
238
239static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
240 const unsigned long *src2, unsigned int nbits)
241{
242 if (small_const_nbits(nbits))
243 *dst = *src1 | *src2;
244 else
245 __bitmap_or(dst, src1, src2, nbits);
246}
247
248static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
249 const unsigned long *src2, unsigned int nbits)
250{
251 if (small_const_nbits(nbits))
252 *dst = *src1 ^ *src2;
253 else
254 __bitmap_xor(dst, src1, src2, nbits);
255}
256
257static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
258 const unsigned long *src2, unsigned int nbits)
259{
260 if (small_const_nbits(nbits))
261 return (*dst = *src1 & ~(*src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
262 return __bitmap_andnot(dst, src1, src2, nbits);
263}
264
265static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
266 unsigned int nbits)
267{
268 if (small_const_nbits(nbits))
269 *dst = ~(*src);
270 else
271 __bitmap_complement(dst, src, nbits);
272}
273
274static inline int bitmap_equal(const unsigned long *src1,
275 const unsigned long *src2, unsigned int nbits)
276{
277 if (small_const_nbits(nbits))
278 return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
279 if (__builtin_constant_p(nbits & 7) && IS_ALIGNED(nbits, 8))
280 return !memcmp(src1, src2, nbits / 8);
281 return __bitmap_equal(src1, src2, nbits);
282}
283
284static inline int bitmap_intersects(const unsigned long *src1,
285 const unsigned long *src2, unsigned int nbits)
286{
287 if (small_const_nbits(nbits))
288 return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
289 else
290 return __bitmap_intersects(src1, src2, nbits);
291}
292
293static inline int bitmap_subset(const unsigned long *src1,
294 const unsigned long *src2, unsigned int nbits)
295{
296 if (small_const_nbits(nbits))
297 return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
298 else
299 return __bitmap_subset(src1, src2, nbits);
300}
301
302static inline int bitmap_empty(const unsigned long *src, unsigned nbits)
303{
304 if (small_const_nbits(nbits))
305 return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
306
307 return find_first_bit(src, nbits) == nbits;
308}
309
310static inline int bitmap_full(const unsigned long *src, unsigned int nbits)
311{
312 if (small_const_nbits(nbits))
313 return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
314
315 return find_first_zero_bit(src, nbits) == nbits;
316}
317
318static __always_inline int bitmap_weight(const unsigned long *src, unsigned int nbits)
319{
320 if (small_const_nbits(nbits))
321 return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
322 return __bitmap_weight(src, nbits);
323}
324
325static __always_inline void bitmap_set(unsigned long *map, unsigned int start,
326 unsigned int nbits)
327{
328 if (__builtin_constant_p(nbits) && nbits == 1)
329 __set_bit(start, map);
330 else if (__builtin_constant_p(start & 7) && IS_ALIGNED(start, 8) &&
331 __builtin_constant_p(nbits & 7) && IS_ALIGNED(nbits, 8))
332 memset((char *)map + start / 8, 0xff, nbits / 8);
333 else
334 __bitmap_set(map, start, nbits);
335}
336
337static __always_inline void bitmap_clear(unsigned long *map, unsigned int start,
338 unsigned int nbits)
339{
340 if (__builtin_constant_p(nbits) && nbits == 1)
341 __clear_bit(start, map);
342 else if (__builtin_constant_p(start & 7) && IS_ALIGNED(start, 8) &&
343 __builtin_constant_p(nbits & 7) && IS_ALIGNED(nbits, 8))
344 memset((char *)map + start / 8, 0, nbits / 8);
345 else
346 __bitmap_clear(map, start, nbits);
347}
348
349static inline void bitmap_shift_right(unsigned long *dst, const unsigned long *src,
350 unsigned int shift, int nbits)
351{
352 if (small_const_nbits(nbits))
353 *dst = (*src & BITMAP_LAST_WORD_MASK(nbits)) >> shift;
354 else
355 __bitmap_shift_right(dst, src, shift, nbits);
356}
357
358static inline void bitmap_shift_left(unsigned long *dst, const unsigned long *src,
359 unsigned int shift, unsigned int nbits)
360{
361 if (small_const_nbits(nbits))
362 *dst = (*src << shift) & BITMAP_LAST_WORD_MASK(nbits);
363 else
364 __bitmap_shift_left(dst, src, shift, nbits);
365}
366
367static inline int bitmap_parse(const char *buf, unsigned int buflen,
368 unsigned long *maskp, int nmaskbits)
369{
370 return __bitmap_parse(buf, buflen, 0, maskp, nmaskbits);
371}
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399#if __BITS_PER_LONG == 64
400#define BITMAP_FROM_U64(n) (n)
401#else
402#define BITMAP_FROM_U64(n) ((unsigned long) ((u64)(n) & ULONG_MAX)), \
403 ((unsigned long) ((u64)(n) >> 32))
404#endif
405
406
407
408
409
410
411
412
413
414
415
416static inline void bitmap_from_u64(unsigned long *dst, u64 mask)
417{
418 dst[0] = mask & ULONG_MAX;
419
420 if (sizeof(mask) > sizeof(unsigned long))
421 dst[1] = mask >> 32;
422}
423
424#endif
425
426#endif
427