blob: 00540e0651fd07b801c8335fd77c11c5be7d399e [file] [log] [blame]
#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;
}