diff -rup crash-5.0.7.orig/kernel.c crash-5.0.7/kernel.c
--- crash-5.0.7.orig/kernel.c	2010-08-27 10:36:18.000000000 -0700
+++ crash-5.0.7/kernel.c	2010-09-17 11:47:08.608137000 -0700
@@ -6273,6 +6273,43 @@ get_cpus_present()
 }
 
 /*
+ *  If it exists, return the highest cpu number in the cpu_present_map.
+ */
+int
+get_highest_cpu_present()
+{
+	int i, len;
+	char *buf;
+	ulong *maskptr, addr;
+	int high, highest;
+
+	if (!(addr = cpu_map_addr("present")))
+		return -1;
+
+	len = cpu_map_size("present");
+	buf = GETBUF(len);
+	highest = -1;
+
+	if (readmem(addr, KVADDR, buf, len, 
+	    "cpu_present_map", RETURN_ON_ERROR)) {
+
+		maskptr = (ulong *)buf;
+		for (i = 0; i < (len/sizeof(ulong)); i++, maskptr++) {
+			if ((high = highest_bit_long(*maskptr)) < 0)
+				continue;
+			highest = high + (i * (sizeof(ulong)*8));
+		}
+
+		if (CRASHDEBUG(1))
+			error(INFO, "get_highest_cpu_present: %d\n", highest);
+	}
+
+	FREEBUF(buf);
+
+	return highest;
+}
+
+/*
  *  If it exists, return the number of cpus in the cpu_possible_map.
  */
 int
diff -rup crash-5.0.7.orig/x86_64.c crash-5.0.7/x86_64.c
--- crash-5.0.7.orig/x86_64.c	2010-08-27 10:36:18.000000000 -0700
+++ crash-5.0.7/x86_64.c	2010-09-17 11:47:08.637096000 -0700
@@ -873,8 +873,8 @@ x86_64_per_cpu_init(void)
 	if (cpus > 1)
 		kt->flags |= SMP;
 
-	if ((i = get_cpus_online()) && (!cpus || (i < cpus)))
-		kt->cpus = get_highest_cpu_online() + 1;
+	if ((i = get_cpus_present()) && (!cpus || (i < cpus)))
+		kt->cpus = get_highest_cpu_present() + 1;
 	else
 		kt->cpus = cpus;
 
@@ -4423,8 +4423,8 @@ x86_64_get_smp_cpus(void)
 			cpus++;
 		}
 
-		if ((i = get_cpus_online()) && (!cpus || (i < cpus)))
-			cpus = get_highest_cpu_online() + 1;
+		if ((i = get_cpus_present()) && (!cpus || (i < cpus)))
+			cpus = get_highest_cpu_present() + 1;
 
 		return cpus;
 	}
