]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VolInfo/VolInfo.c
Sync BaseTool trunk (version r2670) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / C / VolInfo / VolInfo.c
index 0f54c2a42963c19bc9102e4b8bca68ca320e51de..21d70199cba9a2a93a1aa8dd9bcdb9d06ab67cfc 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 1999 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -975,22 +975,24 @@ Returns:
   UINT32              FileLength;\r
   UINT8               FileState;\r
   UINT8               Checksum;\r
-  EFI_FFS_FILE_HEADER BlankHeader;\r
+  EFI_FFS_FILE_HEADER2 BlankHeader;\r
   EFI_STATUS          Status;\r
   UINT8               GuidBuffer[PRINTED_GUID_BUFFER_SIZE];\r
+  UINT32              HeaderSize;\r
 #if (PI_SPECIFICATION_VERSION < 0x00010000) \r
   UINT16              *Tail;\r
 #endif\r
   //\r
   // Check if we have free space\r
   //\r
+  HeaderSize = FvBufGetFfsHeaderSize(FileHeader);\r
   if (ErasePolarity) {\r
-    memset (&BlankHeader, -1, sizeof (EFI_FFS_FILE_HEADER));\r
+    memset (&BlankHeader, -1, HeaderSize);\r
   } else {\r
-    memset (&BlankHeader, 0, sizeof (EFI_FFS_FILE_HEADER));\r
+    memset (&BlankHeader, 0, HeaderSize);\r
   }\r
 \r
-  if (memcmp (&BlankHeader, FileHeader, sizeof (EFI_FFS_FILE_HEADER)) == 0) {\r
+  if (memcmp (&BlankHeader, FileHeader, HeaderSize) == 0) {\r
     return EFI_SUCCESS;\r
   }\r
   //\r
@@ -1008,7 +1010,7 @@ Returns:
   //  PrintGuid (&FileHeader->Name);\r
   //  printf ("\n");\r
   //\r
-  FileLength = GetLength (FileHeader->Size);\r
+  FileLength = FvBufGetFfsFileSize (FileHeader);\r
   printf ("File Offset:      0x%08X\n", (unsigned) ((UINTN) FileHeader - (UINTN) FvImage));\r
   printf ("File Length:      0x%08X\n", (unsigned) FileLength);\r
   printf ("File Attributes:  0x%02X\n", FileHeader->Attributes);\r
@@ -1031,7 +1033,7 @@ Returns:
 \r
   case EFI_FILE_HEADER_VALID:\r
     printf ("        EFI_FILE_HEADER_VALID\n");\r
-    Checksum  = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER));\r
+    Checksum  = CalculateSum8 ((UINT8 *) FileHeader, HeaderSize);\r
     Checksum  = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File);\r
     Checksum  = (UINT8) (Checksum - FileHeader->State);\r
     if (Checksum != 0) {\r
@@ -1053,7 +1055,7 @@ Returns:
     //\r
     // Calculate header checksum\r
     //\r
-    Checksum  = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER));\r
+    Checksum  = CalculateSum8 ((UINT8 *) FileHeader, HeaderSize);\r
     Checksum  = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File);\r
     Checksum  = (UINT8) (Checksum - FileHeader->State);\r
     if (Checksum != 0) {\r
@@ -1061,13 +1063,13 @@ Returns:
       return EFI_ABORTED;\r
     }\r
 \r
