aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_private.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-01-06 09:14:39 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-01-06 09:14:39 +0000
commit7e72c30726d6c5588affffcfc9ee21ca32888030 (patch)
tree983e7ad7caeb3cb1642907949b64c2d13a8c19c1 /tools/libxc/xc_private.c
parentc5e9f7aa3a7c36f7649f15a2c94a3ffd310c5bc5 (diff)
downloadxen-7e72c30726d6c5588affffcfc9ee21ca32888030.tar.gz
xen-7e72c30726d6c5588affffcfc9ee21ca32888030.tar.bz2
xen-7e72c30726d6c5588affffcfc9ee21ca32888030.zip
libxc: Define xc_ffs{8,16,32,64} functions. Use them.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'tools/libxc/xc_private.c')
-rw-r--r--tools/libxc/xc_private.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c
index 5990415d9e..e0613b9e4f 100644
--- a/tools/libxc/xc_private.c
+++ b/tools/libxc/xc_private.c
@@ -639,6 +639,33 @@ int write_exact(int fd, const void *data, size_t size)
return 0;
}
+int xc_ffs8(uint8_t x)
+{
+ int i;
+ for ( i = 0; i < 8; i++ )
+ if ( x & (1u << i) )
+ return i+1;
+ return 0;
+}
+
+int xc_ffs16(uint16_t x)
+{
+ uint8_t h = x>>8, l = x;
+ return l ? xc_ffs8(l) : h ? xc_ffs8(h) + 8 : 0;
+}
+
+int xc_ffs32(uint32_t x)
+{
+ uint16_t h = x>>16, l = x;
+ return l ? xc_ffs16(l) : h ? xc_ffs16(h) + 16 : 0;
+}
+
+int xc_ffs64(uint64_t x)
+{
+ uint32_t h = x>>32, l = x;
+ return l ? xc_ffs32(l) : h ? xc_ffs32(h) + 32 : 0;
+}
+
/*
* Local variables:
* mode: C