Fan:
  I add my comment below. 

> -----邮件原件-----
> 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Wang Fan
> 发送时间: 2023年10月27日 16:24
> 收件人: Kinney, Michael D <michael.d.kin...@intel.com>;
> devel@edk2.groups.io
> 抄送: Gao, Liming <gaolim...@byosoft.com.cn>; Jiang, Guomin
> <guomin.ji...@intel.com>; Bi, Dandan <dandan...@intel.com>
> 主题: Re: [edk2-devel] [PATCH V2 1/1] MdeModulePkg: Support customized
> FV Migration Information
> 
> Hi Mike
> 
> Thank you for your feedback.
> 
> I have updated the patch to v3:
> https://edk2.groups.io/g/devel/message/110197
> 
> Pull Request: https://github.com/tianocore/edk2/pull/4970
> 
> Based on V2, this update includes changes:
> - Add more descriptions for "gEdkiiToMigrateFvInfoGuid" PPI usages and
> background, but still keep the name.
> - Update "FvOrgBase" to "FvTemporaryRamBase" in
> EDKII_TO_MIGRATE_FV_INFO.
> - Remove flag "FLAGS_SKIP_FV_MIGRATION", since it's not needed.
> - Add more descriptions to flag "FLAGS_SKIP_FV_RAW_DATA_COPY".
[Liming] RAW_DATA_COPY is for measure boot to make sure PCR0 have the same
value on the different boot. 
If RAW_DATA_COPY is not set, it will impact the measure boot. So, I don't
think we can skip raw data copy. 

> - Remove the variable MigrateAllFvs to simplify logic.
> - Correct "allocate pool" to "allocate pages" to align with descriptions.
> 
> For other two questions you are mentioning:
> 
> 1. For "Should FvOrgBase be a UINT64 or support temp RAM above 4GB?":
> I think UINT32 should be enough, all pre-mem FVs are below 4G as far as I
> know, even we enabled X64 in pre-mem phase. This setting is also aligning
> with "FvOrgBase" defined in "EDKII_MIGRATED_FV_INFO".
> 2. For "The call to RemoveFvHobsInTemporaryMemory (Private) was
> removed":
> Since this function will remove all FV hobs for physical addresses, it
should be
> called only when all pre-mem FVs are migrated. In EvacuateTempRam(), when
> one FV is migrated, ConvertFvHob() will be called for this FV and all its'
child
> FVs, this is enough to ensure already migrated FV hobs are all pointing to
> addresses on permanent address.
> 
[Liming] So, RemoveFvHobsInTemporaryMemory () does nothing now. Right? 
If yes, it is safe to remove it. 

