]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxFvSupported
authorStar Zeng <star.zeng@intel.com>
Thu, 15 Nov 2018 03:21:46 +0000 (11:21 +0800)
committerStar Zeng <star.zeng@intel.com>
Wed, 19 Dec 2018 04:33:29 +0000 (12:33 +0800)
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>
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
MdeModulePkg/Core/Pei/FwVol/FwVol.c
MdeModulePkg/Core/Pei/PeiMain.h
MdeModulePkg/Core/Pei/PeiMain.inf
MdeModulePkg/Core/Pei/PeiMain/PeiMain.c

index 5629c9a1ce206b1375cca694c3405baa58612145..0a67b96bf1e34cf1a30a621a08d067753ab0deb4 100644 (file)
@@ -503,6 +503,10 @@ PeiInitializeFv (
                     );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  PrivateData->Fv = AllocateZeroPool (sizeof (PEI_CORE_FV_HANDLE) * FV_GROWTH_STEP);\r
+  ASSERT (PrivateData->Fv != NULL);\r
+  PrivateData->MaxFvCount = FV_GROWTH_STEP;\r
+\r
   //\r
   // Update internal PEI_CORE_FV array.\r
   //\r
@@ -560,6 +564,7 @@ FirmwareVolmeInfoPpiNotifyCallback (
   VOID                                  *DepexData;\r
   BOOLEAN                               IsFvInfo2;\r
   UINTN                                 CurFvCount;\r
+  VOID                                  *TempPtr;\r
 \r
   Status       = EFI_SUCCESS;\r
   PrivateData  = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
@@ -626,10 +631,21 @@ FirmwareVolmeInfoPpiNotifyCallback (
       }\r
     }\r
 \r
-    if (PrivateData->FvCount >= PcdGet32 (PcdPeiCoreMaxFvSupported)) {\r
-      DEBUG ((EFI_D_ERROR, "The number of Fv Images (%d) exceed the max supported FVs (%d) in Pei", PrivateData->FvCount + 1, PcdGet32 (PcdPeiCoreMaxFvSupported)));\r
-      DEBUG ((EFI_D_ERROR, "PcdPeiCoreMaxFvSupported value need be reconfigurated in DSC"));\r
-      ASSERT (FALSE);\r
+    if (PrivateData->FvCount >= PrivateData->MaxFvCount) {\r
+      //\r
+      // Run out of room, grow the buffer.\r
+      //\r
+      TempPtr = AllocateZeroPool (\r
+                  sizeof (PEI_CORE_FV_HANDLE) * (PrivateData->MaxFvCount + FV_GROWTH_STEP)\r
+                  );\r
+      ASSERT (TempPtr != NULL);\r
+      CopyMem (\r
+        TempPtr,\r
+        PrivateData->Fv,\r
+        sizeof (PEI_CORE_FV_HANDLE) * PrivateData->MaxFvCount\r
+        );\r
+      PrivateData->Fv = TempPtr;\r
+      PrivateData->MaxFvCount = PrivateData->MaxFvCount + FV_GROWTH_STEP;\r
     }\r
 \r
     //\r
@@ -2157,7 +2173,6 @@ FindNextCoreFvHandle (
     }\r
   }\r
 \r
-  ASSERT (Private->FvCount <= PcdGet32 (PcdPeiCoreMaxFvSupported));\r
   if (Instance >= Private->FvCount) {\r
     return NULL;\r
   }\r
