summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuo, Ted <ted.kuo@intel.com>2023-07-20 03:19:58 -0700
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-08-28 20:23:22 +0000
commit2c7fd32676272e22ed44fdfc8fa7e47f5c7a93b8 (patch)
treee6e21fb2f66e30e09639822c4c86748f928b0b28
parent92006e5804a4adff05556a97a951fd7766a1d79f (diff)
downloadedk2-2c7fd32676272e22ed44fdfc8fa7e47f5c7a93b8.tar.gz
edk2-2c7fd32676272e22ed44fdfc8fa7e47f5c7a93b8.tar.bz2
edk2-2c7fd32676272e22ed44fdfc8fa7e47f5c7a93b8.zip
IntelFsp2Pkg: Support child FV in SplitFspBin.py
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.chiu@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Ashraf Ali S <ashraf.ali.s@intel.com> Cc: Chinni B Duggapu <chinni.b.duggapu@intel.com> Cc: Ray Han Lim Ng <ray.han.lim.ng@intel.com> Cc: Susovan Mohapatra <susovan.mohapatra@intel.com> Signed-off-by: Ted Kuo <ted.kuo@intel.com> Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
-rw-r--r--IntelFsp2Pkg/Tools/SplitFspBin.py44
1 files changed, 37 insertions, 7 deletions
diff --git a/IntelFsp2Pkg/Tools/SplitFspBin.py b/IntelFsp2Pkg/Tools/SplitFspBin.py
index 419e5ba985..558eaf401a 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,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)
@@ -789,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 ()
@@ -832,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