## @ FspTool.py\r
#\r
-# Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
-# This program and the accompanying materials are licensed and made available under\r
-# the terms and conditions of the BSD License that accompanies this distribution.\r
-# The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php.\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
##\r
\r
('DataDirectory', ARRAY(EFI_IMAGE_DATA_DIRECTORY, 16))\r
]\r
\r
+class EFI_IMAGE_OPTIONAL_HEADER32_PLUS(Structure):\r
+ _fields_ = [\r
+ ('Magic', c_uint16),\r
+ ('MajorLinkerVersion', c_uint8),\r
+ ('MinorLinkerVersion', c_uint8),\r
+ ('SizeOfCode', c_uint32),\r
+ ('SizeOfInitializedData', c_uint32),\r
+ ('SizeOfUninitializedData', c_uint32),\r
+ ('AddressOfEntryPoint', c_uint32),\r
+ ('BaseOfCode', c_uint32),\r
+ ('ImageBase', c_uint64),\r
+ ('SectionAlignment', c_uint32),\r
+ ('FileAlignment', c_uint32),\r
+ ('MajorOperatingSystemVersion', c_uint16),\r
+ ('MinorOperatingSystemVersion', c_uint16),\r
+ ('MajorImageVersion', c_uint16),\r
+ ('MinorImageVersion', c_uint16),\r
+ ('MajorSubsystemVersion', c_uint16),\r
+ ('MinorSubsystemVersion', c_uint16),\r
+ ('Win32VersionValue', c_uint32),\r
+ ('SizeOfImage', c_uint32),\r
+ ('SizeOfHeaders', c_uint32),\r
+ ('CheckSum' , c_uint32),\r
+ ('Subsystem', c_uint16),\r
+ ('DllCharacteristics', c_uint16),\r
+ ('SizeOfStackReserve', c_uint64),\r
+ ('SizeOfStackCommit' , c_uint64),\r
+ ('SizeOfHeapReserve', c_uint64),\r
+ ('SizeOfHeapCommit' , c_uint64),\r
+ ('LoaderFlags' , c_uint32),\r
+ ('NumberOfRvaAndSizes', c_uint32),\r
+ ('DataDirectory', ARRAY(EFI_IMAGE_DATA_DIRECTORY, 16))\r
+ ]\r
+\r
+class EFI_IMAGE_OPTIONAL_HEADER(Union):\r
+ _fields_ = [\r
+ ('PeOptHdr', EFI_IMAGE_OPTIONAL_HEADER32),\r
+ ('PePlusOptHdr', EFI_IMAGE_OPTIONAL_HEADER32_PLUS)\r
+ ]\r
+\r
class EFI_IMAGE_NT_HEADERS32(Structure):\r
_fields_ = [\r
('Signature', c_uint32),\r
('FileHeader', EFI_IMAGE_FILE_HEADER),\r
- ('OptionalHeader', EFI_IMAGE_OPTIONAL_HEADER32)\r
+ ('OptionalHeader', EFI_IMAGE_OPTIONAL_HEADER)\r
]\r
\r
\r
tehdr = EFI_TE_IMAGE_HEADER.from_buffer (data, 0)\r
if tehdr.Signature == 'VZ': # TE image\r
self.TeHdr = tehdr\r
- elif tehdr.Signature == 'MZ': # PE32 image\r
+ elif tehdr.Signature == 'MZ': # PE image\r
self.TeHdr = None\r
self.DosHdr = EFI_IMAGE_DOS_HEADER.from_buffer (data, 0)\r
self.PeHdr = EFI_IMAGE_NT_HEADERS32.from_buffer (data, self.DosHdr.e_lfanew)\r
if self.PeHdr.Signature != 0x4550:\r
raise Exception("ERROR: Invalid PE32 header !")\r
- if self.PeHdr.FileHeader.SizeOfOptionalHeader < EFI_IMAGE_OPTIONAL_HEADER32.DataDirectory.offset:\r
- raise Exception("ERROR: Unsupported PE32 image !")\r
- if self.PeHdr.OptionalHeader.NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC:\r
- raise Exception("ERROR: No relocation information available !")\r
+ if self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b: # PE32 image\r
+ if self.PeHdr.FileHeader.SizeOfOptionalHeader < EFI_IMAGE_OPTIONAL_HEADER32.DataDirectory.offset:\r
+ raise Exception("ERROR: Unsupported PE32 image !")\r
+ if self.PeHdr.OptionalHeader.PeOptHdr.NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC:\r
+ raise Exception("ERROR: No relocation information available !")\r
+ elif self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x20b: # PE32+ image\r
+ if self.PeHdr.FileHeader.SizeOfOptionalHeader < EFI_IMAGE_OPTIONAL_HEADER32_PLUS.DataDirectory.offset:\r
+ raise Exception("ERROR: Unsupported PE32+ image !")\r
+ if self.PeHdr.OptionalHeader.PePlusOptHdr.NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC:\r
+ raise Exception("ERROR: No relocation information available !")\r
+ else:\r
+ raise Exception("ERROR: Invalid PE32 optional header !")\r
self.Offset = offset\r
self.Data = data\r
self.RelocList = []\r
rsize = self.TeHdr.DataDirectoryBaseReloc.Size\r
roffset = sizeof(self.TeHdr) - self.TeHdr.StrippedSize + self.TeHdr.DataDirectoryBaseReloc.VirtualAddress\r
else:\r
- rsize = self.PeHdr.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size\r
- roffset = self.PeHdr.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress\r
+ if self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b: # PE32 image\r
+ rsize = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size\r
+ roffset = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress\r
+ if self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x20b: # PE32+ image\r
+ rsize = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size\r
+ roffset = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress\r
\r
alignment = 4\r
offset = roffset\r
for each in rdata:\r
roff = each & 0xfff\r
rtype = each >> 12\r
- if rtype == 0: # IMAGE_REL_BASED.ABSOLUTE:\r
+ if rtype == 0: # IMAGE_REL_BASED_ABSOLUTE:\r
continue\r
- if rtype != 3: # IMAGE_REL_BASED_HIGHLOW\r
+ if ((rtype != 3) and (rtype != 10)): # IMAGE_REL_BASED_HIGHLOW and IMAGE_REL_BASED_DIR64\r
raise Exception("ERROR: Unsupported relocation type %d!" % rtype)\r
# Calculate the offset of the relocation\r
aoff = blkhdr.PageRVA + roff\r
return count\r
\r
for (rtype, roff) in self.RelocList:\r
- if rtype == 0x03: # HIGHLOW\r
+ if rtype == 3: # IMAGE_REL_BASED_HIGHLOW\r
offset = roff + self.Offset\r
value = Bytes2Val(fdbin[offset:offset+sizeof(c_uint32)])\r
value += delta\r
fdbin[offset:offset+sizeof(c_uint32)] = Val2Bytes(value, sizeof(c_uint32))\r
count += 1\r
+ elif rtype == 10: # IMAGE_REL_BASED_DIR64\r
+ offset = roff + self.Offset\r
+ value = Bytes2Val(fdbin[offset:offset+sizeof(c_uint64)])\r
+ value += delta\r
+ fdbin[offset:offset+sizeof(c_uint64)] = Val2Bytes(value, sizeof(c_uint64))\r
+ count += 1\r
else:\r
raise Exception('ERROR: Unknown relocation type %d !' % rtype)\r
\r
fspname, ext = os.path.splitext(os.path.basename(nametemplate))\r
filename = os.path.join(outdir, fspname + '_' + fsp.Type + ext)\r
hfsp = open(filename, 'wb')\r
- print ("Ceate FSP component file '%s'" % filename)\r
+ print ("Create FSP component file '%s'" % filename)\r
for fvidx in fsp.FvIdxList:\r
fv = fd.FvList[fvidx]\r
hfsp.write(fv.FvData)\r