summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMin M Xu <min.m.xu@intel.com>2022-05-07 09:36:21 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2022-05-11 08:40:53 +0000
commitb63a49e056ea2ea64ff89d81da9583534f5e5117 (patch)
tree8a136fbd94d92ae6341b28ece2323c5c118156ef
parent2f06e5af47ba43ac68644fa5392e8374a30ce7ad (diff)
downloadedk2-b63a49e056ea2ea64ff89d81da9583534f5e5117.tar.gz
edk2-b63a49e056ea2ea64ff89d81da9583534f5e5117.tar.bz2
edk2-b63a49e056ea2ea64ff89d81da9583534f5e5117.zip
OvmfPkg/Sec: Install MpInitLibDepLib PPIs in SecMain.c
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3918 Td guest should use MpInitLibUp, other guest use the MpInitLib. So in SecMain.c different PPI is installed according to the working guest type. Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Erdem Aktas <erdemaktas@google.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Min Xu <min.m.xu@intel.com> Tested-by: Tom Lendacky <thomas.lendacky@amd.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
-rw-r--r--OvmfPkg/Sec/SecMain.c34
-rw-r--r--OvmfPkg/Sec/SecMain.inf2
2 files changed, 34 insertions, 2 deletions
diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c
index 89371361cd..1167d22a68 100644
--- a/OvmfPkg/Sec/SecMain.c
+++ b/OvmfPkg/Sec/SecMain.c
@@ -28,6 +28,7 @@
#include <Library/LocalApicLib.h>
#include <Library/CpuExceptionHandlerLib.h>
#include <Ppi/TemporaryRamSupport.h>
+#include <Ppi/MpInitLibDep.h>
#include <Library/PlatformInitLib.h>
#include <Library/CcProbeLib.h>
#include "AmdSev.h"
@@ -61,12 +62,30 @@ EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mTemporaryRamSupportPpi = {
TemporaryRamMigration
};
-EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTable[] = {
+EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTableMp[] = {
+ {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI),
+ &gEfiTemporaryRamSupportPpiGuid,
+ &mTemporaryRamSupportPpi
+ },
{
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEfiPeiMpInitLibMpDepPpiGuid,
+ NULL
+ },
+};
+
+EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTableUp[] = {
+ {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI),
&gEfiTemporaryRamSupportPpiGuid,
&mTemporaryRamSupportPpi
},
+ {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEfiPeiMpInitLibUpDepPpiGuid,
+ NULL
+ },
};
//
@@ -936,6 +955,7 @@ SecStartupPhase2 (
EFI_SEC_PEI_HAND_OFF *SecCoreData;
EFI_FIRMWARE_VOLUME_HEADER *BootFv;
EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint;
+ EFI_PEI_PPI_DESCRIPTOR *EfiPeiPpiDescriptor;
SecCoreData = (EFI_SEC_PEI_HAND_OFF *)Context;
@@ -949,9 +969,19 @@ SecStartupPhase2 (
SecCoreData->BootFirmwareVolumeSize = (UINTN)BootFv->FvLength;
//
+ // Td guest is required to use the MpInitLibUp (unique-processor version).
+ // Other guests use the MpInitLib (multi-processor version).
+ //
+ if (CcProbe () == CcGuestTypeIntelTdx) {
+ EfiPeiPpiDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTableUp;
+ } else {
+ EfiPeiPpiDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTableMp;
+ }
+
+ //
// Transfer the control to the PEI core
//
- (*PeiCoreEntryPoint)(SecCoreData, (EFI_PEI_PPI_DESCRIPTOR *)&mPrivateDispatchTable);
+ (*PeiCoreEntryPoint)(SecCoreData, EfiPeiPpiDescriptor);
//
// If we get here then the PEI Core returned, which is not recoverable.
diff --git a/OvmfPkg/Sec/SecMain.inf b/OvmfPkg/Sec/SecMain.inf
index 1557b5f4a8..561a840f29 100644
--- a/OvmfPkg/Sec/SecMain.inf
+++ b/OvmfPkg/Sec/SecMain.inf
@@ -59,6 +59,8 @@
[Ppis]
gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED
+ gEfiPeiMpInitLibMpDepPpiGuid
+ gEfiPeiMpInitLibUpDepPpiGuid
[Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase