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);