@@ -2205,7 +2220,7 @@ PeiReinitializeFv (
   //\r
   // Fixup all FvPpi pointers for the implementation in flash to permanent memory.\r
   //\r
-  for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
+  for (Index = 0; Index < PrivateData->FvCount; Index ++) {\r
     if (PrivateData->Fv[Index].FvPpi == OldFfsFvPpi) {\r
       PrivateData->Fv[Index].FvPpi = &mPeiFfs2FwVol.Fv;\r
     }\r
@@ -2233,7 +2248,7 @@ PeiReinitializeFv (
   //\r
   // Fixup all FvPpi pointers for the implementation in flash to permanent memory.\r
   //\r
-  for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
+  for (Index = 0; Index < PrivateData->FvCount; Index ++) {\r
     if (PrivateData->Fv[Index].FvPpi == OldFfsFvPpi) {\r
       PrivateData->Fv[Index].FvPpi = &mPeiFfs3FwVol.Fv;\r
     }\r
@@ -2263,9 +2278,23 @@ AddUnknownFormatFvInfo (
   )\r
 {\r
   PEI_CORE_UNKNOW_FORMAT_FV_INFO    *NewUnknownFv;\r
+  VOID                              *TempPtr;\r
 \r
-  if (PrivateData->UnknownFvInfoCount + 1 >= PcdGet32 (PcdPeiCoreMaxFvSupported)) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  if (PrivateData->UnknownFvInfoCount >= PrivateData->MaxUnknownFvInfoCount) {\r
+    //\r
+    // Run out of room, grow the buffer.\r
+    //\r
+    TempPtr = AllocateZeroPool (\r
+                sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * (PrivateData->MaxUnknownFvInfoCount + FV_GROWTH_STEP)\r
+                );\r
+    ASSERT (TempPtr != NULL);\r
+    CopyMem (\r
+      TempPtr,\r
+      PrivateData->UnknownFvInfo,\r
+      sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PrivateData->MaxUnknownFvInfoCount\r
+      );\r
+    PrivateData->UnknownFvInfo = TempPtr;\r
+    PrivateData->MaxUnknownFvInfoCount = PrivateData->MaxUnknownFvInfoCount + FV_GROWTH_STEP;\r
   }\r
 \r
   NewUnknownFv = &PrivateData->UnknownFvInfo[PrivateData->UnknownFvInfoCount];\r
@@ -2368,6 +2397,7 @@ ThirdPartyFvPpiNotifyCallback (
   EFI_PEI_FILE_HANDLE          FileHandle;\r
   VOID                         *DepexData;\r
   UINTN                        CurFvCount;\r
+  VOID                         *TempPtr;\r
 \r
   PrivateData  = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
   FvPpi = (EFI_PEI_FIRMWARE_VOLUME_PPI*) Ppi;\r
@@ -2403,10 +2433,21 @@ ThirdPartyFvPpiNotifyCallback (
       continue;\r
     }\r
 \r
-    if (PrivateData->FvCount >= PcdGet32 (PcdPeiCoreMaxFvSupported)) {\r
-      DEBUG ((EFI_D_ERROR, "The number of Fv Images (%d) exceed the max supported FVs (%d) in Pei", PrivateData->FvCount + 1, PcdGet32 (PcdPeiCoreMaxFvSupported)));\r
-      DEBUG ((EFI_D_ERROR, "PcdPeiCoreMaxFvSupported value need be reconfigurated in DSC"));\r
-      ASSERT (FALSE);\r
+    if (PrivateData->FvCount >= PrivateData->MaxFvCount) {\r
+      //\r
+      // Run out of room, grow the buffer.\r
+      //\r
+      TempPtr = AllocateZeroPool (\r
+                  sizeof (PEI_CORE_FV_HANDLE) * (PrivateData->MaxFvCount + FV_GROWTH_STEP)\r
+                  );\r
+      ASSERT (TempPtr != NULL);\r
+      CopyMem (\r
+        TempPtr,\r
+        PrivateData->Fv,\r
+        sizeof (PEI_CORE_FV_HANDLE) * PrivateData->MaxFvCount\r
+        );\r
+      PrivateData->Fv = TempPtr;\r
+      PrivateData->MaxFvCount = PrivateData->MaxFvCount + FV_GROWTH_STEP;\r
     }\r
 \r
     //\r
index 195bdc3425b6255a83c9aca7c4cc9e6d4af6be33..b103215d81f7a5d0dd4c90376da295d854827081 100644 (file)
@@ -107,6 +107,11 @@ typedef struct {
 #define PEIM_STATE_REGISTER_FOR_SHADOW    0x02\r
 #define PEIM_STATE_DONE                   0x03\r
 \r
+//\r
+// Number of FV instances to grow by each time we run out of room\r
+//\r
+#define FV_GROWTH_STEP 8\r
+\r
 typedef struct {\r
   EFI_FIRMWARE_VOLUME_HEADER          *FvHeader;\r
   EFI_PEI_FIRMWARE_VOLUME_PPI         *FvPpi;\r
@@ -202,16 +207,22 @@ struct _PEI_CORE_INSTANCE {
   UINTN                              FvCount;\r
 \r
   ///\r
-  /// Pointer to the buffer with the PcdPeiCoreMaxFvSupported number of entries.\r
+  /// The max count of FVs which contains FFS and could be dispatched by PeiCore.\r
+  ///\r
+  UINTN                              MaxFvCount;\r
+\r
+  ///\r
+  /// Pointer to the buffer with the MaxFvCount number of entries.\r
   /// Each entry is for one FV which contains FFS and could be dispatched by PeiCore.\r
   ///\r
   PEI_CORE_FV_HANDLE                 *Fv;\r
 \r
   ///\r
-  /// Pointer to the buffer with the PcdPeiCoreMaxFvSupported number of entries.\r
+  /// Pointer to the buffer with the MaxUnknownFvInfoCount number of entries.\r
   /// Each entry is for one FV which could not be dispatched by PeiCore.\r
   ///\r
   PEI_CORE_UNKNOW_FORMAT_FV_INFO     *UnknownFvInfo;\r
+  UINTN                              MaxUnknownFvInfoCount;\r
   UINTN                              UnknownFvInfoCount;\r
 \r
   ///\r
index d106c3606e9784deef8a34f74c0e37c2abe0fa44..dd41fe41bc89aae8b886312c8b8dc249fe2bf616 100644 (file)
   gEfiSecHobDataPpiGuid                         ## SOMETIMES_CONSUMES\r
 \r
 [Pcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported                   ## CONSUMES\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPpiSupported                  ## CONSUMES\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeiStackSize                  ## CONSUMES\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst  ## CONSUMES\r
index 52adefeb44b4cfc969c1138887a63eb061aff2ed..4869bf18f005ad0f741d8031130233c94cc9b0bf 100644 (file)
@@ -184,13 +184,15 @@ PeiCore (
       OldCoreData->CpuIo = &OldCoreData->ServiceTableShadow.CpuIo;\r
       if (OldCoreData->HeapOffsetPositive) {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw + OldCoreData->HeapOffset);\r
-        OldCoreData->UnknownFvInfo        = (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData->UnknownFvInfo + OldCoreData->HeapOffset);\r
+        if (OldCoreData->UnknownFvInfo != NULL) {\r
+          OldCoreData->UnknownFvInfo      = (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData->UnknownFvInfo + OldCoreData->HeapOffset);\r
+        }\r
         if (OldCoreData->CurrentFvFileHandles != NULL) {\r
           OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->CurrentFvFileHandles + OldCoreData->HeapOffset);\r
         }\r
         OldCoreData->PpiData.PpiListPtrs  = (PEI_PPI_LIST_POINTERS *) ((UINT8 *) OldCoreData->PpiData.PpiListPtrs + OldCoreData->HeapOffset);\r
         OldCoreData->Fv                   = (PEI_CORE_FV_HANDLE *) ((UINT8 *) OldCoreData->Fv + OldCoreData->HeapOffset);\r
-        for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
+        for (Index = 0; Index < OldCoreData->FvCount; Index ++) {\r
           if (OldCoreData->Fv[Index].PeimState != NULL) {\r
             OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData->Fv[Index].PeimState + OldCoreData->HeapOffset;\r
           }\r
@@ -202,13 +204,15 @@ PeiCore (
         OldCoreData->TempFileHandles      = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->TempFileHandles + OldCoreData->HeapOffset);\r
       } else {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw - OldCoreData->HeapOffset);\r
-        OldCoreData->UnknownFvInfo        = (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData->UnknownFvInfo - OldCoreData->HeapOffset);\r
+        if (OldCoreData->UnknownFvInfo != NULL) {\r
+          OldCoreData->UnknownFvInfo      = (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData->UnknownFvInfo - OldCoreData->HeapOffset);\r
+        }\r
         if (OldCoreData->CurrentFvFileHandles != NULL) {\r
           OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->CurrentFvFileHandles - OldCoreData->HeapOffset);\r
         }\r
         OldCoreData->PpiData.PpiListPtrs  = (PEI_PPI_LIST_POINTERS *) ((UINT8 *) OldCoreData->PpiData.PpiListPtrs - OldCoreData->HeapOffset);\r
         OldCoreData->Fv                   = (PEI_CORE_FV_HANDLE *) ((UINT8 *) OldCoreData->Fv - OldCoreData->HeapOffset);\r
-        for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
+        for (Index = 0; Index < OldCoreData->FvCount; Index ++) {\r
           if (OldCoreData->Fv[Index].PeimState != NULL) {\r
             OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData->Fv[Index].PeimState - OldCoreData->HeapOffset;\r
           }\r
@@ -339,10 +343,6 @@ PeiCore (
     //\r
     PrivateData.PpiData.PpiListPtrs  = AllocateZeroPool (sizeof (PEI_PPI_LIST_POINTERS) * PcdGet32 (PcdPeiCoreMaxPpiSupported));\r
     ASSERT (PrivateData.PpiData.PpiListPtrs != NULL);\r
-    PrivateData.Fv                   = AllocateZeroPool (sizeof (PEI_CORE_FV_HANDLE) * PcdGet32 (PcdPeiCoreMaxFvSupported));\r
-    ASSERT (PrivateData.Fv != NULL);\r
-    PrivateData.UnknownFvInfo        = AllocateZeroPool (sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PcdGet32 (PcdPeiCoreMaxFvSupported));\r
-    ASSERT (PrivateData.UnknownFvInfo != NULL);\r
   }\r
   InitializePpiServices      (&PrivateData,    OldCoreData);\r
 \r