diff options
Diffstat (limited to 'MdeModulePkg/Core')
-rw-r--r-- | MdeModulePkg/Core/Pei/FwVol/FwVol.c | 148 |
1 files changed, 83 insertions, 65 deletions
diff --git a/MdeModulePkg/Core/Pei/FwVol/FwVol.c b/MdeModulePkg/Core/Pei/FwVol/FwVol.c index 813eff59b8..453b72f75a 100644 --- a/MdeModulePkg/Core/Pei/FwVol/FwVol.c +++ b/MdeModulePkg/Core/Pei/FwVol/FwVol.c @@ -309,7 +309,23 @@ PeiInitializeFv ( (UINTN)BfvHeader->FvLength,
&FvHandle
);
-
+
+ //
+ // Update internal PEI_CORE_FV array.
+ //
+ PrivateData->Fv[PrivateData->FvCount].FvHeader = BfvHeader;
+ PrivateData->Fv[PrivateData->FvCount].FvPpi = FvPpi;
+ PrivateData->Fv[PrivateData->FvCount].FvHandle = FvHandle;
+ DEBUG ((
+ EFI_D_INFO,
+ "The %dth FV start address is 0x%11p, size is 0x%08x, handle is 0x%p\n",
+ (UINT32) PrivateData->FvCount,
+ (VOID *) BfvHeader,
+ BfvHeader->FvLength,
+ FvHandle
+ ));
+ PrivateData->FvCount ++;
+
//
// Post a call-back for the FvInfoPPI services to expose
// additional Fvs to PeiCore.
@@ -346,6 +362,8 @@ FirmwareVolmeInfoPpiNotifyCallback ( EFI_STATUS Status;
EFI_PEI_FV_HANDLE FvHandle;
UINTN FvIndex;
+ EFI_PEI_FILE_HANDLE FileHandle;
+ VOID *DepexData;
Status = EFI_SUCCESS;
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
@@ -373,10 +391,67 @@ FirmwareVolmeInfoPpiNotifyCallback ( //
Status = FvPpi->ProcessVolume (FvPpi, FvInfoPpi->FvInfo, FvInfoPpi->FvInfoSize, &FvHandle);
if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "Fail to process new found FV, FV may be corrupted!"));
+ DEBUG ((EFI_D_ERROR, "Fail to process new found FV, FV may be corrupted!\n"));
return Status;
}
- DEBUG ((EFI_D_INFO, "Found and process new FV %p, all fv's count is %d\n", FvHandle, PrivateData->FvCount));
+
+ //
+ // Check whether the FV has already been processed.
+ //
+ for (FvIndex = 0; FvIndex < PrivateData->FvCount; FvIndex ++) {
+ if (PrivateData->Fv[FvIndex].FvHandle == FvHandle) {
+ DEBUG ((EFI_D_INFO, "The Fv %p has already been processed!\n", FvInfoPpi->FvInfo));
+ return EFI_SUCCESS;
+ }
+ }
+
+ //
+ // Update internal PEI_CORE_FV array.
+ //
+ PrivateData->Fv[PrivateData->FvCount].FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) FvInfoPpi->FvInfo;
+ PrivateData->Fv[PrivateData->FvCount].FvPpi = FvPpi;
+ PrivateData->Fv[PrivateData->FvCount].FvHandle = FvHandle;
+ DEBUG ((
+ EFI_D_INFO,
+ "The %dth FV start address is 0x%11p, size is 0x%08x, handle is 0x%p\n",
+ (UINT32) PrivateData->FvCount,
+ (VOID *) FvInfoPpi->FvInfo,
+ FvInfoPpi->FvInfoSize,
+ FvHandle
+ ));
+ PrivateData->FvCount ++;
+
+ //
+ // Scan and process the new discoveried FV for EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
+ //
+ FileHandle = NULL;
+ do {
+ Status = FvPpi->FindFileByType (
+ FvPpi,
+ EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
+ FvHandle,
+ &FileHandle
+ );
+ if (!EFI_ERROR (Status)) {
+ Status = FvPpi->FindSectionByType (
+ FvPpi,
+ EFI_SECTION_PEI_DEPEX,
+ FileHandle,
+ (VOID**)&DepexData
+ );
+ if (!EFI_ERROR (Status)) {
+ if (!PeimDispatchReadiness (PeiServices, DepexData)) {
+ //
+ // Dependency is not satisfied.
+ //
+ continue;
+ }
+ }
+
+ DEBUG ((EFI_D_INFO, "Found firmware volume Image File %p in FV[%d] %p\n", FileHandle, PrivateData->FvCount - 1, FvHandle));
+ ProcessFvFile (&PrivateData->Fv[PrivateData->FvCount - 1], FileHandle);
+ }
+ } while (FileHandle != NULL);
} else {
DEBUG ((EFI_D_ERROR, "Fail to process FV %p because no corresponding EFI_FIRMWARE_VOLUME_PPI is found!\n", FvInfoPpi->FvInfo));
@@ -924,14 +999,12 @@ PeiFfs2FvPpiProcessVolume ( )
{
EFI_STATUS Status;
- PEI_CORE_INSTANCE *PrivateData;
- EFI_PEI_FILE_HANDLE FileHandle;
- VOID *DepexData;
- EFI_PEI_SERVICES **PeiServices;
- UINTN FvIndex;
- PeiServices = (EFI_PEI_SERVICES**) GetPeiServicesTablePointer ();
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
+ ASSERT (FvHandle != NULL);
+
+ if (Buffer == NULL) {
+ return EFI_VOLUME_CORRUPTED;
+ }
//
// The build-in EFI_PEI_FIRMWARE_VOLUME_PPI for FFS2 support memory-mapped
@@ -948,61 +1021,6 @@ PeiFfs2FvPpiProcessVolume ( return EFI_VOLUME_CORRUPTED;
}
- //
- // Check whether the FV has already been processed.
- //
- for (FvIndex = 0; FvIndex < PrivateData->FvCount; FvIndex ++) {
- if (PrivateData->Fv[FvIndex].FvHandle == *FvHandle) {
- DEBUG ((EFI_D_INFO, "The Fv %p has already been processed!", Buffer));
- return EFI_SUCCESS;
- }
- }
-
- //
- // Update internal PEI_CORE_FV array.
- //
- PrivateData->Fv[PrivateData->FvCount].FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) Buffer;
- PrivateData->Fv[PrivateData->FvCount].FvPpi = (EFI_PEI_FIRMWARE_VOLUME_PPI*) This;
- PrivateData->Fv[PrivateData->FvCount].FvHandle = *FvHandle;
-
- DEBUG ((EFI_D_INFO,
- "The %dth FV start address is 0x%11p and size is 0x%08x\n",
- (UINT32) PrivateData->FvCount,
- (VOID *) Buffer,
- BufferSize
- ));
- PrivateData->FvCount ++;
-
- FileHandle = NULL;
-
- do {
- Status = This->FindFileByType (
- This,
- EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
- *FvHandle,
- &FileHandle
- );
- if (!EFI_ERROR (Status)) {
- Status = This->FindSectionByType (
- This,
- EFI_SECTION_PEI_DEPEX,
- FileHandle,
- (VOID**)&DepexData
- );
- if (!EFI_ERROR (Status)) {
- if (!PeimDispatchReadiness (PeiServices, DepexData)) {
- //
- // Dependency is not satisfied.
- //
- continue;
- }
- }
-
- DEBUG ((EFI_D_INFO, "Found firmware volume Image File %p in FV[%d] %p", FileHandle, PrivateData->FvCount - 1, *FvHandle));
- ProcessFvFile (&PrivateData->Fv[PrivateData->FvCount - 1], FileHandle);
- }
- } while (FileHandle != NULL);
-
return EFI_SUCCESS;
}
|