[edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP binary with child FV included

Kuo, Ted posted 1 patch 10 months ago
Failed in applying to current master (apply log)
IntelFsp2Pkg/Tools/SplitFspBin.py | 32 ++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)
[edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP binary with child FV included
Posted by Kuo, Ted 10 months ago
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>
---
 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/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP binary with child FV included
Posted by Chiu, Chasel 10 months ago
Hi Ted,

One question below inline.
Another minor feedback is the commit/patch subject format should be "Package: title"

Thanks,
Chasel


> -----Original Message-----
> From: Kuo, Ted <ted.kuo@intel.com>
> Sent: Tuesday, July 18, 2023 7:16 AM
> To: devel@edk2.groups.io
> Cc: Chiu, Chasel <chasel.chiu@intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone@intel.com>; Zeng, Star <star.zeng@intel.com>; S, Ashraf
> Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B <chinni.b.duggapu@intel.com>;
> Ng, Ray Han Lim <ray.han.lim.ng@intel.com>; Mohapatra, Susovan
> <susovan.mohapatra@intel.com>
> Subject: [edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP binary with
> child FV included
> 
> 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>
> ---
>  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


Is child FV always with EFI_SECTION_TYPE.RAW? Or it could be other types like EFI_SECTION_TYPE.FIRMWARE_VOLUME_IMAGE?



> (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 (#107061): https://edk2.groups.io/g/devel/message/107061
Mute This Topic: https://groups.io/mt/100216127/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP binary with child FV included
Posted by Kuo, Ted 10 months ago
Thanks Chasel for the feedback. I've sent patch v2 with changes according to your comment. Can you please review it again?

Thanks,
Ted

-----Original Message-----
From: Chiu, Chasel <chasel.chiu@intel.com> 
Sent: Thursday, July 20, 2023 2:14 AM
To: Kuo, Ted <ted.kuo@intel.com>; devel@edk2.groups.io
Cc: Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>; Zeng, Star <star.zeng@intel.com>; S, Ashraf Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B <chinni.b.duggapu@intel.com>; Ng, Ray Han Lim <ray.han.lim.ng@intel.com>; Mohapatra, Susovan <susovan.mohapatra@intel.com>
Subject: RE: [edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP binary with child FV included


Hi Ted,

One question below inline.
Another minor feedback is the commit/patch subject format should be "Package: title"

Thanks,
Chasel


> -----Original Message-----
> From: Kuo, Ted <ted.kuo@intel.com>
> Sent: Tuesday, July 18, 2023 7:16 AM
> To: devel@edk2.groups.io
> Cc: Chiu, Chasel <chasel.chiu@intel.com>; Desimone, Nathaniel L 
> <nathaniel.l.desimone@intel.com>; Zeng, Star <star.zeng@intel.com>; S, 
> Ashraf Ali <ashraf.ali.s@intel.com>; Duggapu, Chinni B 
> <chinni.b.duggapu@intel.com>; Ng, Ray Han Lim 
> <ray.han.lim.ng@intel.com>; Mohapatra, Susovan 
> <susovan.mohapatra@intel.com>
> Subject: [edk2-devel][PATCH v1] SplitFspBin.py cannot support FSP 
> binary with child FV included
> 
> 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>
> ---
>  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


Is child FV always with EFI_SECTION_TYPE.RAW? Or it could be other types like EFI_SECTION_TYPE.FIRMWARE_VOLUME_IMAGE?



> (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 + 
> PE32+ 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 (#107094): https://edk2.groups.io/g/devel/message/107094
Mute This Topic: https://groups.io/mt/100216127/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-