/** @file\r
Locate the entry point for the PEI Core\r
\r
- Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
/**\r
Find core image base.\r
\r
- @param BootFirmwareVolumePtr Point to the boot firmware volume.\r
- @param SecCoreImageBase The base address of the SEC core image.\r
- @param PeiCoreImageBase The base address of the PEI core image.\r
+ @param FirmwareVolumePtr Point to the firmware volume for finding core image.\r
+ @param FileType The FileType for searching, either SecCore or PeiCore.\r
+ @param CoreImageBase The base address of the core image.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
FindImageBase (\r
- IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,\r
- OUT EFI_PHYSICAL_ADDRESS *SecCoreImageBase,\r
- OUT EFI_PHYSICAL_ADDRESS *PeiCoreImageBase\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumePtr,\r
+ IN EFI_FV_FILETYPE FileType,\r
+ OUT EFI_PHYSICAL_ADDRESS *CoreImageBase\r
)\r
{\r
- EFI_PHYSICAL_ADDRESS CurrentAddress;\r
- EFI_PHYSICAL_ADDRESS EndOfFirmwareVolume;\r
- EFI_FFS_FILE_HEADER *File;\r
- UINT32 Size;\r
- EFI_PHYSICAL_ADDRESS EndOfFile;\r
- EFI_COMMON_SECTION_HEADER *Section;\r
- EFI_PHYSICAL_ADDRESS EndOfSection;\r
+ EFI_PHYSICAL_ADDRESS CurrentAddress;\r
+ EFI_PHYSICAL_ADDRESS EndOfFirmwareVolume;\r
+ EFI_FFS_FILE_HEADER *File;\r
+ UINT32 Size;\r
+ EFI_PHYSICAL_ADDRESS EndOfFile;\r
+ EFI_COMMON_SECTION_HEADER *Section;\r
+ EFI_PHYSICAL_ADDRESS EndOfSection;\r
\r
- *SecCoreImageBase = 0;\r
- *PeiCoreImageBase = 0;\r
+ *CoreImageBase = 0;\r
\r
- CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;\r
- EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;\r
+ CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumePtr;\r
+ EndOfFirmwareVolume = CurrentAddress + FirmwareVolumePtr->FvLength;\r
\r
//\r
// Loop through the FFS files in the Boot Firmware Volume\r
//\r
- for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {\r
-\r
+ for (EndOfFile = CurrentAddress + FirmwareVolumePtr->HeaderLength; ; ) {\r
CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;\r
if (CurrentAddress > EndOfFirmwareVolume) {\r
return EFI_NOT_FOUND;\r
}\r
\r
- File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;\r
+ File = (EFI_FFS_FILE_HEADER *)(UINTN)CurrentAddress;\r
if (IS_FFS_FILE2 (File)) {\r
Size = FFS_FILE2_SIZE (File);\r
if (Size <= 0x00FFFFFF) {\r
}\r
\r
//\r
- // Look for SEC Core / PEI Core files\r
+ // Look for particular Core file (either SEC Core or PEI Core)\r
//\r
- if (File->Type != EFI_FV_FILETYPE_SECURITY_CORE &&\r
- File->Type != EFI_FV_FILETYPE_PEI_CORE) {\r
+ if (File->Type != FileType) {\r
continue;\r
}\r
\r
// Loop through the FFS file sections within the FFS file\r
//\r
if (IS_FFS_FILE2 (File)) {\r
- EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER2));\r
+ EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)((UINT8 *)File + sizeof (EFI_FFS_FILE_HEADER2));\r
} else {\r
- EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER));\r
+ EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)((UINT8 *)File + sizeof (EFI_FFS_FILE_HEADER));\r
}\r
- for (;;) {\r
+\r
+ for ( ; ;) {\r
CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;\r
- Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;\r
+ Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress;\r
\r
if (IS_SECTION2 (Section)) {\r
Size = SECTION2_SIZE (Section);\r
//\r
// Look for executable sections\r
//\r
- if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {\r
- if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {\r
- if (IS_SECTION2 (Section)) {\r
- *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
- } else {\r
- *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
- }\r
- } else {\r
+ if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) {\r
+ if (File->Type == FileType) {\r
if (IS_SECTION2 (Section)) {\r
- *PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
+ *CoreImageBase = (PHYSICAL_ADDRESS)(UINTN)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
} else {\r
- *PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
+ *CoreImageBase = (PHYSICAL_ADDRESS)(UINTN)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
}\r
}\r
+\r
break;\r
}\r
}\r
\r
//\r
- // Both SEC Core and PEI Core images found\r
+ // Either SEC Core or PEI Core images found\r
//\r
- if (*SecCoreImageBase != 0 && *PeiCoreImageBase != 0) {\r
+ if (*CoreImageBase != 0) {\r
return EFI_SUCCESS;\r
}\r
}\r
It also find SEC and PEI Core file debug information. It will report them if\r
remote debug is enabled.\r
\r
- @param BootFirmwareVolumePtr Point to the boot firmware volume.\r
+ @param SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.\r
+ @param PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.\r
@param PeiCoreEntryPoint The entry point of the PEI core.\r
\r
**/\r
VOID\r
EFIAPI\r
FindAndReportEntryPoints (\r
- IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,\r
- OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *SecCoreFirmwareVolumePtr,\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *PeiCoreFirmwareVolumePtr,\r
+ OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_PHYSICAL_ADDRESS SecCoreImageBase;\r
- EFI_PHYSICAL_ADDRESS PeiCoreImageBase;\r
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
+ EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS SecCoreImageBase;\r
+ EFI_PHYSICAL_ADDRESS PeiCoreImageBase;\r
+ PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
\r
//\r
- // Find SEC Core and PEI Core image base\r
+ // Find SEC Core image base\r
//\r
- Status = FindImageBase (BootFirmwareVolumePtr, &SecCoreImageBase, &PeiCoreImageBase);\r
+ Status = FindImageBase (SecCoreFirmwareVolumePtr, EFI_FV_FILETYPE_SECURITY_CORE, &SecCoreImageBase);\r
ASSERT_EFI_ERROR (Status);\r
\r
- ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
+ ZeroMem ((VOID *)&ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
//\r
// Report SEC Core debug information when remote debug is enabled\r
//\r
ImageContext.ImageAddress = SecCoreImageBase;\r
- ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
+ ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
\r
+ //\r
+ // Find PEI Core image base\r
+ //\r
+ Status = FindImageBase (PeiCoreFirmwareVolumePtr, EFI_FV_FILETYPE_PEI_CORE, &PeiCoreImageBase);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
//\r
// Report PEI Core debug information when remote debug is enabled\r
//\r
ImageContext.ImageAddress = PeiCoreImageBase;\r
- ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
+ ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
\r
//\r
// Find PEI Core entry point\r
//\r
- Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase, (VOID**) PeiCoreEntryPoint);\r
+ Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)PeiCoreImageBase, (VOID **)PeiCoreEntryPoint);\r
if (EFI_ERROR (Status)) {\r
*PeiCoreEntryPoint = 0;\r
}\r