);\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
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
}\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
}\r
}\r
\r
- ASSERT (Private->FvCount <= PcdGet32 (PcdPeiCoreMaxFvSupported));\r
if (Instance >= Private->FvCount) {\r
return NULL;\r
}\r
//\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
//\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
)\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
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
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
#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
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
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
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
//\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