Add GenCrc32 tool, and Update GenFfs tool to add alignment for TeSection.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 21 Nov 2007 03:34:30 +0000 (03:34 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 21 Nov 2007 03:34:30 +0000 (03:34 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@879 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenCrc32/GNUmakefile [new file with mode: 0644]
Source/C/GenCrc32/GenCrc32.c [new file with mode: 0644]
Source/C/GenCrc32/Makefile [new file with mode: 0644]
Source/C/GenFfs/GenFfs.c
Source/C/Makefile

diff --git a/Source/C/GenCrc32/GNUmakefile b/Source/C/GenCrc32/GNUmakefile
new file mode 100644 (file)
index 0000000..73f525c
--- /dev/null
@@ -0,0 +1,10 @@
+ARCH ?= IA32
+MAKEROOT ?= ..
+
+APPNAME = GenCrc32
+
+LIBS = -lCommon
+
+OBJECTS = GenCrc32.o
+
+include $(MAKEROOT)/Makefiles/app.makefile
diff --git a/Source/C/GenCrc32/GenCrc32.c b/Source/C/GenCrc32/GenCrc32.c
new file mode 100644 (file)
index 0000000..d01ccf9
--- /dev/null
@@ -0,0 +1,350 @@
+/*++\r
+\r
+Copyright (c) 2007, Intel Corporation                                              \r
+All rights reserved. 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
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  GenCrc32.c\r
+\r
+Abstract:\r
+  Calculate Crc32 value and Verify Crc32 value for input data.\r
+\r
+--*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "Crc32.h"\r
+#include "EfiUtilityMsgs.h"\r
+\r
+#define UTILITY_NAME            "GenCrc32"\r
+#define UTILITY_MAJOR_VERSION   0\r
+#define UTILITY_MINOR_VERSION   1\r
+\r
+#define CRC32_NULL              0\r
+#define CRC32_ENCODE            1\r
+#define CRC32_DECODE            2 \r
+\r
+VOID\r
+Version (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Displays the standard utility information to SDTOUT\r
+\r
+Arguments:\r
+\r
+  None\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
+}\r
+\r
+VOID\r
+Usage (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Displays the utility usage syntax to STDOUT\r
+\r
+Arguments:\r
+\r
+  None\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  //\r
+  // Summary usage\r
+  //\r
+  fprintf (stdout, "\nUsage: %s -e|-d [options] <input_file>\n\n", UTILITY_NAME);\r
+  \r
+  //\r
+  // Copyright declaration\r
+  // \r
+  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+\r
+  //\r
+  // Details Option\r
+  //\r
+  fprintf (stdout, "Options:\n");\r
+  fprintf (stdout, "  -o FileName, --output FileName\n\\r
+                        File will be created to store the ouput content.\n");\r
+  fprintf (stdout, "  -e, --encode          Calculate CRC32 value for the input file.\n");\r
+  fprintf (stdout, "  -d, --decode          Verify CRC32 value for the input file.\n");\r
+  fprintf (stdout, "  -v, --verbose         Turn on verbose output with informational messages.\n");\r
+  fprintf (stdout, "  -q, --quiet           Disable all messages except key message and fatal error\n");\r
+  fprintf (stdout, "  --debug level         Enable debug messages, at input debug level.\n");\r
+  fprintf (stdout, "  --version             Show program's version number and exit.\n");\r
+  fprintf (stdout, "  -h, --help            Show this help message and exit.\n"); \r
+}\r
+\r
+int\r
+main (\r
+  INT32 argc,\r
+  CHAR8 *argv[]\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Main function.\r
+\r
+Arguments:\r
+\r
+  argc - Number of command line parameters.\r
+  argv - Array of pointers to parameter strings.\r
+\r
+Returns:\r
+  STATUS_SUCCESS - Utility exits successfully.\r
+  STATUS_ERROR   - Some error occurred during execution.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS              Status;\r
+  CHAR8                   *OutputFileName;\r
+  CHAR8                   *InputFileName;\r
+  UINT8                   *FileBuffer;\r
+  UINT32                  FileSize;\r
+  UINT64                  LogLevel;\r
+  UINT8                   FileAction;\r
+  UINT32                  Crc32Value;\r
+  FILE                    *InFile;\r
+  FILE                    *OutFile;\r
+  \r
+  //\r
+  // Init local variables\r
+  //\r
+  LogLevel       = 0;\r
+  Status         = EFI_SUCCESS;\r
+  InputFileName  = NULL;\r
+  OutputFileName = NULL;\r
+  FileAction     = CRC32_NULL;\r
+  InFile         = NULL;\r
+  OutFile        = NULL;\r
+  Crc32Value     = 0;\r
+\r
+  SetUtilityName (UTILITY_NAME);\r
+\r
+  if (argc == 1) {\r
+    Error (NULL, 0, 1001, "Missing options", "no options input");\r
+    Usage ();\r
+    return STATUS_ERROR;\r
+  }\r
+\r
+  //\r
+  // Parse command line\r
+  //\r
+  argc --;\r
+  argv ++;\r
+\r
+  if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
+    Version ();\r
+    Usage ();\r
+    return STATUS_SUCCESS;    \r
+  }\r
+\r
+  if (stricmp (argv[0], "--version") == 0) {\r
+    Version ();\r
+    return STATUS_SUCCESS;    \r
+  }\r
+\r
+  while (argc > 0) {\r
+    if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
+      OutputFileName = argv[1];\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue; \r
+    }\r
+\r
+    if ((stricmp (argv[0], "-e") == 0) || (stricmp (argv[0], "--encode") == 0)) {\r
+      FileAction     = CRC32_ENCODE;\r
+      argc --;\r
+      argv ++;\r
+      continue; \r
+    }\r
+\r
+    if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--decode") == 0)) {\r
+      FileAction     = CRC32_DECODE;\r
+      argc --;\r
+      argv ++;\r
+      continue; \r
+    }\r
+\r
+    if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
+      SetPrintLevel (VERBOSE_LOG_LEVEL);\r
+      VerboseMsg ("Verbose output Mode Set!");\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
+\r
+    if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
+      SetPrintLevel (KEY_LOG_LEVEL);\r
+      KeyMsg ("Quiet output Mode Set!");\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
+\r
+    if (stricmp (argv[0], "--debug") == 0) {\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &LogLevel);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        goto Finish;\r
+      }\r
+      if (LogLevel > 9) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Debug Level range is 0~9, currnt input level is %d", LogLevel);\r
+        goto Finish;\r
+      }\r
+      SetPrintLevel (LogLevel);\r
+      DebugMsg (NULL, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv[1]);\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue;\r
+    }\r
+\r
+    //\r
+    // Get Input file file name.\r
+    //\r
+    InputFileName = argv[0];\r
+    argc --;\r
+    argv ++;\r
+  }\r
+\r
+  VerboseMsg ("%s tool start.", UTILITY_NAME);\r
+  \r
+  //\r
+  // Check Input paramters\r
+  //\r
+  if (FileAction == CRC32_NULL) {\r
+    Error (NULL, 0, 1001, "Missing option", "encode or decode must be specified!");\r
+    return STATUS_ERROR;\r
+  } else if (FileAction == CRC32_ENCODE) {\r
+    VerboseMsg ("File will be encoded by Crc32");\r
+  } else if (FileAction == CRC32_DECODE) {\r
+    VerboseMsg ("File will be decoded by Crc32");\r
+  }\r
+  \r
+  if (InputFileName == NULL) {\r
+    Error (NULL, 0, 1001, "Missing option", "Input files");\r
+    goto Finish;\r
+  } else {\r
+    VerboseMsg ("Input file name is %s", InputFileName);\r
+  }\r
+\r
+  if (OutputFileName == NULL) {\r
+    Error (NULL, 0, 1001, "Missing option", "Output file");\r
+    goto Finish;\r
+  } else {\r
+    VerboseMsg ("Output file name is %s", OutputFileName);\r
+  }\r
+  \r
+  //\r
+  // Open Input file and read file data.\r
+  //\r
+  InFile = fopen (InputFileName, "rb");\r
+  if (InFile == NULL) {\r
+    Error (NULL, 0, 0001, "Error opening file", InputFileName);\r
+    return STATUS_ERROR;\r
+  }\r
+\r
+  fseek (InFile, 0, SEEK_END);\r
+  FileSize = ftell (InFile);\r
+  fseek (InFile, 0, SEEK_SET);\r
+  \r
+  FileBuffer = (UINT8 *) malloc (FileSize);\r
+  if (FileBuffer == NULL) {\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
+    goto Finish;\r
+  }\r
+  \r
+  fread (FileBuffer, 1, FileSize, InFile);\r
+  fclose (InFile);\r
+  VerboseMsg ("the size of the input file is %d bytes", FileSize);\r
+  \r
+  //\r
+  // Open output file\r
+  //\r
+  OutFile = fopen (OutputFileName, "wb");\r
+  if (OutFile == NULL) {\r
+    Error (NULL, 0, 0001, "Error opening file", OutputFileName);\r
+    goto Finish;\r
+  }\r
+  \r
+  //\r
+  // Calculate Crc32 value\r
+  //\r
+  if (FileAction == CRC32_ENCODE) {\r
+    Status = CalculateCrc32 (FileBuffer, FileSize, &Crc32Value);\r
+    if (Status != EFI_SUCCESS) {\r
+      Error (NULL, 0, 3000, "Invalid", "Calculate CRC32 value failed!");\r
+      goto Finish;\r
+    }\r
+    //\r
+    // Done, write output file.\r
+    //\r
+    fwrite (&Crc32Value, 1, sizeof (Crc32Value), OutFile);\r
+    VerboseMsg ("The calculated CRC32 value is 0x%08x", Crc32Value);\r
+    fwrite (FileBuffer, 1, FileSize, OutFile);\r
+    VerboseMsg ("the size of the encoded file is %d bytes", FileSize + sizeof (UINT32));\r
+  } else {\r
+    //\r
+    // Verify Crc32 Value\r
+    //\r
+    Status = CalculateCrc32 (FileBuffer + sizeof (UINT32), FileSize - sizeof (UINT32), &Crc32Value);\r
+    if (Status != EFI_SUCCESS) {\r
+      Error (NULL, 0, 3000, "Invalid", "Calculate CRC32 value failed!");\r
+      goto Finish;\r
+    }\r
+    VerboseMsg ("The calculated CRC32 value is 0x%08x and File Crc32 value is 0x%08x", Crc32Value, *(UINT32 *)FileBuffer);\r
+    if (Crc32Value != *(UINT32 *)FileBuffer) {\r
+      Error (NULL, 0, 3000, "Invalid", "CRC32 value of input file is not correct!");\r
+      Status = STATUS_ERROR;\r
+      goto Finish;\r
+    }\r
+    //\r
+    // Done, write output file.\r
+    //\r
+    fwrite (FileBuffer + sizeof (UINT32), 1, FileSize - sizeof (UINT32), OutFile);\r
+    VerboseMsg ("the size of the decoded file is %d bytes", FileSize - sizeof (UINT32));\r
+  }\r
+\r
+Finish:\r
+  if (FileBuffer != NULL) {\r
+    free (FileBuffer);\r
+  }\r
+  \r
+  if (OutFile != NULL) {\r
+    fclose (OutFile);\r
+  }\r
+  \r
+  VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME, GetUtilityStatus ());\r
+\r
+  return GetUtilityStatus ();\r
+}\r
+\r
+  \r
+  \r
+  \r
diff --git a/Source/C/GenCrc32/Makefile b/Source/C/GenCrc32/Makefile
new file mode 100644 (file)
index 0000000..4639767
--- /dev/null
@@ -0,0 +1,10 @@
+!INCLUDE ..\Makefiles\ms.common
+
+APPNAME = GenCrc32
+
+LIBS = $(LIB_PATH)\Common.lib
+
+OBJECTS = GenCrc32.obj
+
+!INCLUDE ..\Makefiles\ms.app
+
index a65bcad..fb67c37 100644 (file)
@@ -26,6 +26,7 @@ Abstract:
 \r
 #include <Common/UefiBaseTypes.h>\r
 #include <Common/PiFirmwareFile.h>\r
+#include <IndustryStandard/PeImage.h>\r
 \r
 #include "CommonLib.h"\r
 #include "EfiUtilityMsgs.h"\r
@@ -186,7 +187,7 @@ Returns:
   }\r
   for (Index = 0; Index < sizeof (mAlignName) / sizeof (CHAR8 *); Index ++) {\r
     if (stricmp (AlignBuffer, mAlignName [Index]) == 0) {\r
-      *AlignNumber = Index;\r
+      *AlignNumber = 1 << Index;\r
       return EFI_SUCCESS;\r
     }\r
   }\r
@@ -275,10 +276,14 @@ Returns:
   UINT32                     Index;\r
   FILE                       *InFile;\r
   EFI_COMMON_SECTION_HEADER  *SectHeader;\r
+  EFI_COMMON_SECTION_HEADER  TempSectHeader;\r
+  EFI_TE_IMAGE_HEADER        TeHeader;\r
+  UINT32                     TeOffset;\r
 \r
   Size          = 0;\r
   Offset        = 0;\r
-  *MaxAlignment = 0;\r
+  TeOffset      = 0;\r
+\r
   //\r
   // Go through our array of file names and copy their contents\r
   // to the output buffer.\r
@@ -294,18 +299,55 @@ Returns:
     //\r
     // Get the Max alignment of all input file datas\r
     //\r
-    if (*MaxAlignment < (1 << InputFileAlign [Index])) {\r
-      *MaxAlignment = 1 << InputFileAlign [Index];\r
+    if (*MaxAlignment < InputFileAlign [Index]) {\r
+      *MaxAlignment = InputFileAlign [Index];\r
     }\r
-    \r
+\r
+    // \r
+    // Open file and read contents\r
+    //\r
+    InFile = fopen (InputFileName[Index], "rb");\r
+    if (InFile == NULL) {\r
+      Error (NULL, 0, 0001, "Error opening file", InputFileName[Index]);\r
+      return EFI_ABORTED;\r
+    }\r
+\r
+    fseek (InFile, 0, SEEK_END);\r
+    FileSize = ftell (InFile);\r
+    fseek (InFile, 0, SEEK_SET);\r
+    DebugMsg (NULL, 0, 9, "Input section files", \r
+              "the input section name is %s and the size is %d bytes", InputFileName[Index], FileSize); \r
+\r
+    //\r
+    // Check this section is Te section\r
+    //\r
+    TeOffset = 0;\r
+    fread (&TempSectHeader, 1, sizeof (TempSectHeader), InFile);\r
+    if (TempSectHeader.Type == EFI_SECTION_TE) {\r
+      fread (&TeHeader, 1, sizeof (TeHeader), InFile);\r
+      if (TeHeader.Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
+        TeOffset = TeHeader.StrippedSize - sizeof (TeHeader);\r
+      }\r
+    }\r
+    fseek (InFile, 0, SEEK_SET);\r
+\r
+    //\r
+    // Revert TeOffset to the converse value relative to Alignment\r
+    // This is to assure the original PeImage Header at Alignment.\r
+    //\r
+    if ((TeOffset != 0) && (InputFileAlign [Index] != 0)) {\r
+      TeOffset = InputFileAlign [Index] - (TeOffset % InputFileAlign [Index]);\r
+      TeOffset = TeOffset % InputFileAlign [Index];\r
+    }\r
+     \r
     //\r
     // make sure section data meet its alignment requirement by adding one raw pad section.\r
     // But the different sections have the different section header. Necessary or not?\r
     // Based on section type to adjust offset? Todo\r
     //\r
-    if (((Size + sizeof (EFI_COMMON_SECTION_HEADER)) % (1 << InputFileAlign [Index])) != 0) {\r
-      Offset = ((Size + 2 * sizeof (EFI_COMMON_SECTION_HEADER) + (1 << InputFileAlign [Index]) - 1) & ~((1 << InputFileAlign [Index]) - 1)) - Size;\r
-      Offset = Offset - sizeof (EFI_COMMON_SECTION_HEADER);\r
+    if ((InputFileAlign [Index] != 0) && (((Size + sizeof (EFI_COMMON_SECTION_HEADER) + TeOffset) % InputFileAlign [Index]) != 0)) {\r
+      Offset = (Size + 2 * sizeof (EFI_COMMON_SECTION_HEADER) + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);\r
+      Offset = Offset - Size - sizeof (EFI_COMMON_SECTION_HEADER) - TeOffset;\r
        \r
       if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {\r
         SectHeader          = (EFI_COMMON_SECTION_HEADER *) (FileBuffer + Size);\r
@@ -319,21 +361,6 @@ Returns:
 \r
       Size = Size + Offset;\r
     }\r
-    \r
-    // \r
-    // Open file and read contents\r
-    //\r
-    InFile = fopen (InputFileName[Index], "rb");\r
-    if (InFile == NULL) {\r
-      Error (NULL, 0, 0001, "Error opening file", InputFileName[Index]);\r
-      return EFI_ABORTED;\r
-    }\r
-\r
-    fseek (InFile, 0, SEEK_END);\r
-    FileSize = ftell (InFile);\r
-    fseek (InFile, 0, SEEK_SET);\r
-    DebugMsg (NULL, 0, 9, "Input section files", \r
-              "the input section name is %s and the size is %d bytes", InputFileName[Index], FileSize); \r
 \r
     //\r
     // Now read the contents of the file into the buffer\r
@@ -675,7 +702,13 @@ Returns:
   }\r
   VerboseMsg ("FFS file alignment is %s", mFfsValidAlignName[FfsAlign]);\r
   for (Index = 0; Index < InputFileNum; Index ++) {\r
-    VerboseMsg ("the %dth input section name is %s and section alignment is %d", Index, InputFileName[Index], 1 << InputFileAlign[Index]);\r
+    if (InputFileAlign[Index] == 0) {\r
+      //\r
+      // Minimum alignment is 1 byte.\r
+      //\r
+      InputFileAlign[Index] = 1;\r
+    }\r
+    VerboseMsg ("the %dth input section name is %s and section alignment is %d", Index, InputFileName[Index], InputFileAlign[Index]);\r
   }\r
 \r
   //\r
index 5a932e0..10dadec 100644 (file)
@@ -3,7 +3,7 @@ ARCH = IA32
 !INCLUDE Makefiles\ms.common
 
 LIBRARIES = Common
-APPLICATIONS = GenFw GenSec GenFv GenFfs GenVtf EfiRom TianoCompress Split GenBootSector BootSectImage EfiLdrImage GenPage VfrCompile
+APPLICATIONS = GenFw GenSec GenFv GenFfs GenVtf EfiRom TianoCompress Split GenBootSector BootSectImage EfiLdrImage GenPage VfrCompile GenCrc32
 
 all: libs apps install