| #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; |
| } |