1 /* $OpenBSD: bitmap.h,v 1.6 2024/01/06 09:33:08 kettenis 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/align.h> 22 #include <linux/bitops.h> 23 #include <linux/string.h> 24 25 #define bitmap_empty(p, n) (find_first_bit(p, n) == n) 26 27 static inline void 28 bitmap_set(void *p, int b, u_int n) 29 { 30 u_int end = b + n; 31 32 for (; b < end; b++) 33 __set_bit(b, p); 34 } 35 36 static inline void 37 bitmap_clear(void *p, int b, u_int n) 38 { 39 u_int end = b + n; 40 41 for (; b < end; b++) 42 __clear_bit(b, p); 43 } 44 45 static inline void 46 bitmap_zero(void *p, u_int n) 47 { 48 u_int *ptr = p; 49 u_int b; 50 51 for (b = 0; b < n; b += 32) 52 ptr[b >> 5] = 0; 53 } 54 55 static inline void 56 bitmap_fill(void *p, u_int n) 57 { 58 u_int *ptr = p; 59 u_int b; 60 61 for (b = 0; b < n; b += 32) 62 ptr[b >> 5] = 0xffffffff; 63 } 64 65 static inline void 66 bitmap_or(void *d, void *s1, void *s2, u_int n) 67 { 68 u_int *dst = d; 69 u_int *src1 = s1; 70 u_int *src2 = s2; 71 u_int b; 72 73 for (b = 0; b < n; b += 32) 74 dst[b >> 5] = src1[b >> 5] | src2[b >> 5]; 75 } 76 77 static inline void 78 bitmap_andnot(void *d, void *s1, void *s2, u_int n) 79 { 80 u_int *dst = d; 81 u_int *src1 = s1; 82 u_int *src2 = s2; 83 u_int b; 84 85 for (b = 0; b < n; b += 32) 86 dst[b >> 5] = src1[b >> 5] & ~src2[b >> 5]; 87 } 88 89 static inline void 90 bitmap_complement(void *d, void *s, u_int n) 91 { 92 u_int *dst = d; 93 u_int *src = s; 94 u_int b; 95 96 for (b = 0; b < n; b += 32) 97 dst[b >> 5] = ~src[b >> 5]; 98 } 99 100 static inline void 101 bitmap_copy(void *d, void *s, u_int n) 102 { 103 u_int *dst = d; 104 u_int *src = s; 105 u_int b; 106 107 for (b = 0; b < n; b += 32) 108 dst[b >> 5] = src[b >> 5]; 109 } 110 111 static inline void 112 bitmap_to_arr32(void *d, unsigned long *src, u_int n) 113 { 114 u_int *dst = d; 115 u_int b; 116 117 #ifdef __LP64__ 118 for (b = 0; b < n; b += 32) { 119 dst[b >> 5] = src[b >> 6] & 0xffffffff; 120 b += 32; 121 if (b < n) 122 dst[b >> 5] = src[b >> 6] >> 32; 123 } 124 #else 125 bitmap_copy(d, src, n); 126 #endif 127 if ((n % 32) != 0) 128 dst[n >> 5] &= (0xffffffff >> (32 - (n % 32))); 129 } 130 131 132 static inline int 133 bitmap_weight(const void *p, u_int n) 134 { 135 const u_int *ptr = p; 136 u_int b; 137 int sum = 0; 138 139 for (b = 0; b < n; b += 32) 140 sum += hweight32(ptr[b >> 5]); 141 return sum; 142 } 143 144 static inline int 145 bitmap_find_free_region(void *p, u_int n, int o) 146 { 147 int b; 148 149 KASSERT(o == 0); 150 b = find_first_zero_bit(p, n); 151 if (b == n) 152 return -ENOMEM; 153 __set_bit(b, p); 154 return b; 155 } 156 157 static inline void 158 bitmap_release_region(void *p, u_int b, int o) 159 { 160 KASSERT(o == 0); 161 __clear_bit(b, p); 162 } 163 164 void *bitmap_zalloc(u_int, gfp_t); 165 void bitmap_free(void *); 166 167 #endif 168