]>
Commit | Line | Data |
---|---|---|
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 | |
23 | #define GP_EXCEPTION 13\r | |
24 | #define VC_EXCEPTION 29\r | |
25 | \r | |
26 | #define GHCB_VERSION_MIN 1\r | |
27 | #define GHCB_VERSION_MAX 1\r | |
28 | \r | |
29 | #define GHCB_STANDARD_USAGE 0\r | |
30 | \r | |
31 | //\r | |
32 | // SVM Exit Codes\r | |
33 | //\r | |
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 | |
48 | \r | |
49 | //\r | |
50 | // VMG Special Exit Codes\r | |
51 | //\r | |
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_HYPERVISOR_FEATURES 0x8000FFFDULL\r | |
58 | #define SVM_EXIT_UNSUPPORTED 0x8000FFFFULL\r | |
59 | \r | |
60 | //\r | |
61 | // IOIO Exit Information\r | |
62 | //\r | |
63 | #define IOIO_TYPE_STR BIT2\r | |
64 | #define IOIO_TYPE_IN 1\r | |
65 | #define IOIO_TYPE_INS (IOIO_TYPE_IN | IOIO_TYPE_STR)\r | |
66 | #define IOIO_TYPE_OUT 0\r | |
67 | #define IOIO_TYPE_OUTS (IOIO_TYPE_OUT | IOIO_TYPE_STR)\r | |
68 | \r | |
69 | #define IOIO_REP BIT3\r | |
70 | \r | |
71 | #define IOIO_ADDR_64 BIT9\r | |
72 | #define IOIO_ADDR_32 BIT8\r | |
73 | #define IOIO_ADDR_16 BIT7\r | |
74 | \r | |
75 | #define IOIO_DATA_32 BIT6\r | |
76 | #define IOIO_DATA_16 BIT5\r | |
77 | #define IOIO_DATA_8 BIT4\r | |
78 | #define IOIO_DATA_MASK (BIT6 | BIT5 | BIT4)\r | |
79 | #define IOIO_DATA_OFFSET 4\r | |
80 | #define IOIO_DATA_BYTES(x) (((x) & IOIO_DATA_MASK) >> IOIO_DATA_OFFSET)\r | |
81 | \r | |
82 | #define IOIO_SEG_ES 0\r | |
83 | #define IOIO_SEG_DS (BIT11 | BIT10)\r | |
84 | \r | |
85 | \r | |
86 | typedef PACKED struct {\r | |
87 | UINT8 Reserved1[203];\r | |
88 | UINT8 Cpl;\r | |
89 | UINT8 Reserved8[300];\r | |
90 | UINT64 Rax;\r | |
91 | UINT8 Reserved4[264];\r | |
92 | UINT64 Rcx;\r | |
93 | UINT64 Rdx;\r | |
94 | UINT64 Rbx;\r | |
95 | UINT8 Reserved5[112];\r | |
96 | UINT64 SwExitCode;\r | |
97 | UINT64 SwExitInfo1;\r | |
98 | UINT64 SwExitInfo2;\r | |
99 | UINT64 SwScratch;\r | |
100 | UINT8 Reserved6[56];\r | |
101 | UINT64 XCr0;\r | |
102 | UINT8 ValidBitmap[16];\r | |
103 | UINT64 X87StateGpa;\r | |
104 | UINT8 Reserved7[1016];\r | |
105 | } GHCB_SAVE_AREA;\r | |
106 | \r | |
107 | typedef PACKED struct {\r | |
108 | GHCB_SAVE_AREA SaveArea;\r | |
109 | UINT8 SharedBuffer[2032];\r | |
110 | UINT8 Reserved1[10];\r | |
111 | UINT16 ProtocolVersion;\r | |
112 | UINT32 GhcbUsage;\r | |
113 | } GHCB;\r | |
114 | \r | |
115 | #define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \\r | |
116 | (OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))\r | |
117 | \r | |
118 | typedef enum {\r | |
119 | GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),\r | |
120 | GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),\r | |
121 | GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),\r | |
122 | GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),\r | |
123 | GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),\r | |
124 | GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),\r | |
125 | GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),\r | |
126 | GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),\r | |
127 | GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),\r | |
128 | GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),\r | |
129 | } GHCB_REGISTER;\r | |
130 | \r | |
131 | typedef union {\r | |
132 | struct {\r | |
133 | UINT32 Lower32Bits;\r | |
134 | UINT32 Upper32Bits;\r | |
135 | } Elements;\r | |
136 | \r | |
137 | UINT64 Uint64;\r | |
138 | } GHCB_EXIT_INFO;\r | |
139 | \r | |
140 | typedef union {\r | |
141 | struct {\r | |
142 | UINT32 Vector:8;\r | |
143 | UINT32 Type:3;\r | |
144 | UINT32 ErrorCodeValid:1;\r | |
145 | UINT32 Rsvd:19;\r | |
146 | UINT32 Valid:1;\r | |
147 | UINT32 ErrorCode;\r | |
148 | } Elements;\r | |
149 | \r | |
150 | UINT64 Uint64;\r | |
151 | } GHCB_EVENT_INJECTION;\r | |
152 | \r | |
153 | #define GHCB_EVENT_INJECTION_TYPE_INT 0\r | |
154 | #define GHCB_EVENT_INJECTION_TYPE_NMI 2\r | |
155 | #define GHCB_EVENT_INJECTION_TYPE_EXCEPTION 3\r | |
156 | #define GHCB_EVENT_INJECTION_TYPE_SOFT_INT 4\r | |
157 | \r | |
158 | //\r | |
159 | // Hypervisor features\r | |
160 | //\r | |
161 | #define GHCB_HV_FEATURES_SNP BIT0\r | |
162 | #define GHCB_HV_FEATURES_SNP_AP_CREATE (GHCB_HV_FEATURES_SNP | BIT1)\r | |
163 | #define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION (GHCB_HV_FEATURES_SNP_AP_CREATE | BIT2)\r | |
164 | #define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION_TIMER (GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION | BIT3)\r | |
165 | #endif\r |