For replace function, when target Ffs and new ffs are with
same size, the output file can not be generated successfully.
This patch fixes this issue.
Cc: Bob Feng <bob.c.feng@...>
Cc: Liming Gao <gaoliming@...>
Signed-off-by: Yuwei Chen <yuwei.chen@...>
---
edk2basetools/FMMT/core/BiosTree.py | 4 ++--
edk2basetools/FMMT/core/FvHandler.py | 20 +++++++++++++++++---
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/edk2basetools/FMMT/core/BiosTree.py b/edk2basetools/FMMT/core/=
BiosTree.py
index ae889f68da..14fb007b14 100644
--- a/edk2basetools/FMMT/core/BiosTree.py
+++ b/edk2basetools/FMMT/core/BiosTree.py
@@ -56,7 +56,7 @@ def insertChild(self, newNode, pos: int=3DNone) -> None:
if len(self.Child) =3D=3D 0:
self.Child.append(newNode)
else:
- if not pos:
+ if not pos or pos =3D=3D len(self.Child):
LastTree =3D self.Child[-1]
self.Child.append(newNode)
LastTree.NextRel =3D newNode
@@ -195,4 +195,4 @@ def ExportTree(self,TreeInfo: dict=3DNone) -> dict:
for item in self.Child:
TreeInfo[key].setdefault('Files',[]).append( item.ExportTree())
=20
- return TreeInfo=0D
\ No newline at end of file
+ return TreeInfo
diff --git a/edk2basetools/FMMT/core/FvHandler.py b/edk2basetools/FMMT/core=
/FvHandler.py
index dc303c2c44..0ce573091e 100644
--- a/edk2basetools/FMMT/core/FvHandler.py
+++ b/edk2basetools/FMMT/core/FvHandler.py
@@ -387,7 +387,22 @@ def ReplaceFfs(self) -> bool:
if self.NewFfs.Data.Size >=3D self.TargetFfs.Data.Size:
Needed_Space =3D self.NewFfs.Data.Size + len(self.NewFfs.Data.=
PadData) - self.TargetFfs.Data.Size - len(self.TargetFfs.Data.PadData)
# If TargetFv have enough free space, just move part of the fr=
ee space to NewFfs.
- if TargetFv.Data.Free_Space >=3D Needed_Space:
+ if Needed_Space =3D=3D 0:
+ Target_index =3D TargetFv.Child.index(self.TargetFfs)
+ TargetFv.Child.remove(self.TargetFfs)
+ TargetFv.insertChild(self.NewFfs, Target_index)
+ # Modify TargetFv Header and ExtHeader info.
+ TargetFv.Data.ModFvExt()
+ TargetFv.Data.ModFvSize()
+ TargetFv.Data.ModExtHeaderData()
+ ModifyFvExtData(TargetFv)
+ TargetFv.Data.ModCheckSum()
+ # Recompress from the Fv node to update all the related no=
de data.
+ self.CompressData(TargetFv)
+ # return the Status
+ self.Status =3D True
+ elif TargetFv.Data.Free_Space >=3D Needed_Space:
+ # Modify TargetFv Child info and BiosTree.
# Modify TargetFv Child info and BiosTree.
TargetFv.Child[-1].Data.Data =3D b'\xff' * (TargetFv.Data.=
Free_Space - Needed_Space)
TargetFv.Data.Free_Space -=3D Needed_Space
@@ -450,7 +465,6 @@ def ReplaceFfs(self) -> bool:
Target_index =3D TargetFv.Child.index(self.TargetFfs)
TargetFv.Child.remove(self.TargetFfs)
TargetFv.insertChild(self.NewFfs, Target_index)
- self.Status =3D True
# If TargetFv do not have free space, create free space for Fv.
else:
New_Free_Space_Tree =3D BIOSTREE('FREE_SPACE')
@@ -461,7 +475,6 @@ def ReplaceFfs(self) -> bool:
Target_index =3D TargetFv.Child.index(self.TargetFfs)
TargetFv.Child.remove(self.TargetFfs)
TargetFv.insertChild(self.NewFfs, Target_index)
- self.Status =3D True
# Modify TargetFv Header and ExtHeader info.
TargetFv.Data.ModFvExt()
TargetFv.Data.ModFvSize()
@@ -470,6 +483,7 @@ def ReplaceFfs(self) -> bool:
TargetFv.Data.ModCheckSum()
# Recompress from the Fv node to update all the related node d=
ata.
self.CompressData(TargetFv)
+ self.Status =3D True
logger.debug('Done!')
return self.Status
=20
--=20
2.27.0.windows.1