From: "GregX Yeh" <gregx.yeh@intel.com>
To: devel@edk2.groups.io
Cc: Bob Feng <bob.c.feng@intel.com>, Liming Gao <gaoliming@byosoft.com.cn>
Subject: [PATCH] [edk2-staging] BaseTools/FMMT: Replace file failure when FV level over 2
Date: Wed, 10 Mar 2021 10:05:28 +0800 [thread overview]
Message-ID: <20210310020528.1924-1-gregx.yeh@intel.com> (raw)
Fixed replace file failure when FFS in multiple level FV and FV level over 2
Signed-off-by: GregX Yeh <gregx.yeh@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
---
BaseTools/Source/C/FMMT/FmmtLib.c | 56 ++++++++++++++++++++++++++-------------
1 file changed, 37 insertions(+), 19 deletions(-)
diff --git a/BaseTools/Source/C/FMMT/FmmtLib.c b/BaseTools/Source/C/FMMT/FmmtLib.c
index b945e9b63d..26df0181c7 100644
--- a/BaseTools/Source/C/FMMT/FmmtLib.c
+++ b/BaseTools/Source/C/FMMT/FmmtLib.c
@@ -494,7 +494,7 @@ LibReadFvHeader (
if ((FvLevel -1) == 0) {
printf ("\n%s :\n", FvName);
} else {
- printf ("%sChild FV named FV%d of %s\n", BlankSpace, FvCount, FvName);
+ printf ("\n%sChild FV named FV%d of %s\n", BlankSpace, FvCount, FvName);
}
}
@@ -502,7 +502,7 @@ LibReadFvHeader (
// Print FV header information
//
if (ViewFlag) {
- printf ("\n%sAttributes: %X\n", BlankSpace, (unsigned) VolumeHeader->Attributes);
+ printf ("%sAttributes: %X\n", BlankSpace, (unsigned) VolumeHeader->Attributes);
printf ("%sTotal Volume Size: 0x%08X\n", BlankSpace, (unsigned) VolumeHeader->FvLength);
printf ("%sFree Volume Size: 0x%08X\n", BlankSpace, (unsigned) (VolumeHeader->FvLength - GetFreeOffset(InputFv)));
}
@@ -789,7 +789,8 @@ LibParseSection (
UINT8 *FvCount,
BOOLEAN ViewFlag,
BOOLEAN ErasePolarity,
- BOOLEAN *IsFfsGenerated
+ BOOLEAN *IsFfsGenerated,
+ BOOLEAN IsFfs
)
{
UINT32 ParsedLength;
@@ -997,8 +998,12 @@ LibParseSection (
break;
case EFI_SECTION_COMPRESSION:
- if (FirstInFlag) {
- Level ++;
+ if (IsFfs){
+ Level ++;
+ } else {
+ if (FirstInFlag) {
+ Level ++;
+ }
}
NumberOfSections ++;
@@ -1159,7 +1164,9 @@ LibParseSection (
FvCount,
ViewFlag,
ErasePolarity,
- IsFfsGenerated);
+ IsFfsGenerated,
+ FALSE
+ );
if (CompressionType == EFI_STANDARD_COMPRESSION) {
//
@@ -1181,8 +1188,12 @@ LibParseSection (
// looks up the appropriate tool to use for extracting
// a GUID defined FV section.
//
- if (FirstInFlag) {
+ if (IsFfs) {
Level ++;
+ } else {
+ if (FirstInFlag) {
+ Level ++;
+ }
}
NumberOfSections++;
EncapDataNeedUpdata = TRUE;
@@ -1216,7 +1227,8 @@ LibParseSection (
FvCount,
ViewFlag,
ErasePolarity,
- IsFfsGenerated
+ IsFfsGenerated,
+ FALSE
);
if (EFI_ERROR(Status)) {
Error(NULL, 0, 0003, "parse of decoded GUIDED section failed", NULL);
@@ -1471,7 +1483,8 @@ LibParseSection (
FvCount,
ViewFlag,
ErasePolarity,
- IsFfsGenerated
+ IsFfsGenerated,
+ FALSE
);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 0003, "parse of decoded GUIDED section failed", NULL);
@@ -1491,7 +1504,8 @@ LibParseSection (
FvCount,
ViewFlag,
ErasePolarity,
- IsFfsGenerated
+ IsFfsGenerated,
+ FALSE
);
if (ExtractionTool != NULL) {
free (ExtractionTool);
@@ -2016,7 +2030,7 @@ LibGetFileInfo (
LocalEncapData->Level = Level;
LocalEncapData->Type = FMMT_ENCAP_TREE_FFS;
- LocalEncapData->FvExtHeader = NULL;
+ LocalEncapData->FvExtHeader = NULL;
LocalEncapData->Depex = NULL;
LocalEncapData->DepexLen = 0;
LocalEncapData->UiNameSize = 0;
@@ -2099,7 +2113,8 @@ LibGetFileInfo (
FvCount,
ViewFlag,
ErasePolarity,
- &IsGeneratedFfs
+ &IsGeneratedFfs,
+ TRUE
);
}
if (EFI_ERROR (Status)) {
@@ -4198,10 +4213,13 @@ LibEncapNewFvFile(
UINT32 header;
UINT8 AlignN;
UINT8 AlignV[1] = {0xFF};
+ UINT32 EntryFvId;
+
AlignN = 0;
Id = 0;
InputFileSize = 0;
TmpFileSize = 0;
+ AlignmentFileSize = 0;
EncapFvIndex = 0;
Index = 0;
OuterIndex = 0;
@@ -4224,7 +4242,7 @@ LibEncapNewFvFile(
IsLargeFile = FALSE;
OutputFileSize = 0;
LargeFileSize = 0x1000000;
-
+ EntryFvId = 0;
OutputFileNameList = (FFS_INFORMATION *)malloc(sizeof(FFS_INFORMATION));
if (OutputFileNameList == NULL) {
@@ -4261,6 +4279,9 @@ LibEncapNewFvFile(
LocalEncapData = CurrentEncapData;
if (LocalEncapData == NULL) {
LocalEncapData = FvInFd->EncapData;
+ EntryFvId = 0xFFFFFFFF;
+ } else {
+ EntryFvId = LocalEncapData->FvId;
}
Level = LocalEncapData->Level;
Type = LocalEncapData->Type;
@@ -4274,7 +4295,7 @@ LibEncapNewFvFile(
LocalEncapDataNext = LocalEncapDataTemp->NextNode;
if (LocalEncapDataNext != NULL && LocalEncapDataNext->NextNode != NULL) {
- LibEncapNewFvFile(FvInFd, TemDir, LocalEncapDataTemp, 1, &ChildFileNameList);
+ LibEncapNewFvFile(FvInFd, TemDir, LocalEncapDataTemp,LocalEncapDataTemp->Level - 1, &ChildFileNameList);
ChildFileNameList->ParentLevel = LocalEncapDataTemp->Level -1;
if (FvInFd->ChildFvFFS == NULL) {
FvInFd->ChildFvFFS = ChildFileNameList;
@@ -4329,7 +4350,7 @@ LibEncapNewFvFile(
} else {
LocalEncapData = CurrentEncapData;
while (LocalEncapData != NULL) {
- if (Level_Break > 1 && LocalEncapData->Type == FMMT_ENCAP_TREE_FFS) {
+ if ((LocalEncapData->FvId > EntryFvId) && (LocalEncapData->Type == FMMT_ENCAP_TREE_FFS)) {
LocalEncapDataTemp = LocalEncapData->RightNode;
while (LocalEncapDataTemp != NULL) {
LocalEncapDataNext = LocalEncapDataTemp->NextNode;
@@ -4818,6 +4839,7 @@ LibEncapNewFvFile(
memcpy((char *)OutputFileNameList->FFSName, (char *)OutputFileName, strlen(OutputFileName)+1);
OutputFileNameList->IsFFS = TRUE;
OutputFileNameList->ParentLevel = ParentLevel - 1;
+ OutputFileNameList->InFvId = Id;
if (OutputFileNameList->Next == NULL){
break;
}
@@ -5077,10 +5099,6 @@ LibEncapNewFvFile(
if (CurrentEncapData == NULL) {
LocalEncapData = FvInFd->EncapData;
} else {
- if (OutputFileNameList != NULL && OutputFileNameList->FFSName != NULL && OutputFileNameList->IsFFS == TRUE) {
- *OutputFile = OutputFileNameList;
- return EFI_SUCCESS;
- }
LocalEncapData = CurrentEncapData;
}
ParentLevel -= 1;
--
2.16.2.windows.1
next reply other threads:[~2021-03-10 2:05 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-10 2:05 GregX Yeh [this message]
2021-03-15 4:34 ` [PATCH] [edk2-staging] BaseTools/FMMT: Replace file failure when FV level over 2 Bob Feng
2021-03-16 1:13 ` 回复: [edk2-devel] " fengyunhua
2021-03-16 1:54 ` GregX Yeh
2021-03-17 6:57 ` Bob Feng
-- strict thread matches above, loose matches on Subject: below --
2021-01-04 3:11 GregX Yeh
2020-12-08 7:32 GregX Yeh
2020-12-08 8:30 ` Bob Feng
2020-12-08 8:33 ` GregX Yeh
2020-12-18 9:33 ` Bob Feng
2020-12-23 8:00 ` GregX Yeh
2021-01-04 2:54 ` Bob Feng
2020-12-04 9:04 GregX Yeh
2020-12-01 7:43 GregX Yeh
2020-11-27 2:16 GregX Yeh
2020-11-27 1:38 GregX Yeh
2020-11-27 2:08 ` Bob Feng
2020-11-26 7:07 GregX Yeh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210310020528.1924-1-gregx.yeh@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox