X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_bitmap.c;h=f53ead165fe79b350b3f26da46f10a696a5d036b;hb=3586c3bd6260bf79c57baebf66a26d7e8158d411;hp=0f264736858815ea58e40c38925b228e239ffbf5;hpb=5f957c3aeebed4a07a0862cb5fbf595aa4436e81;p=palacios.git diff --git a/palacios/src/palacios/vmm_bitmap.c b/palacios/src/palacios/vmm_bitmap.c index 0f26473..f53ead1 100644 --- a/palacios/src/palacios/vmm_bitmap.c +++ b/palacios/src/palacios/vmm_bitmap.c @@ -24,11 +24,13 @@ 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); + PrintError(VM_NONE, VCORE_NONE, "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,16 +58,22 @@ 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", + PrintError(VM_NONE, VCORE_NONE, "Index out of bitmap range: (pos = %d) (num_bits = %d)\n", index, bitmap->num_bits); 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,16 +82,21 @@ 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", + PrintError(VM_NONE, VCORE_NONE, "Index out of bitmap range: (pos = %d) (num_bits = %d)\n", index, bitmap->num_bits); 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; } @@ -91,7 +105,7 @@ int v3_bitmap_check(struct v3_bitmap * bitmap, int index) { int minor = index % 8; if (index > (bitmap->num_bits - 1)) { - PrintError("Index out of bitmap range: (pos = %d) (num_bits = %d)\n", + PrintError(VM_NONE, VCORE_NONE, "Index out of bitmap range: (pos = %d) (num_bits = %d)\n", index, bitmap->num_bits); return -1; } @@ -99,3 +113,36 @@ int v3_bitmap_check(struct v3_bitmap * bitmap, int index) { 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(VM_NONE, VCORE_NONE, "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; +}