That would work, too. The bug was not in recognizing the boot cpu, but in
assuming that we would continue (for one reason or another) the first time
around the loop, because logical ID 0x01 was already assigned.
The previous code got around this dependency in a weird and rather kludgey
way. Check -rc3 for the two instances of boot_cpu_logical_apicid in
mpparse.c and smpboot.c, and the two entirely different sources of
boot_cpu_logical_apicid's value. Bizarre.
> Index: linux-2.4.19-rc3-ac2/arch/i386/kernel/smpboot.c
> ===================================================================
> RCS file:
> /home/zwane/source/cvs_rep/linux-2.4.19-rc3-ac2/arch/i386/kernel/smpboot.c,
>v retrieving revision 1.2
> diff -u -r1.2 smpboot.c
> --- linux-2.4.19-rc3-ac2/arch/i386/kernel/smpboot.c 2002/07/25 06:06:56 1.2
> +++ linux-2.4.19-rc3-ac2/arch/i386/kernel/smpboot.c 2002/07/25 06:15:05
> @@ -46,6 +46,7 @@
> #include <asm/mtrr.h>
> #include <asm/pgalloc.h>
> #include <asm/smpboot.h>
> +#include <asm/msr.h>
>
> /* Set if we find a B stepping CPU */
> static int smp_b_stepping;
> @@ -229,6 +230,14 @@
> return res;
> }
>
> +int smp_cpu_is_bsp (void)
> +{
> + unsigned long l, h;
> +
> + rdmsr(MSR_IA32_APICBASE, l, h);
> + return (l & MSR_IA32_APICBASE_BSP);
> +}
> +
> static void __init synchronize_tsc_bp (void)
> {
> int i;
> @@ -1067,7 +1076,7 @@
> connect_bsp_APIC();
> setup_local_APIC();
>
> - if (GET_APIC_ID(apic_read(APIC_ID)) != boot_cpu_physical_apicid)
> + if (!smp_cpu_is_bsp())
> BUG();
>
> /*
-- James Cleverdon IBM xSeries Linux Solutions {jamesclv(Unix, preferred), cleverdj(Notes)} at us dot ibm dot com
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/