mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 22:54:51 +02:00
BaseTools/C: Consume UefiImageLib and ImageToolEmit
This commit is contained in:
parent
f69039282f
commit
c57cc69793
@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
#include "ImageTool.h"
|
#include "ImageTool.h"
|
||||||
|
|
||||||
|
#include <Uefi/UefiBaseType.h>
|
||||||
|
#include <Uefi/UefiSpec.h>
|
||||||
|
|
||||||
static
|
static
|
||||||
EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *
|
EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *
|
||||||
CreateEntry (
|
CreateEntry (
|
||||||
|
@ -52,13 +52,6 @@ typedef struct {
|
|||||||
bool HasPieRelocs;
|
bool HasPieRelocs;
|
||||||
} tool_elf_scan_context;
|
} tool_elf_scan_context;
|
||||||
|
|
||||||
#if defined (_MSC_EXTENSIONS)
|
|
||||||
#define EFI_IMAGE_MACHINE_IA32 0x014C
|
|
||||||
#define EFI_IMAGE_MACHINE_X64 0x8664
|
|
||||||
#define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2
|
|
||||||
#define EFI_IMAGE_MACHINE_AARCH64 0xAA64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define GetShrbyIndex ELF_SUFFIX(GetShrbyIndex)
|
#define GetShrbyIndex ELF_SUFFIX(GetShrbyIndex)
|
||||||
static
|
static
|
||||||
@ -687,17 +680,17 @@ ScanElf (
|
|||||||
switch (Ehdr->e_machine) {
|
switch (Ehdr->e_machine) {
|
||||||
#if ELF_ARCH == 64
|
#if ELF_ARCH == 64
|
||||||
case EM_X86_64:
|
case EM_X86_64:
|
||||||
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_X64;
|
ImageInfo->HeaderInfo.Machine = IMAGE_FILE_MACHINE_X64;
|
||||||
break;
|
break;
|
||||||
case EM_AARCH64:
|
case EM_AARCH64:
|
||||||
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_AARCH64;
|
ImageInfo->HeaderInfo.Machine = IMAGE_FILE_MACHINE_ARM64;
|
||||||
break;
|
break;
|
||||||
#elif ELF_ARCH == 32
|
#elif ELF_ARCH == 32
|
||||||
case EM_386:
|
case EM_386:
|
||||||
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_IA32;
|
ImageInfo->HeaderInfo.Machine = IMAGE_FILE_MACHINE_I386;
|
||||||
break;
|
break;
|
||||||
case EM_ARM:
|
case EM_ARM:
|
||||||
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED;
|
ImageInfo->HeaderInfo.Machine = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -14,12 +14,17 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#else
|
#else
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
|
#include <io.h>
|
||||||
#endif
|
#endif
|
||||||
#include "CommonLib.h"
|
#include "CommonLib.h"
|
||||||
#include "EfiUtilityMsgs.h"
|
#include "EfiUtilityMsgs.h"
|
||||||
|
#include "FvLib.h"
|
||||||
|
|
||||||
|
#include <Common/PiFirmwareFile.h>
|
||||||
|
|
||||||
#include <Uefi/UefiSpec.h>
|
#include <Uefi/UefiSpec.h>
|
||||||
#include <Library/PhaseMemoryAllocationLib.h>
|
#include <Library/PhaseMemoryAllocationLib.h>
|
||||||
|
#include <Library/UefiImageLib.h>
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_MEMORY_TYPE gPhaseDefaultDataType = EfiBootServicesData;
|
GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_MEMORY_TYPE gPhaseDefaultDataType = EfiBootServicesData;
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_MEMORY_TYPE gPhaseDefaultCodeType = EfiBootServicesCode;
|
GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_MEMORY_TYPE gPhaseDefaultCodeType = EfiBootServicesCode;
|
||||||
@ -615,3 +620,64 @@ CpuDeadLoop (
|
|||||||
{
|
{
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
GetAlignmentFromFile (
|
||||||
|
IN CHAR8 *InFile,
|
||||||
|
OUT UINT32 *Alignment
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
InFile is input file for getting alignment
|
||||||
|
return the alignment
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
FILE *InFileHandle;
|
||||||
|
UINT8 *ImageFileBuffer;
|
||||||
|
UINTN ImageFileSize;
|
||||||
|
UINT32 CurSecHdrSize;
|
||||||
|
UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext;
|
||||||
|
EFI_COMMON_SECTION_HEADER *CommonHeader;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
InFileHandle = NULL;
|
||||||
|
ImageFileBuffer = NULL;
|
||||||
|
*Alignment = 0;
|
||||||
|
|
||||||
|
InFileHandle = fopen(LongFilePath(InFile), "rb");
|
||||||
|
if (InFileHandle == NULL){
|
||||||
|
Error (NULL, 0, 0001, "Error opening file", InFile);
|
||||||
|
return EFI_ABORTED;
|
||||||
|
}
|
||||||
|
ImageFileSize = _filelength (fileno(InFileHandle));
|
||||||
|
ImageFileBuffer = (UINT8 *) malloc (ImageFileSize);
|
||||||
|
if (ImageFileBuffer == NULL) {
|
||||||
|
fclose (InFileHandle);
|
||||||
|
Error(NULL, 0, 4001, "Resource", "memory cannot be allocated for %s", InFile);
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
fread (ImageFileBuffer, sizeof (UINT8), ImageFileSize, InFileHandle);
|
||||||
|
fclose (InFileHandle);
|
||||||
|
|
||||||
|
CommonHeader = (EFI_COMMON_SECTION_HEADER *) ImageFileBuffer;
|
||||||
|
CurSecHdrSize = GetSectionHeaderLength(CommonHeader);
|
||||||
|
|
||||||
|
Status = UefiImageInitializeContext (
|
||||||
|
&ImageContext,
|
||||||
|
ImageFileBuffer + CurSecHdrSize,
|
||||||
|
ImageFileSize,
|
||||||
|
UEFI_IMAGE_SOURCE_FV
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
Error (NULL, 0, 3000, "Invalid UefiImage", "The input file is %s and return status is %x", InFile, (int) Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Alignment = UefiImageGetSegmentAlignment (&ImageContext);
|
||||||
|
// Free the allocated memory resource
|
||||||
|
if (ImageFileBuffer != NULL) {
|
||||||
|
free (ImageFileBuffer);
|
||||||
|
ImageFileBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
@ -113,6 +113,12 @@ LongFilePath (
|
|||||||
IN CHAR8 *FileName
|
IN CHAR8 *FileName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
GetAlignmentFromFile (
|
||||||
|
IN CHAR8 *InFile,
|
||||||
|
OUT UINT32 *Alignment
|
||||||
|
);
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
@ -11,7 +11,6 @@ MAKEROOT ?= ..
|
|||||||
LIBNAME = Common
|
LIBNAME = Common
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
BasePeCoff.o \
|
|
||||||
BinderFuncs.o \
|
BinderFuncs.o \
|
||||||
CommonLib.o \
|
CommonLib.o \
|
||||||
Crc32.o \
|
Crc32.o \
|
||||||
@ -25,13 +24,26 @@ OBJECTS = \
|
|||||||
OsPath.o \
|
OsPath.o \
|
||||||
ParseGuidedSectionTools.o \
|
ParseGuidedSectionTools.o \
|
||||||
ParseInf.o \
|
ParseInf.o \
|
||||||
PeCoffLoaderEx.o \
|
|
||||||
SimpleFileParsing.o \
|
SimpleFileParsing.o \
|
||||||
StringFuncs.o \
|
StringFuncs.o \
|
||||||
TianoCompress.o
|
TianoCompress.o
|
||||||
|
|
||||||
OBJECTS += AutoGen.o DebugLib.o
|
OBJECTS += AutoGen.o DebugLib.o
|
||||||
|
|
||||||
|
OBJECTS += \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/ImageToolEmit.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/Image.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/ElfScan32.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/ElfScan64.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/ElfScanCommon.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/UefiImageScan.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/PeScan.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/PeEmit32.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/PeEmit64.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/PeEmitCommon.o \
|
||||||
|
$(EDK2_OBJPATH)/BaseTools/ImageTool/BinEmit.o \
|
||||||
|
$(EDK2_OBJPATH)/OpenCorePkg/User/Library/UserFile.o
|
||||||
|
|
||||||
OBJECTS += \
|
OBJECTS += \
|
||||||
$(EDK2_OBJPATH)/MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.o
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.o
|
||||||
|
|
||||||
@ -92,6 +104,30 @@ OBJECTS += \
|
|||||||
$(EDK2_OBJPATH)/MdePkg/Library/BasePrintLib/PrintLib.o \
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePrintLib/PrintLib.o \
|
||||||
$(EDK2_OBJPATH)/MdePkg/Library/BasePrintLib/PrintLibInternal.o
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePrintLib/PrintLibInternal.o
|
||||||
|
|
||||||
|
OBJECTS += \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseOverflowLib/BaseAlignment.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseOverflowLib/BaseBitOverflow.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseOverflowLib/BaseMath.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseOverflowLib/BaseNativeOverflow.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseOverflowLib/BaseTripleOverflow.o
|
||||||
|
|
||||||
|
OBJECTS += \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffDebug.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffHash.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffHii.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffInfo.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffInit.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffLoad.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BasePeCoffLib2/PeCoffRelocate.o
|
||||||
|
|
||||||
|
OBJECTS += \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseUefiImageLib/CommonSupport.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseUefiImageLib/PeCoffSupport.o \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseUefiImageLib/UefiImageLibPeCoff.o
|
||||||
|
|
||||||
|
OBJECTS += \
|
||||||
|
$(EDK2_OBJPATH)/MdePkg/Library/BaseUefiImageExtraActionLibNull/UefiImageExtraActionLib.o
|
||||||
|
|
||||||
OBJECTS += \
|
OBJECTS += \
|
||||||
$(EDK2_OBJPATH)/MdeModulePkg/Library/BaseMemoryProfileLibNull/BaseMemoryProfileLibNull.o
|
$(EDK2_OBJPATH)/MdeModulePkg/Library/BaseMemoryProfileLibNull/BaseMemoryProfileLibNull.o
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
LIBNAME = Common
|
LIBNAME = Common
|
||||||
|
|
||||||
OBJECTS = \
|
OBJECTS = \
|
||||||
BasePeCoff.obj \
|
|
||||||
BinderFuncs.obj \
|
BinderFuncs.obj \
|
||||||
CommonLib.obj \
|
CommonLib.obj \
|
||||||
Crc32.obj \
|
Crc32.obj \
|
||||||
@ -25,13 +24,26 @@ OBJECTS = \
|
|||||||
OsPath.obj \
|
OsPath.obj \
|
||||||
ParseGuidedSectionTools.obj \
|
ParseGuidedSectionTools.obj \
|
||||||
ParseInf.obj \
|
ParseInf.obj \
|
||||||
PeCoffLoaderEx.obj \
|
|
||||||
SimpleFileParsing.obj \
|
SimpleFileParsing.obj \
|
||||||
StringFuncs.obj \
|
StringFuncs.obj \
|
||||||
TianoCompress.obj
|
TianoCompress.obj
|
||||||
|
|
||||||
OBJECTS = $(OBJECTS) AutoGen.obj DebugLib.obj
|
OBJECTS = $(OBJECTS) AutoGen.obj DebugLib.obj
|
||||||
|
|
||||||
|
OBJECTS = $(OBJECTS) \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\ImageToolEmit.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\Image.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\ElfScan32.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\ElfScan64.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\ElfScanCommon.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\UefiImageScan.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\PeScan.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\PeEmit32.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\PeEmit64.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\PeEmitCommon.obj \
|
||||||
|
$(EDK2_OBJPATH)\BaseTools\ImageTool\BinEmit.obj \
|
||||||
|
$(EDK2_OBJPATH)\OpenCorePkg\User\Library\UserFile.obj
|
||||||
|
|
||||||
OBJECTS = $(OBJECTS) \
|
OBJECTS = $(OBJECTS) \
|
||||||
$(EDK2_OBJPATH)\MdePkg\Library\BaseDebugPrintErrorLevelLib\BaseDebugPrintErrorLevelLib.obj
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseDebugPrintErrorLevelLib\BaseDebugPrintErrorLevelLib.obj
|
||||||
|
|
||||||
@ -91,6 +103,30 @@ OBJECTS = $(OBJECTS) \
|
|||||||
$(EDK2_OBJPATH)\MdePkg\Library\BasePrintLib\PrintLib.obj \
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePrintLib\PrintLib.obj \
|
||||||
$(EDK2_OBJPATH)\MdePkg\Library\BasePrintLib\PrintLibInternal.obj
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePrintLib\PrintLibInternal.obj
|
||||||
|
|
||||||
|
OBJECTS = $(OBJECTS) \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseOverflowLib\BaseAlignment.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseOverflowLib\BaseBitOverflow.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseOverflowLib\BaseMath.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseOverflowLib\BaseNativeOverflow.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseOverflowLib\BaseTripleOverflow.obj
|
||||||
|
|
||||||
|
OBJECTS = $(OBJECTS) \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffDebug.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffHash.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffHii.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffInfo.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffInit.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffLoad.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\PeCoffRelocate.obj
|
||||||
|
|
||||||
|
OBJECTS = $(OBJECTS) \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseUefiImageLib\CommonSupport.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseUefiImageLib\PeCoffSupport.obj \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseUefiImageLib\UefiImageLibPeCoff.obj
|
||||||
|
|
||||||
|
OBJECTS = $(OBJECTS) \
|
||||||
|
$(EDK2_OBJPATH)\MdePkg\Library\BaseUefiImageExtraActionLibNull\UefiImageExtraActionLib.obj
|
||||||
|
|
||||||
OBJECTS = $(OBJECTS) \
|
OBJECTS = $(OBJECTS) \
|
||||||
$(EDK2_OBJPATH)\MdeModulePkg\Library\BaseMemoryProfileLibNull\BaseMemoryProfileLibNull.obj
|
$(EDK2_OBJPATH)\MdeModulePkg\Library\BaseMemoryProfileLibNull\BaseMemoryProfileLibNull.obj
|
||||||
|
|
||||||
|
@ -1,213 +0,0 @@
|
|||||||
/** @file
|
|
||||||
Function prototypes and defines on Memory Only PE COFF loader
|
|
||||||
|
|
||||||
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
||||||
Portion Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef __BASE_PE_COFF_LIB_H__
|
|
||||||
#define __BASE_PE_COFF_LIB_H__
|
|
||||||
|
|
||||||
//
|
|
||||||
// Return status codes from the PE/COFF Loader services
|
|
||||||
// BUGBUG: Find where used and see if can be replaced by RETURN_STATUS codes
|
|
||||||
//
|
|
||||||
#define IMAGE_ERROR_SUCCESS 0
|
|
||||||
#define IMAGE_ERROR_IMAGE_READ 1
|
|
||||||
#define IMAGE_ERROR_INVALID_PE_HEADER_SIGNATURE 2
|
|
||||||
#define IMAGE_ERROR_INVALID_MACHINE_TYPE 3
|
|
||||||
#define IMAGE_ERROR_INVALID_SUBSYSTEM 4
|
|
||||||
#define IMAGE_ERROR_INVALID_IMAGE_ADDRESS 5
|
|
||||||
#define IMAGE_ERROR_INVALID_IMAGE_SIZE 6
|
|
||||||
#define IMAGE_ERROR_INVALID_SECTION_ALIGNMENT 7
|
|
||||||
#define IMAGE_ERROR_SECTION_NOT_LOADED 8
|
|
||||||
#define IMAGE_ERROR_FAILED_RELOCATION 9
|
|
||||||
#define IMAGE_ERROR_FAILED_ICACHE_FLUSH 10
|
|
||||||
|
|
||||||
//
|
|
||||||
// Macro definitions for RISC-V architecture.
|
|
||||||
//
|
|
||||||
#define RV_X(x, s, n) (((x) >> (s)) & ((1<<(n))-1))
|
|
||||||
#define RISCV_IMM_BITS 12
|
|
||||||
#define RISCV_IMM_REACH (1LL<<RISCV_IMM_BITS)
|
|
||||||
#define RISCV_CONST_HIGH_PART(VALUE) \
|
|
||||||
(((VALUE) + (RISCV_IMM_REACH/2)) & ~(RISCV_IMM_REACH-1))
|
|
||||||
|
|
||||||
//
|
|
||||||
// PE/COFF Loader Read Function passed in by caller
|
|
||||||
//
|
|
||||||
typedef
|
|
||||||
RETURN_STATUS
|
|
||||||
(EFIAPI *PE_COFF_LOADER_READ_FILE) (
|
|
||||||
IN VOID *FileHandle,
|
|
||||||
IN UINTN FileOffset,
|
|
||||||
IN OUT UINTN *ReadSize,
|
|
||||||
OUT VOID *Buffer
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Context structure used while PE/COFF image is being loaded and relocated
|
|
||||||
//
|
|
||||||
typedef struct {
|
|
||||||
PHYSICAL_ADDRESS ImageAddress;
|
|
||||||
UINT64 ImageSize;
|
|
||||||
PHYSICAL_ADDRESS DestinationAddress;
|
|
||||||
PHYSICAL_ADDRESS EntryPoint;
|
|
||||||
PE_COFF_LOADER_READ_FILE ImageRead;
|
|
||||||
VOID *Handle;
|
|
||||||
VOID *FixupData;
|
|
||||||
UINT32 SectionAlignment;
|
|
||||||
UINT32 PeCoffHeaderOffset;
|
|
||||||
UINT32 DebugDirectoryEntryRva;
|
|
||||||
VOID *CodeView;
|
|
||||||
CHAR8 *PdbPointer;
|
|
||||||
UINTN SizeOfHeaders;
|
|
||||||
UINT32 ImageCodeMemoryType;
|
|
||||||
UINT32 ImageDataMemoryType;
|
|
||||||
UINT32 ImageError;
|
|
||||||
UINTN FixupDataSize;
|
|
||||||
UINT16 Machine;
|
|
||||||
UINT16 ImageType;
|
|
||||||
BOOLEAN RelocationsStripped;
|
|
||||||
BOOLEAN IsTeImage;
|
|
||||||
} PE_COFF_LOADER_IMAGE_CONTEXT;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Retrieves information on a PE/COFF image
|
|
||||||
|
|
||||||
@param ImageContext The context of the image being loaded
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The information on the PE/COFF image was collected.
|
|
||||||
@retval EFI_INVALID_PARAMETER ImageContext is NULL.
|
|
||||||
@retval EFI_UNSUPPORTED The PE/COFF image is not supported.
|
|
||||||
@retval Otherwise The error status from reading the PE/COFF image using the
|
|
||||||
ImageContext->ImageRead() function
|
|
||||||
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
EFIAPI
|
|
||||||
PeCoffLoaderGetImageInfo (
|
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Relocates a PE/COFF image in memory
|
|
||||||
|
|
||||||
@param ImageContext Contains information on the loaded image to relocate
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS if the PE/COFF image was relocated
|
|
||||||
@retval EFI_LOAD_ERROR if the image is not a valid PE/COFF image
|
|
||||||
@retval EFI_UNSUPPORTED not support
|
|
||||||
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
EFIAPI
|
|
||||||
PeCoffLoaderRelocateImage (
|
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Loads a PE/COFF image into memory
|
|
||||||
|
|
||||||
@param ImageContext Contains information on image to load into memory
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS if the PE/COFF image was loaded
|
|
||||||
@retval EFI_BUFFER_TOO_SMALL if the caller did not provide a large enough buffer
|
|
||||||
@retval EFI_LOAD_ERROR if the image is a runtime driver with no relocations
|
|
||||||
@retval EFI_INVALID_PARAMETER if the image address is invalid
|
|
||||||
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
EFIAPI
|
|
||||||
PeCoffLoaderLoadImage (
|
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
VOID *
|
|
||||||
EFIAPI
|
|
||||||
PeCoffLoaderGetPdbPointer (
|
|
||||||
IN VOID *Pe32Data
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
RETURN_STATUS
|
|
||||||
EFIAPI
|
|
||||||
PeCoffLoaderGetEntryPoint (
|
|
||||||
IN VOID *Pe32Data,
|
|
||||||
OUT VOID **EntryPoint,
|
|
||||||
OUT VOID **BaseOfImage
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
// These functions are used by the ARM PE/COFF relocation code and by
|
|
||||||
// the ELF to PE/COFF converter so that is why they are public
|
|
||||||
//
|
|
||||||
|
|
||||||
/**
|
|
||||||
Pass in a pointer to an ARM MOVT or MOVW immediate instruction and
|
|
||||||
return the immediate data encoded in the instruction
|
|
||||||
|
|
||||||
@param Instruction Pointer to ARM MOVT or MOVW immediate instruction
|
|
||||||
|
|
||||||
@return Immediate address encoded in the instruction
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINT16
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovtImmediateAddress (
|
|
||||||
IN UINT16 *Instruction
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Update an ARM MOVT or MOVW immediate instruction immediate data.
|
|
||||||
|
|
||||||
@param Instruction Pointer to ARM MOVT or MOVW immediate instruction
|
|
||||||
@param Address New address to patch into the instruction
|
|
||||||
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovtImmediatePatch (
|
|
||||||
IN OUT UINT16 *Instruction,
|
|
||||||
IN UINT16 Address
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Pass in a pointer to an ARM MOVW/MOVT instruction pair and
|
|
||||||
return the immediate data encoded in the two` instruction
|
|
||||||
|
|
||||||
@param Instructions Pointer to ARM MOVW/MOVT instruction pair
|
|
||||||
|
|
||||||
@return Immediate address encoded in the instructions
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINT32
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovwMovtImmediateAddress (
|
|
||||||
IN UINT16 *Instructions
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Update an ARM MOVW/MOVT immediate instruction instruction pair.
|
|
||||||
|
|
||||||
@param Instructions Pointer to ARM MOVW/MOVT instruction pair
|
|
||||||
@param Address New address to patch into the instructions
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovwMovtImmediatePatch (
|
|
||||||
IN OUT UINT16 *Instructions,
|
|
||||||
IN UINT32 Address
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,385 +0,0 @@
|
|||||||
/** @file
|
|
||||||
IA32 and X64 Specific relocation fixups
|
|
||||||
|
|
||||||
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
||||||
Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
|
|
||||||
Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
|
||||||
Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
--*/
|
|
||||||
|
|
||||||
#include <Common/UefiBaseTypes.h>
|
|
||||||
#include <Common/PeImageEx.h>
|
|
||||||
#include "PeCoffLib.h"
|
|
||||||
#include "CommonLib.h"
|
|
||||||
#include "EfiUtilityMsgs.h"
|
|
||||||
|
|
||||||
#define IMM64_IMM7B_INST_WORD_X 3
|
|
||||||
#define IMM64_IMM7B_SIZE_X 7
|
|
||||||
#define IMM64_IMM7B_INST_WORD_POS_X 4
|
|
||||||
#define IMM64_IMM7B_VAL_POS_X 0
|
|
||||||
|
|
||||||
#define IMM64_IMM9D_INST_WORD_X 3
|
|
||||||
#define IMM64_IMM9D_SIZE_X 9
|
|
||||||
#define IMM64_IMM9D_INST_WORD_POS_X 18
|
|
||||||
#define IMM64_IMM9D_VAL_POS_X 7
|
|
||||||
|
|
||||||
#define IMM64_IMM5C_INST_WORD_X 3
|
|
||||||
#define IMM64_IMM5C_SIZE_X 5
|
|
||||||
#define IMM64_IMM5C_INST_WORD_POS_X 13
|
|
||||||
#define IMM64_IMM5C_VAL_POS_X 16
|
|
||||||
|
|
||||||
#define IMM64_IC_INST_WORD_X 3
|
|
||||||
#define IMM64_IC_SIZE_X 1
|
|
||||||
#define IMM64_IC_INST_WORD_POS_X 12
|
|
||||||
#define IMM64_IC_VAL_POS_X 21
|
|
||||||
|
|
||||||
#define IMM64_IMM41a_INST_WORD_X 1
|
|
||||||
#define IMM64_IMM41a_SIZE_X 10
|
|
||||||
#define IMM64_IMM41a_INST_WORD_POS_X 14
|
|
||||||
#define IMM64_IMM41a_VAL_POS_X 22
|
|
||||||
|
|
||||||
#define IMM64_IMM41b_INST_WORD_X 1
|
|
||||||
#define IMM64_IMM41b_SIZE_X 8
|
|
||||||
#define IMM64_IMM41b_INST_WORD_POS_X 24
|
|
||||||
#define IMM64_IMM41b_VAL_POS_X 32
|
|
||||||
|
|
||||||
#define IMM64_IMM41c_INST_WORD_X 2
|
|
||||||
#define IMM64_IMM41c_SIZE_X 23
|
|
||||||
#define IMM64_IMM41c_INST_WORD_POS_X 0
|
|
||||||
#define IMM64_IMM41c_VAL_POS_X 40
|
|
||||||
|
|
||||||
#define IMM64_SIGN_INST_WORD_X 3
|
|
||||||
#define IMM64_SIGN_SIZE_X 1
|
|
||||||
#define IMM64_SIGN_INST_WORD_POS_X 27
|
|
||||||
#define IMM64_SIGN_VAL_POS_X 63
|
|
||||||
|
|
||||||
UINT32 *RiscVHi20Fixup = NULL;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Performs an IA-32 specific relocation fixup
|
|
||||||
|
|
||||||
@param Reloc Pointer to the relocation record
|
|
||||||
@param Fixup Pointer to the address to fix up
|
|
||||||
@param FixupData Pointer to a buffer to log the fixups
|
|
||||||
@param Adjust The offset to adjust the fixup
|
|
||||||
|
|
||||||
@retval EFI_UNSUPPORTED - Unsupported now
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
PeCoffLoaderRelocateIa32Image (
|
|
||||||
IN UINT16 *Reloc,
|
|
||||||
IN OUT CHAR8 *Fixup,
|
|
||||||
IN OUT CHAR8 **FixupData,
|
|
||||||
IN UINT64 Adjust
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return RETURN_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Performs an RISC-V specific relocation fixup
|
|
||||||
|
|
||||||
@param Reloc Pointer to the relocation record
|
|
||||||
@param Fixup Pointer to the address to fix up
|
|
||||||
@param FixupData Pointer to a buffer to log the fixups
|
|
||||||
@param Adjust The offset to adjust the fixup
|
|
||||||
|
|
||||||
@return Status code
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
PeCoffLoaderRelocateRiscVImage (
|
|
||||||
IN UINT16 *Reloc,
|
|
||||||
IN OUT CHAR8 *Fixup,
|
|
||||||
IN OUT CHAR8 **FixupData,
|
|
||||||
IN UINT64 Adjust
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 Value;
|
|
||||||
UINT32 Value2;
|
|
||||||
|
|
||||||
switch ((*Reloc) >> 12) {
|
|
||||||
case EFI_IMAGE_REL_BASED_RISCV_HI20:
|
|
||||||
RiscVHi20Fixup = (UINT32 *) Fixup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_IMAGE_REL_BASED_RISCV_LOW12I:
|
|
||||||
if (RiscVHi20Fixup != NULL) {
|
|
||||||
Value = (UINT32)(RV_X(*RiscVHi20Fixup, 12, 20) << 12);
|
|
||||||
Value2 = (UINT32)(RV_X(*(UINT32 *)Fixup, 20, 12));
|
|
||||||
if (Value2 & (RISCV_IMM_REACH/2)) {
|
|
||||||
Value2 |= ~(RISCV_IMM_REACH-1);
|
|
||||||
}
|
|
||||||
Value += Value2;
|
|
||||||
Value += (UINT32)Adjust;
|
|
||||||
Value2 = RISCV_CONST_HIGH_PART (Value);
|
|
||||||
*(UINT32 *)RiscVHi20Fixup = (RV_X (Value2, 12, 20) << 12) | \
|
|
||||||
(RV_X (*(UINT32 *)RiscVHi20Fixup, 0, 12));
|
|
||||||
*(UINT32 *)Fixup = (RV_X (Value, 0, 12) << 20) | \
|
|
||||||
(RV_X (*(UINT32 *)Fixup, 0, 20));
|
|
||||||
}
|
|
||||||
RiscVHi20Fixup = NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_IMAGE_REL_BASED_RISCV_LOW12S:
|
|
||||||
if (RiscVHi20Fixup != NULL) {
|
|
||||||
Value = (UINT32)(RV_X(*RiscVHi20Fixup, 12, 20) << 12);
|
|
||||||
Value2 = (UINT32)(RV_X(*(UINT32 *)Fixup, 7, 5) | (RV_X(*(UINT32 *)Fixup, 25, 7) << 5));
|
|
||||||
if (Value2 & (RISCV_IMM_REACH/2)) {
|
|
||||||
Value2 |= ~(RISCV_IMM_REACH-1);
|
|
||||||
}
|
|
||||||
Value += Value2;
|
|
||||||
Value += (UINT32)Adjust;
|
|
||||||
Value2 = RISCV_CONST_HIGH_PART (Value);
|
|
||||||
*(UINT32 *)RiscVHi20Fixup = (RV_X (Value2, 12, 20) << 12) | \
|
|
||||||
(RV_X (*(UINT32 *)RiscVHi20Fixup, 0, 12));
|
|
||||||
Value2 = *(UINT32 *)Fixup & 0x01fff07f;
|
|
||||||
Value &= RISCV_IMM_REACH - 1;
|
|
||||||
*(UINT32 *)Fixup = Value2 | (UINT32)(((RV_X(Value, 0, 5) << 7) | (RV_X(Value, 5, 7) << 25)));
|
|
||||||
}
|
|
||||||
RiscVHi20Fixup = NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
|
|
||||||
}
|
|
||||||
return RETURN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Pass in a pointer to an ARM MOVT or MOVW immediate instruction and
|
|
||||||
return the immediate data encoded in the instruction
|
|
||||||
|
|
||||||
@param Instruction Pointer to ARM MOVT or MOVW immediate instruction
|
|
||||||
|
|
||||||
@return Immediate address encoded in the instruction
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINT16
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovtImmediateAddress (
|
|
||||||
IN UINT16 *Instruction
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT32 Movt;
|
|
||||||
UINT16 Address;
|
|
||||||
|
|
||||||
// Thumb2 is two 16-bit instructions working together. Not a single 32-bit instruction
|
|
||||||
// Example MOVT R0, #0 is 0x0000f2c0 or 0xf2c0 0x0000
|
|
||||||
Movt = (*Instruction << 16) | (*(Instruction + 1));
|
|
||||||
|
|
||||||
// imm16 = imm4:i:imm3:imm8
|
|
||||||
// imm4 -> Bit19:Bit16
|
|
||||||
// i -> Bit26
|
|
||||||
// imm3 -> Bit14:Bit12
|
|
||||||
// imm8 -> Bit7:Bit0
|
|
||||||
Address = (UINT16)(Movt & 0x000000ff); // imm8
|
|
||||||
Address |= (UINT16)((Movt >> 4) & 0x0000f700); // imm4 imm3
|
|
||||||
Address |= (((Movt & BIT26) != 0) ? BIT11 : 0); // i
|
|
||||||
return Address;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Update an ARM MOVT or MOVW immediate instruction immediate data.
|
|
||||||
|
|
||||||
@param Instruction Pointer to ARM MOVT or MOVW immediate instruction
|
|
||||||
@param Address New address to patch into the instruction
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovtImmediatePatch (
|
|
||||||
IN OUT UINT16 *Instruction,
|
|
||||||
IN UINT16 Address
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT16 Patch;
|
|
||||||
|
|
||||||
// First 16-bit chunk of instruction
|
|
||||||
Patch = ((Address >> 12) & 0x000f); // imm4
|
|
||||||
Patch |= (((Address & BIT11) != 0) ? BIT10 : 0); // i
|
|
||||||
*Instruction = (*Instruction & ~0x040f) | Patch;
|
|
||||||
|
|
||||||
// Second 16-bit chunk of instruction
|
|
||||||
Patch = Address & 0x000000ff; // imm8
|
|
||||||
Patch |= ((Address << 4) & 0x00007000); // imm3
|
|
||||||
Instruction++;
|
|
||||||
*Instruction = (*Instruction & ~0x70ff) | Patch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Pass in a pointer to an ARM MOVW/MOVT instruction pair and
|
|
||||||
return the immediate data encoded in the two` instruction
|
|
||||||
|
|
||||||
@param Instructions Pointer to ARM MOVW/MOVT instruction pair
|
|
||||||
|
|
||||||
@return Immediate address encoded in the instructions
|
|
||||||
|
|
||||||
**/
|
|
||||||
UINT32
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovwMovtImmediateAddress (
|
|
||||||
IN UINT16 *Instructions
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT16 *Word;
|
|
||||||
UINT16 *Top;
|
|
||||||
|
|
||||||
Word = Instructions; // MOVW
|
|
||||||
Top = Word + 2; // MOVT
|
|
||||||
|
|
||||||
return (ThumbMovtImmediateAddress (Top) << 16) + ThumbMovtImmediateAddress (Word);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Update an ARM MOVW/MOVT immediate instruction instruction pair.
|
|
||||||
|
|
||||||
@param Instructions Pointer to ARM MOVW/MOVT instruction pair
|
|
||||||
@param Address New address to patch into the instructions
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
ThumbMovwMovtImmediatePatch (
|
|
||||||
IN OUT UINT16 *Instructions,
|
|
||||||
IN UINT32 Address
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT16 *Word;
|
|
||||||
UINT16 *Top;
|
|
||||||
|
|
||||||
Word = (UINT16 *)Instructions; // MOVW
|
|
||||||
Top = Word + 2; // MOVT
|
|
||||||
|
|
||||||
ThumbMovtImmediatePatch (Word, (UINT16)(Address & 0xffff));
|
|
||||||
ThumbMovtImmediatePatch (Top, (UINT16)(Address >> 16));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Performs an ARM-based specific relocation fixup and is a no-op on other
|
|
||||||
instruction sets.
|
|
||||||
|
|
||||||
@param Reloc Pointer to the relocation record.
|
|
||||||
@param Fixup Pointer to the address to fix up.
|
|
||||||
@param FixupData Pointer to a buffer to log the fixups.
|
|
||||||
@param Adjust The offset to adjust the fixup.
|
|
||||||
|
|
||||||
@return Status code.
|
|
||||||
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
PeCoffLoaderRelocateArmImage (
|
|
||||||
IN UINT16 **Reloc,
|
|
||||||
IN OUT CHAR8 *Fixup,
|
|
||||||
IN OUT CHAR8 **FixupData,
|
|
||||||
IN UINT64 Adjust
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT16 *Fixup16;
|
|
||||||
UINT32 FixupVal;
|
|
||||||
|
|
||||||
Fixup16 = (UINT16 *) Fixup;
|
|
||||||
|
|
||||||
switch ((**Reloc) >> 12) {
|
|
||||||
|
|
||||||
case EFI_IMAGE_REL_BASED_ARM_MOV32T:
|
|
||||||
FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust;
|
|
||||||
ThumbMovwMovtImmediatePatch (Fixup16, FixupVal);
|
|
||||||
|
|
||||||
|
|
||||||
if (*FixupData != NULL) {
|
|
||||||
*FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64));
|
|
||||||
CopyMem (*FixupData, Fixup16, sizeof (UINT64));
|
|
||||||
*FixupData = *FixupData + sizeof(UINT64);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_IMAGE_REL_BASED_ARM_MOV32A:
|
|
||||||
// break omitted - ARM instruction encoding not implemented
|
|
||||||
default:
|
|
||||||
return RETURN_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RETURN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Performs a LoongArch specific relocation fixup.
|
|
||||||
|
|
||||||
@param[in] Reloc Pointer to the relocation record.
|
|
||||||
@param[in, out] Fixup Pointer to the address to fix up.
|
|
||||||
@param[in, out] FixupData Pointer to a buffer to log the fixups.
|
|
||||||
@param[in] Adjust The offset to adjust the fixup.
|
|
||||||
|
|
||||||
@return Status code.
|
|
||||||
**/
|
|
||||||
RETURN_STATUS
|
|
||||||
PeCoffLoaderRelocateLoongArch64Image (
|
|
||||||
IN UINT16 *Reloc,
|
|
||||||
IN OUT CHAR8 *Fixup,
|
|
||||||
IN OUT CHAR8 **FixupData,
|
|
||||||
IN UINT64 Adjust
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINT8 RelocType;
|
|
||||||
UINT64 Value;
|
|
||||||
UINT64 Tmp1;
|
|
||||||
UINT64 Tmp2;
|
|
||||||
|
|
||||||
RelocType = ((*Reloc) >> 12);
|
|
||||||
Value = 0;
|
|
||||||
Tmp1 = 0;
|
|
||||||
Tmp2 = 0;
|
|
||||||
|
|
||||||
switch (RelocType) {
|
|
||||||
case EFI_IMAGE_REL_BASED_LOONGARCH64_MARK_LA:
|
|
||||||
// The next four instructions are used to load a 64 bit address, relocate all of them
|
|
||||||
Value = (*(UINT32 *)Fixup & 0x1ffffe0) << 7 | // lu12i.w 20bits from bit5
|
|
||||||
(*((UINT32 *)Fixup + 1) & 0x3ffc00) >> 10; // ori 12bits from bit10
|
|
||||||
Tmp1 = *((UINT32 *)Fixup + 2) & 0x1ffffe0; // lu32i.d 20bits from bit5
|
|
||||||
Tmp2 = *((UINT32 *)Fixup + 3) & 0x3ffc00; // lu52i.d 12bits from bit10
|
|
||||||
Value = Value | (Tmp1 << 27) | (Tmp2 << 42);
|
|
||||||
Value += Adjust;
|
|
||||||
|
|
||||||
*(UINT32 *)Fixup = (*(UINT32 *)Fixup & ~0x1ffffe0) | (((Value >> 12) & 0xfffff) << 5);
|
|
||||||
if (*FixupData != NULL) {
|
|
||||||
*FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT32));
|
|
||||||
*(UINT32 *)(*FixupData) = *(UINT32 *)Fixup;
|
|
||||||
*FixupData = *FixupData + sizeof (UINT32);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fixup += sizeof (UINT32);
|
|
||||||
*(UINT32 *)Fixup = (*(UINT32 *)Fixup & ~0x3ffc00) | ((Value & 0xfff) << 10);
|
|
||||||
if (*FixupData != NULL) {
|
|
||||||
*FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT32));
|
|
||||||
*(UINT32 *)(*FixupData) = *(UINT32 *)Fixup;
|
|
||||||
*FixupData = *FixupData + sizeof (UINT32);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fixup += sizeof (UINT32);
|
|
||||||
*(UINT32 *)Fixup = (*(UINT32 *)Fixup & ~0x1ffffe0) | (((Value >> 32) & 0xfffff) << 5);
|
|
||||||
if (*FixupData != NULL) {
|
|
||||||
*FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT32));
|
|
||||||
*(UINT32 *)(*FixupData) = *(UINT32 *)Fixup;
|
|
||||||
*FixupData = *FixupData + sizeof (UINT32);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fixup += sizeof (UINT32);
|
|
||||||
*(UINT32 *)Fixup = (*(UINT32 *)Fixup & ~0x3ffc00) | (((Value >> 52) & 0xfff) << 10);
|
|
||||||
if (*FixupData != NULL) {
|
|
||||||
*FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT32));
|
|
||||||
*(UINT32 *)(*FixupData) = *(UINT32 *)Fixup;
|
|
||||||
*FixupData = *FixupData + sizeof (UINT32);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Error (NULL, 0, 3000, "", "PeCoffLoaderRelocateLoongArch64Image: Fixup[0x%x] Adjust[0x%llx] *Reloc[0x%x], type[0x%x].", *(UINT32 *)Fixup, Adjust, *Reloc, RelocType);
|
|
||||||
return RETURN_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RETURN_SUCCESS;
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Utility program to create an EFI option ROM image from binary and EFI PE32 files.
|
Utility program to create an EFI option ROM image from binary and UEFI image files.
|
||||||
|
|
||||||
Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
@ -426,12 +426,12 @@ ProcessEfiFile (
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Process a PE32 EFI file.
|
Process an UEFI image file.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
OutFptr - file pointer to output binary ROM image file we're creating
|
OutFptr - file pointer to output binary ROM image file we're creating
|
||||||
InFile - structure contains information on the PE32 file to process
|
InFile - structure contains information on the UEFI image file to process
|
||||||
VendId - vendor ID as required in the option ROM header
|
VendId - vendor ID as required in the option ROM header
|
||||||
DevId - device ID as required in the option ROM header
|
DevId - device ID as required in the option ROM header
|
||||||
Size - pointer to where to return the size added to the output file
|
Size - pointer to where to return the size added to the output file
|
||||||
@ -471,22 +471,40 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Initialize our buffer pointers to null.
|
// Initialize our buffer pointers to null.
|
||||||
//
|
//
|
||||||
Buffer = NULL;
|
|
||||||
CompressedBuffer = NULL;
|
CompressedBuffer = NULL;
|
||||||
|
|
||||||
//
|
|
||||||
// Double-check the file to make sure it's what we expect it to be
|
|
||||||
//
|
|
||||||
Status = CheckPE32File (InFptr, &MachineType, &SubSystem);
|
|
||||||
if (Status != STATUS_SUCCESS) {
|
|
||||||
goto BailOut;
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
// Seek to the end of the input file and get the file size
|
// Seek to the end of the input file and get the file size
|
||||||
//
|
//
|
||||||
fseek (InFptr, 0, SEEK_END);
|
fseek (InFptr, 0, SEEK_END);
|
||||||
FileSize = ftell (InFptr);
|
FileSize = ftell (InFptr);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Allocate memory for the entire file (in case we have to compress), then
|
||||||
|
// seek back to the beginning of the file and read it into our buffer.
|
||||||
|
//
|
||||||
|
Buffer = (UINT8 *) malloc (FileSize);
|
||||||
|
if (Buffer == NULL) {
|
||||||
|
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");
|
||||||
|
Status = STATUS_ERROR;
|
||||||
|
goto BailOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek (InFptr, 0, SEEK_SET);
|
||||||
|
if (fread (Buffer, FileSize, 1, InFptr) != 1) {
|
||||||
|
Error (NULL, 0, 0004, "Error reading file", "File %s", InFile->FileName);
|
||||||
|
Status = STATUS_ERROR;
|
||||||
|
goto BailOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Double-check the file to make sure it's what we expect it to be
|
||||||
|
//
|
||||||
|
Status = CheckUefiImageFile (Buffer, FileSize, &MachineType, &SubSystem);
|
||||||
|
if (Status != STATUS_SUCCESS) {
|
||||||
|
goto BailOut;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the size of the headers we're going to put in front of the image. The
|
// Get the size of the headers we're going to put in front of the image. The
|
||||||
// EFI header must be aligned on a 4-byte boundary, so pad accordingly.
|
// EFI header must be aligned on a 4-byte boundary, so pad accordingly.
|
||||||
@ -519,23 +537,6 @@ Returns:
|
|||||||
VerboseMsg(" File size = 0x%X\n", (unsigned) FileSize);
|
VerboseMsg(" File size = 0x%X\n", (unsigned) FileSize);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Allocate memory for the entire file (in case we have to compress), then
|
|
||||||
// seek back to the beginning of the file and read it into our buffer.
|
|
||||||
//
|
|
||||||
Buffer = (UINT8 *) malloc (FileSize);
|
|
||||||
if (Buffer == NULL) {
|
|
||||||
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");
|
|
||||||
Status = STATUS_ERROR;
|
|
||||||
goto BailOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
fseek (InFptr, 0, SEEK_SET);
|
|
||||||
if (fread (Buffer, FileSize, 1, InFptr) != 1) {
|
|
||||||
Error (NULL, 0, 0004, "Error reading file", "File %s", InFile->FileName);
|
|
||||||
Status = STATUS_ERROR;
|
|
||||||
goto BailOut;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Now determine the size of the final output file. It's either the header size
|
// Now determine the size of the final output file. It's either the header size
|
||||||
// plus the file's size, or the header size plus the compressed file size.
|
// plus the file's size, or the header size plus the compressed file size.
|
||||||
//
|
//
|
||||||
@ -805,8 +806,9 @@ BailOut:
|
|||||||
|
|
||||||
static
|
static
|
||||||
int
|
int
|
||||||
CheckPE32File (
|
CheckUefiImageFile (
|
||||||
FILE *Fptr,
|
VOID *FileBuffer,
|
||||||
|
UINT32 FileSize,
|
||||||
UINT16 *MachineType,
|
UINT16 *MachineType,
|
||||||
UINT16 *SubSystem
|
UINT16 *SubSystem
|
||||||
)
|
)
|
||||||
@ -814,13 +816,14 @@ CheckPE32File (
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Given a file pointer to a supposed PE32 image file, verify that it is indeed a
|
Given a file pointer to a supposed UEFI image file, verify that it is indeed a
|
||||||
PE32 image file, and then return the machine type in the supplied pointer.
|
UEFI image file, and then return the machine type in the supplied pointer.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
Fptr File pointer to the already-opened PE32 file
|
FileBuffer File buffer of the UEFI image file
|
||||||
MachineType Location to stuff the machine type of the PE32 file. This is needed
|
FileSize File size, in bytes, of FileBuffer
|
||||||
|
MachineType Location to stuff the machine type of the UEFI file. This is needed
|
||||||
because the image may be Itanium-based, IA32, or EBC.
|
because the image may be Itanium-based, IA32, or EBC.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -830,67 +833,24 @@ Returns:
|
|||||||
|
|
||||||
--*/
|
--*/
|
||||||
{
|
{
|
||||||
EFI_IMAGE_DOS_HEADER DosHeader;
|
RETURN_STATUS Status;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION PeHdr;
|
UEFI_IMAGE_LOADER_IMAGE_CONTEXT Context;
|
||||||
|
|
||||||
//
|
Status = UefiImageInitializeContext (&Context, FileBuffer, FileSize);
|
||||||
// Position to the start of the file
|
if (RETURN_ERROR (Status)) {
|
||||||
//
|
Error (NULL, 0, 2000, "Invalid parameter", "Input file does not appear to be an UEFI image - %llu!", Status);
|
||||||
fseek (Fptr, 0, SEEK_SET);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Read the DOS header
|
|
||||||
//
|
|
||||||
if (fread (&DosHeader, sizeof (DosHeader), 1, Fptr) != 1) {
|
|
||||||
Error (NULL, 0, 0004, "Failed to read the DOS stub from the input file!", NULL);
|
|
||||||
return STATUS_ERROR;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Check the magic number (0x5A4D)
|
|
||||||
//
|
|
||||||
if (DosHeader.e_magic != EFI_IMAGE_DOS_SIGNATURE) {
|
|
||||||
Error (NULL, 0, 2000, "Invalid parameter", "Input file does not appear to be a PE32 image (magic number)!");
|
|
||||||
return STATUS_ERROR;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Position into the file and check the PE signature
|
|
||||||
//
|
|
||||||
fseek (Fptr, (long) DosHeader.e_lfanew, SEEK_SET);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Read PE headers
|
|
||||||
//
|
|
||||||
if (fread (&PeHdr, sizeof (PeHdr), 1, Fptr) != 1) {
|
|
||||||
Error (NULL, 0, 0004, "Failed to read PE/COFF headers from input file!", NULL);
|
|
||||||
return STATUS_ERROR;
|
return STATUS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*MachineType = UefiImageGetMachine (&Context);
|
||||||
//
|
*SubSystem = UefiImageGetSubsystem (&Context);
|
||||||
// Check the PE signature in the header "PE\0\0"
|
|
||||||
//
|
|
||||||
if (PeHdr.Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) {
|
|
||||||
Error (NULL, 0, 2000, "Invalid parameter", "Input file does not appear to be a PE32 image (signature)!");
|
|
||||||
return STATUS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy ((char *) MachineType, &PeHdr.Pe32.FileHeader.Machine, 2);
|
|
||||||
|
|
||||||
if (PeHdr.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
|
||||||
*SubSystem = PeHdr.Pe32.OptionalHeader.Subsystem;
|
|
||||||
} else if (PeHdr.Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
|
|
||||||
*SubSystem = PeHdr.Pe32Plus.OptionalHeader.Subsystem;
|
|
||||||
} else {
|
|
||||||
Error (NULL, 0, 2000, "Invalid parameter", "Unable to find subsystem type!");
|
|
||||||
return STATUS_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mOptions.Verbose) {
|
if (mOptions.Verbose) {
|
||||||
VerboseMsg(" Got subsystem = 0x%X from image\n", *SubSystem);
|
VerboseMsg(" Got subsystem = 0x%X from image\n", *SubSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// File was successfully identified as a PE32
|
// File was successfully identified as an UEFI image
|
||||||
//
|
//
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -1354,9 +1314,9 @@ Returns:
|
|||||||
fprintf (stdout, " -o FileName, --output FileName\n\
|
fprintf (stdout, " -o FileName, --output FileName\n\
|
||||||
File will be created to store the output content.\n");
|
File will be created to store the output content.\n");
|
||||||
fprintf (stdout, " -e EfiFileName\n\
|
fprintf (stdout, " -e EfiFileName\n\
|
||||||
EFI PE32 image files.\n");
|
UEFI image files.\n");
|
||||||
fprintf (stdout, " -ec EfiFileName\n\
|
fprintf (stdout, " -ec EfiFileName\n\
|
||||||
EFI PE32 image files and will be compressed.\n");
|
UEFI image files and will be compressed.\n");
|
||||||
fprintf (stdout, " -b BinFileName\n\
|
fprintf (stdout, " -b BinFileName\n\
|
||||||
Legacy binary files.\n");
|
Legacy binary files.\n");
|
||||||
fprintf (stdout, " -l ClassCode\n\
|
fprintf (stdout, " -l ClassCode\n\
|
||||||
|
@ -14,7 +14,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <Common/UefiBaseTypes.h>
|
#include <Common/UefiBaseTypes.h>
|
||||||
#include <Common/PeImageEx.h> // for PE32 structure definitions
|
#include <IndustryStandard/PeImage2.h> // for PE32 structure definitions
|
||||||
|
|
||||||
#include <IndustryStandard/Pci22.h> // for option ROM header structures
|
#include <IndustryStandard/Pci22.h> // for option ROM header structures
|
||||||
#include <IndustryStandard/Pci30.h>
|
#include <IndustryStandard/Pci30.h>
|
||||||
@ -22,6 +22,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "Compress.h"
|
#include "Compress.h"
|
||||||
#include "CommonLib.h"
|
#include "CommonLib.h"
|
||||||
|
|
||||||
|
#include <Library/UefiImageLib.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Version of this utility
|
// Version of this utility
|
||||||
//
|
//
|
||||||
@ -203,8 +205,9 @@ Returns:
|
|||||||
|
|
||||||
static
|
static
|
||||||
int
|
int
|
||||||
CheckPE32File (
|
CheckUefiImageFile (
|
||||||
FILE *Fptr,
|
VOID *FileBuffer,
|
||||||
|
UINT32 FileSize,
|
||||||
UINT16 *MachineType,
|
UINT16 *MachineType,
|
||||||
UINT16 *SubSystem
|
UINT16 *SubSystem
|
||||||
)
|
)
|
||||||
@ -242,12 +245,12 @@ ProcessEfiFile (
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Process a PE32 EFI file.
|
Process a UEFI image file.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
OutFptr - file pointer to output binary ROM image file we're creating
|
OutFptr - file pointer to output binary ROM image file we're creating
|
||||||
InFile - structure contains information on the PE32 file to process
|
InFile - structure contains information on the UEFI image file to process
|
||||||
VendId - vendor ID as required in the option ROM header
|
VendId - vendor ID as required in the option ROM header
|
||||||
DevId - device ID as required in the option ROM header
|
DevId - device ID as required in the option ROM header
|
||||||
Size - pointer to where to return the size added to the output file
|
Size - pointer to where to return the size added to the output file
|
||||||
|
@ -25,14 +25,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Common/UefiBaseTypes.h>
|
#include <Common/UefiBaseTypes.h>
|
||||||
#include <Common/PiFirmwareFile.h>
|
#include <Common/PiFirmwareFile.h>
|
||||||
#include <Common/PeImageEx.h>
|
|
||||||
#include <Guid/FfsSectionAlignmentPadding.h>
|
#include <Guid/FfsSectionAlignmentPadding.h>
|
||||||
|
|
||||||
#include "CommonLib.h"
|
#include "CommonLib.h"
|
||||||
#include "ParseInf.h"
|
#include "ParseInf.h"
|
||||||
#include "EfiUtilityMsgs.h"
|
#include "EfiUtilityMsgs.h"
|
||||||
#include "FvLib.h"
|
#include "FvLib.h"
|
||||||
#include "PeCoffLib.h"
|
|
||||||
|
|
||||||
#define UTILITY_NAME "GenFfs"
|
#define UTILITY_NAME "GenFfs"
|
||||||
#define UTILITY_MAJOR_VERSION 0
|
#define UTILITY_MAJOR_VERSION 0
|
||||||
@ -451,104 +449,6 @@ Returns:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
FfsRebaseImageRead (
|
|
||||||
IN VOID *FileHandle,
|
|
||||||
IN UINTN FileOffset,
|
|
||||||
IN OUT UINT32 *ReadSize,
|
|
||||||
OUT VOID *Buffer
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
FileHandle - The handle to the PE/COFF file
|
|
||||||
|
|
||||||
FileOffset - The offset, in bytes, into the file to read
|
|
||||||
|
|
||||||
ReadSize - The number of bytes to read from the file starting at FileOffset
|
|
||||||
|
|
||||||
Buffer - A pointer to the buffer to read the data into.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
CHAR8 *Destination8;
|
|
||||||
CHAR8 *Source8;
|
|
||||||
UINT32 Length;
|
|
||||||
|
|
||||||
Destination8 = Buffer;
|
|
||||||
Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
|
|
||||||
Length = *ReadSize;
|
|
||||||
while (Length--) {
|
|
||||||
*(Destination8++) = *(Source8++);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC
|
|
||||||
EFI_STATUS
|
|
||||||
GetAlignmentFromFile(char *InFile, UINT32 *Alignment)
|
|
||||||
/*++
|
|
||||||
InFile is input file for getting alignment
|
|
||||||
return the alignment
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
FILE *InFileHandle;
|
|
||||||
UINT8 *PeFileBuffer;
|
|
||||||
UINTN PeFileSize;
|
|
||||||
UINT32 CurSecHdrSize;
|
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
|
||||||
EFI_COMMON_SECTION_HEADER *CommonHeader;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
InFileHandle = NULL;
|
|
||||||
PeFileBuffer = NULL;
|
|
||||||
*Alignment = 0;
|
|
||||||
|
|
||||||
memset (&ImageContext, 0, sizeof (ImageContext));
|
|
||||||
|
|
||||||
InFileHandle = fopen(LongFilePath(InFile), "rb");
|
|
||||||
if (InFileHandle == NULL){
|
|
||||||
Error (NULL, 0, 0001, "Error opening file", InFile);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
|
||||||
PeFileSize = _filelength (fileno(InFileHandle));
|
|
||||||
PeFileBuffer = (UINT8 *) malloc (PeFileSize);
|
|
||||||
if (PeFileBuffer == NULL) {
|
|
||||||
fclose (InFileHandle);
|
|
||||||
Error(NULL, 0, 4001, "Resource", "memory cannot be allocated for %s", InFile);
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
fread (PeFileBuffer, sizeof (UINT8), PeFileSize, InFileHandle);
|
|
||||||
fclose (InFileHandle);
|
|
||||||
CommonHeader = (EFI_COMMON_SECTION_HEADER *) PeFileBuffer;
|
|
||||||
CurSecHdrSize = GetSectionHeaderLength(CommonHeader);
|
|
||||||
ImageContext.Handle = (VOID *) ((UINTN)PeFileBuffer + CurSecHdrSize);
|
|
||||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE)FfsRebaseImageRead;
|
|
||||||
Status = PeCoffLoaderGetImageInfo(&ImageContext);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid PeImage", "The input file is %s and return status is %x", InFile, (int) Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
*Alignment = ImageContext.SectionAlignment;
|
|
||||||
// Free the allocated memory resource
|
|
||||||
if (PeFileBuffer != NULL) {
|
|
||||||
free (PeFileBuffer);
|
|
||||||
PeFileBuffer = NULL;
|
|
||||||
}
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (
|
main (
|
||||||
int argc,
|
int argc,
|
||||||
|
@ -22,12 +22,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <io.h>
|
#include <io.h>
|
||||||
#endif
|
#endif
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <Guid/FfsSectionAlignmentPadding.h>
|
#include <Guid/FfsSectionAlignmentPadding.h>
|
||||||
|
|
||||||
#include "GenFvInternalLib.h"
|
#include "GenFvInternalLib.h"
|
||||||
#include "FvLib.h"
|
#include "FvLib.h"
|
||||||
#include "PeCoffLib.h"
|
#include <Library/PeCoffLib2.h>
|
||||||
|
#include <Library/UefiImageLib.h>
|
||||||
|
|
||||||
|
#include "../../../ImageTool/ImageToolEmit.h"
|
||||||
|
|
||||||
#define ARM64_UNCONDITIONAL_JUMP_INSTRUCTION 0x14000000
|
#define ARM64_UNCONDITIONAL_JUMP_INSTRUCTION 0x14000000
|
||||||
|
|
||||||
@ -718,24 +722,24 @@ Returns:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
WriteMapFile (
|
WriteMapFile (
|
||||||
IN OUT FILE *FvMapFile,
|
IN OUT FILE *FvMapFile,
|
||||||
IN CHAR8 *FileName,
|
IN CONST CHAR8 *FileName,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFile,
|
IN EFI_FFS_FILE_HEADER *FfsFile,
|
||||||
IN EFI_PHYSICAL_ADDRESS ImageBaseAddress,
|
IN EFI_PHYSICAL_ADDRESS ImageBaseAddress,
|
||||||
IN PE_COFF_LOADER_IMAGE_CONTEXT *pImageContext
|
IN UEFI_IMAGE_LOADER_IMAGE_CONTEXT *pImageContext
|
||||||
)
|
)
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
This function gets the basic debug information (entrypoint, baseaddress, .text, .data section base address)
|
This function gets the basic debug information (entrypoint, baseaddress, .text, .data section base address)
|
||||||
from PE/COFF image and abstracts Pe Map file information and add them into FvMap file for Debug.
|
from UEFI image and abstracts UEFI image Map file information and add them into FvMap file for Debug.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
FvMapFile A pointer to FvMap File
|
FvMapFile A pointer to FvMap File
|
||||||
FileName Ffs File PathName
|
FileName Ffs File PathName
|
||||||
FfsFile A pointer to Ffs file image.
|
FfsFile A pointer to Ffs file image.
|
||||||
ImageBaseAddress PeImage Base Address.
|
ImageBaseAddress UefiImage Base Address.
|
||||||
pImageContext Image Context Information.
|
pImageContext Image Context Information.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -755,9 +759,8 @@ Returns:
|
|||||||
EFI_PHYSICAL_ADDRESS FunctionAddress;
|
EFI_PHYSICAL_ADDRESS FunctionAddress;
|
||||||
UINT32 FunctionType;
|
UINT32 FunctionType;
|
||||||
CHAR8 FunctionTypeName [MAX_LINE_LEN];
|
CHAR8 FunctionTypeName [MAX_LINE_LEN];
|
||||||
|
UINT8 Format;
|
||||||
UINT32 AddressOfEntryPoint;
|
UINT32 AddressOfEntryPoint;
|
||||||
UINT32 Offset;
|
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
|
||||||
long long TempLongAddress;
|
long long TempLongAddress;
|
||||||
EFI_PHYSICAL_ADDRESS LinkTimeBaseAddress;
|
EFI_PHYSICAL_ADDRESS LinkTimeBaseAddress;
|
||||||
BOOLEAN IsUseClang;
|
BOOLEAN IsUseClang;
|
||||||
@ -823,13 +826,9 @@ Returns:
|
|||||||
*Cptr2 = '.';
|
*Cptr2 = '.';
|
||||||
|
|
||||||
//
|
//
|
||||||
// AddressOfEntryPoint and Offset in Image
|
// AddressOfEntryPoint in Image
|
||||||
//
|
//
|
||||||
assert (!pImageContext->IsTeImage);
|
AddressOfEntryPoint = UefiImageGetEntryPointAddress (pImageContext);
|
||||||
|
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *) ((UINT8 *) pImageContext->Handle + pImageContext->PeCoffHeaderOffset);
|
|
||||||
AddressOfEntryPoint = ImgHdr->Pe32.OptionalHeader.AddressOfEntryPoint;
|
|
||||||
Offset = 0;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// module information output
|
// module information output
|
||||||
@ -839,11 +838,18 @@ Returns:
|
|||||||
fprintf (FvMapFile, "BaseAddress=%010llx, ", (unsigned long long) ImageBaseAddress);
|
fprintf (FvMapFile, "BaseAddress=%010llx, ", (unsigned long long) ImageBaseAddress);
|
||||||
} else {
|
} else {
|
||||||
fprintf (FvMapFile, "%s (Fixed Flash Address, ", KeyWord);
|
fprintf (FvMapFile, "%s (Fixed Flash Address, ", KeyWord);
|
||||||
fprintf (FvMapFile, "BaseAddress=0x%010llx, ", (unsigned long long) (ImageBaseAddress + Offset));
|
fprintf (FvMapFile, "BaseAddress=0x%010llx, ", (unsigned long long) ImageBaseAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Format = UefiImageGetFormat (pImageContext);
|
||||||
|
|
||||||
fprintf (FvMapFile, "EntryPoint=0x%010llx, ", (unsigned long long) (ImageBaseAddress + AddressOfEntryPoint));
|
fprintf (FvMapFile, "EntryPoint=0x%010llx, ", (unsigned long long) (ImageBaseAddress + AddressOfEntryPoint));
|
||||||
fprintf (FvMapFile, "Type=PE");
|
if (Format == UefiImageFormatPe) {
|
||||||
|
fprintf (FvMapFile, "Type=PE");
|
||||||
|
} else {
|
||||||
|
assert (FALSE);
|
||||||
|
fprintf (FvMapFile, "Type=Unknown");
|
||||||
|
}
|
||||||
fprintf (FvMapFile, ")\n");
|
fprintf (FvMapFile, ")\n");
|
||||||
|
|
||||||
fprintf (FvMapFile, "(GUID=%s)\n\n", FileGuidName);
|
fprintf (FvMapFile, "(GUID=%s)\n\n", FileGuidName);
|
||||||
@ -1260,7 +1266,7 @@ Returns:
|
|||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Rebase the PE image in FileBuffer of FFS file for XIP
|
// Rebase the UEFI image in FileBuffer of FFS file for XIP
|
||||||
// Rebase for the debug genfvmap tool
|
// Rebase for the debug genfvmap tool
|
||||||
//
|
//
|
||||||
Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) *VtfFileImage - (UINTN) FvImage->FileImage, FvMapFile);
|
Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) *VtfFileImage - (UINTN) FvImage->FileImage, FvMapFile);
|
||||||
@ -1312,7 +1318,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
if ((UINTN) (FvImage->CurrentFilePointer + FileSize) <= (UINTN) (*VtfFileImage)) {
|
if ((UINTN) (FvImage->CurrentFilePointer + FileSize) <= (UINTN) (*VtfFileImage)) {
|
||||||
//
|
//
|
||||||
// Rebase the PE image in FileBuffer of FFS file for XIP.
|
// Rebase the UEFI image in FileBuffer of FFS file for XIP.
|
||||||
// Rebase Bs and Rt drivers for the debug genfvmap tool.
|
// Rebase Bs and Rt drivers for the debug genfvmap tool.
|
||||||
//
|
//
|
||||||
Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage, FvMapFile);
|
Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage, FvMapFile);
|
||||||
@ -1549,14 +1555,15 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
SecHeaderSize = GetSectionHeaderLength(Pe32Section.CommonHeader);
|
SecHeaderSize = GetSectionHeaderLength(Pe32Section.CommonHeader);
|
||||||
Status = GetPe32Info (
|
Status = GetUefiImageInfo (
|
||||||
(VOID *) ((UINTN) Pe32Section.Pe32Section + SecHeaderSize),
|
(VOID *) ((UINTN) Pe32Section.Pe32Section + SecHeaderSize),
|
||||||
|
GetSectionFileLength (Pe32Section.CommonHeader) - SecHeaderSize,
|
||||||
&EntryPoint,
|
&EntryPoint,
|
||||||
&MachineType
|
&MachineType
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Error (NULL, 0, 3000, "Invalid", "could not get the PE32 entry point for the SEC core.");
|
Error (NULL, 0, 3000, "Invalid", "could not get the UEFI image entry point for the SEC core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1574,7 +1581,7 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Physical address is FV base + offset of PE32 + offset of the entry point
|
// Physical address is FV base + offset of UEFI image + offset of the entry point
|
||||||
//
|
//
|
||||||
SecCorePhysicalAddress = FvInfo->BaseAddress;
|
SecCorePhysicalAddress = FvInfo->BaseAddress;
|
||||||
SecCorePhysicalAddress += (UINTN) Pe32Section.Pe32Section + SecHeaderSize - (UINTN) FvImage->FileImage;
|
SecCorePhysicalAddress += (UINTN) Pe32Section.Pe32Section + SecHeaderSize - (UINTN) FvImage->FileImage;
|
||||||
@ -1597,18 +1604,19 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
SecHeaderSize = GetSectionHeaderLength(Pe32Section.CommonHeader);
|
SecHeaderSize = GetSectionHeaderLength(Pe32Section.CommonHeader);
|
||||||
Status = GetPe32Info (
|
Status = GetUefiImageInfo (
|
||||||
(VOID *) ((UINTN) Pe32Section.Pe32Section + SecHeaderSize),
|
(VOID *) ((UINTN) Pe32Section.Pe32Section + SecHeaderSize),
|
||||||
|
GetSectionFileLength (Pe32Section.CommonHeader) - SecHeaderSize,
|
||||||
&EntryPoint,
|
&EntryPoint,
|
||||||
&MachineType
|
&MachineType
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Error (NULL, 0, 3000, "Invalid", "could not get the PE32 entry point for the PEI core.");
|
Error (NULL, 0, 3000, "Invalid", "could not get the UEFI image entry point for the PEI core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Physical address is FV base + offset of PE32 + offset of the entry point
|
// Physical address is FV base + offset of UEFI image + offset of the entry point
|
||||||
//
|
//
|
||||||
PeiCorePhysicalAddress = FvInfo->BaseAddress;
|
PeiCorePhysicalAddress = FvInfo->BaseAddress;
|
||||||
PeiCorePhysicalAddress += (UINTN) Pe32Section.Pe32Section + SecHeaderSize - (UINTN) FvImage->FileImage;
|
PeiCorePhysicalAddress += (UINTN) Pe32Section.Pe32Section + SecHeaderSize - (UINTN) FvImage->FileImage;
|
||||||
@ -1842,13 +1850,14 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = GetPe32Info(
|
Status = GetUefiImageInfo(
|
||||||
(VOID *)((UINTN)Pe32Section.Pe32Section + GetSectionHeaderLength(Pe32Section.CommonHeader)),
|
(VOID *)((UINTN)Pe32Section.Pe32Section + GetSectionHeaderLength(Pe32Section.CommonHeader)),
|
||||||
|
GetSectionFileLength (Pe32Section.CommonHeader) - GetSectionHeaderLength(Pe32Section.CommonHeader),
|
||||||
&EntryPoint,
|
&EntryPoint,
|
||||||
CoreMachineType
|
CoreMachineType
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "could not get the PE32 machine type for the core.");
|
Error(NULL, 0, 3000, "Invalid", "could not get the UEFI image machine type for the core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1872,7 +1881,7 @@ Arguments:
|
|||||||
|
|
||||||
FvImageBuffer Pointer to buffer containing FV data
|
FvImageBuffer Pointer to buffer containing FV data
|
||||||
FvInfo Info for the parent FV
|
FvInfo Info for the parent FV
|
||||||
Pe32Section PE32 section data
|
Pe32Section UEFI image section data
|
||||||
CoreEntryAddress The extracted core entry physical address
|
CoreEntryAddress The extracted core entry physical address
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -1892,18 +1901,19 @@ Returns:
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = GetPe32Info(
|
Status = GetUefiImageInfo(
|
||||||
(VOID *)((UINTN)Pe32Section.Pe32Section + GetSectionHeaderLength(Pe32Section.CommonHeader)),
|
(VOID *)((UINTN)Pe32Section.Pe32Section + GetSectionHeaderLength(Pe32Section.CommonHeader)),
|
||||||
|
GetSectionFileLength (Pe32Section.CommonHeader) - GetSectionHeaderLength(Pe32Section.CommonHeader),
|
||||||
&EntryPoint,
|
&EntryPoint,
|
||||||
&MachineType
|
&MachineType
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "could not get the PE32 entry point for the core.");
|
Error(NULL, 0, 3000, "Invalid", "could not get the UEFI image entry point for the core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Physical address is FV base + offset of PE32 + offset of the entry point
|
// Physical address is FV base + offset of UEFI image + offset of the entry point
|
||||||
//
|
//
|
||||||
EntryPhysicalAddress = FvInfo->BaseAddress;
|
EntryPhysicalAddress = FvInfo->BaseAddress;
|
||||||
EntryPhysicalAddress += (UINTN)Pe32Section.Pe32Section + GetSectionHeaderLength(Pe32Section.CommonHeader) - (UINTN)FvImageBuffer;
|
EntryPhysicalAddress += (UINTN)Pe32Section.Pe32Section + GetSectionHeaderLength(Pe32Section.CommonHeader) - (UINTN)FvImageBuffer;
|
||||||
@ -1989,13 +1999,13 @@ Returns:
|
|||||||
|
|
||||||
Status = GetCoreMachineType(SecPe32, &MachineType);
|
Status = GetCoreMachineType(SecPe32, &MachineType);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 machine type for SEC Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image machine type for SEC Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, SecPe32, &SecCoreEntryAddress);
|
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, SecPe32, &SecCoreEntryAddress);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 entry point address for SEC Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image entry point address for SEC Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2011,13 +2021,13 @@ Returns:
|
|||||||
|
|
||||||
Status = GetCoreMachineType(PeiPe32, &PeiMachineType);
|
Status = GetCoreMachineType(PeiPe32, &PeiMachineType);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 machine type for PEI Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image machine type for PEI Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, PeiPe32, &PeiCoreEntryAddress);
|
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, PeiPe32, &PeiCoreEntryAddress);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 entry point address for PEI Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image entry point address for PEI Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2208,7 +2218,7 @@ Returns:
|
|||||||
|
|
||||||
Status = GetCoreMachineType(SecPe32, &MachineType);
|
Status = GetCoreMachineType(SecPe32, &MachineType);
|
||||||
if(EFI_ERROR(Status)) {
|
if(EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 machine type for SEC core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image machine type for SEC core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2219,7 +2229,7 @@ Returns:
|
|||||||
|
|
||||||
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, SecPe32, &SecCoreEntryAddress);
|
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, SecPe32, &SecCoreEntryAddress);
|
||||||
if(EFI_ERROR(Status)) {
|
if(EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 entry point address for SEC Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image entry point address for SEC Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2297,13 +2307,13 @@ Returns:
|
|||||||
|
|
||||||
Status = GetCoreMachineType(SecPe32, &MachineType);
|
Status = GetCoreMachineType(SecPe32, &MachineType);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 machine type for SEC Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image machine type for SEC Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, SecPe32, &SecCoreEntryAddress);
|
Status = GetCoreEntryPointAddress(FvImage->FileImage, FvInfo, SecPe32, &SecCoreEntryAddress);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 entry point address for SEC Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image entry point address for SEC Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2340,8 +2350,9 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetPe32Info (
|
GetUefiImageInfo (
|
||||||
IN UINT8 *Pe32,
|
IN UINT8 *UefiImage,
|
||||||
|
IN UINT32 UefiImageSize,
|
||||||
OUT UINT32 *EntryPoint,
|
OUT UINT32 *EntryPoint,
|
||||||
OUT UINT16 *MachineType
|
OUT UINT16 *MachineType
|
||||||
)
|
)
|
||||||
@ -2349,14 +2360,15 @@ GetPe32Info (
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Retrieves the PE32 entry point offset and machine type from PE image or TeImage.
|
Retrieves the UEFI image entry point offset and machine type from UEFI image.
|
||||||
See EfiImage.h for machine types. The entry point offset is from the beginning
|
See EfiImage.h for machine types. The entry point offset is from the beginning
|
||||||
of the PE32 buffer passed in.
|
of the UEFI image buffer passed in.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
Pe32 Beginning of the PE32.
|
UefiImage Beginning of the UEFI image.
|
||||||
EntryPoint Offset from the beginning of the PE32 to the image entry point.
|
UefiImageSize The size, in bytes, of UefiImage.
|
||||||
|
EntryPoint Offset from the beginning of the UEFI image to the image entry point.
|
||||||
MachineType Magic number for the machine type.
|
MachineType Magic number for the machine type.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -2368,46 +2380,23 @@ Returns:
|
|||||||
|
|
||||||
--*/
|
--*/
|
||||||
{
|
{
|
||||||
EFI_IMAGE_DOS_HEADER *DosHeader;
|
UEFI_IMAGE_LOADER_IMAGE_CONTEXT Context;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verify input parameters
|
// Verify input parameters
|
||||||
//
|
//
|
||||||
if (Pe32 == NULL) {
|
if (UefiImage == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
RETURN_STATUS Status = UefiImageInitializeContext (&Context, UefiImage, UefiImageSize);
|
||||||
// Check whether
|
if (RETURN_ERROR (Status)) {
|
||||||
// First is the DOS header
|
Error (NULL, 0, 3000, "Invalid", "Unrecognized UEFI image file.");
|
||||||
//
|
return Status;
|
||||||
DosHeader = (EFI_IMAGE_DOS_HEADER *) Pe32;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Verify DOS header is expected
|
|
||||||
//
|
|
||||||
if (DosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "Unknown magic number in the DOS header, 0x%04X.", DosHeader->e_magic);
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// Immediately following is the NT header.
|
|
||||||
//
|
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *) ((UINTN) Pe32 + DosHeader->e_lfanew);
|
|
||||||
|
|
||||||
//
|
*EntryPoint = UefiImageGetEntryPointAddress (&Context);
|
||||||
// Verify NT header is expected
|
*MachineType = UefiImageGetMachine (&Context);
|
||||||
//
|
|
||||||
if (ImgHdr->Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "Unrecognized image signature 0x%08X.", (unsigned) ImgHdr->Pe32.Signature);
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Get output
|
|
||||||
//
|
|
||||||
*EntryPoint = ImgHdr->Pe32.OptionalHeader.AddressOfEntryPoint;
|
|
||||||
*MachineType = ImgHdr->Pe32.FileHeader.Machine;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verify machine type is supported
|
// Verify machine type is supported
|
||||||
@ -2415,7 +2404,7 @@ Returns:
|
|||||||
if ((*MachineType != IMAGE_FILE_MACHINE_I386) && (*MachineType != IMAGE_FILE_MACHINE_X64) && (*MachineType != IMAGE_FILE_MACHINE_EBC) &&
|
if ((*MachineType != IMAGE_FILE_MACHINE_I386) && (*MachineType != IMAGE_FILE_MACHINE_X64) && (*MachineType != IMAGE_FILE_MACHINE_EBC) &&
|
||||||
(*MachineType != IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) && (*MachineType != IMAGE_FILE_MACHINE_ARM64) &&
|
(*MachineType != IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) && (*MachineType != IMAGE_FILE_MACHINE_ARM64) &&
|
||||||
(*MachineType != IMAGE_FILE_MACHINE_RISCV64) && (*MachineType != IMAGE_FILE_MACHINE_LOONGARCH64)) {
|
(*MachineType != IMAGE_FILE_MACHINE_RISCV64) && (*MachineType != IMAGE_FILE_MACHINE_LOONGARCH64)) {
|
||||||
Error (NULL, 0, 3000, "Invalid", "Unrecognized machine type in the PE32 file.");
|
Error (NULL, 0, 3000, "Invalid", "Unrecognized machine type in the UEFI image file.");
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3263,50 +3252,6 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
FfsRebaseImageRead (
|
|
||||||
IN VOID *FileHandle,
|
|
||||||
IN UINTN FileOffset,
|
|
||||||
IN OUT UINT32 *ReadSize,
|
|
||||||
OUT VOID *Buffer
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
FileHandle - The handle to the PE/COFF file
|
|
||||||
|
|
||||||
FileOffset - The offset, in bytes, into the file to read
|
|
||||||
|
|
||||||
ReadSize - The number of bytes to read from the file starting at FileOffset
|
|
||||||
|
|
||||||
Buffer - A pointer to the buffer to read the data into.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
CHAR8 *Destination8;
|
|
||||||
CHAR8 *Source8;
|
|
||||||
UINT32 Length;
|
|
||||||
|
|
||||||
Destination8 = Buffer;
|
|
||||||
Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
|
|
||||||
Length = *ReadSize;
|
|
||||||
while (Length--) {
|
|
||||||
*(Destination8++) = *(Source8++);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetChildFvFromFfs (
|
GetChildFvFromFfs (
|
||||||
IN FV_INFO *FvInfo,
|
IN FV_INFO *FvInfo,
|
||||||
@ -3360,7 +3305,7 @@ Returns:
|
|||||||
if (!EFI_ERROR(Status)) {
|
if (!EFI_ERROR(Status)) {
|
||||||
Status = GetCoreMachineType(CorePe32, &MachineType);
|
Status = GetCoreMachineType(CorePe32, &MachineType);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Error(NULL, 0, 3000, "Invalid", "Could not get the PE32 machine type for SEC/PEI Core.");
|
Error(NULL, 0, 3000, "Invalid", "Could not get the UEFI image machine type for SEC/PEI Core.");
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3519,32 +3464,40 @@ Returns:
|
|||||||
--*/
|
--*/
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext;
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT OrigImageContext;
|
UINT16 Machine;
|
||||||
EFI_PHYSICAL_ADDRESS XipBase;
|
EFI_PHYSICAL_ADDRESS XipBase;
|
||||||
EFI_PHYSICAL_ADDRESS NewPe32BaseAddress;
|
EFI_PHYSICAL_ADDRESS NewBaseAddress;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_FILE_SECTION_POINTER CurrentPe32Section;
|
EFI_FILE_SECTION_POINTER CurrentPe32Section;
|
||||||
EFI_FFS_FILE_STATE SavedState;
|
EFI_FFS_FILE_STATE SavedState;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
CHAR8 UefiImageFileName [MAX_LONG_FILE_PATH];
|
||||||
UINT8 *MemoryImagePointer;
|
|
||||||
EFI_IMAGE_SECTION_HEADER *SectionHeader;
|
|
||||||
CHAR8 PeFileName [MAX_LONG_FILE_PATH];
|
|
||||||
CHAR8 *Cptr;
|
CHAR8 *Cptr;
|
||||||
FILE *PeFile;
|
FILE *UefiImageFile;
|
||||||
UINT8 *PeFileBuffer;
|
UINT8 *UefiImageFileBuffer;
|
||||||
UINT32 PeFileSize;
|
UINT32 UefiImageFileSize;
|
||||||
CHAR8 *PdbPointer;
|
BOOLEAN FreeUefiImageFile;
|
||||||
|
CONST CHAR8 *SymbolsPath;
|
||||||
|
UINT32 SymbolsPathSize;
|
||||||
|
CHAR8 *SymbolsPathCpy;
|
||||||
UINT32 FfsHeaderSize;
|
UINT32 FfsHeaderSize;
|
||||||
UINT32 CurSecHdrSize;
|
UINT32 CurSecHdrSize;
|
||||||
|
UINT32 SectPeSize;
|
||||||
|
UINT32 ImageSize;
|
||||||
|
UINT32 DestinationPages;
|
||||||
|
UINT32 DestinationSize;
|
||||||
|
UINT32 ImageAlignment;
|
||||||
|
VOID *Destination;
|
||||||
|
BOOLEAN Strip;
|
||||||
|
UINT8 ImageFormat;
|
||||||
|
UINT32 RebasedImageSize;
|
||||||
|
VOID *RebasedImage;
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
MemoryImagePointer = NULL;
|
Cptr = NULL;
|
||||||
ImgHdr = NULL;
|
UefiImageFile = NULL;
|
||||||
SectionHeader = NULL;
|
UefiImageFileBuffer = NULL;
|
||||||
Cptr = NULL;
|
FreeUefiImageFile = FALSE;
|
||||||
PeFile = NULL;
|
|
||||||
PeFileBuffer = NULL;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Don't need to relocate image when BaseAddress is zero and no ForceRebase Flag specified.
|
// Don't need to relocate image when BaseAddress is zero and no ForceRebase Flag specified.
|
||||||
@ -3562,6 +3515,8 @@ Returns:
|
|||||||
|
|
||||||
XipBase = FvInfo->BaseAddress + XipOffset;
|
XipBase = FvInfo->BaseAddress + XipOffset;
|
||||||
|
|
||||||
|
Strip = FALSE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// We only process files potentially containing PE32 sections.
|
// We only process files potentially containing PE32 sections.
|
||||||
//
|
//
|
||||||
@ -3596,7 +3551,7 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Init Value
|
// Init Value
|
||||||
//
|
//
|
||||||
NewPe32BaseAddress = 0;
|
NewBaseAddress = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find Pe Image
|
// Find Pe Image
|
||||||
@ -3610,140 +3565,76 @@ Returns:
|
|||||||
//
|
//
|
||||||
// Initialize context
|
// Initialize context
|
||||||
//
|
//
|
||||||
memset (&ImageContext, 0, sizeof (ImageContext));
|
SectPeSize = GetSectionFileLength (CurrentPe32Section.CommonHeader) - CurSecHdrSize;
|
||||||
ImageContext.Handle = (VOID *) ((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize);
|
Status = UefiImageInitializeContext (
|
||||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) FfsRebaseImageRead;
|
&ImageContext,
|
||||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
(VOID *) ((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize),
|
||||||
|
SectPeSize
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Error (NULL, 0, 3000, "Invalid PeImage", "The input file is %s and the return status is %x", FileName, (int) Status);
|
Error (NULL, 0, 3000, "Invalid UefiImage", "The input file is %s and the return status is %x", FileName, (int) Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (ImageContext.Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) ||
|
Machine = UefiImageGetMachine (&ImageContext);
|
||||||
(ImageContext.Machine == IMAGE_FILE_MACHINE_ARM64) ) {
|
|
||||||
|
if ( (Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) ||
|
||||||
|
(Machine == IMAGE_FILE_MACHINE_AARCH64) ) {
|
||||||
mArm = TRUE;
|
mArm = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImageContext.Machine == IMAGE_FILE_MACHINE_RISCV64) {
|
if (Machine == IMAGE_FILE_MACHINE_RISCV64) {
|
||||||
mRiscV = TRUE;
|
mRiscV = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImageContext.Machine == IMAGE_FILE_MACHINE_LOONGARCH64) {
|
if (Machine == IMAGE_FILE_MACHINE_LOONGARCH64) {
|
||||||
mLoongArch = TRUE;
|
mLoongArch = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImageFormat = UefiImageGetFormat (&ImageContext);
|
||||||
|
|
||||||
|
ImageSize = UefiImageGetImageSize (&ImageContext);
|
||||||
|
DestinationPages = EFI_SIZE_TO_PAGES (ImageSize);
|
||||||
|
DestinationSize = EFI_PAGES_TO_SIZE (DestinationPages);
|
||||||
|
ImageAlignment = UefiImageGetSegmentAlignment (&ImageContext);
|
||||||
|
Destination = AllocateAlignedCodePages (DestinationPages, ImageAlignment);
|
||||||
|
if (Destination == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = UefiImageLoadImage (&ImageContext, Destination, DestinationSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
SymbolsPathCpy = NULL;
|
||||||
//
|
//
|
||||||
// Keep Image Context for PE image in FV
|
// Get File SymbolsPath
|
||||||
//
|
//
|
||||||
memcpy (&OrigImageContext, &ImageContext, sizeof (ImageContext));
|
Status = UefiImageGetSymbolsPath (&ImageContext, &SymbolsPath, &SymbolsPathSize);
|
||||||
|
if (!RETURN_ERROR (Status)) {
|
||||||
|
SymbolsPathCpy = malloc (SymbolsPathSize);
|
||||||
|
if (SymbolsPathCpy == NULL) {
|
||||||
|
FreeAlignedPages (Destination, DestinationPages);
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
memmove (SymbolsPathCpy, SymbolsPath, SymbolsPathSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
FreeAlignedPages (Destination, DestinationPages);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get File PdbPointer
|
// Calculate the UEFI image base address, based on file type
|
||||||
//
|
|
||||||
PdbPointer = PeCoffLoaderGetPdbPointer (ImageContext.Handle);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get PeHeader pointer
|
|
||||||
//
|
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize + ImageContext.PeCoffHeaderOffset);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate the PE32 base address, based on file type
|
|
||||||
//
|
//
|
||||||
switch ((*FfsFile)->Type) {
|
switch ((*FfsFile)->Type) {
|
||||||
case EFI_FV_FILETYPE_SECURITY_CORE:
|
case EFI_FV_FILETYPE_SECURITY_CORE:
|
||||||
case EFI_FV_FILETYPE_PEI_CORE:
|
case EFI_FV_FILETYPE_PEI_CORE:
|
||||||
case EFI_FV_FILETYPE_PEIM:
|
case EFI_FV_FILETYPE_PEIM:
|
||||||
case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:
|
case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:
|
||||||
//
|
|
||||||
// Check if section-alignment and file-alignment match or not
|
|
||||||
//
|
|
||||||
if ((ImgHdr->Pe32.OptionalHeader.SectionAlignment != ImgHdr->Pe32.OptionalHeader.FileAlignment)) {
|
|
||||||
//
|
|
||||||
// Xip module has the same section alignment and file alignment.
|
|
||||||
//
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "PE image Section-Alignment and File-Alignment do not match : %s.", FileName);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// PeImage has no reloc section. It will try to get reloc data from the original EFI image.
|
|
||||||
//
|
|
||||||
if (ImageContext.RelocationsStripped) {
|
|
||||||
//
|
|
||||||
// Construct the original efi file Name
|
|
||||||
//
|
|
||||||
if (strlen (FileName) >= MAX_LONG_FILE_PATH) {
|
|
||||||
Error (NULL, 0, 2000, "Invalid", "The file name %s is too long.", FileName);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
|
||||||
strncpy (PeFileName, FileName, MAX_LONG_FILE_PATH - 1);
|
|
||||||
PeFileName[MAX_LONG_FILE_PATH - 1] = 0;
|
|
||||||
Cptr = PeFileName + strlen (PeFileName);
|
|
||||||
while (*Cptr != '.') {
|
|
||||||
Cptr --;
|
|
||||||
}
|
|
||||||
if (*Cptr != '.') {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "The file %s has no .reloc section.", FileName);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
} else {
|
|
||||||
*(Cptr + 1) = 'e';
|
|
||||||
*(Cptr + 2) = 'f';
|
|
||||||
*(Cptr + 3) = 'i';
|
|
||||||
*(Cptr + 4) = '\0';
|
|
||||||
}
|
|
||||||
PeFile = fopen (LongFilePath (PeFileName), "rb");
|
|
||||||
if (PeFile == NULL) {
|
|
||||||
Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);
|
|
||||||
//Error (NULL, 0, 3000, "Invalid", "The file %s has no .reloc section.", FileName);
|
|
||||||
//return EFI_ABORTED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Get the file size
|
|
||||||
//
|
|
||||||
PeFileSize = _filelength (fileno (PeFile));
|
|
||||||
PeFileBuffer = (UINT8 *) malloc (PeFileSize);
|
|
||||||
if (PeFileBuffer == NULL) {
|
|
||||||
fclose (PeFile);
|
|
||||||
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Read Pe File
|
|
||||||
//
|
|
||||||
fread (PeFileBuffer, sizeof (UINT8), PeFileSize, PeFile);
|
|
||||||
//
|
|
||||||
// close file
|
|
||||||
//
|
|
||||||
fclose (PeFile);
|
|
||||||
//
|
|
||||||
// Handle pointer to the original efi image.
|
|
||||||
//
|
|
||||||
ImageContext.Handle = PeFileBuffer;
|
|
||||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid PeImage", "The input file is %s and the return status is %x", FileName, (int) Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
ImageContext.RelocationsStripped = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
NewPe32BaseAddress = XipBase + (UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize - (UINTN)(*FfsFile);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_FV_FILETYPE_DRIVER:
|
case EFI_FV_FILETYPE_DRIVER:
|
||||||
case EFI_FV_FILETYPE_DXE_CORE:
|
case EFI_FV_FILETYPE_DXE_CORE:
|
||||||
//
|
NewBaseAddress = XipBase + (UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize - (UINTN)(*FfsFile);
|
||||||
// Check if section-alignment and file-alignment match or not
|
|
||||||
//
|
|
||||||
if ((ImgHdr->Pe32.OptionalHeader.SectionAlignment != ImgHdr->Pe32.OptionalHeader.FileAlignment)) {
|
|
||||||
//
|
|
||||||
// Xip module has the same section alignment and file alignment.
|
|
||||||
//
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "PE image Section-Alignment and File-Alignment do not match : %s.", FileName);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
|
||||||
NewPe32BaseAddress = XipBase + (UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize - (UINTN)(*FfsFile);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -3753,97 +3644,122 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
Strip = UefiImageGetRelocsStripped (&ImageContext);
|
||||||
// Relocation doesn't exist
|
|
||||||
//
|
|
||||||
if (ImageContext.RelocationsStripped) {
|
|
||||||
Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
if (!(IS_ALIGNED (NewBaseAddress, ImageAlignment))) {
|
||||||
// Relocation exist and rebase
|
Status = AddPadSection (&NewBaseAddress, ImageAlignment, FfsFile, FileSize, &CurrentPe32Section);
|
||||||
//
|
|
||||||
//
|
|
||||||
// Load and Relocate Image Data
|
|
||||||
//
|
|
||||||
MemoryImagePointer = (UINT8 *) calloc (1, (UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment);
|
|
||||||
if (MemoryImagePointer == NULL) {
|
|
||||||
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
ImageContext.ImageAddress = ALIGN_VALUE ((UINTN)MemoryImagePointer, ImageContext.SectionAlignment);
|
|
||||||
|
|
||||||
if (!(IS_ALIGNED (NewPe32BaseAddress, ImageContext.SectionAlignment))) {
|
|
||||||
Status = AddPadSection (&NewPe32BaseAddress, ImageContext.SectionAlignment, FfsFile, FileSize, &CurrentPe32Section);
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
free ((VOID *) MemoryImagePointer);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurSecHdrSize = GetSectionHeaderLength (CurrentPe32Section.CommonHeader);
|
CurSecHdrSize = GetSectionHeaderLength (CurrentPe32Section.CommonHeader);
|
||||||
ImageContext.Handle = (VOID *) ((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize);
|
|
||||||
PdbPointer = PeCoffLoaderGetPdbPointer (ImageContext.Handle);
|
|
||||||
|
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize + ImageContext.PeCoffHeaderOffset);
|
SectPeSize = GetSectionFileLength (CurrentPe32Section.CommonHeader) - CurSecHdrSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = PeCoffLoaderLoadImage (&ImageContext);
|
UefiImageFileBuffer = (VOID *) ((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize);
|
||||||
if (EFI_ERROR (Status)) {
|
UefiImageFileSize = SectPeSize;
|
||||||
Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);
|
//
|
||||||
free ((VOID *) MemoryImagePointer);
|
// UefiImage has no reloc section. It will try to get reloc data from the original UEFI image.
|
||||||
return Status;
|
//
|
||||||
}
|
if (Strip) {
|
||||||
|
//
|
||||||
|
// Construct the original efi file Name
|
||||||
|
//
|
||||||
|
if (strlen (FileName) >= MAX_LONG_FILE_PATH) {
|
||||||
|
Error (NULL, 0, 2000, "Invalid", "The file name %s is too long.", FileName);
|
||||||
|
return EFI_ABORTED;
|
||||||
|
}
|
||||||
|
strncpy (UefiImageFileName, FileName, MAX_LONG_FILE_PATH - 1);
|
||||||
|
UefiImageFileName[MAX_LONG_FILE_PATH - 1] = 0;
|
||||||
|
Cptr = UefiImageFileName + strlen (UefiImageFileName);
|
||||||
|
while (*Cptr != '.') {
|
||||||
|
Cptr --;
|
||||||
|
}
|
||||||
|
if (*Cptr != '.') {
|
||||||
|
Error (NULL, 0, 3000, "Invalid", "The file %s has no .reloc section.", FileName);
|
||||||
|
return EFI_ABORTED;
|
||||||
|
} else {
|
||||||
|
*(Cptr + 1) = 'e';
|
||||||
|
*(Cptr + 2) = 'f';
|
||||||
|
*(Cptr + 3) = 'i';
|
||||||
|
*(Cptr + 4) = '\0';
|
||||||
|
}
|
||||||
|
UefiImageFile = fopen (LongFilePath (UefiImageFileName), "rb");
|
||||||
|
if (UefiImageFile == NULL) {
|
||||||
|
Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);
|
||||||
|
//Error (NULL, 0, 3000, "Invalid", "The file %s has no .reloc section.", FileName);
|
||||||
|
//return EFI_ABORTED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Get the file size
|
||||||
|
//
|
||||||
|
UefiImageFileSize = _filelength (fileno (UefiImageFile));
|
||||||
|
UefiImageFileBuffer = (UINT8 *) malloc (UefiImageFileSize);
|
||||||
|
if (UefiImageFileBuffer == NULL) {
|
||||||
|
fclose (UefiImageFile);
|
||||||
|
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
ImageContext.DestinationAddress = NewPe32BaseAddress;
|
FreeUefiImageFile = TRUE;
|
||||||
|
//
|
||||||
Status = PeCoffLoaderRelocateImage (&ImageContext);
|
// Read Pe File
|
||||||
if (EFI_ERROR (Status)) {
|
//
|
||||||
Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of %s Status=%d", FileName, Status);
|
fread (UefiImageFileBuffer, sizeof (UINT8), UefiImageFileSize, UefiImageFile);
|
||||||
free ((VOID *) MemoryImagePointer);
|
//
|
||||||
return Status;
|
// close file
|
||||||
|
//
|
||||||
|
fclose (UefiImageFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Copy Relocated data to raw image file.
|
// Load and Relocate Image Data
|
||||||
//
|
//
|
||||||
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (
|
RebasedImage = ToolImageEmit (
|
||||||
(UINTN) ImgHdr +
|
&RebasedImageSize,
|
||||||
sizeof (UINT32) +
|
UefiImageFileBuffer,
|
||||||
sizeof (EFI_IMAGE_FILE_HEADER) +
|
UefiImageFileSize,
|
||||||
ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader
|
ImageFormat,
|
||||||
);
|
-1,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
true,
|
||||||
|
NewBaseAddress,
|
||||||
|
NULL,
|
||||||
|
Strip,
|
||||||
|
FALSE
|
||||||
|
);
|
||||||
|
|
||||||
for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {
|
if (FreeUefiImageFile) {
|
||||||
CopyMem (
|
free (UefiImageFileBuffer);
|
||||||
(UINT8 *) CurrentPe32Section.Pe32Section + CurSecHdrSize + SectionHeader->PointerToRawData,
|
|
||||||
(VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress),
|
|
||||||
SectionHeader->SizeOfRawData
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free ((VOID *) MemoryImagePointer);
|
if (RebasedImage == NULL) {
|
||||||
MemoryImagePointer = NULL;
|
Error (NULL, 0, 4001, "Invalid", "failed to rebase (%s)", FileName);
|
||||||
if (PeFileBuffer != NULL) {
|
return EFI_UNSUPPORTED;
|
||||||
free (PeFileBuffer);
|
|
||||||
PeFileBuffer = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
UefiImageFileBuffer = NULL;
|
||||||
// Update Image Base Address
|
UefiImageFileSize = 0;
|
||||||
//
|
|
||||||
if (ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
if (RebasedImageSize > SectPeSize) {
|
||||||
ImgHdr->Pe32.OptionalHeader.ImageBase = (UINT32) NewPe32BaseAddress;
|
Error (NULL, 0, 4001, "Invalid", "rebased file is too large (%s)", FileName);
|
||||||
} else if (ImgHdr->Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
|
return EFI_UNSUPPORTED;
|
||||||
ImgHdr->Pe32Plus.OptionalHeader.ImageBase = NewPe32BaseAddress;
|
|
||||||
} else {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "unknown PE magic signature %X in PE32 image %s",
|
|
||||||
ImgHdr->Pe32.OptionalHeader.Magic,
|
|
||||||
FileName
|
|
||||||
);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memmove (
|
||||||
|
(UINT8 *)CurrentPe32Section.Pe32Section + CurSecHdrSize,
|
||||||
|
RebasedImage,
|
||||||
|
RebasedImageSize
|
||||||
|
);
|
||||||
|
memset (
|
||||||
|
(UINT8 *)CurrentPe32Section.Pe32Section + CurSecHdrSize + RebasedImageSize,
|
||||||
|
0,
|
||||||
|
SectPeSize - RebasedImageSize
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now update file checksum
|
// Now update file checksum
|
||||||
//
|
//
|
||||||
@ -3862,14 +3778,25 @@ Returns:
|
|||||||
// Get this module function address from ModulePeMapFile and add them into FvMap file
|
// Get this module function address from ModulePeMapFile and add them into FvMap file
|
||||||
//
|
//
|
||||||
|
|
||||||
|
Status = UefiImageInitializeContext (
|
||||||
|
&ImageContext,
|
||||||
|
(VOID *) ((UINTN) CurrentPe32Section.Pe32Section + CurSecHdrSize),
|
||||||
|
RebasedImageSize
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default use FileName as map file path
|
// Default use FileName as map file path
|
||||||
//
|
//
|
||||||
if (PdbPointer == NULL) {
|
WriteMapFile (
|
||||||
PdbPointer = FileName;
|
FvMapFile,
|
||||||
}
|
SymbolsPathCpy != NULL ? SymbolsPathCpy : FileName,
|
||||||
|
*FfsFile,
|
||||||
|
NewBaseAddress,
|
||||||
|
&ImageContext
|
||||||
|
);
|
||||||
|
|
||||||
WriteMapFile (FvMapFile, PdbPointer, *FfsFile, NewPe32BaseAddress, &ImageContext);
|
free (SymbolsPathCpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
@ -22,7 +22,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Common/PiFirmwareVolume.h>
|
#include <Common/PiFirmwareVolume.h>
|
||||||
#include <Guid/FirmwareFileSystem2.h>
|
#include <Guid/FirmwareFileSystem2.h>
|
||||||
#include <Guid/FirmwareFileSystem3.h>
|
#include <Guid/FirmwareFileSystem3.h>
|
||||||
#include <Common/PeImageEx.h>
|
|
||||||
|
|
||||||
#include "CommonLib.h"
|
#include "CommonLib.h"
|
||||||
#include "ParseInf.h"
|
#include "ParseInf.h"
|
||||||
@ -304,8 +303,9 @@ Returns:
|
|||||||
;
|
;
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetPe32Info (
|
GetUefiImageInfo (
|
||||||
IN UINT8 *Pe32,
|
IN UINT8 *UefiImage,
|
||||||
|
IN UINT32 UefiImageSize,
|
||||||
OUT UINT32 *EntryPoint,
|
OUT UINT32 *EntryPoint,
|
||||||
OUT UINT16 *MachineType
|
OUT UINT16 *MachineType
|
||||||
);
|
);
|
||||||
|
@ -22,7 +22,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Common/UefiBaseTypes.h>
|
#include <Common/UefiBaseTypes.h>
|
||||||
#include <Common/PiFirmwareFile.h>
|
#include <Common/PiFirmwareFile.h>
|
||||||
#include <Common/GuidedSectionExtractionEx.h>
|
#include <Common/GuidedSectionExtractionEx.h>
|
||||||
#include <Common/PeImageEx.h>
|
|
||||||
|
|
||||||
#include "CommonLib.h"
|
#include "CommonLib.h"
|
||||||
#include "Compress.h"
|
#include "Compress.h"
|
||||||
@ -30,7 +29,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "EfiUtilityMsgs.h"
|
#include "EfiUtilityMsgs.h"
|
||||||
#include "ParseInf.h"
|
#include "ParseInf.h"
|
||||||
#include "FvLib.h"
|
#include "FvLib.h"
|
||||||
#include "PeCoffLib.h"
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// GenSec Tool Information
|
// GenSec Tool Information
|
||||||
@ -1125,104 +1123,6 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
FfsRebaseImageRead (
|
|
||||||
IN VOID *FileHandle,
|
|
||||||
IN UINTN FileOffset,
|
|
||||||
IN OUT UINT32 *ReadSize,
|
|
||||||
OUT VOID *Buffer
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
FileHandle - The handle to the PE/COFF file
|
|
||||||
|
|
||||||
FileOffset - The offset, in bytes, into the file to read
|
|
||||||
|
|
||||||
ReadSize - The number of bytes to read from the file starting at FileOffset
|
|
||||||
|
|
||||||
Buffer - A pointer to the buffer to read the data into.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
CHAR8 *Destination8;
|
|
||||||
CHAR8 *Source8;
|
|
||||||
UINT32 Length;
|
|
||||||
|
|
||||||
Destination8 = Buffer;
|
|
||||||
Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
|
|
||||||
Length = *ReadSize;
|
|
||||||
while (Length--) {
|
|
||||||
*(Destination8++) = *(Source8++);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC
|
|
||||||
EFI_STATUS
|
|
||||||
GetAlignmentFromFile(char *InFile, UINT32 *Alignment)
|
|
||||||
/*
|
|
||||||
InFile is input file for getting alignment
|
|
||||||
return the alignment
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
FILE *InFileHandle;
|
|
||||||
UINT8 *PeFileBuffer;
|
|
||||||
UINTN PeFileSize;
|
|
||||||
UINT32 CurSecHdrSize;
|
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
|
||||||
EFI_COMMON_SECTION_HEADER *CommonHeader;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
InFileHandle = NULL;
|
|
||||||
PeFileBuffer = NULL;
|
|
||||||
*Alignment = 0;
|
|
||||||
|
|
||||||
memset (&ImageContext, 0, sizeof (ImageContext));
|
|
||||||
|
|
||||||
InFileHandle = fopen(LongFilePath(InFile), "rb");
|
|
||||||
if (InFileHandle == NULL){
|
|
||||||
Error (NULL, 0, 0001, "Error opening file", InFile);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
|
||||||
PeFileSize = _filelength (fileno(InFileHandle));
|
|
||||||
PeFileBuffer = (UINT8 *) malloc (PeFileSize);
|
|
||||||
if (PeFileBuffer == NULL) {
|
|
||||||
fclose (InFileHandle);
|
|
||||||
Error(NULL, 0, 4001, "Resource", "memory cannot be allocated for %s", InFile);
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
fread (PeFileBuffer, sizeof (UINT8), PeFileSize, InFileHandle);
|
|
||||||
fclose (InFileHandle);
|
|
||||||
CommonHeader = (EFI_COMMON_SECTION_HEADER *) PeFileBuffer;
|
|
||||||
CurSecHdrSize = GetSectionHeaderLength(CommonHeader);
|
|
||||||
ImageContext.Handle = (VOID *) ((UINTN)PeFileBuffer + CurSecHdrSize);
|
|
||||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE)FfsRebaseImageRead;
|
|
||||||
Status = PeCoffLoaderGetImageInfo(&ImageContext);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid PeImage", "The input file is %s and return status is %x", InFile, (int) Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
*Alignment = ImageContext.SectionAlignment;
|
|
||||||
// Free the allocated memory resource
|
|
||||||
if (PeFileBuffer != NULL) {
|
|
||||||
free (PeFileBuffer);
|
|
||||||
PeFileBuffer = NULL;
|
|
||||||
}
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (
|
main (
|
||||||
int argc,
|
int argc,
|
||||||
|
@ -1,101 +1,171 @@
|
|||||||
/** @file
|
/** @file
|
||||||
AutoGen definitions for edk2 package code consumption in BaseTools.
|
AutoGen definitions for edk2 package code consumption in BaseTools.
|
||||||
|
|
||||||
Copyright (c) 2023, Marvin Häuser. All rights reserved.<BR>
|
Copyright (c) 2023, Marvin Häuser. All rights reserved.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef _BT_AUTOGENH
|
#ifndef _BT_AUTOGENH
|
||||||
#define _BT_AUTOGENH
|
#define _BT_AUTOGENH
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <Base.h>
|
#include <Base.h>
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
|
|
||||||
extern GUID gEfiCallerIdGuid;
|
extern GUID gEfiCallerIdGuid;
|
||||||
extern GUID gEdkiiDscPlatformGuid;
|
extern GUID gEdkiiDscPlatformGuid;
|
||||||
extern CHAR8 *gEfiCallerBaseName;
|
extern CHAR8 *gEfiCallerBaseName;
|
||||||
|
|
||||||
#define EFI_CALLER_ID_GUID \
|
#define EFI_CALLER_ID_GUID \
|
||||||
{0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
|
{0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
|
||||||
#define EDKII_DSC_PLATFORM_GUID \
|
#define EDKII_DSC_PLATFORM_GUID \
|
||||||
{0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
|
{0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
|
||||||
|
|
||||||
// Definition of SkuId Array
|
// Definition of SkuId Array
|
||||||
extern UINT64 _gPcd_SkuId_Array[];
|
extern UINT64 _gPcd_SkuId_Array[];
|
||||||
|
|
||||||
// Definition of PCDs used in this module
|
// Definition of PCDs used in this module
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdMaximumAsciiStringLength 0U
|
#define _PCD_TOKEN_PcdMaximumAsciiStringLength 0U
|
||||||
#define _PCD_SIZE_PcdMaximumAsciiStringLength 4
|
#define _PCD_SIZE_PcdMaximumAsciiStringLength 4
|
||||||
#define _PCD_GET_MODE_SIZE_PcdMaximumAsciiStringLength _PCD_SIZE_PcdMaximumAsciiStringLength
|
#define _PCD_GET_MODE_SIZE_PcdMaximumAsciiStringLength _PCD_SIZE_PcdMaximumAsciiStringLength
|
||||||
#define _PCD_VALUE_PcdMaximumAsciiStringLength 0U
|
#define _PCD_VALUE_PcdMaximumAsciiStringLength 0U
|
||||||
#define _PCD_GET_MODE_32_PcdMaximumAsciiStringLength _PCD_VALUE_PcdMaximumAsciiStringLength
|
#define _PCD_GET_MODE_32_PcdMaximumAsciiStringLength _PCD_VALUE_PcdMaximumAsciiStringLength
|
||||||
//#define _PCD_SET_MODE_32_PcdMaximumAsciiStringLength ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_32_PcdMaximumAsciiStringLength ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdMaximumUnicodeStringLength 0U
|
#define _PCD_TOKEN_PcdMaximumUnicodeStringLength 0U
|
||||||
#define _PCD_SIZE_PcdMaximumUnicodeStringLength 4
|
#define _PCD_SIZE_PcdMaximumUnicodeStringLength 4
|
||||||
#define _PCD_GET_MODE_SIZE_PcdMaximumUnicodeStringLength _PCD_SIZE_PcdMaximumUnicodeStringLength
|
#define _PCD_GET_MODE_SIZE_PcdMaximumUnicodeStringLength _PCD_SIZE_PcdMaximumUnicodeStringLength
|
||||||
#define _PCD_VALUE_PcdMaximumUnicodeStringLength 0U
|
#define _PCD_VALUE_PcdMaximumUnicodeStringLength 0U
|
||||||
#define _PCD_GET_MODE_32_PcdMaximumUnicodeStringLength _PCD_VALUE_PcdMaximumUnicodeStringLength
|
#define _PCD_GET_MODE_32_PcdMaximumUnicodeStringLength _PCD_VALUE_PcdMaximumUnicodeStringLength
|
||||||
//#define _PCD_SET_MODE_32_PcdMaximumUnicodeStringLength ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_32_PcdMaximumUnicodeStringLength ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdMaximumLinkedListLength 0U
|
#define _PCD_TOKEN_PcdMaximumLinkedListLength 0U
|
||||||
#define _PCD_SIZE_PcdMaximumLinkedListLength 4
|
#define _PCD_SIZE_PcdMaximumLinkedListLength 4
|
||||||
#define _PCD_GET_MODE_SIZE_PcdMaximumLinkedListLength _PCD_SIZE_PcdMaximumLinkedListLength
|
#define _PCD_GET_MODE_SIZE_PcdMaximumLinkedListLength _PCD_SIZE_PcdMaximumLinkedListLength
|
||||||
#define _PCD_VALUE_PcdMaximumLinkedListLength 0U
|
#define _PCD_VALUE_PcdMaximumLinkedListLength 0U
|
||||||
#define _PCD_GET_MODE_32_PcdMaximumLinkedListLength _PCD_VALUE_PcdMaximumLinkedListLength
|
#define _PCD_GET_MODE_32_PcdMaximumLinkedListLength _PCD_VALUE_PcdMaximumLinkedListLength
|
||||||
//#define _PCD_SET_MODE_32_PcdMaximumLinkedListLength ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_32_PcdMaximumLinkedListLength ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdMaximumDevicePathNodeCount 0U
|
#define _PCD_TOKEN_PcdMaximumDevicePathNodeCount 0U
|
||||||
#define _PCD_SIZE_PcdMaximumDevicePathNodeCount 4
|
#define _PCD_SIZE_PcdMaximumDevicePathNodeCount 4
|
||||||
#define _PCD_GET_MODE_SIZE_PcdMaximumDevicePathNodeCount _PCD_SIZE_PcdMaximumDevicePathNodeCount
|
#define _PCD_GET_MODE_SIZE_PcdMaximumDevicePathNodeCount _PCD_SIZE_PcdMaximumDevicePathNodeCount
|
||||||
#define _PCD_VALUE_PcdMaximumDevicePathNodeCount 0U
|
#define _PCD_VALUE_PcdMaximumDevicePathNodeCount 0U
|
||||||
#define _PCD_GET_MODE_32_PcdMaximumDevicePathNodeCount _PCD_VALUE_PcdMaximumDevicePathNodeCount
|
#define _PCD_GET_MODE_32_PcdMaximumDevicePathNodeCount _PCD_VALUE_PcdMaximumDevicePathNodeCount
|
||||||
//#define _PCD_SET_MODE_32_PcdMaximumDevicePathNodeCount ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_32_PcdMaximumDevicePathNodeCount ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdVerifyNodeInList 0U
|
#define _PCD_TOKEN_PcdVerifyNodeInList 0U
|
||||||
#define _PCD_SIZE_PcdVerifyNodeInList 1
|
#define _PCD_SIZE_PcdVerifyNodeInList 1
|
||||||
#define _PCD_GET_MODE_SIZE_PcdVerifyNodeInList _PCD_SIZE_PcdVerifyNodeInList
|
#define _PCD_GET_MODE_SIZE_PcdVerifyNodeInList _PCD_SIZE_PcdVerifyNodeInList
|
||||||
#define _PCD_VALUE_PcdVerifyNodeInList 1U
|
#define _PCD_VALUE_PcdVerifyNodeInList 1U
|
||||||
#define _PCD_GET_MODE_BOOL_PcdVerifyNodeInList _PCD_VALUE_PcdVerifyNodeInList
|
#define _PCD_GET_MODE_BOOL_PcdVerifyNodeInList _PCD_VALUE_PcdVerifyNodeInList
|
||||||
//#define _PCD_SET_MODE_BOOL_PcdVerifyNodeInList ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_BOOL_PcdVerifyNodeInList ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdFixedDebugPrintErrorLevel 0U
|
#define _PCD_TOKEN_PcdFixedDebugPrintErrorLevel 0U
|
||||||
#define _PCD_SIZE_PcdFixedDebugPrintErrorLevel 4
|
#define _PCD_SIZE_PcdFixedDebugPrintErrorLevel 4
|
||||||
#define _PCD_GET_MODE_SIZE_PcdFixedDebugPrintErrorLevel _PCD_SIZE_PcdFixedDebugPrintErrorLevel
|
#define _PCD_GET_MODE_SIZE_PcdFixedDebugPrintErrorLevel _PCD_SIZE_PcdFixedDebugPrintErrorLevel
|
||||||
#define _PCD_VALUE_PcdFixedDebugPrintErrorLevel 0xFFFFFFFFU
|
#define _PCD_VALUE_PcdFixedDebugPrintErrorLevel 0xFFFFFFFFU
|
||||||
#define _PCD_GET_MODE_32_PcdFixedDebugPrintErrorLevel _PCD_VALUE_PcdFixedDebugPrintErrorLevel
|
#define _PCD_GET_MODE_32_PcdFixedDebugPrintErrorLevel _PCD_VALUE_PcdFixedDebugPrintErrorLevel
|
||||||
//#define _PCD_SET_MODE_32_PcdFixedDebugPrintErrorLevel ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_32_PcdFixedDebugPrintErrorLevel ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdDebugPropertyMask 0U
|
#define _PCD_TOKEN_PcdDebugPropertyMask 0U
|
||||||
#define _PCD_SIZE_PcdDebugPropertyMask 1
|
#define _PCD_SIZE_PcdDebugPropertyMask 1
|
||||||
#define _PCD_GET_MODE_SIZE_PcdDebugPropertyMask _PCD_SIZE_PcdDebugPropertyMask
|
#define _PCD_GET_MODE_SIZE_PcdDebugPropertyMask _PCD_SIZE_PcdDebugPropertyMask
|
||||||
#define _PCD_VALUE_PcdDebugPropertyMask 0xFFU
|
#define _PCD_VALUE_PcdDebugPropertyMask 0xFFU
|
||||||
#define _PCD_GET_MODE_8_PcdDebugPropertyMask _PCD_VALUE_PcdDebugPropertyMask
|
#define _PCD_GET_MODE_8_PcdDebugPropertyMask _PCD_VALUE_PcdDebugPropertyMask
|
||||||
//#define _PCD_SET_MODE_8_PcdDebugPropertyMask ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_8_PcdDebugPropertyMask ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdDebugClearMemoryValue 0U
|
#define _PCD_TOKEN_PcdDebugClearMemoryValue 0U
|
||||||
#define _PCD_SIZE_PcdDebugClearMemoryValue 1
|
#define _PCD_SIZE_PcdDebugClearMemoryValue 1
|
||||||
#define _PCD_GET_MODE_SIZE_PcdDebugClearMemoryValue _PCD_SIZE_PcdDebugClearMemoryValue
|
#define _PCD_GET_MODE_SIZE_PcdDebugClearMemoryValue _PCD_SIZE_PcdDebugClearMemoryValue
|
||||||
#define _PCD_VALUE_PcdDebugClearMemoryValue 0xAFU
|
#define _PCD_VALUE_PcdDebugClearMemoryValue 0xAFU
|
||||||
#define _PCD_GET_MODE_8_PcdDebugClearMemoryValue _PCD_VALUE_PcdDebugClearMemoryValue
|
#define _PCD_GET_MODE_8_PcdDebugClearMemoryValue _PCD_VALUE_PcdDebugClearMemoryValue
|
||||||
//#define _PCD_SET_MODE_8_PcdDebugClearMemoryValue ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_8_PcdDebugClearMemoryValue ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
#define _PCD_TOKEN_PcdDebugPrintErrorLevel 0U
|
#define _PCD_TOKEN_PcdDebugPrintErrorLevel 0U
|
||||||
#define _PCD_SIZE_PcdDebugPrintErrorLevel 4
|
#define _PCD_SIZE_PcdDebugPrintErrorLevel 4
|
||||||
#define _PCD_GET_MODE_SIZE_PcdDebugPrintErrorLevel _PCD_SIZE_PcdDebugPrintErrorLevel
|
#define _PCD_GET_MODE_SIZE_PcdDebugPrintErrorLevel _PCD_SIZE_PcdDebugPrintErrorLevel
|
||||||
#define _PCD_VALUE_PcdDebugPrintErrorLevel 0x8000004F
|
#define _PCD_VALUE_PcdDebugPrintErrorLevel 0x8000004F
|
||||||
#define _PCD_GET_MODE_32_PcdDebugPrintErrorLevel _PCD_VALUE_PcdDebugPrintErrorLevel
|
#define _PCD_GET_MODE_32_PcdDebugPrintErrorLevel _PCD_VALUE_PcdDebugPrintErrorLevel
|
||||||
//#define _PCD_SET_MODE_32_PcdDebugPrintErrorLevel ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
//#define _PCD_SET_MODE_32_PcdDebugPrintErrorLevel ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderDebugSupport 0U
|
||||||
#ifdef __cplusplus
|
#define _PCD_SIZE_PcdImageLoaderDebugSupport 1
|
||||||
}
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderDebugSupport _PCD_SIZE_PcdImageLoaderDebugSupport
|
||||||
#endif
|
#define _PCD_VALUE_PcdImageLoaderDebugSupport TRUE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderDebugSupport _PCD_VALUE_PcdImageLoaderDebugSupport
|
||||||
#endif
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderDebugSupport ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderHashProhibitOverlap 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderHashProhibitOverlap 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderHashProhibitOverlap _PCD_SIZE_PcdImageLoaderHashProhibitOverlap
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderHashProhibitOverlap FALSE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderHashProhibitOverlap _PCD_VALUE_PcdImageLoaderHashProhibitOverlap
|
||||||
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderHashProhibitOverlap ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderAllowMisalignedOffset 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderAllowMisalignedOffset 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderAllowMisalignedOffset _PCD_SIZE_PcdImageLoaderAllowMisalignedOffset
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderAllowMisalignedOffset FALSE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderAllowMisalignedOffset _PCD_VALUE_PcdImageLoaderAllowMisalignedOffset
|
||||||
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderAllowMisalignedOffset ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderRemoveXForWX 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderRemoveXForWX 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderRemoveXForWX _PCD_SIZE_PcdImageLoaderRemoveXForWX
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderRemoveXForWX FALSE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderRemoveXForWX _PCD_VALUE_PcdImageLoaderRemoveXForWX
|
||||||
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderRemoveXForWX ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderWXorX 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderWXorX 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderWXorX _PCD_SIZE_PcdImageLoaderWXorX
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderWXorX TRUE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderWXorX _PCD_VALUE_PcdImageLoaderWXorX
|
||||||
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderWXorX ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderLoadHeader 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderLoadHeader 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderLoadHeader _PCD_SIZE_PcdImageLoaderLoadHeader
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderLoadHeader TRUE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderLoadHeader _PCD_VALUE_PcdImageLoaderLoadHeader
|
||||||
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderLoadHeader ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderRtRelocAllowTargetMismatch 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderRtRelocAllowTargetMismatch 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderRtRelocAllowTargetMismatch _PCD_SIZE_PcdImageLoaderRtRelocAllowTargetMismatch
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderRtRelocAllowTargetMismatch TRUE
|
||||||
|
#define _PCD_GET_MODE_BOOL_PcdImageLoaderRtRelocAllowTargetMismatch _PCD_VALUE_PcdImageLoaderRtRelocAllowTargetMismatch
|
||||||
|
//#define _PCD_SET_MODE_BOOL_PcdImageLoaderRtRelocAllowTargetMismatch ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderAlignmentPolicy 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderAlignmentPolicy 4
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderAlignmentPolicy _PCD_SIZE_PcdImageLoaderAlignmentPolicy
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderAlignmentPolicy 0U
|
||||||
|
#define _PCD_GET_MODE_32_PcdImageLoaderAlignmentPolicy _PCD_VALUE_PcdImageLoaderAlignmentPolicy
|
||||||
|
//#define _PCD_SET_MODE_32_PcdImageLoaderAlignmentPolicy ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdImageLoaderRelocTypePolicy 0U
|
||||||
|
#define _PCD_SIZE_PcdImageLoaderRelocTypePolicy 4
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdImageLoaderRelocTypePolicy _PCD_SIZE_PcdImageLoaderRelocTypePolicy
|
||||||
|
#define _PCD_VALUE_PcdImageLoaderRelocTypePolicy 0U
|
||||||
|
#define _PCD_GET_MODE_32_PcdImageLoaderRelocTypePolicy _PCD_VALUE_PcdImageLoaderRelocTypePolicy
|
||||||
|
//#define _PCD_SET_MODE_32_PcdImageLoaderRelocTypePolicy ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
#define _PCD_TOKEN_PcdDebugRaisePropertyMask 0U
|
||||||
|
#define _PCD_SIZE_PcdDebugRaisePropertyMask 1
|
||||||
|
#define _PCD_GET_MODE_SIZE_PcdDebugRaisePropertyMask _PCD_SIZE_PcdDebugRaisePropertyMask
|
||||||
|
#define _PCD_VALUE_PcdDebugRaisePropertyMask 0xFFU
|
||||||
|
#define _PCD_GET_MODE_8_PcdDebugRaisePropertyMask _PCD_VALUE_PcdDebugRaisePropertyMask
|
||||||
|
//#define _PCD_SET_MODE_8_PcdDebugRaisePropertyMask ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
/** @file
|
|
||||||
EFI image format for PE32+. Please note some data structures are different
|
|
||||||
for IA-32 and Itanium-based images, look for UINTN and the #ifdef EFI_IA64
|
|
||||||
|
|
||||||
@bug Fix text - doc as defined in MSFT EFI specification.
|
|
||||||
|
|
||||||
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
||||||
Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
|
|
||||||
Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
|
||||||
Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef __BT_PE_IMAGE_H__
|
|
||||||
#define __BT_PE_IMAGE_H__
|
|
||||||
|
|
||||||
#include <IndustryStandard/PeImage.h>
|
|
||||||
|
|
||||||
//
|
|
||||||
// PE32+ Machine type for EFI images
|
|
||||||
//
|
|
||||||
#define IMAGE_FILE_MACHINE_ARM 0x01c0
|
|
||||||
#define IMAGE_FILE_MACHINE_ARMT IMAGE_FILE_MACHINE_ARMTHUMB_MIXED
|
|
||||||
|
|
||||||
//
|
|
||||||
// Support old names for backward compatible
|
|
||||||
//
|
|
||||||
#define EFI_IMAGE_MACHINE_ARMT EFI_IMAGE_MACHINE_ARMTHUMB_MIXED
|
|
||||||
|
|
||||||
#define EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // Supports addresses > 2-GB
|
|
||||||
|
|
||||||
//
|
|
||||||
// Based export types.
|
|
||||||
//
|
|
||||||
#define EFI_IMAGE_EXPORT_ORDINAL_BASE 1
|
|
||||||
#define EFI_IMAGE_EXPORT_ADDR_SIZE 4
|
|
||||||
#define EFI_IMAGE_EXPORT_ORDINAL_SIZE 2
|
|
||||||
|
|
||||||
//
|
|
||||||
// .pdata entries for X64
|
|
||||||
//
|
|
||||||
typedef struct {
|
|
||||||
UINT32 FunctionStartAddress;
|
|
||||||
UINT32 FunctionEndAddress;
|
|
||||||
UINT32 UnwindInfoAddress;
|
|
||||||
} RUNTIME_FUNCTION;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UINT8 Version:3;
|
|
||||||
UINT8 Flags:5;
|
|
||||||
UINT8 SizeOfProlog;
|
|
||||||
UINT8 CountOfUnwindCodes;
|
|
||||||
UINT8 FrameRegister:4;
|
|
||||||
UINT8 FrameRegisterOffset:4;
|
|
||||||
} UNWIND_INFO;
|
|
||||||
|
|
||||||
#endif
|
|
@ -86,7 +86,7 @@ endif
|
|||||||
|
|
||||||
INCLUDE = $(TOOL_INCLUDE) -I $(MAKEROOT) -I $(MAKEROOT)/Include/Common -I $(MAKEROOT)/Include/ -I $(MAKEROOT)/Include/IndustryStandard -I $(MAKEROOT)/Common/ -I .. -I . $(ARCH_INCLUDE)
|
INCLUDE = $(TOOL_INCLUDE) -I $(MAKEROOT) -I $(MAKEROOT)/Include/Common -I $(MAKEROOT)/Include/ -I $(MAKEROOT)/Include/IndustryStandard -I $(MAKEROOT)/Common/ -I .. -I . $(ARCH_INCLUDE)
|
||||||
|
|
||||||
INCLUDE += -I $(EDK2_PATH)/MdePkg/Include/ -I $(EDK2_PATH)/MdeModulePkg/Include/
|
INCLUDE += -I $(EDK2_PATH)/MdePkg/Include/ -I $(EDK2_PATH)/MdeModulePkg/Include/ -I $(EDK2_PATH)/OpenCorePkg/User/Include
|
||||||
|
|
||||||
EDK2_INCLUDE = -include $(MAKEROOT)/Include/Common/AutoGen.h
|
EDK2_INCLUDE = -include $(MAKEROOT)/Include/Common/AutoGen.h
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ LINKER = $(LD)
|
|||||||
INC = $(INC) -I . -I $(SOURCE_PATH)\Include -I $(ARCH_INCLUDE) -I $(SOURCE_PATH)\Common
|
INC = $(INC) -I . -I $(SOURCE_PATH)\Include -I $(ARCH_INCLUDE) -I $(SOURCE_PATH)\Common
|
||||||
INC = $(INC) -I $(EDK2_PATH)\MdePkg\Include
|
INC = $(INC) -I $(EDK2_PATH)\MdePkg\Include
|
||||||
|
|
||||||
INC = $(INC) -I $(EDK2_PATH)\MdePkg\Include -I $(EDK2_PATH)\MdeModulePkg\Include
|
INC = $(INC) -I $(EDK2_PATH)\MdePkg\Include -I $(EDK2_PATH)\MdeModulePkg\Include -I $(EDK2_PATH)/OpenCorePkg/User/Include
|
||||||
|
|
||||||
EDK2_INC = $(INC) /FI..\Include\Common\AutoGen.h
|
EDK2_INC = $(INC) /FI..\Include\Common\AutoGen.h
|
||||||
|
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
|
|
||||||
#DEPFILES = $(OBJECTS:%.o=%.d)
|
#DEPFILES = $(OBJECTS:%.o=%.d)
|
||||||
|
|
||||||
|
{$(EDK2_PATH)\BaseTools\ImageTool\}.c{$(EDK2_OBJPATH)\BaseTools\ImageTool\}.obj :
|
||||||
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
{$(EDK2_PATH)\MdePkg\Library\BaseDebugPrintErrorLevelLib\}.c{$(EDK2_OBJPATH)\MdePkg\Library\BaseDebugPrintErrorLevelLib\}.obj :
|
{$(EDK2_PATH)\MdePkg\Library\BaseDebugPrintErrorLevelLib\}.c{$(EDK2_OBJPATH)\MdePkg\Library\BaseDebugPrintErrorLevelLib\}.obj :
|
||||||
-@if not exist $(@D)\ mkdir $(@D)
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
@ -27,6 +31,22 @@
|
|||||||
-@if not exist $(@D)\ mkdir $(@D)
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
|
{$(EDK2_PATH)\MdePkg\Library\BaseOverflowLib\}.c{$(EDK2_OBJPATH)\MdePkg\Library\BaseOverflowLib\}.obj :
|
||||||
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
|
{$(EDK2_PATH)\MdePkg\Library\BasePeCoffLib2\}.c{$(EDK2_OBJPATH)\MdePkg\Library\BasePeCoffLib2\}.obj :
|
||||||
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
|
{$(EDK2_PATH)\MdePkg\Library\BaseUefiImageLib\}.c{$(EDK2_OBJPATH)\MdePkg\Library\BaseUefiImageLib\}.obj :
|
||||||
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
|
{$(EDK2_PATH)\MdePkg\Library\BaseUefiImageExtraActionLibNull\}.c{$(EDK2_OBJPATH)\MdePkg\Library\BaseUefiImageExtraActionLibNull\}.obj :
|
||||||
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
{$(EDK2_PATH)\MdeModulePkg\Library\BaseMemoryProfileLibNull\}.c{$(EDK2_OBJPATH)\MdeModulePkg\Library\BaseMemoryProfileLibNull\}.obj :
|
{$(EDK2_PATH)\MdeModulePkg\Library\BaseMemoryProfileLibNull\}.c{$(EDK2_OBJPATH)\MdeModulePkg\Library\BaseMemoryProfileLibNull\}.obj :
|
||||||
-@if not exist $(@D)\ mkdir $(@D)
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
@ -35,6 +55,10 @@
|
|||||||
-@if not exist $(@D)\ mkdir $(@D)
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
|
{$(EDK2_PATH)\OpenCorePkg\User\Library\}.c{$(EDK2_OBJPATH)\OpenCorePkg\User\Library\}.obj :
|
||||||
|
-@if not exist $(@D)\ mkdir $(@D)
|
||||||
|
$(CC) -c $(CFLAGS) $(EDK2_INC) $< -Fo$@
|
||||||
|
|
||||||
|
|
||||||
.c.obj :
|
.c.obj :
|
||||||
$(CC) -c $(CFLAGS) $(INC) $< -Fo$@
|
$(CC) -c $(CFLAGS) $(INC) $< -Fo$@
|
||||||
|
@ -9,6 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -24,7 +25,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Common/PiFirmwareFile.h>
|
#include <Common/PiFirmwareFile.h>
|
||||||
#include <Common/PiFirmwareVolume.h>
|
#include <Common/PiFirmwareVolume.h>
|
||||||
#include <Guid/FirmwareFileSystem2.h>
|
#include <Guid/FirmwareFileSystem2.h>
|
||||||
#include <Common/PeImageEx.h>
|
|
||||||
#include <Common/GuidedSectionExtractionEx.h>
|
#include <Common/GuidedSectionExtractionEx.h>
|
||||||
|
|
||||||
#include "Compress.h"
|
#include "Compress.h"
|
||||||
@ -37,7 +37,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "ParseGuidedSectionTools.h"
|
#include "ParseGuidedSectionTools.h"
|
||||||
#include "StringFuncs.h"
|
#include "StringFuncs.h"
|
||||||
#include "ParseInf.h"
|
#include "ParseInf.h"
|
||||||
#include "PeCoffLib.h"
|
|
||||||
|
#include "../../../ImageTool/ImageToolEmit.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Utility global variables
|
// Utility global variables
|
||||||
@ -1417,249 +1418,63 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
RebaseImageRead (
|
|
||||||
IN VOID *FileHandle,
|
|
||||||
IN UINTN FileOffset,
|
|
||||||
IN OUT UINT32 *ReadSize,
|
|
||||||
OUT VOID *Buffer
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
FileHandle - The handle to the PE/COFF file
|
|
||||||
|
|
||||||
FileOffset - The offset, in bytes, into the file to read
|
|
||||||
|
|
||||||
ReadSize - The number of bytes to read from the file starting at FileOffset
|
|
||||||
|
|
||||||
Buffer - A pointer to the buffer to read the data into.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
CHAR8 *Destination8;
|
|
||||||
CHAR8 *Source8;
|
|
||||||
UINT32 Length;
|
|
||||||
|
|
||||||
Destination8 = Buffer;
|
|
||||||
Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
|
|
||||||
Length = *ReadSize;
|
|
||||||
while (Length--) {
|
|
||||||
*(Destination8++) = *(Source8++);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
SetAddressToSectionHeader (
|
|
||||||
IN CHAR8 *FileName,
|
|
||||||
IN OUT UINT8 *FileBuffer,
|
|
||||||
IN UINT64 NewPe32BaseAddress
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Set new base address into the section header of PeImage
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
FileName - Name of file
|
|
||||||
FileBuffer - Pointer to PeImage.
|
|
||||||
NewPe32BaseAddress - New Base Address for PE image.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS Set new base address into this image successfully.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
|
||||||
UINTN Index;
|
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
|
||||||
EFI_IMAGE_SECTION_HEADER *SectionHeader;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Initialize context
|
|
||||||
//
|
|
||||||
memset (&ImageContext, 0, sizeof (ImageContext));
|
|
||||||
ImageContext.Handle = (VOID *) FileBuffer;
|
|
||||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) RebaseImageRead;
|
|
||||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "The input PeImage %s is not valid", FileName);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ImageContext.RelocationsStripped) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get PeHeader pointer
|
|
||||||
//
|
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(FileBuffer + ImageContext.PeCoffHeaderOffset);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get section header list
|
|
||||||
//
|
|
||||||
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (
|
|
||||||
(UINTN) ImgHdr +
|
|
||||||
sizeof (UINT32) +
|
|
||||||
sizeof (EFI_IMAGE_FILE_HEADER) +
|
|
||||||
ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set base address into the first section header that doesn't point to code section.
|
|
||||||
//
|
|
||||||
for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {
|
|
||||||
if ((SectionHeader->Characteristics & EFI_IMAGE_SCN_CNT_CODE) == 0) {
|
|
||||||
*(UINT64 *) &SectionHeader->PointerToRelocations = NewPe32BaseAddress;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// BaseAddress is set to section header.
|
|
||||||
//
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
RebaseImage (
|
RebaseImage (
|
||||||
IN CHAR8 *FileName,
|
IN CHAR8 *FileName,
|
||||||
IN OUT UINT8 *FileBuffer,
|
IN OUT UINT8 *FileBuffer,
|
||||||
IN UINT64 NewPe32BaseAddress
|
IN UINT32 FileBufferSize,
|
||||||
|
IN UINT64 NewBaseAddress
|
||||||
)
|
)
|
||||||
/*++
|
/*++
|
||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Set new base address into PeImage, and fix up PeImage based on new address.
|
Set new base address into UefiImage, and fix up UefiImage based on new address.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
FileName - Name of file
|
FileName - Name of file
|
||||||
FileBuffer - Pointer to PeImage.
|
FileBuffer - Pointer to UefiImage.
|
||||||
NewPe32BaseAddress - New Base Address for PE image.
|
NewBaseAddress - New Base Address for UEFI image.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_INVALID_PARAMETER - BaseAddress is not valid.
|
EFI_INVALID_PARAMETER - BaseAddress is not valid.
|
||||||
EFI_SUCCESS - Update PeImage is correctly.
|
EFI_SUCCESS - Update UefiImage is correctly.
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
UINT32 RebasedSize;
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
VOID *RebasedBuffer;
|
||||||
UINTN Index;
|
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
|
||||||
UINT8 *MemoryImagePointer;
|
|
||||||
EFI_IMAGE_SECTION_HEADER *SectionHeader;
|
|
||||||
|
|
||||||
//
|
RebasedBuffer = ToolImageEmit (
|
||||||
// Initialize context
|
&RebasedSize,
|
||||||
//
|
FileBuffer,
|
||||||
memset (&ImageContext, 0, sizeof (ImageContext));
|
FileBufferSize,
|
||||||
ImageContext.Handle = (VOID *) FileBuffer;
|
-1,
|
||||||
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) RebaseImageRead;
|
-1,
|
||||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
NULL,
|
||||||
if (EFI_ERROR (Status)) {
|
0,
|
||||||
Error (NULL, 0, 3000, "Invalid", "The input PeImage %s is not valid", FileName);
|
true,
|
||||||
return Status;
|
NewBaseAddress,
|
||||||
|
NULL,
|
||||||
|
FALSE,
|
||||||
|
TRUE
|
||||||
|
);
|
||||||
|
if (RebasedBuffer == NULL) {
|
||||||
|
Error (NULL, 0, 3000, "Invalid", "The input UefiImage %s is not valid", FileName);
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImageContext.RelocationsStripped) {
|
if (RebasedSize > FileBufferSize) {
|
||||||
Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);
|
Error (NULL, 0, 3000, "Invalid", "Rebased %s too large: %u vs %u", FileName, RebasedSize, FileBufferSize);
|
||||||
return Status;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
memmove (FileBuffer, RebasedBuffer, RebasedSize);
|
||||||
// Get PeHeader pointer
|
memset (FileBuffer + RebasedSize, 0, FileBufferSize - RebasedSize);
|
||||||
//
|
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(FileBuffer + ImageContext.PeCoffHeaderOffset);
|
|
||||||
|
|
||||||
//
|
return EFI_SUCCESS;
|
||||||
// Load and Relocate Image Data
|
|
||||||
//
|
|
||||||
MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);
|
|
||||||
if (MemoryImagePointer == NULL) {
|
|
||||||
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);
|
|
||||||
ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~((INT64)ImageContext.SectionAlignment - 1));
|
|
||||||
|
|
||||||
Status = PeCoffLoaderLoadImage (&ImageContext);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);
|
|
||||||
free ((VOID *) MemoryImagePointer);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageContext.DestinationAddress = NewPe32BaseAddress;
|
|
||||||
Status = PeCoffLoaderRelocateImage (&ImageContext);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of %s", FileName);
|
|
||||||
free ((VOID *) MemoryImagePointer);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Copy Relocated data to raw image file.
|
|
||||||
//
|
|
||||||
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (
|
|
||||||
(UINTN) ImgHdr +
|
|
||||||
sizeof (UINT32) +
|
|
||||||
sizeof (EFI_IMAGE_FILE_HEADER) +
|
|
||||||
ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader
|
|
||||||
);
|
|
||||||
|
|
||||||
for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {
|
|
||||||
CopyMem (
|
|
||||||
FileBuffer + SectionHeader->PointerToRawData,
|
|
||||||
(VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress),
|
|
||||||
SectionHeader->SizeOfRawData
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
free ((VOID *) MemoryImagePointer);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Update Image Base Address
|
|
||||||
//
|
|
||||||
if (ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
|
||||||
ImgHdr->Pe32.OptionalHeader.ImageBase = (UINT32) NewPe32BaseAddress;
|
|
||||||
} else if (ImgHdr->Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
|
|
||||||
ImgHdr->Pe32Plus.OptionalHeader.ImageBase = NewPe32BaseAddress;
|
|
||||||
} else {
|
|
||||||
Error (NULL, 0, 3000, "Invalid", "unknown PE magic signature %X in PE32 image %s",
|
|
||||||
ImgHdr->Pe32.OptionalHeader.Magic,
|
|
||||||
FileName
|
|
||||||
);
|
|
||||||
return EFI_ABORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set new base address into section header
|
|
||||||
//
|
|
||||||
Status = SetAddressToSectionHeader (FileName, FileBuffer, NewPe32BaseAddress);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
@ -1795,7 +1610,7 @@ Returns:
|
|||||||
if (EnableHash) {
|
if (EnableHash) {
|
||||||
ToolInputFileName = "edk2Temp_InputEfi.tmp";
|
ToolInputFileName = "edk2Temp_InputEfi.tmp";
|
||||||
ToolOutputFileName = "edk2Temp_OutputHash.tmp";
|
ToolOutputFileName = "edk2Temp_OutputHash.tmp";
|
||||||
RebaseImage(ToolInputFileName, (UINT8*)Ptr + SectionHeaderLen, 0);
|
RebaseImage(ToolInputFileName, (UINT8*)Ptr + SectionHeaderLen, SectionLength - SectionHeaderLen, 0);
|
||||||
PutFileImage (
|
PutFileImage (
|
||||||
ToolInputFileName,
|
ToolInputFileName,
|
||||||
(CHAR8*)Ptr + SectionHeaderLen,
|
(CHAR8*)Ptr + SectionHeaderLen,
|
||||||
@ -1830,7 +1645,7 @@ Returns:
|
|||||||
CHAR8 *NewStr;
|
CHAR8 *NewStr;
|
||||||
UINT32 nFileLen;
|
UINT32 nFileLen;
|
||||||
if((fp = fopen(ToolOutputFileName,"r")) == NULL) {
|
if((fp = fopen(ToolOutputFileName,"r")) == NULL) {
|
||||||
Error (NULL, 0, 0004, "Hash the PE32 image failed.", NULL);
|
Error (NULL, 0, 0004, "Hash the UEFI image failed.", NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fseek(fp,0,SEEK_SET);
|
fseek(fp,0,SEEK_SET);
|
||||||
@ -2517,7 +2332,7 @@ Returns:
|
|||||||
The offset from the start of the input file to start \n\
|
The offset from the start of the input file to start \n\
|
||||||
processing an FV\n");
|
processing an FV\n");
|
||||||
fprintf (stdout, " --hash\n\
|
fprintf (stdout, " --hash\n\
|
||||||
Generate HASH value of the entire PE image\n");
|
Generate HASH value of the entire UEFI image\n");
|
||||||
fprintf (stdout, " --sfo\n\
|
fprintf (stdout, " --sfo\n\
|
||||||
Reserved for future use\n");
|
Reserved for future use\n");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user