[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Fix xenctl_cpumap_to_cpumask.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1196769130 0 # Node ID 62451388f63065af4aeff966a856b925b4cca052 # Parent 6706934cdf9d5d7110d97c5186dd5292e717cd5f Fix xenctl_cpumap_to_cpumask. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/common/domctl.c | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) diff -r 6706934cdf9d -r 62451388f630 xen/common/domctl.c --- a/xen/common/domctl.c Tue Dec 04 11:23:05 2007 +0000 +++ b/xen/common/domctl.c Tue Dec 04 11:52:10 2007 +0000 @@ -43,7 +43,8 @@ void cpumask_to_xenctl_cpumap( bitmap_long_to_byte(bytemap, cpus_addr(*cpumask), NR_CPUS); - copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes); + if ( copy_bytes != 0 ) + copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes); for ( i = copy_bytes; i < guest_bytes; i++ ) copy_to_guest_offset(xenctl_cpumap->bitmap, i, &zero, 1); @@ -55,15 +56,20 @@ void xenctl_cpumap_to_cpumask( unsigned int guest_bytes, copy_bytes; uint8_t bytemap[(NR_CPUS + 7) / 8]; + if ( guest_handle_is_null(xenctl_cpumap->bitmap) ) + return; + guest_bytes = (xenctl_cpumap->nr_cpus + 7) / 8; copy_bytes = min_t(unsigned int, guest_bytes, sizeof(bytemap)); - cpus_clear(*cpumask); - - if ( guest_handle_is_null(xenctl_cpumap->bitmap) ) - return; - - copy_from_guest(bytemap, xenctl_cpumap->bitmap, copy_bytes); + memset(bytemap, 0, sizeof(bytemap)); + + if ( copy_bytes != 0 ) + { + copy_from_guest(bytemap, xenctl_cpumap->bitmap, copy_bytes); + if ( (xenctl_cpumap->nr_cpus & 7) && (guest_bytes <= sizeof(bytemap)) ) + bytemap[guest_bytes-1] &= ~(0xff << (xenctl_cpumap->nr_cpus & 7)); + } bitmap_byte_to_long(cpus_addr(*cpumask), bytemap, NR_CPUS); } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |