diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-01-20 09:33:59 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-01-20 09:33:59 +0000 |
commit | 2e883df3953dc1cdfb3efa584274c22bcc65f4f6 (patch) | |
tree | b35e26bbbd7cf31802e4de97afc08c78192834c1 | |
parent | f1315aa62e30560ef01542a09540e247ec9b27a8 (diff) | |
download | xen-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.c | 37 |
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; |