From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web10.1400.1663293064652940495 for ; Thu, 15 Sep 2022 18:51:05 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=SDo5A2YX; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: yuwei.chen@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663293064; x=1694829064; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=oUNdsDfg8Nml31+NXpIQMWYGNPkvWQ6tEfvRgvWEYf4=; b=SDo5A2YXzFPA9N0bgaEx371Gr2Hk/3uegEg/y7+MgibY2Cr/AG++fX6b Kaz0/83wSJl2M1kenRt3C6Xy8/lmgNC5QgtRTAKD8iIXocWjdoqskl1El dyichw7MQ3RinMGfhuTur2qzlnxEI/G+si4+3ErpBZO3oZRAqldaOS1gw wHn+6pLeI64islAjjVd0n515Av4uKwg+US9rAejfAjjrNE8k4ADdlD45x bn+fMXB7CTQp8mYqfL5CXbp0QH6wbX96RN551ub9+0kq79QnrHPkeprfC 2/87HjweLMr65aXEDMjmEJd2WUne6Gyt7++s2hL+ukgelW0lkPQstjfih A==; X-IronPort-AV: E=McAfee;i="6500,9779,10471"; a="300249611" X-IronPort-AV: E=Sophos;i="5.93,319,1654585200"; d="scan'208";a="300249611" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Sep 2022 18:51:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,319,1654585200"; d="scan'208";a="595067823" Received: from yuweipc.ccr.corp.intel.com ([10.239.158.38]) by orsmga006.jf.intel.com with ESMTP; 15 Sep 2022 18:51:02 -0700 From: "Yuwei Chen" To: devel@edk2.groups.io Cc: Bob Feng , Liming Gao Subject: [PATCH 1/2] BaseTools/FMMT: Add Extract FV function Date: Fri, 16 Sep 2022 09:50:56 +0800 Message-Id: <20220916015056.626-1-yuwei.chen@intel.com> X-Mailer: git-send-email 2.27.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Cc: Liming Gao Signed-off-by: Yuwei Chen --- BaseTools/Source/Python/FMMT/FMMT.py | 3 +- .../Source/Python/FMMT/core/FMMTOperation.py | 45 +++++++++++-------- .../Source/Python/FMMT/core/FvHandler.py | 5 +-- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/BaseTools/Source/Python/FMMT/FMMT.py b/BaseTools/Source/Python/FMMT/FMMT.py index 10800e776a72..3590f3340ec3 100644 --- a/BaseTools/Source/Python/FMMT/FMMT.py +++ b/BaseTools/Source/Python/FMMT/FMMT.py @@ -24,7 +24,8 @@ parser.add_argument("-d", "--Delete", dest="Delete", nargs='+', If not given TargetFvName, all the existed target Ffs will be deleted'") parser.add_argument("-e", "--Extract", dest="Extract", nargs='+', help="Extract a Ffs Info: '-e inputfile TargetFvName(Optional) TargetFfsName outputfile\ - If not given TargetFvName, the first found target Ffs will be extracted'") + If not given TargetFvName, the first found target Ffs will be extracted.\ + If only given TargetFvName, not given TargetFfsName, the TargetFv will be extracted to output file'") parser.add_argument("-a", "--Add", dest="Add", nargs='+', help="Add a Ffs into a FV:'-a inputfile TargetFvName newffsfile outputfile'") parser.add_argument("-r", "--Replace", dest="Replace", nargs='+', diff --git a/BaseTools/Source/Python/FMMT/core/FMMTOperation.py b/BaseTools/Source/Python/FMMT/core/FMMTOperation.py index c2cc2e246740..4e58c91b5c41 100644 --- a/BaseTools/Source/Python/FMMT/core/FMMTOperation.py +++ b/BaseTools/Source/Python/FMMT/core/FMMTOperation.py @@ -63,9 +63,10 @@ def DeleteFfs(inputfile: str, TargetFfs_name: str, outputfile: str, Fv_name: str FmmtParser.WholeFvTree.FindNode(TargetFfs_name, FmmtParser.WholeFvTree.Findlist) # Choose the Specfic DeleteFfs with Fv info if Fv_name: - for item in FmmtParser.WholeFvTree.Findlist: - if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name: - FmmtParser.WholeFvTree.Findlist.remove(item) + FindNum = len(FmmtParser.WholeFvTree.Findlist) + for index in range(FindNum-1, -1, -1): + if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name: + FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index]) Status = False if FmmtParser.WholeFvTree.Findlist != []: for Delete_Ffs in FmmtParser.WholeFvTree.Findlist: @@ -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' FmmtParser.WholeFvTree.FindNode(Ffs_name, FmmtParser.WholeFvTree.Findlist) if Fv_name: - for item in FmmtParser.WholeFvTree.Findlist: - if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name: - FmmtParser.WholeFvTree.Findlist.remove(item) + FindNum = len(FmmtParser.WholeFvTree.Findlist) + for index in range(FindNum-1, -1, -1): + if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name: + FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index]) if FmmtParser.WholeFvTree.Findlist != []: for TargetFfs in FmmtParser.WholeFvTree.Findlist: FfsMod = FvHandler(newFmmtParser.WholeFvTree.Child[0], TargetFfs) @@ -180,18 +182,25 @@ def ExtractFfs(inputfile: str, Ffs_name: str, outputfile: str, Fv_name: str=None logger.debug('Done!') FmmtParser.WholeFvTree.FindNode(Ffs_name, FmmtParser.WholeFvTree.Findlist) if Fv_name: - for item in FmmtParser.WholeFvTree.Findlist: - if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name: - FmmtParser.WholeFvTree.Findlist.remove(item) + FindNum = len(FmmtParser.WholeFvTree.Findlist) + for index in range(FindNum-1, -1, -1): + if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name: + FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index]) if FmmtParser.WholeFvTree.Findlist != []: TargetNode = FmmtParser.WholeFvTree.Findlist[0] - TargetFv = TargetNode.Parent - if TargetFv.Data.Header.Attributes & EFI_FVB2_ERASE_POLARITY: - TargetNode.Data.Header.State = c_uint8( - ~TargetNode.Data.Header.State) - FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data - with open(outputfile, "wb") as f: - f.write(FinalData) - logger.debug('Extract ffs data is saved in {}.'.format(outputfile)) + if TargetNode.type == FV_TREE or SEC_FV_TREE or DATA_FV_TREE: + FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data + with open(outputfile, "wb") as f: + f.write(FinalData) + logger.debug('Extract fv data is saved in {}.'.format(outputfile)) + else: + TargetFv = TargetNode.Parent + if TargetFv.Data.Header.Attributes & EFI_FVB2_ERASE_POLARITY: + TargetNode.Data.Header.State = c_uint8( + ~TargetNode.Data.Header.State) + FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data + with open(outputfile, "wb") as f: + f.write(FinalData) + logger.debug('Extract ffs data is saved in {}.'.format(outputfile)) else: - logger.error('Target Ffs not found!!!') + logger.error('Target Ffs/Fv not found!!!') diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py index c81541ec18b1..e8b848009878 100644 --- a/BaseTools/Source/Python/FMMT/core/FvHandler.py +++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py @@ -155,7 +155,6 @@ class FvHandler: def CompressData(self, TargetTree) -> None: TreePath = TargetTree.GetTreePath() pos = len(TreePath) - self.Status = False while pos: if not self.Status: if TreePath[pos-1].type == SECTION_TREE and TreePath[pos-1].Data.Type == 0x02: @@ -487,7 +486,6 @@ class FvHandler: ~self.NewFfs.Data.Header.State) # If TargetFv have enough free space, just move part of the free space to NewFfs, split free space to NewFfs and new free space. if TargetLen < 0: - self.Status = True self.TargetFfs.Data.Data = b'\xff' * (-TargetLen) TargetFv.Data.Free_Space = (-TargetLen) TargetFv.Data.ModFvExt() @@ -498,13 +496,14 @@ class FvHandler: ModifyFfsType(self.NewFfs) # Recompress from the Fv node to update all the related node data. self.CompressData(TargetFv) + self.Status = True elif TargetLen == 0: - self.Status = True TargetFv.Child.remove(self.TargetFfs) TargetFv.insertChild(self.NewFfs) ModifyFfsType(self.NewFfs) # Recompress from the Fv node to update all the related node data. self.CompressData(TargetFv) + self.Status = True # If TargetFv do not have enough free space, need move part of the free space of TargetFv's parent Fv to TargetFv/NewFfs. else: if TargetFv.type == FV_TREE: -- 2.27.0.windows.1