* [PATCH 2/2] BaseTools/FMMT: Add Shrink Fv function
@ 2022-09-16 1:51 Yuwei Chen
2022-10-02 2:26 ` Bob Feng
0 siblings, 1 reply; 2+ messages in thread
From: Yuwei Chen @ 2022-09-16 1:51 UTC (permalink / raw)
To: devel; +Cc: Bob Feng, Liming Gao
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3938
This function is used to remove the useless FV free space.
Usage: FMMT -s Inputfile 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>
---
BaseTools/Source/Python/FMMT/FMMT.py | 7 +++++
.../Source/Python/FMMT/core/FMMTOperation.py | 26 +++++++++++++++++
.../Source/Python/FMMT/core/FvHandler.py | 28 ++++++++++++++++++-
3 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/BaseTools/Source/Python/FMMT/FMMT.py b/BaseTools/Source/Python/FMMT/FMMT.py
index 3590f3340ec3..bf580b3843a8 100644
--- a/BaseTools/Source/Python/FMMT/FMMT.py
+++ b/BaseTools/Source/Python/FMMT/FMMT.py
@@ -41,6 +41,8 @@ parser.add_argument("-c", "--ConfigFilePath", dest="ConfigFilePath", nargs='+',
FmmtConf file saves the target guidtool used in compress/uncompress process.\
If do not provide, FMMT tool will search the inputfile folder for FmmtConf.ini firstly, if not found,\
the FmmtConf.ini saved in FMMT tool's folder will be used as default.")
+parser.add_argument("-s", "--ShrinkFv", dest="ShrinkFv", nargs='+',
+ help="Shrink the Fv file: '-s InputFvfile OutputFvfile")
def print_banner():
print("")
@@ -111,6 +113,9 @@ class FMMT():
else:
ReplaceFfs(inputfile, self.CheckFfsName(Ffs_name), newffsfile, outputfile)
+ def Shrink(self,inputfile: str, outputfile: str) -> None:
+ self.SetDestPath(inputfile)
+ ShrinkFv(inputfile, outputfile)
def main():
args=parser.parse_args()
@@ -142,6 +147,8 @@ def main():
fmmt.Replace(args.Replace[0],args.Replace[2],args.Replace[3],args.Replace[4],args.Replace[1])
else:
fmmt.Replace(args.Replace[0],args.Replace[1],args.Replace[2],args.Replace[3])
+ elif args.ShrinkFv:
+ fmmt.Shrink(args.ShrinkFv[0], args.ShrinkFv[1])
else:
parser.print_help()
except Exception as e:
diff --git a/BaseTools/Source/Python/FMMT/core/FMMTOperation.py b/BaseTools/Source/Python/FMMT/core/FMMTOperation.py
index 4e58c91b5c41..a86f8dda9a1a 100644
--- a/BaseTools/Source/Python/FMMT/core/FMMTOperation.py
+++ b/BaseTools/Source/Python/FMMT/core/FMMTOperation.py
@@ -204,3 +204,29 @@ def ExtractFfs(inputfile: str, Ffs_name: str, outputfile: str, Fv_name: str=None
logger.debug('Extract ffs data is saved in {}.'.format(outputfile))
else:
logger.error('Target Ffs/Fv not found!!!')
+
+def ShrinkFv(inputfile: str, outputfile: str) -> None:
+ if not os.path.exists(inputfile):
+ logger.error("Invalid inputfile, can not open {}.".format(inputfile))
+ raise Exception("Process Failed: Invalid inputfile!")
+ # 1. Data Prepare
+ with open(inputfile, "rb") as f:
+ whole_data = f.read()
+ FmmtParser = FMMTParser(inputfile, ROOT_TREE)
+ # 2. DataTree Create
+ logger.debug('Parsing inputfile data......')
+ FmmtParser.ParserFromRoot(FmmtParser.WholeFvTree, whole_data)
+ logger.debug('Done!')
+ TargetFv = FmmtParser.WholeFvTree.Child[0]
+ if TargetFv:
+ FvMod = FvHandler(TargetFv)
+ Status = FvMod.ShrinkFv()
+ else:
+ logger.error('Target Fv not found!!!')
+ # 4. Data Encapsulation
+ if Status:
+ logger.debug('Start encapsulating data......')
+ FmmtParser.Encapsulation(FmmtParser.WholeFvTree, False)
+ with open(outputfile, "wb") as f:
+ f.write(FmmtParser.FinalData)
+ logger.debug('Encapsulated data is saved in {}.'.format(outputfile))
diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py
index e8b848009878..ff3d637623f8 100644
--- a/BaseTools/Source/Python/FMMT/core/FvHandler.py
+++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py
@@ -145,7 +145,7 @@ def ModifyFvSystemGuid(TargetFv) -> None:
TargetFv.Data.Data += struct2stream(item.Data.Header)+ item.Data.Data + item.Data.PadData
class FvHandler:
- def __init__(self, NewFfs, TargetFfs) -> None:
+ def __init__(self, NewFfs, TargetFfs=None) -> None:
self.NewFfs = NewFfs
self.TargetFfs = TargetFfs
self.Status = False
@@ -638,3 +638,29 @@ class FvHandler:
self.Status = True
logger.debug('Done!')
return self.Status
+
+ def ShrinkFv(self) -> bool:
+ TargetFv = self.NewFfs
+ TargetFv.Data.Data = b''
+ if not TargetFv.Data.Free_Space:
+ self.Status = True
+ else:
+ BlockSize = TargetFv.Data.Header.BlockMap[0].Length
+ New_Free_Space = TargetFv.Data.Free_Space%BlockSize
+ Removed_Space = TargetFv.Data.Free_Space - New_Free_Space
+ TargetFv.Child[-1].Data.Data = b'\xff' * New_Free_Space
+ TargetFv.Data.Size -= Removed_Space
+ TargetFv.Data.Header.Fvlength = TargetFv.Data.Size
+ ModifyFvSystemGuid(TargetFv)
+ for item in TargetFv.Child:
+ if item.type == FFS_FREE_SPACE:
+ TargetFv.Data.Data += item.Data.Data + item.Data.PadData
+ else:
+ TargetFv.Data.Data += struct2stream(item.Data.Header)+ item.Data.Data + item.Data.PadData
+ TargetFv.Data.ModFvExt()
+ TargetFv.Data.ModFvSize()
+ TargetFv.Data.ModExtHeaderData()
+ ModifyFvExtData(TargetFv)
+ TargetFv.Data.ModCheckSum()
+ self.Status = True
+ return self.Status
--
2.27.0.windows.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 2/2] BaseTools/FMMT: Add Shrink Fv function
2022-09-16 1:51 [PATCH 2/2] BaseTools/FMMT: Add Shrink Fv function Yuwei Chen
@ 2022-10-02 2:26 ` Bob Feng
0 siblings, 0 replies; 2+ messages in thread
From: Bob Feng @ 2022-10-02 2:26 UTC (permalink / raw)
To: Chen, Christine, devel@edk2.groups.io; +Cc: Gao, Liming
Reviewed-by: Bob Feng <bob.c.feng@Intel.com>
-----Original Message-----
From: Chen, Christine <yuwei.chen@intel.com>
Sent: Friday, September 16, 2022 9:51 AM
To: devel@edk2.groups.io
Cc: Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>
Subject: [PATCH 2/2] BaseTools/FMMT: Add Shrink Fv function
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3938
This function is used to remove the useless FV free space.
Usage: FMMT -s Inputfile 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>
---
BaseTools/Source/Python/FMMT/FMMT.py | 7 +++++
.../Source/Python/FMMT/core/FMMTOperation.py | 26 +++++++++++++++++
.../Source/Python/FMMT/core/FvHandler.py | 28 ++++++++++++++++++-
3 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/BaseTools/Source/Python/FMMT/FMMT.py b/BaseTools/Source/Python/FMMT/FMMT.py
index 3590f3340ec3..bf580b3843a8 100644
--- a/BaseTools/Source/Python/FMMT/FMMT.py
+++ b/BaseTools/Source/Python/FMMT/FMMT.py
@@ -41,6 +41,8 @@ parser.add_argument("-c", "--ConfigFilePath", dest="ConfigFilePath", nargs='+',
FmmtConf file saves the target guidtool used in compress/uncompress process.\
If do not provide, FMMT tool will search the inputfile folder for FmmtConf.ini firstly, if not found,\
the FmmtConf.ini saved in FMMT tool's folder will be used as default.")
+parser.add_argument("-s", "--ShrinkFv", dest="ShrinkFv", nargs='+',
+ help="Shrink the Fv file: '-s InputFvfile OutputFvfile")
def print_banner():
print("")
@@ -111,6 +113,9 @@ class FMMT():
else:
ReplaceFfs(inputfile, self.CheckFfsName(Ffs_name), newffsfile, outputfile)
+ def Shrink(self,inputfile: str, outputfile: str) -> None:
+ self.SetDestPath(inputfile)
+ ShrinkFv(inputfile, outputfile)
def main():
args=parser.parse_args()
@@ -142,6 +147,8 @@ def main():
fmmt.Replace(args.Replace[0],args.Replace[2],args.Replace[3],args.Replace[4],args.Replace[1])
else:
fmmt.Replace(args.Replace[0],args.Replace[1],args.Replace[2],args.Replace[3])
+ elif args.ShrinkFv:
+ fmmt.Shrink(args.ShrinkFv[0], args.ShrinkFv[1])
else:
parser.print_help()
except Exception as e:
diff --git a/BaseTools/Source/Python/FMMT/core/FMMTOperation.py b/BaseTools/Source/Python/FMMT/core/FMMTOperation.py
index 4e58c91b5c41..a86f8dda9a1a 100644
--- a/BaseTools/Source/Python/FMMT/core/FMMTOperation.py
+++ b/BaseTools/Source/Python/FMMT/core/FMMTOperation.py
@@ -204,3 +204,29 @@ def ExtractFfs(inputfile: str, Ffs_name: str, outputfile: str, Fv_name: str=None
logger.debug('Extract ffs data is saved in {}.'.format(outputfile))
else:
logger.error('Target Ffs/Fv not found!!!')
+
+def ShrinkFv(inputfile: str, outputfile: str) -> None:
+ if not os.path.exists(inputfile):
+ logger.error("Invalid inputfile, can not open {}.".format(inputfile))
+ raise Exception("Process Failed: Invalid inputfile!")
+ # 1. Data Prepare
+ with open(inputfile, "rb") as f:
+ whole_data = f.read()
+ FmmtParser = FMMTParser(inputfile, ROOT_TREE)
+ # 2. DataTree Create
+ logger.debug('Parsing inputfile data......')
+ FmmtParser.ParserFromRoot(FmmtParser.WholeFvTree, whole_data)
+ logger.debug('Done!')
+ TargetFv = FmmtParser.WholeFvTree.Child[0]
+ if TargetFv:
+ FvMod = FvHandler(TargetFv)
+ Status = FvMod.ShrinkFv()
+ else:
+ logger.error('Target Fv not found!!!')
+ # 4. Data Encapsulation
+ if Status:
+ logger.debug('Start encapsulating data......')
+ FmmtParser.Encapsulation(FmmtParser.WholeFvTree, False)
+ with open(outputfile, "wb") as f:
+ f.write(FmmtParser.FinalData)
+ logger.debug('Encapsulated data is saved in {}.'.format(outputfile))
diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py
index e8b848009878..ff3d637623f8 100644
--- a/BaseTools/Source/Python/FMMT/core/FvHandler.py
+++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py
@@ -145,7 +145,7 @@ def ModifyFvSystemGuid(TargetFv) -> None:
TargetFv.Data.Data += struct2stream(item.Data.Header)+ item.Data.Data + item.Data.PadData
class FvHandler:
- def __init__(self, NewFfs, TargetFfs) -> None:
+ def __init__(self, NewFfs, TargetFfs=None) -> None:
self.NewFfs = NewFfs
self.TargetFfs = TargetFfs
self.Status = False
@@ -638,3 +638,29 @@ class FvHandler:
self.Status = True
logger.debug('Done!')
return self.Status
+
+ def ShrinkFv(self) -> bool:
+ TargetFv = self.NewFfs
+ TargetFv.Data.Data = b''
+ if not TargetFv.Data.Free_Space:
+ self.Status = True
+ else:
+ BlockSize = TargetFv.Data.Header.BlockMap[0].Length
+ New_Free_Space = TargetFv.Data.Free_Space%BlockSize
+ Removed_Space = TargetFv.Data.Free_Space - New_Free_Space
+ TargetFv.Child[-1].Data.Data = b'\xff' * New_Free_Space
+ TargetFv.Data.Size -= Removed_Space
+ TargetFv.Data.Header.Fvlength = TargetFv.Data.Size
+ ModifyFvSystemGuid(TargetFv)
+ for item in TargetFv.Child:
+ if item.type == FFS_FREE_SPACE:
+ TargetFv.Data.Data += item.Data.Data + item.Data.PadData
+ else:
+ TargetFv.Data.Data += struct2stream(item.Data.Header)+ item.Data.Data + item.Data.PadData
+ TargetFv.Data.ModFvExt()
+ TargetFv.Data.ModFvSize()
+ TargetFv.Data.ModExtHeaderData()
+ ModifyFvExtData(TargetFv)
+ TargetFv.Data.ModCheckSum()
+ self.Status = True
+ return self.Status
--
2.27.0.windows.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-10-02 2:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-16 1:51 [PATCH 2/2] BaseTools/FMMT: Add Shrink Fv function Yuwei Chen
2022-10-02 2:26 ` Bob Feng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox