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