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