#include <Library/LocalApicLib.h>\r
#include <Library/CpuExceptionHandlerLib.h>\r
#include <Ppi/TemporaryRamSupport.h>\r
+#include <Ppi/MpInitLibDep.h>\r
#include <Library/PlatformInitLib.h>\r
#include <Library/CcProbeLib.h>\r
#include "AmdSev.h"\r
TemporaryRamMigration\r
};\r
\r
-EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTable[] = {\r
+EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTableMp[] = {\r
+ {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI),\r
+ &gEfiTemporaryRamSupportPpiGuid,\r
+ &mTemporaryRamSupportPpi\r
+ },\r
{\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEfiPeiMpInitLibMpDepPpiGuid,\r
+ NULL\r
+ },\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTableUp[] = {\r
+ {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI),\r
&gEfiTemporaryRamSupportPpiGuid,\r
&mTemporaryRamSupportPpi\r
},\r
+ {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEfiPeiMpInitLibUpDepPpiGuid,\r
+ NULL\r
+ },\r
};\r
\r
//\r
EFI_SEC_PEI_HAND_OFF *SecCoreData;\r
EFI_FIRMWARE_VOLUME_HEADER *BootFv;\r
EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint;\r
+ EFI_PEI_PPI_DESCRIPTOR *EfiPeiPpiDescriptor;\r
\r
SecCoreData = (EFI_SEC_PEI_HAND_OFF *)Context;\r
\r
SecCoreData->BootFirmwareVolumeBase = BootFv;\r
SecCoreData->BootFirmwareVolumeSize = (UINTN)BootFv->FvLength;\r
\r
+ //\r
+ // Td guest is required to use the MpInitLibUp (unique-processor version).\r
+ // Other guests use the MpInitLib (multi-processor version).\r
+ //\r
+ if (CcProbe () == CcGuestTypeIntelTdx) {\r
+ EfiPeiPpiDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTableUp;\r
+ } else {\r
+ EfiPeiPpiDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTableMp;\r
+ }\r
+\r
//\r
// Transfer the control to the PEI core\r
//\r
- (*PeiCoreEntryPoint)(SecCoreData, (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTable);\r
+ (*PeiCoreEntryPoint)(SecCoreData, EfiPeiPpiDescriptor);\r
\r
//\r
// If we get here then the PEI Core returned, which is not recoverable.\r