Topics

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


Bob Feng
 

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 (
)=0D
{=0D
FIRMWARE_DEVICE *LocalFdData;=0D
UINT16 Index;=0D
CHAR8 Ffs2Guid[16];=0D
- CHAR8 SignatureCheck[4];=0D
+ CHAR8 SignatureCheck[5] =3D "";=0D
CHAR8 Signature[5] =3D "_FVH";=0D
FV_INFORMATION *CurrentFv;=0D
FV_INFORMATION *NewFoundFv;=0D
BOOLEAN FirstMatch;=0D
UINT32 FdSize;=0D
UINT16 FvCount;=0D
- VOID *FdBuffer;=0D
- VOID *FdBufferOri;=0D
- UINT32 Count;=0D
-=0D
+ UINT8 *FdBuffer;=0D
+ UINT8 *FdBufferEnd;=0D
+ UINT8 *FdBufferOri;=0D
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;=0D
=0D
CurrentFv =3D NULL;=0D
NewFoundFv =3D NULL;=0D
FdBuffer =3D NULL;=0D
FdBufferOri =3D NULL;=0D
FirstMatch =3D TRUE;=0D
Index =3D 0;=0D
FdSize =3D 0;=0D
FvCount =3D 0;=0D
- Count =3D 0;=0D
LocalFdData =3D NULL;=0D
=0D
if (InputFile =3D=3D NULL) {=0D
+ Error ("BFM", 0, 0001, "Error opening the input file", "");=0D
return EFI_ABORTED;=0D
}=0D
=0D
//=0D
// Find each FVs in the FD=0D
@@ -204,56 +204,66 @@ LibFindFvInFd (
=0D
fseek(InputFile,0,SEEK_SET);=0D
//=0D
// Create an FD structure to store useful information.=0D
//=0D
- LocalFdData =3D (FIRMWARE_DEVICE *) calloc (sizeof (FIRMWARE_DEVICE)=
, sizeof(UINT8));=0D
+ LocalFdData =3D (FIRMWARE_DEVICE *) malloc (sizeof (FIRMWARE_DEVICE)=
);=0D
if (LocalFdData =3D=3D NULL) {=0D
+ Error ("BFM", 0, 0002, "Error searching FVs in the input fd", "Allocat=
e memory error");=0D
return EFI_OUT_OF_RESOURCES;=0D
}=0D
- LocalFdData->Fv =3D (FV_INFORMATION *) calloc (sizeof (FV_INFORMATION),=
sizeof(UINT8));=0D
+ LocalFdData->Fv =3D (FV_INFORMATION *) malloc (sizeof (FV_INFORMATION))=
;=0D
if (LocalFdData->Fv =3D=3D NULL) {=0D
+ Error ("BFM", 0, 0002, "Error searching FVs in the input fd", "Allocat=
e memory error");=0D
free (LocalFdData);=0D
return EFI_OUT_OF_RESOURCES;=0D
}=0D
+=0D
LibInitializeFvStruct (LocalFdData->Fv);=0D
=0D
//=0D
// Readout the FD file data to buffer.=0D
//=0D
FdBuffer =3D malloc (FdSize);=0D
=0D
if (FdBuffer =3D=3D NULL) {=0D
+ Error ("BFM", 0, 0002, "Error searching FVs in the input fd", "Allocat=
e memory error");=0D
free (LocalFdData->Fv);=0D
free (LocalFdData);=0D
return EFI_OUT_OF_RESOURCES;=0D
}=0D
=0D
if (fread (FdBuffer, 1, FdSize, InputFile) !=3D FdSize) {=0D
+ Error ("BFM", 0, 0002, "Error searching FVs in the input fd", "Read FD=
file error!");=0D
free (LocalFdData->Fv);=0D
free (LocalFdData);=0D
free (FdBuffer);=0D
return EFI_ABORTED;=0D
}=0D
=0D
FdBufferOri =3D FdBuffer;=0D
+ FdBufferEnd =3D FdBuffer + FdSize;=0D
=0D
- for (Count=3D0; Count < FdSize - 4; Count++) {=0D
+ if (FdSize < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) {=0D
+ Error ("BFM", 0, 0002, "Error Check the input FD, Please make sure the=
FD is valid", "Check FD size error!");=0D
+ return EFI_ABORTED;=0D
+ }=0D
+=0D
+ while (FdBuffer <=3D FdBufferEnd - sizeof (EFI_FIRMWARE_VOLUME_HEADER)) =
{=0D
+ FvHeader =3D (EFI_FIRMWARE_VOLUME_HEADER *) FdBuffer;=0D
//=0D
// Copy 4 bytes of fd data to check the _FVH signature=0D
//=0D
- memcpy (SignatureCheck, FdBuffer, 4);=0D
- FdBuffer =3D(UINT8 *)FdBuffer + 4;=0D
+ memcpy (SignatureCheck, &FvHeader->Signature, 4);=0D
=0D
if (strncmp(SignatureCheck, Signature, 4) =3D=3D 0){=0D
//=0D
// Still need to determine the FileSystemGuid in EFI_FIRMWARE_VOLUME=
_HEADER equal to=0D
- // EFI_FIRMWARE_FILE_SYSTEM2_GUID.=0D
+ // EFI_FIRMWARE_FILE_SYSTEM2_GUID or EFI_FIRMWARE_FILE_SYSTEM3_GUID.=
=0D
// Turn back 28 bytes to find the GUID.=0D
//=0D
- FdBuffer =3D (UINT8 *)FdBuffer - 28;=0D
- memcpy (Ffs2Guid, FdBuffer, 16);=0D
+ memcpy (Ffs2Guid, &FvHeader->FileSystemGuid, 16);=0D
=0D
//=0D
// Compare GUID.=0D
//=0D
for (Index =3D 0; Index < 16; Index ++) {=0D
@@ -267,32 +277,28 @@ LibFindFvInFd (
break;=0D
}=0D
}=0D
}=0D
=0D
- //=0D
- // Point to the original address=0D
- //=0D
- FdBuffer =3D (UINT8 *)FdBuffer + 28;=0D
-=0D
//=0D
// Here we found an FV.=0D
//=0D
- if (Index =3D=3D 16) {=0D
+ if ((Index =3D=3D 16) && ((FdBuffer + FvHeader->FvLength) <=3D FdBuf=
ferEnd)) {=0D
if (FirstMatch) {=0D
- LocalFdData->Fv->ImageAddress =3D (UINTN)((UINT8 *)FdBuffer - (U=
INT8 *)FdBufferOri) - 0x2c;=0D
+ LocalFdData->Fv->ImageAddress =3D (UINTN)((UINT8 *)FdBuffer - (U=
INT8 *)FdBufferOri);=0D
CurrentFv =3D LocalFdData->Fv;=0D
CurrentFv->FvNext =3D NULL;=0D
//=0D
// Store the FV name by found sequence=0D
//=0D
sprintf(CurrentFv->FvName, "FV%d", FvCount);=0D
=0D
FirstMatch =3D FALSE;=0D
} else {=0D
NewFoundFv =3D (FV_INFORMATION *) malloc (sizeof (FV_INFORMATI=
ON));=0D
- if (NULL =3D=3D NewFoundFv) {=0D
+ if (NewFoundFv =3D=3D NULL) {=0D
+ Error ("BFM", 0, 0002, "Error searching FVs in the input fd"=
, "Allocate memory error");=0D
free (LocalFdData->Fv);=0D
free (LocalFdData);=0D
free (FdBuffer);=0D
return EFI_OUT_OF_RESOURCES;=0D
}=0D
@@ -300,11 +306,11 @@ LibFindFvInFd (
LibInitializeFvStruct (NewFoundFv);=0D
=0D
//=0D
// Need to turn back 0x2c bytes=0D
//=0D
- NewFoundFv->ImageAddress =3D (UINTN)((UINT8 *)FdBuffer - (UINT=
8 *)FdBufferOri) - 0x2c;=0D
+ NewFoundFv->ImageAddress =3D (UINTN)((UINT8 *)FdBuffer - (UINT=
8 *)FdBufferOri);=0D
=0D
//=0D
// Store the FV name by found sequence=0D
//=0D
sprintf(NewFoundFv->FvName, "FV%d", FvCount);=0D
@@ -320,19 +326,18 @@ LibFindFvInFd (
//=0D
CurrentFv =3D CurrentFv->FvNext;=0D
}=0D
=0D
FvCount ++;=0D
- Index =3D 0;=0D
+ FdBuffer =3D FdBuffer + FvHeader->FvLength;=0D
+ } else {=0D
+ FdBuffer ++;=0D
}=0D
=0D
+ } else {=0D
+ FdBuffer ++;=0D
}=0D
-=0D
- //=0D
- // We need to turn back 3 bytes.=0D
- //=0D
- FdBuffer =3D (UINT8 *)FdBuffer - 3;=0D
}=0D
=0D
LocalFdData->Size =3D FdSize;=0D
=0D
*FdData =3D LocalFdData;=0D
--=20
2.29.1.windows.1


Yuwei Chen
 

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]
-=-=-=-=-=-=


Bob Feng
 

Pushed at d911c5720f3fde5ffe72bbc4230a77025adf2e62

-----Original Message-----
From: Chen, Christine <yuwei.chen@intel.com>
Sent: Thursday, January 14, 2021 10:41 AM
To: 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

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
LocalFdData->(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] -=-=-=-=-=-=