| #pragma once | 
 |  | 
 | #define ROS_INC_TRAPFRAME_H | 
 |  | 
 | #include <ros/arch/trapframe.h> | 
 |  | 
 | #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), 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; | 
 | } |