diff -pNaur linux-2.5.71/arch/i386/kernel/smpboot.c linux-2.5.71-skipapic/arch/i386/kernel/smpboot.c
--- linux-2.5.71/arch/i386/kernel/smpboot.c	2003-06-14 14:18:20.000000000 -0500
+++ linux-2.5.71-skipapic/arch/i386/kernel/smpboot.c	2003-06-16 12:07:07.000000000 -0500
@@ -82,6 +82,10 @@ extern unsigned char trampoline_data [];
 extern unsigned char trampoline_end  [];
 static unsigned char *trampoline_base;
 
+/* used to selectively not boot certain CPUs with apicids */
+extern int skip_apic_ids[NR_CPUS];
+
+
 /*
  * Currently trivial. Write the real->protected mode
  * bootstrap into the page concerned. The caller
@@ -934,6 +938,16 @@ void *xquad_portio;
 
 int cpu_sibling_map[NR_CPUS] __cacheline_aligned;
 
+static int skip_this_apicid(int apicid)
+{
+	int i;
+
+	for (i = 1; i < (skip_apic_ids[0] + 1); i++) 
+		if (apicid == skip_apic_ids[i]) 
+			return 1;
+	return 0;
+}
+
 static void __init smp_boot_cpus(unsigned int max_cpus)
 {
 	int apicid, cpu, bit, kicked;
@@ -1032,6 +1046,8 @@ static void __init smp_boot_cpus(unsigne
 			continue;
 		if (max_cpus <= cpucount+1)
 			continue;
+		if (skip_this_apicid(apicid))
+			continue;
 
 		if (do_boot_cpu(apicid))
 			printk("CPU #%d not responding - cannot use it.\n",
diff -pNaur linux-2.5.71/Documentation/kernel-parameters.txt linux-2.5.71-skipapic/Documentation/kernel-parameters.txt
--- linux-2.5.71/Documentation/kernel-parameters.txt	2003-06-14 14:18:52.000000000 -0500
+++ linux-2.5.71-skipapic/Documentation/kernel-parameters.txt	2003-06-16 16:57:07.046502128 -0500
@@ -886,6 +886,10 @@ running once the system is up.
 			Format: <io>,<irq>,<dma>
 			See header of drivers/cdrom/sjcd.c.
 
+	skip_apicids=	[SMP] 
+			Format: <apic1>[,<apic2>[,...,<apicN>]]
+			Do not boot cpus with matching apicid.
+
 	slram=		[HW,MTD]
 
 	smart2=		[HW]
diff -pNaur linux-2.5.71/init/main.c linux-2.5.71-skipapic/init/main.c
--- linux-2.5.71/init/main.c	2003-06-14 14:17:59.000000000 -0500
+++ linux-2.5.71-skipapic/init/main.c	2003-06-16 12:07:07.000000000 -0500
@@ -115,6 +115,8 @@ char *execute_command;
 
 /* Setup configured maximum number of CPUs to activate */
 static unsigned int max_cpus = NR_CPUS;
+/* Don't boot apicids in this list */
+int skip_apic_ids[NR_CPUS];
 
 /*
  * Setup routine for controlling SMP activation
@@ -142,6 +144,18 @@ static int __init maxcpus(char *str)
 
 __setup("maxcpus=", maxcpus);
 
+static int __init skip_apicids(char *str)
+{
+	int i;
+
+	get_options(str, NR_CPUS, skip_apic_ids);
+	for (i = 1; i < (skip_apic_ids[0]+1); i++)
+		printk( "CPU with apicid %i will not be booted\n", skip_apic_ids[i]);
+	return 1;
+}
+
+__setup("skip_apicids=", skip_apicids);
+
 static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
 char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };