public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Yuwei Chen" <yuwei.chen@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"Feng, Bob C" <bob.c.feng@intel.com>
Cc: Yunhua Feng <fengyunhua@byosoft.com.cn>,
	Liming Gao <gaoliming@byosoft.com.cn>
Subject: Re: [edk2-devel] [Patch] [edk2-staging]BaseTools/Bfm: Apply the FMMT algorithm of LibFindFvInFd
Date: Thu, 14 Jan 2021 02:40:37 +0000	[thread overview]
Message-ID: <DM5PR11MB15944770D252E204F032B51F96A80@DM5PR11MB1594.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20201109015725.1733-1-bob.c.feng@intel.com>

Reviewed-by: Yuwei Chen<yuwei.chen@intel.com>

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob
> Feng
> Sent: Monday, November 9, 2020 9:57 AM
> To: devel@edk2.groups.io
> Cc: Yunhua Feng <fengyunhua@byosoft.com.cn>; Liming Gao
> <gaoliming@byosoft.com.cn>
> Subject: [edk2-devel] [Patch] [edk2-staging]BaseTools/Bfm: Apply the FMMT
> algorithm of LibFindFvInFd
> 
> The LibFindFvInFd algorithm of FMMT and BFM are different.
> The LibFindFvInFd in FMMT is the correct one.
> By applying FMMT LibFindFvInFd, BFM can handle the case that there are
> two same bios images in one Firmware binary.
> 
> Signed-off-by: Bob Feng <bob.c.feng@intel.com>
> Cc: Yunhua Feng <fengyunhua@byosoft.com.cn>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> ---
>  BaseTools/Source/C/BfmLib/BfmLib.c | 63 ++++++++++++++++--------------
>  1 file changed, 34 insertions(+), 29 deletions(-)
> 
> diff --git a/BaseTools/Source/C/BfmLib/BfmLib.c
> b/BaseTools/Source/C/BfmLib/BfmLib.c
> index 73854fdc73..c247cc8e1d 100644
> --- a/BaseTools/Source/C/BfmLib/BfmLib.c
> +++ b/BaseTools/Source/C/BfmLib/BfmLib.c
> @@ -164,34 +164,34 @@ LibFindFvInFd (
>  ) {   FIRMWARE_DEVICE             *LocalFdData;   UINT16                      Index;
> CHAR8                       Ffs2Guid[16];-  CHAR8                       SignatureCheck[4];+
> CHAR8                       SignatureCheck[5] = "";   CHAR8                       Signature[5]
> = "_FVH";   FV_INFORMATION              *CurrentFv;   FV_INFORMATION
> *NewFoundFv;   BOOLEAN                     FirstMatch;   UINT32                      FdSize;
> UINT16                      FvCount;-  VOID                        *FdBuffer;-  VOID
> *FdBufferOri;-  UINT32                      Count;-+  UINT8                       *FdBuffer;+
> UINT8                       *FdBufferEnd;+  UINT8                       *FdBufferOri;+
> EFI_FIRMWARE_VOLUME_HEADER  *FvHeader;    CurrentFv      = NULL;
> NewFoundFv     = NULL;   FdBuffer       = NULL;   FdBufferOri    = NULL;
> FirstMatch     = TRUE;   Index          = 0;   FdSize         = 0;   FvCount        = 0;-
> Count          = 0;   LocalFdData    = NULL;    if (InputFile == NULL) {+    Error
> ("BFM", 0, 0001, "Error opening the input file", "");     return EFI_ABORTED;   }
> //   // Find each FVs in the FD@@ -204,56 +204,66 @@ LibFindFvInFd (
>     fseek(InputFile,0,SEEK_SET);   //   // Create an FD structure to store useful
> information.   //-  LocalFdData     = (FIRMWARE_DEVICE *) calloc (sizeof
> (FIRMWARE_DEVICE), sizeof(UINT8));+  LocalFdData     = (FIRMWARE_DEVICE
> *) malloc (sizeof (FIRMWARE_DEVICE));   if (LocalFdData == NULL) {+    Error
> ("BFM", 0, 0002, "Error searching FVs in the input fd", "Allocate memory
> error");     return EFI_OUT_OF_RESOURCES;   }-  LocalFdData->Fv =
> (FV_INFORMATION *)  calloc (sizeof (FV_INFORMATION), sizeof(UINT8));+
> LocalFdData->Fv = (FV_INFORMATION *)  malloc (sizeof (FV_INFORMATION));
> if (LocalFdData->Fv == NULL) {+    Error ("BFM", 0, 0002, "Error searching FVs
> in the input fd", "Allocate memory error");     free (LocalFdData);     return
> EFI_OUT_OF_RESOURCES;   }+   LibInitializeFvStruct (LocalFdData->Fv);    //
> // Readout the FD file data to buffer.   //   FdBuffer = malloc (FdSize);    if
> (FdBuffer == NULL) {+    Error ("BFM", 0, 0002, "Error searching FVs in the
> input fd", "Allocate memory error");     free (LocalFdData->Fv);     free
> (LocalFdData);     return EFI_OUT_OF_RESOURCES;   }    if (fread (FdBuffer, 1,
> FdSize, InputFile) != FdSize) {+    Error ("BFM", 0, 0002, "Error searching FVs in
> the input fd", "Read FD file error!");     free (LocalFdData->Fv);     free
> (LocalFdData);     free (FdBuffer);     return EFI_ABORTED;   }    FdBufferOri =
> FdBuffer;+  FdBufferEnd = FdBuffer + FdSize; -  for (Count=0; Count < FdSize -
> 4; Count++) {+  if (FdSize < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) {+
> Error ("BFM", 0, 0002, "Error Check the input FD, Please make sure the FD is
> valid", "Check FD size error!");+    return EFI_ABORTED;+  }++  while (FdBuffer
> <= FdBufferEnd - sizeof (EFI_FIRMWARE_VOLUME_HEADER)) {+    FvHeader =
> (EFI_FIRMWARE_VOLUME_HEADER *) FdBuffer;     //     // Copy 4 bytes of fd
> data to check the _FVH signature     //-    memcpy (SignatureCheck, FdBuffer,
> 4);-    FdBuffer =(UINT8 *)FdBuffer + 4;+    memcpy (SignatureCheck,
> &FvHeader->Signature, 4);      if (strncmp(SignatureCheck, Signature, 4) ==
> 0){       //       // Still need to determine the FileSystemGuid in
> EFI_FIRMWARE_VOLUME_HEADER equal to-      //
> EFI_FIRMWARE_FILE_SYSTEM2_GUID.+      //
> EFI_FIRMWARE_FILE_SYSTEM2_GUID or
> EFI_FIRMWARE_FILE_SYSTEM3_GUID.       // Turn back 28 bytes to find the
> GUID.       //-      FdBuffer = (UINT8 *)FdBuffer - 28;-      memcpy (Ffs2Guid,
> FdBuffer, 16);+      memcpy (Ffs2Guid, &FvHeader->FileSystemGuid, 16);
> //       // Compare GUID.       //       for (Index = 0; Index < 16; Index ++) {@@ -
> 267,32 +277,28 @@ LibFindFvInFd (
>              break;           }         }     } -      //-      // Point to the original address-
> //-      FdBuffer = (UINT8 *)FdBuffer + 28;-       //       // Here we found an FV.
> //-      if (Index == 16) {+      if ((Index == 16) && ((FdBuffer + FvHeader-
> >FvLength) <= FdBufferEnd)) {         if (FirstMatch) {-          LocalFdData->Fv-
> >ImageAddress = (UINTN)((UINT8 *)FdBuffer - (UINT8 *)FdBufferOri) - 0x2c;+
> LocalFdData->Fv->ImageAddress = (UINTN)((UINT8 *)FdBuffer - (UINT8
> *)FdBufferOri);           CurrentFv                     = LocalFdData->Fv;
> CurrentFv->FvNext             = NULL;           //           // Store the FV name by
> found sequence           //           sprintf(CurrentFv->FvName, "FV%d", FvCount);
> FirstMatch = FALSE;           } else {             NewFoundFv = (FV_INFORMATION *)
> malloc (sizeof (FV_INFORMATION));-            if (NULL == NewFoundFv) {+
> if (NewFoundFv == NULL) {+              Error ("BFM", 0, 0002, "Error searching
> FVs in the input fd", "Allocate memory error");               free (LocalFdData->Fv);
> free (LocalFdData);               free (FdBuffer);               return
> EFI_OUT_OF_RESOURCES;             }@@ -300,11 +306,11 @@ LibFindFvInFd (
>              LibInitializeFvStruct (NewFoundFv);              //             // Need to turn
> back 0x2c bytes             //-            NewFoundFv->ImageAddress =
> (UINTN)((UINT8 *)FdBuffer - (UINT8 *)FdBufferOri) - 0x2c;+
> NewFoundFv->ImageAddress = (UINTN)((UINT8 *)FdBuffer - (UINT8
> *)FdBufferOri);              //             // Store the FV name by found sequence
> //             sprintf(NewFoundFv->FvName, "FV%d", FvCount);@@ -320,19
> +326,18 @@ LibFindFvInFd (
>              //             CurrentFv                = CurrentFv->FvNext;           }          FvCount
> ++;-        Index = 0;+        FdBuffer = FdBuffer + FvHeader->FvLength;+      } else
> {+        FdBuffer ++;       } +    } else {+      FdBuffer ++;     }--    //-    // We need to
> turn back 3 bytes.-    //-    FdBuffer = (UINT8 *)FdBuffer - 3;   }    LocalFdData-
> >Size = FdSize;    *FdData = LocalFdData;--
> 2.29.1.windows.1
> 
> 
> 
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#67131): https://edk2.groups.io/g/devel/message/67131
> Mute This Topic: https://groups.io/mt/78127410/4546272
> Group Owner: devel+owner@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [yuwei.chen@intel.com]
> -=-=-=-=-=-=
> 


  parent reply	other threads:[~2021-01-14  2:40 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-09  1:57 [Patch] [edk2-staging]BaseTools/Bfm: Apply the FMMT algorithm of LibFindFvInFd Bob Feng
2021-01-04 10:48 ` 回复: " fengyunhua
2021-01-14  2:40 ` Yuwei Chen [this message]
2021-01-14  3:54   ` [edk2-devel] " Bob Feng
     [not found] <1645B458920B2EFC.8542@groups.io>
2021-01-04  3:01 ` Bob Feng

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=DM5PR11MB15944770D252E204F032B51F96A80@DM5PR11MB1594.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