vmap: Use {map,unmap}_segment() helpers
[akaros.git] / kern / arch / riscv / smp.c
index d3279ef..d064c64 100644 (file)
@@ -8,21 +8,15 @@
 #include <atomic.h>
 #include <pmap.h>
 
-static volatile uint32_t num_cpus_booted = 1;
+volatile uint32_t num_cores_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);
-       
-       while(num_cpus_booted < num_cpus);
-
-       printd("%d cores reporting!\n", num_cpus);
+       num_cores_booted = 1;
+       while(num_cores_booted < num_cores);
+       printd("%d cores reporting!\n", num_cores);
 }
 
 void
@@ -30,7 +24,7 @@ smp_init(void)
 {
        smp_percpu_init();
 
-       __sync_fetch_and_add(&num_cpus_booted, 1);
+       __sync_fetch_and_add(&num_cores_booted, 1);
        printd("Good morning, Vietnam! (core id = %d)\n",core_id());
 
        smp_idle();
@@ -40,7 +34,7 @@ handler_wrapper_t*
 smp_make_wrapper()
 {
        static handler_wrapper_t
-       wrapper_pool[MAX_NUM_CPUS*8] = {{{0},SPINLOCK_INITIALIZER}};
+       wrapper_pool[MAX_NUM_CORES*8] = {{{0},SPINLOCK_INITIALIZER}};
 
        size_t i;
        for(i = 0; i < sizeof(wrapper_pool)/sizeof(wrapper_pool[0]); i++)
@@ -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,
@@ -76,14 +69,14 @@ int smp_call_function_all(isr_t handler, void* data,
                if(!wrapper)
                        return -ENOMEM;
 
-               for(i = 0; i < num_cpus; i++)
+               for(i = 0; i < num_cores; i++)
                        wrapper->wait_list[i] = 1;
        }
 
        enable_irqsave(&state);
 
        // send to others
-       for(i = 0, me = core_id(); i < num_cpus; i++)
+       for(i = 0, me = core_id(); i < num_cores; i++)
        {
                if(i == me)
                        continue;
@@ -131,7 +124,7 @@ int smp_call_function_single(uint32_t dest, isr_t handler, void* data,
 int smp_call_wait(handler_wrapper_t* wrapper)
 {
        int i;
-       for(i = 0; i < num_cpus; i++)
+       for(i = 0; i < num_cores; i++)
                while(wrapper->wait_list[i]);
 
        spin_unlock(&wrapper->lock);
@@ -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));
 }