Arch independent per-cpu initialization
[akaros.git] / kern / arch / i686 / smp_boot.c
index 143ca98..d40f9d6 100644 (file)
 #include <smp.h>
 #include <arch/console.h>
 #include <arch/apic.h>
-#include <arch/bitmask.h>
 #include <arch/perfmon.h>
 #include <timing.h>
 
+#include <bitmask.h>
 #include <atomic.h>
 #include <error.h>
 #include <stdio.h>
@@ -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.
@@ -282,11 +280,13 @@ uint32_t smp_main(void)
  * must still call this for core 0.  This must NOT be called from smp_main,
  * since it relies on the kernel stack pointer to find the gdt.  Be careful not
  * to call it on too deep of a stack frame. */
-void smp_percpu_init(void)
+void __arch_pcpu_init(uint32_t coreid)
 {
-       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");
 
@@ -305,12 +305,6 @@ void smp_percpu_init(void)
                per_cpu_info[coreid].gdt = (segdesc_t*)(*(uintptr_t*)my_stack_bot +
                                           sizeof(taskstate_t) + sizeof(pseudodesc_t));
        }
-       per_cpu_info[coreid].spare = 0;
-       spinlock_init(&per_cpu_info[coreid].immed_amsg_lock);
-       STAILQ_INIT(&per_cpu_info[coreid].immed_amsgs);
-       spinlock_init(&per_cpu_info[coreid].routine_amsg_lock);
-       STAILQ_INIT(&per_cpu_info[coreid].routine_amsgs);
-       
        /* need to init perfctr before potentiall using it in timer handler */
        perfmon_init();
 }