2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2011, Jack Lange <jacklange@cs.pitt.edu>
11 * Copyright (c) 2011, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jacklange@cs.pitt.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #include <palacios/vmm_bitmap.h>
21 #include <palacios/vmm.h>
24 int v3_bitmap_init(struct v3_bitmap * bitmap, int num_bits) {
25 int num_bytes = (num_bits / 8) + ((num_bits % 8) > 0);
27 v3_lock_init(&(bitmap->lock));
28 bitmap->num_bits = num_bits;
29 bitmap->bits = V3_Malloc(num_bytes);
32 if (bitmap->bits == NULL) {
33 PrintError(VM_NONE, VCORE_NONE, "Could not allocate bitmap of %d bits\n", num_bits);
37 memset(bitmap->bits, 0, num_bytes);
43 void v3_bitmap_deinit(struct v3_bitmap * bitmap) {
44 v3_lock_deinit(&(bitmap->lock));
45 V3_Free(bitmap->bits);
49 int v3_bitmap_reset(struct v3_bitmap * bitmap) {
50 int num_bytes = (bitmap->num_bits / 8) + ((bitmap->num_bits % 8) > 0);
52 memset(bitmap->bits, 0, num_bytes);
57 int v3_bitmap_set(struct v3_bitmap * bitmap, int index) {
58 int major = index / 8;
59 int minor = index % 8;
63 if (index > (bitmap->num_bits - 1)) {
64 PrintError(VM_NONE, VCORE_NONE, "Index out of bitmap range: (pos = %d) (num_bits = %d)\n",
65 index, bitmap->num_bits);
70 flags = v3_lock_irqsave(bitmap->lock);
72 old_val = (bitmap->bits[major] & (0x1 << minor));
73 bitmap->bits[major] |= (0x1 << minor);
75 v3_unlock_irqrestore(bitmap->lock, flags);
81 int v3_bitmap_clear(struct v3_bitmap * bitmap, int index) {
82 int major = index / 8;
83 int minor = index % 8;
87 if (index > (bitmap->num_bits - 1)) {
88 PrintError(VM_NONE, VCORE_NONE, "Index out of bitmap range: (pos = %d) (num_bits = %d)\n",
89 index, bitmap->num_bits);
93 flags = v3_lock_irqsave(bitmap->lock);
95 old_val = (bitmap->bits[major] & (0x1 << minor));
96 bitmap->bits[major] &= ~(0x1 << minor);
98 v3_unlock_irqrestore(bitmap->lock, flags);
103 int v3_bitmap_check(struct v3_bitmap * bitmap, int index) {
104 int major = index / 8;
105 int minor = index % 8;
107 if (index > (bitmap->num_bits - 1)) {
108 PrintError(VM_NONE, VCORE_NONE, "Index out of bitmap range: (pos = %d) (num_bits = %d)\n",
109 index, bitmap->num_bits);
113 return ((bitmap->bits[major] & (0x1 << minor)) != 0);
117 int v3_bitmap_count(struct v3_bitmap * bitmap) {
122 uint8_t * bytes = bitmap->bits;
123 int num_bytes = (bitmap->num_bits / 8) + ((bitmap->num_bits % 8) > 0);
125 for (i=0; i < num_bytes; i++) {
136 int v3_bitmap_copy(struct v3_bitmap * dst, struct v3_bitmap * src) {
138 if (src->num_bits != dst->num_bits) {
139 PrintError(VM_NONE, VCORE_NONE, "src and dst must be the same size.\n");
143 int num_bytes = (src->num_bits / 8) + ((src->num_bits % 8)!=0);
145 memcpy(dst->bits,src->bits,num_bytes);