--- /dev/null
+/** @file\r
+ Guest-Hypervisor Communication Block (GHCB) Definition.\r
+\r
+ Provides data types allowing an SEV-ES guest to interact with the hypervisor\r
+ using the GHCB protocol.\r
+\r
+ Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+ @par Specification Reference:\r
+ SEV-ES Guest-Hypervisor Communication Block Standardization\r
+\r
+**/\r
+\r
+#ifndef __GHCB_H__\r
+#define __GHCB_H__\r
+\r
+#include <Base.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#define UD_EXCEPTION 6\r
+#define GP_EXCEPTION 13\r
+#define VC_EXCEPTION 29\r
+\r
+#define GHCB_VERSION_MIN 1\r
+#define GHCB_VERSION_MAX 1\r
+\r
+#define GHCB_STANDARD_USAGE 0\r
+\r
+//\r
+// SVM Exit Codes\r
+//\r
+#define SVM_EXIT_DR7_READ 0x27ULL\r
+#define SVM_EXIT_DR7_WRITE 0x37ULL\r
+#define SVM_EXIT_RDTSC 0x6EULL\r
+#define SVM_EXIT_RDPMC 0x6FULL\r
+#define SVM_EXIT_CPUID 0x72ULL\r
+#define SVM_EXIT_INVD 0x76ULL\r
+#define SVM_EXIT_IOIO_PROT 0x7BULL\r
+#define SVM_EXIT_MSR 0x7CULL\r
+#define SVM_EXIT_VMMCALL 0x81ULL\r
+#define SVM_EXIT_RDTSCP 0x87ULL\r
+#define SVM_EXIT_WBINVD 0x89ULL\r
+#define SVM_EXIT_MONITOR 0x8AULL\r
+#define SVM_EXIT_MWAIT 0x8BULL\r
+#define SVM_EXIT_NPF 0x400ULL\r
+\r
+//\r
+// VMG Special Exit Codes\r
+//\r
+#define SVM_EXIT_MMIO_READ 0x80000001ULL\r
+#define SVM_EXIT_MMIO_WRITE 0x80000002ULL\r
+#define SVM_EXIT_NMI_COMPLETE 0x80000003ULL\r
+#define SVM_EXIT_AP_RESET_HOLD 0x80000004ULL\r
+#define SVM_EXIT_AP_JUMP_TABLE 0x80000005ULL\r
+#define SVM_EXIT_UNSUPPORTED 0x8000FFFFULL\r
+\r
+//\r
+// IOIO Exit Information\r
+//\r
+#define IOIO_TYPE_STR BIT2\r
+#define IOIO_TYPE_IN 1\r
+#define IOIO_TYPE_INS (IOIO_TYPE_IN | IOIO_TYPE_STR)\r
+#define IOIO_TYPE_OUT 0\r
+#define IOIO_TYPE_OUTS (IOIO_TYPE_OUT | IOIO_TYPE_STR)\r
+\r
+#define IOIO_REP BIT3\r
+\r
+#define IOIO_ADDR_64 BIT9\r
+#define IOIO_ADDR_32 BIT8\r
+#define IOIO_ADDR_16 BIT7\r
+\r
+#define IOIO_DATA_32 BIT6\r
+#define IOIO_DATA_16 BIT5\r
+#define IOIO_DATA_8 BIT4\r
+#define IOIO_DATA_MASK (BIT6 | BIT5 | BIT4)\r
+#define IOIO_DATA_OFFSET 4\r
+#define IOIO_DATA_BYTES(x) (((x) & IOIO_DATA_MASK) >> IOIO_DATA_OFFSET)\r
+\r
+#define IOIO_SEG_ES 0\r
+#define IOIO_SEG_DS (BIT11 | BIT10)\r
+\r
+\r
+typedef enum {\r
+ GhcbCpl = 25,\r
+ GhcbRflags = 46,\r
+ GhcbRip,\r
+ GhcbRsp = 59,\r
+ GhcbRax = 63,\r
+ GhcbRcx = 97,\r
+ GhcbRdx,\r
+ GhcbRbx,\r
+ GhcbRbp = 101,\r
+ GhcbRsi,\r
+ GhcbRdi,\r
+ GhcbR8,\r
+ GhcbR9,\r
+ GhcbR10,\r
+ GhcbR11,\r
+ GhcbR12,\r
+ GhcbR13,\r
+ GhcbR14,\r
+ GhcbR15,\r
+ GhcbXCr0 = 125,\r
+} GHCB_REGISTER;\r
+\r
+typedef PACKED struct {\r
+ UINT8 Reserved1[203];\r
+ UINT8 Cpl;\r
+ UINT8 Reserved2[148];\r
+ UINT64 Dr7;\r
+ UINT8 Reserved3[144];\r
+ UINT64 Rax;\r
+ UINT8 Reserved4[264];\r
+ UINT64 Rcx;\r
+ UINT64 Rdx;\r
+ UINT64 Rbx;\r
+ UINT8 Reserved5[112];\r
+ UINT64 SwExitCode;\r
+ UINT64 SwExitInfo1;\r
+ UINT64 SwExitInfo2;\r
+ UINT64 SwScratch;\r
+ UINT8 Reserved6[56];\r
+ UINT64 XCr0;\r
+ UINT8 ValidBitmap[16];\r
+ UINT64 X87StateGpa;\r
+ UINT8 Reserved7[1016];\r
+} GHCB_SAVE_AREA;\r
+\r
+typedef PACKED struct {\r
+ GHCB_SAVE_AREA SaveArea;\r
+ UINT8 SharedBuffer[2032];\r
+ UINT8 Reserved1[10];\r
+ UINT16 ProtocolVersion;\r
+ UINT32 GhcbUsage;\r
+} GHCB;\r
+\r
+typedef union {\r
+ struct {\r
+ UINT32 Lower32Bits;\r
+ UINT32 Upper32Bits;\r
+ } Elements;\r
+\r
+ UINT64 Uint64;\r
+} GHCB_EXIT_INFO;\r
+\r
+typedef union {\r
+ struct {\r
+ UINT32 Vector:8;\r
+ UINT32 Type:3;\r
+ UINT32 ErrorCodeValid:1;\r
+ UINT32 Rsvd:19;\r
+ UINT32 Valid:1;\r
+ UINT32 ErrorCode;\r
+ } Elements;\r
+\r
+ UINT64 Uint64;\r
+} GHCB_EVENT_INJECTION;\r
+\r
+#define GHCB_EVENT_INJECTION_TYPE_INT 0\r
+#define GHCB_EVENT_INJECTION_TYPE_NMI 2\r
+#define GHCB_EVENT_INJECTION_TYPE_EXCEPTION 3\r
+#define GHCB_EVENT_INJECTION_TYPE_SOFT_INT 4\r
+\r
+#endif\r