1 /* $OpenBSD: bitmap.h,v 1.5 2023/01/01 01:34:58 jsg Exp $ */ 2 /* 3 * Copyright (c) 2013, 2014, 2015 Mark Kettenis 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #ifndef _LINUX_BITMAP_H 19 #define _LINUX_BITMAP_H 20 21 #include <linux/bitops.h> 22 #include <linux/string.h> 23 24 #define bitmap_empty(p, n) (find_first_bit(p, n) == n) 25 26 static inline void 27 bitmap_set(void *p, int b, u_int n) 28 { 29 u_int end = b + n; 30 31 for (; b < end; b++) 32 __set_bit(b, p); 33 } 34 35 static inline void 36 bitmap_clear(void *p, int b, u_int n) 37 { 38 u_int end = b + n; 39 40 for (; b < end; b++) 41 __clear_bit(b, p); 42 } 43 44 static inline void 45 bitmap_zero(void *p, u_int n) 46 { 47 u_int *ptr = p; 48 u_int b; 49 50 for (b = 0; b < n; b += 32) 51 ptr[b >> 5] = 0; 52 } 53 54 static inline void 55 bitmap_fill(void *p, u_int n) 56 { 57 u_int *ptr = p; 58 u_int b; 59 60 for (b = 0; b < n; b += 32) 61 ptr[b >> 5] = 0xffffffff; 62 } 63 64 static inline void 65 bitmap_or(void *d, void *s1, void *s2, u_int n) 66 { 67 u_int *dst = d; 68 u_int *src1 = s1; 69 u_int *src2 = s2; 70 u_int b; 71 72 for (b = 0; b < n; b += 32) 73 dst[b >> 5] = src1[b >> 5] | src2[b >> 5]; 74 } 75 76 static inline void 77 bitmap_andnot(void *d, void *s1, void *s2, u_int n) 78 { 79 u_int *dst = d; 80 u_int *src1 = s1; 81 u_int *src2 = s2; 82 u_int b; 83 84 for (b = 0; b < n; b += 32) 85 dst[b >> 5] = src1[b >> 5] & ~src2[b >> 5]; 86 } 87 88 static inline void 89 bitmap_complement(void *d, void *s, u_int n) 90 { 91 u_int *dst = d; 92 u_int *src = s; 93 u_int b; 94 95 for (b = 0; b < n; b += 32) 96 dst[b >> 5] = ~src[b >> 5]; 97 } 98 99 static inline void 100 bitmap_copy(void *d, void *s, u_int n) 101 { 102 u_int *dst = d; 103 u_int *src = s; 104 u_int b; 105 106 for (b = 0; b < n; b += 32) 107 dst[b >> 5] = src[b >> 5]; 108 } 109 110 static inline void 111 bitmap_to_arr32(void *d, unsigned long *src, u_int n) 112 { 113 u_int *dst = d; 114 u_int b; 115 116 #ifdef __LP64__ 117 for (b = 0; b < n; b += 32) { 118 dst[b >> 5] = src[b >> 6] & 0xffffffff; 119 b += 32; 120 if (b < n) 121 dst[b >> 5] = src[b >> 6] >> 32; 122 } 123 #else 124 bitmap_copy(d, src, n); 125 #endif 126 if ((n % 32) != 0) 127 dst[n >> 5] &= (0xffffffff >> (32 - (n % 32))); 128 } 129 130 131 static inline int 132 bitmap_weight(const void *p, u_int n) 133 { 134 const u_int *ptr = p; 135 u_int b; 136 int sum = 0; 137 138 for (b = 0; b < n; b += 32) 139 sum += hweight32(ptr[b >> 5]); 140 return sum; 141 } 142 143 void *bitmap_zalloc(u_int, gfp_t); 144 void bitmap_free(void *); 145 146 #endif 147