]>
Commit | Line | Data |
---|---|---|
1c0eb915 TL |
1 | /** @file\r |
2 | Guest-Hypervisor Communication Block (GHCB) Definition.\r | |
3 | \r | |
4 | Provides data types allowing an SEV-ES guest to interact with the hypervisor\r | |
5 | using the GHCB protocol.\r | |
6 | \r | |
7 | Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>\r | |
8 | SPDX-License-Identifier: BSD-2-Clause-Patent\r | |
9 | \r | |
10 | @par Specification Reference:\r | |
11 | SEV-ES Guest-Hypervisor Communication Block Standardization\r | |
12 | \r | |
13 | **/\r | |
14 | \r | |
15 | #ifndef __GHCB_H__\r | |
16 | #define __GHCB_H__\r | |
17 | \r | |
18 | #include <Base.h>\r | |
19 | #include <Library/BaseLib.h>\r | |
20 | #include <Library/DebugLib.h>\r | |
21 | \r | |
22 | #define UD_EXCEPTION 6\r | |
2f88bd3a MK |
23 | #define GP_EXCEPTION 13\r |
24 | #define VC_EXCEPTION 29\r | |
1c0eb915 | 25 | \r |
2f88bd3a | 26 | #define GHCB_VERSION_MIN 1\r |
2c354252 | 27 | #define GHCB_VERSION_MAX 2\r |
1c0eb915 TL |
28 | \r |
29 | #define GHCB_STANDARD_USAGE 0\r | |
30 | \r | |
31 | //\r | |
32 | // SVM Exit Codes\r | |
33 | //\r | |
2f88bd3a MK |
34 | #define SVM_EXIT_DR7_READ 0x27ULL\r |
35 | #define SVM_EXIT_DR7_WRITE 0x37ULL\r | |
36 | #define SVM_EXIT_RDTSC 0x6EULL\r | |
37 | #define SVM_EXIT_RDPMC 0x6FULL\r | |
38 | #define SVM_EXIT_CPUID 0x72ULL\r | |
39 | #define SVM_EXIT_INVD 0x76ULL\r | |
40 | #define SVM_EXIT_IOIO_PROT 0x7BULL\r | |
41 | #define SVM_EXIT_MSR 0x7CULL\r | |
42 | #define SVM_EXIT_VMMCALL 0x81ULL\r | |
43 | #define SVM_EXIT_RDTSCP 0x87ULL\r | |
44 | #define SVM_EXIT_WBINVD 0x89ULL\r | |
45 | #define SVM_EXIT_MONITOR 0x8AULL\r | |
46 | #define SVM_EXIT_MWAIT 0x8BULL\r | |
47 | #define SVM_EXIT_NPF 0x400ULL\r | |
1c0eb915 TL |
48 | \r |
49 | //\r | |
50 | // VMG Special Exit Codes\r | |
51 | //\r | |
2f88bd3a MK |
52 | #define SVM_EXIT_MMIO_READ 0x80000001ULL\r |
53 | #define SVM_EXIT_MMIO_WRITE 0x80000002ULL\r | |
54 | #define SVM_EXIT_NMI_COMPLETE 0x80000003ULL\r | |
55 | #define SVM_EXIT_AP_RESET_HOLD 0x80000004ULL\r | |
56 | #define SVM_EXIT_AP_JUMP_TABLE 0x80000005ULL\r | |
57 | #define SVM_EXIT_SNP_PAGE_STATE_CHANGE 0x80000010ULL\r | |
58 | #define SVM_EXIT_SNP_AP_CREATION 0x80000013ULL\r | |
59 | #define SVM_EXIT_HYPERVISOR_FEATURES 0x8000FFFDULL\r | |
60 | #define SVM_EXIT_UNSUPPORTED 0x8000FFFFULL\r | |
1c0eb915 TL |
61 | \r |
62 | //\r | |
63 | // IOIO Exit Information\r | |
64 | //\r | |
2f88bd3a MK |
65 | #define IOIO_TYPE_STR BIT2\r |
66 | #define IOIO_TYPE_IN 1\r | |
67 | #define IOIO_TYPE_INS (IOIO_TYPE_IN | IOIO_TYPE_STR)\r | |
68 | #define IOIO_TYPE_OUT 0\r | |
69 | #define IOIO_TYPE_OUTS (IOIO_TYPE_OUT | IOIO_TYPE_STR)\r | |
70 | \r | |
71 | #define IOIO_REP BIT3\r | |
72 | \r | |
73 | #define IOIO_ADDR_64 BIT9\r | |
74 | #define IOIO_ADDR_32 BIT8\r | |
75 | #define IOIO_ADDR_16 BIT7\r | |
76 | \r | |
77 | #define IOIO_DATA_32 BIT6\r | |
78 | #define IOIO_DATA_16 BIT5\r | |
79 | #define IOIO_DATA_8 BIT4\r | |
80 | #define IOIO_DATA_MASK (BIT6 | BIT5 | BIT4)\r | |
81 | #define IOIO_DATA_OFFSET 4\r | |
1c0eb915 TL |
82 | #define IOIO_DATA_BYTES(x) (((x) & IOIO_DATA_MASK) >> IOIO_DATA_OFFSET)\r |
83 | \r | |
2f88bd3a MK |
84 | #define IOIO_SEG_ES 0\r |
85 | #define IOIO_SEG_DS (BIT11 | BIT10)\r | |
1c0eb915 | 86 | \r |
dfd41aef TL |
87 | //\r |
88 | // AP Creation Information\r | |
89 | //\r | |
90 | #define SVM_VMGEXIT_SNP_AP_CREATE_ON_INIT 0\r | |
91 | #define SVM_VMGEXIT_SNP_AP_CREATE 1\r | |
92 | #define SVM_VMGEXIT_SNP_AP_DESTROY 2\r | |
1c0eb915 | 93 | \r |
1c0eb915 | 94 | typedef PACKED struct {\r |
2f88bd3a MK |
95 | UINT8 Reserved1[203];\r |
96 | UINT8 Cpl;\r | |
97 | UINT8 Reserved8[300];\r | |
98 | UINT64 Rax;\r | |
99 | UINT8 Reserved4[264];\r | |
100 | UINT64 Rcx;\r | |
101 | UINT64 Rdx;\r | |
102 | UINT64 Rbx;\r | |
103 | UINT8 Reserved5[112];\r | |
104 | UINT64 SwExitCode;\r | |
105 | UINT64 SwExitInfo1;\r | |
106 | UINT64 SwExitInfo2;\r | |
107 | UINT64 SwScratch;\r | |
108 | UINT8 Reserved6[56];\r | |
109 | UINT64 XCr0;\r | |
110 | UINT8 ValidBitmap[16];\r | |
111 | UINT64 X87StateGpa;\r | |
112 | UINT8 Reserved7[1016];\r | |
1c0eb915 TL |
113 | } GHCB_SAVE_AREA;\r |
114 | \r | |
115 | typedef PACKED struct {\r | |
2f88bd3a MK |
116 | GHCB_SAVE_AREA SaveArea;\r |
117 | UINT8 SharedBuffer[2032];\r | |
118 | UINT8 Reserved1[10];\r | |
119 | UINT16 ProtocolVersion;\r | |
120 | UINT32 GhcbUsage;\r | |
1c0eb915 TL |
121 | } GHCB;\r |
122 | \r | |
990ab937 TL |
123 | #define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \\r |
124 | (OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))\r | |
125 | \r | |
126 | typedef enum {\r | |
2f88bd3a MK |
127 | GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),\r |
128 | GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),\r | |
129 | GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),\r | |
130 | GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),\r | |
131 | GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),\r | |
132 | GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),\r | |
133 | GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),\r | |
134 | GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),\r | |
135 | GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),\r | |
136 | GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),\r | |
990ab937 TL |
137 | } GHCB_REGISTER;\r |
138 | \r | |
1c0eb915 TL |
139 | typedef union {\r |
140 | struct {\r | |
2f88bd3a MK |
141 | UINT32 Lower32Bits;\r |
142 | UINT32 Upper32Bits;\r | |
1c0eb915 TL |
143 | } Elements;\r |
144 | \r | |
145 | UINT64 Uint64;\r | |
146 | } GHCB_EXIT_INFO;\r | |
147 | \r | |
148 | typedef union {\r | |
149 | struct {\r | |
2f88bd3a MK |
150 | UINT32 Vector : 8;\r |
151 | UINT32 Type : 3;\r | |
152 | UINT32 ErrorCodeValid : 1;\r | |
153 | UINT32 Rsvd : 19;\r | |
154 | UINT32 Valid : 1;\r | |
155 | UINT32 ErrorCode;\r | |
1c0eb915 TL |
156 | } Elements;\r |
157 | \r | |
158 | UINT64 Uint64;\r | |
159 | } GHCB_EVENT_INJECTION;\r | |
160 | \r | |
161 | #define GHCB_EVENT_INJECTION_TYPE_INT 0\r | |
162 | #define GHCB_EVENT_INJECTION_TYPE_NMI 2\r | |
163 | #define GHCB_EVENT_INJECTION_TYPE_EXCEPTION 3\r | |
164 | #define GHCB_EVENT_INJECTION_TYPE_SOFT_INT 4\r | |
165 | \r | |
34e16ff8 BS |
166 | //\r |
167 | // Hypervisor features\r | |
168 | //\r | |
2f88bd3a MK |
169 | #define GHCB_HV_FEATURES_SNP BIT0\r |
170 | #define GHCB_HV_FEATURES_SNP_AP_CREATE (GHCB_HV_FEATURES_SNP | BIT1)\r | |
171 | #define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION (GHCB_HV_FEATURES_SNP_AP_CREATE | BIT2)\r | |
172 | #define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION_TIMER (GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION | BIT3)\r | |
4665fa65 BS |
173 | \r |
174 | //\r | |
175 | // SNP Page State Change.\r | |
176 | //\r | |
177 | // Note that the PSMASH and UNSMASH operations are not supported when using the MSR protocol.\r | |
178 | //\r | |
2f88bd3a MK |
179 | #define SNP_PAGE_STATE_PRIVATE 1\r |
180 | #define SNP_PAGE_STATE_SHARED 2\r | |
181 | #define SNP_PAGE_STATE_PSMASH 3\r | |
182 | #define SNP_PAGE_STATE_UNSMASH 4\r | |
4665fa65 BS |
183 | \r |
184 | typedef struct {\r | |
2f88bd3a MK |
185 | UINT64 CurrentPage : 12;\r |
186 | UINT64 GuestFrameNumber : 40;\r | |
187 | UINT64 Operation : 4;\r | |
188 | UINT64 PageSize : 1;\r | |
189 | UINT64 Reserved : 7;\r | |
4665fa65 BS |
190 | } SNP_PAGE_STATE_ENTRY;\r |
191 | \r | |
192 | typedef struct {\r | |
2f88bd3a MK |
193 | UINT16 CurrentEntry;\r |
194 | UINT16 EndEntry;\r | |
195 | UINT32 Reserved;\r | |
4665fa65 BS |
196 | } SNP_PAGE_STATE_HEADER;\r |
197 | \r | |
2f88bd3a | 198 | #define SNP_PAGE_STATE_MAX_ENTRY 253\r |
4665fa65 BS |
199 | \r |
200 | typedef struct {\r | |
2f88bd3a MK |
201 | SNP_PAGE_STATE_HEADER Header;\r |
202 | SNP_PAGE_STATE_ENTRY Entry[SNP_PAGE_STATE_MAX_ENTRY];\r | |
4665fa65 BS |
203 | } SNP_PAGE_STATE_CHANGE_INFO;\r |
204 | \r | |
dfd41aef TL |
205 | //\r |
206 | // SEV-ES save area mapping structures used for SEV-SNP AP Creation.\r | |
207 | // Only the fields required to be set to a non-zero value are defined.\r | |
208 | //\r | |
209 | // The segment register definition is defined for processor reset/real mode\r | |
210 | // (as when an INIT of the vCPU is requested). Should other modes (long mode,\r | |
211 | // etc.) be required, then the definitions can be enhanced.\r | |
212 | //\r | |
213 | \r | |
214 | //\r | |
215 | // Segment types at processor reset, See AMD APM Volume 2, Table 14-2.\r | |
216 | //\r | |
217 | #define SEV_ES_RESET_CODE_SEGMENT_TYPE 0xA\r | |
218 | #define SEV_ES_RESET_DATA_SEGMENT_TYPE 0x2\r | |
219 | \r | |
2f88bd3a MK |
220 | #define SEV_ES_RESET_LDT_TYPE 0x2\r |
221 | #define SEV_ES_RESET_TSS_TYPE 0x3\r | |
dfd41aef TL |
222 | \r |
223 | #pragma pack (1)\r | |
224 | typedef union {\r | |
2f88bd3a MK |
225 | struct {\r |
226 | UINT16 Type : 4;\r | |
227 | UINT16 Sbit : 1;\r | |
228 | UINT16 Dpl : 2;\r | |
229 | UINT16 Present : 1;\r | |
230 | UINT16 Avl : 1;\r | |
231 | UINT16 Reserved1 : 1;\r | |
232 | UINT16 Db : 1;\r | |
233 | UINT16 Granularity : 1;\r | |
234 | } Bits;\r | |
235 | UINT16 Uint16;\r | |
dfd41aef TL |
236 | } SEV_ES_SEGMENT_REGISTER_ATTRIBUTES;\r |
237 | \r | |
238 | typedef struct {\r | |
239 | UINT16 Selector;\r | |
240 | SEV_ES_SEGMENT_REGISTER_ATTRIBUTES Attributes;\r | |
241 | UINT32 Limit;\r | |
242 | UINT64 Base;\r | |
243 | } SEV_ES_SEGMENT_REGISTER;\r | |
244 | \r | |
245 | typedef struct {\r | |
2f88bd3a MK |
246 | SEV_ES_SEGMENT_REGISTER Es;\r |
247 | SEV_ES_SEGMENT_REGISTER Cs;\r | |
248 | SEV_ES_SEGMENT_REGISTER Ss;\r | |
249 | SEV_ES_SEGMENT_REGISTER Ds;\r | |
250 | SEV_ES_SEGMENT_REGISTER Fs;\r | |
251 | SEV_ES_SEGMENT_REGISTER Gs;\r | |
252 | SEV_ES_SEGMENT_REGISTER Gdtr;\r | |
253 | SEV_ES_SEGMENT_REGISTER Ldtr;\r | |
254 | SEV_ES_SEGMENT_REGISTER Idtr;\r | |
255 | SEV_ES_SEGMENT_REGISTER Tr;\r | |
256 | UINT8 Reserved1[42];\r | |
257 | UINT8 Vmpl;\r | |
258 | UINT8 Reserved2[5];\r | |
259 | UINT64 Efer;\r | |
260 | UINT8 Reserved3[112];\r | |
261 | UINT64 Cr4;\r | |
262 | UINT8 Reserved4[8];\r | |
263 | UINT64 Cr0;\r | |
264 | UINT64 Dr7;\r | |
265 | UINT64 Dr6;\r | |
266 | UINT64 Rflags;\r | |
267 | UINT64 Rip;\r | |
268 | UINT8 Reserved5[232];\r | |
269 | UINT64 GPat;\r | |
270 | UINT8 Reserved6[320];\r | |
271 | UINT64 SevFeatures;\r | |
272 | UINT8 Reserved7[48];\r | |
273 | UINT64 XCr0;\r | |
274 | UINT8 Reserved8[24];\r | |
275 | UINT32 Mxcsr;\r | |
276 | UINT16 X87Ftw;\r | |
277 | UINT8 Reserved9[2];\r | |
278 | UINT16 X87Fcw;\r | |
dfd41aef TL |
279 | } SEV_ES_SAVE_AREA;\r |
280 | #pragma pack ()\r | |
281 | \r | |
1c0eb915 | 282 | #endif\r |