summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Core/Pei/Dispatcher
diff options
context:
space:
mode:
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2009-11-11 03:27:39 +0000
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2009-11-11 03:27:39 +0000
commit3b428adef9078ceb47d33dddffe1d3e140efb9dd (patch)
treeba464591cf1c02d6da314048836e40154204360b /MdeModulePkg/Core/Pei/Dispatcher
parent941b356972581e1c24e0b8ea2ce1f01fd89c5bd3 (diff)
downloadedk2-3b428adef9078ceb47d33dddffe1d3e140efb9dd.tar.gz
edk2-3b428adef9078ceb47d33dddffe1d3e140efb9dd.tar.bz2
edk2-3b428adef9078ceb47d33dddffe1d3e140efb9dd.zip
Enabling EFI_PEI_FIRMWARE_VOLUME_PPI introduced by PI1.2.
1, Implement EFI_PEI_FIRMWARE_VOLUME_PPI for FFS2 format as build-in supporting FV format in PeiCore. 2, Reduce the assumption of memory-mapped FV in PeiCore. PeiCore should access FV via EFI_PEI_FIRMWARE_VOLUME_PPI interface but not cast FvHandle/FileHandle to EFI_FIRMWARE_VOLUME_HEADER/EFI_FV_FILE_HEADER directly. 3, Reduce AllFv[] and AllFvCount in PEI_CORE_INSTANCE structure. Original PEI_CORE_INSTANCE use AllFv[] and Fv[] array to manage discovered FV and dispatched FV. But not need to make thing too complex. Now PEI_CORE_FV_HANDLE array of Fv[] will take responsibility to manage all FV instance and status. 4, Fix the bug use PeiDispatcher use wrong index for PeiFfsFindNextVolume(), 5, Fix the bug in PeiFfsFindNextVolume(), if instance is not found, *VolumeHandle should be set to NULL but not VolumeHandle was set to NULL. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9407 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Core/Pei/Dispatcher')
-rw-r--r--MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c73
1 files changed, 42 insertions, 31 deletions
diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
index f64003db38..067096c595 100644
--- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
+++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
@@ -30,14 +30,14 @@ typedef struct {
Apriori file in one FV.
- @param Private - Pointer to the private data passed in from caller
- @param VolumeHandle - Fv handle.
+ @param Private Pointer to the private data passed in from caller
+ @param CoreFileHandle The instance of PEI_CORE_FV_HANDLE.
**/
VOID
DiscoverPeimsAndOrderWithApriori (
IN PEI_CORE_INSTANCE *Private,
- IN EFI_PEI_FV_HANDLE VolumeHandle
+ IN PEI_CORE_FV_HANDLE *CoreFileHandle
)
{
EFI_STATUS Status;
@@ -51,7 +51,11 @@ DiscoverPeimsAndOrderWithApriori (
EFI_GUID *Guid;
EFI_PEI_FV_HANDLE TempFileHandles[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];
EFI_GUID FileGuid[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];
-
+ EFI_PEI_FIRMWARE_VOLUME_PPI *FvPpi;
+ EFI_FV_FILE_INFO FileInfo;
+
+ FvPpi = CoreFileHandle->FvPpi;
+
//
// Walk the FV and find all the PEIMs and the Apriori file.
//
@@ -72,13 +76,7 @@ DiscoverPeimsAndOrderWithApriori (
// Go ahead to scan this Fv, and cache FileHandles within it.
//
for (PeimCount = 0; PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv); PeimCount++) {
- Status = PeiFindFileEx (
- VolumeHandle,
- NULL,
- PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE,
- &FileHandle,
- &AprioriFileHandle
- );
+ Status = FvPpi->FindFileByType (FvPpi, PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE, CoreFileHandle->FvHandle, &FileHandle);
if (Status != EFI_SUCCESS) {
break;
}
@@ -92,17 +90,23 @@ DiscoverPeimsAndOrderWithApriori (
//
ASSERT (PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv));
+ //
+ // Get Apriori File handle
+ //
Private->AprioriCount = 0;
- if (AprioriFileHandle != NULL) {
+ Status = FvPpi->FindFileByName (FvPpi, &gPeiAprioriFileNameGuid, &CoreFileHandle->FvHandle, &AprioriFileHandle);
+ if (!EFI_ERROR(Status) && AprioriFileHandle != NULL) {
//
// Read the Apriori file
//
- Status = PeiServicesFfsFindSectionData (EFI_SECTION_RAW, AprioriFileHandle, (VOID **) &Apriori);
+ Status = FvPpi->FindSectionByType (FvPpi, EFI_SECTION_RAW, AprioriFileHandle, (VOID **) &Apriori);
if (!EFI_ERROR (Status)) {
//
// Calculate the number of PEIMs in the A Priori list
//
- Private->AprioriCount = *(UINT32 *)(((EFI_FFS_FILE_HEADER *)AprioriFileHandle)->Size) & 0x00FFFFFF;
+ Status = FvPpi->GetFileInfo (FvPpi, AprioriFileHandle, &FileInfo);
+ ASSERT_EFI_ERROR (Status);
+ Private->AprioriCount = FileInfo.BufferSize & 0x00FFFFFF;
Private->AprioriCount -= sizeof (EFI_FFS_FILE_HEADER) - sizeof (EFI_COMMON_SECTION_HEADER);
Private->AprioriCount /= sizeof (EFI_GUID);
@@ -112,7 +116,8 @@ DiscoverPeimsAndOrderWithApriori (
// Make an array of file name guids that matches the FileHandle array so we can convert
// quickly from file name to file handle
//
- CopyMem (&FileGuid[Index], &((EFI_FFS_FILE_HEADER *)Private->CurrentFvFileHandles[Index])->Name,sizeof(EFI_GUID));
+ Status = FvPpi->GetFileInfo (FvPpi, Private->CurrentFvFileHandles[Index], &FileInfo);
+ CopyMem (&FileGuid[Index], &FileInfo.FileName, sizeof(EFI_GUID));
}
//
@@ -202,13 +207,12 @@ ShadowPeiCore(
//
// Find the PEI Core in the BFV
//
- Status = PeiFindFileEx (
- (EFI_PEI_FV_HANDLE)PrivateInMem->Fv[0].FvHeader,
- NULL,
- EFI_FV_FILETYPE_PEI_CORE,
- &PeiCoreFileHandle,
- NULL
- );
+ Status = PrivateInMem->Fv[0].FvPpi->FindFileByType (
+ PrivateInMem->Fv[0].FvPpi,
+ EFI_FV_FILETYPE_PEI_CORE,
+ PrivateInMem->Fv[0].FvHandle,
+ &PeiCoreFileHandle
+ );
ASSERT_EFI_ERROR (Status);
//
@@ -248,7 +252,6 @@ PeiDispatcher (
UINT32 Index1;
UINT32 Index2;
CONST EFI_PEI_SERVICES **PeiServices;
- EFI_PEI_FV_HANDLE VolumeHandle;
EFI_PEI_FILE_HANDLE PeimFileHandle;
UINTN FvCount;
UINTN PeimCount;
@@ -272,7 +275,7 @@ PeiDispatcher (
EFI_FV_FILE_INFO FvFileInfo;
UINTN OldCheckingTop;
UINTN OldCheckingBottom;
-
+ PEI_CORE_FV_HANDLE *CoreFvHandle;
PeiServices = (CONST EFI_PEI_SERVICES **) &Private->PS;
PeimEntryPoint = NULL;
@@ -349,11 +352,17 @@ PeiDispatcher (
}
for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) {
- Private->CurrentPeimFvCount = FvCount;
+ CoreFvHandle = FindNextCoreFvHandle (Private, FvCount);
+ ASSERT (CoreFvHandle != NULL);
+
//
- // Get this Fv Handle by PeiService FvFindNextVolume.
+ // If the FV has corresponding EFI_PEI_FIRMWARE_VOLUME_PPI instance, then dispatch it.
//
- PeiFvFindNextVolume (PeiServices, FvCount, &VolumeHandle);
+ if (CoreFvHandle->FvPpi == NULL) {
+ continue;
+ }
+
+ Private->CurrentPeimFvCount = FvCount;
if (Private->CurrentPeimCount == 0) {
//
@@ -361,7 +370,7 @@ PeiDispatcher (
// reorder all PEIMs to ensure the PEIMs in Apriori file to get
// dispatch at first.
//
- DiscoverPeimsAndOrderWithApriori (Private, VolumeHandle);
+ DiscoverPeimsAndOrderWithApriori (Private, CoreFvHandle);
}
//
@@ -377,13 +386,14 @@ PeiDispatcher (
if (!DepexSatisfied (Private, PeimFileHandle, PeimCount)) {
Private->PeimNeedingDispatch = TRUE;
} else {
- Status = PeiFfsGetFileInfo (PeimFileHandle, &FvFileInfo);
+ Status = CoreFvHandle->FvPpi->GetFileInfo (CoreFvHandle->FvPpi, PeimFileHandle, &FvFileInfo);
ASSERT_EFI_ERROR (Status);
if (FvFileInfo.FileType == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) {
//
// For Fv type file, Produce new FV PPI and FV hob
//
- Status = ProcessFvFile (PeiServices, VolumeHandle, PeimFileHandle, &AuthenticationState);
+ Status = ProcessFvFile (&Private->Fv[FvCount], PeimFileHandle);
+ AuthenticationState = 0;
} else {
//
// For PEIM driver, Load its entry point
@@ -412,7 +422,7 @@ PeiDispatcher (
sizeof (ExtendedData)
);
- Status = VerifyPeim (Private, VolumeHandle, PeimFileHandle);
+ Status = VerifyPeim (Private, CoreFvHandle->FvHandle, PeimFileHandle);
if (Status != EFI_SECURITY_VIOLATION && (AuthenticationState == 0)) {
//
// PEIM_STATE_NOT_DISPATCHED move to PEIM_STATE_DISPATCHED
@@ -807,3 +817,4 @@ PeiRegisterForShadow (
return EFI_SUCCESS;
}
+