]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Sample/Tools/Source/GenFfsFile/GenFfsFile.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / GenFfsFile / GenFfsFile.c
index d4053671f5ae9bbe43c181c33499a731ddae45df..269a5b81cb9c9eb4d163571fc5ff14819de1ed52 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
-Copyright (c) 2004 - 2007, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2010, 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
@@ -43,7 +43,7 @@ Abstract:
 #include "SimpleFileParsing.h"\r
 \r
 #define UTILITY_NAME    "GenFfsFile"\r
-#define TOOLVERSION     "0.32"\r
+#define UTILITY_VERSION "v1.1"\r
 #define MAX_ARRAY_SIZE  100\r
 \r
 static\r
@@ -123,6 +123,7 @@ static struct {
   UINT8   BuildDirectory[_MAX_PATH];\r
   UINT8   PrimaryPackagePath[_MAX_PATH];\r
   UINT8   OverridePackagePath[_MAX_PATH];\r
+  UINT8   OutputFilePath[_MAX_PATH];\r
   BOOLEAN Verbose;\r
   MACRO   *MacroList;\r
 } mGlobals;\r
@@ -187,22 +188,33 @@ Returns:
 \r
 --*/\r
 {\r
-  printf ("Usage:\n");\r
-  printf (UTILITY_NAME " -b \"build directory\" -p1 \"package1.inf\" -p2 \"package2.inf\"\n");\r
-  printf ("           -d \"name=value\" -v\n");\r
-  printf ("   -b \"build directory\":\n");\r
-  printf ("       specifies the full path to the component build directory.\n");\r
-  printf ("   -p1 \"P1_path\":\n");\r
-  printf ("       specifies fully qualified file name to the primary package file.\n");\r
-  printf ("       This file will normally exist in the same directory as the makefile\n");\r
-  printf ("       for the component. Required.\n");\r
-  printf ("   -p2 \"P2_path\":\n");\r
-  printf ("       specifies fully qualified file name to the override package file.\n");\r
-  printf ("       This file will normally exist in the build tip. Optional.\n");\r
-  printf ("   -d \"name=value\":\n");\r
-  printf ("       add a macro definition for package file. Optional.\n");\r
-  printf ("   -v :\n");\r
-  printf ("       verbose. Optional.\n");\r
+  int         Index;\r
+  const char  *Str[] = {\r
+    UTILITY_NAME" "UTILITY_VERSION" - Intel Generate FFS File Utility",\r
+    "  Copyright (C), 2004 - 2009 Intel Corporation",\r
+    \r
+#if ( defined(UTILITY_BUILD) && defined(UTILITY_VENDOR) )\r
+    "  Built from "UTILITY_BUILD", project of "UTILITY_VENDOR,\r
+#endif\r
+    "",\r
+    "Usage:",\r
+    "  "UTILITY_NAME" [OPTION]...",\r
+    "Options:",\r
+    "  -b BuildDirectory  Specifies the full path to the component build directory",\r
+    "  -p1 P1Path         Specifies fully qualified file name to the primary package",\r
+    "                     file. This file will normally exist in the same directory",\r
+    "                     as the makefile for the component. Required.",\r
+    "  -p2 P2Path         Specifies fully qualified file name to the override",\r
+    "                     package. This file will normally exist in the build tip.",\r
+    "                     Optional.",\r
+    "  -d Name=Value      Add a macro definition for the package file. Optional.",\r
+    "  -o OutputFile      Specifies the file name of output file. Optional.",\r
+    "  -v                 Verbose. Optional.",\r
+    NULL\r
+  };\r
+  for (Index = 0; Str[Index] != NULL; Index++) {\r
+    fprintf (stdout, "%s\n", Str[Index]);\r
+  }\r
 }\r
 \r
 static\r
@@ -2160,54 +2172,64 @@ here:
       StripQuotes (BaseName);\r
     }\r
 \r
-    if (BaseName[0] != 0) {\r
-      sprintf (InputString, "%s-%s", GuidString, BaseName);\r
+    if (mGlobals.OutputFilePath[0]) {\r
+      //\r
+      // Use user specified output file name\r
+      //\r
+      strcpy (InputString, mGlobals.OutputFilePath);\r
     } else {\r
-      strcpy (InputString, GuidString);\r
-    }\r
+      //\r
+      // Construct the output file name according to FileType\r
+      //\r
+      if (BaseName[0] != 0) {\r
+        sprintf (InputString, "%s-%s", GuidString, BaseName);\r
+      } else {\r
+        strcpy (InputString, GuidString);\r
+      }\r
 \r
-    switch (StringToType (FileType)) {\r
+      switch (StringToType (FileType)) {\r
 \r
-    case EFI_FV_FILETYPE_SECURITY_CORE:\r
-      strcat (InputString, ".SEC");\r
-      break;\r
+      case EFI_FV_FILETYPE_SECURITY_CORE:\r
+        strcat (InputString, ".SEC");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_PEIM:\r
-    case EFI_FV_FILETYPE_PEI_CORE:\r
-    case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:\r
-      strcat (InputString, ".PEI");\r
-      break;\r
+      case EFI_FV_FILETYPE_PEIM:\r
+      case EFI_FV_FILETYPE_PEI_CORE:\r
+      case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:\r
+        strcat (InputString, ".PEI");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_DRIVER:\r
-    case EFI_FV_FILETYPE_DXE_CORE:\r
-      strcat (InputString, ".DXE");\r
-      break;\r
+      case EFI_FV_FILETYPE_DRIVER:\r
+      case EFI_FV_FILETYPE_DXE_CORE:\r
+        strcat (InputString, ".DXE");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_APPLICATION:\r
-      strcat (InputString, ".APP");\r
-      break;\r
+      case EFI_FV_FILETYPE_APPLICATION:\r
+        strcat (InputString, ".APP");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:\r
-      strcat (InputString, ".FVI");\r
-      break;\r
+      case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:\r
+        strcat (InputString, ".FVI");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_RAW:\r
-      strcat (InputString, ".RAW");\r
-      break;\r
+      case EFI_FV_FILETYPE_RAW:\r
+        strcat (InputString, ".RAW");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_ALL:\r
-      Error (mGlobals.OverridePackagePath, 1, 0, "invalid FFS file type for this utility", NULL);\r
-      goto Done;\r
+      case EFI_FV_FILETYPE_ALL:\r
+        Error (mGlobals.OverridePackagePath, 1, 0, "invalid FFS file type for this utility", NULL);\r
+        goto Done;\r
 \r
-    default:\r
-      strcat (InputString, ".FFS");\r
-      break;\r
+      default:\r
+        strcat (InputString, ".FFS");\r
+        break;\r
+      }\r
     }\r
 \r
     if (ForceUncompress) {\r
       strcat (InputString, ".ORG");\r
     }\r
-\r
+       \r
     Out = fopen (InputString, "wb");\r
     if (Out == NULL) {\r
       Error (NULL, 0, 0, InputString, "could not open output file for writing");\r
@@ -2242,7 +2264,11 @@ here:
                                                   sizeof (EFI_FFS_FILE_HEADER)\r
                                                   );\r
     if (FileHeader.Attributes & FFS_ATTRIB_CHECKSUM) {\r
+#if (PI_SPECIFICATION_VERSION < 0x00010000)  \r
       FileHeader.IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) &FileHeader, FileSize);\r
+#else\r
+      FileHeader.IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) ((UINTN)&FileHeader + sizeof (EFI_FFS_FILE_HEADER)), FileSize - sizeof (EFI_FFS_FILE_HEADER));\r
+#endif\r
     } else {\r
       FileHeader.IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
     }\r
@@ -2307,48 +2333,58 @@ here:
       StripQuotes (BaseName);\r
     }\r
 \r
-    if (BaseName[0] != 0) {\r
-      sprintf (InputString, "%s-%s", GuidString, BaseName);\r
+    if (mGlobals.OutputFilePath[0]) {\r
+      //\r
+      // Use user specified output file name\r
+      //\r
+      strcpy (InputString, mGlobals.OutputFilePath);\r
     } else {\r
-      strcpy (InputString, GuidString);\r
-    }\r
+      //\r
+      // Construct the output file name according to FileType\r
+      //\r
+      if (BaseName[0] != 0) {\r
+        sprintf (InputString, "%s-%s", GuidString, BaseName);\r
+      } else {\r
+        strcpy (InputString, GuidString);\r
+      }\r
 \r
-    switch (StringToType (FileType)) {\r
+      switch (StringToType (FileType)) {\r
 \r
-    case EFI_FV_FILETYPE_SECURITY_CORE:\r
-      strcat (InputString, ".SEC");\r
-      break;\r
+      case EFI_FV_FILETYPE_SECURITY_CORE:\r
+        strcat (InputString, ".SEC");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_PEIM:\r
-    case EFI_FV_FILETYPE_PEI_CORE:\r
-    case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:\r
-      strcat (InputString, ".PEI");\r
-      break;\r
+      case EFI_FV_FILETYPE_PEIM:\r
+      case EFI_FV_FILETYPE_PEI_CORE:\r
+      case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:\r
+        strcat (InputString, ".PEI");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_DRIVER:\r
-    case EFI_FV_FILETYPE_DXE_CORE:\r
-      strcat (InputString, ".DXE");\r
-      break;\r
+      case EFI_FV_FILETYPE_DRIVER:\r
+      case EFI_FV_FILETYPE_DXE_CORE:\r
+        strcat (InputString, ".DXE");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_APPLICATION:\r
-      strcat (InputString, ".APP");\r
-      break;\r
+      case EFI_FV_FILETYPE_APPLICATION:\r
+        strcat (InputString, ".APP");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:\r
-      strcat (InputString, ".FVI");\r
-      break;\r
+      case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:\r
+        strcat (InputString, ".FVI");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_RAW:\r
-      strcat (InputString, ".RAW");\r
-      break;\r
+      case EFI_FV_FILETYPE_RAW:\r
+        strcat (InputString, ".RAW");\r
+        break;\r
 \r
-    case EFI_FV_FILETYPE_ALL:\r
-      Error (mGlobals.PrimaryPackagePath, 1, 0, "invalid FFS file type for this utility", NULL);\r
-      goto Done;\r
+      case EFI_FV_FILETYPE_ALL:\r
+        Error (mGlobals.PrimaryPackagePath, 1, 0, "invalid FFS file type for this utility", NULL);\r
+        goto Done;\r
 \r
-    default:\r
-      strcat (InputString, ".FFS");\r
-      break;\r
+      default:\r
+        strcat (InputString, ".FFS");\r
+        break;\r
+      }\r
     }\r
 \r
     if (ForceUncompress) {\r
@@ -2624,6 +2660,23 @@ Returns:
       OriginalOverridePackagePath = Argv[1];\r
       Argc--;\r
       Argv++;\r
+    } else if (_strcmpi (Argv[0], "-o") == 0) {\r
+      //\r
+      // OPTION: -o OutputFilePath\r
+      // Make sure there is another argument, then save it to out globals.\r
+      //\r
+      if (Argc < 2) {\r
+        Error (NULL, 0, 0, Argv[0], "option requires the output file name");\r
+        return STATUS_ERROR;\r
+      }\r
+      if (mGlobals.OutputFilePath[0]) {\r
+        Error (NULL, 0, 0, Argv[0], "option can only be specified once");\r
+        return STATUS_ERROR;\r
+      }\r
+\r
+      strcpy (mGlobals.OutputFilePath, Argv[1]);\r
+      Argc--;\r
+      Argv++;\r
     } else if (_strcmpi (Argv[0], "-v") == 0) {\r
       //\r
       // OPTION: -v       verbose\r