00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00040 #include <adt/bitmap.h>
00041 #include <typedefs.h>
00042 #include <arch/types.h>
00043 #include <align.h>
00044 #include <debug.h>
00045 #include <macros.h>
00046
00047 #define ALL_ONES 0xff
00048 #define ALL_ZEROES 0x00
00049
00058 void bitmap_initialize(bitmap_t *bitmap, __u8 *map, count_t bits)
00059 {
00060 bitmap->map = map;
00061 bitmap->bits = bits;
00062 }
00063
00070 void bitmap_set_range(bitmap_t *bitmap, index_t start, count_t bits)
00071 {
00072 index_t i=0;
00073 index_t aligned_start;
00074 count_t lub;
00075 count_t amb;
00076 count_t tab;
00077
00078 ASSERT(start + bits <= bitmap->bits);
00079
00080 aligned_start = ALIGN_UP(start, 8);
00081 lub = min(aligned_start - start, bits);
00082 amb = bits > lub ? bits - lub : 0;
00083 tab = amb % 8;
00084
00085 if ( start + bits < aligned_start ) {
00086
00087
00088
00089 bitmap->map[start / 8] |= ((1 << lub)-1) << (start&7);
00090 return;
00091 }
00092
00093 if (lub) {
00094
00095
00096
00097 bitmap->map[start / 8] |= ~((1 << (8 - lub)) - 1);
00098 }
00099 for (i = 0; i < amb / 8; i++) {
00100
00101
00102
00103 bitmap->map[aligned_start / 8 + i] = ALL_ONES;
00104 }
00105 if (tab) {
00106
00107
00108
00109 bitmap->map[aligned_start / 8 + i] |= (1 << tab) - 1;
00110 }
00111
00112 }
00113
00120 void bitmap_clear_range(bitmap_t *bitmap, index_t start, count_t bits)
00121 {
00122 index_t i=0;
00123 index_t aligned_start;
00124 count_t lub;
00125 count_t amb;
00126 count_t tab;
00127
00128 ASSERT(start + bits <= bitmap->bits);
00129
00130 aligned_start = ALIGN_UP(start, 8);
00131 lub = min(aligned_start - start, bits);
00132 amb = bits > lub ? bits - lub : 0;
00133 tab = amb % 8;
00134
00135 if ( start + bits < aligned_start )
00136 {
00137
00138
00139
00140 bitmap->map[start / 8] &= ~(((1 << lub)-1) << (start&7));
00141 return;
00142 }
00143
00144
00145 if (lub) {
00146
00147
00148
00149 bitmap->map[start / 8] &= (1 << (8 - lub)) - 1;
00150 }
00151 for (i = 0; i < amb / 8; i++) {
00152
00153
00154
00155 bitmap->map[aligned_start / 8 + i] = ALL_ZEROES;
00156 }
00157 if (tab) {
00158
00159
00160
00161 bitmap->map[aligned_start / 8 + i] &= ~((1 << tab) - 1);
00162 }
00163
00164 }
00165
00172 void bitmap_copy(bitmap_t *dst, bitmap_t *src, count_t bits)
00173 {
00174 index_t i;
00175
00176 ASSERT(bits <= dst->bits);
00177 ASSERT(bits <= src->bits);
00178
00179 for (i = 0; i < bits / 8; i++)
00180 dst->map[i] = src->map[i];
00181
00182 if (bits % 8) {
00183 bitmap_clear_range(dst, i * 8, bits % 8);
00184 dst->map[i] |= src->map[i] & ((1 << (bits % 8)) - 1);
00185 }
00186 }
00187