| #pragma once |
| |
| #ifndef ROS_INC_ARCH_TRAPFRAME_H |
| #error "Do not include include ros/arch/trapframe64.h directly" |
| #endif |
| |
| struct hw_trapframe { |
| uint64_t tf_gsbase; |
| uint64_t tf_fsbase; |
| uint64_t tf_rax; |
| uint64_t tf_rbx; |
| uint64_t tf_rcx; |
| uint64_t tf_rdx; |
| uint64_t tf_rbp; |
| uint64_t tf_rsi; |
| uint64_t tf_rdi; |
| uint64_t tf_r8; |
| uint64_t tf_r9; |
| uint64_t tf_r10; |
| uint64_t tf_r11; |
| uint64_t tf_r12; |
| uint64_t tf_r13; |
| uint64_t tf_r14; |
| uint64_t tf_r15; |
| uint32_t tf_trapno; |
| uint32_t tf_padding5; /* used in trap reflection */ |
| /* below here defined by x86 hardware (error code optional) */ |
| uint32_t tf_err; |
| uint32_t tf_padding4; /* used in trap reflection */ |
| uint64_t tf_rip; |
| uint16_t tf_cs; |
| uint16_t tf_padding3; /* used in trap reflection */ |
| uint32_t tf_padding2; |
| uint64_t tf_rflags; |
| /* unlike 32 bit, SS:RSP is always pushed, even when not changing rings |
| */ |
| uint64_t tf_rsp; |
| uint16_t tf_ss; |
| uint16_t tf_padding1; |
| uint32_t tf_padding0; /* used for partial contexts */ |
| }; |
| |
| struct sw_trapframe { |
| uint64_t tf_gsbase; |
| uint64_t tf_fsbase; |
| uint64_t tf_rbx; |
| uint64_t tf_rbp; |
| uint64_t tf_r12; |
| uint64_t tf_r13; |
| uint64_t tf_r14; |
| uint64_t tf_r15; |
| uint64_t tf_rip; |
| uint64_t tf_rsp; |
| uint32_t tf_mxcsr; |
| uint16_t tf_fpucw; |
| uint16_t tf_padding0; /* used for partial contexts */ |
| }; |
| |
| #define MXCSR_RSVD_0 0xffff // These 0s must be 0, mxcsr &= this |
| |
| /* The context is both what we want to run and its current state. For VMs, that |
| * includes status bits from the VMCS for reflected vmexits/hypercalls. This is |
| * not particularly different than how hardware contexts contain info on |
| * reflected traps. |
| * |
| * The VM context also consists of a mountain of state in the VMCS, referenced |
| * only in here by guest pcoreid. Those bits are set once by Akaros to sensible |
| * defaults and then are changed during execution of the VM. The parts of that |
| * state that are exposed to the user-VMM are the contents of the trapframe. |
| * |
| * Before adding any new flags, consider whether or not they need to be checked |
| * in proc_secure_vmtf(). */ |
| |
| #define VMCTX_FL_PARTIAL (1 << 0) |
| #define VMCTX_FL_HAS_FAULT (1 << 1) |
| #define VMCTX_FL_VMRESUME (1 << 2) |
| #define VMCTX_FL_EPT_VMR_BACKED (1 << 3) |
| |
| struct vm_trapframe { |
| /* Actual processor state */ |
| uint64_t tf_rax; |
| uint64_t tf_rbx; |
| uint64_t tf_rcx; |
| uint64_t tf_rdx; |
| uint64_t tf_rbp; |
| uint64_t tf_rsi; |
| uint64_t tf_rdi; |
| uint64_t tf_r8; |
| uint64_t tf_r9; |
| uint64_t tf_r10; |
| uint64_t tf_r11; |
| uint64_t tf_r12; |
| uint64_t tf_r13; |
| uint64_t tf_r14; |
| uint64_t tf_r15; |
| uint64_t tf_rip; |
| uint64_t tf_rflags; |
| uint64_t tf_rsp; |
| uint64_t tf_cr2; |
| uint64_t tf_cr3; |
| /* Admin bits */ |
| uint32_t tf_guest_pcoreid; |
| uint32_t tf_flags; |
| uint32_t tf_trap_inject; |
| uint16_t tf_guest_intr_status; |
| uint16_t tf_padding0; |
| uint32_t tf_exit_reason; |
| uint32_t tf_exit_qual; |
| uint32_t tf_intrinfo1; |
| uint32_t tf_intrinfo2; |
| uint64_t tf_guest_va; |
| uint64_t tf_guest_pa; |
| }; |