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>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
This commit is contained in:
Chen, Christine
2022-09-16 09:51:18 +08:00
committed by mergify[bot]
parent 0e6db46b1b
commit 09e74b81ba
3 changed files with 60 additions and 1 deletions

View File

@ -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