回复: [edk2-devel] [Patch] [edk2-staging]BaseTools/Bfm: Apply the FMMT algorithm of LibFindFvInFd

gaoliming gaoliming at byosoft.com.cn
Mon Jan 4 08:42:27 UTC 2021


Sure. I will check it this week.

Thanks
Liming
> -----邮件原件-----
> 发件人: bounce+27952+69529+4905953+8761045 at groups.io
> <bounce+27952+69529+4905953+8761045 at groups.io> 代表 Bob Feng
> 发送时间: 2021年1月4日 11:01
> 收件人: devel at edk2.groups.io; Feng, Bob C <bob.c.feng at intel.com>; Yunhua
> Feng <fengyunhua at byosoft.com.cn>; Liming Gao
> <gaoliming at byosoft.com.cn>
> 主题: Re: [edk2-devel] [Patch] [edk2-staging]BaseTools/Bfm: Apply the
> FMMT algorithm of LibFindFvInFd
> 
> Hi Liming and Yunhua,
> 
> Could you review this patch?
> 
> Thanks,
> Bob
> 
> -----Original Message-----
> From: devel at edk2.groups.io <devel at edk2.groups.io> On Behalf Of Bob Feng
> Sent: Monday, November 9, 2020 9:57 AM
> To: devel at edk2.groups.io
> Cc: Yunhua Feng <fengyunhua at byosoft.com.cn>; Liming Gao
> <gaoliming at 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 at intel.com>
> Cc: Yunhua Feng <fengyunhua at byosoft.com.cn>
> Cc: Liming Gao <gaoliming at 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/1768742
> Group Owner: devel+owner at edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [bob.c.feng at intel.com]
> -=-=-=-=-=-=
> 
> 
> 
> 
> 
> 





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#69548): https://edk2.groups.io/g/devel/message/69548
Mute This Topic: https://groups.io/mt/79420347/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list