Fix race with x86 boot
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 8 Dec 2013 22:35:45 +0000 (14:35 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 21:07:51 +0000 (13:07 -0800)
It's possible that some IRQ could break the AP cores out of their halt
before core 0 set up things for the final core init.

kern/arch/x86/smp_boot.c

index 8f8eb4e..fcd9ff4 100644 (file)
@@ -62,6 +62,14 @@ static void init_smp_call_function(void)
 
 void smp_final_core_init(void)
 {
+       /* It is possible that the non-0 cores will wake up before the broadcast
+        * ipi.  this can be due to spurious IRQs or some such.  anyone other than
+        * core 0 that comes in here will wait til core 0 has set everything up */
+       static bool wait = TRUE;
+       if (get_os_coreid(hw_core_id()) == 0)
+               wait = FALSE;
+       while (wait)
+               cpu_relax();
 #ifdef CONFIG_FAST_COREID
        /* Need to bootstrap the rdtscp MSR with our OS coreid */
        int coreid = get_os_coreid(hw_core_id());