# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2005/05/15 18:03:44-07:00 kmacy@octopus.eng.netapp.com 
#   Fix SMP coredumps
#   Signed-off-by: Kip Macy <kmacy@netapp.com>
# 
# BitKeeper/etc/logging_ok
#   2005/05/15 18:03:43-07:00 kmacy@octopus.eng.netapp.com +1 -0
#   Logging to logging@openlogging.org accepted
# 
# tools/libxc/xc_core.c
#   2005/05/15 18:03:21-07:00 kmacy@octopus.eng.netapp.com +11 -7
#   handle discontiguous CPUs correctly
#   make offsets in core header correct for MP case
# 
diff -Nru a/tools/libxc/xc_core.c b/tools/libxc/xc_core.c
--- a/tools/libxc/xc_core.c	2005-05-14 18:09:46 -07:00
+++ b/tools/libxc/xc_core.c	2005-05-14 18:09:46 -07:00
@@ -32,7 +32,7 @@
 	unsigned long nr_pages;
 	unsigned long *page_array;
 	xc_dominfo_t info;
-	int i, dump_fd;
+	int i, j, vcpu_map_size, dump_fd;
 	char *dump_mem, *dump_mem_start = NULL;
 	struct xc_core_header header;
 	vcpu_guest_context_t     ctxt[MAX_VIRT_CPUS];
@@ -53,14 +53,17 @@
 		goto error_out;
 	}
 	
-	for (i = 0; i < sizeof(info.vcpu_to_cpu) / sizeof(info.vcpu_to_cpu[0]);
-	     i++) {
-		if (info.vcpu_to_cpu[i] == -1)
+	vcpu_map_size =  sizeof(info.vcpu_to_cpu) / sizeof(info.vcpu_to_cpu[0]);
+
+	for (i = 0, j = 0; i < vcpu_map_size; i++) {
+		if (info.vcpu_to_cpu[i] == -1) {
 			continue;
-		if (xc_domain_get_vcpu_context(xc_handle, domid, i, &ctxt[i])) {
+		}
+		if (xc_domain_get_vcpu_context(xc_handle, domid, i, &ctxt[j])) {
 			PERROR("Could not get all vcpu contexts for domain");
 			goto error_out;
 		}
+		j++;
 	}
 	
 	nr_pages = info.nr_pages;
@@ -70,9 +73,10 @@
 	header.xch_nr_pages = nr_pages;
 	header.xch_ctxt_offset = sizeof(struct xc_core_header);
 	header.xch_index_offset = sizeof(struct xc_core_header) +
-	    sizeof(vcpu_guest_context_t);
+	    sizeof(vcpu_guest_context_t)*info.vcpus;
 	header.xch_pages_offset = round_pgup(sizeof(struct xc_core_header) +
-	    sizeof(vcpu_guest_context_t) + nr_pages * sizeof(unsigned long));
+	    (sizeof(vcpu_guest_context_t) * info.vcpus) + 
+	    (nr_pages * sizeof(unsigned long)));
 
 	write(dump_fd, &header, sizeof(struct xc_core_header));
 	write(dump_fd, &ctxt, sizeof(ctxt[0]) * info.vcpus);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel