Add the checking to the input parameter of tools.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 25 May 2009 05:53:25 +0000 (05:53 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 25 May 2009 05:53:25 +0000 (05:53 +0000)
Support the tool parameter options according to tool user manual.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1596 7335b38e-4728-0410-8992-fb3ffe349368

16 files changed:
Source/C/Common/EfiUtilityMsgs.c
Source/C/Common/ParseInf.c
Source/C/EfiRom/EfiRom.c
Source/C/GenBootSector/GenBootSector.c
Source/C/GenCrc32/GenCrc32.c
Source/C/GenFfs/GenFfs.c
Source/C/GenFv/GenFv.c
Source/C/GenFv/GenFvInternalLib.c
Source/C/GenFv/GenFvInternalLib.h
Source/C/GenFw/GenFw.c
Source/C/GenPage/GenPage.c
Source/C/GenVtf/GenVtf.c
Source/C/GnuGenBootSector/GnuGenBootSector.c
Source/C/TianoCompress/TianoCompress.c
Source/C/VfrCompile/VfrCompiler.cpp
Source/C/VfrCompile/VfrCompiler.h

index 7f55155..9d697da 100644 (file)
@@ -524,7 +524,7 @@ Notes:
   // message for you. It has to be decimal digits too.\r
   //\r
   if (MessageCode != 0) {\r
-    sprintf (Line2, ": %s %04X", Type, MessageCode);\r
+    sprintf (Line2, ": %s %04d", Type, MessageCode);\r
   } else {\r
     sprintf (Line2, ": %s", Type);\r
   }\r
index 92a53d7..8305f14 100644 (file)
@@ -390,7 +390,7 @@ Returns:
   //\r
   // Check Guid Format strictly xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r
   //\r
-  for (Index = 0; Index < 36; Index ++) {\r
+  for (Index = 0; AsciiGuidBuffer[Index] != '\0' && Index < 37; Index ++) {\r
     if (Index == 8 || Index == 13 || Index == 18 || Index == 23) {\r
       if (AsciiGuidBuffer[Index] != '-') {\r
         break;\r
@@ -406,7 +406,7 @@ Returns:
     }\r
   }\r
   \r
-  if (Index < 36) {\r
+  if (Index < 36 || AsciiGuidBuffer[36] != '\0') {\r
     Error (NULL, 0, 1003, "Invalid option value", "Incorrect GUID \"%s\"\n  Correct Format \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"", AsciiGuidBuffer);\r
     return EFI_ABORTED;\r
   }\r
index 732b3b5..3afcbfb 100644 (file)
@@ -618,7 +618,7 @@ Returns:
     PciDs30.DeviceId  = DevId;\r
     PciDs30.DeviceListOffset = 0; // to be fixed\r
     PciDs30.Length    = (UINT16) sizeof (PCI_3_0_DATA_STRUCTURE);\r
-    PciDs30.Revision  = 0;\r
+    PciDs30.Revision  = 0x3;\r
     //\r
     // Class code and code revision from the command line (optional)\r
     //\r
@@ -860,13 +860,13 @@ Returns:
 --*/\r
 {\r
   FILE_LIST *FileList;\r
-\r
   FILE_LIST *PrevFileList;\r
   UINT32    FileFlags;\r
   UINT32    ClassCode;\r
   UINT32    CodeRevision;\r
   EFI_STATUS Status;\r
   BOOLEAN    EfiRomFlag;\r
+  UINT64     TempValue;\r
 \r
   FileFlags = 0;\r
   EfiRomFlag = FALSE;\r
@@ -897,13 +897,12 @@ Returns:
     return STATUS_ERROR;\r
   }\r
   \r
-  if ((strcmp(Argv[0], "-h") == 0) || (strcmp(Argv[0], "--help") == 0) ||\r
-      (strcmp(Argv[0], "-?") == 0) || (strcmp(Argv[0], "/?") == 0)) {\r
+  if ((stricmp(Argv[0], "-h") == 0) || (stricmp(Argv[0], "--help") == 0)) {\r
     Usage();\r
     return STATUS_ERROR;\r
   }\r
   \r
-  if ((strcmp(Argv[0], "--version") == 0)) {\r
+  if ((stricmp(Argv[0], "--version") == 0)) {\r
     Version();\r
     return STATUS_ERROR;\r
   }\r
@@ -912,12 +911,7 @@ Returns:
   // Process until no more arguments\r
   //\r
   while (Argc > 0) {\r
-    if ((Argv[0][0] == '-') || (Argv[0][0] == '/')) {\r
-      //\r
-      // To simplify string comparisons, replace slashes with dashes\r
-      //\r
-      Argv[0][0] = '-';\r
-            \r
+    if (Argv[0][0] == '-') {\r
       //\r
       // Vendor ID specified with -f\r
       //\r
@@ -925,14 +919,17 @@ Returns:
         //\r
         // Make sure there's another parameter\r
         //\r
-        if ((Argc > 1) && (Argv[1][0] != '-')) {\r
-          Options->VendId       = (UINT16) strtol (Argv[1], NULL, 16);\r
-          Options->VendIdValid  = 1;\r
-        } else {\r
-               Error (NULL, 0, 2000, "Invalid parameter", "Missing Vendor ID with %s option!", Argv[0]);\r
-          Usage ();\r
-          return STATUS_ERROR;\r
+        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);\r
+          return 1;\r
+        }\r
+        if (TempValue >= 0x10000) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "Vendor Id %s out of range!", Argv[1]);\r
+          return 1;\r
         }\r
+        Options->VendId       = (UINT16) TempValue;\r
+        Options->VendIdValid  = 1;\r
 \r
         Argv++;\r
         Argc--;\r
@@ -941,14 +938,17 @@ Returns:
         // Device ID specified with -i\r
         // Make sure there's another parameter\r
         //\r
-        if ((Argc > 1) && (Argv[1][0] != '-')) {\r
-          Options->DevId      = (UINT16) strtol (Argv[1], NULL, 16);\r
-          Options->DevIdValid = 1;\r
-        } else {\r
-          Error (NULL, 0, 2000, "Invalid parameter", "Missing Device ID with %s option!", Argv[0]);\r
-          Usage ();\r
-          return STATUS_ERROR;\r
+        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);\r
+          return 1;\r
         }\r
+        if (TempValue >= 0x10000) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "Device Id %s out of range!", Argv[1]);\r
+          return 1;\r
+        }\r
+        Options->DevId      = (UINT16) TempValue;\r
+        Options->DevIdValid = 1;\r
 \r
         Argv++;\r
         Argc--;\r
@@ -957,17 +957,15 @@ Returns:
         // Output filename specified with -o\r
         // Make sure there's another parameter\r
         //\r
-        if (Argc > 1) {\r
-          strcpy (Options->OutFileName, Argv[1]);\r
-        } else {\r
-          Error (NULL, 0, 2000, "Invalid parameter", "Missing output file name with %s!", Argv[0]);\r
-          Usage ();\r
+        if (Argv[1] == NULL || Argv[1][0] == '-') {\r
+          Error (NULL, 0, 2000, "Invalid parameter", "Missing output file name with %s option!", Argv[0]);\r
           return STATUS_ERROR;\r
         }\r
+        strcpy (Options->OutFileName, Argv[1]);\r
 \r
         Argv++;\r
         Argc--;\r
-      } else if ((stricmp (Argv[0], "-h") == 0) || (strcmp (Argv[0], "-?") == 0)) {\r
+      } else if ((stricmp (Argv[0], "-h") == 0) || (stricmp (Argv[0], "--help") == 0)) {\r
         //\r
         // Help option\r
         //\r
@@ -997,10 +995,13 @@ Returns:
         //\r
         Options->Verbose = 1;\r
       } else if (stricmp (Argv[0], "--debug") == 0) {\r
-        Argv++;\r
-        Status = AsciiStringToUint64(Argv[0], FALSE, &DebugLevel);\r
-        if (DebugLevel > 9 || DebugLevel < 0) {\r
-          Error (NULL, 0, 2000, "Invalid parameter", "Unrecognized parameter %s\n", Argv[0]);\r
+        Status = AsciiStringToUint64(Argv[1], FALSE, &DebugLevel);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);\r
+          return 1;\r
+        }\r
+        if (DebugLevel > 9)  {\r
+          Error (NULL, 0, 2000, "Invalid option value", "Debug Level range is 0-9, currnt input level is %d", Argv[1]);\r
           return 1;\r
         }\r
         if (DebugLevel>=5 && DebugLevel<=9) {\r
@@ -1008,6 +1009,7 @@ Returns:
         } else {\r
           Options->Debug = FALSE;\r
         }\r
+        Argv++;\r
         Argc--;\r
       } else if ((stricmp (Argv[0], "--quiet") == 0) || (stricmp (Argv[0], "-q") == 0)) {\r
         Options->Quiet = TRUE;\r
@@ -1027,26 +1029,19 @@ Returns:
         // Class code value for the next file in the list.\r
         // Make sure there's another parameter\r
         //\r
-        if ((Argc > 1) && (Argv[1][0] != '-')) {\r
-          //\r
-          // No error checking on the return value. Could check for LONG_MAX,\r
-          // LONG_MIN, or 0 class code value if desired. Check range (3 bytes)\r
-          // at least.\r
-          //\r
-          ClassCode = (UINT32) strtol (Argv[1], NULL, 16);\r
-          if (ClassCode & 0xFF000000) {\r
-            Error (NULL, 0, 2000, "Invalid parameter", "Class code %s out of range!", Argv[1]);\r
-            return STATUS_ERROR;\r
-          }\r
-          if (FileList != NULL && FileList->ClassCode == 0) {\r
-            FileList->ClassCode = ClassCode;\r
-          }\r
-        } else {\r
-               Error (NULL, 0, 2000, "Invalid parameter", "Missing class code value with %s option!", Argv[0]);\r
-          Usage ();\r
+        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);\r
+          return 1;\r
+        }\r
+        ClassCode = (UINT32) TempValue;\r
+        if (ClassCode & 0xFF000000) {\r
+          Error (NULL, 0, 2000, "Invalid parameter", "Class code %s out of range!", Argv[1]);\r
           return STATUS_ERROR;\r
         }\r
-\r
+        if (FileList != NULL && FileList->ClassCode == 0) {\r
+          FileList->ClassCode = ClassCode;\r
+        }\r
         Argv++;\r
         Argc--;\r
       } else if ((stricmp (Argv[0], "-r") == 0) || (stricmp (Argv[0], "--Revision") == 0)) {\r
@@ -1055,39 +1050,28 @@ Returns:
         // file in the list.\r
         // Make sure there's another parameter\r
         //\r
-        if (Argc > 1) {\r
-          if (Argv[1][0] != '-') {\r
-            //\r
-            // No error checking on the return value. Could check for LONG_MAX,\r
-            // LONG_MIN, or 0 value if desired. Check range (2 bytes)\r
-            // at least.\r
-            //\r
-            CodeRevision = (UINT32) strtol (Argv[1], NULL, 16);\r
-            if (CodeRevision & 0xFFFF0000) {\r
-              Error (NULL, 0, 2000, "Invalid parameter", "Code revision %s out of range!", Argv[1]);\r
-              return STATUS_ERROR;\r
-            }\r
-\r
-            Argv++;\r
-            Argc--;\r
-\r
-            if (FileList != NULL && FileList->CodeRevision == 0) {\r
-              FileList->CodeRevision = (UINT16) CodeRevision;\r
-            }\r
-          }\r
-        } else {\r
-               Error (NULL, 0, 2000, "Invalid parameter", "Missing code revision value with %s option!", Argv[0]);\r
-          Usage ();\r
+        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);\r
+          return 1;\r
+        }\r
+        CodeRevision = (UINT32) TempValue;\r
+        if (CodeRevision & 0xFFFF0000) {\r
+          Error (NULL, 0, 2000, "Invalid parameter", "Code revision %s out of range!", Argv[1]);\r
           return STATUS_ERROR;\r
         }\r
-      } else if ((stricmp (Argv[0], "-p") == 0) || (stricmp (Argv[0], "-pci23") == 0)) {\r
+        if (FileList != NULL && FileList->CodeRevision == 0) {\r
+          FileList->CodeRevision = (UINT16) CodeRevision;\r
+        }\r
+        Argv++;\r
+        Argc--;\r
+      } else if ((stricmp (Argv[0], "-p") == 0) || (stricmp (Argv[0], "--pci23") == 0)) {\r
         //\r
         // Default layout meets PCI 3.0 specifications, specifying this flag will for a PCI 2.3 layout.\r
         //\r
-        mOptions.Pci23 = 1; \r
+        mOptions.Pci23 = 1;\r
       } else {\r
         Error (NULL, 0, 2000, "Invalid parameter", "Invalid option specified: %s", Argv[0]);\r
-        Usage ();\r
         return STATUS_ERROR;\r
       }\r
     } else {\r
@@ -1102,7 +1086,7 @@ Returns:
       //\r
       // Check Efi Option RomImage\r
       //\r
-      if ((FileFlags & FILE_FLAG_EFI) != 0) {\r
+      if ((FileFlags & FILE_FLAG_EFI) == FILE_FLAG_EFI) {\r
         EfiRomFlag = TRUE;\r
       }\r
       //\r
@@ -1149,7 +1133,6 @@ Returns:
   //\r
   if (Options->FileList == NULL) {\r
     Error (NULL, 0, 2000, "Invalid parameter", "Missing input file name!");\r
-    Usage ();\r
     return STATUS_ERROR;\r
   }\r
 \r
@@ -1164,7 +1147,6 @@ Returns:
   \r
     if (!Options->DevIdValid) {\r
       Error (NULL, 0, 2000, "Missing Device ID in command line", NULL);\r
-      Usage ();\r
       return STATUS_ERROR;\r
     }\r
   }\r
@@ -1224,7 +1206,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -1240,22 +1222,20 @@ Returns:
             Legacy binary files.\n");\r
   fprintf (stdout, "  -l ClassCode\n\\r
             Hex ClassCode in the PCI data structure header.\n");\r
-  fprintf (stdout, "  -r Rev\n\\r
-            hex Revision in the PCI data structure header.\n");\r
-  fprintf (stdout, "  -n\n\\r
-            not to automatically set the LAST bit in the last file.\n");\r
+  fprintf (stdout, "  -r Rev    Hex Revision in the PCI data structure header.\n");\r
+  fprintf (stdout, "  -n        Not to automatically set the LAST bit in the last file.\n");\r
   fprintf (stdout, "  -f VendorId\n\\r
             Hex PCI Vendor ID for the device OpROM.\n");\r
   fprintf (stdout, "  -i DeviceId\n\\r
             Hex PCI Device ID for the device OpROM.\n");\r
   fprintf (stdout, "  -p, --pci23\n\\r
-            Default layout meets PCI 3.0 specifications, specifying this flag will for a PCI 2.3 layout.\n");\r
+            Default layout meets PCI 3.0 specifications\n\\r
+            specifying this flag will for a PCI 2.3 layout.\n");\r
   fprintf (stdout, "  -d, --dump\n\\r
             Dump the headers of an existing option ROM image.\n");\r
   fprintf (stdout, "  -v, --verbose\n\\r
             Turn on verbose output with informational messages.\n");\r
-  fprintf (stdout, "  --version\n\\r
-            Show program's version number and exit.\n");\r
+  fprintf (stdout, "  --version Show program's version number and exit.\n");\r
   fprintf (stdout, "  -h, --help\n\\r
             Show this help message and exit.\n");\r
   fprintf (stdout, "  -q, --quiet\n\\r
index 1a0e060..58e10d4 100644 (file)
@@ -24,6 +24,7 @@ Abstract:
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <string.h>\r
+#include <Common/UefiBaseTypes.h>\r
 \r
 //\r
 // Utility Name\r
@@ -255,8 +256,7 @@ Routine Description:
             DriveInfo.VolumeLetter,\r
             DriveInfo.DriveType->Description\r
             );\r
-        }\r
-        else {\r
+        } else {\r
           fprintf (\r
             stdout,\r
             "%c: - DiskNum: %d, Type: %s\n", \r
@@ -541,7 +541,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d -Utility to retrieve and update the boot sector or MBR.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 2009 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 VOID\r
@@ -640,12 +640,16 @@ main (
   CHAR *argv[]\r
   )\r
 {\r
-  CHAR          *AppName;\r
-  INT           Index;\r
-  BOOL          ProcessMbr;\r
+  CHAR8         *AppName;\r
+  INTN          Index;\r
+  BOOLEAN       ProcessMbr;\r
   ERROR_STATUS  Status;\r
+  EFI_STATUS    EfiStatus;\r
   PATH_INFO     InputPathInfo = {0};\r
   PATH_INFO     OutputPathInfo = {0};\r
+  UINT64        LogLevel;\r
+\r
+  SetUtilityName (UTILITY_NAME);\r
 \r
   AppName = *argv;\r
   argv ++;\r
@@ -662,32 +666,84 @@ main (
   // Parse command line\r
   //\r
   for (Index = 0; Index < argc; Index ++) {\r
-    if ((stricmp (argv[Index], "-l") == 0) || (stricmp (argv[0], "--list") == 0)) {\r
+    if ((stricmp (argv[Index], "-l") == 0) || (stricmp (argv[Index], "--list") == 0)) {\r
       ListDrive ();\r
       return 0;\r
-    }\r
-    else if ((stricmp (argv[Index], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
+    } else if ((stricmp (argv[Index], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
       ProcessMbr = TRUE;\r
-    }\r
-    else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
+    } else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
       InputPathInfo.Path  = argv[Index + 1];\r
       InputPathInfo.Input = TRUE;\r
+      if (InputPathInfo.Path == NULL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Input file name can't be NULL");\r
+        return 1;\r
+      } \r
+      if (InputPathInfo.Path[0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Input file is missing");\r
+        return 1;       \r
+      }\r
       ++Index;\r
-    }\r
-    else if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
+    } else if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
       OutputPathInfo.Path  = argv[Index + 1];\r
       OutputPathInfo.Input = FALSE;\r
+      if (OutputPathInfo.Path == NULL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file name can't be NULL");\r
+        return 1;\r
+      } \r
+      if (OutputPathInfo.Path[0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file is missing");\r
+        return 1;       \r
+      }\r
       ++Index;\r
-    }\r
-    else {\r
+    } else if ((stricmp (argv[Index], "-h") == 0) || (stricmp (argv[Index], "--help") == 0)) {\r
       PrintUsage ();\r
+      return 0;\r
+    } else if (stricmp (argv[Index], "--version") == 0) {\r
+      Version ();\r
+      return 0;\r
+    } if ((stricmp (argv[Index], "-v") == 0) || (stricmp (argv[Index], "--verbose") == 0)) {\r
+      continue;\r
+    } if ((stricmp (argv[Index], "-q") == 0) || (stricmp (argv[Index], "--quiet") == 0)) {\r
+      continue;\r
+    } else if ((stricmp (argv[Index], "-d") == 0) || (stricmp (argv[Index], "--debug") == 0)) {\r
+      EfiStatus = AsciiStringToUint64 (argv[Index + 1], FALSE, &LogLevel);\r
+      if (EFI_ERROR (EfiStatus)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[Index], argv[Index + 1]);\r
+        return 1;\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
+        return 1;\r
+      }\r
+      SetPrintLevel (LogLevel);\r
+      DebugMsg (NULL, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv[Index + 1]);\r
+      ++Index;\r
+    } else {\r
+      //\r
+      // Don't recognize the parameter.\r
+      //\r
+      Error (NULL, 0, 1000, "Unknown option", "%s", argv[Index]);\r
       return 1;\r
     }\r
   }\r
+  \r
+  if (InputPathInfo.Path == NULL) {\r
+    Error (NULL, 0, 1001, "Missing options", "Input file is missing");\r
+    return 1;\r
+  }\r
 \r
+  if (OutputPathInfo.Path == NULL) {\r
+    Error (NULL, 0, 1001, "Missing options", "Output file is missing");\r
+    return 1;\r
+  }\r
+  \r
+  if (GetPathInfo(&InputPathInfo) != ErrorSuccess) {\r
+    Error (NULL, 0, 1003, "Invalid option value", "Input file can't be found.");\r
+    return 1;\r
+  }\r
 \r
-  if ((GetPathInfo(&InputPathInfo)  != ErrorSuccess) ||\r
-      (GetPathInfo(&OutputPathInfo) != ErrorSuccess)) {\r
+  if (GetPathInfo(&OutputPathInfo) != ErrorSuccess) {\r
+    Error (NULL, 0, 1003, "Invalid option value", "Output file can't be found.");\r
     return 1;\r
   }\r
   \r
index 083515f..63900b6 100644 (file)
@@ -21,8 +21,10 @@ Abstract:
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
-#include "Crc32.h"\r
+\r
 #include "EfiUtilityMsgs.h"\r
+#include "CommonLib.h"\r
+#include "Crc32.h"\r
 \r
 #define UTILITY_NAME            "GenCrc32"\r
 #define UTILITY_MAJOR_VERSION   0\r
@@ -83,7 +85,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -144,6 +146,7 @@ Returns:
   InFile         = NULL;\r
   OutFile        = NULL;\r
   Crc32Value     = 0;\r
+  FileBuffer     = NULL;\r
 \r
   SetUtilityName (UTILITY_NAME);\r
 \r
@@ -171,7 +174,11 @@ Returns:
   }\r
 \r
   while (argc > 0) {\r
-    if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
+    if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output File name is missing for -o option");\r
+        goto Finish;\r
+      }\r
       OutputFileName = argv[1];\r
       argc -= 2;\r
       argv += 2;\r
@@ -225,6 +232,11 @@ Returns:
       continue;\r
     }\r
 \r
+    if (argv[0][0] == '-') {\r
+      Error (NULL, 0, 1000, "Unknown option", argv[0]);\r
+      goto Finish;\r
+    }\r
+\r
     //\r
     // Get Input file file name.\r
     //\r
@@ -248,14 +260,14 @@ Returns:
   }\r
   \r
   if (InputFileName == NULL) {\r
-    Error (NULL, 0, 1001, "Missing option", "Input files");\r
+    Error (NULL, 0, 1001, "Missing option", "Input files are not specified");\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
+    Error (NULL, 0, 1001, "Missing option", "Output file are not specified");\r
     goto Finish;\r
   } else {\r
     VerboseMsg ("Output file name is %s", OutputFileName);\r
index 4dfdd74..e8cd09e 100644 (file)
@@ -493,9 +493,13 @@ Returns:
 \r
   while (argc > 0) {\r
     if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--filetype") == 0)) {\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "file type is missing for -t option");\r
+        goto Finish;\r
+      }\r
       FfsFiletype = StringToType (argv[1]);\r
       if (FfsFiletype == EFI_FV_FILETYPE_ALL) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "file type can't be NULL");\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s is not a valid file type", argv[1]);\r
         goto Finish;\r
       }\r
       argc -= 2;\r
@@ -504,11 +508,11 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
-      OutputFileName = argv[1];\r
-      if (OutputFileName == NULL) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "Output file can't be NULL");\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file is missing for -o option");\r
         goto Finish;\r
       }\r
+      OutputFileName = argv[1];\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
@@ -540,8 +544,8 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-a") == 0) || (stricmp (argv[0], "--align") == 0)) {\r
-      if (argv[1] == NULL) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Align value is missing for -a option");\r
         goto Finish;\r
       }\r
       for (Index = 0; Index < sizeof (mFfsValidAlignName) / sizeof (CHAR8 *); Index ++) {\r
@@ -570,8 +574,8 @@ Returns:
       //\r
       // Get Input file name and its alignment\r
       //\r
-      if (argv[1] == NULL) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "input section file can't be null");\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "input section file is missing for -i option");\r
         goto Finish;\r
       }\r
 \r
@@ -708,12 +712,6 @@ Returns:
     Error (NULL, 0, 1001, "Missing option", "Input files");\r
     goto Finish;\r
   }\r
-\r
-  if (OutputFileName == NULL) {\r
-    Error (NULL, 0, 1001, "Missing option", "Output file");\r
-    goto Finish;\r
-    // OutFile = stdout;\r
-  }\r
   \r
   //\r
   // Output input parameter information\r
index fa038b0..e080422 100644 (file)
@@ -123,7 +123,8 @@ Returns:
                         It is specified together with the input file.\n");\r
   fprintf (stdout, "  -r Address, --baseaddr Address\n\\r
                         Address is the rebase start address for drivers that\n\\r
-                        run in Flash. It supports DEC or HEX digital format.\n");\r
+                        run in Flash. It supports DEC or HEX digital format.\n\\r
+                        If it is set to zero, no rebase action will be taken\n");\r
   fprintf (stdout, "  -a AddressFile, --addrfile AddressFile\n\\r
                         AddressFile is one file used to record boot driver base\n\\r
                         address and runtime driver base address. And this tool\n\\r
@@ -133,14 +134,13 @@ Returns:
   fprintf (stdout, "  -m logfile, --map logfile\n\\r
                         Logfile is the output fv map file name. if it is not\n\\r
                         given, the FvName.map will be the default map file name\n"); \r
-  fprintf (stdout, "  -g Guid, --capguid GuidValue\n\\r
-                        GuidValue is one specific capsule or fv file system guid value.\n\\r
+  fprintf (stdout, "  -g Guid, --guid GuidValue\n\\r
+                        GuidValue is one specific capsule guid value\n\\r
+                        or fv file system guid value.\n\\r
                         Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
-  fprintf (stdout, "  --FvnameGuid\n\\r
-                        GuidValue is the Fv Name Guid value.\n\\r
+  fprintf (stdout, "  --FvNameGuid          GuidValue is the Fv Name Guid value.\n\\r
                         Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
-  fprintf (stdout, "  --capflag CapFlag\n\\r
-                        Capsule Reset Flag can be PersistAcrossReset,\n\\r
+  fprintf (stdout, "  --capflag CapFlag     Capsule Reset Flag can be PersistAcrossReset,\n\\r
                         or PopulateSystemTable or not set.\n");\r
   fprintf (stdout, "  --capheadsize HeadSize\n\\r
                         HeadSize is one HEX or DEC format value\n\\r
@@ -195,9 +195,6 @@ Returns:
   UINT32                InfFileSize;\r
   CHAR8                 *OutFileName;\r
   CHAR8                 ValueString[_MAX_PATH];\r
-  EFI_PHYSICAL_ADDRESS  XipBase;\r
-  EFI_PHYSICAL_ADDRESS  BtBase;\r
-  EFI_PHYSICAL_ADDRESS  RtBase;\r
   BOOLEAN               CapsuleFlag;\r
   BOOLEAN               DumpCapsule;\r
   MEMORY_FILE           AddrMemoryFile;\r
@@ -211,9 +208,6 @@ Returns:
   InfFileImage  = NULL;\r
   OutFileName   = NULL;\r
   MapFileName   = NULL;\r
-  XipBase       = 0;\r
-  BtBase        = 0;\r
-  RtBase        = 0;\r
   InfFileSize   = 0;\r
   CapsuleFlag   = FALSE;\r
   DumpCapsule   = FALSE;\r
@@ -295,11 +289,13 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) {\r
-      Status = AsciiStringToUint64 (argv[1], FALSE, &XipBase);\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         return STATUS_ERROR;        \r
       }\r
+      mFvDataInfo.BaseAddress    = TempNumber;\r
+      mFvDataInfo.BaseAddressSet = TRUE;\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
@@ -311,6 +307,10 @@ Returns:
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         return STATUS_ERROR;        \r
       }\r
+      if (TempNumber == 0) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Fv block size can't be be set to zero");\r
+        return STATUS_ERROR;        \r
+      }\r
       mFvDataInfo.FvBlocks[0].Length = (UINT32) TempNumber;\r
       DebugMsg (NULL, 0, 9, "FV Block Size", "%s = 0x%x", EFI_BLOCK_SIZE_STRING, TempNumber);\r
       argc -= 2;\r
@@ -324,6 +324,10 @@ Returns:
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         return STATUS_ERROR;        \r
       }\r
+      if (TempNumber == 0) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Fv block number can't be set to zero");\r
+        return STATUS_ERROR;        \r
+      }\r
       mFvDataInfo.FvBlocks[0].NumBlocks = (UINT32) TempNumber;\r
       DebugMsg (NULL, 0, 9, "FV Number Block", "%s = 0x%x", EFI_NUM_BLOCKS_STRING, TempNumber);\r
       argc -= 2;\r
@@ -362,6 +366,11 @@ Returns:
       continue; \r
     }\r
 \r
+    if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--filetakensize") == 0)) {\r
+      Error (NULL, 0, 1003, "Invalid option", "It must be specified together with -f option to specify the file size.");\r
+      return STATUS_ERROR; \r
+    }\r
+\r
     if ((stricmp (argv[0], "-c") == 0) || (stricmp (argv[0], "--capsule") == 0)) {\r
       CapsuleFlag = TRUE;\r
       argc --;\r
@@ -414,7 +423,7 @@ Returns:
       Status = StringToGuid (argv[1], &mCapDataInfo.CapGuid);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
-        return 1;\r
+        return STATUS_ERROR;\r
       }\r
       DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
       argc -= 2;\r
@@ -422,16 +431,17 @@ Returns:
       continue; \r
     }\r
 \r
-    if (stricmp (argv[0], "-g") == 0) {\r
+    if ((stricmp (argv[0], "-g") == 0) || (stricmp (argv[0], "--guid") == 0)) {\r
       //\r
       // Get the Capsule or Fv Guid\r
       //\r
       Status = StringToGuid (argv[1], &mCapDataInfo.CapGuid);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
-        return 1;\r
+        return STATUS_ERROR;\r
       }\r
       memcpy (&mFvDataInfo.FvFileSystemGuid, &mCapDataInfo.CapGuid, sizeof (EFI_GUID));\r
+      mFvDataInfo.FvFileSystemGuidSet = TRUE;\r
       DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
       DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_FILESYSTEMGUID_STRING, argv[1]);\r
       argc -= 2;\r
@@ -439,15 +449,16 @@ Returns:
       continue; \r
     }\r
 \r
-    if (stricmp (argv[0], "--FvnameGuid") == 0) {\r
+    if (stricmp (argv[0], "--FvNameGuid") == 0) {\r
       //\r
       // Get Fv Name Guid\r
       //\r
       Status = StringToGuid (argv[1], &mFvDataInfo.FvNameGuid);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
-        return 1;\r
+        return STATUS_ERROR;\r
       }\r
+      mFvDataInfo.FvNameGuidSet = TRUE;\r
       DebugMsg (NULL, 0, 9, "FV Name Guid", "%s = %s", EFI_FV_NAMEGUID_STRING, argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
@@ -553,11 +564,12 @@ Returns:
       //\r
       // Get the base address\r
       //\r
-      Status = AsciiStringToUint64 (ValueString, FALSE, &BtBase);\r
+      Status = AsciiStringToUint64 (ValueString, FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
         return STATUS_ERROR;\r
       }\r
+      mFvDataInfo.BootBaseAddress = TempNumber;\r
       DebugMsg (NULL, 0, 9, "Boot driver base address", "%s = %s", EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
     }\r
   \r
@@ -569,11 +581,12 @@ Returns:
       //\r
       // Get the base address\r
       //\r
-      Status = AsciiStringToUint64 (ValueString, FALSE, &RtBase);\r
+      Status = AsciiStringToUint64 (ValueString, FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
         return STATUS_ERROR;\r
       }\r
+      mFvDataInfo.RuntimeBaseAddress = TempNumber;\r
       DebugMsg (NULL, 0, 9, "Runtime driver base address", "%s = %s", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, ValueString);\r
     }\r
     \r
@@ -643,8 +656,8 @@ Returns:
               );\r
   } else {\r
     VerboseMsg ("Create Fv image and its map file");\r
-    if (XipBase != 0) {\r
-      VerboseMsg ("FvImage Rebase Address is 0x%X", XipBase);\r
+    if (mFvDataInfo.BaseAddress != 0) {\r
+      VerboseMsg ("FvImage Rebase Address is 0x%X", mFvDataInfo.BaseAddress);\r
     }\r
     //\r
     // Call the GenerateFvImage to generate Fv Image\r
@@ -653,10 +666,7 @@ Returns:
               InfFileImage,\r
               InfFileSize,\r
               OutFileName,\r
-              MapFileName,\r
-              XipBase,\r
-              &BtBase,\r
-              &RtBase\r
+              MapFileName\r
               );\r
   }\r
 \r
@@ -678,15 +688,15 @@ Returns:
     }\r
     fprintf (FpFile, OPTIONS_SECTION_STRING);\r
     fprintf (FpFile, "\n");\r
-    if (BtBase != 0) {\r
+    if (mFvDataInfo.BootBaseAddress != 0) {\r
       fprintf (FpFile, EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING);\r
-      fprintf (FpFile, " = 0x%lx\n", BtBase);\r
-      DebugMsg (NULL, 0, 9, "Updated boot driver base address", "%s = 0x%x", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, BtBase);\r
+      fprintf (FpFile, " = 0x%lx\n", mFvDataInfo.BootBaseAddress);\r
+      DebugMsg (NULL, 0, 9, "Updated boot driver base address", "%s = 0x%x", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, mFvDataInfo.BootBaseAddress);\r
     }\r
-    if (RtBase != 0) {\r
+    if (mFvDataInfo.RuntimeBaseAddress != 0) {\r
       fprintf (FpFile, EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING);\r
-      fprintf (FpFile, " = 0x%lx\n", RtBase);\r
-      DebugMsg (NULL, 0, 9, "Updated runtime driver base address", "%s = 0x%x", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, RtBase);\r
+      fprintf (FpFile, " = 0x%lx\n", mFvDataInfo.RuntimeBaseAddress);\r
+      DebugMsg (NULL, 0, 9, "Updated runtime driver base address", "%s = 0x%x", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, mFvDataInfo.RuntimeBaseAddress);\r
     }\r
     fclose (FpFile);\r
   }\r
index 8c5e721..18a7d3a 100644 (file)
@@ -183,65 +183,66 @@ Returns:
 {\r
   CHAR8       Value[_MAX_PATH];\r
   UINT64      Value64;\r
-  UINTN       Index, Number;\r
+  UINTN       Index, Number, Index1;\r
   EFI_STATUS  Status;\r
-\r
-  //\r
-  // Initialize FV info\r
-  //\r
-  // memset (FvInfo, 0, sizeof (FV_INFO));\r
-  //\r
+  EFI_GUID    GuidValue;\r
 \r
   //\r
   // Read the FV base address\r
   //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_BASE_ADDRESS_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // Get the base address\r
-    //\r
-    Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
-    if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_BASE_ADDRESS_STRING, Value);\r
-      return EFI_ABORTED;\r
-    }\r
-    DebugMsg (NULL, 0, 9, "rebase address", "%s = %s", EFI_FV_BASE_ADDRESS_STRING, Value);\r
+  if (!mFvDataInfo.BaseAddressSet) {\r
+    Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_BASE_ADDRESS_STRING, 0, Value);\r
+    if (Status == EFI_SUCCESS) {\r
+      //\r
+      // Get the base address\r
+      //\r
+      Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_BASE_ADDRESS_STRING, Value);\r
+        return EFI_ABORTED;\r
+      }\r
+      DebugMsg (NULL, 0, 9, "rebase address", "%s = %s", EFI_FV_BASE_ADDRESS_STRING, Value);\r
 \r
-    FvInfo->BaseAddress = Value64;\r
+      FvInfo->BaseAddress = Value64;\r
+    }\r
   }\r
 \r
   //\r
   // Read the FV File System Guid\r
   //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_FILESYSTEMGUID_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // Get the guid value\r
-    //\r
-    StringToGuid (Value, &FvInfo->FvFileSystemGuid);\r
+  if (!FvInfo->FvFileSystemGuidSet) {\r
+    Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_FILESYSTEMGUID_STRING, 0, Value);\r
+    if (Status == EFI_SUCCESS) {\r
+      //\r
+      // Get the guid value\r
+      //\r
+      Status = StringToGuid (Value, &GuidValue);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_FILESYSTEMGUID_STRING, Value);\r
+        return EFI_ABORTED;\r
+      }\r
+      memcpy (&FvInfo->FvFileSystemGuid, &GuidValue, sizeof (EFI_GUID));\r
+      FvInfo->FvFileSystemGuidSet = TRUE;\r
+    }\r
   }\r
 \r
   //\r
   // Read the FV Name Guid\r
   //\r
-  Status = FindToken (InfFile, ATTRIBUTES_SECTION_STRING, EFI_FV_NAMEGUID_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // Get the guid value\r
-    //\r
-    StringToGuid (Value, &FvInfo->FvNameGuid);\r
-    DebugMsg (NULL, 0, 9, "FV Name Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
-                FvInfo->FvNameGuid.Data1,\r
-                FvInfo->FvNameGuid.Data2,\r
-                FvInfo->FvNameGuid.Data3,\r
-                FvInfo->FvNameGuid.Data4[0],\r
-                FvInfo->FvNameGuid.Data4[1],\r
-                FvInfo->FvNameGuid.Data4[2],\r
-                FvInfo->FvNameGuid.Data4[3],\r
-                FvInfo->FvNameGuid.Data4[4],\r
-                FvInfo->FvNameGuid.Data4[5],\r
-                FvInfo->FvNameGuid.Data4[6],\r
-                FvInfo->FvNameGuid.Data4[7]);\r
+  if (!FvInfo->FvNameGuidSet) {\r
+    Status = FindToken (InfFile, ATTRIBUTES_SECTION_STRING, EFI_FV_NAMEGUID_STRING, 0, Value);\r
+    if (Status == EFI_SUCCESS) {\r
+      //\r
+      // Get the guid value\r
+      //\r
+      Status = StringToGuid (Value, &GuidValue);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_NAMEGUID_STRING, Value);\r
+        return EFI_ABORTED;\r
+      }\r
+      memcpy (&FvInfo->FvNameGuid, &GuidValue, sizeof (EFI_GUID));\r
+      FvInfo->FvNameGuidSet = TRUE;\r
+    }\r
   }\r
 \r
   //\r
@@ -286,62 +287,60 @@ Returns:
   //\r
   // Read block maps\r
   //\r
-  Number = 0;\r
   for (Index = 0; Index < MAX_NUMBER_OF_FV_BLOCKS; Index++) {\r
-    if (FvInfo->FvBlocks[Index].Length != 0) {\r
-      continue;\r
-    }\r
-    //\r
-    // Read block size\r
-    //\r
-    Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_BLOCK_SIZE_STRING, Number, Value);\r
-\r
-    if (Status == EFI_SUCCESS) {\r
+    if (FvInfo->FvBlocks[Index].Length == 0) {\r
       //\r
-      // Update the size of block\r
+      // Read block size\r
       //\r
-      Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_BLOCK_SIZE_STRING, Value);\r
-        return EFI_ABORTED;\r
-      }\r
+      Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_BLOCK_SIZE_STRING, Index, Value);\r
 \r
-      FvInfo->FvBlocks[Index].Length = (UINT32) Value64;\r
-      DebugMsg (NULL, 0, 9, "FV Block Size", "%s = %s", EFI_BLOCK_SIZE_STRING, Value);\r
-    } else {\r
-      //\r
-      // If there is no blocks size, but there is the number of block, then we have a mismatched pair\r
-      // and should return an error.\r
-      //\r
-      Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_NUM_BLOCKS_STRING, Number, Value);\r
-      if (!EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "both %s and %s must be specified.", EFI_NUM_BLOCKS_STRING, EFI_BLOCK_SIZE_STRING);\r
-        return EFI_ABORTED;\r
+      if (Status == EFI_SUCCESS) {\r
+        //\r
+        // Update the size of block\r
+        //\r
+        Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_BLOCK_SIZE_STRING, Value);\r
+          return EFI_ABORTED;\r
+        }\r
+\r
+        FvInfo->FvBlocks[Index].Length = (UINT32) Value64;\r
+        DebugMsg (NULL, 0, 9, "FV Block Size", "%s = %s", EFI_BLOCK_SIZE_STRING, Value);\r
       } else {\r
         //\r
-        // We are done\r
+        // If there is no blocks size, but there is the number of block, then we have a mismatched pair\r
+        // and should return an error.\r
         //\r
-        break;\r
+        Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_NUM_BLOCKS_STRING, Index, Value);\r
+        if (!EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid parameter", "both %s and %s must be specified.", EFI_NUM_BLOCKS_STRING, EFI_BLOCK_SIZE_STRING);\r
+          return EFI_ABORTED;\r
+        } else {\r
+          //\r
+          // We are done\r
+          //\r
+          break;\r
+        }\r
       }\r
-    }\r
-\r
-    //\r
-    // Read blocks number\r
-    //\r
-    Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_NUM_BLOCKS_STRING, Number++, Value);\r
 \r
-    if (Status == EFI_SUCCESS) {\r
       //\r
-      // Update the number of blocks\r
+      // Read blocks number\r
       //\r
-      Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
-      if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_NUM_BLOCKS_STRING, Value);\r
-        return EFI_ABORTED;\r
-      }\r
+      Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_NUM_BLOCKS_STRING, Index, Value);\r
 \r
-      FvInfo->FvBlocks[Index].NumBlocks = (UINT32) Value64;\r
-      DebugMsg (NULL, 0, 9, "FV Block Number", "%s = %s", EFI_NUM_BLOCKS_STRING, Value);\r
+      if (Status == EFI_SUCCESS) {\r
+        //\r
+        // Update the number of blocks\r
+        //\r
+        Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_NUM_BLOCKS_STRING, Value);\r
+          return EFI_ABORTED;\r
+        }\r
+\r
+        FvInfo->FvBlocks[Index].NumBlocks = (UINT32) Value64;\r
+        DebugMsg (NULL, 0, 9, "FV Block Number", "%s = %s", EFI_NUM_BLOCKS_STRING, Value);\r
+      }\r
     }\r
   }\r
 \r
@@ -354,27 +353,30 @@ Returns:
   // Read files\r
   //\r
   Number = 0;\r
