X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_bitmap.c;h=f53ead165fe79b350b3f26da46f10a696a5d036b;hb=9feccf93cd8327d1d30a404a92f19716bf5a1e96;hp=14b042debdcec5009fc9105b67b870041a644fd3;hpb=e61e0890e6f13b1362cfffdcd287e90f1d41e443;p=palacios.git diff --git a/palacios/src/palacios/vmm_bitmap.c b/palacios/src/palacios/vmm_bitmap.c index 14b042d..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; } @@ -122,7 +136,7 @@ int v3_bitmap_count(struct v3_bitmap * bitmap) { 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"); + PrintError(VM_NONE, VCORE_NONE, "src and dst must be the same size.\n"); return -1; }