Helper to backtrace a user context
[akaros.git] / kern / arch / riscv / process.c
index b9f7534..bdedee3 100644 (file)
 void proc_pop_ctx(struct user_context *ctx)
 {
        struct hw_trapframe *tf = &ctx->tf.hw_tf;
-       assert(ctx->type = ROS_HW_CTX);
-       extern void env_pop_tf(struct hw_trapframe *tf);        /* in asm */
-       env_pop_tf(tf);
+       assert(ctx->type == ROS_HW_CTX);
+       extern void pop_hw_tf(struct hw_trapframe *tf)
+         __attribute__((noreturn));    /* in asm */
+       pop_hw_tf(tf);
 }
 
 /* TODO: consider using a SW context */
 void proc_init_ctx(struct user_context *ctx, uint32_t vcoreid, uintptr_t entryp,
-                   uintptr_t stack_top)
+                   uintptr_t stack_top, uintptr_t tls_desc)
 {
        struct hw_trapframe *tf = &ctx->tf.hw_tf;
        ctx->type = ROS_HW_CTX;
 
+       /* TODO: If you'd like, take tls_desc and save it in the ctx somehow, so
+        * that proc_pop_ctx will set up that TLS before launching.  If you do this,
+        * you can change _start.c to not reset the TLS in userspace.
+        *
+        * This is a bigger deal on amd64, where we take a (fast) syscall to change
+        * the TLS desc, right after the kernel just 0'd out the TLS desc.  If you
+        * can change your HW TLS desc with negligible overhead, then feel free to
+        * do whatever.  Long term, it might be better to do whatever amd64 does. */
+
        memset(tf, 0, sizeof(*tf));
 
        tf->gpr[GPR_SP] = stack_top-64;
-       tf->sr = SR_U64;
+       tf->sr = SR_U64 | SR_EF;
 
        tf->epc = entryp;
 
@@ -41,7 +51,7 @@ void proc_secure_ctx(struct user_context *ctx)
 {
        struct hw_trapframe *tf = &ctx->tf.hw_tf;
        ctx->type = ROS_HW_CTX;
-       tf->sr = SR_U64;
+       tf->sr = SR_U64 | SR_EF;
 }
 
 /* Called when we are currently running an address space on our core and want to