#include <Library/DebugLib.h>\r
\r
#define UD_EXCEPTION 6\r
-#define GP_EXCEPTION 13\r
-#define VC_EXCEPTION 29\r
+#define GP_EXCEPTION 13\r
+#define VC_EXCEPTION 29\r
\r
-#define GHCB_VERSION_MIN 1\r
-#define GHCB_VERSION_MAX 1\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
+#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_SNP_PAGE_STATE_CHANGE 0x80000010ULL\r
-#define SVM_EXIT_SNP_AP_CREATION 0x80000013ULL\r
-#define SVM_EXIT_HYPERVISOR_FEATURES 0x8000FFFDULL\r
-#define SVM_EXIT_UNSUPPORTED 0x8000FFFFULL\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_SNP_PAGE_STATE_CHANGE 0x80000010ULL\r
+#define SVM_EXIT_SNP_AP_CREATION 0x80000013ULL\r
+#define SVM_EXIT_HYPERVISOR_FEATURES 0x8000FFFDULL\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_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
+#define IOIO_SEG_ES 0\r
+#define IOIO_SEG_DS (BIT11 | BIT10)\r
\r
//\r
// AP Creation Information\r
#define SVM_VMGEXIT_SNP_AP_DESTROY 2\r
\r
typedef PACKED struct {\r
- UINT8 Reserved1[203];\r
- UINT8 Cpl;\r
- UINT8 Reserved8[300];\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
+ UINT8 Reserved1[203];\r
+ UINT8 Cpl;\r
+ UINT8 Reserved8[300];\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_SAVE_AREA SaveArea;\r
+ UINT8 SharedBuffer[2032];\r
+ UINT8 Reserved1[10];\r
+ UINT16 ProtocolVersion;\r
+ UINT32 GhcbUsage;\r
} GHCB;\r
\r
#define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \\r
(OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))\r
\r
typedef enum {\r
- GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),\r
- GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),\r
- GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),\r
- GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),\r
- GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),\r
- GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),\r
- GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),\r
- GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),\r
- GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),\r
- GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),\r
+ GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),\r
+ GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),\r
+ GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),\r
+ GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),\r
+ GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),\r
+ GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),\r
+ GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),\r
+ GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),\r
+ GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),\r
+ GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),\r
} GHCB_REGISTER;\r
\r
typedef union {\r
struct {\r
- UINT32 Lower32Bits;\r
- UINT32 Upper32Bits;\r
+ UINT32 Lower32Bits;\r
+ UINT32 Upper32Bits;\r
} Elements;\r
\r
UINT64 Uint64;\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
+ 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
//\r
// Hypervisor features\r
//\r
-#define GHCB_HV_FEATURES_SNP BIT0\r
-#define GHCB_HV_FEATURES_SNP_AP_CREATE (GHCB_HV_FEATURES_SNP | BIT1)\r
-#define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION (GHCB_HV_FEATURES_SNP_AP_CREATE | BIT2)\r
-#define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION_TIMER (GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION | BIT3)\r
+#define GHCB_HV_FEATURES_SNP BIT0\r
+#define GHCB_HV_FEATURES_SNP_AP_CREATE (GHCB_HV_FEATURES_SNP | BIT1)\r
+#define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION (GHCB_HV_FEATURES_SNP_AP_CREATE | BIT2)\r
+#define GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION_TIMER (GHCB_HV_FEATURES_SNP_RESTRICTED_INJECTION | BIT3)\r
\r
//\r
// SNP Page State Change.\r
//\r
// Note that the PSMASH and UNSMASH operations are not supported when using the MSR protocol.\r
//\r
-#define SNP_PAGE_STATE_PRIVATE 1\r
-#define SNP_PAGE_STATE_SHARED 2\r
-#define SNP_PAGE_STATE_PSMASH 3\r
-#define SNP_PAGE_STATE_UNSMASH 4\r
+#define SNP_PAGE_STATE_PRIVATE 1\r
+#define SNP_PAGE_STATE_SHARED 2\r
+#define SNP_PAGE_STATE_PSMASH 3\r
+#define SNP_PAGE_STATE_UNSMASH 4\r
\r
typedef struct {\r
- UINT64 CurrentPage:12;\r
- UINT64 GuestFrameNumber:40;\r
- UINT64 Operation:4;\r
- UINT64 PageSize:1;\r
- UINT64 Reserved:7;\r
+ UINT64 CurrentPage : 12;\r
+ UINT64 GuestFrameNumber : 40;\r
+ UINT64 Operation : 4;\r
+ UINT64 PageSize : 1;\r
+ UINT64 Reserved : 7;\r
} SNP_PAGE_STATE_ENTRY;\r
\r
typedef struct {\r
- UINT16 CurrentEntry;\r
- UINT16 EndEntry;\r
- UINT32 Reserved;\r
+ UINT16 CurrentEntry;\r
+ UINT16 EndEntry;\r
+ UINT32 Reserved;\r
} SNP_PAGE_STATE_HEADER;\r
\r
-#define SNP_PAGE_STATE_MAX_ENTRY 253\r
+#define SNP_PAGE_STATE_MAX_ENTRY 253\r
\r
typedef struct {\r
- SNP_PAGE_STATE_HEADER Header;\r
- SNP_PAGE_STATE_ENTRY Entry[SNP_PAGE_STATE_MAX_ENTRY];\r
+ SNP_PAGE_STATE_HEADER Header;\r
+ SNP_PAGE_STATE_ENTRY Entry[SNP_PAGE_STATE_MAX_ENTRY];\r
} SNP_PAGE_STATE_CHANGE_INFO;\r
\r
//\r
#define SEV_ES_RESET_CODE_SEGMENT_TYPE 0xA\r
#define SEV_ES_RESET_DATA_SEGMENT_TYPE 0x2\r
\r
-#define SEV_ES_RESET_LDT_TYPE 0x2\r
-#define SEV_ES_RESET_TSS_TYPE 0x3\r
+#define SEV_ES_RESET_LDT_TYPE 0x2\r
+#define SEV_ES_RESET_TSS_TYPE 0x3\r
\r
#pragma pack (1)\r
typedef union {\r
- struct {\r
- UINT16 Type:4;\r
- UINT16 Sbit:1;\r
- UINT16 Dpl:2;\r
- UINT16 Present:1;\r
- UINT16 Avl:1;\r
- UINT16 Reserved1:1;\r
- UINT16 Db:1;\r
- UINT16 Granularity:1;\r
- } Bits;\r
- UINT16 Uint16;\r
+ struct {\r
+ UINT16 Type : 4;\r
+ UINT16 Sbit : 1;\r
+ UINT16 Dpl : 2;\r
+ UINT16 Present : 1;\r
+ UINT16 Avl : 1;\r
+ UINT16 Reserved1 : 1;\r
+ UINT16 Db : 1;\r
+ UINT16 Granularity : 1;\r
+ } Bits;\r
+ UINT16 Uint16;\r
} SEV_ES_SEGMENT_REGISTER_ATTRIBUTES;\r
\r
typedef struct {\r
} SEV_ES_SEGMENT_REGISTER;\r
\r
typedef struct {\r
- SEV_ES_SEGMENT_REGISTER Es;\r
- SEV_ES_SEGMENT_REGISTER Cs;\r
- SEV_ES_SEGMENT_REGISTER Ss;\r
- SEV_ES_SEGMENT_REGISTER Ds;\r
- SEV_ES_SEGMENT_REGISTER Fs;\r
- SEV_ES_SEGMENT_REGISTER Gs;\r
- SEV_ES_SEGMENT_REGISTER Gdtr;\r
- SEV_ES_SEGMENT_REGISTER Ldtr;\r
- SEV_ES_SEGMENT_REGISTER Idtr;\r
- SEV_ES_SEGMENT_REGISTER Tr;\r
- UINT8 Reserved1[42];\r
- UINT8 Vmpl;\r
- UINT8 Reserved2[5];\r
- UINT64 Efer;\r
- UINT8 Reserved3[112];\r
- UINT64 Cr4;\r
- UINT8 Reserved4[8];\r
- UINT64 Cr0;\r
- UINT64 Dr7;\r
- UINT64 Dr6;\r
- UINT64 Rflags;\r
- UINT64 Rip;\r
- UINT8 Reserved5[232];\r
- UINT64 GPat;\r
- UINT8 Reserved6[320];\r
- UINT64 SevFeatures;\r
- UINT8 Reserved7[48];\r
- UINT64 XCr0;\r
- UINT8 Reserved8[24];\r
- UINT32 Mxcsr;\r
- UINT16 X87Ftw;\r
- UINT8 Reserved9[2];\r
- UINT16 X87Fcw;\r
+ SEV_ES_SEGMENT_REGISTER Es;\r
+ SEV_ES_SEGMENT_REGISTER Cs;\r
+ SEV_ES_SEGMENT_REGISTER Ss;\r
+ SEV_ES_SEGMENT_REGISTER Ds;\r
+ SEV_ES_SEGMENT_REGISTER Fs;\r
+ SEV_ES_SEGMENT_REGISTER Gs;\r
+ SEV_ES_SEGMENT_REGISTER Gdtr;\r
+ SEV_ES_SEGMENT_REGISTER Ldtr;\r
+ SEV_ES_SEGMENT_REGISTER Idtr;\r
+ SEV_ES_SEGMENT_REGISTER Tr;\r
+ UINT8 Reserved1[42];\r
+ UINT8 Vmpl;\r
+ UINT8 Reserved2[5];\r
+ UINT64 Efer;\r
+ UINT8 Reserved3[112];\r
+ UINT64 Cr4;\r
+ UINT8 Reserved4[8];\r
+ UINT64 Cr0;\r
+ UINT64 Dr7;\r
+ UINT64 Dr6;\r
+ UINT64 Rflags;\r
+ UINT64 Rip;\r
+ UINT8 Reserved5[232];\r
+ UINT64 GPat;\r
+ UINT8 Reserved6[320];\r
+ UINT64 SevFeatures;\r
+ UINT8 Reserved7[48];\r
+ UINT64 XCr0;\r
+ UINT8 Reserved8[24];\r
+ UINT32 Mxcsr;\r
+ UINT16 X87Ftw;\r
+ UINT8 Reserved9[2];\r
+ UINT16 X87Fcw;\r
} SEV_ES_SAVE_AREA;\r
#pragma pack ()\r
\r