]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Include/Register/Amd/Ghcb.h
029904b1c63afd119f3842fd576529d0b9a651f2
[mirror_edk2.git] / MdePkg / Include / Register / Amd / Ghcb.h
1 /** @file
2 Guest-Hypervisor Communication Block (GHCB) Definition.
3
4 Provides data types allowing an SEV-ES guest to interact with the hypervisor
5 using the GHCB protocol.
6
7 Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>
8 SPDX-License-Identifier: BSD-2-Clause-Patent
9
10 @par Specification Reference:
11 SEV-ES Guest-Hypervisor Communication Block Standardization
12
13 **/
14
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 1
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_HYPERVISOR_FEATURES 0x8000FFFDULL
59 #define SVM_EXIT_UNSUPPORTED 0x8000FFFFULL
60
61 //
62 // IOIO Exit Information
63 //
64 #define IOIO_TYPE_STR BIT2
65 #define IOIO_TYPE_IN 1
66 #define IOIO_TYPE_INS (IOIO_TYPE_IN | IOIO_TYPE_STR)
67 #define IOIO_TYPE_OUT 0
68 #define IOIO_TYPE_OUTS (IOIO_TYPE_OUT | IOIO_TYPE_STR)
69
70 #define IOIO_REP BIT3
71
72 #define IOIO_ADDR_64 BIT9
73 #define IOIO_ADDR_32 BIT8
74 #define IOIO_ADDR_16 BIT7
75
76 #define IOIO_DATA_32 BIT6
77 #define IOIO_DATA_16 BIT5
78 #define IOIO_DATA_8 BIT4
79 #define IOIO_DATA_MASK (BIT6 | BIT5 | BIT4)
80 #define IOIO_DATA_OFFSET 4
81 #define IOIO_DATA_BYTES(x) (((x) & IOIO_DATA_MASK) >> IOIO_DATA_OFFSET)
82
83 #define IOIO_SEG_ES 0
84 #define IOIO_SEG_DS (BIT11 | BIT10)
85
86
87 typedef PACKED struct {
88 UINT8 Reserved1[203];
89 UINT8 Cpl;
90 UINT8 Reserved8[300];
91 UINT64 Rax;
92 UINT8 Reserved4[264];
93 UINT64 Rcx;
94 UINT64 Rdx;
95 UINT64 Rbx;
96 UINT8 Reserved5[112];
97 UINT64 SwExitCode;
98 UINT64 SwExitInfo1;
99 UINT64 SwExitInfo2;
100 UINT64 SwScratch;
101 UINT8 Reserved6[56];
102 UINT64 XCr0;
103 UINT8 ValidBitmap[16];
104 UINT64 X87StateGpa;
105 UINT8 Reserved7[1016];
106 } GHCB_SAVE_AREA;
107
108 typedef PACKED struct {
109 GHCB_SAVE_AREA SaveArea;
110 UINT8 SharedBuffer[2032];
111 UINT8 Reserved1[10];
112 UINT16 ProtocolVersion;
113 UINT32 GhcbUsage;
114 } GHCB;
115
116 #define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \
117 (OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))
118
119 typedef enum {
120 GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),
121 GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),
122 GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),
123 GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),
124 GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),
125 GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),
126 GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),
127 GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),
128 GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),
129 GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),
130 } GHCB_REGISTER;
131
132 typedef union {
133 struct {
134 UINT32 Lower32Bits;
135 UINT32 Upper32Bits;
136 } Elements;
137
138 UINT64 Uint64;
139 } GHCB_EXIT_INFO;
140
141 typedef union {
142 struct {
143 UINT32 Vector:8;
144 UINT32 Type:3;
145 UINT32 ErrorCodeValid:1;
146 UINT32 Rsvd:19;
147 UINT32 Valid:1;
148 UINT32 ErrorCode;
149 } Elements;
150
151 UINT64 Uint64;
152 } GHCB_EVENT_INJECTION;
153
154 #define GHCB_EVENT_INJECTION_TYPE_INT 0
155 #define GHCB_EVENT_INJECTION_TYPE_NMI 2
156 #define GHCB_EVENT_INJECTION_TYPE_EXCEPTION 3
157 #define GHCB_EVENT_INJECTION_TYPE_SOFT_INT 4
158
159 //
160 // Hypervisor features
161 //
162 #define GHCB_HV_FEATURES_SNP BIT0
163 #define GHCB_HV_FEATURES_SNP_AP_CREATE (GHCB_HV_FEATURES_SNP | BIT1)
164 #define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION (GHCB_HV_FEATURES_SNP_AP_CREATE | BIT2)
165 #define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION_TIMER (GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION | BIT3)
166
167 //
168 // SNP Page State Change.
169 //
170 // Note that the PSMASH and UNSMASH operations are not supported when using the MSR protocol.
171 //
172 #define SNP_PAGE_STATE_PRIVATE 1
173 #define SNP_PAGE_STATE_SHARED 2
174 #define SNP_PAGE_STATE_PSMASH 3
175 #define SNP_PAGE_STATE_UNSMASH 4
176
177 typedef struct {
178 UINT64 CurrentPage:12;
179 UINT64 GuestFrameNumber:40;
180 UINT64 Operation:4;
181 UINT64 PageSize:1;
182 UINT64 Reserved:7;
183 } SNP_PAGE_STATE_ENTRY;
184
185 typedef struct {
186 UINT16 CurrentEntry;
187 UINT16 EndEntry;
188 UINT32 Reserved;
189 } SNP_PAGE_STATE_HEADER;
190
191 #define SNP_PAGE_STATE_MAX_ENTRY 253
192
193 typedef struct {
194 SNP_PAGE_STATE_HEADER Header;
195 SNP_PAGE_STATE_ENTRY Entry[SNP_PAGE_STATE_MAX_ENTRY];
196 } SNP_PAGE_STATE_CHANGE_INFO;
197
198 #endif