Thanks
Liming
> What do you think?
> 
> Best Regards
> Fan
> 
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kin...@intel.com>
> Sent: Tuesday, October 17, 2023 5:00 AM
> To: Wang, Fan <fan.w...@intel.com>; devel@edk2.groups.io
> Cc: Gao, Liming <gaolim...@byosoft.com.cn>; Jiang, Guomin
> <guomin.ji...@intel.com>; Bi, Dandan <dandan...@intel.com>; Kinney,
> Michael D <michael.d.kin...@intel.com>
> Subject: RE: [PATCH V2 1/1] MdeModulePkg: Support customized FV
> Migration Information
> 
> Hi Fan,
> 
> The logic looks functional, but there are some names and descriptions that
> could be added to help describe this feature and some code changes to make
> the code easier to understand.
> 
> 1) The GUID gEdkiiToMigrateFvInfoGuid is hard to understand what
>    information it conveys from the name of the GUID variable.
>    I know that the intent is that it is a GUID with data that
>    tells the PEI core which FVs in temporary RAM should be
>    migrated to permanent RAM.  And that the use of this information
>    is only a performance optimization to not migrate FVs that
>    are not needed after the PEI Core migrates temp RAM to
>    permanent RAM.  The name and description in comments do not
>    express all these details.
> 
> 2) The structure name EDKII_TO_MIGRATE_FV_INFO has the same
>    issue as (1).
>    a) Should FvOrgBase be a UINT64 or support temp RAM above 4GB?
>    b) Since only temp RAM to perm RAM migrations are supported
>       the field name "FvOrgBase" should be "FvTemporaryRamBase".
> 
> 
> 3) The #define for FLAGS_SKIP_FV_MIGRATION should have a comment
>    block that describes the meaning of this bit.  What is the
>    meaning when the bit is set and what is the meaning when the
>    bit is clear.
> 
> 4) The #define for FLAGS_SKIP_FV_RAW_DATA_COPY should have a comment
>    block that describes the meaning of this bit.  What is the
>    meaning when the bit is set and what is the meaning when the
>    bit is clear.
> 
> 5) Why are there 2 bits?  If an FV is skipped, then that means
>    do not copy.  If an FV is not skipped, then that means do
>    copy.
> 
> 6) I think the variable MigrateAllFvs can be removed, and the HOB
>    list check can be made for gEdkiiToMigrateFvInfoGuid can be made
>    on each FV found in temporary RAM.  This looks like a performance
>    optimization that makes the logic harder to understand and it
>    is not clear that the performance optimization has any benefit.
> 
> 7) The call to RemoveFvHobsInTemporaryMemory (Private) was removed.
> Why?
> 
> 8) The comment where memory is allocated for the migrated FV says
>    "allocate pool" when PeiServicesAllocatePages() is used.  Please
>    update the comment.
> 
> Mike
> 
> 
> 
> > -----Original Message-----
> > From: Wang, Fan <fan.w...@intel.com>
> > Sent: Monday, September 11, 2023 2:52 AM
> > To: devel@edk2.groups.io
> > Cc: Wang, Fan <fan.w...@intel.com>; Kinney, Michael D
> > <michael.d.kin...@intel.com>; Gao, Liming <gaolim...@byosoft.com.cn>;
> > Jiang, Guomin <guomin.ji...@intel.com>; Bi, Dandan
> > <dandan...@intel.com>
> > Subject: [PATCH V2 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 ToMigrateFvInfo 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
> > ToMigrateFvInfo hob before migration. If ToMigrateFvInfo hobs exists,
> > only migrate FVs recorded by hobs. If ToMigrateFvInfo 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: Guomin Jiang <guomin.ji...@intel.com>
> > Cc: Dandan Bi <dandan...@intel.com>
> > Signed-off-by: Wang Fan <fan.w...@intel.com>
> > ---
> >  MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 82
> +++++++++++++-----
> > -
> >  MdeModulePkg/Core/Pei/PeiMain.inf             |  1 +
> >  MdeModulePkg/Include/Guid/MigratedFvInfo.h    | 19 +++++
> >  MdeModulePkg/MdeModulePkg.dec                 |  3 +-
> >  4 files changed, 79 insertions(+), 26 deletions(-)
> >
> > diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> > b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> > index 5f32ebb560ae..e84849ec6db1 100644
> > --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> > +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
> > @@ -1184,7 +1184,11 @@ EvacuateTempRam (
> >
> >    PEI_CORE_FV_HANDLE            PeiCoreFvHandle;
> >    EFI_PEI_CORE_FV_LOCATION_PPI  *PeiCoreFvLocationPpi;
> > +  EDKII_TO_MIGRATE_FV_INFO      *ToMigrateFvInfo;
> >    EDKII_MIGRATED_FV_INFO        MigratedFvInfo;
> > +  EFI_PEI_HOB_POINTERS          Hob;
> > +  BOOLEAN                       MigrateAllFvs;
> > +  UINT32                        MigrationFlags;
> >
> >    ASSERT (Private->PeiMemoryInstalled);
> >
> > @@ -1211,6 +1215,17 @@ EvacuateTempRam (
> >
> >    ConvertPeiCorePpiPointers (Private, &PeiCoreFvHandle);
> >
> > +  //
> > +  // Check if platform defined hobs to indicate which FVs are
> > expected to migrate or keep raw data.
> > +  // If ToMigrateFvInfo hobs exists, only migrate FVs recorded by
> > hobs.
> > +  // If ToMigrateFvInfo hobs not exists, migrate all FVs to permanent
> > memory.
> > +  //
> > +  MigrateAllFvs = TRUE;
> > +  Hob.Raw       = GetFirstGuidHob (&gEdkiiToMigrateFvInfoGuid);
> > +  if (Hob.Raw != NULL) {
> > +    MigrateAllFvs = FALSE;
> > +  }
> > +
> >    for (FvIndex = 0; FvIndex < Private->FvCount; FvIndex++) {
> >      FvHeader = Private->Fv[FvIndex].FvHeader;
> >      ASSERT (FvHeader != NULL);
> > @@ -1224,6 +1239,25 @@ EvacuateTempRam (
> >            )
> >          )
> >      {
> > +      if (MigrateAllFvs) {
> > +        MigrationFlags = 0;
> > +      } else {
> > +        MigrationFlags = FLAGS_SKIP_FV_MIGRATION |
> > FLAGS_SKIP_FV_RAW_DATA_COPY;
> > +        Hob.Raw = GetFirstGuidHob (&gEdkiiToMigrateFvInfoGuid);
> > +        while (Hob.Raw != NULL) {
> > +          ToMigrateFvInfo = GET_GUID_HOB_DATA (Hob);
> > +          if (ToMigrateFvInfo->FvOrgBase ==
> (UINT32)(UINTN)FvHeader)
> > {
> > +            MigrationFlags = ToMigrateFvInfo->MigrationFlags;
> > +            break;
> > +          }
> > +          Hob.Raw = GET_NEXT_HOB (Hob);
> > +          Hob.Raw = GetNextGuidHob (&gEdkiiToMigrateFvInfoGuid,
> > Hob.Raw);
> > +        }
> > +      }
> > +      if (MigrationFlags & FLAGS_SKIP_FV_MIGRATION) {
> > +        continue;
> > +      }
> > +
> >        //
> >        // Allocate page to save the rebased PEIMs, the PEIMs will get
> > dispatched later.
> >        //
> > @@ -1234,18 +1268,7 @@ EvacuateTempRam (
> >                    );
> >        ASSERT_EFI_ERROR (Status);
> >        MigratedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER
> > *)(UINTN)FvHeaderAddress;
> > -
> > -      //
> > -      // 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.
> > -      //
> > -      Status =  PeiServicesAllocatePages (
> > -                  EfiBootServicesCode,
> > -                  EFI_SIZE_TO_PAGES ((UINTN)FvHeader->FvLength),
> > -                  &FvHeaderAddress
> > -                  );
> > -      ASSERT_EFI_ERROR (Status);
> > -      RawDataFvHeader = (EFI_FIRMWARE_VOLUME_HEADER
> > *)(UINTN)FvHeaderAddress;
> > +      CopyMem (MigratedFvHeader, FvHeader, (UINTN)FvHeader-
> > >FvLength);
> >
> >        DEBUG ((
> >          DEBUG_VERBOSE,
> > @@ -1256,18 +1279,29 @@ 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.
> > +      // Copy the context to the raw pages, and create hob to save
> > the information. The MigratedFvInfo
> > +      // HOB will never be produced when
> > PcdMigrateTemporaryRamFirmwareVolumes is FALSE, because the PCD
> > +      // controls the feature.
> >        //
> > -      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.FvLength   =
> (UINT32)(UINTN)FvHeader->FvLength;
> > -      BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid, &MigratedFvInfo,
> > sizeof (MigratedFvInfo));
> > +      if ((MigrationFlags & FLAGS_SKIP_FV_RAW_DATA_COPY) !=
> > FLAGS_SKIP_FV_RAW_DATA_COPY) {
> > +        //
> > +        // 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.
> > +        //
> > +        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.FvOrgBase  = (UINT32)(UINTN)FvHeader;
> > +        MigratedFvInfo.FvNewBase  =
> (UINT32)(UINTN)MigratedFvHeader;
> > +        MigratedFvInfo.FvDataBase =
> (UINT32)(UINTN)RawDataFvHeader;
> > +        MigratedFvInfo.FvLength   = (UINT32)(UINTN)FvHeader-
> > >FvLength;
> > +        BuildGuidDataHob (&gEdkiiMigratedFvInfoGuid,
> &MigratedFvInfo,
> > sizeof (MigratedFvInfo));
> > +      }
> >
> >        //
> >        // Migrate any children for this FV now @@ -1330,8 +1364,6 @@
> > EvacuateTempRam (
> >      }
> >    }
> >
> > -  RemoveFvHobsInTemporaryMemory (Private);
> > -
> >    return Status;
> >  }
> >
> > diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf
> > b/MdeModulePkg/Core/Pei/PeiMain.inf
> > index 0cf357371a16..944b230b0e19 100644
> > --- a/MdeModulePkg/Core/Pei/PeiMain.inf
> > +++ b/MdeModulePkg/Core/Pei/PeiMain.inf
> > @@ -78,6 +78,7 @@
> >    gEfiFirmwareFileSystem3Guid
> >    gStatusCodeCallbackGuid
> >    gEdkiiMigratedFvInfoGuid                      ##
> SOMETIMES_PRODUCES
> > ## HOB
> > +  gEdkiiToMigrateFvInfoGuid                     ##
> 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 aca2332a0ec6..543cd9ba7ddd 100644
> > --- a/MdeModulePkg/Include/Guid/MigratedFvInfo.h
> > +++ b/MdeModulePkg/Include/Guid/MigratedFvInfo.h
> > @@ -9,6 +9,24 @@ SPDX-License-Identifier: BSD-2-Clause-Patent  #ifndef
> > __EDKII_MIGRATED_FV_INFO_GUID_H__  #define
> > __EDKII_MIGRATED_FV_INFO_GUID_H__
> >
> > +#define FLAGS_SKIP_FV_MIGRATION        BIT0
> > +#define FLAGS_SKIP_FV_RAW_DATA_COPY    BIT1
> > +
> > +///
> > +/// EDKII_TO_MIGRATE_FV_INFO Hob information should be published by
> > platform to indicate
> > +/// one FV is expected to migrate to permarnant memory or not before
> > TempRam tears down.
> > +///
> > +typedef struct {
> > +  UINT32     FvOrgBase;        // original FV address
> > +  //
> > +  // Migration Flags:
> > +  // Bit0: Indicate to skip FV migration or not
> > +  // Bit1: Indicate to skip FV raw data copy or not
> > +  // Others: Reserved bits
> > +  //
> > +  UINT32     MigrationFlags;
> > +} EDKII_TO_MIGRATE_FV_INFO;
> > +
> >  typedef struct {
> >    UINT32    FvOrgBase;         // original FV address
> >    UINT32    FvNewBase;         // new FV address
> > @@ -16,6 +34,7 @@ typedef struct {
> >    UINT32    FvLength;          // Fv Length
> >  } EDKII_MIGRATED_FV_INFO;
> >
> > +extern EFI_GUID  gEdkiiToMigrateFvInfoGuid;
> >  extern EFI_GUID  gEdkiiMigratedFvInfoGuid;
> >
> >  #endif // #ifndef __EDKII_MIGRATED_FV_INFO_GUID_H__ diff --git
> > a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index
> > dd182c02fdf6..d6cbcc721a5e 100644
> > --- a/MdeModulePkg/MdeModulePkg.dec
> > +++ b/MdeModulePkg/MdeModulePkg.dec
> > @@ -416,7 +416,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 } }
> > +  gEdkiiToMigrateFvInfoGuid = { 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 }}
> > --
> > 2.29.2.windows.2
> 
> 
> 
> 
> 





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#111955): https://edk2.groups.io/g/devel/message/111955
Mute This Topic: https://groups.io/mt/102906881/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to