16 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
17 &gEfiPeiLoadFilePpiGuid,
46 Destination8 = Buffer;
47 Source8 = (CHAR8 *)((
UINTN)FileHandle + FileOffset);
48 if (Destination8 != Source8) {
49 CopyMem (Destination8, Source8, *ReadSize);
74 UINT32 DxeCodePageNumber;
75 UINT64 ReservedCodeSize;
77 UINT32 BaseOffsetPageNumber;
78 UINT32 TopOffsetPageNumber;
80 UINT64 *MemoryUsageBitMap;
85 DxeCodePageNumber =
PcdGet32 (PcdLoadFixAddressBootTimeCodePageNumber);
86 DxeCodePageNumber +=
PcdGet32 (PcdLoadFixAddressRuntimeCodePageNumber);
88 PeiCodeBase = Private->LoadModuleAtFixAddressTopAddress - ReservedCodeSize;
93 if (((Private->LoadModuleAtFixAddressTopAddress -
EFI_PAGES_TO_SIZE (DxeCodePageNumber)) < (ImageBase + ImageSize)) ||
94 (PeiCodeBase > ImageBase))
102 MemoryUsageBitMap = Private->PeiCodeMemoryRangeUsageBitMap;
104 TopOffsetPageNumber =
EFI_SIZE_TO_PAGES ((UINT32)(ImageBase + ImageSize - PeiCodeBase));
105 for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index++) {
106 if ((MemoryUsageBitMap[Index / 64] &
LShiftU64 (1, (Index % 64))) != 0) {
110 return EFI_NOT_FOUND;
117 for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index++) {
118 MemoryUsageBitMap[Index / 64] |=
LShiftU64 (1, (Index % 64));
143 UINTN SectionHeaderOffset;
150 UINT16 NumberOfSections;
151 UINT64 ValueInSectionHeader;
153 FixLoadingAddress = 0;
154 Status = EFI_NOT_FOUND;
160 if (ImageContext->IsTeImage) {
168 SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +
171 ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader;
172 NumberOfSections = ImgHdr->Pe32.FileHeader.NumberOfSections;
178 for (Index = 0; Index < NumberOfSections; Index++) {
183 Status = ImageContext->ImageRead (
184 ImageContext->Handle,
189 if (EFI_ERROR (Status)) {
193 Status = EFI_NOT_FOUND;
205 ValueInSectionHeader =
ReadUnaligned64 ((UINT64 *)&SectionHeader.PointerToRelocations);
206 if (ValueInSectionHeader != 0) {
210 if ((INT64)
PcdGet64 (PcdLoadModuleAtFixAddressEnable) > 0) {
215 FixLoadingAddress = ValueInSectionHeader;
221 FixLoadingAddress = (
EFI_PHYSICAL_ADDRESS)(Private->LoadModuleAtFixAddressTopAddress + (INT64)ValueInSectionHeader);
228 if (!EFI_ERROR (Status)) {
232 ImageContext->ImageAddress = FixLoadingAddress;
242 DEBUG ((DEBUG_INFO|DEBUG_LOAD,
"LOADING MODULE FIXED INFO: Loading module at fixed address 0x%11p. Status= %r \n", (
VOID *)(
UINTN)FixLoadingAddress, Status));
269 OUT UINT64 *ImageSize,
276 UINT64 AlignImageSize;
281 BOOLEAN IsRegisterForShadow;
288 ZeroMem (&ImageContext,
sizeof (ImageContext));
289 ImageContext.
Handle = Pe32Data;
293 if (EFI_ERROR (Status)) {
301 if (Private->HobList.HandoffInformationTable->
BootMode == BOOT_ON_S3_RESUME) {
305 IsRegisterForShadow =
FALSE;
306 if ( (Private->CurrentFileHandle == FileHandle)
307 && (Private->
Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] == PEIM_STATE_REGISTER_FOR_SHADOW))
309 IsRegisterForShadow =
TRUE;
329 if ((
FileInfo.FileType == EFI_FV_FILETYPE_PEI_CORE) ||
330 (
FileInfo.FileType == EFI_FV_FILETYPE_PEIM) ||
331 (
FileInfo.FileType == EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER))
340 ((!IsPeiModule) ||
PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes) ||
341 (!IsS3Boot && (
PcdGetBool (PcdShadowPeimOnBoot) || IsRegisterForShadow)) ||
342 (IsS3Boot &&
PcdGetBool (PcdShadowPeimOnS3Boot)))
345 DEBUG ((DEBUG_INFO|DEBUG_LOAD,
"The image at 0x%08x without reloc section can't be loaded into memory\n", (
UINTN)Pe32Data));
359 ((!IsPeiModule) ||
PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes) ||
360 (!IsS3Boot && (
PcdGetBool (PcdShadowPeimOnBoot) || IsRegisterForShadow)) ||
361 (IsS3Boot &&
PcdGetBool (PcdShadowPeimOnS3Boot)))
377 if ((
PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0) && (Private->HobList.HandoffInformationTable->
BootMode != BOOT_ON_S3_RESUME)) {
379 if (EFI_ERROR (Status)) {
380 DEBUG ((DEBUG_INFO|DEBUG_LOAD,
"LOADING MODULE FIXED ERROR: Failed to load module at fixed address. \n"));
398 if (!EFI_ERROR (Status)) {
426 ReturnStatus = EFI_WARN_BUFFER_TOO_SMALL;
432 return EFI_OUT_OF_RESOURCES;
441 if (EFI_ERROR (Status)) {
442 if (ImageContext.
ImageError == IMAGE_ERROR_INVALID_SECTION_ALIGNMENT) {
453 if (EFI_ERROR (Status)) {
490 ZeroMem (&ImageContext,
sizeof (ImageContext));
491 ImageContext.
Handle = Pe32Data;
495 if (EFI_ERROR (Status)) {
506 if (EFI_ERROR (Status)) {
515 if (EFI_ERROR (Status)) {
547 EFI_SECTION_TYPE SearchType1;
548 EFI_SECTION_TYPE SearchType2;
549 UINT32 AuthenticationState;
553 if (
FeaturePcdGet (PcdPeiCoreImageLoaderSearchTeSectionFirst)) {
554 SearchType1 = EFI_SECTION_TE;
558 SearchType2 = EFI_SECTION_TE;
575 if (EFI_ERROR (Status)) {
613 OUT UINT64 *ImageSizeArg OPTIONAL,
615 OUT UINT32 *AuthenticationState
624 EFI_SECTION_TYPE SearchType1;
625 EFI_SECTION_TYPE SearchType2;
627 CHAR8 EfiFileName[512];
633 *AuthenticationState = 0;
635 if (
FeaturePcdGet (PcdPeiCoreImageLoaderSearchTeSectionFirst)) {
636 SearchType1 = EFI_SECTION_TE;
640 SearchType2 = EFI_SECTION_TE;
657 if (EFI_ERROR (Status)) {
665 if (EFI_ERROR (Status)) {
674 DEBUG ((DEBUG_INFO,
"Loading PEIM %g\n", FileHandle));
687 if (EFI_ERROR (Status)) {
694 Pe32Data = (
VOID *)((
UINTN)ImageAddress);
695 *EntryPoint = ImageEntryPoint;
697 Machine = PeCoffLoaderGetMachineType (Pe32Data);
699 if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Machine)) {
700 if (!EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED (Machine)) {
701 return EFI_UNSUPPORTED;
705 if (ImageAddressArg !=
NULL) {
706 *ImageAddressArg = ImageAddress;
709 if (ImageSizeArg !=
NULL) {
710 *ImageSizeArg = ImageSize;
717 DEBUG ((DEBUG_INFO | DEBUG_LOAD,
"Loading PEIM at 0x%11p EntryPoint=0x%11p ", (
VOID *)(
UINTN)ImageAddress, (
VOID *)(
UINTN)*EntryPoint));
722 DEBUG ((DEBUG_INFO | DEBUG_LOAD,
"Loading PEIM at 0x%11p EntryPoint=0x%11p ", (
VOID *)(
UINTN)ImageAddress, (
VOID *)(
UINTN)(*(UINT64 *)(
UINTN)*EntryPoint)));
728 AsciiString = PeCoffLoaderGetPdbPointer (Pe32Data);
730 if (AsciiString !=
NULL) {
732 for (Index = 0; AsciiString[Index] != 0; Index++) {
733 if ((AsciiString[Index] ==
'\\') || (AsciiString[Index] ==
'/')) {
734 StartIndex = Index + 1;
743 for (Index = 0; Index <
sizeof (EfiFileName) - 4; Index++) {
744 EfiFileName[Index] = AsciiString[Index + StartIndex];
745 if (EfiFileName[Index] == 0) {
746 EfiFileName[Index] =
'.';
749 if (EfiFileName[Index] ==
'.') {
750 EfiFileName[Index + 1] =
'e';
751 EfiFileName[Index + 2] =
'f';
752 EfiFileName[Index + 3] =
'i';
753 EfiFileName[Index + 4] = 0;
758 if (Index ==
sizeof (EfiFileName) - 4) {
759 EfiFileName[Index] = 0;
762 DEBUG ((DEBUG_INFO | DEBUG_LOAD,
"%a", EfiFileName));
765 DEBUG ((DEBUG_INFO | DEBUG_LOAD,
"\n"));
789 OUT UINT64 *ImageSizeArg OPTIONAL,
791 OUT UINT32 *AuthenticationState
821 ASSERT (Pe32Data !=
NULL);
824 if (DosHdr->
e_magic == EFI_IMAGE_DOS_SIGNATURE) {
847 if (Hdr.Te->
Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
853 }
else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
886 OUT UINT32 *AuthenticationState
905 &gEfiPeiLoadFilePpiGuid,
910 if (!EFI_ERROR (PpiStatus)) {
911 Status = LoadFile->LoadFile (
919 if (!EFI_ERROR (Status) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {
923 if (PeimState == PEIM_STATE_REGISTER_FOR_SHADOW) {
927 return EFI_UNSUPPORTED;
934 ASSERT (EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeCoffLoaderGetMachineType ((
VOID *)(
UINTN)ImageAddress)));
935 if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeCoffLoaderGetMachineType ((
VOID *)(
UINTN)ImageAddress))) {
936 return EFI_UNSUPPORTED;
944 }
while (!EFI_ERROR (PpiStatus));
964 if (OldCoreData ==
NULL) {
969 PrivateData->XipLoadFile = &gPpiLoadFilePpiList;
VOID *EFIAPI InvalidateInstructionCacheRange(IN VOID *Address, IN UINTN Length)
CONST EFI_PEI_SERVICES **EFIAPI GetPeiServicesTablePointer(VOID)
UINT64 EFIAPI ReadUnaligned64(IN CONST VOID *Buffer)
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_STATUS GetPeCoffImageFixLoadingAssignedAddress(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
EFI_STATUS CheckAndMarkFixLoadingMemoryUsageBitMap(IN EFI_PHYSICAL_ADDRESS ImageBase, IN UINTN ImageSize)
VOID InitializeImageServices(IN PEI_CORE_INSTANCE *PrivateData, IN PEI_CORE_INSTANCE *OldCoreData)
EFI_STATUS PeiLoadImage(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_FILE_HANDLE FileHandle, IN UINT8 PeimState, OUT EFI_PHYSICAL_ADDRESS *EntryPoint, OUT UINT32 *AuthenticationState)
BOOLEAN RelocationIsStrip(IN VOID *Pe32Data)
EFI_STATUS LoadAndRelocatePeCoffImageInPlace(IN VOID *Pe32Data, IN VOID *ImageAddress)
EFI_STATUS EFIAPI PeiImageRead(IN VOID *FileHandle, IN UINTN FileOffset, IN UINTN *ReadSize, OUT VOID *Buffer)
EFI_STATUS PeiLoadImageLoadImage(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_PHYSICAL_ADDRESS *ImageAddressArg OPTIONAL, OUT UINT64 *ImageSizeArg OPTIONAL, OUT EFI_PHYSICAL_ADDRESS *EntryPoint, OUT UINT32 *AuthenticationState)
EFI_STATUS LoadAndRelocatePeCoffImage(IN EFI_PEI_FILE_HANDLE FileHandle, IN VOID *Pe32Data, OUT EFI_PHYSICAL_ADDRESS *ImageAddress, OUT UINT64 *ImageSize, OUT EFI_PHYSICAL_ADDRESS *EntryPoint)
EFI_STATUS PeiGetPe32Data(IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **Pe32Data)
EFI_STATUS EFIAPI PeiLoadImageLoadImageWrapper(IN CONST EFI_PEI_LOAD_FILE_PPI *This, IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_PHYSICAL_ADDRESS *ImageAddressArg OPTIONAL, OUT UINT64 *ImageSizeArg OPTIONAL, OUT EFI_PHYSICAL_ADDRESS *EntryPoint, OUT UINT32 *AuthenticationState)
EFI_STATUS EFIAPI PeiServicesFfsGetFileInfo(IN CONST EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_FV_FILE_INFO *FileInfo)
EFI_STATUS EFIAPI PeiServicesLocatePpi(IN CONST EFI_GUID *Guid, IN UINTN Instance, IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, IN OUT VOID **Ppi)
EFI_STATUS EFIAPI PeiServicesAllocatePages(IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, OUT EFI_PHYSICAL_ADDRESS *Memory)
EFI_STATUS EFIAPI PeiServicesInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
EFI_STATUS EFIAPI PeiServicesReInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi, IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define PcdGet64(TokenName)
#define PcdGet32(TokenName)
#define PcdGetBool(TokenName)
#define FeaturePcdGet(TokenName)
RETURN_STATUS EFIAPI PeCoffLoaderLoadImage(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
RETURN_STATUS EFIAPI PeCoffLoaderRelocateImage(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
RETURN_STATUS EFIAPI PeCoffLoaderGetImageInfo(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
#define EFI_IMAGE_SCN_CNT_CODE
0x00000020
#define EFI_IMAGE_FILE_RELOCS_STRIPPED
0x0001 Relocation info stripped from file.
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a)
EFI_STATUS EFIAPI PeiServicesFfsFindSectionData3(IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData, OUT UINT32 *AuthenticationStatus)
VOID * EFI_PEI_FILE_HANDLE
EFI_FILE_INFO * FileInfo(IN EFI_FILE_HANDLE FHand)
UINT64 EFI_PHYSICAL_ADDRESS
#define EFI_PAGES_TO_SIZE(Pages)
#define EFI_IMAGE_MACHINE_IA64
#define EFI_SIZE_TO_PAGES(Size)
UINT32 e_lfanew
File address of new exe header.
UINT16 e_magic
Magic number.
UINT16 Signature
The signature for TE format = "VZ".
EFI_IMAGE_DATA_DIRECTORY DataDirectory[2]
Only base relocation and debug directory.
UINT8 NumberOfSections
From the original file header.
BOOLEAN RelocationsStripped
PE_COFF_LOADER_READ_FILE ImageRead
PHYSICAL_ADDRESS EntryPoint
PHYSICAL_ADDRESS ImageAddress