From mboxrd@z Thu Jan 1 00:00:00 1970 From: Linda Jacobson Subject: [PATCH] new functions libxl_bitmap_{or,and} Date: Mon, 13 Apr 2015 01:47:18 -0600 Message-ID: <1428911238-6244-1-git-send-email-lindaj@jma3.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: wei.liu2@citrix.com, ian.campbell@citrix.com, stefano.stabellini@eu.citrix.com, lars.kurth.xen@gmail.com, julien.grall@citrix.com, ian.jackson@citrix.com, lindaj@jma3.com List-Id: xen-devel@lists.xenproject.org provide logical and and or of two bitmaps --- v.1 updated comments and format v.2 rewrote bitmap functions to manipulate bytes not bits Signed-off-by: Linda Jacobson --- tools/libxl/libxl_utils.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_utils.h | 5 ++++ 2 files changed, 79 insertions(+) diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 9053b27..5c7178f 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -691,6 +691,80 @@ void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit) bitmap->map[bit / 8] &= ~(1 << (bit & 7)); } +/* provide logical or and logical and of two bitmaps */ +int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map, + libxl_bitmap *map1, libxl_bitmap *map2) +{ + GC_INIT(ctx); + int rc; + uint32_t i; + libxl_bitmap *lgmap; + libxl_bitmap *smap; + + if (map1->size > map2->size) { + lgmap = map1; + smap = map2; + } + else { + lgmap = map2; + smap = map1; + } + + rc = libxl_bitmap_alloc(ctx, or_map, lgmap->size * 8); + if (rc) + goto out; + + /* + * if bitmaps aren't the same size, their union (logical or) will + * be size of larger bit map. Any bit past the end of the + * smaller bit map, will match the larger one. + */ + for (i = 0; i < smap->size; i++) + or_map->map[i] = (smap->map[i] | lgmap->map[i]); + + for (i = smap->size; i < lgmap->size; i++) + or_map->map[i] = lgmap->map[i]; + +out: + GC_FREE; + return rc; +} + +int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map, + libxl_bitmap *map1, libxl_bitmap *map2) +{ + GC_INIT(ctx); + int rc; + uint32_t i; + libxl_bitmap *lgmap, *smap; + + if (map1->size > map2->size) { + lgmap = map1; + smap = map2; + } + else { + lgmap = map2; + smap = map1; + } + + + rc = libxl_bitmap_alloc(ctx, and_map, smap->size * 8); + if (rc) + goto out; + + /* + * if bitmaps aren't same size, their 'and' will be size of + * smaller bit map + */ + for (i = 0; i < and_map->size; i++) + and_map->map[i] = (lgmap->map[i] & smap->map[i]); + +out: + GC_FREE; + return rc; + +} + int libxl_bitmap_count_set(const libxl_bitmap *bitmap) { int i, nr_set_bits = 0; diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index acacdd9..1c0086b 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -90,6 +90,11 @@ int libxl_bitmap_test(const libxl_bitmap *bitmap, int bit); void libxl_bitmap_set(libxl_bitmap *bitmap, int bit); void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit); int libxl_bitmap_count_set(const libxl_bitmap *cpumap); +/* or and and functions for two bitmaps */ +int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map, + libxl_bitmap *map1, libxl_bitmap *map2); +int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map, + libxl_bitmap *map1, libxl_bitmap *map2); char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *cpumap); static inline void libxl_bitmap_set_any(libxl_bitmap *bitmap) { -- 1.9.1