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]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to