Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
diff -r 58d6c9cb95c6 tools/libxc/xc_byteorder.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_byteorder.h Wed Jan 17 16:42:03 2007 -0500
@@ -0,0 +1,33 @@
+#ifdef __sun__
+#include <sys/byteorder.h>
+#define bswap_8 BSWAP_8
+#define bswap_16 BSWAP_16
+#define bswap_32 BSWAP_32
+#define bswap_64 BSWAP_64
+#else
+#include <endian.h>
+#include <byteswap.h>
+#endif
+
+/*
+ * define as needed
+ */
+
+#if (__BYTE_ORDER == __BIG_ENDIAN) || defined(_BIG_ENDIAN)
+#define XC_BIG_ENDIAN
+
+#define cpu_to_le64(x) bswap_64(x)
+#define le64_to_cpu(x) bswap_64(x)
+#define cpu_to_le32(x) bswap_32(x)
+#define le32_to_cpu(x) bswap_32(x)
+
+#elif (__BYTE_ORDER == __LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN)
+
+#define XC_LITTLE_ENDIAN
+
+#define cpu_to_le64(x) (x)
+#define le64_to_cpu(x) (x)
+#define cpu_to_le32(x) (x)
+#define le32_to_cpu(x) (x)
+
+#endif
diff -r 58d6c9cb95c6 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Wed Jan 17 14:57:04 2007 -0500
+++ b/tools/libxc/xc_domain.c Wed Jan 17 16:52:25 2007 -0500
@@ -96,16 +96,19 @@ int xc_vcpu_setaffinity(int xc_handle,
{
DECLARE_DOMCTL;
int ret = -1;
+ uint8_t local[sizeof (cpumap)];
domctl.cmd = XEN_DOMCTL_setvcpuaffinity;
domctl.domain = (domid_t)domid;
domctl.u.vcpuaffinity.vcpu = vcpu;
- set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap,
- (uint8_t *)&cpumap);
+ bitmap_64_to_byte(local, &cpumap, sizeof (cpumap));
+
+ set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local);
+
domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8;
- if ( lock_pages(&cpumap, sizeof(cpumap)) != 0 )
+ if ( lock_pages(local, sizeof(local)) != 0 )
{
PERROR("Could not lock memory for Xen hypercall");
goto out;
@@ -113,7 +116,7 @@ int xc_vcpu_setaffinity(int xc_handle,
ret = do_domctl(xc_handle, &domctl);
- unlock_pages(&cpumap, sizeof(cpumap));
+ unlock_pages(local, sizeof(local));
out:
return ret;
@@ -127,16 +130,16 @@ int xc_vcpu_getaffinity(int xc_handle,
{
DECLARE_DOMCTL;
int ret = -1;
+ uint8_t local[sizeof (cpumap)];
domctl.cmd = XEN_DOMCTL_getvcpuaffinity;
domctl.domain = (domid_t)domid;
domctl.u.vcpuaffinity.vcpu = vcpu;
- set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap,
- (uint8_t *)cpumap);
- domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(*cpumap) * 8;
+ set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local);
+ domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8;
- if ( lock_pages(cpumap, sizeof(*cpumap)) != 0 )
+ if ( lock_pages(local, sizeof(local)) != 0 )
{
PERROR("Could not lock memory for Xen hypercall");
goto out;
@@ -144,8 +147,8 @@ int xc_vcpu_getaffinity(int xc_handle,
ret = do_domctl(xc_handle, &domctl);
- unlock_pages(cpumap, sizeof(*cpumap));
-
+ unlock_pages(local, sizeof (local));
+ bitmap_byte_to_64(cpumap, local, sizeof (local));
out:
return ret;
}
diff -r 58d6c9cb95c6 tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c Wed Jan 17 14:57:04 2007 -0500
+++ b/tools/libxc/xc_private.c Wed Jan 17 17:08:08 2007 -0500
@@ -9,6 +9,7 @@
#include "xg_private.h"
#include <stdarg.h>
#include <pthread.h>
+#include "xc_byteorder.h"
static __thread xc_error last_error = { XC_ERROR_NONE, ""};
#if DEBUG
@@ -502,6 +503,59 @@ char *safe_strerror(int errcode)
return errbuf;
}
+void *bitmap_64_to_byte(uint8_t *bp, const uint64_t *lp, size_t n)
+{
+#ifdef XC_BIG_ENDIAN
+ uint64_t l;
+ int i = 0;
+ int b = 0;
+
+ for (;;) {
+ l = cpu_to_le64(lp[i]);
+
+ if (n < sizeof (l))
+ break;
+
+ ((uint64_t *)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;
+}
+
+void *bitmap_byte_to_64(uint64_t *lp, const uint8_t *bp, size_t n)
+{
+#ifdef XC_BIG_ENDIAN
+ uint64_t l;
+ int i = 0;
+ int b = 0;
+
+ while (n > sizeof (l)) {
+ l = ((uint64_t *)bp)[b];
+ lp[i] = le64_to_cpu(l);
+ ++i;
+ n -= sizeof (l);
+ b += sizeof (l);
+ }
+ if (n > 0) {
+ l = 0;
+ memcpy(&l, &bp[b], n);
+ lp[i] = le64_to_cpu(l);
+ }
+#else
+ memcpy(lp, bp, n);
+#endif
+ return lp;
+}
+
/*
* Local variables:
* mode: C
diff -r 58d6c9cb95c6 tools/libxc/xc_private.h
--- a/tools/libxc/xc_private.h Wed Jan 17 14:57:04 2007 -0500
+++ b/tools/libxc/xc_private.h Wed Jan 17 16:50:54 2007 -0500
@@ -157,4 +157,7 @@ int xc_waitdomain_core(int xc_handle, in
int xc_waitdomain_core(int xc_handle, int domain, int *status,
int options, vcpu_guest_context_t *ctxt);
+extern void *bitmap_64_to_byte(uint8_t *bp, const uint64_t *lp, size_t n);
+extern void *bitmap_byte_to_64(uint64_t *lp, const uint8_t *bp, size_t n);
+
#endif /* __XC_PRIVATE_H__ */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|