-## @ FspTool.py\r
+## @ SplitFspBin.py\r
#\r
-# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.<BR>\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
##\r
\r
class FSP_INFORMATION_HEADER(Structure):\r
_fields_ = [\r
- ('Signature', ARRAY(c_char, 4)),\r
- ('HeaderLength', c_uint32),\r
- ('Reserved1', c_uint16),\r
- ('SpecVersion', c_uint8),\r
- ('HeaderRevision', c_uint8),\r
- ('ImageRevision', c_uint32),\r
- ('ImageId', ARRAY(c_char, 8)),\r
- ('ImageSize', c_uint32),\r
- ('ImageBase', c_uint32),\r
- ('ImageAttribute', c_uint16),\r
- ('ComponentAttribute', c_uint16),\r
- ('CfgRegionOffset', c_uint32),\r
- ('CfgRegionSize', c_uint32),\r
- ('Reserved2', c_uint32),\r
- ('TempRamInitEntryOffset', c_uint32),\r
- ('Reserved3', c_uint32),\r
- ('NotifyPhaseEntryOffset', c_uint32),\r
- ('FspMemoryInitEntryOffset', c_uint32),\r
- ('TempRamExitEntryOffset', c_uint32),\r
- ('FspSiliconInitEntryOffset', c_uint32)\r
+ ('Signature', ARRAY(c_char, 4)),\r
+ ('HeaderLength', c_uint32),\r
+ ('Reserved1', c_uint16),\r
+ ('SpecVersion', c_uint8),\r
+ ('HeaderRevision', c_uint8),\r
+ ('ImageRevision', c_uint32),\r
+ ('ImageId', ARRAY(c_char, 8)),\r
+ ('ImageSize', c_uint32),\r
+ ('ImageBase', c_uint32),\r
+ ('ImageAttribute', c_uint16),\r
+ ('ComponentAttribute', c_uint16),\r
+ ('CfgRegionOffset', c_uint32),\r
+ ('CfgRegionSize', c_uint32),\r
+ ('Reserved2', c_uint32),\r
+ ('TempRamInitEntryOffset', c_uint32),\r
+ ('Reserved3', c_uint32),\r
+ ('NotifyPhaseEntryOffset', c_uint32),\r
+ ('FspMemoryInitEntryOffset', c_uint32),\r
+ ('TempRamExitEntryOffset', c_uint32),\r
+ ('FspSiliconInitEntryOffset', c_uint32),\r
+ ('FspMultiPhaseSiInitEntryOffset', c_uint32),\r
+ ('ExtendedImageRevision', c_uint16),\r
+ ('Reserved4', c_uint16),\r
+ ('FspMultiPhaseMemInitEntryOffset', c_uint32),\r
+ ('FspSmmInitEntryOffset', c_uint32)\r
]\r
\r
class FSP_PATCH_TABLE(Structure):\r
if IsStrType (val):\r
rep = HandleNameStr (val)\r
elif IsIntegerType (val):\r
- rep = '0x%X' % val\r
+ if (key == 'ImageRevision'):\r
+ FspImageRevisionMajor = ((val >> 24) & 0xFF)\r
+ FspImageRevisionMinor = ((val >> 16) & 0xFF)\r
+ FspImageRevisionRevision = ((val >> 8) & 0xFF)\r
+ FspImageRevisionBuildNumber = (val & 0xFF)\r
+ rep = '0x%08X' % val\r
+ elif (key == 'ExtendedImageRevision'):\r
+ FspImageRevisionRevision |= (val & 0xFF00)\r
+ FspImageRevisionBuildNumber |= ((val << 8) & 0xFF00)\r
+ rep = "0x%04X ('%02X.%02X.%04X.%04X')" % (val, FspImageRevisionMajor, FspImageRevisionMinor, FspImageRevisionRevision, FspImageRevisionBuildNumber)\r
+ elif field[1] == c_uint64:\r
+ rep = '0x%016X' % val\r
+ elif field[1] == c_uint32:\r
+ rep = '0x%08X' % val\r
+ elif field[1] == c_uint16:\r
+ rep = '0x%04X' % val\r
+ elif field[1] == c_uint8:\r
+ rep = '0x%02X' % val\r
+ else:\r
+ rep = '0x%X' % val\r
elif isinstance(val, c_uint24):\r
rep = '0x%X' % val.get_value()\r
elif 'c_ubyte_Array' in str(type(val)):\r
ffssize = len(self.FfsData)\r
offset = sizeof(self.FfsHdr)\r
if self.FfsHdr.Name != '\xff' * 16:\r
- while offset < ffssize:\r
+ while offset < (ffssize - sizeof (EFI_COMMON_SECTION_HEADER)):\r
sechdr = EFI_COMMON_SECTION_HEADER.from_buffer (self.FfsData, offset)\r
sec = Section (offset, self.FfsData[offset:offset + int(sechdr.Size)])\r
self.SecList.append(sec)\r
else:\r
offset = self.FvHdr.HeaderLength\r
offset = AlignPtr(offset)\r
- while offset < fvsize:\r
+ while offset < (fvsize - sizeof (EFI_FFS_FILE_HEADER)):\r
ffshdr = EFI_FFS_FILE_HEADER.from_buffer (self.FvData, offset)\r
if (ffshdr.Name == '\xff' * 16) and (int(ffshdr.Size) == 0xFFFFFF):\r
offset = fvsize\r
self.FihOffset = fihoff\r
self.Offset = offset\r
self.FvIdxList = []\r
- self.Type = "XTMSXXXXOXXXXXXX"[(fih.ComponentAttribute >> 12) & 0x0F]\r
+ self.Type = "XTMSIXXXOXXXXXXX"[(fih.ComponentAttribute >> 12) & 0x0F]\r
self.PatchList = patch\r
self.PatchList.append(fihoff + 0x1C)\r
\r
offset = 0\r
fdsize = len(self.FdData)\r
self.FvList = []\r
- while offset < fdsize:\r
+ while offset < (fdsize - sizeof (EFI_FIRMWARE_VOLUME_HEADER)):\r
fvh = EFI_FIRMWARE_VOLUME_HEADER.from_buffer (self.FdData, offset)\r
if b'_FVH' != fvh.Signature:\r
raise Exception("ERROR: Invalid FV header !")\r
rsize = self.TeHdr.DataDirectoryBaseReloc.Size\r
roffset = sizeof(self.TeHdr) - self.TeHdr.StrippedSize + self.TeHdr.DataDirectoryBaseReloc.VirtualAddress\r
else:\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
+ # Assuming PE32 image type (self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b)\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.PePlusOptHdr.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
else:\r
offset = self.Offset + self.DosHdr.e_lfanew\r
offset += EFI_IMAGE_NT_HEADERS32.OptionalHeader.offset\r
- offset += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset\r
- size = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size\r
+ if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image\r
+ offset += EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.offset\r
+ size = EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.size\r
+ else:\r
+ offset += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset\r
+ size = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size\r
\r
value = Bytes2Val(fdbin[offset:offset+size]) + delta\r
fdbin[offset:offset+size] = Val2Bytes(value, size)\r
\r
def main ():\r
parser = argparse.ArgumentParser()\r
- subparsers = parser.add_subparsers(title='commands')\r
+ subparsers = parser.add_subparsers(title='commands', dest="which")\r
\r
parser_rebase = subparsers.add_parser('rebase', help='rebase a FSP into a new base address')\r
parser_rebase.set_defaults(which='rebase')\r
parser_rebase.add_argument('-f', '--fspbin' , dest='FspBinary', type=str, help='FSP binary file path', required = True)\r
- parser_rebase.add_argument('-c', '--fspcomp', choices=['t','m','s','o'], nargs='+', dest='FspComponent', type=str, help='FSP component to rebase', default = "['t']", required = True)\r
+ parser_rebase.add_argument('-c', '--fspcomp', choices=['t','m','s','o','i'], nargs='+', dest='FspComponent', type=str, help='FSP component to rebase', default = "['t']", required = True)\r
parser_rebase.add_argument('-b', '--newbase', dest='FspBase', nargs='+', type=str, help='Rebased FSP binary file name', default = '', required = True)\r
parser_rebase.add_argument('-o', '--outdir' , dest='OutputDir', type=str, help='Output directory path', default = '.')\r
parser_rebase.add_argument('-n', '--outfile', dest='OutputFile', type=str, help='Rebased FSP binary file name', default = '')\r
elif args.which == 'info':\r
ShowFspInfo (args.FspBinary)\r
else:\r
- pass\r
+ parser.print_help()\r
\r
return 0\r
\r