]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Include/Register/Amd/Ghcb.h
MdePkg: Clean up GHCB field offsets and save area
[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
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_UNSUPPORTED 0x8000FFFFULL\r
58\r
59//\r
60// IOIO Exit Information\r
61//\r
62#define IOIO_TYPE_STR BIT2\r
63#define IOIO_TYPE_IN 1\r
64#define IOIO_TYPE_INS (IOIO_TYPE_IN | IOIO_TYPE_STR)\r
65#define IOIO_TYPE_OUT 0\r
66#define IOIO_TYPE_OUTS (IOIO_TYPE_OUT | IOIO_TYPE_STR)\r
67\r
68#define IOIO_REP BIT3\r
69\r
70#define IOIO_ADDR_64 BIT9\r
71#define IOIO_ADDR_32 BIT8\r
72#define IOIO_ADDR_16 BIT7\r
73\r
74#define IOIO_DATA_32 BIT6\r
75#define IOIO_DATA_16 BIT5\r
76#define IOIO_DATA_8 BIT4\r
77#define IOIO_DATA_MASK (BIT6 | BIT5 | BIT4)\r
78#define IOIO_DATA_OFFSET 4\r
79#define IOIO_DATA_BYTES(x) (((x) & IOIO_DATA_MASK) >> IOIO_DATA_OFFSET)\r
80\r
81#define IOIO_SEG_ES 0\r
82#define IOIO_SEG_DS (BIT11 | BIT10)\r
83\r
84\r
1c0eb915
TL
85typedef PACKED struct {\r
86 UINT8 Reserved1[203];\r
87 UINT8 Cpl;\r
990ab937 88 UINT8 Reserved8[300];\r
1c0eb915
TL
89 UINT64 Rax;\r
90 UINT8 Reserved4[264];\r
91 UINT64 Rcx;\r
92 UINT64 Rdx;\r
93 UINT64 Rbx;\r
94 UINT8 Reserved5[112];\r
95 UINT64 SwExitCode;\r
96 UINT64 SwExitInfo1;\r
97 UINT64 SwExitInfo2;\r
98 UINT64 SwScratch;\r
99 UINT8 Reserved6[56];\r
100 UINT64 XCr0;\r
101 UINT8 ValidBitmap[16];\r
102 UINT64 X87StateGpa;\r
103 UINT8 Reserved7[1016];\r
104} GHCB_SAVE_AREA;\r
105\r
106typedef PACKED struct {\r
107 GHCB_SAVE_AREA SaveArea;\r
108 UINT8 SharedBuffer[2032];\r
109 UINT8 Reserved1[10];\r
110 UINT16 ProtocolVersion;\r
111 UINT32 GhcbUsage;\r
112} GHCB;\r
113\r
990ab937
TL
114#define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \\r
115 (OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))\r
116\r
117typedef enum {\r
118 GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),\r
119 GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),\r
120 GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),\r
121 GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),\r
122 GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),\r
123 GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),\r
124 GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),\r
125 GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),\r
126 GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),\r
127 GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),\r
128} GHCB_REGISTER;\r
129\r
1c0eb915
TL
130typedef union {\r
131 struct {\r
132 UINT32 Lower32Bits;\r
133 UINT32 Upper32Bits;\r
134 } Elements;\r
135\r
136 UINT64 Uint64;\r
137} GHCB_EXIT_INFO;\r
138\r
139typedef union {\r
140 struct {\r
141 UINT32 Vector:8;\r
142 UINT32 Type:3;\r
143 UINT32 ErrorCodeValid:1;\r
144 UINT32 Rsvd:19;\r
145 UINT32 Valid:1;\r
146 UINT32 ErrorCode;\r
147 } Elements;\r
148\r
149 UINT64 Uint64;\r
150} GHCB_EVENT_INJECTION;\r
151\r
152#define GHCB_EVENT_INJECTION_TYPE_INT 0\r
153#define GHCB_EVENT_INJECTION_TYPE_NMI 2\r
154#define GHCB_EVENT_INJECTION_TYPE_EXCEPTION 3\r
155#define GHCB_EVENT_INJECTION_TYPE_SOFT_INT 4\r
156\r
157#endif\r