public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wang, Jian J" <jian.j.wang@intel.com>
To: "Zeng, Star" <star.zeng@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Wu, Hao A" <hao.a.wu@intel.com>,
	"Gao, Liming" <liming.gao@intel.com>,
	"Ni, Ruiyu" <ruiyu.ni@intel.com>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>,
	"Desimone, Nathaniel L" <nathaniel.l.desimone@intel.com>,
	"Chiu, Chasel" <chasel.chiu@intel.com>
Subject: Re: [PATCH 3/7] MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxFvSupported
Date: Tue, 18 Dec 2018 02:10:41 +0000	[thread overview]
Message-ID: <D827630B58408649ACB04F44C510003624EC1B69@SHSMSX103.ccr.corp.intel.com> (raw)
In-Reply-To: <1544783322-17436-4-git-send-email-star.zeng@intel.com>

Reviewed-by: Jian J Wang <jian.j.wang@intel.com>

> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, December 14, 2018 6:29 PM
> To: edk2-devel@lists.01.org
> Cc: Zeng, Star <star.zeng@intel.com>; Wang, Jian J <jian.j.wang@intel.com>;
> Wu, Hao A <hao.a.wu@intel.com>; Gao, Liming <liming.gao@intel.com>; Ni,
> Ruiyu <ruiyu.ni@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>; Chiu, Chasel
> <chasel.chiu@intel.com>
> Subject: [PATCH 3/7] MdeModulePkg PeiCore: Remove the using of
> PcdPeiCoreMaxFvSupported
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1405
> 
> Background as below.
> 
> Problem:
> As static configuration from the PCDs, the binary PeiCore (for example
> in FSP binary with dispatch mode) could not predict how many FVs,
> Files or PPIs for different platforms.
> 
> Burden:
> Platform developers need configure the PCDs accordingly for different
> platforms.
> 
> To solve the problem and remove the burden, we can update PeiCore to
> remove the using of PcdPeiCoreMaxFvSupported, PcdPeiCoreMaxPeimPerFv
> and PcdPeiCoreMaxPpiSupported by extending buffer dynamically for FV,
> File and PPI management.
> 
> This patch removes the using of PcdPeiCoreMaxFvSupported in PeiCore.
> 
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Hao Wu <hao.a.wu@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Star Zeng <star.zeng@intel.com>
> ---
>  MdeModulePkg/Core/Pei/FwVol/FwVol.c     | 67
> ++++++++++++++++++++++++++-------
>  MdeModulePkg/Core/Pei/PeiMain.h         | 15 +++++++-
>  MdeModulePkg/Core/Pei/PeiMain.inf       |  1 -
>  MdeModulePkg/Core/Pei/PeiMain/PeiMain.c | 16 ++++----
>  4 files changed, 75 insertions(+), 24 deletions(-)
> 
> diff --git a/MdeModulePkg/Core/Pei/FwVol/FwVol.c
> b/MdeModulePkg/Core/Pei/FwVol/FwVol.c
> index 5629c9a1ce20..0a67b96bf1e3 100644
> --- a/MdeModulePkg/Core/Pei/FwVol/FwVol.c
> +++ b/MdeModulePkg/Core/Pei/FwVol/FwVol.c
> @@ -503,6 +503,10 @@ PeiInitializeFv (
>                      );
>    ASSERT_EFI_ERROR (Status);
> 
> +  PrivateData->Fv = AllocateZeroPool (sizeof (PEI_CORE_FV_HANDLE) *
> FV_GROWTH_STEP);
> +  ASSERT (PrivateData->Fv != NULL);
> +  PrivateData->MaxFvCount = FV_GROWTH_STEP;
> +
>    //
>    // Update internal PEI_CORE_FV array.
>    //
> @@ -560,6 +564,7 @@ FirmwareVolmeInfoPpiNotifyCallback (
>    VOID                                  *DepexData;
>    BOOLEAN                               IsFvInfo2;
>    UINTN                                 CurFvCount;
> +  VOID                                  *TempPtr;
> 
>    Status       = EFI_SUCCESS;
>    PrivateData  = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
> @@ -626,10 +631,21 @@ FirmwareVolmeInfoPpiNotifyCallback (
>        }
>      }
> 
> -    if (PrivateData->FvCount >= PcdGet32 (PcdPeiCoreMaxFvSupported)) {
> -      DEBUG ((EFI_D_ERROR, "The number of Fv Images (%d) exceed the max
> supported FVs (%d) in Pei", PrivateData->FvCount + 1, PcdGet32
> (PcdPeiCoreMaxFvSupported)));
> -      DEBUG ((EFI_D_ERROR, "PcdPeiCoreMaxFvSupported value need be
> reconfigurated in DSC"));
> -      ASSERT (FALSE);
> +    if (PrivateData->FvCount >= PrivateData->MaxFvCount) {
> +      //
> +      // Run out of room, grow the buffer.
> +      //
> +      TempPtr = AllocateZeroPool (
> +                  sizeof (PEI_CORE_FV_HANDLE) * (PrivateData->MaxFvCount +
> FV_GROWTH_STEP)
> +                  );
> +      ASSERT (TempPtr != NULL);
> +      CopyMem (
> +        TempPtr,
> +        PrivateData->Fv,
> +        sizeof (PEI_CORE_FV_HANDLE) * PrivateData->MaxFvCount
> +        );
> +      PrivateData->Fv = TempPtr;
> +      PrivateData->MaxFvCount = PrivateData->MaxFvCount +
> FV_GROWTH_STEP;
>      }
> 
>      //
> @@ -2157,7 +2173,6 @@ FindNextCoreFvHandle (
>      }
>    }
> 
> -  ASSERT (Private->FvCount <= PcdGet32 (PcdPeiCoreMaxFvSupported));
>    if (Instance >= Private->FvCount) {
>      return NULL;
>    }
> @@ -2205,7 +2220,7 @@ PeiReinitializeFv (
>    //
>    // Fixup all FvPpi pointers for the implementation in flash to permanent
> memory.
>    //
> -  for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {
> +  for (Index = 0; Index < PrivateData->FvCount; Index ++) {
>      if (PrivateData->Fv[Index].FvPpi == OldFfsFvPpi) {
>        PrivateData->Fv[Index].FvPpi = &mPeiFfs2FwVol.Fv;
>      }
> @@ -2233,7 +2248,7 @@ PeiReinitializeFv (
>    //
>    // Fixup all FvPpi pointers for the implementation in flash to permanent
> memory.
>    //
> -  for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {
> +  for (Index = 0; Index < PrivateData->FvCount; Index ++) {
>      if (PrivateData->Fv[Index].FvPpi == OldFfsFvPpi) {
>        PrivateData->Fv[Index].FvPpi = &mPeiFfs3FwVol.Fv;
>      }
> @@ -2263,9 +2278,23 @@ AddUnknownFormatFvInfo (
>    )
>  {
>    PEI_CORE_UNKNOW_FORMAT_FV_INFO    *NewUnknownFv;
> +  VOID                              *TempPtr;
> 
> -  if (PrivateData->UnknownFvInfoCount + 1 >= PcdGet32
> (PcdPeiCoreMaxFvSupported)) {
> -    return EFI_OUT_OF_RESOURCES;
> +  if (PrivateData->UnknownFvInfoCount >= PrivateData-
> >MaxUnknownFvInfoCount) {
> +    //
> +    // Run out of room, grow the buffer.
> +    //
> +    TempPtr = AllocateZeroPool (
> +                sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * (PrivateData-
> >MaxUnknownFvInfoCount + FV_GROWTH_STEP)
> +                );
> +    ASSERT (TempPtr != NULL);
> +    CopyMem (
> +      TempPtr,
> +      PrivateData->UnknownFvInfo,
> +      sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PrivateData-
> >MaxUnknownFvInfoCount
> +      );
> +    PrivateData->UnknownFvInfo = TempPtr;
> +    PrivateData->MaxUnknownFvInfoCount = PrivateData-
> >MaxUnknownFvInfoCount + FV_GROWTH_STEP;
>    }
> 
>    NewUnknownFv = &PrivateData->UnknownFvInfo[PrivateData-
> >UnknownFvInfoCount];
> @@ -2368,6 +2397,7 @@ ThirdPartyFvPpiNotifyCallback (
>    EFI_PEI_FILE_HANDLE          FileHandle;
>    VOID                         *DepexData;
>    UINTN                        CurFvCount;
> +  VOID                         *TempPtr;
> 
>    PrivateData  = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
>    FvPpi = (EFI_PEI_FIRMWARE_VOLUME_PPI*) Ppi;
> @@ -2403,10 +2433,21 @@ ThirdPartyFvPpiNotifyCallback (
>        continue;
>      }
> 
> -    if (PrivateData->FvCount >= PcdGet32 (PcdPeiCoreMaxFvSupported)) {
> -      DEBUG ((EFI_D_ERROR, "The number of Fv Images (%d) exceed the max
> supported FVs (%d) in Pei", PrivateData->FvCount + 1, PcdGet32
> (PcdPeiCoreMaxFvSupported)));
> -      DEBUG ((EFI_D_ERROR, "PcdPeiCoreMaxFvSupported value need be
> reconfigurated in DSC"));
> -      ASSERT (FALSE);
> +    if (PrivateData->FvCount >= PrivateData->MaxFvCount) {
> +      //
> +      // Run out of room, grow the buffer.
> +      //
> +      TempPtr = AllocateZeroPool (
> +                  sizeof (PEI_CORE_FV_HANDLE) * (PrivateData->MaxFvCount +
> FV_GROWTH_STEP)
> +                  );
> +      ASSERT (TempPtr != NULL);
> +      CopyMem (
> +        TempPtr,
> +        PrivateData->Fv,
> +        sizeof (PEI_CORE_FV_HANDLE) * PrivateData->MaxFvCount
> +        );
> +      PrivateData->Fv = TempPtr;
> +      PrivateData->MaxFvCount = PrivateData->MaxFvCount +
> FV_GROWTH_STEP;
>      }
> 
>      //
> diff --git a/MdeModulePkg/Core/Pei/PeiMain.h
> b/MdeModulePkg/Core/Pei/PeiMain.h
> index ab914c7d2e44..b248118087ad 100644
> --- a/MdeModulePkg/Core/Pei/PeiMain.h
> +++ b/MdeModulePkg/Core/Pei/PeiMain.h
> @@ -107,6 +107,11 @@ typedef struct {
>  #define PEIM_STATE_REGISTER_FOR_SHADOW    0x02
>  #define PEIM_STATE_DONE                   0x03
> 
> +//
> +// Number of FV instances to grow by each time we run out of room
> +//
> +#define FV_GROWTH_STEP 8
> +
>  typedef struct {
>    EFI_FIRMWARE_VOLUME_HEADER          *FvHeader;
>    EFI_PEI_FIRMWARE_VOLUME_PPI         *FvPpi;
> @@ -197,16 +202,22 @@ struct _PEI_CORE_INSTANCE {
>    UINTN                              FvCount;
> 
>    ///
> -  /// Pointer to the buffer with the PcdPeiCoreMaxFvSupported number of
> entries.
> +  /// The max count of FVs which contains FFS and could be dispatched by
> PeiCore.
> +  ///
> +  UINTN                              MaxFvCount;
> +
> +  ///
> +  /// Pointer to the buffer with the MaxFvCount number of entries.
>    /// Each entry is for one FV which contains FFS and could be dispatched by
> PeiCore.
>    ///
>    PEI_CORE_FV_HANDLE                 *Fv;
> 
>    ///
> -  /// Pointer to the buffer with the PcdPeiCoreMaxFvSupported number of
> entries.
> +  /// Pointer to the buffer with the MaxUnknownFvInfoCount number of entries.
>    /// Each entry is for one FV which could not be dispatched by PeiCore.
>    ///
>    PEI_CORE_UNKNOW_FORMAT_FV_INFO     *UnknownFvInfo;
> +  UINTN                              MaxUnknownFvInfoCount;
>    UINTN                              UnknownFvInfoCount;
> 
>    ///
> diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf
> b/MdeModulePkg/Core/Pei/PeiMain.inf
> index d106c3606e97..dd41fe41bc89 100644
> --- a/MdeModulePkg/Core/Pei/PeiMain.inf
> +++ b/MdeModulePkg/Core/Pei/PeiMain.inf
> @@ -104,7 +104,6 @@ [Ppis]
>    gEfiSecHobDataPpiGuid                         ## SOMETIMES_CONSUMES
> 
>  [Pcd]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported                   ##
> CONSUMES
>    gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPpiSupported                  ##
> CONSUMES
>    gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeiStackSize                  ##
> CONSUMES
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFir
> st  ## CONSUMES
> diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> index 52adefeb44b4..4869bf18f005 100644
> --- a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> +++ b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> @@ -184,13 +184,15 @@ PeiCore (
>        OldCoreData->CpuIo = &OldCoreData->ServiceTableShadow.CpuIo;
>        if (OldCoreData->HeapOffsetPositive) {
>          OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw +
> OldCoreData->HeapOffset);
> -        OldCoreData->UnknownFvInfo        =
> (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData-
> >UnknownFvInfo + OldCoreData->HeapOffset);
> +        if (OldCoreData->UnknownFvInfo != NULL) {
> +          OldCoreData->UnknownFvInfo      =
> (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData-
> >UnknownFvInfo + OldCoreData->HeapOffset);
> +        }
>          if (OldCoreData->CurrentFvFileHandles != NULL) {
>            OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *)
> OldCoreData->CurrentFvFileHandles + OldCoreData->HeapOffset);
>          }
>          OldCoreData->PpiData.PpiListPtrs  = (PEI_PPI_LIST_POINTERS *) ((UINT8 *)
> OldCoreData->PpiData.PpiListPtrs + OldCoreData->HeapOffset);
>          OldCoreData->Fv                   = (PEI_CORE_FV_HANDLE *) ((UINT8 *)
> OldCoreData->Fv + OldCoreData->HeapOffset);
> -        for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {
> +        for (Index = 0; Index < OldCoreData->FvCount; Index ++) {
>            if (OldCoreData->Fv[Index].PeimState != NULL) {
>              OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData-
> >Fv[Index].PeimState + OldCoreData->HeapOffset;
>            }
> @@ -202,13 +204,15 @@ PeiCore (
>          OldCoreData->TempFileHandles      = (EFI_PEI_FILE_HANDLE *) ((UINT8 *)
> OldCoreData->TempFileHandles + OldCoreData->HeapOffset);
>        } else {
>          OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw -
> OldCoreData->HeapOffset);
> -        OldCoreData->UnknownFvInfo        =
> (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData-
> >UnknownFvInfo - OldCoreData->HeapOffset);
> +        if (OldCoreData->UnknownFvInfo != NULL) {
> +          OldCoreData->UnknownFvInfo      =
> (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData-
> >UnknownFvInfo - OldCoreData->HeapOffset);
> +        }
>          if (OldCoreData->CurrentFvFileHandles != NULL) {
>            OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *)
> OldCoreData->CurrentFvFileHandles - OldCoreData->HeapOffset);
>          }
>          OldCoreData->PpiData.PpiListPtrs  = (PEI_PPI_LIST_POINTERS *) ((UINT8 *)
> OldCoreData->PpiData.PpiListPtrs - OldCoreData->HeapOffset);
>          OldCoreData->Fv                   = (PEI_CORE_FV_HANDLE *) ((UINT8 *)
> OldCoreData->Fv - OldCoreData->HeapOffset);
> -        for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {
> +        for (Index = 0; Index < OldCoreData->FvCount; Index ++) {
>            if (OldCoreData->Fv[Index].PeimState != NULL) {
>              OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData-
> >Fv[Index].PeimState - OldCoreData->HeapOffset;
>            }
> @@ -339,10 +343,6 @@ PeiCore (
>      //
>      PrivateData.PpiData.PpiListPtrs  = AllocateZeroPool (sizeof
> (PEI_PPI_LIST_POINTERS) * PcdGet32 (PcdPeiCoreMaxPpiSupported));
>      ASSERT (PrivateData.PpiData.PpiListPtrs != NULL);
> -    PrivateData.Fv                   = AllocateZeroPool (sizeof (PEI_CORE_FV_HANDLE)
> * PcdGet32 (PcdPeiCoreMaxFvSupported));
> -    ASSERT (PrivateData.Fv != NULL);
> -    PrivateData.UnknownFvInfo        = AllocateZeroPool (sizeof
> (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PcdGet32
> (PcdPeiCoreMaxFvSupported));
> -    ASSERT (PrivateData.UnknownFvInfo != NULL);
>    }
>    InitializePpiServices      (&PrivateData,    OldCoreData);
> 
> --
> 2.7.0.windows.1



  parent reply	other threads:[~2018-12-18  2:10 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-14 10:28 [PATCH 0/7] Remove PcdPeiCoreMaxXXX PCDs Star Zeng
2018-12-14 10:28 ` [PATCH 1/7] MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxPeimPerFv Star Zeng
2018-12-17 23:20   ` Chiu, Chasel
2018-12-18  2:04   ` Wang, Jian J
2018-12-18  2:45     ` Zeng, Star
2018-12-14 10:28 ` [PATCH 2/7] SecurityPkg Tcg(2)Pei: Remove the using of PcdPeiCoreMaxFvSupported Star Zeng
2018-12-17  5:06   ` Zhang, Chao B
2018-12-14 10:28 ` [PATCH 3/7] MdeModulePkg PeiCore: " Star Zeng
2018-12-17 23:20   ` Chiu, Chasel
2018-12-18  2:10   ` Wang, Jian J [this message]
2018-12-14 10:28 ` [PATCH 4/7] MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxPpiSupported Star Zeng
2018-12-17 23:20   ` Chiu, Chasel
2018-12-18  2:24   ` Wang, Jian J
2018-12-18  3:12     ` Zeng, Star
2018-12-14 10:28 ` [PATCH 5/7] OvmfPkg: Remove PcdPeiCoreMaxXXX PCDs' statement Star Zeng
2018-12-14 10:57   ` Ard Biesheuvel
2018-12-14 13:20   ` Laszlo Ersek
2018-12-14 10:28 ` [PATCH 6/7] Vlv2TbltDevicePkg: " Star Zeng
     [not found]   ` <A6DBF04CB9C4D045926EB50EBFFE5A2950865373@shsmsx102.ccr.corp.intel.com>
2018-12-18 11:00     ` Zeng, Star
     [not found]       ` <A6DBF04CB9C4D045926EB50EBFFE5A29508656F9@shsmsx102.ccr.corp.intel.com>
2018-12-19  1:23         ` Zeng, Star
     [not found]           ` <A6DBF04CB9C4D045926EB50EBFFE5A2950865882@shsmsx102.ccr.corp.intel.com>
2018-12-19  3:12             ` Sun, Zailiang
2018-12-14 10:28 ` [PATCH 7/7] MdeModulePkg: Remove PcdPeiCoreMaxXXX PCDs Star Zeng
2018-12-17 23:19   ` Chiu, Chasel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=D827630B58408649ACB04F44C510003624EC1B69@SHSMSX103.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox