x86: Handle buggy user_contexts (XCC)
[akaros.git] / kern / arch / x86 / ros / trapframe64.h
1 #pragma once
2
3 #ifndef ROS_INC_ARCH_TRAPFRAME_H
4 #error "Do not include include ros/arch/trapframe64.h directly"
5 #endif
6
7 struct hw_trapframe {
8         uint64_t tf_gsbase;
9         uint64_t tf_fsbase;
10         uint64_t tf_rax;
11         uint64_t tf_rbx;
12         uint64_t tf_rcx;
13         uint64_t tf_rdx;
14         uint64_t tf_rbp;
15         uint64_t tf_rsi;
16         uint64_t tf_rdi;
17         uint64_t tf_r8;
18         uint64_t tf_r9;
19         uint64_t tf_r10;
20         uint64_t tf_r11;
21         uint64_t tf_r12;
22         uint64_t tf_r13;
23         uint64_t tf_r14;
24         uint64_t tf_r15;
25         uint32_t tf_trapno;
26         uint32_t tf_padding5;           /* used in trap reflection */
27         /* below here defined by x86 hardware (error code optional) */
28         uint32_t tf_err;
29         uint32_t tf_padding4;           /* used in trap reflection */
30         uint64_t tf_rip;
31         uint16_t tf_cs;
32         uint16_t tf_padding3;           /* used in trap reflection */
33         uint32_t tf_padding2;
34         uint64_t tf_rflags;
35         /* unlike 32 bit, SS:RSP is always pushed, even when not changing rings */
36         uint64_t tf_rsp;
37         uint16_t tf_ss;
38         uint16_t tf_padding1;
39         uint32_t tf_padding0;           /* used for partial contexts */
40 };
41
42 struct sw_trapframe {
43         uint64_t tf_gsbase;
44         uint64_t tf_fsbase;
45         uint64_t tf_rbx;
46         uint64_t tf_rbp;
47         uint64_t tf_r12;
48         uint64_t tf_r13;
49         uint64_t tf_r14;
50         uint64_t tf_r15;
51         uint64_t tf_rip;
52         uint64_t tf_rsp;
53         uint32_t tf_mxcsr;
54         uint16_t tf_fpucw;
55         uint16_t tf_padding0;           /* used for partial contexts */
56 };
57
58 #define MXCSR_RSVD_0    0xffff  // These 0s must be 0, mxcsr &= this
59
60 /* The context is both what we want to run and its current state.  For VMs, that
61  * includes status bits from the VMCS for reflected vmexits/hypercalls.  This is
62  * not particularly different than how hardware contexts contain info on
63  * reflected traps.
64  *
65  * The VM context also consists of a mountain of state in the VMCS, referenced
66  * only in here by guest pcoreid.  Those bits are set once by Akaros to sensible
67  * defaults and then are changed during execution of the VM.  The parts of that
68  * state that are exposed to the user-VMM are the contents of the trapframe.
69  *
70  * Before adding any new flags, consider whether or not they need to be checked
71  * in proc_secure_vmtf(). */
72
73 #define VMCTX_FL_PARTIAL                (1 << 0)
74 #define VMCTX_FL_HAS_FAULT              (1 << 1)
75 #define VMCTX_FL_VMRESUME               (1 << 2)
76 #define VMCTX_FL_EPT_VMR_BACKED (1 << 3)
77
78 struct vm_trapframe {
79         /* Actual processor state */
80         uint64_t tf_rax;
81         uint64_t tf_rbx;
82         uint64_t tf_rcx;
83         uint64_t tf_rdx;
84         uint64_t tf_rbp;
85         uint64_t tf_rsi;
86         uint64_t tf_rdi;
87         uint64_t tf_r8;
88         uint64_t tf_r9;
89         uint64_t tf_r10;
90         uint64_t tf_r11;
91         uint64_t tf_r12;
92         uint64_t tf_r13;
93         uint64_t tf_r14;
94         uint64_t tf_r15;
95         uint64_t tf_rip;
96         uint64_t tf_rflags;
97         uint64_t tf_rsp;
98         uint64_t tf_cr2;
99         uint64_t tf_cr3;
100         /* Admin bits */
101         uint32_t tf_guest_pcoreid;
102         uint32_t tf_flags;
103         uint32_t tf_trap_inject;
104         uint16_t tf_guest_intr_status;
105         uint16_t tf_padding0;
106         uint32_t tf_exit_reason;
107         uint32_t tf_exit_qual;
108         uint32_t tf_intrinfo1;
109         uint32_t tf_intrinfo2;
110         uint64_t tf_guest_va;
111         uint64_t tf_guest_pa;
112 };