Fan: Please separate the patch for the different packages. Thanks Liming > -----邮件原件----- > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Wang Fan > 发送时间: 2023年12月11日 17:06 > 收件人: devel@edk2.groups.io > 抄送: Fan Wang <fan.w...@intel.com>; Michael D Kinney > <michael.d.kin...@intel.com>; Liming Gao <gaolim...@byosoft.com.cn>; > Ray Ni <ray...@intel.com>; Guomin Jiang <guomin.ji...@intel.com>; Jian J > Wang <jian.j.w...@intel.com> > 主题: [edk2-devel] [PATCH v4 1/1] MdeModulePkg: Support customized FV > Migration Information > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4533 > > There are use cases which not all FVs need be migrated from TempRam to > permanent memory before TempRam tears down. This new guid is introduced > to avoid unnecessary FV migration to improve boot performance. Platform > can publish MigrationInfo hob with this guid to customize FV migration > info, and PeiCore will only migrate FVs indicated by this Hob info. > > This is a backwards compatible change, PeiCore will check MigrationInfo > hob before migration. If MigrationInfo hobs exists, only migrate FVs > recorded by hobs. If MigrationInfo hobs not exists, migrate all FVs to > permanent memory. > > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Liming Gao <gaolim...@byosoft.com.cn> > Cc: Ray Ni <ray...@intel.com> > Cc: Guomin Jiang <guomin.ji...@intel.com> > Cc: Jian J Wang <jian.j.w...@intel.com> > Signed-off-by: Fan Wang <fan.w...@intel.com> > --- > MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 79 > +++++++++++++------ > MdeModulePkg/Core/Pei/PeiMain.inf | 1 + > MdeModulePkg/Include/Guid/MigratedFvInfo.h | 42 +++++++++- > MdeModulePkg/MdeModulePkg.dec | 3 +- > SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c | 7 +- > SecurityPkg/Tcg/TcgPei/TcgPei.c | 7 +- > 6 files changed, 111 insertions(+), 28 deletions(-) > > diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c > b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c > index 5f32ebb560..0086087e82 100644 > --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c > +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c > @@ -1184,7 +1184,12 @@ EvacuateTempRam ( > > > PEI_CORE_FV_HANDLE PeiCoreFvHandle; > > EFI_PEI_CORE_FV_LOCATION_PPI *PeiCoreFvLocationPpi; > > + EFI_PEI_HOB_POINTERS Hob; > > + EDKII_MIGRATION_INFO *MigrationInfo; > > + TO_MIGRATE_FV_INFO *ToMigrateFvInfo; > > + UINT32 FvMigrationFlags; > > EDKII_MIGRATED_FV_INFO MigratedFvInfo; > > + UINTN Index; > > > > ASSERT (Private->PeiMemoryInstalled); > > > > @@ -1211,6 +1216,13 @@ EvacuateTempRam ( > > > ConvertPeiCorePpiPointers (Private, &PeiCoreFvHandle); > > > > + Hob.Raw = GetFirstGuidHob (&gEdkiiMigrationInfoGuid); > > + if (Hob.Raw != NULL) { > > + MigrationInfo = GET_GUID_HOB_DATA (Hob); > > + } else { > > + MigrationInfo = NULL; > > + } > > + > > for (FvIndex = 0; FvIndex < Private->FvCount; FvIndex++) { > > FvHeader = Private->Fv[FvIndex].FvHeader; > > ASSERT (FvHeader != NULL); > > @@ -1224,20 +1236,27 @@ EvacuateTempRam ( > ) > > ) > > { > > - // > > - // Allocate page to save the rebased PEIMs, the PEIMs will get > dispatched later. > > - // > > - Status = PeiServicesAllocatePages ( > > - EfiBootServicesCode, > > - EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength), > > - &FvHeaderAddress > > - ); > > - ASSERT_EFI_ERROR (Status); > > - MigratedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER > *)(UINTN)FvHeaderAddress; > > + if ((MigrationInfo == NULL) || (MigrationInfo->MigrateAll == TRUE)) { > > + // Migrate all FVs and copy raw data > > + FvMigrationFlags = FLAGS_FV_RAW_DATA_COPY; > > + } else { > > + for (Index = 0; Index < MigrationInfo->ToMigrateFvCount; Index++) > { > > + ToMigrateFvInfo = ((TO_MIGRATE_FV_INFO *)(MigrationInfo + > 1)) + Index; > > + if (ToMigrateFvInfo->FvOrgBaseOnTempRam == > (UINT32)(UINTN)FvHeader) { > > + // This FV is to migrate > > + FvMigrationFlags = ToMigrateFvInfo->FvMigrationFlags; > > + break; > > + } > > + } > > + > > + if (Index == MigrationInfo->ToMigrateFvCount) { > > + // This FV is not expected to migrate > > + continue; > > + } > > + } > > > > // > > - // Allocate pool to save the raw PEIMs, which is used to keep > consistent context across > > - // multiple boot and PCR0 will keep the same no matter if the > address of allocated page is changed. > > + // Allocate pages to save the rebased PEIMs, the PEIMs will get > dispatched later. > > // > > Status = PeiServicesAllocatePages ( > > EfiBootServicesCode, > > @@ -1245,7 +1264,8 @@ EvacuateTempRam ( > &FvHeaderAddress > > ); > > ASSERT_EFI_ERROR (Status); > > - RawDataFvHeader = (EFI_FIRMWARE_VOLUME_HEADER > *)(UINTN)FvHeaderAddress; > > + MigratedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER > *)(UINTN)FvHeaderAddress; > > + CopyMem (MigratedFvHeader, FvHeader, > (UINTN)FvHeader->FvLength); > > > > DEBUG (( > > DEBUG_VERBOSE, > > @@ -1256,17 +1276,34 @@ EvacuateTempRam ( > )); > > > > // > > - // Copy the context to the rebased pages and raw pages, and create > hob to save the > > - // information. The MigratedFvInfo HOB will never be produced when > > - // PcdMigrateTemporaryRamFirmwareVolumes is FALSE, because the > PCD control the > > - // feature. > > + // Create hob to save MigratedFvInfo, this hob will only be produced > when > > + // Migration feature PCD > PcdMigrateTemporaryRamFirmwareVolumes is set to TRUE. > > // > > - CopyMem (MigratedFvHeader, FvHeader, > (UINTN)FvHeader->FvLength); > > - CopyMem (RawDataFvHeader, MigratedFvHeader, > (UINTN)FvHeader->FvLength); > > MigratedFvInfo.FvOrgBase = (UINT32)(UINTN)FvHeader; > > MigratedFvInfo.FvNewBase = (UINT32)(UINTN)MigratedFvHeader; > > - MigratedFvInfo.FvDataBase = (UINT32)(UINTN)RawDataFvHeader; > > + MigratedFvInfo.FvDataBase = 0; > > MigratedFvInfo.FvLength = > (UINT32)(UINTN)FvHeader->FvLength; > > + > > + // > > + // When FLAGS_FV_RAW_DATA_COPY bit is set, copy the context to > the raw pages and > > + // reset raw data base address in MigratedFvInfo hob. > > + // > > + if ((FvMigrationFlags & FLAGS_FV_RAW_DATA_COPY) == > FLAGS_FV_RAW_DATA_COPY) { > > + DEBUG ((DEBUG_INFO, " Copying Raw Data ...\n")); > > + // > > + // Allocate pages to save the raw PEIMs > > + // > > + Status = PeiServicesAllocatePages ( > > + EfiBootServicesCode, > > + EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength), > > + &FvHeaderAddress > > + ); > > + ASSERT_EFI_ERROR (Status); > > + RawDataFvHeader = (EFI_FIRMWARE_VOLUME_HEADER > *)(UINTN)FvHeaderAddress; > > + CopyMem (RawDataFvHeader, MigratedFvHeader, > (UINTN)FvHeader->FvLength); > > + MigratedFvInfo.FvDataBase = > (UINT32)(UINTN)RawDataFvHeader; > > + } > > + > > BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid, &MigratedFvInfo, > sizeof (MigratedFvInfo)); > > > > // > > @@ -1330,8 +1367,6 @@ EvacuateTempRam ( > } > > } > > > > - RemoveFvHobsInTemporaryMemory (Private); > > - > > return Status; > > } > > > > diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf > b/MdeModulePkg/Core/Pei/PeiMain.inf > index 0cf357371a..893bdc0527 100644 > --- a/MdeModulePkg/Core/Pei/PeiMain.inf > +++ b/MdeModulePkg/Core/Pei/PeiMain.inf > @@ -78,6 +78,7 @@ > gEfiFirmwareFileSystem3Guid > > gStatusCodeCallbackGuid > > gEdkiiMigratedFvInfoGuid ## > SOMETIMES_PRODUCES ## HOB > > + gEdkiiMigrationInfoGuid ## > SOMETIMES_CONSUMES ## HOB > > > > [Ppis] > > gEfiPeiStatusCodePpiGuid ## > SOMETIMES_CONSUMES # PeiReportStatusService is not ready if this PPI > doesn't exist > > diff --git a/MdeModulePkg/Include/Guid/MigratedFvInfo.h > b/MdeModulePkg/Include/Guid/MigratedFvInfo.h > index aca2332a0e..1c8b0dfefc 100644 > --- a/MdeModulePkg/Include/Guid/MigratedFvInfo.h > +++ b/MdeModulePkg/Include/Guid/MigratedFvInfo.h > @@ -9,13 +9,53 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > #ifndef __EDKII_MIGRATED_FV_INFO_GUID_H__ > > #define __EDKII_MIGRATED_FV_INFO_GUID_H__ > > > > +// > > +// FLAGS_FV_RAW_DATA_COPY indicates FV raw data will be copied to > permanent memory > > +// or not. When FV is migrated to permanent memory, it will be rebased and > raw > > +// data will be lost. This bit can be configured as below values: > > +// 0: FV raw data will not be used in later phase, and the copy will be skipped > to > > +// optimize boot performance. > > +// 1: FV raw data will be copied to permanent memory for later phase use > (such as > > +// FV measurement). > > +// > > +#define FLAGS_FV_RAW_DATA_COPY BIT0 > > + > > +/// > > +/// In real use cases, not all FVs need migrate to permanent memory before > TempRam tears > > +/// down. EDKII_MIGRATION_INFO hob should be published by platform to > indicate which > > +/// FVs need migration to optimize boot performance. If this hob is not > detected by Pei > > +/// Core, all FVs on TempRam will be migrated and FV raw data will also be > copied. > > +/// Only one EDKII_MIGRATION_INFO hob should be published by platform, > and this hob will > > +/// take effect only when migration feature is enabled by PCD. > > +/// > > +typedef struct { > > + UINT32 FvOrgBaseOnTempRam; // Original FV address on > Temporary Ram > > + // > > + // FV Migration Flags: > > + // Bit0: Indicate to copy FV raw data or not > > + // Others: Reserved bits > > + // > > + UINT32 FvMigrationFlags; > > +} TO_MIGRATE_FV_INFO; > > + > > +typedef struct { > > + BOOLEAN MigrateAll; // Migrate all FVs and > also copy FV raw data > > + // > > + // ToMigrateFvCount and ToMigrateFvInfo array indicate which FVs need > be migrated, and > > + // these info should be ignored when MigrateAll field is set to TRUE. > > + // > > + UINT32 ToMigrateFvCount; > > + // TO_MIGRATE_FV_INFO ToMigrateFvInfo[]; > > +} EDKII_MIGRATION_INFO; > > + > > typedef struct { > > UINT32 FvOrgBase; // original FV address > > UINT32 FvNewBase; // new FV address > > - UINT32 FvDataBase; // original FV data > > + UINT32 FvDataBase; // original FV data, 0 means raw data is > not copied > > UINT32 FvLength; // Fv Length > > } EDKII_MIGRATED_FV_INFO; > > > > +extern EFI_GUID gEdkiiMigrationInfoGuid; > > extern EFI_GUID gEdkiiMigratedFvInfoGuid; > > > > #endif // #ifndef __EDKII_MIGRATED_FV_INFO_GUID_H__ > > diff --git a/MdeModulePkg/MdeModulePkg.dec > b/MdeModulePkg/MdeModulePkg.dec > index 1a162e97e6..a2cd83345f 100644 > --- a/MdeModulePkg/MdeModulePkg.dec > +++ b/MdeModulePkg/MdeModulePkg.dec > @@ -421,7 +421,8 @@ > gEdkiiCapsuleOnDiskNameGuid = { 0x98c80a4f, 0xe16b, 0x4d11, { 0x93, > 0x9a, 0xab, 0xe5, 0x61, 0x26, 0x3, 0x30 } } > > > > ## Include/Guid/MigratedFvInfo.h > > - gEdkiiMigratedFvInfoGuid = { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4, > 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } } > > + gEdkiiMigrationInfoGuid = { 0xb4b140a5, 0x72f6, 0x4c21, { 0x93, 0xe4, > 0xac, 0xc4, 0xec, 0xcb, 0x23, 0x23 } } > > + gEdkiiMigratedFvInfoGuid = { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4, > 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } } > > > > ## Include/Guid/RngAlgorithm.h > > gEdkiiRngAlgorithmUnSafe = { 0x869f728c, 0x409d, 0x4ab4, {0xac, 0x03, > 0x71, 0xd3, 0x09, 0xc1, 0xb3, 0xf4 }} > > diff --git a/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c > b/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c > index 1caaa4e319..daaf49e644 100644 > --- a/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c > +++ b/SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.c > @@ -726,8 +726,11 @@ MeasureFvImage ( > // > > // Found the migrated FV info > > // > > - FvOrgBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvOrgBase; > > - FvDataBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvDataBase; > > + FvOrgBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvOrgBase; > > + if (MigratedFvInfo->FvDataBase != 0) { > > + FvDataBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvDataBase; > > + } > > + > > break; > > } > > > > diff --git a/SecurityPkg/Tcg/TcgPei/TcgPei.c b/SecurityPkg/Tcg/TcgPei/TcgPei.c > index 5aa80511aa..d35c2ad0bc 100644 > --- a/SecurityPkg/Tcg/TcgPei/TcgPei.c > +++ b/SecurityPkg/Tcg/TcgPei/TcgPei.c > @@ -463,8 +463,11 @@ MeasureFvImage ( > // > > // Found the migrated FV info > > // > > - FvOrgBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvOrgBase; > > - FvDataBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvDataBase; > > + FvOrgBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvOrgBase; > > + if (MigratedFvInfo->FvDataBase != 0) { > > + FvDataBase = > (EFI_PHYSICAL_ADDRESS)(UINTN)MigratedFvInfo->FvDataBase; > > + } > > + > > break; > > } > > > > -- > 2.26.2.windows.1 > > > > -=-=-=-=-=-= > Groups.io Links: You receive all messages sent to this group. > View/Reply Online (#112276): > https://edk2.groups.io/g/devel/message/112276 > Mute This Topic: https://groups.io/mt/103105558/4905953 > Group Owner: devel+ow...@edk2.groups.io > Unsubscribe: https://edk2.groups.io/g/devel/unsub > [gaolim...@byosoft.com.cn] > -=-=-=-=-=-= >
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#112350): https://edk2.groups.io/g/devel/message/112350 Mute This Topic: https://groups.io/mt/103121557/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-