REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2521
1. If FFS file has no UI section, its FILE_GUID will be used as its name. FMMT tool -d/-a/-r option can be updated to support such FFS file. 2. -v option will print FILE_GUID if no UI section Cc: Bob Feng <bob.c.f...@intel.com> Cc: Liming Gao <liming....@intel.com> Signed-off-by: Yunhua Feng<yunhuax.f...@intel.com> --- BaseTools/Source/C/FMMT/FirmwareModuleManagement.c | 22 +++++++-- BaseTools/Source/C/FMMT/FmmtLib.c | 56 ++++++++++++++++++++++ 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c b/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c index e4fbb5461f..a786113899 100644 --- a/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c +++ b/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c @@ -79,11 +79,11 @@ Usage ( Delete the entire FV in an FD binary\n"); // // Command Line for Delete file from FV // - fprintf (stdout, " -d <input-binary-file> <FV-id> <File-Name> [<FV-id> <File-Name> ...] <output-binary-file>\n\ + fprintf (stdout, " -d <input-binary-file> <FV-id> <File-Name|File-Guid> [<FV-id> <File-Name|File-Guid> ...] <output-binary-file>\n\ Delete a file (or files) from the firmware volume in an FD binary\n"); // // Command Line for Add // @@ -91,11 +91,11 @@ Usage ( Add a file (or files) to the firmware volume in an FD binary\n"); // // Command Line for Replace // - fprintf (stdout, " -r <input-binary-file> <FV-id> <File-Name> <NewFilePath> [<FV-id> <File-Name> <NewFilePath> ...] <output-binary-file>\n\ + fprintf (stdout, " -r <input-binary-file> <FV-id> <File-Name|File-Guid> <NewFilePath> [<FV-id> <File-Name|File-Guid> <NewFilePath> ...] <output-binary-file>\n\ The replace command combines the functionality of remove and add into a single operation.\n"); fprintf (stdout, "\nNote:\n"); fprintf (stdout, " <FV-id> is the sequence of the firmware volume included in the FD image, it both support the sequentially format like FV0, FV1 and the FV's file guid value format.\n"); return; @@ -583,10 +583,11 @@ NeedNewPath(FV_INFORMATION *FvInFd, CHAR8 *FvId, UINT32 FileIndex, BOOLEAN IsAdd static UINT32 FindFile(FV_INFORMATION *FvInFd, UINT8 FvLevel, CHAR8 *File, UINT32 *MatchIndex) { UINT32 Index = 0; CHAR16 *UIName; CHAR16 *FfsUIName; UINT32 FileNumber = 0; + EFI_GUID Guid; UIName = (CHAR16 *)malloc(_MAX_PATH); if (NULL == UIName) { return 0; } @@ -612,11 +613,22 @@ static UINT32 FindFile(FV_INFORMATION *FvInFd, UINT8 FvLevel, CHAR8 *File, UINT3 } } free(UIName); free(FfsUIName); - + if (FileNumber == 0) { + StringToGuid(File, &Guid); + for (Index = 0; Index <= FvInFd->FfsNumbers; Index++) { + if (CompareGuid (&Guid, &FvInFd->FfsAttuibutes[Index].GuidName) == 0) { + FileNumber += 1; + *MatchIndex = Index; + if (FileNumber > 1) { + break; + } + } + } + } return FileNumber; } /** Search the config file from the path list. @@ -1089,11 +1101,11 @@ FmmtImageAdd( goto FAILED; } HasUISection = FALSE; HasUISection = ParseSection(InputFfs); if (!HasUISection) { - printf ("WARNING: The newly add file must have a user interface (UI) section, otherwise it cannot be deleted or replaced. \n"); + printf ("WARNING: The newly add file not have a user interface (UI) section. \n"); } if (NeedNewPath(FvInFd, FvId, 0, TRUE)) { do { NewFile = NewFileNode->FileName; // @@ -1845,11 +1857,11 @@ FmmtImageReplace ( return EFI_ABORTED; } HasUISection = FALSE; HasUISection = ParseSection(InputFfs); if (!HasUISection) { - printf ("WARNING: The newly replace file must have a user interface (UI) section, otherwise it cannot be deleted or replaced. \n"); + printf ("WARNING: The newly replace file not have a user interface (UI) section. \n"); } if (FfsFoundFlag && NeedNewPath(FvInFd, FvId, Index, FALSE)) { do { OldFile = OldFileNode -> FileName; NewFile = NewFileNode -> FileName; diff --git a/BaseTools/Source/C/FMMT/FmmtLib.c b/BaseTools/Source/C/FMMT/FmmtLib.c index 78b6f3a21d..685ef634f2 100644 --- a/BaseTools/Source/C/FMMT/FmmtLib.c +++ b/BaseTools/Source/C/FMMT/FmmtLib.c @@ -824,10 +824,11 @@ LibParseSection ( UINT16 GuidAttr; UINT16 DataOffset; CHAR8 *UIFileName; CHAR8 *ToolInputFileName; CHAR8 *ToolOutputFileName; + BOOLEAN HasUiSection; DataOffset = 0; GuidAttr = 0; ParsedLength = 0; ToolOutputLength = 0; @@ -858,10 +859,11 @@ LibParseSection ( ToolInputFileName = NULL; ToolOutputFileFullName = NULL; HasDepexSection = FALSE; EncapDataNeedUpdata = TRUE; LargeHeaderOffset = 0; + HasUiSection = FALSE; while (ParsedLength < BufferLength) { Ptr = SectionBuffer + ParsedLength; @@ -888,10 +890,11 @@ LibParseSection ( switch (Type) { case EFI_SECTION_FIRMWARE_VOLUME_IMAGE: EncapDataNeedUpdata = TRUE; + HasUiSection = TRUE; Level ++; NumberOfSections ++; CurrentFv->FfsAttuibutes[*FfsCount].IsLeaf = FALSE; @@ -988,10 +991,11 @@ LibParseSection ( case EFI_SECTION_COMPRESSION: Level ++; NumberOfSections ++; EncapDataNeedUpdata = TRUE; + HasUiSection = TRUE; // // Put in encapsulate data information. // LocalEncapData = *CurrentFvEncapData; if (LocalEncapData->NextNode != NULL) { @@ -1166,10 +1170,11 @@ LibParseSection ( // a GUID defined FV section. // Level ++; NumberOfSections++; EncapDataNeedUpdata = TRUE; + HasUiSection = TRUE; // // Put in encapsulate data information. // LocalEncapData = *CurrentFvEncapData; if (LocalEncapData->NextNode != NULL) { @@ -1593,10 +1598,11 @@ LibParseSection ( memcpy(CurrentFv->FfsAttuibutes[*FfsCount].Depex, Ptr, SectionLength); CurrentFv->FfsAttuibutes[*FfsCount].DepexLen = SectionLength; break; case EFI_SECTION_USER_INTERFACE: + HasUiSection = TRUE; NumberOfSections ++; CurrentFv->FfsAttuibutes[*FfsCount].Level = Level; UiSectionLength = GetLength (((EFI_USER_INTERFACE_SECTION *) Ptr)->CommonHeader.Size); if (UiSectionLength == 0xffffff) { @@ -1669,10 +1675,34 @@ LibParseSection ( if (ParsedLength < BufferLength) { Error ("FMMT", 0, 0003, "sections do not completely fill the sectioned buffer being parsed", NULL); return EFI_SECTION_ERROR; } + if (ViewFlag && !HasUiSection) { + // + //print FILE FFS GUID name + // + BlankChar = LibConstructBlankChar( CurrentFv->FvLevel * 2); + if (BlankChar == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + fprintf(stdout, "%sFile \"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\"\n", BlankChar, + CurrentFile->Name.Data1, + CurrentFile->Name.Data2, + CurrentFile->Name.Data3, + CurrentFile->Name.Data4[0], + CurrentFile->Name.Data4[1], + CurrentFile->Name.Data4[2], + CurrentFile->Name.Data4[3], + CurrentFile->Name.Data4[4], + CurrentFile->Name.Data4[5], + CurrentFile->Name.Data4[6], + CurrentFile->Name.Data4[7] + ); + free(BlankChar); + } return EFI_SUCCESS; } /** @@ -1819,16 +1849,18 @@ LibGetFileInfo ( UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; ENCAP_INFO_DATA *LocalEncapData; BOOLEAN EncapDataNeedUpdateFlag; BOOLEAN IsGeneratedFfs; UINT32 FfsFileHeaderSize; + CHAR8 *BlankChar; Status = EFI_SUCCESS; LocalEncapData = NULL; EncapDataNeedUpdateFlag = TRUE; IsGeneratedFfs = FALSE; + BlankChar = NULL; FfsFileHeaderSize = GetFfsHeaderLength ((EFI_FFS_FILE_HEADER *) CurrentFile); FileLength = GetFfsFileLength ((EFI_FFS_FILE_HEADER *) CurrentFile); // @@ -1999,10 +2031,34 @@ LibGetFileInfo ( if ( CurrentFile->Type == EFI_FV_FILETYPE_RAW){ CurrentFv->FfsAttuibutes[*FfsCount].Level = Level; if (!ViewFlag){ LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, ErasePolarity); + } else { + // + // print EFI_FV_FILETYPE_RAW GUID + // + BlankChar = LibConstructBlankChar( CurrentFv->FvLevel * 2); + if (BlankChar == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + fprintf(stdout, "%sFile \"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\"\n", BlankChar, + CurrentFile->Name.Data1, + CurrentFile->Name.Data2, + CurrentFile->Name.Data3, + CurrentFile->Name.Data4[0], + CurrentFile->Name.Data4[1], + CurrentFile->Name.Data4[2], + CurrentFile->Name.Data4[3], + CurrentFile->Name.Data4[4], + CurrentFile->Name.Data4[5], + CurrentFile->Name.Data4[6], + CurrentFile->Name.Data4[7] + ); + free(BlankChar); + } } else if( CurrentFile->Type == EFI_FV_FILETYPE_FFS_PAD){ //EFI_FV_FILETYPE_FFS_PAD } else { // -- 2.12.2.windows.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#54288): https://edk2.groups.io/g/devel/message/54288 Mute This Topic: https://groups.io/mt/71210722/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-