aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Jackson <ian.jackson@eu.citrix.com>2013-06-14 16:45:40 +0100
committerIan Jackson <Ian.Jackson@eu.citrix.com>2013-06-14 16:45:40 +0100
commit282188ea84b9e0f9c4865f0609e7740f2f28e7b0 (patch)
tree426cfcf143048b13933b3f03f3207f95659ee9af
parent86e39ce58e91fe55d4fdbc914cb1955c45acc20e (diff)
downloadxen-282188ea84b9e0f9c4865f0609e7740f2f28e7b0.tar.gz
xen-282188ea84b9e0f9c4865f0609e7740f2f28e7b0.tar.bz2
xen-282188ea84b9e0f9c4865f0609e7740f2f28e7b0.zip
libxc: Introduce xc_bitops.h
Copy the one file tools/libxc/xc_bitops.h from xen.git#aa1355f9. We will need this for the next patch, which calls for a bitmap in libxc. xc_bitops.h was introduced to unify various existing sets of bitmap operations. In this patch we backport only the introduction, not the replacement of the other instances. So we introduce another instance Sorry :-/. This is part of the fix to a security issue, XSA-55. This patch is unique to the Xen 4.1 version of the XSA-55 series. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
-rw-r--r--tools/libxc/xc_bitops.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/tools/libxc/xc_bitops.h b/tools/libxc/xc_bitops.h
new file mode 100644
index 0000000000..d8e0c168d7
--- /dev/null
+++ b/tools/libxc/xc_bitops.h
@@ -0,0 +1,63 @@
+#ifndef XC_BITOPS_H
+#define XC_BITOPS_H 1
+
+/* bitmap operations for single threaded access */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define BITS_PER_LONG (sizeof(unsigned long) * 8)
+#define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6)
+
+#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr)/BITS_PER_LONG]
+#define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG)
+
+/* calculate required space for number of longs needed to hold nr_bits */
+static inline int bitmap_size(int nr_bits)
+{
+ int nr_long, nr_bytes;
+ nr_long = (nr_bits + BITS_PER_LONG - 1) >> ORDER_LONG;
+ nr_bytes = nr_long * sizeof(unsigned long);
+ return nr_bytes;
+}
+
+static inline unsigned long *bitmap_alloc(int nr_bits)
+{
+ return calloc(1, bitmap_size(nr_bits));
+}
+
+static inline void bitmap_clear(unsigned long *addr, int nr_bits)
+{
+ memset(addr, 0, bitmap_size(nr_bits));
+}
+
+static inline int test_bit(int nr, unsigned long *addr)
+{
+ return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1;
+}
+
+static inline void clear_bit(int nr, unsigned long *addr)
+{
+ BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr));
+}
+
+static inline void set_bit(int nr, unsigned long *addr)
+{
+ BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr));
+}
+
+static inline int test_and_clear_bit(int nr, unsigned long *addr)
+{
+ int oldbit = test_bit(nr, addr);
+ clear_bit(nr, addr);
+ return oldbit;
+}
+
+static inline int test_and_set_bit(int nr, unsigned long *addr)
+{
+ int oldbit = test_bit(nr, addr);
+ set_bit(nr, addr);
+ return oldbit;
+}
+
+#endif /* XC_BITOPS_H */