-    FileLength = GetLength (FileHeader->Size);\r
+    FileLength = FvBufGetFfsFileSize (FileHeader);\r
 \r
     if (FileHeader->Attributes & FFS_ATTRIB_CHECKSUM) {\r
       //\r
       // Calculate file checksum\r
       //\r
-      Checksum  = CalculateSum8 ((UINT8 *) (FileHeader + 1), FileLength - sizeof (EFI_FFS_FILE_HEADER));\r
+      Checksum  = CalculateSum8 ((UINT8 *)FileHeader + HeaderSize, FileLength - HeaderSize);\r
       Checksum  = Checksum + FileHeader->IntegrityCheck.Checksum.File;\r
       if (Checksum != 0) {\r
         Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid file checksum", GuidBuffer);\r
@@ -1180,8 +1182,8 @@ Returns:
     // All other files have sections\r
     //\r
     Status = ParseSection (\r
-              (UINT8 *) ((UINTN) FileHeader + sizeof (EFI_FFS_FILE_HEADER)),\r
-              GetLength (FileHeader->Size) - sizeof (EFI_FFS_FILE_HEADER)\r
+              (UINT8 *) ((UINTN) FileHeader + HeaderSize),\r
+              FvBufGetFfsFileSize (FileHeader) - HeaderSize\r
               );\r
     if (EFI_ERROR (Status)) {\r
       //\r
@@ -1225,6 +1227,7 @@ Returns:
   EFI_SECTION_TYPE    Type;\r
   UINT8               *Ptr;\r
   UINT32              SectionLength;\r
+  UINT32              SectionHeaderLen;\r
   CHAR8               *SectionName;\r
   EFI_STATUS          Status;\r
   UINT32              ParsedLength;\r
@@ -1246,6 +1249,10 @@ Returns:
   CHAR8               *ToolOutputFile;\r
   CHAR8               *SystemCommandFormatString;\r
   CHAR8               *SystemCommand;\r
+  EFI_GUID            *EfiGuid;\r
+  UINT16              DataOffset;\r
+  UINT16              Attributes;\r
+  UINT32              RealHdrLen;\r
 \r
   ParsedLength = 0;\r
   while (ParsedLength < BufferLength) {\r
@@ -1264,6 +1271,12 @@ Returns:
       continue;\r
     }\r
 \r
+    //\r
+    // Get real section file size\r
+    //\r
+    SectionLength = GetSectionFileLength ((EFI_COMMON_SECTION_HEADER *) Ptr);\r
+    SectionHeaderLen = GetSectionHeaderLength((EFI_COMMON_SECTION_HEADER *)Ptr);\r
+\r
     SectionName = SectionNameToStr (Type);\r
     printf ("------------------------------------------------------------\n");\r
     printf ("  Type:  %s\n  Size:  0x%08X\n", SectionName, (unsigned) SectionLength);\r
@@ -1283,7 +1296,7 @@ Returns:
       break;\r
 \r
     case EFI_SECTION_FIRMWARE_VOLUME_IMAGE:\r
-      Status = PrintFvInfo (((EFI_FIRMWARE_VOLUME_IMAGE_SECTION*)Ptr) + 1, TRUE);\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
@@ -1304,15 +1317,22 @@ Returns:
       break;\r
 \r
     case EFI_SECTION_VERSION:\r
-      printf ("  Build Number:  0x%02X\n", ((EFI_VERSION_SECTION *) Ptr)->BuildNumber);\r
-      printf ("  Version Strg:  %s\n", (char*) ((EFI_VERSION_SECTION *) Ptr)->VersionString);\r
+      printf ("  Build Number:  0x%02X\n", *(UINT16 *)(Ptr + SectionHeaderLen));\r
+      printf ("  Version Strg:  %s\n", (char*) (Ptr + SectionHeaderLen + sizeof (UINT16)));\r
       break;\r
 \r
     case EFI_SECTION_COMPRESSION:\r
       UncompressedBuffer  = NULL;\r
-      CompressedLength    = SectionLength - sizeof (EFI_COMPRESSION_SECTION);\r
-      UncompressedLength  = ((EFI_COMPRESSION_SECTION *) Ptr)->UncompressedLength;\r
-      CompressionType     = ((EFI_COMPRESSION_SECTION *) Ptr)->CompressionType;\r
+      if (SectionHeaderLen == sizeof (EFI_COMMON_SECTION_HEADER)) {\r
+        RealHdrLen = sizeof(EFI_COMPRESSION_SECTION);\r
+        UncompressedLength  = ((EFI_COMPRESSION_SECTION *)Ptr)->UncompressedLength;\r
+        CompressionType     = ((EFI_COMPRESSION_SECTION *)Ptr)->CompressionType;\r
+      } else {\r
+        RealHdrLen = sizeof(EFI_COMPRESSION_SECTION2);\r
+        UncompressedLength  = ((EFI_COMPRESSION_SECTION2 *)Ptr)->UncompressedLength;\r
+        CompressionType     = ((EFI_COMPRESSION_SECTION2 *)Ptr)->CompressionType;\r
+      }\r
+      CompressedLength    = SectionLength - RealHdrLen;\r
       printf ("  Uncompressed Length:  0x%08X\n", (unsigned) UncompressedLength);\r
 \r
       if (CompressionType == EFI_NOT_COMPRESSED) {\r
@@ -1328,13 +1348,13 @@ Returns:
           return EFI_SECTION_ERROR;\r
         }\r
 \r
-        UncompressedBuffer = Ptr + sizeof (EFI_COMPRESSION_SECTION);\r
+        UncompressedBuffer = Ptr + RealHdrLen;\r
       } else if (CompressionType == EFI_STANDARD_COMPRESSION) {\r
         GetInfoFunction     = EfiGetInfo;\r
         DecompressFunction  = EfiDecompress;\r
         printf ("  Compression Type:  EFI_STANDARD_COMPRESSION\n");\r
 \r
-        CompressedBuffer  = Ptr + sizeof (EFI_COMPRESSION_SECTION);\r
+        CompressedBuffer  = Ptr + RealHdrLen;\r
 \r
         Status            = GetInfoFunction (CompressedBuffer, CompressedLength, &DstSize, &ScratchSize);\r
         if (EFI_ERROR (Status)) {\r
@@ -1387,16 +1407,25 @@ Returns:
       break;\r
 \r
     case EFI_SECTION_GUID_DEFINED:\r
+      if (SectionHeaderLen == sizeof(EFI_COMMON_SECTION_HEADER)) {\r
+        EfiGuid = &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid;\r
+        DataOffset = ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset;\r
+        Attributes = ((EFI_GUID_DEFINED_SECTION *) Ptr)->Attributes;\r
+      } else {\r
+        EfiGuid = &((EFI_GUID_DEFINED_SECTION2 *) Ptr)->SectionDefinitionGuid;\r
+        DataOffset = ((EFI_GUID_DEFINED_SECTION2 *) Ptr)->DataOffset;\r
+        Attributes = ((EFI_GUID_DEFINED_SECTION2 *) Ptr)->Attributes;\r
+      }\r
       printf ("  SectionDefinitionGuid:  ");\r
-      PrintGuid (&((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid);\r
+      PrintGuid (EfiGuid);\r
       printf ("\n");\r
-      printf ("  DataOffset:             0x%04X\n", (unsigned) ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset);\r
-      printf ("  Attributes:             0x%04X\n", (unsigned) ((EFI_GUID_DEFINED_SECTION *) Ptr)->Attributes);\r
+      printf ("  DataOffset:             0x%04X\n", (unsigned) DataOffset);\r
+      printf ("  Attributes:             0x%04X\n", (unsigned) Attributes);\r
 \r
       ExtractionTool =\r
         LookupGuidedSectionToolPath (\r
           mParsedGuidedSectionTools,\r
-          &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid\r
+          EfiGuid\r
           );\r
 \r
       if (ExtractionTool != NULL) {\r
@@ -1427,8 +1456,8 @@ Returns:
         Status =\r
           PutFileImage (\r
             ToolInputFile,\r
-            (CHAR8*) SectionBuffer + ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset,\r
-            BufferLength - ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset\r
+            (CHAR8*) SectionBuffer + DataOffset,\r
+            BufferLength - DataOffset\r
             );\r
 \r
         system (SystemCommand);\r
@@ -1461,7 +1490,7 @@ Returns:
       // Check for CRC32 sections which we can handle internally if needed.\r
       //\r
       } else if (!CompareGuid (\r
-                   &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid,\r
+                   EfiGuid,\r
                    &gEfiCrc32GuidedSectionExtractionProtocolGuid\r
                    )\r
           ) {\r
@@ -1469,8 +1498,8 @@ Returns:
         // CRC32 guided section\r
         //\r
         Status = ParseSection (\r
-                  SectionBuffer + ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset,\r
-                  BufferLength - ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset\r
+                  SectionBuffer + DataOffset,\r
+                  BufferLength - DataOffset\r
                   );\r
         if (EFI_ERROR (Status)) {\r
           Error (NULL, 0, 0003, "parse of CRC32 GUIDED section failed", NULL);\r
@@ -1540,8 +1569,8 @@ Returns:
     return EFI_SUCCESS;\r
   }\r
 \r
-  Ptr += sizeof (EFI_COMMON_SECTION_HEADER);\r
-  SectionLength -= sizeof (EFI_COMMON_SECTION_HEADER);\r
+  Ptr += GetSectionHeaderLength((EFI_COMMON_SECTION_HEADER *)Ptr);\r
+  SectionLength -= GetSectionHeaderLength((EFI_COMMON_SECTION_HEADER *)Ptr);\r
   while (SectionLength > 0) {\r
     printf ("        ");\r
     switch (*Ptr) {\r
@@ -1809,7 +1838,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r