aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-01-20 09:33:59 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-01-20 09:33:59 +0000
commit2e883df3953dc1cdfb3efa584274c22bcc65f4f6 (patch)
treeb35e26bbbd7cf31802e4de97afc08c78192834c1
parentf1315aa62e30560ef01542a09540e247ec9b27a8 (diff)
downloadxen-2e883df3953dc1cdfb3efa584274c22bcc65f4f6.tar.gz
xen-2e883df3953dc1cdfb3efa584274c22bcc65f4f6.tar.bz2
xen-2e883df3953dc1cdfb3efa584274c22bcc65f4f6.zip
xend: Properly interpret vcpu_avail Long Integer in xc.hvm_build().
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r--tools/python/xen/lowlevel/xc/xc.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c
index 9ac35c452a..996e1b4ae2 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -911,20 +911,46 @@ static PyObject *pyxc_hvm_build(XcObject *self,
#if !defined(__ia64__)
struct hvm_info_table *va_hvm;
uint8_t *va_map, sum;
- int i;
#endif
+ int i;
char *image;
int memsize, target=-1, vcpus = 1, acpi = 0, apic = 1;
- uint64_t vcpu_avail = 1;
+ PyObject *vcpu_avail_handle = NULL;
+ uint8_t vcpu_avail[HVM_MAX_VCPUS/8];
static char *kwd_list[] = { "domid",
"memsize", "image", "target", "vcpus",
"vcpu_avail", "acpi", "apic", NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iilii", kwd_list,
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iis|iiOii", kwd_list,
&dom, &memsize, &image, &target, &vcpus,
- &vcpu_avail, &acpi, &apic) )
+ &vcpu_avail_handle, &acpi, &apic) )
return NULL;
+ memset(vcpu_avail, 0, sizeof(vcpu_avail));
+ vcpu_avail[0] = 1;
+ if ( vcpu_avail_handle != NULL )
+ {
+ if ( PyInt_Check(vcpu_avail_handle) )
+ {
+ unsigned long v = PyInt_AsLong(vcpu_avail_handle);
+ for ( i = 0; i < sizeof(long)/8; i++ )
+ vcpu_avail[i] = (uint8_t)(v>>(i*8));
+ }
+ else if ( PyLong_Check(vcpu_avail_handle) )
+ {
+ if ( _PyLong_AsByteArray((PyLongObject *)vcpu_avail_handle,
+ (unsigned char *)vcpu_avail,
+ sizeof(vcpu_avail), 1, 0) )
+ return NULL;
+ }
+ else
+ {
+ errno = EINVAL;
+ PyErr_SetFromErrno(xc_error_obj);
+ return NULL;
+ }
+ }
+
if ( target == -1 )
target = memsize;
@@ -943,8 +969,7 @@ static PyObject *pyxc_hvm_build(XcObject *self,
va_hvm->acpi_enabled = acpi;
va_hvm->apic_mode = apic;
va_hvm->nr_vcpus = vcpus;
- ((uint64_t *)va_hvm->vcpu_online)[0] = vcpu_avail;
- ((uint64_t *)va_hvm->vcpu_online)[1] = 0;
+ memcpy(va_hvm->vcpu_online, vcpu_avail, sizeof(vcpu_avail));
for ( i = 0, sum = 0; i < va_hvm->length; i++ )
sum += ((uint8_t *)va_hvm)[i];
va_hvm->checksum -= sum;