1b3db9e0da7e149099decd04551d81e2989d6e68
[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 /* The context is both what we want to run and its current state.  For VMs, that
59  * includes status bits from the VMCS for reflected vmexits/hypercalls.  This is
60  * not particularly different than how hardware contexts contain info on
61  * reflected traps.
62  *
63  * The VM context also consists of a mountain of state in the VMCS, referenced
64  * only in here by guest pcoreid.  Those bits are set once by Akaros to sensible
65  * defaults and then are changed during execution of the VM.  The parts of that
66  * state that are exposed to the user-VMM are the contents of the trapframe. */
67
68 #define VMCTX_FL_PARTIAL                (1 << 0)
69 #define VMCTX_FL_HAS_FAULT              (1 << 1)
70 #define VMCTX_FL_VMRESUME               (1 << 2)
71 #define VMCTX_FL_EPT_VMR_BACKED (1 << 3)
72
73 struct vm_trapframe {
74         /* Actual processor state */
75         uint64_t tf_rax;
76         uint64_t tf_rbx;
77         uint64_t tf_rcx;
78         uint64_t tf_rdx;
79         uint64_t tf_rbp;
80         uint64_t tf_rsi;
81         uint64_t tf_rdi;
82         uint64_t tf_r8;
83         uint64_t tf_r9;
84         uint64_t tf_r10;
85         uint64_t tf_r11;
86         uint64_t tf_r12;
87         uint64_t tf_r13;
88         uint64_t tf_r14;
89         uint64_t tf_r15;
90         uint64_t tf_rip;
91         uint64_t tf_rflags;
92         uint64_t tf_rsp;
93         uint64_t tf_cr2;
94         uint64_t tf_cr3;
95         /* Admin bits */
96         uint32_t tf_guest_pcoreid;
97         uint32_t tf_flags;
98         uint32_t tf_trap_inject;
99         uint16_t tf_guest_intr_status;
100         uint16_t tf_padding0;
101         uint32_t tf_exit_reason;
102         uint32_t tf_exit_qual;
103         uint32_t tf_intrinfo1;
104         uint32_t tf_intrinfo2;
105         uint64_t tf_guest_va;
106         uint64_t tf_guest_pa;
107 };