X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=BaseTools%2FSource%2FC%2FVolInfo%2FVolInfo.c;h=428011ca046c5e1f7303fe5facb052e449be23ed;hb=HEAD;hp=da35cac273e82030a0ece2be93018fa6330e2f77;hpb=e3d468acb9ce26a75fee45d742619ac1c6683280;p=mirror_edk2.git diff --git a/BaseTools/Source/C/VolInfo/VolInfo.c b/BaseTools/Source/C/VolInfo/VolInfo.c index da35cac273..428011ca04 100644 --- a/BaseTools/Source/C/VolInfo/VolInfo.c +++ b/BaseTools/Source/C/VolInfo/VolInfo.c @@ -2,6 +2,7 @@ The tool dumps the contents of a firmware volume Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2022, Konstantin Aladyshev
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -43,6 +44,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // EFI_GUID gEfiCrc32GuidedSectionExtractionProtocolGuid = EFI_CRC32_GUIDED_SECTION_EXTRACTION_PROTOCOL_GUID; +EFI_GUID gPeiAprioriFileNameGuid = { 0x1b45cc0a, 0x156a, 0x428a, { 0XAF, 0x62, 0x49, 0x86, 0x4d, 0xa0, 0xe6, 0xe6 }}; +EFI_GUID gAprioriGuid = { 0xFC510EE7, 0xFFDC, 0x11D4, { 0xBD, 0x41, 0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81 }}; #define UTILITY_MAJOR_VERSION 1 #define UTILITY_MINOR_VERSION 0 @@ -51,15 +54,13 @@ EFI_GUID gEfiCrc32GuidedSectionExtractionProtocolGuid = EFI_CRC32_GUIDED_SECTIO #define EFI_SECTION_ERROR EFIERR (100) -#define MAX_BASENAME_LEN 60 // not good to hardcode, but let's be reasonable - // // Structure to keep a list of guid-to-basenames // typedef struct _GUID_TO_BASENAME { struct _GUID_TO_BASENAME *Next; INT8 Guid[PRINTED_GUID_BUFFER_SIZE]; - INT8 BaseName[MAX_BASENAME_LEN]; + INT8 BaseName[MAX_LINE_LEN]; } GUID_TO_BASENAME; static GUID_TO_BASENAME *mGuidBaseNameList = NULL; @@ -109,6 +110,12 @@ ReadHeader ( OUT BOOLEAN *ErasePolarity ); +STATIC +EFI_STATUS +PrintAprioriFile ( + EFI_FFS_FILE_HEADER *FileHeader + ); + STATIC EFI_STATUS PrintFileInfo ( @@ -678,11 +685,11 @@ Returns: // // 0x17 // - "EFI_SECTION_FIRMWARE_VOLUME_IMAGE ", + "EFI_SECTION_FIRMWARE_VOLUME_IMAGE", // // 0x18 // - "EFI_SECTION_FREEFORM_SUBTYPE_GUID ", + "EFI_SECTION_FREEFORM_SUBTYPE_GUID", // // 0x19 // @@ -698,7 +705,7 @@ Returns: // // 0x1C // - "EFI_SECTION_SMM_DEPEX", + "EFI_SECTION_MM_DEPEX", // // 0x1C+ // @@ -1085,6 +1092,53 @@ Returns: return EFI_SUCCESS; } +STATIC +EFI_STATUS +PrintAprioriFile ( + EFI_FFS_FILE_HEADER *FileHeader + ) +/*++ + +Routine Description: + + Print GUIDs from the APRIORI file + +Arguments: + + FileHeader - The file header + +Returns: + + EFI_SUCCESS - The APRIORI file was parsed correctly + EFI_SECTION_ERROR - Problem with file parsing + +--*/ +{ + UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; + UINT32 HeaderSize; + + HeaderSize = FvBufGetFfsHeaderSize (FileHeader); + + if (FileHeader->Type != EFI_FV_FILETYPE_FREEFORM) + return EFI_SECTION_ERROR; + + EFI_COMMON_SECTION_HEADER* SectionHeader = (EFI_COMMON_SECTION_HEADER *) ((UINTN) FileHeader + HeaderSize); + if (SectionHeader->Type != EFI_SECTION_RAW) + return EFI_SECTION_ERROR; + + UINT32 SectionLength = GetSectionFileLength (SectionHeader); + EFI_GUID* FileName = (EFI_GUID *) ((UINT8 *) SectionHeader + sizeof (EFI_COMMON_SECTION_HEADER)); + while (((UINT8 *) FileName) < ((UINT8 *) SectionHeader + SectionLength)) { + PrintGuidToBuffer (FileName, GuidBuffer, sizeof (GuidBuffer), TRUE); + printf ("%s ", GuidBuffer); + PrintGuidName (GuidBuffer); + printf ("\n"); + FileName++; + } + + return EFI_SUCCESS; +} + STATIC EFI_STATUS PrintFileInfo ( @@ -1284,7 +1338,7 @@ Returns: break; case EFI_FV_FILETYPE_SMM: - printf ("EFI_FV_FILETYPE_SMM\n"); + printf ("EFI_FV_FILETYPE_MM\n"); break; case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE: @@ -1292,11 +1346,11 @@ Returns: break; case EFI_FV_FILETYPE_COMBINED_SMM_DXE: - printf ("EFI_FV_FILETYPE_COMBINED_SMM_DXE\n"); + printf ("EFI_FV_FILETYPE_COMBINED_MM_DXE\n"); break; case EFI_FV_FILETYPE_SMM_CORE: - printf ("EFI_FV_FILETYPE_SMM_CORE\n"); + printf ("EFI_FV_FILETYPE_MM_CORE\n"); break; case EFI_FV_FILETYPE_MM_STANDALONE: @@ -1341,6 +1395,25 @@ Returns: break; } + if (!CompareGuid ( + &FileHeader->Name, + &gPeiAprioriFileNameGuid + )) + { + printf("\n"); + printf("PEI APRIORI FILE:\n"); + return PrintAprioriFile (FileHeader); + } + if (!CompareGuid ( + &FileHeader->Name, + &gAprioriGuid + )) + { + printf("\n"); + printf("DXE APRIORI FILE:\n"); + return PrintAprioriFile (FileHeader); + } + return EFI_SUCCESS; } @@ -1796,20 +1869,30 @@ Returns: break; case EFI_SECTION_FIRMWARE_VOLUME_IMAGE: + printf ("/------------ Firmware Volume section start ---------------\\\n"); Status = PrintFvInfo (Ptr + SectionHeaderLen, TRUE); if (EFI_ERROR (Status)) { Error (NULL, 0, 0003, "printing of FV section contents failed", NULL); return EFI_SECTION_ERROR; } + printf ("\\------------ Firmware Volume section end -----------------/\n"); break; case EFI_SECTION_COMPATIBILITY16: - case EFI_SECTION_FREEFORM_SUBTYPE_GUID: // // Section does not contain any further header information. // break; + case EFI_SECTION_FREEFORM_SUBTYPE_GUID: + printf (" Guid: "); + if (SectionHeaderLen == sizeof (EFI_COMMON_SECTION_HEADER)) + PrintGuid (&((EFI_FREEFORM_SUBTYPE_GUID_SECTION *)Ptr)->SubTypeGuid); + else + PrintGuid (&((EFI_FREEFORM_SUBTYPE_GUID_SECTION2 *)Ptr)->SubTypeGuid); + printf ("\n"); + break; + case EFI_SECTION_PEI_DEPEX: case EFI_SECTION_DXE_DEPEX: case EFI_SECTION_SMM_DEPEX: @@ -1999,11 +2082,18 @@ Returns: ); free (ExtractionTool); + if (!CompareGuid ( + EfiGuid, + &gEfiCrc32GuidedSectionExtractionProtocolGuid + ) + ) { + DataOffset -= 4; + } Status = PutFileImage ( ToolInputFile, - (CHAR8*) SectionBuffer + DataOffset, - BufferLength - DataOffset + (CHAR8*)Ptr + DataOffset, + SectionLength - DataOffset ); system (SystemCommand); @@ -2048,8 +2138,8 @@ Returns: // printf ("/------------ Encapsulation section start -----------------\\\n"); Status = ParseSection ( - SectionBuffer + DataOffset, - BufferLength - DataOffset + Ptr + DataOffset, + SectionLength - DataOffset ); if (EFI_ERROR (Status)) { Error (NULL, 0, 0003, "parse of CRC32 GUIDED section failed", NULL);