https://bugzilla.tianocore.org/show_bug.cgi?id=4502 Update SplitFspBin.py to support child FV in FSP binary. Without the patch, the tool won't be able to rebase the images in child FV in FSP binary.
Cc: Chasel Chiu <chasel.c...@intel.com> Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> Cc: Star Zeng <star.z...@intel.com> Cc: Ashraf Ali S <ashraf.al...@intel.com> Cc: Chinni B Duggapu <chinni.b.dugg...@intel.com> Cc: Ray Han Lim Ng <ray.han.lim...@intel.com> Cc: Susovan Mohapatra <susovan.mohapa...@intel.com> Signed-off-by: Ted Kuo <ted....@intel.com> --- IntelFsp2Pkg/Tools/SplitFspBin.py | 32 ++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/IntelFsp2Pkg/Tools/SplitFspBin.py b/IntelFsp2Pkg/Tools/SplitFspBin.py index 419e5ba985..2e7550dbb2 100644 --- a/IntelFsp2Pkg/Tools/SplitFspBin.py +++ b/IntelFsp2Pkg/Tools/SplitFspBin.py @@ -469,6 +469,7 @@ class FirmwareVolume: else: self.FvExtHdr = None self.FfsList = [] + self.ChildFvList = [] def ParseFv(self): fvsize = len(self.FvData) @@ -483,8 +484,18 @@ class FirmwareVolume: offset = fvsize else: ffs = FirmwareFile (offset, self.FvData[offset:offset + int(ffshdr.Size)]) - ffs.ParseFfs() - self.FfsList.append(ffs) + csoffset = offset + sizeof (EFI_FFS_FILE_HEADER) + cshdr = EFI_COMMON_SECTION_HEADER.from_buffer (self.FvData, csoffset) + # check if there is child fv + if (ffs.FfsHdr.Type == EFI_FV_FILETYPE.FIRMWARE_VOLUME_IMAGE and cshdr.Type == EFI_SECTION_TYPE.RAW): + childfvoffset = csoffset + sizeof (EFI_COMMON_SECTION_HEADER) + int(cshdr.Size) + 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) @@ -789,6 +800,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 () @@ -832,11 +850,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 -- 2.40.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#107019): https://edk2.groups.io/g/devel/message/107019 Mute This Topic: https://groups.io/mt/100216127/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-