Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
diff -r 58d6c9cb95c6 xen/common/bitmap.c
--- a/xen/common/bitmap.c Wed Jan 17 14:57:04 2007 -0500
+++ b/xen/common/bitmap.c Wed Jan 17 15:09:23 2007 -0500
@@ -10,6 +10,7 @@
#include <xen/errno.h>
#include <xen/bitmap.h>
#include <xen/bitops.h>
+#include <asm/byteorder.h>
/*
* bitmaps provide an array of bits, implemented using an an
@@ -467,3 +468,77 @@ int bitmap_allocate_region(unsigned long
return 0;
}
EXPORT_SYMBOL(bitmap_allocate_region);
+
+static inline ulong ulong_to_le(ulong l)
+{
+#if BITS_PER_LONG == 32
+ return cpu_to_le32(l);
+#else
+ return cpu_to_le64(l);
+#endif
+
+}
+
+static inline ulong le_to_ulong(ulong l)
+{
+#if BITS_PER_LONG == 32
+ return le32_to_cpu(l);
+#else
+ return le64_to_cpu(l);
+#endif
+}
+
+void *bitmap_long_to_byte(uint8_t *bp, const ulong *lp, size_t n)
+{
+#ifdef __BIG_ENDIAN
+ ulong l;
+ int i = 0;
+ int b = 0;
+
+ for (;;) {
+ l = ulong_to_le(lp[i]);
+
+ if (n < sizeof (l))
+ break;
+
+ ((ulong *)bp)[b] = l;
+ ++i;
+ n -= sizeof (l);
+ b += sizeof (l);
+ }
+ /* don't call memcpy for 0 */
+ if (n > 0)
+ memcpy(&bp[b], &l, n);
+#else
+ memcpy(bp, lp, n);
+#endif
+
+ return bp;
+}
+EXPORT_SYMBOL(bitmap_long_to_byte);
+
+void *bitmap_byte_to_long(ulong *lp, const uint8_t *bp, size_t n)
+{
+#ifdef __BIG_ENDIAN
+ ulong l;
+ int i = 0;
+ int b = 0;
+
+ while (n > sizeof (l)) {
+ l = ((ulong *)bp)[b];
+ lp[i] = le_to_ulong(l);
+ ++i;
+ n -= sizeof (l);
+ b += sizeof (l);
+ }
+ if (n > 0) {
+ l = 0;
+ memcpy(&l, &bp[b], n);
+ lp[i] = le_to_ulong(l);
+ }
+#else
+ memcpy(lp, bp, n);
+#endif
+ return lp;
+}
+EXPORT_SYMBOL(bitmap_byte_to_long);
diff -r 58d6c9cb95c6 xen/common/domctl.c
--- a/xen/common/domctl.c Wed Jan 17 14:57:04 2007 -0500
+++ b/xen/common/domctl.c Wed Jan 17 15:37:35 2007 -0500
@@ -18,6 +18,7 @@
#include <xen/console.h>
#include <xen/iocap.h>
#include <xen/guest_access.h>
+#include <xen/bitmap.h>
#ifdef CONFIG_COMPAT
#include <xen/compat.h>
#endif
@@ -40,6 +41,7 @@ void cpumask_to_xenctl_cpumap(
{
unsigned int guest_bytes, copy_bytes, i;
uint8_t zero = 0;
+ uint8_t local[sizeof (*cpumask)];
if ( guest_handle_is_null(xenctl_cpumap->bitmap) )
return;
@@ -47,9 +49,9 @@ void cpumask_to_xenctl_cpumap(
guest_bytes = (xenctl_cpumap->nr_cpus + 7) / 8;
copy_bytes = min_t(unsigned int, guest_bytes, (NR_CPUS + 7) / 8);
- copy_to_guest(xenctl_cpumap->bitmap,
- (uint8_t *)cpus_addr(*cpumask),
- copy_bytes);
+ bitmap_long_to_byte(local, cpus_addr(*cpumask), copy_bytes);
+
+ copy_to_guest(xenctl_cpumap->bitmap, &local[0], copy_bytes);
for ( i = copy_bytes; i < guest_bytes; i++ )
copy_to_guest_offset(xenctl_cpumap->bitmap, i, &zero, 1);
@@ -59,6 +61,7 @@ void xenctl_cpumap_to_cpumask(
cpumask_t *cpumask, struct xenctl_cpumap *xenctl_cpumap)
{
unsigned int guest_bytes, copy_bytes;
+ uint8_t local[sizeof (*cpumask)];
guest_bytes = (xenctl_cpumap->nr_cpus + 7) / 8;
copy_bytes = min_t(unsigned int, guest_bytes, (NR_CPUS + 7) / 8);
@@ -68,9 +71,9 @@ void xenctl_cpumap_to_cpumask(
if ( guest_handle_is_null(xenctl_cpumap->bitmap) )
return;
- copy_from_guest((uint8_t *)cpus_addr(*cpumask),
- xenctl_cpumap->bitmap,
- copy_bytes);
+ copy_from_guest(&local[0], xenctl_cpumap->bitmap, copy_bytes);
+
+ bitmap_byte_to_long(cpus_addr(*cpumask), local, copy_bytes);
}
#endif /* COMPAT */
diff -r 58d6c9cb95c6 xen/include/xen/bitmap.h
--- a/xen/include/xen/bitmap.h Wed Jan 17 14:57:04 2007 -0500
+++ b/xen/include/xen/bitmap.h Wed Jan 17 15:06:33 2007 -0500
@@ -251,6 +251,9 @@ static inline void bitmap_shift_left(uns
__bitmap_shift_left(dst, src, n, nbits);
}
+extern void *bitmap_long_to_byte(uint8_t *bp, const ulong *lp, size_t n);
+extern void *bitmap_byte_to_long(ulong *lp, const uint8_t *bp, size_t n);
+
#endif /* __ASSEMBLY__ */
#endif /* __XEN_BITMAP_H */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|