\r
#include "Platform.h"\r
\r
+STATIC\r
+UINT64\r
+GetHypervisorFeature (\r
+ VOID\r
+ );\r
+\r
/**\r
Initialize SEV-SNP support if running as an SEV-SNP guest.\r
\r
{\r
EFI_PEI_HOB_POINTERS Hob;\r
EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
+ UINT64 HvFeatures;\r
+ EFI_STATUS PcdStatus;\r
\r
if (!MemEncryptSevSnpIsEnabled ()) {\r
return;\r
}\r
\r
+ //\r
+ // Query the hypervisor feature using the VmgExit and set the value in the\r
+ // hypervisor features PCD.\r
+ //\r
+ HvFeatures = GetHypervisorFeature ();\r
+ PcdStatus = PcdSet64S (PcdGhcbHypervisorFeatures, HvFeatures);\r
+ ASSERT_RETURN_ERROR (PcdStatus);\r
+\r
//\r
// Iterate through the system RAM and validate it.\r
//\r
CpuDeadLoop ();\r
}\r
\r
+/**\r
+ Get the hypervisor features bitmap\r
+\r
+**/\r
+STATIC\r
+UINT64\r
+GetHypervisorFeature (\r
+ VOID\r
+ )\r
+{\r
+ UINT64 Status;\r
+ GHCB *Ghcb;\r
+ MSR_SEV_ES_GHCB_REGISTER Msr;\r
+ BOOLEAN InterruptState;\r
+ UINT64 Features;\r
+\r
+ Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);\r
+ Ghcb = Msr.Ghcb;\r
+\r
+ //\r
+ // Initialize the GHCB\r
+ //\r
+ VmgInit (Ghcb, &InterruptState);\r
+\r
+ //\r
+ // Query the Hypervisor Features.\r
+ //\r
+ Status = VmgExit (Ghcb, SVM_EXIT_HYPERVISOR_FEATURES, 0, 0);\r
+ if ((Status != 0)) {\r
+ SevEsProtocolFailure (GHCB_TERMINATE_GHCB_GENERAL);\r
+ }\r
+\r
+ Features = Ghcb->SaveArea.SwExitInfo2;\r
+\r
+ VmgDone (Ghcb, InterruptState);\r
+\r
+ return Features;\r
+}\r
+\r
/**\r
\r
This function can be used to register the GHCB GPA.\r
MtrrLib\r
MemEncryptSevLib\r
PcdLib\r
+ VmgExitLib\r
\r
[Pcd]\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase\r
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize\r
gUefiCpuPkgTokenSpaceGuid.PcdSevEsIsEnabled\r
gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr\r
+ gUefiCpuPkgTokenSpaceGuid.PcdGhcbHypervisorFeatures\r
\r
[FixedPcd]\r
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress\r