mirror of https://review.coreboot.org/fsp.git
Update SplitFspBin.py to latest from edk2
Updated to 2c7fd32 Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
This commit is contained in:
parent
a727948108
commit
4b0b1eb4e3
|
@ -1,6 +1,6 @@
|
|||
## @ FspTool.py
|
||||
## @ SplitFspBin.py
|
||||
#
|
||||
# Copyright (c) 2015 - 2020, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.<BR>
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#
|
||||
##
|
||||
|
@ -103,26 +103,31 @@ class FSP_COMMON_HEADER(Structure):
|
|||
|
||||
class FSP_INFORMATION_HEADER(Structure):
|
||||
_fields_ = [
|
||||
('Signature', ARRAY(c_char, 4)),
|
||||
('HeaderLength', c_uint32),
|
||||
('Reserved1', c_uint16),
|
||||
('SpecVersion', c_uint8),
|
||||
('HeaderRevision', c_uint8),
|
||||
('ImageRevision', c_uint32),
|
||||
('ImageId', ARRAY(c_char, 8)),
|
||||
('ImageSize', c_uint32),
|
||||
('ImageBase', c_uint32),
|
||||
('ImageAttribute', c_uint16),
|
||||
('ComponentAttribute', c_uint16),
|
||||
('CfgRegionOffset', c_uint32),
|
||||
('CfgRegionSize', c_uint32),
|
||||
('Reserved2', c_uint32),
|
||||
('TempRamInitEntryOffset', c_uint32),
|
||||
('Reserved3', c_uint32),
|
||||
('NotifyPhaseEntryOffset', c_uint32),
|
||||
('FspMemoryInitEntryOffset', c_uint32),
|
||||
('TempRamExitEntryOffset', c_uint32),
|
||||
('FspSiliconInitEntryOffset', c_uint32)
|
||||
('Signature', ARRAY(c_char, 4)),
|
||||
('HeaderLength', c_uint32),
|
||||
('Reserved1', c_uint16),
|
||||
('SpecVersion', c_uint8),
|
||||
('HeaderRevision', c_uint8),
|
||||
('ImageRevision', c_uint32),
|
||||
('ImageId', ARRAY(c_char, 8)),
|
||||
('ImageSize', c_uint32),
|
||||
('ImageBase', c_uint32),
|
||||
('ImageAttribute', c_uint16),
|
||||
('ComponentAttribute', c_uint16),
|
||||
('CfgRegionOffset', c_uint32),
|
||||
('CfgRegionSize', c_uint32),
|
||||
('Reserved2', c_uint32),
|
||||
('TempRamInitEntryOffset', c_uint32),
|
||||
('Reserved3', c_uint32),
|
||||
('NotifyPhaseEntryOffset', c_uint32),
|
||||
('FspMemoryInitEntryOffset', c_uint32),
|
||||
('TempRamExitEntryOffset', c_uint32),
|
||||
('FspSiliconInitEntryOffset', c_uint32),
|
||||
('FspMultiPhaseSiInitEntryOffset', c_uint32),
|
||||
('ExtendedImageRevision', c_uint16),
|
||||
('Reserved4', c_uint16),
|
||||
('FspMultiPhaseMemInitEntryOffset', c_uint32),
|
||||
('FspSmmInitEntryOffset', c_uint32)
|
||||
]
|
||||
|
||||
class FSP_PATCH_TABLE(Structure):
|
||||
|
@ -390,7 +395,26 @@ def OutputStruct (obj, indent = 0, plen = 0):
|
|||
if IsStrType (val):
|
||||
rep = HandleNameStr (val)
|
||||
elif IsIntegerType (val):
|
||||
rep = '0x%X' % val
|
||||
if (key == 'ImageRevision'):
|
||||
FspImageRevisionMajor = ((val >> 24) & 0xFF)
|
||||
FspImageRevisionMinor = ((val >> 16) & 0xFF)
|
||||
FspImageRevisionRevision = ((val >> 8) & 0xFF)
|
||||
FspImageRevisionBuildNumber = (val & 0xFF)
|
||||
rep = '0x%08X' % val
|
||||
elif (key == 'ExtendedImageRevision'):
|
||||
FspImageRevisionRevision |= (val & 0xFF00)
|
||||
FspImageRevisionBuildNumber |= ((val << 8) & 0xFF00)
|
||||
rep = "0x%04X ('%02X.%02X.%04X.%04X')" % (val, FspImageRevisionMajor, FspImageRevisionMinor, FspImageRevisionRevision, FspImageRevisionBuildNumber)
|
||||
elif field[1] == c_uint64:
|
||||
rep = '0x%016X' % val
|
||||
elif field[1] == c_uint32:
|
||||
rep = '0x%08X' % val
|
||||
elif field[1] == c_uint16:
|
||||
rep = '0x%04X' % val
|
||||
elif field[1] == c_uint8:
|
||||
rep = '0x%02X' % val
|
||||
else:
|
||||
rep = '0x%X' % val
|
||||
elif isinstance(val, c_uint24):
|
||||
rep = '0x%X' % val.get_value()
|
||||
elif 'c_ubyte_Array' in str(type(val)):
|
||||
|
@ -445,6 +469,7 @@ class FirmwareVolume:
|
|||
else:
|
||||
self.FvExtHdr = None
|
||||
self.FfsList = []
|
||||
self.ChildFvList = []
|
||||
|
||||
def ParseFv(self):
|
||||
fvsize = len(self.FvData)
|
||||
|
@ -459,8 +484,30 @@ class FirmwareVolume:
|
|||
offset = fvsize
|
||||
else:
|
||||
ffs = FirmwareFile (offset, self.FvData[offset:offset + int(ffshdr.Size)])
|
||||
ffs.ParseFfs()
|
||||
self.FfsList.append(ffs)
|
||||
# check if there is child fv
|
||||
childfvfound = 0
|
||||
if (ffs.FfsHdr.Type == EFI_FV_FILETYPE.FIRMWARE_VOLUME_IMAGE):
|
||||
csoffset = offset + sizeof (EFI_FFS_FILE_HEADER)
|
||||
csoffset = AlignPtr(csoffset, 4)
|
||||
# find fv section
|
||||
while csoffset < (offset + int(ffs.FfsHdr.Size)):
|
||||
cshdr = EFI_COMMON_SECTION_HEADER.from_buffer (self.FvData, csoffset)
|
||||
if (cshdr.Type == EFI_SECTION_TYPE.FIRMWARE_VOLUME_IMAGE):
|
||||
childfvfound = 1
|
||||
break
|
||||
else:
|
||||
# check next section
|
||||
csoffset += int(cshdr.Size)
|
||||
csoffset = AlignPtr(csoffset, 4)
|
||||
if (childfvfound):
|
||||
childfvoffset = csoffset + sizeof (EFI_COMMON_SECTION_HEADER)
|
||||
childfvhdr = EFI_FIRMWARE_VOLUME_HEADER.from_buffer (self.FvData, childfvoffset)
|
||||
childfv = FirmwareVolume (childfvoffset, self.FvData[childfvoffset:childfvoffset + int(childfvhdr.FvLength)])
|
||||
childfv.ParseFv ()
|
||||
self.ChildFvList.append(childfv)
|
||||
else:
|
||||
ffs.ParseFfs()
|
||||
self.FfsList.append(ffs)
|
||||
offset += int(ffshdr.Size)
|
||||
offset = AlignPtr(offset)
|
||||
|
||||
|
@ -470,7 +517,7 @@ class FspImage:
|
|||
self.FihOffset = fihoff
|
||||
self.Offset = offset
|
||||
self.FvIdxList = []
|
||||
self.Type = "XTMSXXXXOXXXXXXX"[(fih.ComponentAttribute >> 12) & 0x0F]
|
||||
self.Type = "XTMSIXXXOXXXXXXX"[(fih.ComponentAttribute >> 12) & 0x0F]
|
||||
self.PatchList = patch
|
||||
self.PatchList.append(fihoff + 0x1C)
|
||||
|
||||
|
@ -765,6 +812,13 @@ def SplitFspBin (fspfile, outdir, nametemplate):
|
|||
hfsp.write(fv.FvData)
|
||||
hfsp.close()
|
||||
|
||||
def GetImageFromFv (fd, parentfvoffset, fv, imglist):
|
||||
for ffs in fv.FfsList:
|
||||
for sec in ffs.SecList:
|
||||
if sec.SecHdr.Type in [EFI_SECTION_TYPE.TE, EFI_SECTION_TYPE.PE32]: # TE or PE32
|
||||
offset = fd.Offset + parentfvoffset + fv.Offset + ffs.Offset + sec.Offset + sizeof(sec.SecHdr)
|
||||
imglist.append ((offset, len(sec.SecData) - sizeof(sec.SecHdr)))
|
||||
|
||||
def RebaseFspBin (FspBinary, FspComponent, FspBase, OutputDir, OutputFile):
|
||||
fd = FirmwareDevice(0, FspBinary)
|
||||
fd.ParseFd ()
|
||||
|
@ -808,11 +862,11 @@ def RebaseFspBin (FspBinary, FspComponent, FspBase, OutputDir, OutputFile):
|
|||
imglist = []
|
||||
for fvidx in fsp.FvIdxList:
|
||||
fv = fd.FvList[fvidx]
|
||||
for ffs in fv.FfsList:
|
||||
for sec in ffs.SecList:
|
||||
if sec.SecHdr.Type in [EFI_SECTION_TYPE.TE, EFI_SECTION_TYPE.PE32]: # TE or PE32
|
||||
offset = fd.Offset + fv.Offset + ffs.Offset + sec.Offset + sizeof(sec.SecHdr)
|
||||
imglist.append ((offset, len(sec.SecData) - sizeof(sec.SecHdr)))
|
||||
GetImageFromFv (fd, 0, fv, imglist)
|
||||
# get image from child fv
|
||||
for childfv in fv.ChildFvList:
|
||||
print ("Get image from child fv of fv%d, parent fv offset: 0x%x" % (fvidx, fv.Offset))
|
||||
GetImageFromFv (fd, fv.Offset, childfv, imglist)
|
||||
|
||||
fcount = 0
|
||||
pcount = 0
|
||||
|
@ -847,7 +901,7 @@ def main ():
|
|||
parser_rebase = subparsers.add_parser('rebase', help='rebase a FSP into a new base address')
|
||||
parser_rebase.set_defaults(which='rebase')
|
||||
parser_rebase.add_argument('-f', '--fspbin' , dest='FspBinary', type=str, help='FSP binary file path', required = True)
|
||||
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)
|
||||
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)
|
||||
parser_rebase.add_argument('-b', '--newbase', dest='FspBase', nargs='+', type=str, help='Rebased FSP binary file name', default = '', required = True)
|
||||
parser_rebase.add_argument('-o', '--outdir' , dest='OutputDir', type=str, help='Output directory path', default = '.')
|
||||
parser_rebase.add_argument('-n', '--outfile', dest='OutputFile', type=str, help='Rebased FSP binary file name', default = '')
|
||||
|
|
Loading…
Reference in New Issue