From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.20; helo=mga02.intel.com; envelope-from=chasel.chiu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id BA6492119705F for ; Mon, 17 Dec 2018 15:20:05 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Dec 2018 15:20:05 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,366,1539673200"; d="scan'208";a="119101099" Received: from kmsmsx154.gar.corp.intel.com ([172.21.73.14]) by orsmga002.jf.intel.com with ESMTP; 17 Dec 2018 15:20:03 -0800 Received: from pgsmsx111.gar.corp.intel.com ([169.254.2.232]) by KMSMSX154.gar.corp.intel.com ([169.254.12.126]) with mapi id 14.03.0415.000; Tue, 18 Dec 2018 07:20:02 +0800 From: "Chiu, Chasel" To: "Zeng, Star" , "edk2-devel@lists.01.org" CC: "Wang, Jian J" , "Wu, Hao A" , "Gao, Liming" , "Ni, Ruiyu" , "Kinney, Michael D" , "Desimone, Nathaniel L" Thread-Topic: [PATCH 3/7] MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxFvSupported Thread-Index: AQHUk5frsTmISXskfkmRzNMa+OYVkaWDlthA Date: Mon, 17 Dec 2018 23:20:01 +0000 Message-ID: <3C3EFB470A303B4AB093197B6777CCEC501F527F@PGSMSX111.gar.corp.intel.com> References: <1544783322-17436-1-git-send-email-star.zeng@intel.com> <1544783322-17436-4-git-send-email-star.zeng@intel.com> In-Reply-To: <1544783322-17436-4-git-send-email-star.zeng@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.400.15 dlp-reaction: no-action x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiODdjOTI1ZmUtNDBjZS00ZWM5LTg4NTYtNmMyOTA4NzEzYWY3IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiWDF1aW5ObWtTRXJCbUoybHpubERzeVA2anFoYnVuS3VlNTJFdWFFVFBVSlJIU3htcUMxRzV2OUNWdHJjXC9wTXIifQ== x-ctpclassification: CTP_NT x-originating-ip: [172.30.20.205] MIME-Version: 1.0 Subject: Re: [PATCH 3/7] MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxFvSupported X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Dec 2018 23:20:05 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Chasel Chiu -----Original Message----- From: Zeng, Star=20 Sent: Friday, December 14, 2018 6:29 PM To: edk2-devel@lists.01.org Cc: Zeng, Star ; Wang, Jian J ;= Wu, Hao A ; Gao, Liming ; Ni, Ru= iyu ; Kinney, Michael D ; D= esimone, Nathaniel L ; Chiu, Chasel Subject: [PATCH 3/7] MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMa= xFvSupported REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1405 Background as below. Problem: As static configuration from the PCDs, the binary PeiCore (for example in F= SP 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 platf= orms. To solve the problem and remove the burden, we can update PeiCore to remove= the using of PcdPeiCoreMaxFvSupported, PcdPeiCoreMaxPeimPerFv and PcdPeiCo= reMaxPpiSupported by extending buffer dynamically for FV, File and PPI mana= gement. This patch removes the using of PcdPeiCoreMaxFvSupported in PeiCore. Cc: Jian J Wang Cc: Hao Wu Cc: Liming Gao Cc: Ruiyu Ni Cc: Michael D Kinney Cc: Nate DeSimone Cc: Chasel Chiu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng --- 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/Fw= Vol/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); =20 + PrivateData->Fv =3D AllocateZeroPool (sizeof (PEI_CORE_FV_HANDLE) *=20 + FV_GROWTH_STEP); ASSERT (PrivateData->Fv !=3D NULL); =20 + PrivateData->MaxFvCount =3D FV_GROWTH_STEP; + // // Update internal PEI_CORE_FV array. // @@ -560,6 +564,7 @@ FirmwareVolmeInfoPpiNotifyCallback ( VOID *DepexData; BOOLEAN IsFvInfo2; UINTN CurFvCount; + VOID *TempPtr; =20 Status =3D EFI_SUCCESS; PrivateData =3D PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices); @@ -626,1= 0 +631,21 @@ FirmwareVolmeInfoPpiNotifyCallback ( } } =20 - if (PrivateData->FvCount >=3D PcdGet32 (PcdPeiCoreMaxFvSupported)) { - DEBUG ((EFI_D_ERROR, "The number of Fv Images (%d) exceed the max su= pported FVs (%d) in Pei", PrivateData->FvCount + 1, PcdGet32 (PcdPeiCoreMax= FvSupported))); - DEBUG ((EFI_D_ERROR, "PcdPeiCoreMaxFvSupported value need be reconfi= gurated in DSC")); - ASSERT (FALSE); + if (PrivateData->FvCount >=3D PrivateData->MaxFvCount) { + // + // Run out of room, grow the buffer. + // + TempPtr =3D AllocateZeroPool ( + sizeof (PEI_CORE_FV_HANDLE) * (PrivateData->MaxFvCount += FV_GROWTH_STEP) + ); + ASSERT (TempPtr !=3D NULL); + CopyMem ( + TempPtr, + PrivateData->Fv, + sizeof (PEI_CORE_FV_HANDLE) * PrivateData->MaxFvCount + ); + PrivateData->Fv =3D TempPtr; + PrivateData->MaxFvCount =3D PrivateData->MaxFvCount +=20 + FV_GROWTH_STEP; } =20 // @@ -2157,7 +2173,6 @@ FindNextCoreFvHandle ( } } =20 - ASSERT (Private->FvCount <=3D PcdGet32 (PcdPeiCoreMaxFvSupported)); if (Instance >=3D Private->FvCount) { return NULL; } @@ -2205,7 +2220,7 @@ PeiReinitializeFv ( // // Fixup all FvPpi pointers for the implementation in flash to permanent= memory. // - for (Index =3D 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++)= { + for (Index =3D 0; Index < PrivateData->FvCount; Index ++) { if (PrivateData->Fv[Index].FvPpi =3D=3D OldFfsFvPpi) { PrivateData->Fv[Index].FvPpi =3D &mPeiFfs2FwVol.Fv; } @@ -2233,7 +2248,7 @@ PeiReinitializeFv ( // // Fixup all FvPpi pointers for the implementation in flash to permanent= memory. // - for (Index =3D 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++)= { + for (Index =3D 0; Index < PrivateData->FvCount; Index ++) { if (PrivateData->Fv[Index].FvPpi =3D=3D OldFfsFvPpi) { PrivateData->Fv[Index].FvPpi =3D &mPeiFfs3FwVol.Fv; } @@ -2263,9 +2278,23 @@ AddUnknownFormatFvInfo ( ) { PEI_CORE_UNKNOW_FORMAT_FV_INFO *NewUnknownFv; + VOID *TempPtr; =20 - if (PrivateData->UnknownFvInfoCount + 1 >=3D PcdGet32 (PcdPeiCoreMaxFvSu= pported)) { - return EFI_OUT_OF_RESOURCES; + if (PrivateData->UnknownFvInfoCount >=3D PrivateData->MaxUnknownFvInfoCo= unt) { + // + // Run out of room, grow the buffer. + // + TempPtr =3D AllocateZeroPool ( + sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * (PrivateData->Ma= xUnknownFvInfoCount + FV_GROWTH_STEP) + ); + ASSERT (TempPtr !=3D NULL); + CopyMem ( + TempPtr, + PrivateData->UnknownFvInfo, + sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PrivateData->MaxUnknownFvI= nfoCount + ); + PrivateData->UnknownFvInfo =3D TempPtr; + PrivateData->MaxUnknownFvInfoCount =3D=20 + PrivateData->MaxUnknownFvInfoCount + FV_GROWTH_STEP; } =20 NewUnknownFv =3D &PrivateData->UnknownFvInfo[PrivateData->UnknownFvInfoC= ount]; @@ -2368,6 +2397,7 @@ ThirdPartyFvPpiNotifyCallback ( EFI_PEI_FILE_HANDLE FileHandle; VOID *DepexData; UINTN CurFvCount; + VOID *TempPtr; =20 PrivateData =3D PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices); FvPpi =3D (EFI_PEI_FIRMWARE_VOLUME_PPI*) Ppi; @@ -2403,10 +2433,21 @@ Th= irdPartyFvPpiNotifyCallback ( continue; } =20 - if (PrivateData->FvCount >=3D PcdGet32 (PcdPeiCoreMaxFvSupported)) { - DEBUG ((EFI_D_ERROR, "The number of Fv Images (%d) exceed the max su= pported FVs (%d) in Pei", PrivateData->FvCount + 1, PcdGet32 (PcdPeiCoreMax= FvSupported))); - DEBUG ((EFI_D_ERROR, "PcdPeiCoreMaxFvSupported value need be reconfi= gurated in DSC")); - ASSERT (FALSE); + if (PrivateData->FvCount >=3D PrivateData->MaxFvCount) { + // + // Run out of room, grow the buffer. + // + TempPtr =3D AllocateZeroPool ( + sizeof (PEI_CORE_FV_HANDLE) * (PrivateData->MaxFvCount += FV_GROWTH_STEP) + ); + ASSERT (TempPtr !=3D NULL); + CopyMem ( + TempPtr, + PrivateData->Fv, + sizeof (PEI_CORE_FV_HANDLE) * PrivateData->MaxFvCount + ); + PrivateData->Fv =3D TempPtr; + PrivateData->MaxFvCount =3D PrivateData->MaxFvCount +=20 + FV_GROWTH_STEP; } =20 // diff --git a/MdeModulePkg/Core/Pei/PeiMain.h b/MdeModulePkg/Core/Pei/PeiMai= n.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 =20 +// +// Number of FV instances to grow by each time we run out of room //=20 +#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; =20 /// - /// Pointer to the buffer with the PcdPeiCoreMaxFvSupported number of en= tries. + /// The max count of FVs which contains FFS and could be dispatched by P= eiCore. + /// + 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; =20 /// - /// Pointer to the buffer with the PcdPeiCoreMaxFvSupported number of en= tries. + /// Pointer to the buffer with the MaxUnknownFvInfoCount number of entri= es. /// Each entry is for one FV which could not be dispatched by PeiCore. /// PEI_CORE_UNKNOW_FORMAT_FV_INFO *UnknownFvInfo; + UINTN MaxUnknownFvInfoCount; UINTN UnknownFvInfoCount; =20 /// diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiM= ain.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 =20 [Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported = ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPpiSupported = ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeiStackSize = ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst= ## CONSUMES diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c b/MdeMod= ulePkg/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 =3D &OldCoreData->ServiceTableShadow.CpuIo; if (OldCoreData->HeapOffsetPositive) { OldCoreData->HobList.Raw =3D (VOID *)(OldCoreData->HobList.Raw + O= ldCoreData->HeapOffset); - OldCoreData->UnknownFvInfo =3D (PEI_CORE_UNKNOW_FORMAT_FV_I= NFO *) ((UINT8 *) OldCoreData->UnknownFvInfo + OldCoreData->HeapOffset); + if (OldCoreData->UnknownFvInfo !=3D NULL) { + OldCoreData->UnknownFvInfo =3D (PEI_CORE_UNKNOW_FORMAT_FV_I= NFO *) ((UINT8 *) OldCoreData->UnknownFvInfo + OldCoreData->HeapOffset); + } if (OldCoreData->CurrentFvFileHandles !=3D NULL) { OldCoreData->CurrentFvFileHandles =3D (EFI_PEI_FILE_HANDLE *) ((= UINT8 *) OldCoreData->CurrentFvFileHandles + OldCoreData->HeapOffset); } OldCoreData->PpiData.PpiListPtrs =3D (PEI_PPI_LIST_POINTERS *) ((= UINT8 *) OldCoreData->PpiData.PpiListPtrs + OldCoreData->HeapOffset); OldCoreData->Fv =3D (PEI_CORE_FV_HANDLE *) ((UIN= T8 *) OldCoreData->Fv + OldCoreData->HeapOffset); - for (Index =3D 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Ind= ex ++) { + for (Index =3D 0; Index < OldCoreData->FvCount; Index ++) { if (OldCoreData->Fv[Index].PeimState !=3D NULL) { OldCoreData->Fv[Index].PeimState =3D (UINT8 *) OldCoreData= ->Fv[Index].PeimState + OldCoreData->HeapOffset; } @@ -202,13 +204,15 @@ PeiCore ( OldCoreData->TempFileHandles =3D (EFI_PEI_FILE_HANDLE *) ((UI= NT8 *) OldCoreData->TempFileHandles + OldCoreData->HeapOffset); } else { OldCoreData->HobList.Raw =3D (VOID *)(OldCoreData->HobList.Raw - O= ldCoreData->HeapOffset); - OldCoreData->UnknownFvInfo =3D (PEI_CORE_UNKNOW_FORMAT_FV_I= NFO *) ((UINT8 *) OldCoreData->UnknownFvInfo - OldCoreData->HeapOffset); + if (OldCoreData->UnknownFvInfo !=3D NULL) { + OldCoreData->UnknownFvInfo =3D (PEI_CORE_UNKNOW_FORMAT_FV_I= NFO *) ((UINT8 *) OldCoreData->UnknownFvInfo - OldCoreData->HeapOffset); + } if (OldCoreData->CurrentFvFileHandles !=3D NULL) { OldCoreData->CurrentFvFileHandles =3D (EFI_PEI_FILE_HANDLE *) ((= UINT8 *) OldCoreData->CurrentFvFileHandles - OldCoreData->HeapOffset); } OldCoreData->PpiData.PpiListPtrs =3D (PEI_PPI_LIST_POINTERS *) ((= UINT8 *) OldCoreData->PpiData.PpiListPtrs - OldCoreData->HeapOffset); OldCoreData->Fv =3D (PEI_CORE_FV_HANDLE *) ((UIN= T8 *) OldCoreData->Fv - OldCoreData->HeapOffset); - for (Index =3D 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Ind= ex ++) { + for (Index =3D 0; Index < OldCoreData->FvCount; Index ++) { if (OldCoreData->Fv[Index].PeimState !=3D NULL) { OldCoreData->Fv[Index].PeimState =3D (UINT8 *) OldCoreData= ->Fv[Index].PeimState - OldCoreData->HeapOffset; } @@ -339,10 +343,6 @@ PeiCore ( // PrivateData.PpiData.PpiListPtrs =3D AllocateZeroPool (sizeof (PEI_PPI= _LIST_POINTERS) * PcdGet32 (PcdPeiCoreMaxPpiSupported)); ASSERT (PrivateData.PpiData.PpiListPtrs !=3D NULL); - PrivateData.Fv =3D AllocateZeroPool (sizeof (PEI_COR= E_FV_HANDLE) * PcdGet32 (PcdPeiCoreMaxFvSupported)); - ASSERT (PrivateData.Fv !=3D NULL); - PrivateData.UnknownFvInfo =3D AllocateZeroPool (sizeof (PEI_COR= E_UNKNOW_FORMAT_FV_INFO) * PcdGet32 (PcdPeiCoreMaxFvSupported)); - ASSERT (PrivateData.UnknownFvInfo !=3D NULL); } InitializePpiServices (&PrivateData, OldCoreData); =20 -- 2.7.0.windows.1