# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1196962214 0
# Node ID 641426243d912a9d912c456d7ac32ee1da7b7846
# Parent 6cea70effb11da3c615987b279cf76a4dfb31ba5
Fix xenctl_cpumap_to_cpumask.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset: 16519:62451388f63065af4aeff966a856b925b4cca052
xen-unstable date: Tue Dec 04 11:52:10 2007 +0000
---
xen/common/domctl.c | 20 +++++++++++++-------
1 files changed, 13 insertions(+), 7 deletions(-)
diff -r 6cea70effb11 -r 641426243d91 xen/common/domctl.c
--- a/xen/common/domctl.c Thu Dec 06 17:29:46 2007 +0000
+++ b/xen/common/domctl.c Thu Dec 06 17:30:14 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
|