]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Include/Register/Amd/Ghcb.h
MdePkg/Register/Amd: define GHCB macros for hypervisor feature detection
[mirror_edk2.git] / MdePkg / Include / Register / Amd / Ghcb.h
CommitLineData
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
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
f828fc98
BS
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
34e16ff8 57#define SVM_EXIT_HYPERVISOR_FEATURES 0x8000FFFDULL\r
f828fc98 58#define SVM_EXIT_UNSUPPORTED 0x8000FFFFULL\r
1c0eb915
TL
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
1c0eb915
TL
86typedef PACKED struct {\r
87 UINT8 Reserved1[203];\r
88 UINT8 Cpl;\r
990ab937 89 UINT8 Reserved8[300];\r
1c0eb915
TL
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
107typedef 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
990ab937
TL
115#define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \\r
116 (OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))\r
117\r
118typedef 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
1c0eb915
TL
131typedef 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
140typedef 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
34e16ff8
BS
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
1c0eb915 165#endif\r