x86: pcpu init called before idling
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 19 Nov 2010 23:42:01 +0000 (15:42 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:57 +0000 (17:35 -0700)
Technically, something could have gotten messed up in the future, since
we access pcpui before finalizing the smp_boot process.

kern/arch/i686/smp_boot.c
kern/arch/i686/smp_entry.S

index 143ca98..10a831c 100644 (file)
@@ -187,10 +187,8 @@ void smp_boot(void)
        /* Final core initialization */
        barrier_t generic_barrier;
        init_barrier(&generic_barrier, num_cpus);
+       /* This will break the cores out of their hlt in smp_entry.S */
        smp_call_function_all(smp_final_core_init, &generic_barrier, 0);
-
-       // Should probably flush everyone's TLB at this point, to get rid of
-       // temp mappings that were removed.  TODO
 }
 
 /* This is called from smp_entry by each core to finish the core bootstrapping.
@@ -287,6 +285,9 @@ void smp_percpu_init(void)
        uint32_t coreid = core_id();
        uintptr_t my_stack_bot;
 
+       /* Flushes any potentially old mappings from smp_boot() (note the page table
+        * removal) */
+       tlbflush();
        /* Ensure the FPU units are initialized */
        asm volatile ("fninit");
 
index 85557aa..6382467 100644 (file)
@@ -85,6 +85,8 @@ here:
        # note the next two lines are using the direct mapping from smp_boot()
        movw    $0, smp_boot_lock - smp_entry + 0x1000  # release lock
        lock decw       smp_semaphore - smp_entry + 0x1000  # show we are done
+       sti                     # so we can get the IPI
+       hlt                     # wait for the IPI to run smp_pcu_init()
        call    smp_idle                # idle loop, will have interrupts turned on
 
        # Below here is just data, stored with the code text