Add support for attempting returns from panic
[akaros.git] / kern / src / trap.c
index 3ad2b31..5e3824d 100644 (file)
@@ -20,7 +20,9 @@ static void print_unhandled_trap(struct proc *p, struct user_context *ctx,
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        uint32_t vcoreid = pcpui->owning_vcoreid;
        struct preempt_data *vcpd = &p->procdata->vcore_preempt_data[vcoreid];
+       static spinlock_t print_trap_lock = SPINLOCK_INITIALIZER;
 
+       spin_lock(&print_trap_lock);
        if (!proc_is_vcctx_ready(p))
                printk("Unhandled user trap from early SCP\n");
        else if (vcpd->notif_disabled)
@@ -30,6 +32,7 @@ static void print_unhandled_trap(struct proc *p, struct user_context *ctx,
        debug_addr_proc(p, get_user_ctx_pc(ctx));
        print_vmrs(p);
        backtrace_user_ctx(p, ctx);
+       spin_unlock(&print_trap_lock);
 }
 
 /* Traps that are considered normal operations. */
@@ -56,6 +59,7 @@ int reflect_current_context(void)
        uint32_t vcoreid = pcpui->owning_vcoreid;
        struct preempt_data *vcpd = &p->procdata->vcore_preempt_data[vcoreid];
 
+       assert(pcpui->cur_proc == pcpui->owning_proc);
        if (!proc_is_vcctx_ready(p))
                return -1;
        if (vcpd->notif_disabled)
@@ -91,34 +95,6 @@ void reflect_unhandled_trap(unsigned int trap_nr, unsigned int err,
        }
 }
 
-uintptr_t get_user_ctx_pc(struct user_context *ctx)
-{
-       switch (ctx->type) {
-       case ROS_HW_CTX:
-               return get_hwtf_pc(&ctx->tf.hw_tf);
-       case ROS_SW_CTX:
-               return get_swtf_pc(&ctx->tf.sw_tf);
-       case ROS_VM_CTX:
-               return get_vmtf_pc(&ctx->tf.vm_tf);
-       default:
-               panic("Bad context type %d for ctx %p\n", ctx->type, ctx);
-       }
-}
-
-uintptr_t get_user_ctx_fp(struct user_context *ctx)
-{
-       switch (ctx->type) {
-       case ROS_HW_CTX:
-               return get_hwtf_fp(&ctx->tf.hw_tf);
-       case ROS_SW_CTX:
-               return get_swtf_fp(&ctx->tf.sw_tf);
-       case ROS_VM_CTX:
-               return get_vmtf_fp(&ctx->tf.vm_tf);
-       default:
-               panic("Bad context type %d for ctx %p\n", ctx->type, ctx);
-       }
-}
-
 /* Helper, copies the current context to to_ctx. */
 void copy_current_ctx_to(struct user_context *to_ctx)
 {
@@ -135,7 +111,8 @@ struct kmem_cache *kernel_msg_cache;
 void kernel_msg_init(void)
 {
        kernel_msg_cache = kmem_cache_create("kernel_msgs",
-                          sizeof(struct kernel_message), ARCH_CL_SIZE, 0, 0, 0);
+                                            sizeof(struct kernel_message),
+                                            ARCH_CL_SIZE, 0, NULL, 0, 0, NULL);
 }
 
 uint32_t send_kernel_message(uint32_t dst, amr_t pc, long arg0, long arg1,
@@ -290,8 +267,9 @@ void print_kmsgs(uint32_t coreid)
                struct kernel_message *kmsg_i;
                STAILQ_FOREACH(kmsg_i, list, link) {
                        fn_name = get_fn_name((long)kmsg_i->pc);
-                       printk("%s KMSG on %d from %d to run %p(%s)\n", type,
-                              kmsg_i->dstid, kmsg_i->srcid, kmsg_i->pc, fn_name); 
+                       printk("%s KMSG on %d from %d to run %p(%s)(%p, %p, %p)\n", type,
+                              kmsg_i->dstid, kmsg_i->srcid, kmsg_i->pc, fn_name,
+                              kmsg_i->arg0, kmsg_i->arg1, kmsg_i->arg2);
                        kfree(fn_name);
                }
        }
@@ -333,7 +311,7 @@ void kmsg_queue_stat(void)
                        printk("\targ1: %p\n", kmsg->arg1);
                        printk("\targ2: %p\n", kmsg->arg2);
                }
-                       
+
        }
 }
 
@@ -341,7 +319,7 @@ void print_kctx_depths(const char *str)
 {
        uint32_t coreid = core_id();
        struct per_cpu_info *pcpui = &per_cpu_info[coreid];
-       
+
        if (!str)
                str = "(none)";
        printk("%s: Core %d, irq depth %d, ktrap depth %d, irqon %d\n", str, coreid,