Asserts/checks for early RKMSG context
[akaros.git] / kern / src / smp.c
index e500739..fd16a42 100644 (file)
@@ -47,10 +47,10 @@ static void try_run_proc(void)
  * cores enter a loop.  They halt and wake up when interrupted, do any work on
  * their work queue, then halt again.  In between, the ksched gets a chance to
  * tell it to do something else, or perhaps to halt in another manner. */
-static void __smp_idle(void)
+static void __attribute__((noinline, noreturn)) __smp_idle(void)
 {
-       int8_t state = 0;
-
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       clear_rkmsg(pcpui);
        /* TODO: idle, abandon_core(), and proc_restartcore() need cleaned up */
        enable_irq();   /* get any IRQs before we halt later */
        try_run_proc();
@@ -60,7 +60,7 @@ static void __smp_idle(void)
         * (and presumably about to execute a kmsg or fire up a vcore). */
        while (1) {
                disable_irq();
-               process_routine_kmsg(0);
+               process_routine_kmsg();
                try_run_proc();
                cpu_bored();            /* call out to the ksched */
                /* cpu_halt() atomically turns on interrupts and halts the core.
@@ -87,6 +87,8 @@ void smp_idle(void)
 void smp_percpu_init(void)
 {
        uint32_t coreid = core_id();
+       /* Don't initialize __ctx_depth here, since it is already 1 (at least on
+        * x86), since this runs in irq context. */
        /* Do this first */
        __arch_pcpu_init(coreid);
        per_cpu_info[coreid].spare = 0;
@@ -97,11 +99,9 @@ void smp_percpu_init(void)
        STAILQ_INIT(&per_cpu_info[coreid].routine_amsgs);
        /* Initialize the per-core timer chain */
        init_timer_chain(&per_cpu_info[coreid].tchain, set_pcpu_alarm_interrupt);
-
 #ifdef __CONFIG_KTHREAD_POISON__
-/* TODO: KTHR-STACK */
-uintptr_t *poison = (uintptr_t*)ROUNDDOWN(get_stack_top() - 1, PGSIZE);
-*poison = 0xdeadbeef;
+       /* TODO: KTHR-STACK */
+       uintptr_t *poison = (uintptr_t*)ROUNDDOWN(get_stack_top() - 1, PGSIZE);
+       *poison = 0xdeadbeef;
 #endif /* __CONFIG_KTHREAD_POISON__ */
-
 }