public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Bob Feng" <bob.c.feng@intel.com>
To: "Yeh, GregX" <gregx.yeh@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>,
	Yunhua Feng <fengyunhua@byosoft.com.cn>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Subject: Re: [PATCH] [edk2-staging] BaseTools/FMMT: Replace file failure when FV level over 2
Date: Mon, 15 Mar 2021 04:34:38 +0000	[thread overview]
Message-ID: <DM6PR11MB4073BF91582E86F6A38ECEDDC96C9@DM6PR11MB4073.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210310020528.1924-1-gregx.yeh@intel.com>

Hi Greg,

Please use BaseTools\Scripts\PatchCheck.py to check this patch. There are some lines code format invalid.
The logic looks good to me.

Yunhua, could you please double check, I remember you have concerns about the previous version of this patch.

Thanks,
Bob

-----Original Message-----
From: Yeh, GregX <gregx.yeh@intel.com> 
Sent: Wednesday, March 10, 2021 10:05 AM
To: devel@edk2.groups.io
Cc: Feng, Bob C <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

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


  reply	other threads:[~2021-03-15  4:34 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-10  2:05 [PATCH] [edk2-staging] BaseTools/FMMT: Replace file failure when FV level over 2 GregX Yeh
2021-03-15  4:34 ` Bob Feng [this message]
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=DM6PR11MB4073BF91582E86F6A38ECEDDC96C9@DM6PR11MB4073.namprd11.prod.outlook.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