mirror of https://github.com/acidanthera/audk.git
Move the Fv updating of PeiCore's internal structure PrivateData out of the implementation of build-in Ffs2's EFI_PEI_FIRMWARE_VOLUME_PPI. Because this PPI maybe provided by other PEIM/Sec.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9510 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7ec939170c
commit
dc6f9b3542
|
@ -310,6 +310,22 @@ PeiInitializeFv (
|
||||||
&FvHandle
|
&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
|
// Post a call-back for the FvInfoPPI services to expose
|
||||||
// additional Fvs to PeiCore.
|
// additional Fvs to PeiCore.
|
||||||
|
@ -346,6 +362,8 @@ FirmwareVolmeInfoPpiNotifyCallback (
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_PEI_FV_HANDLE FvHandle;
|
EFI_PEI_FV_HANDLE FvHandle;
|
||||||
UINTN FvIndex;
|
UINTN FvIndex;
|
||||||
|
EFI_PEI_FILE_HANDLE FileHandle;
|
||||||
|
VOID *DepexData;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
|
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
|
||||||
|
@ -373,10 +391,67 @@ FirmwareVolmeInfoPpiNotifyCallback (
|
||||||
//
|
//
|
||||||
Status = FvPpi->ProcessVolume (FvPpi, FvInfoPpi->FvInfo, FvInfoPpi->FvInfoSize, &FvHandle);
|
Status = FvPpi->ProcessVolume (FvPpi, FvInfoPpi->FvInfo, FvInfoPpi->FvInfoSize, &FvHandle);
|
||||||
if (EFI_ERROR (Status)) {
|
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;
|
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 {
|
} else {
|
||||||
DEBUG ((EFI_D_ERROR, "Fail to process FV %p because no corresponding EFI_FIRMWARE_VOLUME_PPI is found!\n", FvInfoPpi->FvInfo));
|
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;
|
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 ();
|
ASSERT (FvHandle != NULL);
|
||||||
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);
|
|
||||||
|
if (Buffer == NULL) {
|
||||||
|
return EFI_VOLUME_CORRUPTED;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The build-in EFI_PEI_FIRMWARE_VOLUME_PPI for FFS2 support memory-mapped
|
// The build-in EFI_PEI_FIRMWARE_VOLUME_PPI for FFS2 support memory-mapped
|
||||||
|
@ -948,61 +1021,6 @@ PeiFfs2FvPpiProcessVolume (
|
||||||
return EFI_VOLUME_CORRUPTED;
|
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;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue