]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools/FMMT: Add Extract FV function
authorChen, Christine <Yuwei.Chen@intel.com>
Fri, 16 Sep 2022 01:50:56 +0000 (09:50 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 19 Oct 2022 06:32:07 +0000 (06:32 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3938

With this patch "-e" parameter supports extract FV function.
Usage: FMMT -e Inputfile TargetFv Outputfile

Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Yuwei Chen <yuwei.chen@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
BaseTools/Source/Python/FMMT/FMMT.py
BaseTools/Source/Python/FMMT/core/FMMTOperation.py
BaseTools/Source/Python/FMMT/core/FvHandler.py

index 10800e776a72dbc17c967b351cb97b14fb26265a..3590f3340ec3addc132afb83823b6792747a1c25 100644 (file)
@@ -24,7 +24,8 @@ parser.add_argument("-d", "--Delete", dest="Delete", nargs='+',
                         If not given TargetFvName, all the existed target Ffs will be deleted'")\r
 parser.add_argument("-e", "--Extract", dest="Extract", nargs='+',\r
                     help="Extract a Ffs Info: '-e inputfile TargetFvName(Optional) TargetFfsName outputfile\\r
-                        If not given TargetFvName, the first found target Ffs will be extracted'")\r
+                        If not given TargetFvName, the first found target Ffs will be extracted.\\r
+                        If only given TargetFvName, not given TargetFfsName, the TargetFv will be extracted to output file'")\r
 parser.add_argument("-a", "--Add", dest="Add", nargs='+',\r
                     help="Add a Ffs into a FV:'-a inputfile TargetFvName newffsfile outputfile'")\r
 parser.add_argument("-r", "--Replace", dest="Replace", nargs='+',\r
index c2cc2e2467407168a1d0d8a33ab48df4c3e2a6f3..4e58c91b5c4128320084a839e13857d7b3ee423e 100644 (file)
@@ -63,9 +63,10 @@ def DeleteFfs(inputfile: str, TargetFfs_name: str, outputfile: str, Fv_name: str
     FmmtParser.WholeFvTree.FindNode(TargetFfs_name, FmmtParser.WholeFvTree.Findlist)\r
     # Choose the Specfic DeleteFfs with Fv info\r
     if Fv_name:\r
-        for item in FmmtParser.WholeFvTree.Findlist:\r
-            if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name:\r
-                FmmtParser.WholeFvTree.Findlist.remove(item)\r
+        FindNum = len(FmmtParser.WholeFvTree.Findlist)\r
+        for index in range(FindNum-1, -1, -1):\r
+            if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name:\r
+                FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index])\r
     Status = False\r
     if FmmtParser.WholeFvTree.Findlist != []:\r
         for Delete_Ffs in FmmtParser.WholeFvTree.Findlist:\r
@@ -149,9 +150,10 @@ def ReplaceFfs(inputfile: str, Ffs_name: str, newffsfile: str, outputfile: str,
     new_ffs.Data.PadData = GetPadSize(new_ffs.Data.Size, FFS_COMMON_ALIGNMENT) * b'\xff'\r
     FmmtParser.WholeFvTree.FindNode(Ffs_name, FmmtParser.WholeFvTree.Findlist)\r
     if Fv_name:\r
-        for item in FmmtParser.WholeFvTree.Findlist:\r
-            if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name:\r
-                FmmtParser.WholeFvTree.Findlist.remove(item)\r
+        FindNum = len(FmmtParser.WholeFvTree.Findlist)\r
+        for index in range(FindNum-1, -1, -1):\r
+            if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name:\r
+                FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index])\r
     if FmmtParser.WholeFvTree.Findlist != []:\r
         for TargetFfs in FmmtParser.WholeFvTree.Findlist:\r
             FfsMod = FvHandler(newFmmtParser.WholeFvTree.Child[0], TargetFfs)\r
@@ -180,18 +182,25 @@ def ExtractFfs(inputfile: str, Ffs_name: str, outputfile: str, Fv_name: str=None
     logger.debug('Done!')\r
     FmmtParser.WholeFvTree.FindNode(Ffs_name, FmmtParser.WholeFvTree.Findlist)\r
     if Fv_name:\r
-        for item in FmmtParser.WholeFvTree.Findlist:\r
-            if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name:\r
-                FmmtParser.WholeFvTree.Findlist.remove(item)\r
+        FindNum = len(FmmtParser.WholeFvTree.Findlist)\r
+        for index in range(FindNum-1, -1, -1):\r
+            if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name:\r
+                FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index])\r
     if FmmtParser.WholeFvTree.Findlist != []:\r
         TargetNode = FmmtParser.WholeFvTree.Findlist[0]\r
-        TargetFv = TargetNode.Parent\r
-        if TargetFv.Data.Header.Attributes & EFI_FVB2_ERASE_POLARITY:\r
-            TargetNode.Data.Header.State = c_uint8(\r
-                ~TargetNode.Data.Header.State)\r
-        FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data\r
-        with open(outputfile, "wb") as f:\r
-            f.write(FinalData)\r
-        logger.debug('Extract ffs data is saved in {}.'.format(outputfile))\r
+        if TargetNode.type == FV_TREE or SEC_FV_TREE or DATA_FV_TREE:\r
+            FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data\r
+            with open(outputfile, "wb") as f:\r
+                f.write(FinalData)\r
+            logger.debug('Extract fv data is saved in {}.'.format(outputfile))\r
+        else:\r
+            TargetFv = TargetNode.Parent\r
+            if TargetFv.Data.Header.Attributes & EFI_FVB2_ERASE_POLARITY:\r
+                TargetNode.Data.Header.State = c_uint8(\r
+                    ~TargetNode.Data.Header.State)\r
+            FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data\r
+            with open(outputfile, "wb") as f:\r
+                f.write(FinalData)\r
+            logger.debug('Extract ffs data is saved in {}.'.format(outputfile))\r
     else:\r
-        logger.error('Target Ffs not found!!!')\r
+        logger.error('Target Ffs/Fv not found!!!')\r
index c81541ec18b184cfb8b67a6537e1a9c84bbc2c5b..e8b8480098785eec64c117a56ceebcb4014d1fe9 100644 (file)
@@ -155,7 +155,6 @@ class FvHandler:
     def CompressData(self, TargetTree) -> None:\r
         TreePath = TargetTree.GetTreePath()\r
         pos = len(TreePath)\r
-        self.Status = False\r
         while pos:\r
             if not self.Status:\r
                 if TreePath[pos-1].type == SECTION_TREE and TreePath[pos-1].Data.Type == 0x02:\r
@@ -487,7 +486,6 @@ class FvHandler:
                     ~self.NewFfs.Data.Header.State)\r
             # If TargetFv have enough free space, just move part of the free space to NewFfs, split free space to NewFfs and new free space.\r
             if TargetLen < 0:\r
-                self.Status = True\r
                 self.TargetFfs.Data.Data = b'\xff' * (-TargetLen)\r
                 TargetFv.Data.Free_Space = (-TargetLen)\r
                 TargetFv.Data.ModFvExt()\r
@@ -498,13 +496,14 @@ class FvHandler:
                 ModifyFfsType(self.NewFfs)\r
                 # Recompress from the Fv node to update all the related node data.\r
                 self.CompressData(TargetFv)\r
-            elif TargetLen == 0:\r
                 self.Status = True\r
+            elif TargetLen == 0:\r
                 TargetFv.Child.remove(self.TargetFfs)\r
                 TargetFv.insertChild(self.NewFfs)\r
                 ModifyFfsType(self.NewFfs)\r
                 # Recompress from the Fv node to update all the related node data.\r
                 self.CompressData(TargetFv)\r
+                self.Status = True\r
             # If TargetFv do not have enough free space, need move part of the free space of TargetFv's parent Fv to TargetFv/NewFfs.\r
             else:\r
                 if TargetFv.type == FV_TREE:\r