]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg: Add a structure definition for the GHCB
authorTom Lendacky <thomas.lendacky@amd.com>
Wed, 12 Aug 2020 20:21:35 +0000 (15:21 -0500)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Sun, 16 Aug 2020 16:45:42 +0000 (16:45 +0000)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

The GHCB is used by an SEV-ES guest for communicating between the guest
and the hypervisor. Create the GHCB definition as defined by the GHCB
protocol definition.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
MdePkg/Include/Register/Amd/Ghcb.h [new file with mode: 0644]

diff --git a/MdePkg/Include/Register/Amd/Ghcb.h b/MdePkg/Include/Register/Amd/Ghcb.h
new file mode 100644 (file)
index 0000000..54a80da
--- /dev/null
@@ -0,0 +1,166 @@
+/** @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