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: ,, See header of drivers/cdrom/sjcd.c. + skip_apicids= [SMP] + Format: [,[,...,]] + 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, };