Splits pmap ops up for each arch
[akaros.git] / kern / arch / riscv / smp.c
index 1ced0a9..89d3a10 100644 (file)
@@ -8,34 +8,23 @@
 #include <atomic.h>
 #include <pmap.h>
 
-volatile uint32_t num_cpus;
+volatile uint32_t num_cpus_booted = 0;
 
 void
 smp_boot(void)
 {
        smp_percpu_init();
-
-       num_cpus = 1;
-       printd("Cores, report in!\n");
-
-       for(uintptr_t i = 1, ncores = num_cores(); i < ncores; i++)
-               send_ipi(i);
-       
-       while(*(volatile uint32_t*)&num_cpus < num_cores());
-
+       num_cpus_booted = 1;
+       while(num_cpus_booted < num_cpus);
        printd("%d cores reporting!\n", num_cpus);
 }
 
 void
 smp_init(void)
 {
-       static spinlock_t report_in_lock = SPINLOCK_INITIALIZER;
-
        smp_percpu_init();
-       spin_lock(&report_in_lock);
-       num_cpus++;
-       spin_unlock(&report_in_lock);
 
+       __sync_fetch_and_add(&num_cpus_booted, 1);
        printd("Good morning, Vietnam! (core id = %d)\n",core_id());
 
        smp_idle();
@@ -54,13 +43,12 @@ smp_make_wrapper()
        return NULL;
 }
 
-void
-smp_call_wrapper(trapframe_t* tf, uint32_t src, isr_t handler,
-                 handler_wrapper_t* wrapper, void* data)
+void smp_call_wrapper(uint32_t src, isr_t handler, handler_wrapper_t *wrapper,
+                      void *data)
 {
        if(wrapper)
                wrapper->wait_list[core_id()] = 0;
-       handler(tf, data);
+       handler(0, data);
 }
 
 int smp_call_function_self(isr_t handler, void* data,
@@ -144,12 +132,15 @@ int smp_call_wait(handler_wrapper_t* wrapper)
 }
 
 /* Perform any initialization needed by per_cpu_info.  Right now, this just
- * inits the amsg list (which sparc will probably also want).  Make sure every
- * core calls this at some point in the smp_boot process. */
+ * inits the amsg list.  Make sure every core calls this at some point in the
+ * smp_boot process. */
 void __arch_pcpu_init(uint32_t coreid)
 {
        // Switch to the real L1 page table, rather than the boot page table which
        // has the [0,KERNSIZE-1] identity mapping.
        extern pte_t l1pt[NPTENTRIES];
        lcr3(PADDR(l1pt));
+
+       register uintptr_t sp asm ("sp");
+       set_stack_top(ROUNDUP(sp, PGSIZE));
 }