**/\r
VOID\r
PeCoffLoaderAdjustOffsetForTeImage (\r
- EFI_IMAGE_SECTION_HEADER *SectionHeader,\r
- UINT32 TeStrippedOffset\r
+ EFI_IMAGE_SECTION_HEADER *SectionHeader,\r
+ UINT32 TeStrippedOffset\r
)\r
{\r
SectionHeader->VirtualAddress -= TeStrippedOffset;\r
OUT EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr\r
)\r
{\r
- RETURN_STATUS Status;\r
- EFI_IMAGE_DOS_HEADER DosHdr;\r
- UINTN Size;\r
- UINTN ReadSize;\r
- UINT32 SectionHeaderOffset;\r
- UINT32 Index;\r
- UINT32 HeaderWithoutDataDir;\r
- CHAR8 BufferData;\r
- UINTN NumberOfSections;\r
+ RETURN_STATUS Status;\r
+ EFI_IMAGE_DOS_HEADER DosHdr;\r
+ UINTN Size;\r
+ UINTN ReadSize;\r
+ UINT32 SectionHeaderOffset;\r
+ UINT32 Index;\r
+ UINT32 HeaderWithoutDataDir;\r
+ CHAR8 BufferData;\r
+ UINTN NumberOfSections;\r
EFI_IMAGE_SECTION_HEADER SectionHeader;\r
\r
//\r
// Read the DOS image header to check for its existence\r
//\r
- Size = sizeof (EFI_IMAGE_DOS_HEADER);\r
+ Size = sizeof (EFI_IMAGE_DOS_HEADER);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- 0,\r
- &Size,\r
- &DosHdr\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ 0,\r
+ &Size,\r
+ &DosHdr\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
// determines if this is a PE32 or PE32+ image. The magic is in the same\r
// location in both images.\r
//\r
- Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);\r
+ Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- ImageContext->PeCoffHeaderOffset,\r
- &Size,\r
- Hdr.Pe32\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ ImageContext->PeCoffHeaderOffset,\r
+ &Size,\r
+ Hdr.Pe32\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
// Use Signature to figure out if we understand the image format\r
//\r
if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
- ImageContext->IsTeImage = TRUE;\r
- ImageContext->Machine = Hdr.Te->Machine;\r
- ImageContext->ImageType = (UINT16)(Hdr.Te->Subsystem);\r
+ ImageContext->IsTeImage = TRUE;\r
+ ImageContext->Machine = Hdr.Te->Machine;\r
+ ImageContext->ImageType = (UINT16)(Hdr.Te->Subsystem);\r
//\r
// For TeImage, SectionAlignment is undefined to be set to Zero\r
// ImageSize can be calculated.\r
//\r
- ImageContext->ImageSize = 0;\r
- ImageContext->SectionAlignment = 0;\r
- ImageContext->SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;\r
+ ImageContext->ImageSize = 0;\r
+ ImageContext->SectionAlignment = 0;\r
+ ImageContext->SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;\r
\r
//\r
// Check the StrippedSize.\r
//\r
// Read last byte of Hdr.Te->SizeOfHeaders from the file.\r
//\r
- Size = 1;\r
+ Size = 1;\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- ImageContext->SizeOfHeaders - 1,\r
- &Size,\r
- &BufferData\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ ImageContext->SizeOfHeaders - 1,\r
+ &Size,\r
+ &BufferData\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
// TE Image Data Directory Entry size is non-zero, but the Data Directory Virtual Address is zero.\r
// This case is not a valid TE image.\r
//\r
- if ((Hdr.Te->DataDirectory[0].Size != 0 && Hdr.Te->DataDirectory[0].VirtualAddress == 0) ||\r
- (Hdr.Te->DataDirectory[1].Size != 0 && Hdr.Te->DataDirectory[1].VirtualAddress == 0)) {\r
+ if (((Hdr.Te->DataDirectory[0].Size != 0) && (Hdr.Te->DataDirectory[0].VirtualAddress == 0)) ||\r
+ ((Hdr.Te->DataDirectory[1].Size != 0) && (Hdr.Te->DataDirectory[1].VirtualAddress == 0)))\r
+ {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
+ } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
ImageContext->IsTeImage = FALSE;\r
- ImageContext->Machine = Hdr.Pe32->FileHeader.Machine;\r
+ ImageContext->Machine = Hdr.Pe32->FileHeader.Machine;\r
\r
if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
//\r
//\r
HeaderWithoutDataDir = sizeof (EFI_IMAGE_OPTIONAL_HEADER32) - sizeof (EFI_IMAGE_DATA_DIRECTORY) * EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES;\r
if (((UINT32)Hdr.Pe32->FileHeader.SizeOfOptionalHeader - HeaderWithoutDataDir) !=\r
- Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes * sizeof (EFI_IMAGE_DATA_DIRECTORY)) {\r
+ Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes * sizeof (EFI_IMAGE_DATA_DIRECTORY))\r
+ {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
if ((Hdr.Pe32->OptionalHeader.SizeOfImage - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER <= Hdr.Pe32->FileHeader.NumberOfSections) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
if (Hdr.Pe32->OptionalHeader.SizeOfHeaders >= Hdr.Pe32->OptionalHeader.SizeOfImage) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
if ((Hdr.Pe32->OptionalHeader.SizeOfHeaders - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER < (UINT32)Hdr.Pe32->FileHeader.NumberOfSections) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
//\r
// 4.2 Read last byte of Hdr.Pe32.OptionalHeader.SizeOfHeaders from the file.\r
//\r
- Size = 1;\r
+ Size = 1;\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- Hdr.Pe32->OptionalHeader.SizeOfHeaders - 1,\r
- &Size,\r
- &BufferData\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ Hdr.Pe32->OptionalHeader.SizeOfHeaders - 1,\r
+ &Size,\r
+ &BufferData\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
//\r
// Check the member data to avoid overflow.\r
//\r
- if ((UINT32) (~0) - Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress <\r
- Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size) {\r
+ if ((UINT32)(~0) - Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress <\r
+ Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size)\r
+ {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
//\r
// Read last byte of section header from file\r
//\r
- Size = 1;\r
+ Size = 1;\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress +\r
- Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size - 1,\r
- &Size,\r
- &BufferData\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress +\r
+ Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size - 1,\r
+ &Size,\r
+ &BufferData\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
}\r
//\r
// Use PE32 offset\r
//\r
- ImageContext->ImageType = Hdr.Pe32->OptionalHeader.Subsystem;\r
- ImageContext->ImageSize = (UINT64)Hdr.Pe32->OptionalHeader.SizeOfImage;\r
- ImageContext->SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
- ImageContext->SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
-\r
+ ImageContext->ImageType = Hdr.Pe32->OptionalHeader.Subsystem;\r
+ ImageContext->ImageSize = (UINT64)Hdr.Pe32->OptionalHeader.SizeOfImage;\r
+ ImageContext->SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
+ ImageContext->SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
} else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
//\r
// 1. Check FileHeader.NumberOfRvaAndSizes filed.\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
//\r
// 2. Check the FileHeader.SizeOfOptionalHeader field.\r
// OptionalHeader.NumberOfRvaAndSizes is not bigger than 16, so\r
//\r
HeaderWithoutDataDir = sizeof (EFI_IMAGE_OPTIONAL_HEADER64) - sizeof (EFI_IMAGE_DATA_DIRECTORY) * EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES;\r
if (((UINT32)Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader - HeaderWithoutDataDir) !=\r
- Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes * sizeof (EFI_IMAGE_DATA_DIRECTORY)) {\r
+ Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes * sizeof (EFI_IMAGE_DATA_DIRECTORY))\r
+ {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
if ((Hdr.Pe32Plus->OptionalHeader.SizeOfImage - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER <= Hdr.Pe32Plus->FileHeader.NumberOfSections) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
if (Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders >= Hdr.Pe32Plus->OptionalHeader.SizeOfImage) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
+\r
if ((Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders - SectionHeaderOffset) / EFI_IMAGE_SIZEOF_SECTION_HEADER < (UINT32)Hdr.Pe32Plus->FileHeader.NumberOfSections) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
//\r
// 4.2 Read last byte of Hdr.Pe32Plus.OptionalHeader.SizeOfHeaders from the file.\r
//\r
- Size = 1;\r
+ Size = 1;\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders - 1,\r
- &Size,\r
- &BufferData\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders - 1,\r
+ &Size,\r
+ &BufferData\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
//\r
// Check the member data to avoid overflow.\r
//\r
- if ((UINT32) (~0) - Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress <\r
- Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size) {\r
+ if ((UINT32)(~0) - Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress <\r
+ Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size)\r
+ {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
//\r
// Read last byte of section header from file\r
//\r
- Size = 1;\r
+ Size = 1;\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress +\r
- Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size - 1,\r
- &Size,\r
- &BufferData\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress +\r
+ Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size - 1,\r
+ &Size,\r
+ &BufferData\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
}\r
//\r
// Use PE32+ offset\r
//\r
- ImageContext->ImageType = Hdr.Pe32Plus->OptionalHeader.Subsystem;\r
- ImageContext->ImageSize = (UINT64) Hdr.Pe32Plus->OptionalHeader.SizeOfImage;\r
- ImageContext->SectionAlignment = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;\r
- ImageContext->SizeOfHeaders = Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders;\r
+ ImageContext->ImageType = Hdr.Pe32Plus->OptionalHeader.Subsystem;\r
+ ImageContext->ImageSize = (UINT64)Hdr.Pe32Plus->OptionalHeader.SizeOfImage;\r
+ ImageContext->SectionAlignment = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;\r
+ ImageContext->SizeOfHeaders = Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders;\r
} else {\r
ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;\r
return RETURN_UNSUPPORTED;\r
// Check each section field.\r
//\r
if (ImageContext->IsTeImage) {\r
- SectionHeaderOffset = sizeof(EFI_TE_IMAGE_HEADER);\r
- NumberOfSections = (UINTN) (Hdr.Te->NumberOfSections);\r
+ SectionHeaderOffset = sizeof (EFI_TE_IMAGE_HEADER);\r
+ NumberOfSections = (UINTN)(Hdr.Te->NumberOfSections);\r
} else {\r
SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + Hdr.Pe32->FileHeader.SizeOfOptionalHeader;\r
- NumberOfSections = (UINTN) (Hdr.Pe32->FileHeader.NumberOfSections);\r
+ NumberOfSections = (UINTN)(Hdr.Pe32->FileHeader.NumberOfSections);\r
}\r
\r
for (Index = 0; Index < NumberOfSections; Index++) {\r
//\r
// Read section header from file\r
//\r
- Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
+ Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- SectionHeaderOffset,\r
- &Size,\r
- &SectionHeader\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ SectionHeaderOffset,\r
+ &Size,\r
+ &SectionHeader\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
//\r
// Section data should bigger than the Pe header.\r
//\r
- if (SectionHeader.VirtualAddress < ImageContext->SizeOfHeaders ||\r
- SectionHeader.PointerToRawData < ImageContext->SizeOfHeaders) {\r
+ if ((SectionHeader.VirtualAddress < ImageContext->SizeOfHeaders) ||\r
+ (SectionHeader.PointerToRawData < ImageContext->SizeOfHeaders))\r
+ {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
//\r
// Check the member data to avoid overflow.\r
//\r
- if ((UINT32) (~0) - SectionHeader.PointerToRawData < SectionHeader.SizeOfRawData) {\r
+ if ((UINT32)(~0) - SectionHeader.PointerToRawData < SectionHeader.SizeOfRawData) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
// Base on the ImageRead function to check the section data field.\r
// Read the last byte to make sure the data is in the image region.\r
//\r
- Size = 1;\r
+ Size = 1;\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData - 1,\r
- &Size,\r
- &BufferData\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData - 1,\r
+ &Size,\r
+ &BufferData\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
}\r
return RETURN_SUCCESS;\r
}\r
\r
-\r
/**\r
Retrieves information about a PE/COFF image.\r
\r
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
)\r
{\r
- RETURN_STATUS Status;\r
- EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData;\r
- EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
- EFI_IMAGE_DATA_DIRECTORY *DebugDirectoryEntry;\r
- UINTN Size;\r
- UINTN ReadSize;\r
- UINTN Index;\r
- UINTN DebugDirectoryEntryRva;\r
- UINTN DebugDirectoryEntryFileOffset;\r
- UINTN SectionHeaderOffset;\r
- EFI_IMAGE_SECTION_HEADER SectionHeader;\r
- EFI_IMAGE_DEBUG_DIRECTORY_ENTRY DebugEntry;\r
- UINT32 NumberOfRvaAndSizes;\r
- UINT32 TeStrippedOffset;\r
+ RETURN_STATUS Status;\r
+ EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData;\r
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+ EFI_IMAGE_DATA_DIRECTORY *DebugDirectoryEntry;\r
+ UINTN Size;\r
+ UINTN ReadSize;\r
+ UINTN Index;\r
+ UINTN DebugDirectoryEntryRva;\r
+ UINTN DebugDirectoryEntryFileOffset;\r
+ UINTN SectionHeaderOffset;\r
+ EFI_IMAGE_SECTION_HEADER SectionHeader;\r
+ EFI_IMAGE_DEBUG_DIRECTORY_ENTRY DebugEntry;\r
+ UINT32 NumberOfRvaAndSizes;\r
+ UINT32 TeStrippedOffset;\r
\r
if (ImageContext == NULL) {\r
return RETURN_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Assume success\r
//\r
- ImageContext->ImageError = IMAGE_ERROR_SUCCESS;\r
+ ImageContext->ImageError = IMAGE_ERROR_SUCCESS;\r
\r
Hdr.Union = &HdrData;\r
- Status = PeCoffLoaderGetPeHeader (ImageContext, Hdr);\r
+ Status = PeCoffLoaderGetPeHeader (ImageContext, Hdr);\r
if (RETURN_ERROR (Status)) {\r
return Status;\r
}\r
ImageContext->ImageAddress = Hdr.Pe32Plus->OptionalHeader.ImageBase;\r
}\r
} else {\r
- TeStrippedOffset = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
+ TeStrippedOffset = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
ImageContext->ImageAddress = (PHYSICAL_ADDRESS)(Hdr.Te->ImageBase + TeStrippedOffset);\r
}\r
\r
}\r
\r
if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
-\r
DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;\r
\r
//\r
//\r
// Read section header from file\r
//\r
- Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
+ Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- SectionHeaderOffset,\r
- &Size,\r
- &SectionHeader\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ SectionHeaderOffset,\r
+ &Size,\r
+ &SectionHeader\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
- if (DebugDirectoryEntryRva >= SectionHeader.VirtualAddress &&\r
- DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) {\r
-\r
+ if ((DebugDirectoryEntryRva >= SectionHeader.VirtualAddress) &&\r
+ (DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize))\r
+ {\r
DebugDirectoryEntryFileOffset = DebugDirectoryEntryRva - SectionHeader.VirtualAddress + SectionHeader.PointerToRawData;\r
break;\r
}\r
//\r
// Read next debug directory entry\r
//\r
- Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+ Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- DebugDirectoryEntryFileOffset + Index,\r
- &Size,\r
- &DebugEntry\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ DebugDirectoryEntryFileOffset + Index,\r
+ &Size,\r
+ &DebugEntry\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
// ImageContext->ImageSize when DebugEntry.RVA == 0.\r
//\r
if (DebugEntry.Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
- ImageContext->DebugDirectoryEntryRva = (UINT32) (DebugDirectoryEntryRva + Index);\r
- if (DebugEntry.RVA == 0 && DebugEntry.FileOffset != 0) {\r
+ ImageContext->DebugDirectoryEntryRva = (UINT32)(DebugDirectoryEntryRva + Index);\r
+ if ((DebugEntry.RVA == 0) && (DebugEntry.FileOffset != 0)) {\r
ImageContext->ImageSize += DebugEntry.SizeOfData;\r
}\r
\r
}\r
}\r
} else {\r
+ DebugDirectoryEntry = &Hdr.Te->DataDirectory[1];\r
+ DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;\r
+ SectionHeaderOffset = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER));\r
\r
- DebugDirectoryEntry = &Hdr.Te->DataDirectory[1];\r
- DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;\r
- SectionHeaderOffset = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER));\r
-\r
- DebugDirectoryEntryFileOffset = 0;\r
+ DebugDirectoryEntryFileOffset = 0;\r
\r
for (Index = 0; Index < Hdr.Te->NumberOfSections;) {\r
//\r
// Read section header from file\r
//\r
- Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
+ Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- SectionHeaderOffset,\r
- &Size,\r
- &SectionHeader\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ SectionHeaderOffset,\r
+ &Size,\r
+ &SectionHeader\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
- if (DebugDirectoryEntryRva >= SectionHeader.VirtualAddress &&\r
- DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) {\r
+ if ((DebugDirectoryEntryRva >= SectionHeader.VirtualAddress) &&\r
+ (DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize))\r
+ {\r
DebugDirectoryEntryFileOffset = DebugDirectoryEntryRva -\r
SectionHeader.VirtualAddress +\r
SectionHeader.PointerToRawData -\r
// File offset of the debug directory was found, if this is not the last\r
// section, then skip to the last section for calculating the image size.\r
//\r
- if (Index < (UINTN) Hdr.Te->NumberOfSections - 1) {\r
+ if (Index < (UINTN)Hdr.Te->NumberOfSections - 1) {\r
SectionHeaderOffset += (Hdr.Te->NumberOfSections - 1 - Index) * sizeof (EFI_IMAGE_SECTION_HEADER);\r
- Index = Hdr.Te->NumberOfSections - 1;\r
+ Index = Hdr.Te->NumberOfSections - 1;\r
continue;\r
}\r
}\r
//\r
// Read next debug directory entry\r
//\r
- Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+ Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
ReadSize = Size;\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- DebugDirectoryEntryFileOffset + Index,\r
- &Size,\r
- &DebugEntry\r
- );\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ DebugDirectoryEntryFileOffset + Index,\r
+ &Size,\r
+ &DebugEntry\r
+ );\r
if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
if (Size != ReadSize) {\r
Status = RETURN_UNSUPPORTED;\r
}\r
+\r
return Status;\r
}\r
\r
if (DebugEntry.Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
- ImageContext->DebugDirectoryEntryRva = (UINT32) (DebugDirectoryEntryRva + Index);\r
+ ImageContext->DebugDirectoryEntryRva = (UINT32)(DebugDirectoryEntryRva + Index);\r
return RETURN_SUCCESS;\r
}\r
}\r
return RETURN_SUCCESS;\r
}\r
\r
-\r
/**\r
Converts an image address to the loaded address.\r
\r
**/\r
VOID *\r
PeCoffLoaderImageAddress (\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,\r
- IN UINTN Address,\r
- IN UINTN TeStrippedOffset\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,\r
+ IN UINTN Address,\r
+ IN UINTN TeStrippedOffset\r
)\r
{\r
//\r
return NULL;\r
}\r
\r
- return (CHAR8 *)((UINTN) ImageContext->ImageAddress + Address - TeStrippedOffset);\r
+ return (CHAR8 *)((UINTN)ImageContext->ImageAddress + Address - TeStrippedOffset);\r
}\r
\r
/**\r
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
)\r
{\r
- RETURN_STATUS Status;\r
- EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
- EFI_IMAGE_DATA_DIRECTORY *RelocDir;\r
- UINT64 Adjust;\r
- EFI_IMAGE_BASE_RELOCATION *RelocBaseOrg;\r
- EFI_IMAGE_BASE_RELOCATION *RelocBase;\r
- EFI_IMAGE_BASE_RELOCATION *RelocBaseEnd;\r
- UINT16 *Reloc;\r
- UINT16 *RelocEnd;\r
- CHAR8 *Fixup;\r
- CHAR8 *FixupBase;\r
- UINT16 *Fixup16;\r
- UINT32 *Fixup32;\r
- UINT64 *Fixup64;\r
- CHAR8 *FixupData;\r
- PHYSICAL_ADDRESS BaseAddress;\r
- UINT32 NumberOfRvaAndSizes;\r
- UINT32 TeStrippedOffset;\r
+ RETURN_STATUS Status;\r
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+ EFI_IMAGE_DATA_DIRECTORY *RelocDir;\r
+ UINT64 Adjust;\r
+ EFI_IMAGE_BASE_RELOCATION *RelocBaseOrg;\r
+ EFI_IMAGE_BASE_RELOCATION *RelocBase;\r
+ EFI_IMAGE_BASE_RELOCATION *RelocBaseEnd;\r
+ UINT16 *Reloc;\r
+ UINT16 *RelocEnd;\r
+ CHAR8 *Fixup;\r
+ CHAR8 *FixupBase;\r
+ UINT16 *Fixup16;\r
+ UINT32 *Fixup32;\r
+ UINT64 *Fixup64;\r
+ CHAR8 *FixupData;\r
+ PHYSICAL_ADDRESS BaseAddress;\r
+ UINT32 NumberOfRvaAndSizes;\r
+ UINT32 TeStrippedOffset;\r
\r
ASSERT (ImageContext != NULL);\r
\r
}\r
\r
if (!(ImageContext->IsTeImage)) {\r
- Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
TeStrippedOffset = 0;\r
\r
if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
}\r
\r
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
- RelocDir = &Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+ RelocDir = &Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
} else {\r
//\r
// Use PE32+ offset\r
//\r
- Adjust = (UINT64) BaseAddress - Hdr.Pe32Plus->OptionalHeader.ImageBase;\r
+ Adjust = (UINT64)BaseAddress - Hdr.Pe32Plus->OptionalHeader.ImageBase;\r
if (Adjust != 0) {\r
Hdr.Pe32Plus->OptionalHeader.ImageBase = (UINT64)BaseAddress;\r
}\r
\r
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
- RelocDir = &Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+ RelocDir = &Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
}\r
\r
//\r
RelocDir = NULL;\r
}\r
} else {\r
- Hdr.Te = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
- TeStrippedOffset = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
- Adjust = (UINT64) (BaseAddress - (Hdr.Te->ImageBase + TeStrippedOffset));\r
+ Hdr.Te = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
+ TeStrippedOffset = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
+ Adjust = (UINT64)(BaseAddress - (Hdr.Te->ImageBase + TeStrippedOffset));\r
if (Adjust != 0) {\r
- Hdr.Te->ImageBase = (UINT64) (BaseAddress - TeStrippedOffset);\r
+ Hdr.Te->ImageBase = (UINT64)(BaseAddress - TeStrippedOffset);\r
}\r
\r
//\r
}\r
\r
if ((RelocDir != NULL) && (RelocDir->Size > 0)) {\r
- RelocBase = (EFI_IMAGE_BASE_RELOCATION *) PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress, TeStrippedOffset);\r
- RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *) PeCoffLoaderImageAddress (ImageContext,\r
- RelocDir->VirtualAddress + RelocDir->Size - 1,\r
- TeStrippedOffset\r
- );\r
- if (RelocBase == NULL || RelocBaseEnd == NULL || (UINTN) RelocBaseEnd < (UINTN) RelocBase) {\r
+ RelocBase = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress, TeStrippedOffset);\r
+ RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (\r
+ ImageContext,\r
+ RelocDir->VirtualAddress + RelocDir->Size - 1,\r
+ TeStrippedOffset\r
+ );\r
+ if ((RelocBase == NULL) || (RelocBaseEnd == NULL) || ((UINTN)RelocBaseEnd < (UINTN)RelocBase)) {\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
return RETURN_LOAD_ERROR;\r
}\r
//\r
RelocBase = RelocBaseEnd = NULL;\r
}\r
+\r
RelocBaseOrg = RelocBase;\r
\r
//\r
// Run the relocation information and apply the fixups\r
//\r
FixupData = ImageContext->FixupData;\r
- while ((UINTN) RelocBase < (UINTN) RelocBaseEnd) {\r
-\r
- Reloc = (UINT16 *) ((CHAR8 *) RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION));\r
+ while ((UINTN)RelocBase < (UINTN)RelocBaseEnd) {\r
+ Reloc = (UINT16 *)((CHAR8 *)RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION));\r
//\r
// Add check for RelocBase->SizeOfBlock field.\r
//\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
return RETURN_LOAD_ERROR;\r
}\r
+\r
if ((UINTN)RelocBase > MAX_ADDRESS - RelocBase->SizeOfBlock) {\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
return RETURN_LOAD_ERROR;\r
}\r
\r
- RelocEnd = (UINT16 *) ((CHAR8 *) RelocBase + RelocBase->SizeOfBlock);\r
+ RelocEnd = (UINT16 *)((CHAR8 *)RelocBase + RelocBase->SizeOfBlock);\r
if ((UINTN)RelocEnd > (UINTN)RelocBaseOrg + RelocDir->Size) {\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
return RETURN_LOAD_ERROR;\r
}\r
+\r
FixupBase = PeCoffLoaderImageAddress (ImageContext, RelocBase->VirtualAddress, TeStrippedOffset);\r
if (FixupBase == NULL) {\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
//\r
// Run this relocation record\r
//\r
- while ((UINTN) Reloc < (UINTN) RelocEnd) {\r
+ while ((UINTN)Reloc < (UINTN)RelocEnd) {\r
Fixup = PeCoffLoaderImageAddress (ImageContext, RelocBase->VirtualAddress + (*Reloc & 0xFFF), TeStrippedOffset);\r
if (Fixup == NULL) {\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
return RETURN_LOAD_ERROR;\r
}\r
+\r
switch ((*Reloc) >> 12) {\r
- case EFI_IMAGE_REL_BASED_ABSOLUTE:\r
- break;\r
+ case EFI_IMAGE_REL_BASED_ABSOLUTE:\r
+ break;\r
+\r
+ case EFI_IMAGE_REL_BASED_HIGH:\r
+ Fixup16 = (UINT16 *)Fixup;\r
+ *Fixup16 = (UINT16)(*Fixup16 + ((UINT16)((UINT32)Adjust >> 16)));\r
+ if (FixupData != NULL) {\r
+ *(UINT16 *)FixupData = *Fixup16;\r
+ FixupData = FixupData + sizeof (UINT16);\r
+ }\r
\r
- case EFI_IMAGE_REL_BASED_HIGH:\r
- Fixup16 = (UINT16 *) Fixup;\r
- *Fixup16 = (UINT16) (*Fixup16 + ((UINT16) ((UINT32) Adjust >> 16)));\r
- if (FixupData != NULL) {\r
- *(UINT16 *) FixupData = *Fixup16;\r
- FixupData = FixupData + sizeof (UINT16);\r
- }\r
- break;\r
+ break;\r
\r
- case EFI_IMAGE_REL_BASED_LOW:\r
- Fixup16 = (UINT16 *) Fixup;\r
- *Fixup16 = (UINT16) (*Fixup16 + (UINT16) Adjust);\r
- if (FixupData != NULL) {\r
- *(UINT16 *) FixupData = *Fixup16;\r
- FixupData = FixupData + sizeof (UINT16);\r
- }\r
- break;\r
+ case EFI_IMAGE_REL_BASED_LOW:\r
+ Fixup16 = (UINT16 *)Fixup;\r
+ *Fixup16 = (UINT16)(*Fixup16 + (UINT16)Adjust);\r
+ if (FixupData != NULL) {\r
+ *(UINT16 *)FixupData = *Fixup16;\r
+ FixupData = FixupData + sizeof (UINT16);\r
+ }\r
\r
- case EFI_IMAGE_REL_BASED_HIGHLOW:\r
- Fixup32 = (UINT32 *) Fixup;\r
- *Fixup32 = *Fixup32 + (UINT32) Adjust;\r
- if (FixupData != NULL) {\r
- FixupData = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
- *(UINT32 *)FixupData = *Fixup32;\r
- FixupData = FixupData + sizeof (UINT32);\r
- }\r
- break;\r
+ break;\r
\r
- case EFI_IMAGE_REL_BASED_DIR64:\r
- Fixup64 = (UINT64 *) Fixup;\r
- *Fixup64 = *Fixup64 + (UINT64) Adjust;\r
- if (FixupData != NULL) {\r
- FixupData = ALIGN_POINTER (FixupData, sizeof(UINT64));\r
- *(UINT64 *)(FixupData) = *Fixup64;\r
- FixupData = FixupData + sizeof(UINT64);\r
- }\r
- break;\r
+ case EFI_IMAGE_REL_BASED_HIGHLOW:\r
+ Fixup32 = (UINT32 *)Fixup;\r
+ *Fixup32 = *Fixup32 + (UINT32)Adjust;\r
+ if (FixupData != NULL) {\r
+ FixupData = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
+ *(UINT32 *)FixupData = *Fixup32;\r
+ FixupData = FixupData + sizeof (UINT32);\r
+ }\r
\r
- default:\r
- //\r
- // The common code does not handle some of the stranger IPF relocations\r
- // PeCoffLoaderRelocateImageEx () adds support for these complex fixups\r
- // on IPF and is a No-Op on other architectures.\r
- //\r
- Status = PeCoffLoaderRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
- if (RETURN_ERROR (Status)) {\r
- ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
- return Status;\r
- }\r
+ break;\r
+\r
+ case EFI_IMAGE_REL_BASED_DIR64:\r
+ Fixup64 = (UINT64 *)Fixup;\r
+ *Fixup64 = *Fixup64 + (UINT64)Adjust;\r
+ if (FixupData != NULL) {\r
+ FixupData = ALIGN_POINTER (FixupData, sizeof (UINT64));\r
+ *(UINT64 *)(FixupData) = *Fixup64;\r
+ FixupData = FixupData + sizeof (UINT64);\r
+ }\r
+\r
+ break;\r
+\r
+ default:\r
+ //\r
+ // The common code does not handle some of the stranger IPF relocations\r
+ // PeCoffLoaderRelocateImageEx () adds support for these complex fixups\r
+ // on IPF and is a No-Op on other architectures.\r
+ //\r
+ Status = PeCoffLoaderRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
+ if (RETURN_ERROR (Status)) {\r
+ ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
+ return Status;\r
+ }\r
}\r
\r
//\r
//\r
// Next reloc block\r
//\r
- RelocBase = (EFI_IMAGE_BASE_RELOCATION *) RelocEnd;\r
+ RelocBase = (EFI_IMAGE_BASE_RELOCATION *)RelocEnd;\r
}\r
+\r
ASSERT ((UINTN)FixupData <= (UINTN)ImageContext->FixupData + ImageContext->FixupDataSize);\r
\r
//\r
// Adjust the EntryPoint to match the linked-to address\r
//\r
if (ImageContext->DestinationAddress != 0) {\r
- ImageContext->EntryPoint -= (UINT64) ImageContext->ImageAddress;\r
- ImageContext->EntryPoint += (UINT64) ImageContext->DestinationAddress;\r
+ ImageContext->EntryPoint -= (UINT64)ImageContext->ImageAddress;\r
+ ImageContext->EntryPoint += (UINT64)ImageContext->DestinationAddress;\r
}\r
}\r
\r
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
)\r
{\r
- RETURN_STATUS Status;\r
- EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
- PE_COFF_LOADER_IMAGE_CONTEXT CheckContext;\r
- EFI_IMAGE_SECTION_HEADER *FirstSection;\r
- EFI_IMAGE_SECTION_HEADER *Section;\r
- UINTN NumberOfSections;\r
- UINTN Index;\r
- CHAR8 *Base;\r
- CHAR8 *End;\r
- EFI_IMAGE_DATA_DIRECTORY *DirectoryEntry;\r
- EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
- UINTN Size;\r
- UINT32 TempDebugEntryRva;\r
- UINT32 NumberOfRvaAndSizes;\r
- EFI_IMAGE_RESOURCE_DIRECTORY *ResourceDirectory;\r
- EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceDirectoryEntry;\r
- EFI_IMAGE_RESOURCE_DIRECTORY_STRING *ResourceDirectoryString;\r
- EFI_IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;\r
- CHAR16 *String;\r
- UINT32 Offset;\r
- UINT32 TeStrippedOffset;\r
+ RETURN_STATUS Status;\r
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+ PE_COFF_LOADER_IMAGE_CONTEXT CheckContext;\r
+ EFI_IMAGE_SECTION_HEADER *FirstSection;\r
+ EFI_IMAGE_SECTION_HEADER *Section;\r
+ UINTN NumberOfSections;\r
+ UINTN Index;\r
+ CHAR8 *Base;\r
+ CHAR8 *End;\r
+ EFI_IMAGE_DATA_DIRECTORY *DirectoryEntry;\r
+ EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
+ UINTN Size;\r
+ UINT32 TempDebugEntryRva;\r
+ UINT32 NumberOfRvaAndSizes;\r
+ EFI_IMAGE_RESOURCE_DIRECTORY *ResourceDirectory;\r
+ EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceDirectoryEntry;\r
+ EFI_IMAGE_RESOURCE_DIRECTORY_STRING *ResourceDirectoryString;\r
+ EFI_IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;\r
+ CHAR16 *String;\r
+ UINT32 Offset;\r
+ UINT32 TeStrippedOffset;\r
\r
ASSERT (ImageContext != NULL);\r
\r
ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_SIZE;\r
return RETURN_BUFFER_TOO_SMALL;\r
}\r
+\r
if (ImageContext->ImageAddress == 0) {\r
//\r
// Image cannot be loaded into 0 address.\r
ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_ADDRESS;\r
return RETURN_INVALID_PARAMETER;\r
}\r
+\r
//\r
// If there's no relocations, then make sure it's not a runtime driver,\r
// and that it's being loaded at the linked address.\r
ImageContext->ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM;\r
return RETURN_LOAD_ERROR;\r
}\r
+\r
//\r
// If the image does not contain relocations, and the requested load address\r
// is not the linked address, then return an error.\r
return RETURN_INVALID_PARAMETER;\r
}\r
}\r
+\r
//\r
// Make sure the allocated space has the proper section alignment\r
//\r
return RETURN_INVALID_PARAMETER;\r
}\r
}\r
+\r
//\r
// Read the entire PE/COFF or TE header into memory\r
//\r
if (!(ImageContext->IsTeImage)) {\r
Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- 0,\r
- &ImageContext->SizeOfHeaders,\r
- (VOID *) (UINTN) ImageContext->ImageAddress\r
- );\r
+ ImageContext->Handle,\r
+ 0,\r
+ &ImageContext->SizeOfHeaders,\r
+ (VOID *)(UINTN)ImageContext->ImageAddress\r
+ );\r
\r
Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
\r
- FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
- (UINTN)ImageContext->ImageAddress +\r
- ImageContext->PeCoffHeaderOffset +\r
- sizeof(UINT32) +\r
- sizeof(EFI_IMAGE_FILE_HEADER) +\r
- Hdr.Pe32->FileHeader.SizeOfOptionalHeader\r
- );\r
- NumberOfSections = (UINTN) (Hdr.Pe32->FileHeader.NumberOfSections);\r
+ FirstSection = (EFI_IMAGE_SECTION_HEADER *)(\r
+ (UINTN)ImageContext->ImageAddress +\r
+ ImageContext->PeCoffHeaderOffset +\r
+ sizeof (UINT32) +\r
+ sizeof (EFI_IMAGE_FILE_HEADER) +\r
+ Hdr.Pe32->FileHeader.SizeOfOptionalHeader\r
+ );\r
+ NumberOfSections = (UINTN)(Hdr.Pe32->FileHeader.NumberOfSections);\r
TeStrippedOffset = 0;\r
} else {\r
Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- 0,\r
- &ImageContext->SizeOfHeaders,\r
- (void *)(UINTN)ImageContext->ImageAddress\r
- );\r
-\r
- Hdr.Te = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
- FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
- (UINTN)ImageContext->ImageAddress +\r
- sizeof(EFI_TE_IMAGE_HEADER)\r
- );\r
- NumberOfSections = (UINTN) (Hdr.Te->NumberOfSections);\r
- TeStrippedOffset = (UINT32) Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
+ ImageContext->Handle,\r
+ 0,\r
+ &ImageContext->SizeOfHeaders,\r
+ (void *)(UINTN)ImageContext->ImageAddress\r
+ );\r
+\r
+ Hdr.Te = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
+ FirstSection = (EFI_IMAGE_SECTION_HEADER *)(\r
+ (UINTN)ImageContext->ImageAddress +\r
+ sizeof (EFI_TE_IMAGE_HEADER)\r
+ );\r
+ NumberOfSections = (UINTN)(Hdr.Te->NumberOfSections);\r
+ TeStrippedOffset = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
}\r
\r
if (RETURN_ERROR (Status)) {\r
//\r
// Read the section\r
//\r
- Size = (UINTN) Section->Misc.VirtualSize;\r
+ Size = (UINTN)Section->Misc.VirtualSize;\r
if ((Size == 0) || (Size > Section->SizeOfRawData)) {\r
- Size = (UINTN) Section->SizeOfRawData;\r
+ Size = (UINTN)Section->SizeOfRawData;\r
}\r
\r
//\r
\r
if (Section->SizeOfRawData > 0) {\r
Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- Section->PointerToRawData - TeStrippedOffset,\r
- &Size,\r
- Base\r
- );\r
+ ImageContext->Handle,\r
+ Section->PointerToRawData - TeStrippedOffset,\r
+ &Size,\r
+ Base\r
+ );\r
if (RETURN_ERROR (Status)) {\r
ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
return Status;\r
// Use PE32 offset\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
- DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+ DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
} else {\r
//\r
// Use PE32+ offset\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
- DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+ DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
}\r
\r
//\r
DirectoryEntry = &Hdr.Te->DataDirectory[0];\r
ImageContext->FixupDataSize = DirectoryEntry->Size / sizeof (UINT16) * sizeof (UINT64);\r
}\r
+\r
//\r
// Consumer must allocate a buffer for the relocation fixup log.\r
// Only used for runtime drivers.\r
//\r
if (ImageContext->DebugDirectoryEntryRva != 0) {\r
DebugEntry = PeCoffLoaderImageAddress (\r
- ImageContext,\r
- ImageContext->DebugDirectoryEntryRva,\r
- TeStrippedOffset\r
- );\r
+ ImageContext,\r
+ ImageContext->DebugDirectoryEntryRva,\r
+ TeStrippedOffset\r
+ );\r
if (DebugEntry == NULL) {\r
ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
return RETURN_LOAD_ERROR;\r
}\r
\r
TempDebugEntryRva = DebugEntry->RVA;\r
- if (DebugEntry->RVA == 0 && DebugEntry->FileOffset != 0) {\r
+ if ((DebugEntry->RVA == 0) && (DebugEntry->FileOffset != 0)) {\r
Section--;\r
if ((UINTN)Section->SizeOfRawData < Section->Misc.VirtualSize) {\r
TempDebugEntryRva = Section->VirtualAddress + Section->Misc.VirtualSize;\r
}\r
\r
if (DebugEntry->RVA == 0) {\r
- Size = DebugEntry->SizeOfData;\r
+ Size = DebugEntry->SizeOfData;\r
Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- DebugEntry->FileOffset - TeStrippedOffset,\r
- &Size,\r
- ImageContext->CodeView\r
- );\r
+ ImageContext->Handle,\r
+ DebugEntry->FileOffset - TeStrippedOffset,\r
+ &Size,\r
+ ImageContext->CodeView\r
+ );\r
//\r
// Should we apply fix up to this field according to the size difference between PE and TE?\r
// Because now we maintain TE header fields unfixed, this field will also remain as they are\r
DebugEntry->RVA = TempDebugEntryRva;\r
}\r
\r
- switch (*(UINT32 *) ImageContext->CodeView) {\r
- case CODEVIEW_SIGNATURE_NB10:\r
- if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY)) {\r
- ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
- return RETURN_UNSUPPORTED;\r
- }\r
- ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
- break;\r
+ switch (*(UINT32 *)ImageContext->CodeView) {\r
+ case CODEVIEW_SIGNATURE_NB10:\r
+ if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY)) {\r
+ ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+ return RETURN_UNSUPPORTED;\r
+ }\r
\r
- case CODEVIEW_SIGNATURE_RSDS:\r
- if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY)) {\r
- ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
- return RETURN_UNSUPPORTED;\r
- }\r
- ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
- break;\r
+ ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
+ break;\r
\r
- case CODEVIEW_SIGNATURE_MTOC:\r
- if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY)) {\r
- ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
- return RETURN_UNSUPPORTED;\r
- }\r
- ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY);\r
- break;\r
+ case CODEVIEW_SIGNATURE_RSDS:\r
+ if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY)) {\r
+ ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+ return RETURN_UNSUPPORTED;\r
+ }\r
+\r
+ ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
+ break;\r
+\r
+ case CODEVIEW_SIGNATURE_MTOC:\r
+ if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY)) {\r
+ ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+ return RETURN_UNSUPPORTED;\r
+ }\r
\r
- default:\r
- break;\r
+ ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY);\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
}\r
}\r
// Use PE32 offset\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
- DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];\r
+ DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];\r
} else {\r
//\r
// Use PE32+ offset\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
- DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];\r
+ DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];\r
}\r
\r
- if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE && DirectoryEntry->Size != 0) {\r
+ if ((NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE) && (DirectoryEntry->Size != 0)) {\r
Base = PeCoffLoaderImageAddress (ImageContext, DirectoryEntry->VirtualAddress, 0);\r
if (Base != NULL) {\r
- ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) Base;\r
- Offset = sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) *\r
- (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
+ ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *)Base;\r
+ Offset = sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) *\r
+ (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
if (Offset > DirectoryEntry->Size) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);\r
+\r
+ ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *)(ResourceDirectory + 1);\r
\r
for (Index = 0; Index < ResourceDirectory->NumberOfNamedEntries; Index++) {\r
if (ResourceDirectoryEntry->u1.s.NameIsString) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (Base + ResourceDirectoryEntry->u1.s.NameOffset);\r
- String = &ResourceDirectoryString->String[0];\r
\r
- if (ResourceDirectoryString->Length == 3 &&\r
- String[0] == L'H' &&\r
- String[1] == L'I' &&\r
- String[2] == L'I') {\r
+ ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *)(Base + ResourceDirectoryEntry->u1.s.NameOffset);\r
+ String = &ResourceDirectoryString->String[0];\r
+\r
+ if ((ResourceDirectoryString->Length == 3) &&\r
+ (String[0] == L'H') &&\r
+ (String[1] == L'I') &&\r
+ (String[2] == L'I'))\r
+ {\r
//\r
// Resource Type "HII" found\r
//\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);\r
- Offset = ResourceDirectoryEntry->u2.s.OffsetToDirectory + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) +\r
- sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
+\r
+ ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *)(Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);\r
+ Offset = ResourceDirectoryEntry->u2.s.OffsetToDirectory + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) +\r
+ sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
if (Offset > DirectoryEntry->Size) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);\r
+\r
+ ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *)(ResourceDirectory + 1);\r
\r
if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {\r
//\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);\r
- Offset = ResourceDirectoryEntry->u2.s.OffsetToDirectory + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) +\r
- sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
+\r
+ ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *)(Base + ResourceDirectoryEntry->u2.s.OffsetToDirectory);\r
+ Offset = ResourceDirectoryEntry->u2.s.OffsetToDirectory + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) +\r
+ sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);\r
if (Offset > DirectoryEntry->Size) {\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);\r
+\r
+ ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *)(ResourceDirectory + 1);\r
}\r
}\r
\r
ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
return RETURN_UNSUPPORTED;\r
}\r
- ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (Base + ResourceDirectoryEntry->u2.OffsetToData);\r
- ImageContext->HiiResourceData = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData, 0);\r
+\r
+ ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *)(Base + ResourceDirectoryEntry->u2.OffsetToData);\r
+ ImageContext->HiiResourceData = (PHYSICAL_ADDRESS)(UINTN)PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData, 0);\r
break;\r
}\r
}\r
}\r
+\r
ResourceDirectoryEntry++;\r
}\r
}\r
return Status;\r
}\r
\r
-\r
/**\r
Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI\r
runtime.\r
VOID\r
EFIAPI\r
PeCoffLoaderRelocateImageForRuntime (\r
- IN PHYSICAL_ADDRESS ImageBase,\r
- IN PHYSICAL_ADDRESS VirtImageBase,\r
- IN UINTN ImageSize,\r
- IN VOID *RelocationData\r
+ IN PHYSICAL_ADDRESS ImageBase,\r
+ IN PHYSICAL_ADDRESS VirtImageBase,\r
+ IN UINTN ImageSize,\r
+ IN VOID *RelocationData\r
)\r
{\r
- CHAR8 *OldBase;\r
- CHAR8 *NewBase;\r
- EFI_IMAGE_DOS_HEADER *DosHdr;\r
- EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
- UINT32 NumberOfRvaAndSizes;\r
- EFI_IMAGE_DATA_DIRECTORY *DataDirectory;\r
- EFI_IMAGE_DATA_DIRECTORY *RelocDir;\r
- EFI_IMAGE_BASE_RELOCATION *RelocBase;\r
- EFI_IMAGE_BASE_RELOCATION *RelocBaseEnd;\r
- EFI_IMAGE_BASE_RELOCATION *RelocBaseOrig;\r
- UINT16 *Reloc;\r
- UINT16 *RelocEnd;\r
- CHAR8 *Fixup;\r
- CHAR8 *FixupBase;\r
- UINT16 *Fixup16;\r
- UINT32 *Fixup32;\r
- UINT64 *Fixup64;\r
- CHAR8 *FixupData;\r
- UINTN Adjust;\r
- RETURN_STATUS Status;\r
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
-\r
- if (RelocationData == NULL || ImageBase == 0x0 || VirtImageBase == 0x0) {\r
+ CHAR8 *OldBase;\r
+ CHAR8 *NewBase;\r
+ EFI_IMAGE_DOS_HEADER *DosHdr;\r
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+ UINT32 NumberOfRvaAndSizes;\r
+ EFI_IMAGE_DATA_DIRECTORY *DataDirectory;\r
+ EFI_IMAGE_DATA_DIRECTORY *RelocDir;\r
+ EFI_IMAGE_BASE_RELOCATION *RelocBase;\r
+ EFI_IMAGE_BASE_RELOCATION *RelocBaseEnd;\r
+ EFI_IMAGE_BASE_RELOCATION *RelocBaseOrig;\r
+ UINT16 *Reloc;\r
+ UINT16 *RelocEnd;\r
+ CHAR8 *Fixup;\r
+ CHAR8 *FixupBase;\r
+ UINT16 *Fixup16;\r
+ UINT32 *Fixup32;\r
+ UINT64 *Fixup64;\r
+ CHAR8 *FixupData;\r
+ UINTN Adjust;\r
+ RETURN_STATUS Status;\r
+ PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
+\r
+ if ((RelocationData == NULL) || (ImageBase == 0x0) || (VirtImageBase == 0x0)) {\r
return;\r
}\r
\r
OldBase = (CHAR8 *)((UINTN)ImageBase);\r
NewBase = (CHAR8 *)((UINTN)VirtImageBase);\r
- Adjust = (UINTN) NewBase - (UINTN) OldBase;\r
+ Adjust = (UINTN)NewBase - (UINTN)OldBase;\r
\r
ImageContext.ImageAddress = ImageBase;\r
- ImageContext.ImageSize = ImageSize;\r
+ ImageContext.ImageSize = ImageSize;\r
\r
//\r
// Find the image's relocate dir info\r
//\r
// Not a valid PE image so Exit\r
//\r
- return ;\r
+ return;\r
}\r
\r
if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
// Use PE32 offset\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
- DataDirectory = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[0]);\r
+ DataDirectory = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[0]);\r
} else {\r
//\r
// Use PE32+ offset\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
- DataDirectory = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[0]);\r
+ DataDirectory = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[0]);\r
}\r
\r
//\r
// is present in the image. You have to check the NumberOfRvaAndSizes in\r
// the optional header to verify a desired directory entry is there.\r
//\r
- RelocBase = NULL;\r
+ RelocBase = NULL;\r
RelocBaseEnd = NULL;\r
if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
- RelocDir = DataDirectory + EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC;\r
+ RelocDir = DataDirectory + EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC;\r
if ((RelocDir != NULL) && (RelocDir->Size > 0)) {\r
- RelocBase = (EFI_IMAGE_BASE_RELOCATION *) PeCoffLoaderImageAddress (&ImageContext, RelocDir->VirtualAddress, 0);\r
- RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *) PeCoffLoaderImageAddress (&ImageContext,\r
- RelocDir->VirtualAddress + RelocDir->Size - 1,\r
- 0\r
- );\r
+ RelocBase = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (&ImageContext, RelocDir->VirtualAddress, 0);\r
+ RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *)PeCoffLoaderImageAddress (\r
+ &ImageContext,\r
+ RelocDir->VirtualAddress + RelocDir->Size - 1,\r
+ 0\r
+ );\r
}\r
- if (RelocBase == NULL || RelocBaseEnd == NULL || (UINTN) RelocBaseEnd < (UINTN) RelocBase) {\r
+\r
+ if ((RelocBase == NULL) || (RelocBaseEnd == NULL) || ((UINTN)RelocBaseEnd < (UINTN)RelocBase)) {\r
//\r
// relocation block is not valid, just return\r
//\r
// Cannot find relocations, cannot continue to relocate the image, ASSERT for this invalid image.\r
//\r
ASSERT (FALSE);\r
- return ;\r
+ return;\r
}\r
\r
//\r
// by code will not be fixed up, since that would set them back to\r
// defaults.\r
//\r
- FixupData = RelocationData;\r
+ FixupData = RelocationData;\r
RelocBaseOrig = RelocBase;\r
- while ((UINTN) RelocBase < (UINTN) RelocBaseEnd) {\r
+ while ((UINTN)RelocBase < (UINTN)RelocBaseEnd) {\r
//\r
// Add check for RelocBase->SizeOfBlock field.\r
//\r
return;\r
}\r
\r
- Reloc = (UINT16 *) ((UINT8 *) RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION));\r
- RelocEnd = (UINT16 *) ((UINT8 *) RelocBase + RelocBase->SizeOfBlock);\r
+ Reloc = (UINT16 *)((UINT8 *)RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION));\r
+ RelocEnd = (UINT16 *)((UINT8 *)RelocBase + RelocBase->SizeOfBlock);\r
if ((UINTN)RelocEnd > (UINTN)RelocBaseOrig + RelocDir->Size) {\r
return;\r
}\r
//\r
// Run this relocation record\r
//\r
- while ((UINTN) Reloc < (UINTN) RelocEnd) {\r
-\r
+ while ((UINTN)Reloc < (UINTN)RelocEnd) {\r
Fixup = PeCoffLoaderImageAddress (&ImageContext, RelocBase->VirtualAddress + (*Reloc & 0xFFF), 0);\r
if (Fixup == NULL) {\r
return;\r
}\r
+\r
switch ((*Reloc) >> 12) {\r
+ case EFI_IMAGE_REL_BASED_ABSOLUTE:\r
+ break;\r
\r
- case EFI_IMAGE_REL_BASED_ABSOLUTE:\r
- break;\r
+ case EFI_IMAGE_REL_BASED_HIGH:\r
+ Fixup16 = (UINT16 *)Fixup;\r
+ if (*(UINT16 *)FixupData == *Fixup16) {\r
+ *Fixup16 = (UINT16)(*Fixup16 + ((UINT16)((UINT32)Adjust >> 16)));\r
+ }\r
\r
- case EFI_IMAGE_REL_BASED_HIGH:\r
- Fixup16 = (UINT16 *) Fixup;\r
- if (*(UINT16 *) FixupData == *Fixup16) {\r
- *Fixup16 = (UINT16) (*Fixup16 + ((UINT16) ((UINT32) Adjust >> 16)));\r
- }\r
+ FixupData = FixupData + sizeof (UINT16);\r
+ break;\r
\r
- FixupData = FixupData + sizeof (UINT16);\r
- break;\r
-\r
- case EFI_IMAGE_REL_BASED_LOW:\r
- Fixup16 = (UINT16 *) Fixup;\r
- if (*(UINT16 *) FixupData == *Fixup16) {\r
- *Fixup16 = (UINT16) (*Fixup16 + ((UINT16) Adjust & 0xffff));\r
- }\r
+ case EFI_IMAGE_REL_BASED_LOW:\r
+ Fixup16 = (UINT16 *)Fixup;\r
+ if (*(UINT16 *)FixupData == *Fixup16) {\r
+ *Fixup16 = (UINT16)(*Fixup16 + ((UINT16)Adjust & 0xffff));\r
+ }\r
\r
- FixupData = FixupData + sizeof (UINT16);\r
- break;\r
+ FixupData = FixupData + sizeof (UINT16);\r
+ break;\r
\r
- case EFI_IMAGE_REL_BASED_HIGHLOW:\r
- Fixup32 = (UINT32 *) Fixup;\r
- FixupData = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
- if (*(UINT32 *) FixupData == *Fixup32) {\r
- *Fixup32 = *Fixup32 + (UINT32) Adjust;\r
- }\r
+ case EFI_IMAGE_REL_BASED_HIGHLOW:\r
+ Fixup32 = (UINT32 *)Fixup;\r
+ FixupData = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
+ if (*(UINT32 *)FixupData == *Fixup32) {\r
+ *Fixup32 = *Fixup32 + (UINT32)Adjust;\r
+ }\r
\r
- FixupData = FixupData + sizeof (UINT32);\r
- break;\r
+ FixupData = FixupData + sizeof (UINT32);\r
+ break;\r
\r
- case EFI_IMAGE_REL_BASED_DIR64:\r
- Fixup64 = (UINT64 *)Fixup;\r
- FixupData = ALIGN_POINTER (FixupData, sizeof (UINT64));\r
- if (*(UINT64 *) FixupData == *Fixup64) {\r
- *Fixup64 = *Fixup64 + (UINT64)Adjust;\r
- }\r
+ case EFI_IMAGE_REL_BASED_DIR64:\r
+ Fixup64 = (UINT64 *)Fixup;\r
+ FixupData = ALIGN_POINTER (FixupData, sizeof (UINT64));\r
+ if (*(UINT64 *)FixupData == *Fixup64) {\r
+ *Fixup64 = *Fixup64 + (UINT64)Adjust;\r
+ }\r
\r
- FixupData = FixupData + sizeof (UINT64);\r
- break;\r
+ FixupData = FixupData + sizeof (UINT64);\r
+ break;\r
\r
- default:\r
- //\r
- // Only Itanium requires ConvertPeImage_Ex\r
- //\r
- Status = PeHotRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
- if (RETURN_ERROR (Status)) {\r
- return ;\r
- }\r
+ default:\r
+ //\r
+ // Only Itanium requires ConvertPeImage_Ex\r
+ //\r
+ Status = PeHotRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
+ if (RETURN_ERROR (Status)) {\r
+ return;\r
+ }\r
}\r
+\r
//\r
// Next relocation record\r
//\r
Reloc += 1;\r
}\r
+\r
//\r
// next reloc block\r
//\r
- RelocBase = (EFI_IMAGE_BASE_RELOCATION *) RelocEnd;\r
+ RelocBase = (EFI_IMAGE_BASE_RELOCATION *)RelocEnd;\r
}\r
}\r
}\r
\r
-\r
/**\r
Reads contents of a PE/COFF image from a buffer in system memory.\r
\r
RETURN_STATUS\r
EFIAPI\r
PeCoffLoaderImageReadFromMemory (\r
- IN VOID *FileHandle,\r
- IN UINTN FileOffset,\r
- IN OUT UINTN *ReadSize,\r
- OUT VOID *Buffer\r
+ IN VOID *FileHandle,\r
+ IN UINTN FileOffset,\r
+ IN OUT UINTN *ReadSize,\r
+ OUT VOID *Buffer\r
)\r
{\r
ASSERT (ReadSize != NULL);\r