prof: samples userspace PCs
[akaros.git] / kern / src / smp.c
index 4cd222e..afd7e9a 100644 (file)
@@ -35,7 +35,7 @@ static void try_run_proc(void)
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        /* There was a process running here, and we should return to it. */
        if (pcpui->owning_proc) {
-               assert(!pcpui->cur_sysc);
+               assert(!pcpui->cur_kthread->sysc);
                assert(pcpui->cur_ctx);
                __proc_startcore(pcpui->owning_proc, pcpui->cur_ctx);
                assert(0);
@@ -58,6 +58,7 @@ static void __attribute__((noinline, noreturn)) __smp_idle(void)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        clear_rkmsg(pcpui);
+       pcpui->cur_kthread->is_ktask = FALSE;
        enable_irq();   /* one-shot change to get any IRQs before we halt later */
        while (1) {
                disable_irq();
@@ -78,6 +79,7 @@ void smp_idle(void)
 {
        #ifdef CONFIG_RESET_STACKS
        set_stack_pointer(get_stack_top());
+       set_frame_pointer(0);
        #endif /* CONFIG_RESET_STACKS */
        __smp_idle();
        assert(0);
@@ -90,10 +92,15 @@ void smp_percpu_init(void)
        uint32_t coreid = core_id();
        struct per_cpu_info *pcpui = &per_cpu_info[coreid];
        void *trace_buf;
+       struct kthread *kthread;
        /* 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);
+       /* init our kthread (tracks our currently running context) */
+       kthread = __kthread_zalloc();
+       kthread->stacktop = get_stack_top();    /* assumes we're on the 1st page */
+       pcpui->cur_kthread = kthread;
        per_cpu_info[coreid].spare = 0;
        /* Init relevant lists */
        spinlock_init_irqsave(&per_cpu_info[coreid].immed_amsg_lock);
@@ -103,9 +110,7 @@ void smp_percpu_init(void)
        /* 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;
+       *kstack_bottom_addr(kthread->stacktop) = 0xdeadbeef;
 #endif /* CONFIG_KTHREAD_POISON */
        /* Init generic tracing ring */
        trace_buf = kpage_alloc_addr();
@@ -139,6 +144,8 @@ static void pcpui_trace_locks_handler(void *event, void *data)
        else
                func_name = "Dynamic lock";
        printk("Time %uus, lock %p (%s)\n", te->arg0, lock_addr, func_name);
+       printk("\t");
+       spinlock_debug((spinlock_t*)lock_addr);
        if (lock_addr > KERN_LOAD_ADDR)
                kfree(func_name);
 }