Add EPLAN9 to the error list (XCC)
[akaros.git] / kern / include / ros / trapframe.h
index 319174c..28251a1 100644 (file)
@@ -6,13 +6,54 @@
 
 #define ROS_HW_CTX                             1
 #define ROS_SW_CTX                             2
+#define ROS_VM_CTX                             3
 
-/* User-space context, either from a hardware event (IRQ, trap, etc), or from a
- * syscall.  Each arch defines its types. */
+/* User-space context, either from a hardware event (IRQ, trap, etc), from a
+ * syscall, or virtual machine.  Each arch defines its types. */
 struct user_context {
        int                                                     type;
        union {
                struct hw_trapframe             hw_tf;
                struct sw_trapframe             sw_tf;
+               struct vm_trapframe             vm_tf;
        } tf;
 };
+
+static inline 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);
+       }
+       return 0xf00baa;
+}
+
+static inline 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);
+       }
+       return 0xf00baa;
+}
+
+static inline uintptr_t get_user_ctx_sp(struct user_context *ctx)
+{
+       switch (ctx->type) {
+       case ROS_HW_CTX:
+               return get_hwtf_sp(&ctx->tf.hw_tf);
+       case ROS_SW_CTX:
+               return get_swtf_sp(&ctx->tf.sw_tf);
+       case ROS_VM_CTX:
+               return get_vmtf_sp(&ctx->tf.vm_tf);
+       }
+       return 0xf00baa;
+}