X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_bitmap.c;h=a94d557c2aafed9c5187a4bd83f557f8bb85c330;hb=357764d1d3bc432b149e8864c183c3a39ee4d474;hp=c056a5bac2d402c46a3fbd5baaf68b9b430152a2;hpb=9a9c14099c09e9ed86d8ac2f73f7406d0ac8a90b;p=palacios.releases.git diff --git a/palacios/src/palacios/vmm_bitmap.c b/palacios/src/palacios/vmm_bitmap.c index c056a5b..a94d557 100644 --- a/palacios/src/palacios/vmm_bitmap.c +++ b/palacios/src/palacios/vmm_bitmap.c @@ -24,9 +24,11 @@ int v3_bitmap_init(struct v3_bitmap * bitmap, int num_bits) { int num_bytes = (num_bits / 8) + ((num_bits % 8) > 0); + v3_lock_init(&(bitmap->lock)); bitmap->num_bits = num_bits; bitmap->bits = V3_Malloc(num_bytes); + if (bitmap->bits == NULL) { PrintError("Could not allocate bitmap of %d bits\n", num_bits); return -1; @@ -39,6 +41,7 @@ int v3_bitmap_init(struct v3_bitmap * bitmap, int num_bits) { void v3_bitmap_deinit(struct v3_bitmap * bitmap) { + v3_lock_deinit(&(bitmap->lock)); V3_Free(bitmap->bits); } @@ -55,6 +58,7 @@ int v3_bitmap_set(struct v3_bitmap * bitmap, int index) { int major = index / 8; int minor = index % 8; int old_val = 0; + uint32_t flags = 0; if (index > (bitmap->num_bits - 1)) { PrintError("Index out of bitmap range: (pos = %d) (num_bits = %d)\n", @@ -62,9 +66,14 @@ int v3_bitmap_set(struct v3_bitmap * bitmap, int index) { return -1; } + + flags = v3_lock_irqsave(bitmap->lock); + old_val = (bitmap->bits[major] & (0x1 << minor)); bitmap->bits[major] |= (0x1 << minor); + v3_unlock_irqrestore(bitmap->lock, flags); + return old_val; } @@ -73,6 +82,7 @@ int v3_bitmap_clear(struct v3_bitmap * bitmap, int index) { int major = index / 8; int minor = index % 8; int old_val = 0; + uint32_t flags = 0; if (index > (bitmap->num_bits - 1)) { PrintError("Index out of bitmap range: (pos = %d) (num_bits = %d)\n", @@ -80,9 +90,13 @@ int v3_bitmap_clear(struct v3_bitmap * bitmap, int index) { return -1; } + flags = v3_lock_irqsave(bitmap->lock); + old_val = (bitmap->bits[major] & (0x1 << minor)); bitmap->bits[major] &= ~(0x1 << minor); + v3_unlock_irqrestore(bitmap->lock, flags); + return old_val; } @@ -96,6 +110,39 @@ int v3_bitmap_check(struct v3_bitmap * bitmap, int index) { return -1; } - return (bitmap->bits[major] & (0x1 << minor)); + return ((bitmap->bits[major] & (0x1 << minor)) != 0); +} + + +int v3_bitmap_count(struct v3_bitmap * bitmap) { + + int cnt = 0; + int i; + uint8_t x; + uint8_t * bytes = bitmap->bits; + int num_bytes = (bitmap->num_bits / 8) + ((bitmap->num_bits % 8) > 0); + + for (i=0; i < num_bytes; i++) { + x = bytes[i]; + while (x) { + cnt += (x & 0x1); + x>>=1; + } + } + + return cnt; } +int v3_bitmap_copy(struct v3_bitmap * dst, struct v3_bitmap * src) { + + if (src->num_bits != dst->num_bits) { + PrintError("src and dst must be the same size.\n"); + return -1; + } + + int num_bytes = (src->num_bits / 8) + ((src->num_bits % 8)!=0); + + memcpy(dst->bits,src->bits,num_bytes); + + return 0; +}