// Module Globals used in the DXE to PEI handoff\r
// These must be module globals, so the stack can be switched\r
//\r
-EFI_DXE_IPL_PPI mDxeIplPpi = {\r
+CONST EFI_DXE_IPL_PPI mDxeIplPpi = {\r
DxeLoadCore\r
};\r
\r
-EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI mCustomGuidedSectionExtractionPpi = {\r
+CONST EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI mCustomGuidedSectionExtractionPpi = {\r
CustomGuidedSectionExtract\r
};\r
\r
-EFI_PEI_DECOMPRESS_PPI mDecompressPpi = {\r
+CONST EFI_PEI_DECOMPRESS_PPI mDecompressPpi = {\r
Decompress\r
};\r
\r
-EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {\r
+CONST EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {\r
{\r
EFI_PEI_PPI_DESCRIPTOR_PPI,\r
&gEfiDxeIplPpiGuid,\r
- &mDxeIplPpi\r
+ (VOID *) &mDxeIplPpi\r
},\r
{\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiPeiDecompressPpiGuid,\r
- &mDecompressPpi\r
+ (VOID *) &mDecompressPpi\r
}\r
};\r
\r
-EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {\r
+CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi = {\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiEndOfPeiSignalPpiGuid,\r
NULL\r
ASSERT (GuidPpi != NULL);\r
while (ExtractHandlerNumber-- > 0) {\r
GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
- GuidPpi->Ppi = &mCustomGuidedSectionExtractionPpi;\r
+ GuidPpi->Ppi = (VOID *) &mCustomGuidedSectionExtractionPpi;\r
GuidPpi->Guid = &(ExtractHandlerGuidTable [ExtractHandlerNumber]);\r
Status = PeiServicesInstallPpi (GuidPpi++);\r
ASSERT_EFI_ERROR(Status);\r
//\r
// Look in all the FVs present in PEI and find the DXE Core\r
//\r
- FileHandle = NULL;\r
- Status = DxeIplFindDxeCore (&FileHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- CopyGuid(&DxeCoreFileName, &(((EFI_FFS_FILE_HEADER*)FileHandle)->Name));\r
+ FileHandle = DxeIplFindDxeCore (&DxeCoreFileName);\r
\r
//\r
// Load the DXE Core from a Firmware Volume, may use LoadFile ppi to do this for save code size.\r
// Transfer control to the DXE Core\r
// The handoff state is simply a pointer to the HOB list\r
//\r
- HandOffToDxeCore (DxeCoreEntryPoint, HobList, &mPpiSignal);\r
+ HandOffToDxeCore (DxeCoreEntryPoint, HobList);\r
//\r
// If we get here, then the DXE Core returned. This is an error\r
// Dxe Core should not return.\r
}\r
\r
\r
-\r
-\r
/**\r
- Find DxeCore driver from all First Volumes.\r
+ Searches DxeCore in all firmware Volumes and loads the first\r
+ instance that contains DxeCore.\r
\r
- @param FileHandle Pointer to FFS file to search.\r
- \r
- @return EFI_SUCESS Success to find the FFS in specificed FV\r
- @return others Fail to find the FFS in specificed FV\r
+ @param DxeCoreFileName A Pointer to the EFI_GUID to contain\r
+ the output DxeCore GUID file name.\r
\r
+ @return FileHandle of DxeCore to load DxeCore.\r
+ \r
**/\r
-EFI_STATUS\r
+EFI_PEI_FILE_HANDLE\r
DxeIplFindDxeCore (\r
- OUT EFI_PEI_FILE_HANDLE *FileHandle\r
+ OUT EFI_GUID *DxeCoreFileName\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_STATUS FileStatus;\r
- UINTN Instance;\r
- EFI_PEI_FV_HANDLE VolumeHandle;\r
+ EFI_STATUS Status;\r
+ UINTN Instance;\r
+ EFI_PEI_FV_HANDLE VolumeHandle;\r
+ EFI_PEI_FILE_HANDLE FileHandle;\r
+ EFI_FV_FILE_INFO FvFileInfo;\r
\r
Instance = 0;\r
- *FileHandle = NULL;\r
-\r
- do {\r
- Status = PeiServicesFfsFindNextVolume (Instance++, &VolumeHandle);\r
+ while (TRUE) {\r
+ //\r
+ // Traverse all firmware volume instances\r
+ //\r
+ Status = PeiServicesFfsFindNextVolume (Instance, &VolumeHandle);\r
+ //\r
+ // If some error occurs here, then we cannot find any firmware\r
+ // volume that may contain DxeCore.\r
+ //\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ //\r
+ // Find the DxeCore file type from the beginning in this firmware volume.\r
+ //\r
+ FileHandle = NULL;\r
+ Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_DXE_CORE, VolumeHandle, &FileHandle);\r
if (!EFI_ERROR (Status)) {\r
- FileStatus = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_DXE_CORE, VolumeHandle, FileHandle);\r
- if (!EFI_ERROR (FileStatus)) {\r
- return FileStatus;\r
- }\r
+ //\r
+ // Find DxeCore FileHandle in this volume, then we skip other firmware volume.\r
+ //\r
+ break;\r
}\r
- } while (!EFI_ERROR (Status));\r
+ //\r
+ // We cannot find DxeCore in this firmware volume, then search the next volume.\r
+ //\r
+ Instance++;\r
+ }\r
\r
- return EFI_NOT_FOUND;\r
+ //\r
+ // Extract the DxeCore GUID file name.\r
+ //\r
+ Status = PeiServicesFfsGetFileInfo (FileHandle, &FvFileInfo);\r
+ ASSERT_EFI_ERROR (Status);\r
+ CopyGuid (DxeCoreFileName, &FvFileInfo.FileName);\r
+\r
+ //\r
+ // Return the FileHandle to load DxeCore from this volume.\r
+ //\r
+ return FileHandle;\r
}\r
\r
\r