Procdata uses user_contexts (XCC)
[akaros.git] / kern / arch / riscv / process.c
index dc834dc..0f09b36 100644 (file)
@@ -1,5 +1,5 @@
 #include <arch/arch.h>
-#include <arch/trap.h>
+#include <trap.h>
 #include <process.h>
 #include <pmap.h>
 #include <smp.h>
@@ -8,13 +8,26 @@
 #include <assert.h>
 #include <stdio.h>
 
-void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
-                         uintptr_t entryp, uintptr_t stack_top)
+/* TODO: handle user and kernel contexts */
+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);
+}
+
+/* TODO: consider using a SW context */
+void proc_init_ctx(struct user_context *ctx, uint32_t vcoreid, uintptr_t entryp,
+                   uintptr_t stack_top)
+{
+       struct hw_trapframe *tf = &ctx->tf.hw_tf;
+       ctx->type = ROS_HW_CTX;
+
        memset(tf, 0, sizeof(*tf));
 
        tf->gpr[30] = stack_top-64;
-       tf->sr = SR_S | (mfpcr(PCR_SR) & SR_IM) | SR_SX | SR_UX | SR_VM;
+       tf->sr = SR_U64;
 
        tf->epc = entryp;
 
@@ -23,9 +36,12 @@ void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
        tf->gpr[4] = vcoreid;
 }
 
-void proc_secure_trapframe(struct trapframe *tf)
+/* TODO: handle both HW and SW contexts */
+void proc_secure_ctx(struct user_context *ctx)
 {
-       tf->sr = SR_S | (mfpcr(PCR_SR) & SR_IM) | SR_SX | SR_UX | SR_VM;
+       struct hw_trapframe *tf = &ctx->tf.hw_tf;
+       ctx->type = ROS_HW_CTX;
+       tf->sr = SR_U64;
 }
 
 /* Called when we are currently running an address space on our core and want to