-  for (Index = 0; Index < MAX_NUMBER_OF_FILES_IN_FV; Index++) {\r
-    if (FvInfo->FvFiles[Index][0] != '\0') {\r
-      continue;\r
+  for (Number = 0; Number < MAX_NUMBER_OF_FILES_IN_FV; Number ++) {\r
+    if (FvInfo->FvFiles[Index][0] == '\0') {\r
+      break;\r
     }\r
+  }\r
+\r
+  for (Index = 0; Index < MAX_NUMBER_OF_FILES_IN_FV; Index++) {\r
     //\r
-    // Read the number of blocks\r
+    // Read the FFS file list\r
     //\r
-    Status = FindToken (InfFile, FILES_SECTION_STRING, EFI_FILE_NAME_STRING, Number++, Value);\r
+    Status = FindToken (InfFile, FILES_SECTION_STRING, EFI_FILE_NAME_STRING, Index, Value);\r
 \r
     if (Status == EFI_SUCCESS) {\r
       //\r
       // Add the file\r
       //\r
-      strcpy (FvInfo->FvFiles[Index], Value);\r
+      strcpy (FvInfo->FvFiles[Number + Index], Value);\r
       DebugMsg (NULL, 0, 9, "FV component file", "the %dth name is %s", Index, Value);\r
     } else {\r
       break;\r
     }\r
   }\r
 \r
-  if (Index == 0) {\r
+  if ((Index + Number) == 0) {\r
     Warning (NULL, 0, 0, "FV components are not specified.", NULL);\r
   }\r
 \r
@@ -1642,10 +1644,7 @@ GenerateFvImage (
   IN CHAR8                *InfFileImage,\r
   IN UINTN                InfFileSize,\r
   IN CHAR8                *FvFileName,\r
-  IN CHAR8                *MapFileName,\r
-  IN EFI_PHYSICAL_ADDRESS XipBaseAddress,\r
-  IN EFI_PHYSICAL_ADDRESS *BtBaseAddress,\r
-  IN EFI_PHYSICAL_ADDRESS *RtBaseAddress\r
+  IN CHAR8                *MapFileName\r
   )\r
 /*++\r
 \r
@@ -1659,9 +1658,6 @@ Arguments:
   InfFileSize    Size of the contents of the InfFileImage buffer.\r
   FvFileName     Requested name for the FV file.\r
   MapFileName    Fv map file to log fv driver information.\r
-  XipBaseAddress BaseAddress is to be rebased.\r
-  BtBaseAddress  Pointer to BaseAddress is to set the prefer loaded image start address for boot drivers.\r
-  RtBaseAddress  Pointer to BaseAddress is to set the prefer loaded image start address for runtime drivers.\r
 \r
 Returns:\r
 \r
@@ -1703,7 +1699,7 @@ Returns:
     //\r
     Status = ParseFvInf (&InfMemoryFile, &mFvDataInfo);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0003, "Error parsing file", "the input INF file.");\r
+      Error (NULL, 0, 0003, "Error parsing file", "the input FV INF file.");\r
       return Status;\r
     }\r
   }\r
@@ -1728,18 +1724,37 @@ Returns:
   //\r
   // Debug message Fv File System Guid\r
   //\r
-  DebugMsg (NULL, 0, 9, "FV File System Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
-                mFvDataInfo.FvFileSystemGuid.Data1,\r
-                mFvDataInfo.FvFileSystemGuid.Data2,\r
-                mFvDataInfo.FvFileSystemGuid.Data3,\r
-                mFvDataInfo.FvFileSystemGuid.Data4[0],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[1],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[2],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[3],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[4],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[5],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[6],\r
-                mFvDataInfo.FvFileSystemGuid.Data4[7]);\r
+  if (mFvDataInfo.FvFileSystemGuidSet) {\r
+    DebugMsg (NULL, 0, 9, "FV File System Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
+                  mFvDataInfo.FvFileSystemGuid.Data1,\r
+                  mFvDataInfo.FvFileSystemGuid.Data2,\r
+                  mFvDataInfo.FvFileSystemGuid.Data3,\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[0],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[1],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[2],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[3],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[4],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[5],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[6],\r
+                  mFvDataInfo.FvFileSystemGuid.Data4[7]);\r
+  }\r
+  //\r
+  // Debug message Fv Name Guid\r
+  //\r
+  if (mFvDataInfo.FvNameGuidSet) {\r
+      DebugMsg (NULL, 0, 9, "FV Name Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
+                  mFvDataInfo.FvNameGuid.Data1,\r
+                  mFvDataInfo.FvNameGuid.Data2,\r
+                  mFvDataInfo.FvNameGuid.Data3,\r
+                  mFvDataInfo.FvNameGuid.Data4[0],\r
+                  mFvDataInfo.FvNameGuid.Data4[1],\r
+                  mFvDataInfo.FvNameGuid.Data4[2],\r
+                  mFvDataInfo.FvNameGuid.Data4[3],\r
+                  mFvDataInfo.FvNameGuid.Data4[4],\r
+                  mFvDataInfo.FvNameGuid.Data4[5],\r
+                  mFvDataInfo.FvNameGuid.Data4[6],\r
+                  mFvDataInfo.FvNameGuid.Data4[7]);\r
+  }\r
 \r
   if (CompareGuid (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid) == 0) {\r
     mFvDataInfo.IsPiFvImage = TRUE;\r
@@ -1755,19 +1770,6 @@ Returns:
     strcat (FvMapName, ".map");\r
   }\r
   VerboseMsg ("FV Map file name is %s", FvMapName);\r
-  \r
-  //\r
-  // Update FvImage Base Address, XipBase not same to BtBase, RtBase address.\r
-  //\r
-  if (XipBaseAddress != 0) {\r
-    mFvDataInfo.BaseAddress = XipBaseAddress;\r
-  }\r
-  if (*BtBaseAddress != 0) {\r
-    mFvDataInfo.BootBaseAddress = *BtBaseAddress;\r
-  }\r
-  if (*RtBaseAddress != 0) {\r
-    mFvDataInfo.RuntimeBaseAddress = *RtBaseAddress;\r
-  }\r
 \r
   //\r
   // Calculate the FV size and Update Fv Size based on the actual FFS files.\r
@@ -1903,7 +1905,7 @@ Returns:
   //\r
   // Set PI FV extension header\r
   //\r
-  if (CompareGuid (&mFvDataInfo.FvNameGuid, &mZeroGuid) != 0) {\r
+  if (mFvDataInfo.FvNameGuidSet) {\r
     memcpy (&FvExtHeader.FvName, &mFvDataInfo.FvNameGuid, sizeof (EFI_GUID));\r
     FvExtHeader.ExtHeaderSize = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
     AddPadFile (&FvImageMemoryFile, 8, &FvExtHeader);\r
@@ -2003,12 +2005,6 @@ Finish:
     fclose (FvMapFile);\r
   }\r
 \r
-  //\r
-  // Update BootAddress and RuntimeAddress\r
-  //\r
-  *BtBaseAddress = mFvDataInfo.BootBaseAddress;\r
-  *RtBaseAddress = mFvDataInfo.RuntimeBaseAddress;\r
-\r
   return Status;\r
 }\r
 \r
index 71a6788..d6b3ad7 100644 (file)
@@ -221,11 +221,14 @@ typedef struct {
 // FV and capsule information holder\r
 //\r
 typedef struct {\r
+  BOOLEAN                 BaseAddressSet;\r
   EFI_PHYSICAL_ADDRESS    BaseAddress;\r
   EFI_PHYSICAL_ADDRESS    BootBaseAddress;\r
   EFI_PHYSICAL_ADDRESS    RuntimeBaseAddress;  \r
   EFI_GUID                FvFileSystemGuid;\r
+  BOOLEAN                 FvFileSystemGuidSet;\r
   EFI_GUID                FvNameGuid;\r
+  BOOLEAN                 FvNameGuidSet;\r
   UINTN                   Size;\r
   EFI_FVB_ATTRIBUTES      FvAttributes;\r
   CHAR8                   FvName[_MAX_PATH];\r
@@ -389,10 +392,7 @@ GenerateFvImage (
   IN CHAR8                *InfFileImage,\r
   IN UINTN                InfFileSize,\r
   IN CHAR8                *FvFileName,  \r
-  IN CHAR8                *MapFileName,\r
-  IN EFI_PHYSICAL_ADDRESS XipBaseAddress,\r
-  IN EFI_PHYSICAL_ADDRESS *BtBaseAddress,\r
-  IN EFI_PHYSICAL_ADDRESS *RtBaseAddress\r
+  IN CHAR8                *MapFileName\r
   )\r
 /*++\r
 \r
@@ -407,9 +407,6 @@ Arguments:
   InfFileSize    Size of the contents of the InfFileImage buffer.\r
   FvFileName     Requested name for the FV file.\r
   MapFileName    Fv map file to log fv driver information.\r
-  XipBaseAddress BaseAddress is to be rebased.\r
-  BtBaseAddress  Pointer to BaseAddress is to set the prefer loaded image start address for boot drivers.\r
-  RtBaseAddress  Pointer to BaseAddress is to set the prefer loaded image start address for runtime drivers.\r
     \r
 Returns:\r
  \r
index b4424ff..ca69cf7 100644 (file)
@@ -202,13 +202,13 @@ Returns:
                         File will be created to store the ouput content.\n");\r
   fprintf (stdout, "  -e EFI_FILETYPE, --efiImage EFI_FILETYPE\n\\r
                         Create Efi Image. EFI_FILETYPE is one of BASE, SEC,\n\\r
-                        PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, DXE_RUNTIME_DRIVER,\n\\r
-                        DXE_SAL_DRIVER, UEFI_DRIVER, UEFI_APPLICATION, \n\\r
+                        PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, UEFI_APPLICATION,\n\\r
+                        DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER, \n\\r
                         DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER, \n\\r
                         PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER,\n\\r
                         APPLICATION, SAL_RT_DRIVER to support all module types\n\\r
                         It can only be used together with --keepexceptiontable,\n\\r
-                        --keepzeropending, -r, -o option. It is a action option.\n\\r
+                        --keepzeropending, -r, -o option.It is a action option.\n\\r
                         If it is combined with other action options, the later\n\\r
                         input action option will override the previous one.\n");\r
   fprintf (stdout, "  -c, --acpi            Create Acpi table.\n\\r
@@ -218,7 +218,7 @@ Returns:
                         input action option will override the previous one.\n");\r
   fprintf (stdout, "  -t, --terse           Create Te Image.\n\\r
                         It can only be used together with --keepexceptiontable,\n\\r
-                        --keepzeropending, -r, -o option. It is a action option.\n\\r
+                        --keepzeropending, -r, -o option.It is a action option.\n\\r
                         If it is combined with other action options, the later\n\\r
                         input action option will override the previous one.\n");\r
   fprintf (stdout, "  -u, --dump            Dump TeImage Header.\n\\r
@@ -1225,6 +1225,8 @@ Returns:
   UINT32            AllignedRelocSize;\r
   UINT8             *FileBuffer;\r
   UINT32            FileLength;\r
+  UINT8             *OutputFileBuffer;\r
+  UINT32            OutputFileLength;\r
   RUNTIME_FUNCTION  *RuntimeFunction;\r
   UNWIND_INFO       *UnwindInfo;\r
   STATUS            Status;\r
@@ -1249,7 +1251,7 @@ Returns:
   //\r
   InputFileNum      = 0;\r
   InputFileName     = NULL;\r
-  mInImageName       = NULL;\r
+  mInImageName      = NULL;\r
   OutImageName      = NULL;\r
   ModuleType        = NULL;\r
   OutImageType      = FW_DUMMY_IMAGE;\r
@@ -1267,6 +1269,8 @@ Returns:
   CheckSum          = 0;\r
   ReplaceFlag       = FALSE;\r
   LogLevel          = 0;\r
+  OutputFileBuffer  = NULL;\r
+  OutputFileLength  = 0;\r
   KeepExceptionTableFlag = FALSE;\r
   KeepZeroPendingFlag    = FALSE;\r
 \r
@@ -1292,22 +1296,22 @@ Returns:
 \r
   while (argc > 0) {\r
     if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
-      OutImageName = argv[1];\r
-      if (OutImageName == NULL) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "Output file name can't be NULL");\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file name is missing for -o option");\r
         goto Finish;\r
       }\r
+      OutImageName = argv[1];\r
       argc -= 2;\r
       argv += 2;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-e") == 0) || (stricmp (argv[0], "--efiImage") == 0)) {\r
-      ModuleType   = argv[1];\r
-      if (ModuleType == NULL) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "Module Type can't be NULL");\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Module Type is missing for -o option");\r
         goto Finish;\r
       }\r
+      ModuleType = argv[1];\r
       if (OutImageType != FW_TE_IMAGE) {\r
         OutImageType = FW_EFI_IMAGE;\r
       }\r
@@ -1360,7 +1364,11 @@ Returns:
 \r
     if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--stamp") == 0)) {\r
       OutImageType = FW_SET_STAMP_IMAGE;\r
-      TimeStamp    = argv[1];\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "time stamp is missing for -s option");\r
+        goto Finish;\r
+      }\r
+      TimeStamp = argv[1];\r
       argc -= 2;\r
       argv += 2;\r
       continue;\r
@@ -1455,7 +1463,11 @@ Returns:
       argv += 2;\r
       continue;\r
     }\r
-\r
+    \r
+    if (argv[0][0] == '-') {\r
+      Error (NULL, 0, 1000, "Unknown option", argv[0]);\r
+      goto Finish;\r
+    }\r
     //\r
     // Get Input file name\r
     //\r
@@ -1567,9 +1579,22 @@ Returns:
   // Open output file and Write image into the output file.\r
   //\r
   if (OutImageName != NULL) {\r
+    fpOut = fopen (OutImageName, "rb");\r
+    if (fpOut != NULL) {\r
+      OutputFileLength = _filelength (fileno (fpOut));\r
+      OutputFileBuffer = malloc (OutputFileLength);\r
+      if (OutputFileBuffer == NULL) {\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+        fclose (fpOut);\r
+        fpOut = NULL;\r
+        goto Finish;\r
+      }\r
+      fread (OutputFileBuffer, 1, OutputFileLength, fpOut);\r
+      fclose (fpOut);\r
+    }\r
     fpOut = fopen (OutImageName, "wb");\r
     if (!fpOut) {\r
-      Error (NULL, 0, 0001, "Error opening file", OutImageName);\r
+      Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
       goto Finish;\r
     }\r
     VerboseMsg ("Output file name is %s", OutImageName);\r
@@ -2035,7 +2060,6 @@ Returns:
   if (OutImageType == FW_SET_STAMP_IMAGE) {\r
     Status = SetStamp (FileBuffer, TimeStamp);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 3000, "Invalid", "SetStamp Error status is 0x%lx", (UINTN) Status);\r
       goto Finish;\r
     }\r
 \r
@@ -2397,6 +2421,16 @@ Finish:
     // Write converted data into fpOut file and close output file.\r
     //\r
     fclose (fpOut);\r
+    if (GetUtilityStatus () != STATUS_SUCCESS) {\r
+      if (OutputFileBuffer == NULL) {\r
+        remove (OutImageName);\r
+      } else {\r
+        fpOut = fopen (OutImageName, "wb");\r
+        fwrite (OutputFileBuffer, 1, OutputFileLength, fpOut);\r
+        fclose (fpOut);\r
+        free (OutputFileBuffer);\r
+      }\r
+    }\r
   }\r
 \r
   VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME, GetUtilityStatus ());\r
@@ -2572,6 +2606,7 @@ Returns:
   EFI_IMAGE_OPTIONAL_HEADER64     *Optional64Hdr;\r
   EFI_IMAGE_SECTION_HEADER        *SectionHeader;\r
   UINT32                          *NewTimeStamp;\r
+  CHAR8                           TestChar;\r
   \r
   //\r
   // Init variable.\r
@@ -2579,7 +2614,6 @@ Returns:
   DebugDirectoryEntryRva    = 0;\r
   ExportDirectoryEntryRva   = 0;\r
   ResourceDirectoryEntryRva = 0;\r
-\r
   //\r
   // Get time and date that will be set.\r
   //\r
@@ -2596,6 +2630,30 @@ Returns:
     //\r
     time (&newtime);\r
   } else {\r
+    //\r
+    // Check Time Format strictly yyyy-mm-dd 00:00:00\r
+    //\r
+    for (Index = 0; TimeStamp[Index] != '\0' && Index < 20; Index ++) {\r
+      if (Index == 4 || Index == 7) {\r
+        if (TimeStamp[Index] == '-') {\r
+          continue;\r
+        }\r
+      } else if (Index == 13 || Index == 16) {\r
+        if (TimeStamp[Index] == ':') {\r
+          continue;\r
+        }\r
+      } else if (Index == 10 && TimeStamp[Index] == ' ') {\r
+        continue;\r
+      } else if ((TimeStamp[Index] < '0') || (TimeStamp[Index] > '9')) {\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (Index < 19 || TimeStamp[19] != '\0') {\r
+      Error (NULL, 0, 1003, "Invalid option value", "Incorrect Time \"%s\"\n  Correct Format \"yyyy-mm-dd 00:00:00\"", TimeStamp);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
     //\r
     // get the date and time from TimeStamp\r
     //\r
@@ -2607,7 +2665,7 @@ Returns:
             &stime.tm_min,\r
             &stime.tm_sec\r
             ) != 6) {\r
-      Error (NULL, 0, 3000, "Invalid", "%s Invalid or unsupported datetime!", TimeStamp);\r
+      Error (NULL, 0, 1003, "Invalid option value", "Incorrect Tiem \"%s\"\n  Correct Format \"yyyy-mm-dd 00:00:00\"", TimeStamp);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
index ff68d2d..2c4ee5d 100644 (file)
@@ -36,9 +36,6 @@ Abstract:
 #include "VirtualMemory.h"\r
 #include "EfiUtilityMsgs.h"\r
 \r
-unsigned int\r
-xtoi (char  *);\r
-\r
 #define EFI_PAGE_BASE_OFFSET_IN_LDR 0x70000\r
 #define EFI_PAGE_BASE_ADDRESS       (EFI_PAGE_BASE_OFFSET_IN_LDR + 0x20000)\r
 \r
@@ -94,7 +91,7 @@ Returns:
 --*/\r
 {\r
   printf ("%s v%d.%d -Utility to generate the EfiLoader image containing page table.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 2008 - 2009 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 VOID\r
@@ -204,7 +201,7 @@ Return:
   return PageTable;\r
 }\r
 \r
-int\r
+INT32\r
 GenBinPage (\r
   void *BaseMemory,\r
   char *NoPageFileName,\r
@@ -292,16 +289,18 @@ main (
   char **argv\r
   )\r
 {\r
-  void *BaseMemory;\r
-  int  result;\r
-  char* OutputFile = NULL;\r
-  char* InputFile = NULL;\r
+  VOID        *BaseMemory;\r
+  INTN        result;\r
+  CHAR8       *OutputFile = NULL;\r
+  CHAR8       *InputFile = NULL;\r
+  EFI_STATUS  Status;\r
+  UINT64      LogLevel;\r
 \r
   SetUtilityName("GenPage");\r
 \r
   if (argc == 1) {\r
     Usage();\r
-    return -1;\r
+    return STATUS_ERROR;\r
   }\r
   \r
   argc --;\r
@@ -319,71 +318,81 @@ main (
 \r
   while (argc > 0) {\r
     if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
-      OutputFile = argv[1];\r
-      if (OutputFile == NULL) {\r
-        Error (NULL, 0, 0x1001, "NO output file specified.", NULL);\r
-        return -1;\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file is missing for -o option");\r
+        return STATUS_ERROR;\r
       }\r
+      OutputFile = argv[1];\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
     }\r
     \r
     if ((stricmp (argv[0], "-b") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) {\r
-      \r
-      if (argv[1] == NULL) {\r
-        Error (NULL, 0, 0x1001, "NO base address specified.", NULL);\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Base address is missing for -b option");\r
+        return STATUS_ERROR;\r
+      }\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &gPageTableBaseAddress);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Base address is not valid intergrator");\r
         return STATUS_ERROR;\r
       }\r
-      gPageTableBaseAddress  = xtoi (argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
     }\r
     \r
     if ((stricmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--offset") == 0)) {\r
-      if (argv[1] == NULL) {\r
-        Error (NULL, 0, 0x1001, "NO offset specified.", NULL);\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Offset is missing for -f option");\r
+        return STATUS_ERROR;\r
+      }\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &gPageTableOffsetInFile);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Offset is not valid intergrator");\r
         return STATUS_ERROR;\r
       }\r
-      gPageTableOffsetInFile  = xtoi (argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
     }\r
-/*\r
+\r
     if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
-      QuietFlag = TRUE;\r
       argc --;\r
       argv ++;\r
       continue; \r
     }\r
     \r
-    if ((strlen(argv[0]) >= 2 && argv[0][0] == '-' && (argv[0][1] == 'v' || argv[0][1] == 'V')) || (stricmp (argv[0], "--verbose") == 0)) {\r
-      VerboseLevel = 1;\r
-      if (strlen(argv[0]) > 2) {\r
-        Status = CountVerboseLevel (&argv[0][2], strlen(argv[0]) - 2, &VerboseLevel);\r
-        if (EFI_ERROR (Status)) {\r
-          Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);\r
-          return STATUS_ERROR;        \r
-        }\r
-      }\r
-      \r
+    if ((stricmp (argv[0], "-v") ==0) || (stricmp (argv[0], "--verbose") == 0)) {\r
       argc --;\r
       argv ++;\r
       continue; \r
     }\r
     \r
     if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) {\r
-      Status = AsciiStringToUint64 (argv[1], FALSE, &DebugLevel);\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Debug Level is not specified.");\r
+        return STATUS_ERROR;\r
+      }\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &LogLevel);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, "Input debug level is not one valid integrator.", NULL);\r
-        return STATUS_ERROR;        \r
+        Error (NULL, 0, 1003, "Invalid option value", "Debug Level is not valid intergrator.");\r
+        return STATUS_ERROR;\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
+        return STATUS_ERROR;\r
       }\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
-    }*/\r
+    }\r
+\r
+    if (argv[0][0] == '-') {\r
+      Error (NULL, 0, 1000, "Unknown option", argv[0]);\r
+      return STATUS_ERROR;\r
+    }\r
     \r
     //\r
     // Don't recognize the paramter.\r
@@ -394,7 +403,7 @@ main (
   }\r
   \r
   if (InputFile == NULL) {\r
-    Error (NULL, 0, 0x1001, "NO Input file specified.", NULL);\r
+    Error (NULL, 0, 1003, "Invalid option value", "Input file is not specified");\r
     return STATUS_ERROR;\r
   }\r
   \r
@@ -408,81 +417,9 @@ main (
   //\r
   result = GenBinPage (BaseMemory, InputFile, OutputFile);\r
   if (result < 0) {\r
-    return 1;\r
+    return STATUS_ERROR;\r
   }\r
 \r
   return 0;\r
 }\r
 \r
-unsigned int\r
-xtoi (\r
-  char  *str\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Convert hex string to uint\r
-\r
-Arguments:\r
-\r
-  Str  -  The string\r
-  \r
-Returns:\r
-\r
---*/\r
-{\r
-  unsigned int u;\r
-  char         c;\r
-  unsigned int m;\r
-  \r
-  if (str == NULL) {\r
-    return 0;\r
-  }\r
-  \r
-  m = (unsigned int) -1 >> 4;\r
-  //\r
-  // skip preceeding white space\r
-  //\r
-  while (*str && *str == ' ') {\r
-    str += 1;\r
-  }\r
-  //\r
-  // skip preceeding zeros\r
-  //\r
-  while (*str && *str == '0') {\r
-    str += 1;\r
-  }\r
-  //\r
-  // skip preceeding white space\r
-  //\r
-  if (*str && (*str == 'x' || *str == 'X')) {\r
-    str += 1;\r
-  }\r
-  //\r
-  // convert hex digits\r
-  //\r
-  u = 0;\r
-  c = *(str++);\r
-  while (c) {\r
-    if (c >= 'a' && c <= 'f') {\r
-      c -= 'a' - 'A';\r
-    }\r
-\r
-    if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {\r
-      if (u > m) {\r
-        return (unsigned int) -1;\r
-      }\r
-\r
-      u = (u << 4) | (c - (c >= 'A' ? 'A' - 10 : '0'));\r
-    } else {\r
-      break;\r
-    }\r
-\r
-    c = *(str++);\r
-  }\r
-\r
-  return u;\r
-}\r
-\r
-\r
index 2dbee54..3c307a3 100644 (file)
@@ -2402,30 +2402,25 @@ Returns:
   //\r
   // Copyright declaration\r
   //\r
-  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
-\r
-  fprintf (stdout, "  -f  input_file\n\\r
-           input_file is name of the BS Image INF file to use.\n");\r
-  fprintf (stdout, "  -r  BaseAddress\n\\r
-            BaseAddress is the starting address of Firmware Volume where Boot Strapped Image will reside.\n");\r
-  fprintf (stdout, "  -s  FwVolumeSize\n\\r
-            FwVolumeSize is the size of Firmware Volume.\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");\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, "  -v, --verbose\n\\r
-            Turn on verbose output with informational messages.\n");\r
-  fprintf (stdout, "  --version\n\\r
-            Show program's version number and exit.\n");\r
-  fprintf (stdout, "  -h, --help\n\\r
-            Show this help message and exit.\n");\r
-  fprintf (stdout, "  -q\n\\r
-            Disable all messages except FATAL ERRORS.\n");\r
-  fprintf (stdout, "  -d [#, 0-9]\n\\r
-            Enable debug messages at level #.\n");\r
+  fprintf (stdout, "  -f Input_file,   --filename Input_file\n\\r
+                        Input_file is name of the BS Image INF file\n");\r
+  fprintf (stdout, "  -r BaseAddress,  --baseaddr BaseAddress\n\\r
+                        BaseAddress is the starting address of Firmware Volume\n\\r
+                        where Boot Strapped Image will reside.\n");\r
+  fprintf (stdout, "  -s FwVolumeSize, --size FwVolumeSize\n\\r
+                        FwVolumeSize is the size of Firmware Volume.\n");\r
+  fprintf (stdout, "  -o FileName,     --output FileName\n\\r
+                        File will be created to store the ouput content.\n");\r
+  fprintf (stdout, "  -v, --verbose         Turn on verbose output with informational messages.\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
+  fprintf (stdout, "  -q, --quiet           Disable all messages except FATAL ERRORS.\n");\r
+  fprintf (stdout, "  -d, --debug [#, 0-9]  Enable debug messages at level #.\n");\r
 }\r
 \r
 int\r
@@ -2496,8 +2491,7 @@ Returns:
     return 0;\r
   }\r
 \r
-  if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) ||\r
-      (strcmp(argv[1], "-?") == 0) || (strcmp(argv[1], "/?") == 0)) {\r
+  if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {\r
     Usage();\r
     return 0;\r
   }\r
@@ -2511,64 +2505,48 @@ Returns:
   // Parse the command line arguments\r
   //\r
   for (Index = 1; Index < argc; Index += 2) {\r
-    //\r
-    // Make sure argument pair begin with - or /\r
-    //\r
-    if (argv[Index][0] != '-' && argv[Index][0] != '/') {\r
-      Usage ();\r
-      Error (NULL, 0, 2000, "Invalid parameter", "Argument pair must begin with \"-\" or \"/\"!");\r
-      goto ERROR;\r
-    }\r
-\r
-    //\r
-    // Make sure argument specifier is only one letter\r
-    //\r
-    if (argv[Index][2] != 0) {\r
-      Usage ();\r
-      Error (NULL, 0, 2000, "Invalid parameter", "Unrecognized argument %s", argv[Index]);\r
-      goto ERROR;\r
-    }\r
-    //\r
-    // Determine argument to read\r
-    //\r
-    switch (argv[Index][1]) {\r
-\r
-    case 'O':\r
-    case 'o':\r
-    //\r
-    // Get the output file name\r
-    //\r
-    VTF_OUTPUT = TRUE;\r
-    if (FirstRoundO) {\r
-    //\r
-    // It's the first output file name\r
-    //\r
-    OutFileName1 = (CHAR8 *)argv[Index+1];\r
-    FirstRoundO = FALSE;\r
-    }\r
-    else {\r
-    //\r
-    //It's the second output file name\r
-    //\r
-    OutFileName2 = (CHAR8 *)argv[Index+1];\r
+    if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
+      if (argv[Index + 1] == NULL || argv[Index + 1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file is missing for -o option");\r
+        goto ERROR;\r
+      }\r
+      //\r
+      // Get the output file name\r
+      //\r
+      VTF_OUTPUT = TRUE;\r
+      if (FirstRoundO) {\r
+        //\r
+        // It's the first output file name\r
+        //\r
+        OutFileName1 = (CHAR8 *)argv[Index+1];\r
+        FirstRoundO = FALSE;\r
+      } else {\r
+        //\r
+        //It's the second output file name\r
+        //\r
+        OutFileName2 = (CHAR8 *)argv[Index+1];\r
+      }\r
+      continue;\r
     }\r
-    break;\r
 \r
-    case 'F':\r
-    case 'f':\r
-    //\r
-    // Get the input VTF file name\r
-    //\r
-    VtfFileName = argv[Index+1];\r
-    VtfFP = fopen(VtfFileName, "rb");\r
-    if (VtfFP == NULL) {\r
-      Error (NULL, 0, 0001, "Error opening file", VtfFileName);\r
-      goto ERROR;\r
+    if ((stricmp (argv[Index], "-f") == 0) || (stricmp (argv[Index], "--filename") == 0)) {\r
+      if (argv[Index + 1] == NULL || argv[Index + 1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "BS Image INF file is missing for -f option");\r
+        goto ERROR;\r
+      }\r
+      //\r
+      // Get the input VTF file name\r
+      //\r
+      VtfFileName = argv[Index+1];\r
+      VtfFP = fopen(VtfFileName, "rb");\r
+      if (VtfFP == NULL) {\r
+        Error (NULL, 0, 0001, "Error opening file", VtfFileName);\r
+        goto ERROR;\r
+      }\r
+      continue;\r
     }\r
-    break;\r
-\r
-    case 'R':\r
-    case 'r':\r
+    \r
+    if ((stricmp (argv[Index], "-r") == 0) || (stricmp (argv[Index], "--baseaddr") == 0)) {\r
       if (FirstRoundB) {\r
         Status      = AsciiStringToUint64 (argv[Index + 1], FALSE, &StartAddress1);\r
         FirstRoundB = FALSE;\r
@@ -2576,13 +2554,13 @@ Returns:
         Status = AsciiStringToUint64 (argv[Index + 1], FALSE, &StartAddress2);\r
       }\r
       if (Status != EFI_SUCCESS) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "Bad start address %s.", argv[Index + 1]);\r
+        Error (NULL, 0, 2000, "Invalid option value", "%s is Bad FV start address.", argv[Index + 1]);\r
         goto ERROR;\r
-      }\r
-      break;\r
+      }  \r
+      continue;\r
+    }\r
 \r
-    case 'S':\r
-    case 's':\r
+    if ((stricmp (argv[Index], "-s") == 0) || (stricmp (argv[Index], "--size") == 0)) {\r
       if (FirstRoundS) {\r
         Status      = AsciiStringToUint64 (argv[Index + 1], FALSE, &FwVolSize1);\r
         FirstRoundS = FALSE;\r
@@ -2592,29 +2570,35 @@ Returns:
       }\r
 \r
       if (Status != EFI_SUCCESS) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "Bad size %s.", argv[Index + 1]);\r
+        Error (NULL, 0, 2000, "Invalid option value", "%s is Bad FV size.", argv[Index + 1]);\r
         goto ERROR;\r
       }\r
-      break;\r
-    case 'v':\r
-    case 'V':\r
-           //\r
-       // Verbose\r
-       //\r
+      continue;\r
+    }\r
+\r
+    if ((stricmp (argv[Index], "-v") == 0) || (stricmp (argv[Index], "--verbose") == 0)) {\r
            VerboseMode = TRUE;\r
            Index--;\r
-           break;\r
-    case 'd':\r
+      continue;\r
+    }\r
+\r
+    if ((stricmp (argv[Index], "-q") == 0) || (stricmp (argv[Index], "--quiet") == 0)) {\r
+      QuietMode = TRUE;\r
+      Index--;\r
+      continue;\r
+    }\r
+\r
+    if ((stricmp (argv[Index], "-d") == 0) || (stricmp (argv[Index], "--debug") == 0)) {\r
       //\r
       // debug level specified\r
       //\r
       Status = AsciiStringToUint64(argv[Index + 1], FALSE, &DebugLevel);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[Index], argv[Index + 1]);\r
         goto ERROR;\r
       }\r
-      if((DebugLevel > 9) || (DebugLevel < 0)) {\r
-        Error (NULL, 0, 2000, "Invalid parameter", "Unrecognized argument %s.", argv[Index + 1]);\r
+      if (DebugLevel > 9)  {\r
+        Error (NULL, 0, 2000, "Invalid option value", "Unrecognized argument %s.", argv[Index + 1]);\r
         goto ERROR;\r
       }\r
       if((DebugLevel <= 9) &&(DebugLevel >= 5)) {\r
@@ -2622,22 +2606,30 @@ Returns:
       } else {\r
         DebugMode = FALSE;\r
       }\r
-      break;\r
-    case 'q':\r
-      QuietMode = TRUE;\r
-      Index--;\r
-      break;\r
-    default:\r
-      Usage ();\r
-      Error (NULL, 0, 2000, "Invalid parameter", "Unrecognized argument %s.", argv[Index]);\r
-      goto ERROR;\r
-      break;\r
+      continue;\r
     }\r
+\r
+    Error (NULL, 0, 2000, "Invalid parameter", "Unrecognized argument %s.", argv[Index]);\r
+    goto ERROR;\r
   }\r
 \r
-//\r
-// All Parameters has been parsed, now set the message print level\r
-//\r
+  if (VtfFP == NULL) {\r
+    Error (NULL, 0, 2000, "Invalid parameter", "No BS Image INF file is specified");\r
+    goto ERROR;\r
+  }\r
+\r
+  if (!FirstRoundB) {\r
+    Error (NULL, 0, 2000, "Invalid parameter", "No FV base address is specified");\r
+    goto ERROR;\r
+  }\r
+\r
+  if (!FirstRoundS) {\r
+    Error (NULL, 0, 2000, "Invalid parameter", "No FV Size is specified");\r
+    goto ERROR;\r
+  }\r
+  //\r
+  // All Parameters has been parsed, now set the message print level\r
+  //\r
   if (QuietMode) {\r
     SetPrintLevel(40);\r
   } else if (VerboseMode) {\r
index 869f879..55bc5a5 100644 (file)
@@ -25,6 +25,7 @@ Abstract:
 #include <errno.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
+#include <Common/UefiBaseTypes.h>\r
 \r
 //\r
 // Utility Name\r
@@ -269,7 +270,7 @@ Version (
   )\r
 {\r
   printf ("%s v%d.%d -Utility to retrieve and update the boot sector or MBR.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+  printf ("Copyright (c) 2007-2009 Intel Corporation. All rights reserved.\n");\r
 }\r
 \r
 \r
@@ -302,8 +303,12 @@ main (
   INTN           Index;\r
   BOOLEAN        ProcessMbr;\r
   ERROR_STATUS   Status;\r
+  EFI_STATUS     EfiStatus;\r
   PATH_INFO      InputPathInfo;\r
   PATH_INFO      OutputPathInfo;\r
+  UINT64         LogLevel;\r
+\r
+  SetUtilityName (UTILITY_NAME);\r
   \r
   ZeroMem(&InputPathInfo, sizeof(PATH_INFO));\r
   ZeroMem(&OutputPathInfo, sizeof(PATH_INFO));\r
@@ -323,32 +328,84 @@ main (
   // Parse command line\r
   //\r
   for (Index = 0; Index < argc; Index ++) {\r
-    if ((stricmp (argv[Index], "-l") == 0) || (stricmp (argv[0], "--list") == 0)) {\r
+    if ((stricmp (argv[Index], "-l") == 0) || (stricmp (argv[Index], "--list") == 0)) {\r
       ListDrive ();\r
       return 0;\r
-    }\r
-    else if ((stricmp (argv[Index], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
+    } else if ((stricmp (argv[Index], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
       ProcessMbr = TRUE;\r
-    }\r
-    else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
+    } else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
       InputPathInfo.Path  = argv[Index + 1];\r
       InputPathInfo.Input = TRUE;\r
+      if (InputPathInfo.Path == NULL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Input file name can't be NULL");\r
+        return 1;\r
+      } \r
+      if (InputPathInfo.Path[0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Input file is missing");\r
+        return 1;       \r
+      }\r
       ++Index;\r
-    }\r
-    else if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
+    } else if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
       OutputPathInfo.Path  = argv[Index + 1];\r
       OutputPathInfo.Input = FALSE;\r
+      if (OutputPathInfo.Path == NULL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file name can't be NULL");\r
+        return 1;\r
+      } \r
+      if (OutputPathInfo.Path[0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output file is missing");\r
+        return 1;       \r
+      }\r
       ++Index;\r
-    }\r
-    else {\r
+    } else if ((stricmp (argv[Index], "-h") == 0) || (stricmp (argv[Index], "--help") == 0)) {\r
       PrintUsage ();\r
+      return 0;\r
+    } else if (stricmp (argv[Index], "--version") == 0) {\r
+      Version ();\r
+      return 0;\r
+    } if ((stricmp (argv[Index], "-v") == 0) || (stricmp (argv[Index], "--verbose") == 0)) {\r
+      continue;\r
+    } if ((stricmp (argv[Index], "-q") == 0) || (stricmp (argv[Index], "--quiet") == 0)) {\r
+      continue;\r
+    } else if ((stricmp (argv[Index], "-d") == 0) || (stricmp (argv[Index], "--debug") == 0)) {\r
+      EfiStatus = AsciiStringToUint64 (argv[Index + 1], FALSE, &LogLevel);\r
+      if (EFI_ERROR (EfiStatus)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[Index], argv[Index + 1]);\r
+        return 1;\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
+        return 1;\r
+      }\r
+      SetPrintLevel (LogLevel);\r
+      DebugMsg (NULL, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv[Index + 1]);\r
+      ++Index;\r
+    } else {\r
+      //\r
+      // Don't recognize the parameter.\r
+      //\r
+      Error (NULL, 0, 1000, "Unknown option", "%s", argv[Index]);\r
       return 1;\r
     }\r
   }\r
+  \r
+  if (InputPathInfo.Path == NULL) {\r
+    Error (NULL, 0, 1001, "Missing options", "Input file is missing");\r
+    return 1;\r
+  }\r
 \r
+  if (OutputPathInfo.Path == NULL) {\r
+    Error (NULL, 0, 1001, "Missing options", "Output file is missing");\r
+    return 1;\r
+  }\r
+  \r
+  if (GetPathInfo(&InputPathInfo) != ErrorSuccess) {\r
+    Error (NULL, 0, 1003, "Invalid option value", "Input file can't be found.");\r
+    return 1;\r
+  }\r
 \r
-  if ((GetPathInfo(&InputPathInfo)  != ErrorSuccess) ||\r
-      (GetPathInfo(&OutputPathInfo) != ErrorSuccess)) {\r
+  if (GetPathInfo(&OutputPathInfo) != ErrorSuccess) {\r
+    Error (NULL, 0, 1003, "Invalid option value", "Output file can't be found.");\r
     return 1;\r
   }\r
   \r
index 04d87e8..a2e75ac 100644 (file)
@@ -1708,7 +1708,7 @@ Returns:
            Turn on verbose output with informational messages.\n");\r
   fprintf (stdout, "  -q, --quiet\n\\r
            Disable all messages except key message and fatal error\n");\r
-  fprintf (stdout, "  --debug [0-9]\n\\r
+  fprintf (stdout, "  -d, --debug [0-9]\n\\r
            Enable debug messages, at input debug level.\n");\r
   fprintf (stdout, "  --version\n\\r
            Show program's version number and exit.\n");\r
@@ -1776,8 +1776,7 @@ Returns:
     return 0;\r
   }\r
   \r
-  if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) || \r
-      (strcmp(argv[1], "-?") == 0) || (strcmp(argv[1], "/?") == 0)) {\r
+  if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)) {\r
     Usage();\r
     return 0;\r
   }\r
@@ -1790,75 +1789,78 @@ Returns:
   argc--;\r
   argv++;\r
   if (strcmp(argv[0],"-e") == 0) {\r
-  //\r
-  // encode the input file\r
-  //\r
-  ENCODE = TRUE;\r
-  argc--;\r
-  argv++;\r
-  }\r
-  else if (strcmp(argv[0], "-d") == 0) {\r
-  //\r
-  // decode the input file\r
-  //\r
-  DECODE = TRUE;\r
-  argc--;\r
-  argv++;\r
-  }\r
-  else {\r
-  //\r
-  // Error command line\r
-  //\r
-  Error (NULL, 0, 1003, "Invalid option value", "the options specified are not recognized.");\r
-  Usage();\r
-  return 1;\r
+    //\r
+    // encode the input file\r
+    //\r
+    ENCODE = TRUE;\r
+    argc--;\r
+    argv++;\r
+  } else if (strcmp(argv[0], "-d") == 0) {\r
+    //\r
+    // decode the input file\r
+    //\r
+    DECODE = TRUE;\r
+    argc--;\r
+    argv++;\r
+  } else {\r
+    //\r
+    // Error command line\r
+    //\r
+    Error (NULL, 0, 1003, "Invalid option value", "the options specified are not recognized.");\r
+    Usage();\r
+    return 1;\r
   }\r
 \r
   while (argc > 0) {\r
-   if ((strcmp(argv[0], "-v") == 0) || (stricmp(argv[0], "--verbose") == 0)) {\r
-    VerboseMode = TRUE;\r
-    argc--;\r
-    argv++;\r
-    continue;\r
-  }\r
-   if (stricmp (argv[0], "--debug") == 0) {\r
-     argc-=2;\r
-     argv++;\r
-     Status = AsciiStringToUint64(argv[0], FALSE, &DebugLevel);\r
-     if (DebugLevel > 9 || DebugLevel < 0) {\r
-       Error (NULL, 0 ,2000, "Invalid parameter", "Unrecognized argument %s", argv[0]);\r
-       goto ERROR;\r
-     }\r
-     if (DebugLevel>=5 && DebugLevel <=9){\r
-       DebugMode = TRUE;\r
-     } else {\r
-       DebugMode = FALSE;\r
-     }\r
-     argv++;\r
-     continue;\r
-   }\r
-   if ((strcmp(argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
-     QuietMode = TRUE;\r
-     argc--;\r
-     argv++;\r
-     continue;\r
-   }\r
-   if ((strcmp(argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
-    OutputFileName = argv[1];\r
-    if (OutputFileName == NULL) {\r
-      Error (NULL, 0, 1003, "Invalid option value", "Output File name can't be set NULL");\r
-      goto ERROR;\r
-    }   \r
-    argc -=2;\r
-    argv +=2;\r
-    continue; \r
-   }\r
-   if (argv[0][0]!='-') {\r
-   InputFileName = argv[0];\r
-   argc--;\r
-   argv++;\r
-   continue;\r
-   }\r
+    if ((strcmp(argv[0], "-v") == 0) || (stricmp(argv[0], "--verbose") == 0)) {\r
+      VerboseMode = TRUE;\r
+      argc--;\r
+      argv++;\r
+      continue;\r
+    }\r
+\r
+    if (stricmp (argv[0], "--debug") == 0) {\r
+      argc-=2;\r
+      argv++;\r
+      Status = AsciiStringToUint64(argv[0], FALSE, &DebugLevel);\r
+      if (DebugLevel > 9) {\r
+        Error (NULL, 0 ,2000, "Invalid parameter", "Unrecognized argument %s", argv[0]);\r
+        goto ERROR;\r
+      }\r
+      if (DebugLevel>=5 && DebugLevel <=9){\r
+        DebugMode = TRUE;\r
+      } else {\r
+        DebugMode = FALSE;\r
+      }\r
+      argv++;\r
+      continue;\r
+    }\r
+\r
+    if ((strcmp(argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
+      QuietMode = TRUE;\r
+      argc--;\r
+      argv++;\r
+      continue;\r
+    }\r
+\r
+    if ((strcmp(argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
+      if (argv[1] == NULL || argv[1][0] == '-') {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Output File name is missing for -o option");\r
+        goto ERROR;\r
+      }\r
+      OutputFileName = argv[1];\r
+      argc -=2;\r
+      argv +=2;\r
+      continue; \r
+    }\r
+\r
+    if (argv[0][0]!='-') {\r
+      InputFileName = argv[0];\r
+      argc--;\r
+      argv++;\r
+      continue;\r
+    }\r
+\r
     Error (NULL, 0, 1000, "Unknown option", argv[0]);\r
     goto ERROR;     \r
   }\r
index 94ba36c..195727c 100644 (file)
@@ -16,7 +16,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "stdio.h"\r
 #include "stdlib.h"\r
 #include "string.h"\r
-//#include "process.h"\r
 #include "VfrCompiler.h"\r
 #include "CommonLib.h"\r
 #include "EfiUtilityMsgs.h"\r
@@ -66,9 +65,15 @@ CVfrCompiler::OptionInitialization (
   mOptions.PreprocessorOutputFileName[0] = '\0';\r
   mOptions.VfrBaseFileName[0]            = '\0';\r
   mOptions.IncludePaths                  = NULL;\r
-  mOptions.SkipCPreprocessor             = FALSE;\r
+  mOptions.SkipCPreprocessor             = TRUE;\r
   mOptions.CPreprocessorOptions          = NULL;\r
   mOptions.CompatibleMode                = FALSE;\r
+  \r
+  if (Argc == 1) {\r
+    Usage ();\r
+    SET_RUN_STATUS (STATUS_DEAD);\r
+    return;\r
+  }\r
 \r
   for (Index = 1; (Index < Argc) && (Argv[Index][0] == '-'); Index++) {\r
     if ((stricmp(Argv[Index], "-h") == 0) || (stricmp(Argv[Index], "--help") == 0)) {\r
@@ -79,6 +84,8 @@ CVfrCompiler::OptionInitialization (
       mOptions.CreateRecordListFile = TRUE;\r
       gCIfrRecordInfoDB.TurnOn ();\r
     } else if (stricmp(Argv[Index], "-i") == 0) {\r
+      Error (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
+      goto Fail;\r
       Index++;\r
       if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
         Error (NULL, 0, 1001, "Missing option", "-i missing path argument"); \r
@@ -108,6 +115,8 @@ CVfrCompiler::OptionInitialization (
     } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) {\r
       mOptions.SkipCPreprocessor = TRUE;\r
     } else if (stricmp(Argv[Index], "-f") == 0 || stricmp(Argv[Index], "--pre-processing-flag") == 0 || stricmp(Argv[Index], "-ppflag") == 0) {\r
+      Error (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
+      goto Fail;\r
       Index++;\r
       if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
         Error (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument");\r
@@ -119,14 +128,12 @@ CVfrCompiler::OptionInitialization (
       mOptions.CompatibleMode = TRUE;\r
     } else {\r
       Error (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
-      Usage ();\r
       goto Fail;\r
     }\r
   }\r
 \r
   if (Index != Argc - 1) {\r
     Error (NULL, 0, 1001, "Missing option", "VFR file name is not specified.");\r
-    Usage ();\r
     goto Fail;\r
   } else {\r
     strcpy (mOptions.VfrFileName, Argv[Index]);\r
@@ -376,15 +383,13 @@ CVfrCompiler::Usage (
     "Options:",\r
     "  -h, --help     prints this help",\r
     "  -l             create an output IFR listing file",\r
-    "  -i IncPath     add IncPath to the search path for VFR included files",\r
     "  -o DIR, --output-directory DIR",\r
-    "                 deposit all output files to directory OutputDir (default=cwd)",\r
+    "                 deposit all output files to directory OutputDir",\r
+    "                 default is current directory",\r
     "  -b, --create-ifr-package",\r
     "                 create an IFR HII pack file",\r
     "  -n, --no-pre-processing",\r
     "                 do not preprocessing input file",\r
-    "  -f, --pre-processing-flag",\r
-    "                 Preprocessing flags",\r
     "  -c, --compatible-framework",\r
     "                 compatible framework vfr file",\r
     NULL\r
index fd7a2bd..d3aa8ca 100644 (file)
@@ -23,7 +23,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #define PROGRAM_NAME                       "VfrCompile"\r
 #define VFR_COMPILER_VERSION               " 1.95 (UEFI 2.1)"\r
-#define VFR_COMPILER_UPDATE_TIME           " updated on 2008/09/03"\r
+#define VFR_COMPILER_UPDATE_TIME           " updated on 2009/05/20"\r
 //\r
 // This is how we invoke the C preprocessor on the VFR source file\r
 // to resolve #defines, #includes, etc. To make C source files\r