Splits pmap ops up for each arch
[akaros.git] / kern / arch / riscv / smp.c
index d3279ef..89d3a10 100644 (file)
@@ -8,20 +8,14 @@
 #include <atomic.h>
 #include <pmap.h>
 
-static volatile uint32_t num_cpus_booted = 1;
+volatile uint32_t num_cpus_booted = 0;
 
 void
 smp_boot(void)
 {
        smp_percpu_init();
-
-       printd("Cores, report in!\n");
-
-       for(uint32_t i = 1; i < num_cpus; i++)
-               send_ipi(i);
-       
+       num_cpus_booted = 1;
        while(num_cpus_booted < num_cpus);
-
        printd("%d cores reporting!\n", num_cpus);
 }
 
@@ -49,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,
@@ -139,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));
 }