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
87extern int __bitmap_empty(const unsigned long *bitmap, int bits);
88extern int __bitmap_full(const unsigned long *bitmap, int bits);
89extern int __bitmap_equal(const unsigned long *bitmap1,
90 const unsigned long *bitmap2, int bits);
91extern void __bitmap_complement(unsigned long *dst, const unsigned long *src,
92 int bits);
93extern void __bitmap_shift_right(unsigned long *dst,
94 const unsigned long *src, int shift, int bits);
95extern void __bitmap_shift_left(unsigned long *dst,
96 const unsigned long *src, int shift, int bits);
97extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
98 const unsigned long *bitmap2, int bits);
99extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
100 const unsigned long *bitmap2, int bits);
101extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
102 const unsigned long *bitmap2, int bits);
103extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
104 const unsigned long *bitmap2, int bits);
105extern int __bitmap_intersects(const unsigned long *bitmap1,
106 const unsigned long *bitmap2, int bits);
107extern int __bitmap_subset(const unsigned long *bitmap1,
108 const unsigned long *bitmap2, int bits);
109extern int __bitmap_weight(const unsigned long *bitmap, int bits);
110
111extern int bitmap_scnprintf(char *buf, unsigned int len,
112 const unsigned long *src, int nbits);
113extern int __bitmap_parse(const char *buf, unsigned int buflen, int is_user,
114 unsigned long *dst, int nbits);
115extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
116 unsigned long *dst, int nbits);
117extern int bitmap_scnlistprintf(char *buf, unsigned int len,
118 const unsigned long *src, int nbits);
119extern int bitmap_parselist(const char *buf, unsigned long *maskp,
120 int nmaskbits);
121extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
122 const unsigned long *old, const unsigned long *new, int bits);
123extern int bitmap_bitremap(int oldbit,
124 const unsigned long *old, const unsigned long *new, int bits);
125extern void bitmap_onto(unsigned long *dst, const unsigned long *orig,
126 const unsigned long *relmap, int bits);
127extern void bitmap_fold(unsigned long *dst, const unsigned long *orig,
128 int sz, int bits);
129extern int bitmap_find_free_region(unsigned long *bitmap, int bits, int order);
130extern void bitmap_release_region(unsigned long *bitmap, int pos, int order);
131extern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order);
132extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits);
133
134#define BITMAP_LAST_WORD_MASK(nbits) \
135( \
136 ((nbits) % BITS_PER_LONG) ? \
137 (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \
138)
139
140#define small_const_nbits(nbits) \
141 (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
142
143static inline void bitmap_zero(unsigned long *dst, int nbits)
144{
145 if (small_const_nbits(nbits))
146 *dst = 0UL;
147 else {
148 int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
149 memset(dst, 0, len);
150 }
151}
152
153static inline void bitmap_fill(unsigned long *dst, int nbits)
154{
155 size_t nlongs = BITS_TO_LONGS(nbits);
156 if (!small_const_nbits(nbits)) {
157 int len = (nlongs - 1) * sizeof(unsigned long);
158 memset(dst, 0xff, len);
159 }
160 dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
161}
162
163static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
164 int nbits)
165{
166 if (small_const_nbits(nbits))
167 *dst = *src;
168 else {
169 int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
170 memcpy(dst, src, len);
171 }
172}
173
174static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
175 const unsigned long *src2, int nbits)
176{
177 if (small_const_nbits(nbits))
178 return (*dst = *src1 & *src2) != 0;
179 return __bitmap_and(dst, src1, src2, nbits);
180}
181
182static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
183 const unsigned long *src2, int nbits)
184{
185 if (small_const_nbits(nbits))
186 *dst = *src1 | *src2;
187 else
188 __bitmap_or(dst, src1, src2, nbits);
189}
190
191static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
192 const unsigned long *src2, int nbits)
193{
194 if (small_const_nbits(nbits))
195 *dst = *src1 ^ *src2;
196 else
197 __bitmap_xor(dst, src1, src2, nbits);
198}
199
200static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
201 const unsigned long *src2, int nbits)
202{
203 if (small_const_nbits(nbits))
204 return (*dst = *src1 & ~(*src2)) != 0;
205 return __bitmap_andnot(dst, src1, src2, nbits);
206}
207
208static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
209 int nbits)
210{
211 if (small_const_nbits(nbits))
212 *dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits);
213 else
214 __bitmap_complement(dst, src, nbits);
215}
216
217static inline int bitmap_equal(const unsigned long *src1,
218 const unsigned long *src2, int nbits)
219{
220 if (small_const_nbits(nbits))
221 return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
222 else
223 return __bitmap_equal(src1, src2, nbits);
224}
225
226static inline int bitmap_intersects(const unsigned long *src1,
227 const unsigned long *src2, int nbits)
228{
229 if (small_const_nbits(nbits))
230 return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
231 else
232 return __bitmap_intersects(src1, src2, nbits);
233}
234
235static inline int bitmap_subset(const unsigned long *src1,
236 const unsigned long *src2, int nbits)
237{
238 if (small_const_nbits(nbits))
239 return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
240 else
241 return __bitmap_subset(src1, src2, nbits);
242}
243
244static inline int bitmap_empty(const unsigned long *src, int nbits)
245{
246 if (small_const_nbits(nbits))
247 return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
248 else
249 return __bitmap_empty(src, nbits);
250}
251
252static inline int bitmap_full(const unsigned long *src, int nbits)
253{
254 if (small_const_nbits(nbits))
255 return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
256 else
257 return __bitmap_full(src, nbits);
258}
259
260static inline int bitmap_weight(const unsigned long *src, int nbits)
261{
262 if (small_const_nbits(nbits))
263 return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
264 return __bitmap_weight(src, nbits);
265}
266
267static inline void bitmap_shift_right(unsigned long *dst,
268 const unsigned long *src, int n, int nbits)
269{
270 if (small_const_nbits(nbits))
271 *dst = *src >> n;
272 else
273 __bitmap_shift_right(dst, src, n, nbits);
274}
275
276static inline void bitmap_shift_left(unsigned long *dst,
277 const unsigned long *src, int n, int nbits)
278{
279 if (small_const_nbits(nbits))
280 *dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits);
281 else
282 __bitmap_shift_left(dst, src, n, nbits);
283}
284
285static inline int bitmap_parse(const char *buf, unsigned int buflen,
286 unsigned long *maskp, int nmaskbits)
287{
288 return __bitmap_parse(buf, buflen, 0, maskp, nmaskbits);
289}
290
291#endif
292
293#endif
294