Correct usage help information and error information format for Genfw, GenSec, GenFfs...
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 10 Aug 2007 10:38:39 +0000 (10:38 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 10 Aug 2007 10:38:39 +0000 (10:38 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@544 7335b38e-4728-0410-8992-fb3ffe349368

14 files changed:
Source/C/Common/CommonLib.h
Source/C/Common/EfiUtilityMsgs.c
Source/C/Common/EfiUtilityMsgs.h
Source/C/Common/ParseInf.c
Source/C/Common/ParseInf.h
Source/C/EfiRom/GNUmakefile
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/GenSec/GenSec.c
Source/C/GenVtf/GNUmakefile
Source/C/TianoCompress/GNUmakefile

index 40d3535..2b58299 100644 (file)
@@ -23,11 +23,6 @@ Abstract:
 #define _EFI_COMMON_LIB_H\r
 \r
 #include <Common/UefiBaseTypes.h>\r
-\r
-#ifndef _MAX_PATH\r
-#define _MAX_PATH 500\r
-#endif\r
-\r
 #define PRINTED_GUID_BUFFER_SIZE  37  // including null-termination\r
 //\r
 // Function declarations\r
index e7750cb..be78dfc 100644 (file)
@@ -148,7 +148,7 @@ Notes:
 \r
   mErrorCount++;\r
   va_start (List, MsgFmt);\r
-  PrintMessage ("error", FileName, LineNumber, MessageCode, Text, MsgFmt, List);\r
+  PrintMessage ("ERROR", FileName, LineNumber, MessageCode, Text, MsgFmt, List);\r
   va_end (List);\r
   //\r
   // Set status accordingly\r
@@ -208,7 +208,7 @@ Returns:
 \r
   mErrorCount++;\r
   va_start (List, MsgFmt);\r
-  PrintMessage ("error", mSourceFileName, mSourceFileLineNum, MessageCode, Text, MsgFmt, List);\r
+  PrintMessage ("ERROR", mSourceFileName, mSourceFileLineNum, MessageCode, Text, MsgFmt, List);\r
   va_end (List);\r
   //\r
   // Set status accordingly\r
@@ -268,7 +268,7 @@ Returns:
 \r
   mWarningCount++;\r
   va_start (List, MsgFmt);\r
-  PrintMessage ("warning", mSourceFileName, mSourceFileLineNum, ErrorCode, OffendingText, MsgFmt, List);\r
+  PrintMessage ("WARNING", mSourceFileName, mSourceFileLineNum, ErrorCode, OffendingText, MsgFmt, List);\r
   va_end (List);\r
   //\r
   // Set status accordingly\r
@@ -339,7 +339,7 @@ Returns:
 \r
   mWarningCount++;\r
   va_start (List, MsgFmt);\r
-  PrintMessage ("warning", FileName, LineNumber, MessageCode, Text, MsgFmt, List);\r
+  PrintMessage ("WARNING", FileName, LineNumber, MessageCode, Text, MsgFmt, List);\r
   va_end (List);\r
   //\r
   // Set status accordingly\r
@@ -391,7 +391,7 @@ Returns:
   }\r
 \r
   va_start (List, MsgFmt);\r
-  PrintMessage ("debug", FileName, LineNumber, 0, Text, MsgFmt, List);\r
+  PrintMessage ("DEBUG", FileName, LineNumber, 0, Text, MsgFmt, List);\r
   va_end (List);\r
 }\r
 \r
@@ -470,7 +470,7 @@ Notes:
     Cptr = "Unknown utility";\r
   }\r
 \r
-  strcpy (Line, Cptr);\r
+  sprintf (Line, "(%s)", Cptr);\r
   if (LineNumber != 0) {\r
     sprintf (Line2, "(%d)", LineNumber);\r
     strcat (Line, Line2);\r
@@ -479,7 +479,7 @@ Notes:
   // Have to print an error code or Visual Studio won't find the\r
   // message for you. It has to be decimal digits too.\r
   //\r
-  sprintf (Line2, " : %s %c%04d", Type, toupper (Type[0]), MessageCode);\r
+  sprintf (Line2, " %s: %c%04d", Type, toupper (Type[0]), MessageCode);\r
   strcat (Line, Line2);\r
   fprintf (stdout, "%s", Line);\r
   //\r
index 8ef9ee2..b03ad4e 100644 (file)
@@ -34,7 +34,8 @@ Abstract:
 \r
 typedef int STATUS;\r
 \r
-#define MAX_LINE_LEN  0x200\r
+#define MAX_LINE_LEN               0x200\r
+#define MAXIMUM_INPUT_FILE_NUM     10\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
index 5460abe..4dea61c 100644 (file)
@@ -25,10 +25,6 @@ Abstract:
 #include <stdlib.h>\r
 #include "ParseInf.h"\r
 \r
-#ifndef _MAX_PATH\r
-#define _MAX_PATH 500\r
-#endif\r
-\r
 CHAR8 *\r
 ReadLine (\r
   IN MEMORY_FILE    *InputFile,\r
index ff98635..e9680e3 100644 (file)
@@ -24,9 +24,12 @@ Abstract:
 \r
 #include <stdio.h>\r
 #include <stdlib.h>\r
-\r
 #include <Common/UefiBaseTypes.h>\r
 \r
+#ifndef _MAX_PATH\r
+#define _MAX_PATH 500\r
+#endif\r
+\r
 //\r
 // Common data structures\r
 //\r
index c70939d..698141a 100644 (file)
@@ -3,7 +3,7 @@ MAKEROOT ?= ..
 
 APPNAME = EfiRom
 
-LIBS = -lCommon -lString
+LIBS = -lCommon
 
 OBJECTS = EfiRom.o
 
index f0ac3b1..eddb61d 100644 (file)
@@ -31,10 +31,8 @@ Abstract:
 #include "EfiUtilityMsgs.h"\r
 \r
 #define UTILITY_NAME            "GenFfs"\r
-#define UTILITY_MAJOR_VERSION   1\r
-#define UTILITY_MINOR_VERSION   0\r
-\r
-#define MAXIMUM_INPUT_FILE_NUM 10\r
+#define UTILITY_MAJOR_VERSION   0\r
+#define UTILITY_MINOR_VERSION   1\r
 \r
 static CHAR8 *mFfsFileType[] = {\r
   NULL,                                   // 0x00\r
@@ -64,9 +62,11 @@ static UINT32 mFfsValidAlign[] = {0, 8, 16, 128, 512, 1024, 4096, 32768, 65536};
 \r
 static EFI_GUID mZeroGuid = {0};\r
 \r
+static BOOLEAN VerboseMode = FALSE;\r
+\r
 static\r
 void \r
-Version(\r
+Version (\r
   void\r
   )\r
 /*++\r
@@ -85,8 +85,7 @@ Returns:
   \r
 --*/ \r
 {\r
-  printf ("%s v%d.%d - EDKII utility to generate a Firmware File System files.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2007 Intel Corporation. All rights reserved.\n");\r
+  fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
 }\r
 \r
 static\r
@@ -110,27 +109,48 @@ Returns:
 \r
 --*/\r
 {\r
-  Version();\r
+  //\r
+  // Summary usage\r
+  //\r
+  fprintf (stdout, "Usage: %s [options]\n\n", UTILITY_NAME);\r
   \r
-  printf ("\nUsage: " UTILITY_NAME "\n\\r
-        -o, --outputfile [FileName]\n\\r
-        -t, --filetype <EFI_FV_FILETYPE_RAW|\n\\r
-                        EFI_FV_FILETYPE_FREEFORM|\n\\r
-                        EFI_FV_FILETYPE_SECURITY_CORE|\n\\r
-                        EFI_FV_FILETYPE_PEI_CORE|\n\\r
-                        EFI_FV_FILETYPE_DXE_CORE|\n\\r
-                        EFI_FV_FILETYPE_PEIM|\n\\r
-                        EFI_FV_FILETYPE_DRIVER|\n\\r
-                        EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER|\n\\r
-                        EFI_FV_FILETYPE_APPLICATION|\n\\r
-                        EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE>|\n\\r
-        -g, --fileguid [GuidValue (########-####-####-####-############)]\n\\r
-        -x, --fixed\n\\r
-        -s, --checksum\n\\r
-        -a, --align <8,16,128,512,1K,4K,32K,64K>\n\\r
-        -i, --sectionfile [FileName] [-n, --sectionalign <1~64K>]\n\\r
-        -h, --help\n\\r
-        -V, --version\n");\r
+  //\r
+  // Copyright declaration\r
+  // \r
+  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+\r
+  //\r
+  // Details Option\r
+  //\r
+  fprintf (stdout, "Options:\n");\r
+  fprintf (stdout, "  -o FileName, --outputfile FileName\n\\r
+                        File is FFS file to be created.\n");\r
+  fprintf (stdout, "  -t Type, --filetype Type\n\\r
+                        Type is one FV file type defined in PI spec, which is\n\\r
+                        EFI_FV_FILETYPE_RAW, EFI_FV_FILETYPE_FREEFORM,\n\\r
+                        EFI_FV_FILETYPE_SECURITY_CORE, EFI_FV_FILETYPE_PEIM,\n\\r
+                        EFI_FV_FILETYPE_PEI_CORE, EFI_FV_FILETYPE_DXE_CORE,\n\\r
+                        EFI_FV_FILETYPE_DRIVER, EFI_FV_FILETYPE_APPLICATION,\n\\r
+                        EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER,\n\\r
+                        EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE.\n");\r
+  fprintf (stdout, "  -g FileGuid, --fileguid FileGuid\n\\r
+                        FileGuid is one module guid.\n\\r
+                        Its format is 00000000-0000-0000-0000-000000000000\n");\r
+  fprintf (stdout, "  -x, --fixed           Indicates that the file may not be moved\n\\r
+                        from its present location.\n");\r
+  fprintf (stdout, "  -s, --checksum        Indicates to calculate file checksum.\n");\r
+  fprintf (stdout, "  -a FileAlign, --align FileAlign\n\\r
+                        FileAlign points to file alignment, which only support\n\\r
+                        the following align: 8,16,128,512,1K,4K,32K,64K\n");\r
+  fprintf (stdout, "  -i SectionFile, --sectionfile SectionFile\n\\r
+                        Section file will be contained in this FFS file.\n");\r
+  fprintf (stdout, "  -n SectionAlign, --sectionalign SectionAlign\n\\r
+                        SectionAlign points to section alignment, which support\n\\r
+                        the alignment scope 1~64K. It is specified together\n\\r
+                        with sectionfile to point its alignment in FFS file.\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
 }\r
 \r
 static\r
@@ -286,7 +306,7 @@ Returns:
     //\r
     InFile = fopen (InputFileName[Index], "rb");\r
     if (InFile == NULL) {\r
-      Error (NULL, 0, 0, InputFileName[Index], "failed to open input file");\r
+      Error (NULL, 0, 0001, "Error opening file", InputFileName[Index]);\r
       return EFI_ABORTED;\r
     }\r
 \r
@@ -299,7 +319,7 @@ Returns:
     //\r
     if ((FileSize > 0) && (FileBuffer != NULL) && ((Size + FileSize) <= *BufferLength)) {\r
       if (fread (FileBuffer + Size, (size_t) FileSize, 1, InFile) != 1) {\r
-        Error (NULL, 0, 0, InputFileName[Index], "failed to read contents of input file");\r
+        Error (NULL, 0, 0004, "Error reading file", InputFileName[Index]);\r
         fclose (InFile);\r
         return EFI_ABORTED;\r
       }\r
@@ -356,8 +376,6 @@ Returns:
   FILE                    *FfsFile;\r
   UINT32                  Index;\r
 \r
-  fprintf (stdout, "GenFfs tool start.\n");  \r
-\r
   Index          = 0;\r
   FfsAttrib      = 0;  \r
   FfsAlign       = 0;\r
@@ -375,6 +393,7 @@ Returns:
   SetUtilityName (UTILITY_NAME);\r
 \r
   if (argc == 1) {\r
+    Error (NULL, 0, 1001, "Missing options", "Input file");\r
     Usage ();\r
     return STATUS_ERROR;\r
   }\r
@@ -390,14 +409,18 @@ Returns:
     return STATUS_SUCCESS;    \r
   }\r
 \r
-  if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--version") == 0)) {\r
-    Version();\r
+  if (stricmp (argv[0], "--version") == 0) {\r
+    Version ();\r
     return STATUS_SUCCESS;    \r
   }\r
 \r
   while (argc > 0) {\r
     if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--filetype") == 0)) {\r
       FfsFiletype = StringToType (argv[1]);\r
+      if (FfsFiletype == EFI_FV_FILETYPE_ALL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        goto Finish;\r
+      }\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
@@ -413,7 +436,7 @@ Returns:
     if ((stricmp (argv[0], "-g") == 0) || (stricmp (argv[0], "--fileguid") == 0)) {\r
       Status = StringToGuid (argv[1], &FileGuid);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, NULL, "ERROR: %s is not correct guid format", argv[1]);\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
       argc -= 2;\r
@@ -442,7 +465,7 @@ Returns:
         }\r
       }\r
       if (Index == sizeof (mFfsValidAlignName) / sizeof (CHAR8 *)) {\r
-        Error (NULL, 0, 0, NULL, "ERROR: %s is one invalid ffs file alignment", argv[1]);\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
       FfsAlign = Index;\r
@@ -462,14 +485,14 @@ Returns:
       if ((InputFileNum == 0) && (InputFileName == NULL)) {\r
         InputFileName = (CHAR8 **) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *));\r
         if (InputFileName == NULL) {\r
-          Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+          Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
           return EFI_OUT_OF_RESOURCES;\r
         }\r
         memset (InputFileName, 0, (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *)));\r
         \r
         InputFileAlign = (UINT32 *) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32));\r
         if (InputFileAlign == NULL) {\r
-          Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+          Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
           free (InputFileName);\r
           return EFI_OUT_OF_RESOURCES;\r
         }\r
@@ -484,7 +507,7 @@ Returns:
                                     );\r
   \r
         if (InputFileName == NULL) {\r
-          Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+          Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
           free (InputFileAlign);\r
           return EFI_OUT_OF_RESOURCES;\r
         }\r
@@ -496,7 +519,7 @@ Returns:
                                     );\r
   \r
         if (InputFileAlign == NULL) {\r
-          Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+          Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
           free (InputFileName);\r
           return EFI_OUT_OF_RESOURCES;\r
         }\r
@@ -515,7 +538,7 @@ Returns:
       if ((stricmp (argv[0], "-n") == 0) || (stricmp (argv[0], "--sectionalign") == 0)) {\r
         Status = StringtoAlignment (argv[1], &(InputFileAlign[InputFileNum]));\r
         if (EFI_ERROR (Status)) {\r
-          Error (NULL, 0, 0, NULL, "ERROR: %s is invalid alignment", argv[1]);\r
+          Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
           goto Finish;\r
         }\r
         argc -= 2;\r
@@ -526,34 +549,45 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-n") == 0) || (stricmp (argv[0], "--sectionalign") == 0)) {\r
-      Error (NULL, 0, 0, NULL, "ERROR: SectionAlign much be specified with section file");\r
+      Error (NULL, 0, 1000, "Unknown option", "SectionAlign much be specified with section file");\r
       goto Finish;\r
     }\r
+\r
+    if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
+      VerboseMode = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
     \r
-    Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);\r
+    Error (NULL, 0, 1000, "Unknown option", argv[0]);\r
     goto Finish;\r
   }\r
-  \r
+\r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool start.\n", UTILITY_NAME);\r
+  }\r
+   \r
   //\r
   // Check the complete input paramters.\r
   //\r
   if (FfsFiletype == EFI_FV_FILETYPE_ALL) {\r
-    Error (NULL, 0, 0, NULL, "ERROR: File Type is not specified or File Type is not one valid type");\r
+    Error (NULL, 0, 1001, "Missing option", "filetype");\r
     goto Finish;      \r
   }\r
 \r
   if (CompareGuid (&FileGuid, &mZeroGuid) == 0) {\r
-    Error (NULL, 0, 0, NULL, "File Guid value is not specified");\r
+    Error (NULL, 0, 1001, "Missing option", "fileguid");\r
     goto Finish;    \r
   }\r
 \r
   if (InputFileNum == 0) {\r
-    Error (NULL, 0, 0, NULL, "ERROR: No input section files");\r
+    Error (NULL, 0, 1001, "Missing option", "Input files");\r
     goto Finish;\r
   }\r
 \r
   if (OutputFileName == NULL) {\r
-    Error (NULL, 0, 0, NULL, "No output file name is specified.");\r
+    Error (NULL, 0, 1001, "Missing option", "Output file");\r
     goto Finish;\r
     // OutFile = stdout;\r
   }\r
@@ -573,7 +607,7 @@ Returns:
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
     FileBuffer = (UINT8 *) malloc (FileSize);\r
     if (FileBuffer == NULL) {\r
-      Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
       goto Finish;\r
     }\r
     memset (FileBuffer, 0, FileSize);\r
@@ -652,7 +686,7 @@ Returns:
   //\r
   FfsFile = fopen (OutputFileName, "wb");\r
   if (FfsFile == NULL) {\r
-    Error (NULL, 0, 0, NULL, "Can't open %s file to write!", OutputFileName);\r
+    Error (NULL, 0, 0001, "Error opening file", OutputFileName);\r
     goto Finish;\r
   }\r
   //\r
@@ -681,7 +715,9 @@ Finish:
   // routines, then the status has been saved. Get the value and\r
   // return it to the caller.\r
   //\r
-  fprintf (stdout, "GenFfs tool done with return code is 0x%x.\n", GetUtilityStatus ());  \r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool done with return code is 0x%x.\n", UTILITY_NAME, GetUtilityStatus ());  \r
+  }\r
 \r
   return GetUtilityStatus ();\r
 }\r
index f07c86a..e4277ab 100644 (file)
@@ -28,9 +28,7 @@ Abstract:
 #include <stdio.h>\r
 #include <string.h>\r
 #include <stdlib.h>\r
-#include "CommonLib.h"\r
 #include "GenFvInternalLib.h"\r
-#include "EfiUtilityMsgs.h"\r
 \r
 //\r
 // Utility Name\r
@@ -43,15 +41,11 @@ Abstract:
 #define UTILITY_MAJOR_VERSION 0\r
 #define UTILITY_MINOR_VERSION 1\r
 \r
-EFI_STATUS\r
-ParseCapInf (\r
-  IN  MEMORY_FILE  *InfFile,\r
-  OUT CAP_INFO     *CapInfo\r
-  );\r
+BOOLEAN VerboseMode = FALSE;\r
 \r
 static\r
 void \r
-Version(\r
+Version (\r
   void\r
 )\r
 /*++\r
@@ -70,14 +64,12 @@ Returns:
 \r
 --*/\r
 {\r
-  printf ("%s v%d.%d - EDKII Firmware Volume Generation Utility.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2007 Intel Corporation. All rights reserved.\n");\r
+  fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
 }\r
\r
 \r
 static\r
 void \r
-Usage(\r
+Usage (\r
   void\r
   )\r
 /*++\r
@@ -96,15 +88,42 @@ Returns:
 \r
 --*/\r
 {\r
-  Version();\r
-\r
-  printf ("\nUsage: " UTILITY_NAME "\n\\r
-        -i, --inputfile [FileName (FV.inf or Cap.inf)]\n\\r
-        -o, --outputfile [FileName (FileName.fv)]\n\\r
-        -r, --baseaddress (0x##### or #####)\n\\r
-        -c, --capsule\n\\r
-        -h, --help\n\\r
-        -V, --version\n");\r
+  //\r
+  // Summary usage\r
+  //\r
+  fprintf (stdout, "Usage: %s [options]\n\n", UTILITY_NAME);\r
+  \r
+  //\r
+  // Copyright declaration\r
+  // \r
+  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+\r
+  //\r
+  // Details Option\r
+  //\r
+  fprintf (stdout, "Options:\n");\r
+  fprintf (stdout, "  -o FileName, --outputfile FileName\n\\r
+                        File is the FvImage or CapImage to be created.\n");\r
+  fprintf (stdout, "  -i FileName, --inputfile FileName\n\\r
+                        File is the input FV.inf or Cap.inf to specify\n\\r
+                        how to construct FvImage or CapImage.\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
+  fprintf (stdout, "  -b Address, --bootbaseaddr Address\n\\r
+                        Address is the boot time driver base address, which is\n\\r
+                        used to define the prefered loaded address for all\n\\r
+                        boot time drivers in this Fv image.\n\\r
+                        It supports DEC or HEX digital format.\n");\r
+  fprintf (stdout, "  -t Address, --runtimebaseaddr Address\n\\r
+                        Address is the runtime driver base address, which is\n\\r
+                        used to define the prefered loaded address for all\n\\r
+                        runtime drivers in this Fv image.\n\\r
+                        It supports DEC or HEX digital format.\n");\r
+  fprintf (stdout, "  -c, --capsule         Create Capsule Image.\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
 }\r
 \r
 int\r
@@ -143,35 +162,23 @@ Returns:
   UINTN                 InfFileSize;\r
   CHAR8                 *OutFileName;\r
   EFI_PHYSICAL_ADDRESS  XipBase;\r
-  UINT8                 CapsuleFlag;\r
-  CAP_INFO              CapInfo;\r
-  MEMORY_FILE           InfMemoryFile;\r
-  FILE                  *fpin, *fpout;\r
-  UINT32                FileSize;\r
-  UINT32                CapSize;\r
-  UINT8                 *CapBuffer;\r
-  EFI_CAPSULE_HEADER    *CapsuleHeader;\r
-  UINT32                Index;\r
-\r
-  fprintf (stdout, "GenFv tool start\n");\r
+  EFI_PHYSICAL_ADDRESS  BtBase;\r
+  EFI_PHYSICAL_ADDRESS  RtBase;\r
+  BOOLEAN               CapsuleFlag;\r
 \r
   InfFileName   = NULL;\r
   InfFileImage  = NULL;\r
   OutFileName   = NULL;\r
   XipBase       = -1;\r
+  BtBase        = 0;\r
+  RtBase        = 0;\r
   InfFileSize   = 0;\r
-  CapsuleFlag   = 0;\r
-  fpin          = NULL;\r
-  fpout         = NULL;\r
-  FileSize      = 0;\r
-  CapSize       = 0;\r
-  Index         = 0;\r
-  CapBuffer     = NULL;\r
-  CapsuleHeader = NULL;\r
+  CapsuleFlag   = FALSE;\r
 \r
   SetUtilityName (UTILITY_NAME);\r
 \r
   if (argc == 1) {\r
+    Error (NULL, 0, 1001, "Missing options", "Input file");\r
     Usage ();\r
     return STATUS_ERROR;\r
   }\r
@@ -183,21 +190,18 @@ Returns:
   argv ++;\r
 \r
   if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
-    Usage();\r
+    Usage ();\r
     return STATUS_SUCCESS;    \r
   }\r
 \r
-  if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--version") == 0)) {\r
-    Version();\r
+  if (stricmp (argv[0], "--version") == 0) {\r
+    Version ();\r
     return STATUS_SUCCESS;    \r
   }\r
 \r
   while (argc > 0) {\r
     if ((stricmp (argv[0], "-i") == 0) || (stricmp (argv[0], "--inputfile") == 0)) {\r
       InfFileName = argv[1];\r
-      if (InfFileName == NULL) {\r
-        Warning (NULL, 0, 0, NULL, "No input file specified.");\r
-      }\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
@@ -213,7 +217,29 @@ Returns:
     if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) {\r
       Status = AsciiStringToUint64 (argv[1], FALSE, &XipBase);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, "Input paramter is not one valid integrator.", NULL);\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+        return STATUS_ERROR;        \r
+      }\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue; \r
+    }\r
+\r
+    if ((stricmp (argv[0], "-b") == 0) || (stricmp (argv[0], "--bootbaseaddr") == 0)) {\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &BtBase);\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
+      argc -= 2;\r
+      argv += 2;\r
+      continue; \r
+    }\r
+\r
+    if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--runtimebaseaddr") == 0)) {\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &RtBase);\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
       argc -= 2;\r
@@ -222,18 +248,37 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-c") == 0) || (stricmp (argv[0], "--capsule") == 0)) {\r
-      CapsuleFlag = 1;\r
+      CapsuleFlag = TRUE;\r
       argc --;\r
       argv ++;\r
       continue; \r
     }\r
+\r
+    if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
+      VerboseMode = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
     //\r
     // Don't recognize the paramter.\r
     //\r
-    Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);\r
+    Error (NULL, 0, 1000, "Unknown option", "%s", argv[0]);\r
     return STATUS_ERROR;\r
   }\r
 \r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool start.\n", UTILITY_NAME);\r
+  }\r
+  \r
+  //\r
+  // check input parameter\r
+  //\r
+  if (InfFileName == NULL) {\r
+    Error (NULL, 0, 1001, "Missing Option", "Input File");\r
+    return STATUS_ERROR;\r
+  }\r
+  \r
   //\r
   // Read the INF file image\r
   //\r
@@ -247,265 +292,37 @@ Returns:
   //\r
   if (CapsuleFlag) {\r
     //\r
-    // Initialize file structures\r
-    //\r
-    InfMemoryFile.FileImage           = InfFileImage;\r
-    InfMemoryFile.CurrentFilePointer  = InfFileImage;\r
-    InfMemoryFile.Eof                 = InfFileImage + InfFileSize;\r
-\r
-    //\r
-    // Parse the Cap inf file for header information\r
-    //\r
-    Status = ParseCapInf (&InfMemoryFile, &CapInfo);\r
-    if (Status != EFI_SUCCESS) {\r
-      goto Finish;\r
-    }\r
-    \r
-    if (CapInfo.HeaderSize == 0) {\r
-      CapInfo.HeaderSize = sizeof (EFI_CAPSULE_HEADER);\r
-    }\r
-\r
-    if (CapInfo.HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
-      Error (NULL, 0, 0, NULL, "The specified HeaderSize can't be less than the size of EFI_CAPSULE_HEADER.");\r
-      goto Finish;\r
-    }\r
-    \r
-    if (OutFileName == NULL && CapInfo.CapName[0] != '\0') {\r
-      OutFileName = CapInfo.CapName;\r
-    }\r
-    \r
-    if (OutFileName == NULL) {\r
-      Error (NULL, 0, 0, NULL, "Output file name is not specified.");\r
-      goto Finish;\r
-    }\r
-        \r
-    //\r
-    // Calculate the size of capsule image.\r
-    //\r
-    Index    = 0;\r
-    FileSize = 0;\r
-    CapSize  = sizeof (EFI_CAPSULE_HEADER);\r
-    while (CapInfo.CapFiles [Index][0] != '\0') {\r
-      fpin = fopen (CapInfo.CapFiles[Index], "rb");\r
-      if (fpin == NULL) {\r
-        Error (NULL, 0, 0, NULL, "%s could not open for reading", CapInfo.CapFiles[Index]);\r
-        goto Finish;\r
-      }\r
-      FileSize  = _filelength (fileno (fpin));\r
-      CapSize  += FileSize;\r
-      fclose (fpin);\r
-      Index ++;\r
-    }\r
-\r
-    //\r
-    // Allocate buffer for capsule image.\r
-    //\r
-    CapBuffer = (UINT8 *) malloc (CapSize);\r
-    if (CapBuffer == NULL) {\r
-      Error (NULL, 0, 0, NULL, "could not allocate enough memory space for capsule");\r
-      goto Finish;\r
-    }\r
-\r
-    //\r
-    // Initialize the capsule header to zero\r
+    // Call the GenerateCapImage to generate Capsule Image\r
     //\r
-    memset (CapBuffer, 0, sizeof (EFI_CAPSULE_HEADER));\r
-    \r
-    //\r
-    // create capsule header and get capsule body\r
-    //\r
-    CapsuleHeader = (EFI_CAPSULE_HEADER *) CapBuffer;\r
-    memcpy (&CapsuleHeader->CapsuleGuid, &CapInfo.CapGuid, sizeof (EFI_GUID));\r
-    CapsuleHeader->HeaderSize       = CapInfo.HeaderSize;\r
-    CapsuleHeader->Flags            = CapInfo.Flags;\r
-    CapsuleHeader->CapsuleImageSize = CapSize;\r
-\r
-    Index    = 0;\r
-    FileSize = 0;\r
-    CapSize  = CapsuleHeader->HeaderSize;\r
-    while (CapInfo.CapFiles [Index][0] != '\0') {\r
-      fpin = fopen (CapInfo.CapFiles[Index], "rb");\r
-      if (fpin == NULL) {\r
-        Error (NULL, 0, 0, NULL, "%s could not open for reading", CapInfo.CapFiles[Index]);\r
-        goto Finish;\r
-      }\r
-      FileSize = _filelength (fileno (fpin));\r
-      fread (CapBuffer + CapSize, 1, FileSize, fpin);\r
-      fclose (fpin);\r
-      Index ++;\r
-      CapSize += FileSize;\r
-    }\r
-    \r
-    //\r
-    // write capsule data into the output file\r
-    //\r
-    fpout = fopen (OutFileName, "wb");\r
-    if (fpout == NULL) {\r
-      Error (NULL, 0, 0, NULL, "could not open %s file for writing", OutFileName);\r
-      goto Finish;\r
-    }\r
-\r
-    fwrite (CapBuffer, 1, CapSize, fpout);\r
-    fclose (fpout);\r
-\r
+    GenerateCapImage (\r
+      InfFileImage, \r
+      InfFileSize,\r
+      OutFileName\r
+      );\r
   } else {\r
     //\r
-    // Call the GenFvImageFunction to generate Fv Image\r
+    // Call the GenerateFvImage to generate Fv Image\r
     //\r
     GenerateFvImage (\r
       InfFileImage,\r
       InfFileSize,\r
       OutFileName,\r
-      XipBase\r
+      XipBase,\r
+      BtBase,\r
+      RtBase\r
       );\r
   }\r
 \r
-Finish:\r
   //\r
   // free InfFileImage memory\r
   //\r
-  free (InfFileImage);\r
-  \r
-  //\r
-  // free capsule file buffer\r
-  //\r
-  if (CapBuffer != NULL) {\r
-    free (CapBuffer);\r
+  if (InfFileImage == NULL) {\r
+    free (InfFileImage);\r
   }\r
 \r
-  fprintf (stdout, "GenFv tool done with return code is 0x%x.\n", GetUtilityStatus ());\r
-  return GetUtilityStatus ();\r
-}\r
-\r
-EFI_STATUS\r
-ParseCapInf (\r
-  IN  MEMORY_FILE  *InfFile,\r
-  OUT CAP_INFO     *CapInfo\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  This function parses a Cap.INF file and copies info into a CAP_INFO structure.\r
-\r
-Arguments:\r
-\r
-  InfFile        Memory file image.\r
-  CapInfo        Information read from INF file.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS       INF file information successfully retrieved.\r
-  EFI_ABORTED       INF file has an invalid format.\r
-  EFI_NOT_FOUND     A required string was not found in the INF file.\r
---*/\r
-{\r
-  CHAR8       Value[_MAX_PATH];\r
-  UINT64      Value64;\r
-  UINTN       Index;\r
-  EFI_STATUS  Status;\r
-\r
-  //\r
-  // Initialize Cap info\r
-  //\r
-  memset (CapInfo, 0, sizeof (CAP_INFO));\r
-\r
-  //\r
-  // Read the Capsule Guid\r
-  //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_GUID_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // Get the Capsule Guid\r
-    //\r
-    Status = StringToGuid (Value, &CapInfo->CapGuid);\r
-    if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, EFI_CAPSULE_GUID_STRING, "not valid guid value");\r
-      return EFI_ABORTED;\r
-    }\r
-  } else {\r
-    Error (NULL, 0, 0, EFI_CAPSULE_GUID_STRING, "is not specified.");\r
-    return EFI_ABORTED;\r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool done with return code is 0x%x.\n", UTILITY_NAME, GetUtilityStatus ());  \r
   }\r
 \r
-  //\r
-  // Read the Capsule Header Size\r
-  //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_HEADER_SIZE_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
-    if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, Value, "invalid value for %s", EFI_CAPSULE_HEADER_SIZE_STRING);\r
-      return EFI_ABORTED;\r
-    }\r
-    CapInfo->HeaderSize = (UINT32) Value64;\r
-  }\r
-\r
-  //\r
-  // Read the Capsule Flag\r
-  //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_FLAGS_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    if (stricmp (Value, "PersistAcrossReset") == 0) {\r
-      CapInfo->Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET; \r
-    } else if (stricmp (Value, "PopulateSystemTable") == 0) {\r
-      CapInfo->Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE;\r
-    } else {\r
-      Error (NULL, 0, 0, Value, "invalid Flag setting for %s", EFI_CAPSULE_FLAGS_STRING);\r
-      return EFI_ABORTED;\r
-    }\r
-  }\r
-  \r
-  //\r
-  // Read the Capsule Version\r
-  //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_VERSION_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    if (stricmp (Value, "UEFI") == 0) {\r
-      CapInfo->Version = 0x20000;  \r
-    } else if (stricmp (Value, "FRAMEWORK") == 0) {\r
-      CapInfo->Version = 0x10010;\r
-      Error (NULL, 0, 0, Value, "is not supported Version for %s", EFI_CAPSULE_VERSION_STRING);\r
-      return EFI_ABORTED;\r
-    } else {\r
-      Error (NULL, 0, 0, Value, "invalid Version setting for %s", EFI_CAPSULE_VERSION_STRING);\r
-      return EFI_ABORTED;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Read Capsule File name\r
-  //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FILE_NAME_STRING, 0, Value);\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // Get output file name\r
-    //\r
-    strcpy (CapInfo->CapName, Value); \r
-  }\r
-\r
-  //\r
-  // Read the Capsule FileImage\r
-  //\r
-  for (Index = 0; Index < MAX_NUMBER_OF_FILES_IN_CAP; Index++) {\r
-    //\r
-    // Read the capsule file name\r
-    //\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 (CapInfo->CapFiles[Index], Value);\r
-    } else {\r
-      break;\r
-    }\r
-  }\r
-  \r
-  if (Index == 0) {\r
-    printf("Cap Files are not specified.\n");\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
+  return GetUtilityStatus ();\r
 }
\ No newline at end of file
index a8cf2fa..72715f1 100644 (file)
@@ -32,12 +32,16 @@ Abstract:
 #endif\r
 #include <assert.h>\r
 \r
-#include <Common/UefiBaseTypes.h>\r
 #include "GenFvInternalLib.h"\r
-#include "CommonLib.h"\r
-#include "EfiUtilityMsgs.h"\r
+#include "PeCoffLib.h"\r
 #include "WinNtInclude.h"\r
 \r
+EFI_STATUS\r
+ParseCapInf (\r
+  IN  MEMORY_FILE  *InfFile,\r
+  OUT CAP_INFO     *CapInfo\r
+  );\r
+\r
 EFI_STATUS\r
 FindApResetVectorPosition (\r
   IN  MEMORY_FILE  *FvImage,\r
@@ -254,7 +258,7 @@ Returns:
     //\r
     Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, EFI_FV_BASE_ADDRESS_STRING, "invalid value");\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s = %s", EFI_FV_BASE_ADDRESS_STRING, Value);\r
       return EFI_ABORTED;\r
     }\r
 \r
@@ -271,7 +275,7 @@ Returns:
     //\r
     Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, "invalid value");\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s = %s", EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, Value);\r
       return EFI_ABORTED;\r
     }\r
 \r
@@ -288,7 +292,7 @@ Returns:
     //\r
     Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, "invalid value");\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s = %s", EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, Value);\r
       return EFI_ABORTED;\r
     }\r
 \r
@@ -331,7 +335,7 @@ Returns:
       if ((strcmp (Value, TRUE_STRING) == 0) || (strcmp (Value, ONE_STRING) == 0)) {\r
         FvInfo->FvAttributes |= 1 << Index;\r
       } else if ((strcmp (Value, FALSE_STRING) != 0) && (strcmp (Value, ZERO_STRING) != 0)) {\r
-        Error (NULL, 0, 0, FvbAttributeName [Index], "expected %s | %s", TRUE_STRING, FALSE_STRING);\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s expected %s | %s", FvbAttributeName [Index], TRUE_STRING, FALSE_STRING);\r
         return EFI_ABORTED;\r
       }\r
     }\r
@@ -364,7 +368,7 @@ Returns:
       //\r
       Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, Value, "invalid value for %s", EFI_BLOCK_SIZE_STRING);\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_BLOCK_SIZE_STRING, Value);\r
         return EFI_ABORTED;\r
       }\r
 \r
@@ -376,7 +380,7 @@ Returns:
       //\r
       Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_NUM_BLOCKS_STRING, Index, Value);\r
       if (!EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, "must specify both", "%s and %s", EFI_NUM_BLOCKS_STRING, EFI_BLOCK_SIZE_STRING);\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s and %s must specify both", EFI_NUM_BLOCKS_STRING, EFI_BLOCK_SIZE_STRING);\r
         return EFI_ABORTED;\r
       } else {\r
         //\r
@@ -397,7 +401,7 @@ Returns:
       //\r
       Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, Value, "invalid value specified for %s", EFI_NUM_BLOCKS_STRING);\r
+        Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_NUM_BLOCKS_STRING, Value);\r
         return EFI_ABORTED;\r
       }\r
 \r
@@ -406,7 +410,7 @@ Returns:
   }\r
 \r
   if (Index == 0) {\r
-    Error (NULL, 0, 0, NULL, "at lease one block size must be specified.");\r
+    Error (NULL, 0, 2001, "Missing required argument", "block size");\r
     return EFI_ABORTED;\r
   }\r
 \r
@@ -560,8 +564,7 @@ Returns:
     break;\r
 \r
   default:\r
-    Error (NULL, 0, 0, "nvalid file attribute calculated, this is most likely a utility error", NULL);\r
-    return EFI_ABORTED;\r
+    break;\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -788,7 +791,7 @@ Returns:
   NewFile = fopen (FvInfo->FvFiles[Index], "rb");\r
 \r
   if (NewFile == NULL) {\r
-    Error (NULL, 0, 0, FvInfo->FvFiles[Index], "failed to open file for reading");\r
+    Error (NULL, 0, 0001, "Error opening file", FvInfo->FvFiles[Index]);\r
     return EFI_ABORTED;\r
   }\r
 \r
@@ -802,7 +805,7 @@ Returns:
   //\r
   FileBuffer = malloc (FileSize);\r
   if (FileBuffer == NULL) {\r
-    Error (NULL, 0, 0, "memory allocation failure", NULL);\r
+    Error (NULL, 0, 4001, "Resouce", "memory cannot be allocated");\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -817,8 +820,8 @@ Returns:
   // Verify read successful\r
   //\r
   if (NumBytesRead != sizeof (UINT8) * FileSize) {\r
-    free (FileBuffer);\r
-    Error (NULL, 0, 0, FvInfo->FvFiles[Index], "failed to read input file contents");\r
+    free  (FileBuffer);\r
+    Error (NULL, 0, 0004, "Error reading file", FvInfo->FvFiles[Index]);\r
     return EFI_ABORTED;\r
   }\r
   \r
@@ -827,8 +830,8 @@ Returns:
   //\r
   Status = VerifyFfsFile (FileBuffer);\r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, FvInfo->FvFiles[Index], "the invalid FFS file");\r
     free (FileBuffer);\r
+    Error (NULL, 0, 3000, "Invalid", "%s is FFS file", FvInfo->FvFiles[Index]);\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -836,8 +839,8 @@ Returns:
   // Verify space exists to add the file\r
   //\r
   if (FileSize > (UINTN) ((UINTN) *VtfFileImage - (UINTN) FvImage->CurrentFilePointer)) {\r
-    Error (NULL, 0, 0, FvInfo->FvFiles[Index], "insufficient space remains to add the file");\r
     free (FileBuffer);\r
+    Error (NULL, 0, 4002, "Resource", "Fv space is full not to add %s file", FvInfo->FvFiles[Index]);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -873,7 +876,7 @@ Returns:
       // Sanity check. The file MUST align appropriately\r
       //\r
       if (((UINTN) *VtfFileImage + sizeof (EFI_FFS_FILE_HEADER) - (UINTN) FvImage->FileImage) % (1 << CurrentFileAlignment)) {\r
-        Error (NULL, 0, 0, NULL, "VTF file does not align on %d-byte boundary", 1 << CurrentFileAlignment);\r
+        Error (NULL, 0, 3000, "Invalid", "VTF file does not align on %d-byte boundary", 1 << CurrentFileAlignment);\r
         free (FileBuffer);\r
         return EFI_ABORTED;\r
       }\r
@@ -892,7 +895,7 @@ Returns:
       //\r
       // Already found a VTF file.\r
       //\r
-      Error (NULL, 0, 0, "multiple VTF files are illegal in a single FV", NULL);\r
+      Error (NULL, 0, 3000, "Invalid", "multiple VTF files are illegal in a single FV");\r
       free (FileBuffer);\r
       return EFI_ABORTED;\r
     }\r
@@ -903,7 +906,7 @@ Returns:
   //\r
   Status = AddPadFile (FvImage, 1 << CurrentFileAlignment);\r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, NULL, "ERROR: Could not align the file data properly.");\r
+    Error (NULL, 0, 4002, "Resource", "Fv space is full not to add pad file for data align property");\r
     free (FileBuffer);\r
     return EFI_ABORTED;\r
   }\r
@@ -922,7 +925,7 @@ Returns:
     memcpy (FvImage->CurrentFilePointer, FileBuffer, FileSize);\r
     FvImage->CurrentFilePointer += FileSize;\r
   } else {\r
-    Error (NULL, 0, 0, NULL, "ERROR: The firmware volume is out of space, could not add file %s.\n", FvInfo->FvFiles[Index]);\r
+    Error (NULL, 0, 4002, "Resource", "Fv space is full not to add %s file", FvInfo->FvFiles[Index]);\r
     free (FileBuffer);\r
     return EFI_ABORTED;\r
   }\r
@@ -1111,7 +1114,7 @@ Returns:
   //\r
   Status = GetFileByType (EFI_FV_FILETYPE_SECURITY_CORE, 1, &SecCoreFile);\r
   if (EFI_ERROR (Status) || SecCoreFile == NULL) {\r
-    Error (NULL, 0, 0, "could not find the Sec core in the FV", NULL);\r
+    Error (NULL, 0, 3000, "Invaild", "could not find the Sec core in the FV");\r
     return EFI_ABORTED;\r
   }\r
   //\r
@@ -1123,7 +1126,7 @@ Returns:
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, "could not find PE32 section in SEC core file", NULL);\r
+    Error (NULL, 0, 3000, "Invaild", "could not find PE32 section in SEC core file");\r
     return EFI_ABORTED;\r
   }\r
 \r
@@ -1135,7 +1138,7 @@ Returns:
             );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, "could not get PE32 entry point for SEC core", NULL);\r
+    Error (NULL, 0, 3000, "Invaild", "could not get PE32 entry point for SEC core");\r
     return EFI_ABORTED;\r
   }\r
   //\r
@@ -1150,7 +1153,7 @@ Returns:
   //\r
   Status = GetFileByType (EFI_FV_FILETYPE_PEI_CORE, 1, &PeiCoreFile);\r
   if (EFI_ERROR (Status) || PeiCoreFile == NULL) {\r
-    Error (NULL, 0, 0, "could not find the PEI core in the FV", NULL);\r
+    Error (NULL, 0, 3000, "Invaild", "could not find the PEI core in the FV");\r
     return EFI_ABORTED;\r
   }\r
   //\r
@@ -1162,7 +1165,7 @@ Returns:
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, "could not find PE32 or TE section in PEI core file", NULL);\r
+    Error (NULL, 0, 3000, "Invaild", "could not find PE32 or TE section in PEI core file");\r
     return EFI_ABORTED;\r
   }\r
 \r
@@ -1174,7 +1177,7 @@ Returns:
             );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, "could not get PE32 entry point for PEI core", NULL);\r
+    Error (NULL, 0, 3000, "Invaild", "could not get PE32 entry point for PEI core");\r
     return EFI_ABORTED;\r
   }\r
   //\r
@@ -1197,8 +1200,8 @@ Returns:
     // Check if address is aligned on a 16 byte boundary\r
     //\r
     if (PeiCorePhysicalAddress & 0xF) {\r
-      Error (NULL, 0, 0, NULL,\r
-        "ERROR: PEI_CORE entry point is not aligned on a 16 byte boundary, address specified is %Xh.",\r
+      Error (NULL, 0, 3000, "Invaild",\r
+        "PEI_CORE entry point is not aligned on a 16 byte boundary, address specified is %Xh.",\r
         PeiCorePhysicalAddress\r
         );\r
       return EFI_ABORTED;\r
@@ -1227,8 +1230,8 @@ Returns:
     // Check if address is aligned on a 16 byte boundary\r
     //\r
     if (SecCorePhysicalAddress & 0xF) {\r
-      Error (NULL, 0, 0, NULL, \r
-        "ERROR: SALE_ENTRY entry point is not aligned on a 16 byte boundary, address specified is %Xh.",\r
+      Error (NULL, 0, 3000, "Invaild",\r
+        "SALE_ENTRY entry point is not aligned on a 16 byte boundary, address specified is %Xh.",\r
         SecCorePhysicalAddress\r
         );\r
       return EFI_ABORTED;\r
@@ -1257,7 +1260,7 @@ Returns:
     \r
     Ia32SecEntryOffset   = SecCorePhysicalAddress - (FV_IMAGES_TOP_ADDRESS - IA32_SEC_CORE_ENTRY_OFFSET + 2);\r
     if (Ia32SecEntryOffset <= -65536) {\r
-      Error (NULL, 0, 0, NULL, "The SEC EXE file size is too big");\r
+      Error (NULL, 0, 3000, "Invaild", "The SEC EXE file size is too big");\r
       return STATUS_ERROR;\r
     }\r
     \r
@@ -1287,7 +1290,7 @@ Returns:
       //\r
       Status = FindApResetVectorPosition (FvImage, &BytePointer);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, NULL, "Can't find the appropriate space in FvImage to add Ap reset vector!");\r
+        Error (NULL, 0, 3000, "Invaild", "Can't find the appropriate space in FvImage to add Ap reset vector!");\r
         return EFI_ABORTED;\r
       }\r
     }\r
@@ -1323,7 +1326,7 @@ Returns:
     Ia32ResetAddressPtr   = (UINT32 *) ((UINTN) FvImage->Eof - 8);\r
     *Ia32ResetAddressPtr  = IpiVector;\r
   } else {\r
-    Error (NULL, 0, 0, "invalid machine type in PEI core", "machine type=0x%X", (UINT32) MachineType);\r
+    Error (NULL, 0, 3000, "Invaild", "machine type=0x%X in PEI core", (UINT32) MachineType);\r
     return EFI_ABORTED;\r
   }\r
 \r
@@ -1412,7 +1415,7 @@ Returns:
     // Verify DOS header is expected\r
     //\r
     if (DosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) {\r
-      Error (NULL, 0, 0, NULL, "ERROR: Unknown magic number in the DOS header, 0x%04X.", DosHeader->e_magic);\r
+      Error (NULL, 0, 3000, "Invaild", "Unknown magic number in the DOS header, 0x%04X.", DosHeader->e_magic);\r
       return EFI_UNSUPPORTED;\r
     }\r
     //\r
@@ -1424,7 +1427,7 @@ Returns:
     // Verify NT header is expected\r
     //\r
     if (NtHeader->Signature != EFI_IMAGE_NT_SIGNATURE) {\r
-      Error (NULL, 0, 0, NULL, "ERROR: Unrecognized image signature 0x%08X.", NtHeader->Signature);\r
+      Error (NULL, 0, 3000, "Invaild", "Unrecognized image signature 0x%08X.", NtHeader->Signature);\r
       return EFI_UNSUPPORTED;\r
     }\r
     //\r
@@ -1439,7 +1442,7 @@ Returns:
   // Verify machine type is supported\r
   //\r
   if (*MachineType != EFI_IMAGE_MACHINE_IA32 && *MachineType != EFI_IMAGE_MACHINE_IA64 && *MachineType != EFI_IMAGE_MACHINE_X64 && *MachineType != EFI_IMAGE_MACHINE_EBC) {\r
-    Error (NULL, 0, 0, NULL, "ERROR: Unrecognized machine type in the PE32 file.");\r
+    Error (NULL, 0, 3000, "Invaild", "Unrecognized machine type in the PE32 file.");\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
@@ -1453,7 +1456,9 @@ GenerateFvImage (
   IN CHAR8                *InfFileImage,\r
   IN UINTN                InfFileSize,\r
   IN CHAR8                *FvFileName,\r
-  IN EFI_PHYSICAL_ADDRESS XipBaseAddress\r
+  IN EFI_PHYSICAL_ADDRESS XipBaseAddress,\r
+  IN EFI_PHYSICAL_ADDRESS BtBaseAddress,\r
+  IN EFI_PHYSICAL_ADDRESS RtBaseAddress\r
   )\r
 /*++\r
 \r
@@ -1467,6 +1472,8 @@ Arguments:
   InfFileSize    Size of the contents of the InfFileImage buffer.\r
   FvFileName     Requested name for the FV file.\r
   XipBaseAddress BaseAddress is to be rebased.\r
+  BtBaseAddress  BaseAddress is to set the prefer loaded image start address for boot drivers.\r
+  RtBaseAddress  BaseAddress is to set the prefer loaded image start address for runtime drivers.\r
 \r
 Returns:\r
 \r
@@ -1513,7 +1520,7 @@ Returns:
   //\r
   Status = ParseFvInf (&InfMemoryFile, &FvInfo);\r
   if (EFI_ERROR (Status)) {\r
-    Error (NULL, 0, 0, NULL, "ERROR: Could not parse the input INF file.");\r
+    Error (NULL, 0, 0003, "Error parsing file", "the input INF file.");\r
     return Status;\r
   }\r
 \r
@@ -1525,7 +1532,7 @@ Returns:
   }\r
 \r
   if (FvFileName == NULL) {\r
-    Error (NULL, 0, 0, NULL, "Output file name is not specified.");\r
+    Error (NULL, 0, 1001, "Missing option", "Output file name");\r
     return EFI_ABORTED;\r
   }\r
   \r
@@ -1536,7 +1543,7 @@ Returns:
   strcat (FvMapName, ".map");\r
   FvMapFile = fopen (FvMapName, "w");\r
   if (FvMapFile == NULL) {\r
-    Error (NULL, 0, 0, FvMapName, "Can't open to be written.");\r
+    Error (NULL, 0, 0001, "Error opening file", FvMapName);\r
     return EFI_ABORTED;\r
   }\r
   \r
@@ -1546,6 +1553,12 @@ Returns:
   if (XipBaseAddress != -1) {\r
     FvInfo.BaseAddress = XipBaseAddress;\r
   }\r
+  if (BtBaseAddress != 0) {\r
+    FvInfo.BootBaseAddress = BtBaseAddress;\r
+  }\r
+  if (RtBaseAddress != 0) {\r
+    FvInfo.RuntimeBaseAddress = RtBaseAddress;\r
+  }\r
 \r
   //\r
   // Calculate the FV size and Update Fv Size based on the actual FFS files.\r
@@ -1659,7 +1672,7 @@ Returns:
     // Exit if error detected while adding the file\r
     //\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, NULL, "ERROR: Could not add file %s.", FvInfo.FvFiles[Index]);\r
+      Error (NULL, 0, 4002, "Resource", "Fv space is full not to add file %s", FvInfo.FvFiles[Index]);\r
       goto Finish;\r
     }\r
   }\r
@@ -1674,7 +1687,7 @@ Returns:
     //\r
     Status = PadFvImage (&FvImageMemoryFile, VtfFileImage);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, NULL, "ERROR: Could not create the pad file between the last file and the VTF file.");\r
+      Error (NULL, 0, 4002, "Resource", "Fv space is full not to add pad file between the last file and the VTF file.");\r
       goto Finish;\r
     }\r
     //\r
@@ -1687,7 +1700,7 @@ Returns:
     if ((FvInfo.BaseAddress + FvInfo.Size) == FV_IMAGES_TOP_ADDRESS) {       \r
       Status = UpdateResetVector (&FvImageMemoryFile, &FvInfo, VtfFileImage);\r
       if (EFI_ERROR(Status)) {                                               \r
-        Error (NULL, 0, 0, NULL, "ERROR: Could not update the reset vector.");\r
+        Error (NULL, 0, 3000, "Invalid", "Could not update the reset vector.");\r
         goto Finish;                                              \r
       }\r
     }\r
@@ -1711,13 +1724,13 @@ WriteFile:
   //\r
   FvFile = fopen (FvFileName, "wb");\r
   if (FvFile == NULL) {\r
-    Error (NULL, 0, 0, FvFileName, "could not open output file");\r
+    Error (NULL, 0, 0001, "Error opening file", FvFileName);\r
     Status = EFI_ABORTED;\r
     goto Finish;\r
   }\r
 \r
   if (fwrite (FvImage, 1, FvImageSize, FvFile) != FvImageSize) {\r
-    Error (NULL, 0, 0, FvFileName, "failed to write to output file");\r
+    Error (NULL, 0, 0002, "Error writing file", FvFileName);\r
     Status = EFI_ABORTED;\r
     goto Finish;\r
   }\r
@@ -1856,7 +1869,7 @@ Returns:
     fpin = NULL;\r
     fpin = fopen (FvInfoPtr->FvFiles[Index], "rb");\r
     if (fpin == NULL) {\r
-      Error (NULL, 0, 0, NULL, "%s could not open for reading", FvInfoPtr->FvFiles[Index]);\r
+      Error (NULL, 0, 0001, "Error opening file", FvInfoPtr->FvFiles[Index]);\r
       return EFI_ABORTED;\r
     }\r
     //\r
@@ -2079,7 +2092,7 @@ Returns:
     ImageContext.ImageRead  = (PE_COFF_LOADER_READ_FILE) FfsRebaseImageRead;\r
     Status                  = PeCoffLoaderGetImageInfo (&ImageContext);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, "GetImageInfo() call failed on rebase", FileName);\r
+      Error (NULL, 0, 3000, "Invalid", "GetImageInfo() call failed on rebase %s", FileName);\r
       return Status;\r
     }\r
 \r
@@ -2179,7 +2192,7 @@ Returns:
     //\r
     MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
     if (MemoryImagePointer == NULL) {\r
-      Error (NULL, 0, 0, "Can't allocate enough memory on rebase", FileName);\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated when rebase %s", FileName);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);\r
@@ -2187,7 +2200,7 @@ Returns:
     \r
     Status =  PeCoffLoaderLoadImage (&ImageContext);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, "LocateImage() call failed on rebase", FileName);\r
+      Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase %s", FileName);\r
       free ((VOID *) MemoryImagePointer);\r
       return Status;\r
     }\r
@@ -2195,7 +2208,7 @@ Returns:
     ImageContext.DestinationAddress = NewPe32BaseAddress;\r
     Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, "RelocateImage() call failed on rebase", FileName);\r
+      Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase %s", FileName);\r
       free ((VOID *) MemoryImagePointer);\r
       return Status;\r
     }\r
@@ -2211,12 +2224,7 @@ Returns:
       Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *) &(PeHdr->OptionalHeader);\r
       Optional64->ImageBase     = NewPe32BaseAddress;\r
     } else {\r
-      Error (\r
-        NULL,\r
-        0,\r
-        0,\r
-        "unknown machine type in PE32 image",\r
-        "machine type=0x%X, file=%s",\r
+      Error (NULL, 0, 3000, "Invalid", "unknown machine type %X in PE32 image %s", \r
         (UINT32) PeHdr->FileHeader.Machine,\r
         FileName\r
         );\r
@@ -2310,7 +2318,7 @@ Returns:
     Status                  = PeCoffLoaderGetImageInfo (&ImageContext);\r
 \r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, "GetImageInfo() call failed on rebase of TE image", FileName);\r
+      Error (NULL, 0, 3000, "Invalid", "GetImageInfo() call failed on rebase of TE image %s", FileName);\r
       return Status;\r
     }\r
     //\r
@@ -2325,7 +2333,7 @@ Returns:
                                       - TEImageHeader->StrippedSize - (UINTN) FfsFile;\r
     Status                          = PeCoffLoaderRelocateImage (&ImageContext);\r
     if (EFI_ERROR (Status)) {\r
-      Error (NULL, 0, 0, "RelocateImage() call failed on rebase of TE image", FileName);\r
+      Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of TE image %s", FileName);\r
       return Status;\r
     }\r
 \r
@@ -2570,4 +2578,280 @@ Returns:
   \r
   return EFI_SUCCESS;\r
 }\r
-  
\ No newline at end of file
+\r
+EFI_STATUS\r
+ParseCapInf (\r
+  IN  MEMORY_FILE  *InfFile,\r
+  OUT CAP_INFO     *CapInfo\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function parses a Cap.INF file and copies info into a CAP_INFO structure.\r
+\r
+Arguments:\r
+\r
+  InfFile        Memory file image.\r
+  CapInfo        Information read from INF file.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS       INF file information successfully retrieved.\r
+  EFI_ABORTED       INF file has an invalid format.\r
+  EFI_NOT_FOUND     A required string was not found in the INF file.\r
+--*/\r
+{\r
+  CHAR8       Value[_MAX_PATH];\r
+  UINT64      Value64;\r
+  UINTN       Index;\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Initialize Cap info\r
+  //\r
+  memset (CapInfo, 0, sizeof (CAP_INFO));\r
+\r
+  //\r
+  // Read the Capsule Guid\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_GUID_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Get the Capsule Guid\r
+    //\r
+    Status = StringToGuid (Value, &CapInfo->CapGuid);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s = %s", EFI_CAPSULE_GUID_STRING, Value);\r
+      return EFI_ABORTED;\r
+    }\r
+  } else {\r
+    Error (NULL, 0, 2001, "Missing required argument", EFI_CAPSULE_GUID_STRING);\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  //\r
+  // Read the Capsule Header Size\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_HEADER_SIZE_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s = %s", EFI_CAPSULE_HEADER_SIZE_STRING, Value);\r
+      return EFI_ABORTED;\r
+    }\r
+    CapInfo->HeaderSize = (UINT32) Value64;\r
+  }\r
+\r
+  //\r
+  // Read the Capsule Flag\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_FLAGS_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    if (stricmp (Value, "PersistAcrossReset") == 0) {\r
+      CapInfo->Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET; \r
+    } else if (stricmp (Value, "PopulateSystemTable") == 0) {\r
+      CapInfo->Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE;\r
+    } else {\r
+      Error (NULL, 0, 2000, "Invalid paramter", "invalid Flag setting for %s", EFI_CAPSULE_FLAGS_STRING);\r
+      return EFI_ABORTED;\r
+    }\r
+  }\r
+  \r
+  //\r
+  // Read the Capsule Version\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_CAPSULE_VERSION_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    if (stricmp (Value, "UEFI") == 0) {\r
+      CapInfo->Version = 0x20000;  \r
+    } else if (stricmp (Value, "FRAMEWORK") == 0) {\r
+      CapInfo->Version = 0x10010;\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s is not supported Version for %s", Value, EFI_CAPSULE_VERSION_STRING);\r
+      return EFI_ABORTED;\r
+    } else {\r
+      Error (NULL, 0, 2000, "Invalid paramter", "%s is invalid Version setting for %s", Value, EFI_CAPSULE_VERSION_STRING);\r
+      return EFI_ABORTED;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Read Capsule File name\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FILE_NAME_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Get output file name\r
+    //\r
+    strcpy (CapInfo->CapName, Value); \r
+  }\r
+\r
+  //\r
+  // Read the Capsule FileImage\r
+  //\r
+  for (Index = 0; Index < MAX_NUMBER_OF_FILES_IN_CAP; Index++) {\r
+    //\r
+    // Read the capsule file name\r
+    //\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 (CapInfo->CapFiles[Index], Value);\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+  \r
+  if (Index == 0 && VerboseMode) {\r
+    fprintf(stdout, "Cap Files are not specified.\n");\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+GenerateCapImage (\r
+  IN CHAR8                *InfFileImage,\r
+  IN UINTN                InfFileSize,\r
+  IN CHAR8                *CapFileName\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This is the main function which will be called from application to create UEFI Capsule image.\r
+\r
+Arguments:\r
+\r
+  InfFileImage   Buffer containing the INF file contents.\r
+  InfFileSize    Size of the contents of the InfFileImage buffer.\r
+  CapFileName    Requested name for the Cap file.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS             Function completed successfully.\r
+  EFI_OUT_OF_RESOURCES    Could not allocate required resources.\r
+  EFI_ABORTED             Error encountered.\r
+  EFI_INVALID_PARAMETER   A required parameter was NULL.\r
+\r
+--*/\r
+{\r
+  UINT32                CapSize;\r
+  UINT8                 *CapBuffer;\r
+  EFI_CAPSULE_HEADER    *CapsuleHeader;\r
+  MEMORY_FILE           InfMemoryFile;\r
+  UINT32                FileSize;\r
+  UINT32                Index;\r
+  FILE                  *fpin, *fpout;\r
+  EFI_STATUS            Status;\r
+  CAP_INFO              CapInfo;\r
+\r
+  //\r
+  // Initialize file structures\r
+  //\r
+  InfMemoryFile.FileImage           = InfFileImage;\r
+  InfMemoryFile.CurrentFilePointer  = InfFileImage;\r
+  InfMemoryFile.Eof                 = InfFileImage + InfFileSize;\r
+\r
+  //\r
+  // Parse the Cap inf file for header information\r
+  //\r
+  Status = ParseCapInf (&InfMemoryFile, &CapInfo);\r
+  if (Status != EFI_SUCCESS) {\r
+    return Status;\r
+  }\r
+  \r
+  if (CapInfo.HeaderSize == 0) {\r
+    CapInfo.HeaderSize = sizeof (EFI_CAPSULE_HEADER);\r
+  }\r
+\r
+  if (CapInfo.HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+    Error (NULL, 0, 2000, "Invalid paramter", "The specified HeaderSize can't be less than the size of EFI_CAPSULE_HEADER.");\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  if (CapFileName == NULL && CapInfo.CapName[0] != '\0') {\r
+    CapFileName = CapInfo.CapName;\r
+  }\r
+  \r
+  if (CapFileName == NULL) {\r
+    Error (NULL, 0, 2001, "Missing required argument", "Capsule file name");\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+      \r
+  //\r
+  // Calculate the size of capsule image.\r
+  //\r
+  Index    = 0;\r
+  FileSize = 0;\r
+  CapSize  = sizeof (EFI_CAPSULE_HEADER);\r
+  while (CapInfo.CapFiles [Index][0] != '\0') {\r
+    fpin = fopen (CapInfo.CapFiles[Index], "rb");\r
+    if (fpin == NULL) {\r
+      Error (NULL, 0, 0001, "Error opening file", CapInfo.CapFiles[Index]);\r
+      return EFI_ABORTED;\r
+    }\r
+    FileSize  = _filelength (fileno (fpin));\r
+    CapSize  += FileSize;\r
+    fclose (fpin);\r
+    Index ++;\r
+  }\r
+\r
+  //\r
+  // Allocate buffer for capsule image.\r
+  //\r
+  CapBuffer = (UINT8 *) malloc (CapSize);\r
+  if (CapBuffer == NULL) {\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated for capsule");\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  //\r
+  // Initialize the capsule header to zero\r
+  //\r
+  memset (CapBuffer, 0, sizeof (EFI_CAPSULE_HEADER));\r
+  \r
+  //\r
+  // create capsule header and get capsule body\r
+  //\r
+  CapsuleHeader = (EFI_CAPSULE_HEADER *) CapBuffer;\r
+  memcpy (&CapsuleHeader->CapsuleGuid, &CapInfo.CapGuid, sizeof (EFI_GUID));\r
+  CapsuleHeader->HeaderSize       = CapInfo.HeaderSize;\r
+  CapsuleHeader->Flags            = CapInfo.Flags;\r
+  CapsuleHeader->CapsuleImageSize = CapSize;\r
+\r
+  Index    = 0;\r
+  FileSize = 0;\r
+  CapSize  = CapsuleHeader->HeaderSize;\r
+  while (CapInfo.CapFiles [Index][0] != '\0') {\r
+    fpin = fopen (CapInfo.CapFiles[Index], "rb");\r
+    if (fpin == NULL) {\r
+      Error (NULL, 0, 0001, "Error opening file", CapInfo.CapFiles[Index]);\r
+      free (CapBuffer);\r
+      return EFI_ABORTED;\r
+    }\r
+    FileSize = _filelength (fileno (fpin));\r
+    fread (CapBuffer + CapSize, 1, FileSize, fpin);\r
+    fclose (fpin);\r
+    Index ++;\r
+    CapSize += FileSize;\r
+  }\r
+  \r
+  //\r
+  // write capsule data into the output file\r
+  //\r
+  fpout = fopen (CapFileName, "wb");\r
+  if (fpout == NULL) {\r
+    Error (NULL, 0, 0001, "Error opening file", CapFileName);\r
+    free (CapBuffer);\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  fwrite (CapBuffer, 1, CapSize, fpout);\r
+  fclose (fpout);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
index 349dbc2..89bee2b 100644 (file)
@@ -38,11 +38,9 @@ Abstract:
 \r
 #include "CommonLib.h"\r
 #include "ParseInf.h"\r
-#include "PeCoffLib.h"\r
+#include "EfiUtilityMsgs.h"\r
 \r
-//\r
-// Private data declarations\r
-//\r
+extern BOOLEAN VerboseMode;\r
 \r
 //\r
 // Different file separater for Linux and Windows\r
@@ -55,11 +53,6 @@ Abstract:
 #define FILE_SEP_STRING "\\"\r
 #endif\r
 \r
-//\r
-// the maximum number of char in one line \r
-//\r
-#define MAX_LINE_LEN                    0x200\r
-\r
 //\r
 // The maximum number of block map entries supported by the library\r
 //\r
@@ -319,12 +312,21 @@ GetPe32Info (
 //\r
 // Exported function prototypes\r
 //\r
+EFI_STATUS\r
+GenerateCapImage (\r
+  IN CHAR8                *InfFileImage,\r
+  IN UINTN                InfFileSize,\r
+  IN CHAR8                *CapFileName\r
+  );\r
+\r
 EFI_STATUS\r
 GenerateFvImage (\r
   IN CHAR8                *InfFileImage,\r
   IN UINTN                InfFileSize,\r
   IN CHAR8                *FvFileName,  \r
-  IN EFI_PHYSICAL_ADDRESS XipBaseAddress\r
+  IN EFI_PHYSICAL_ADDRESS XipBaseAddress,\r
+  IN EFI_PHYSICAL_ADDRESS BtBaseAddress,\r
+  IN EFI_PHYSICAL_ADDRESS RtBaseAddress\r
   )\r
 /*++\r
 \r
@@ -338,6 +340,8 @@ Arguments:
   InfFileSize    Size of the contents of the InfFileImage buffer.\r
   FvFileName     Requested name for the FV file.\r
   XipBaseAddress BaseAddress is to be rebased.\r
+  BtBaseAddress  BaseAddress is to set the prefer loaded image start address for boot drivers.\r
+  RtBaseAddress  BaseAddress is to set the prefer loaded image start address for runtime drivers.\r
     \r
 Returns:\r
  \r
index 511c6fc..466606e 100644 (file)
@@ -54,7 +54,6 @@ Abstract:
 #include <IndustryStandard/Acpi3_0.h>\r
 #include <IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h>\r
 \r
-\r
 #include "CommonLib.h"\r
 #include "EfiUtilityMsgs.h"\r
 \r
@@ -62,10 +61,8 @@ Abstract:
 // Version of this utility\r
 //\r
 #define UTILITY_NAME "GenFw"\r
-#define UTILITY_MAJOR_VERSION 1\r
-#define UTILITY_MINOR_VERSION 0\r
-\r
-UINT8 *InImageName;\r
+#define UTILITY_MAJOR_VERSION 0\r
+#define UTILITY_MINOR_VERSION 1\r
 \r
 #define FW_DUMMY_IMAGE       0\r
 #define FW_EFI_IMAGE         1\r
@@ -78,12 +75,13 @@ UINT8 *InImageName;
 #define FW_MERGE_IMAGE       8\r
 \r
 #define DUMP_TE_HEADER       0x11\r
-#define FW_REPLACE_IMAGE     0x100\r
 \r
 #define DEFAULT_MC_PAD_BYTE_VALUE  0xFF\r
 #define DEFAULT_MC_ALIGNMENT       16\r
-#define MAXIMUM_INPUT_FILE_NUM     10\r
-#define MAX_STRING_LENGTH          100\r
+\r
+#ifndef _MAX_PATH\r
+#define _MAX_PATH 500\r
+#endif\r
 \r
 //\r
 // Structure definition for a microcode header\r
@@ -101,6 +99,9 @@ typedef struct {
   UINTN  Reserved[3];\r
 } MICROCODE_IMAGE_HEADER;\r
 \r
+static UINT8 *InImageName;\r
+static BOOLEAN VerboseMode = FALSE;\r
+\r
 STATIC\r
 EFI_STATUS\r
 ZeroDebugData (\r
@@ -114,14 +115,28 @@ SetStamp (
   IN     CHAR8  *TimeStamp\r
   );\r
 \r
-static\r
+STATIC\r
 VOID\r
 Version (\r
   VOID\r
   )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Print out version information for this utility.\r
+\r
+Arguments:\r
+\r
+  None\r
+  \r
+Returns:\r
+\r
+  None\r
+  \r
+--*/ \r
 {\r
-  printf ("%s v%d.%d -EDK Utility mainly for Converting a pe32+ image to an FW image type.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2007 Intel Corporation. All rights reserved.\n");\r
+  fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
 }\r
 \r
 STATIC\r
@@ -130,27 +145,45 @@ Usage (
   VOID\r
   )\r
 {\r
-  Version();\r
-  printf ("\nUsage: " UTILITY_NAME " [inputfilename]\n\\r
-        -o, --outputfile [FileName]\n\\r
-        -e, --efiImage <BASE|SEC|PEI_CORE|PEIM|DXE_CORE|DXE_DRIVER|\n\\r
-                        DXE_RUNTIME_DRIVER|DXE_SAL_DRIVER|DXE_SMM_DRIVER|\n\\r
-                        UEFI_DRIVER|UEFI_APPLICATION|SECURITY_CORE|\n\\r
-                        COMBINED_PEIM_DRIVER|PIC_PEIM|RELOCATABLE_PEIM|\n\\r
-                        BS_DRIVER|RT_DRIVER|SAL_RT_DRIVER|APPLICATION>\n\\r
-        -c, --acpi\n\\r
-        -t, --terse\n\\r
-        -u, --dump\n\\r
-        -z, --zero\n\\r
-        -b, --exe2bin\n\\r
-        -r, --replace\n\\r
-        -s, --stamp [time-data] <NOW|\"####-##-## ##:##:##\">\n\\r
-        -m, --mcifile\n\\r
-        -j, --join\n\\r
-        -a, --align <HEX|DEC>\n\\r
-        -p, --pad  [padvalue] <HEX|DEC>\n\\r
-        -h, --help\n\\r
-        -V, --version\n");\r
+  //\r
+  // Summary usage\r
+  //\r
+  fprintf (stdout, "Usage: %s [options] <input_file>\n\n", UTILITY_NAME);\r
+  \r
+  //\r
+  // Copyright declaration\r
+  // \r
+  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+\r
+  //\r
+  // Details Option\r
+  //\r
+  fprintf (stdout, "Options:\n");\r
+  fprintf (stdout, "  -o FileName, --outputfile FileName\n\\r
+                        File will be created to store the ouput content.\n");\r
+  fprintf (stdout, "  -e EFI_FILETYPE, --efiImage EFI_FILETYPE\n\\r
+                        EFI_FILETYPE is one of BASE, SEC, PEI_CORE, PEIM, \n\\r
+                        DXE_CORE, DXE_RUNTIME_DRIVER, DXE_SAL_DRIVER, \n\\r
+                        DXE_SMM_DRIVER, UEFI_DRIVER, UEFI_APPLICATIOn, \n\\r
+                        SECURITY_CORE, COMBINED_PEIM_DRIVER, PIC_PEIM, \n\\r
+                        RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER, APPLICATION, \n\\r
+                        SAL_RT_DRIVER to support all module types.\n");\r
+  fprintf (stdout, "  -c, --acpi            Create Acpi table.\n");\r
+  fprintf (stdout, "  -t, --terse           Create Te Image.\n");\r
+  fprintf (stdout, "  -u, --dump            Dump TeImage Header.\n");\r
+  fprintf (stdout, "  -z, --zero            Zero the Debug Data Fields in the PE input image file.\n");\r
+  fprintf (stdout, "  -b, --exe2bin         Convert the input EXE to the output BIN file.\n");\r
+  fprintf (stdout, "  -r, --replace         Overwrite the input file with the ouput content.\n");\r
+  fprintf (stdout, "  -s [time-date], --stamp [time-date]\n\\r
+                        time-date format is yyyy-mm-dd 00:00:00. if time-data \n\\r
+                        is set to NOW, current system time is used.\n");\r
+  fprintf (stdout, "  -m, --mcifile         Convert input microcode txt file to microcode bin file.\n");\r
+  fprintf (stdout, "  -j, --join            Combine multi microcode bin files to one files.\n");\r
+  fprintf (stdout, "  -a NUM, --align NUM   NUM is one HEX or DEC format alignment value.\n");\r
+  fprintf (stdout, "  -p NUM, --pad NUM     NUM is one HEX or DEC format padding value.\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
 }\r
 \r
 static\r
@@ -187,7 +220,7 @@ Returns:
   // Generic check for AcpiTable length.\r
   //\r
   if (AcpiHeader->Length > Length) {\r
-    Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass AcpiTable Length check");\r
+    Error (NULL, 0, 3000, "Invalid", "failed to pass AcpiTable Length check", NULL);\r
     return STATUS_ERROR;\r
   }\r
 \r
@@ -212,11 +245,11 @@ Returns:
       ExpectedLength = sizeof(EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE);\r
       break;\r
     default:\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass FACP revision check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass FACP revision check");\r
       return STATUS_ERROR;\r
     }\r
     if (ExpectedLength != AcpiHeader->Length) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass FACP Length check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass FACP Length check");\r
       return STATUS_ERROR;\r
     }\r
     break;\r
@@ -229,13 +262,13 @@ Returns:
     if ((Facs->Version != 0) &&\r
         (Facs->Version != EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&\r
         (Facs->Version != EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION)){\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass FACS version check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass FACS version check");\r
       return STATUS_ERROR;\r
     }\r
     if ((Facs->Length != sizeof(EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE)) &&\r
         (Facs->Length != sizeof(EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE)) &&\r
         (Facs->Length != sizeof(EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE))) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass FACS Length check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass FACS Length check");\r
       return STATUS_ERROR;\r
     }\r
     break;\r
@@ -245,11 +278,11 @@ Returns:
   //\r
   case EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE:\r
     if (AcpiHeader->Revision > EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_REVISION) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass DSDT revision check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass DSDT revision check");\r
       return STATUS_ERROR;\r
     }\r
     if (AcpiHeader->Length <= sizeof(EFI_ACPI_DESCRIPTION_HEADER)) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass DSDT Length check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass DSDT Length check");\r
       return STATUS_ERROR;\r
     }\r
     break;\r
@@ -261,11 +294,11 @@ Returns:
     if ((AcpiHeader->Revision != EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION) &&\r
         (AcpiHeader->Revision != EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION) &&\r
         (AcpiHeader->Revision != EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION)) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass APIC revision check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass APIC revision check");\r
       return STATUS_ERROR;\r
     }\r
     if (AcpiHeader->Length <= sizeof(EFI_ACPI_DESCRIPTION_HEADER) + sizeof(UINT32) + sizeof(UINT32)) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass APIC Length check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass APIC Length check");\r
       return STATUS_ERROR;\r
     }\r
     break;\r
@@ -275,11 +308,11 @@ Returns:
   //\r
   case EFI_ACPI_3_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE:\r
     if (AcpiHeader->Revision != EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass MCFG revision check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass MCFG revision check");\r
       return STATUS_ERROR;\r
     }\r
     if (AcpiHeader->Length <= sizeof(EFI_ACPI_DESCRIPTION_HEADER) + sizeof(UINT64)) {\r
-      Error (NULL, 0, 0, "CheckAcpiTable", "failed to pass MCFG Length check");\r
+      Error (NULL, 0, 3000, "Invalid", "failed to pass MCFG Length check");\r
       return STATUS_ERROR;\r
     }\r
     break;\r
@@ -325,7 +358,7 @@ FCopyFile (
   }\r
 \r
   if ((UINT32 ) ftell (out) != filesize) {\r
-    Error (NULL, 0, 0, "write error", NULL);\r
+    Error (NULL, 0, 0002, "Error writing file", NULL);\r
     return STATUS_ERROR;\r
   }\r
 \r
@@ -631,9 +664,8 @@ WriteSections(
       case SHT_NOBITS:
   memset(CoffFile + CoffSectionsOffset[Idx], 0, Shdr->sh_size);
   break;
-      default:
-  Error (NULL, 0, 0, InImageName, "unhandle section type %x",
-         (UINTN)Shdr->sh_type);
+      default:\r
+  Error (NULL, 0, 3000, "Invalid", "%s unhandle section type %x", InImageName, (UINTN)Shdr->sh_type);
       }
     }
   }
@@ -662,7 +694,7 @@ WriteSections(
   if (Sym->st_shndx == SHN_UNDEF
       || Sym->st_shndx == SHN_ABS
       || Sym->st_shndx > Ehdr->e_shnum) {
-    Error (NULL, 0, 0, InImageName, "bad symbol definition");
+    Error (NULL, 0, 3000, "Invalid", "%s bad symbol definition", InImageName);
   }
   SymShdr = GetShdrByIndex(Sym->st_shndx);
 
@@ -691,8 +723,7 @@ WriteSections(
       - (SecOffset - SecShdr->sh_addr);
     break;
   default:
-    Error (NULL, 0, 0, InImageName, "unhandled relocation type %x",
-     ELF_R_TYPE(Rel->r_info));
+    Error (NULL, 0, 3000, "Invalid", "%s unhandle section type %x", InImageName, ELF_R_TYPE(Rel->r_info));\r
   }
       }
     }
@@ -778,8 +809,7 @@ WriteRelocations(
        EFI_IMAGE_REL_BASED_HIGHLOW);
       break;
     default:
-      Error (NULL, 0, 0, InImageName, "unhandled relocation type %x",
-       ELF_R_TYPE(Rel->r_info));
+      Error (NULL, 0, 3000, "Invalid", "%s unhandle section type %x", InImageName, ELF_R_TYPE(Rel->r_info));
     }
   }
       }
@@ -922,7 +952,7 @@ Returns:
   UINT8             *OutImageName;\r
   UINT8             *ModuleType;\r
   CHAR8             *TimeStamp;\r
-  CHAR8             FileName[MAX_STRING_LENGTH];\r
+  CHAR8             FileName[_MAX_PATH];\r
   UINT32            OutImageType;\r
   FILE              *fpIn;\r
   FILE              *fpOut;\r
@@ -941,7 +971,8 @@ Returns:
   UINT32            FileLength;\r
   RUNTIME_FUNCTION  *RuntimeFunction;\r
   UNWIND_INFO       *UnwindInfo;\r
-  STATUS            Status;  \r
+  STATUS            Status;\r
+  BOOLEAN           ReplaceFlag;\r
   EFI_TE_IMAGE_HEADER          TEImageHeader;\r
   EFI_IMAGE_SECTION_HEADER     *SectionHeader;\r
   EFI_IMAGE_DOS_HEADER         *DosHdr;\r
@@ -951,8 +982,6 @@ Returns:
   EFI_IMAGE_DOS_HEADER         BackupDosHdr;\r
   MICROCODE_IMAGE_HEADER       *MciHeader; \r
 \r
-  fprintf (stdout, "GenFw tool start.\n");\r
-\r
   SetUtilityName (UTILITY_NAME);\r
 \r
   //\r
@@ -976,9 +1005,11 @@ Returns:
   FileLength        = 0;\r
   MciHeader         = NULL;\r
   CheckSum          = 0;\r
+  ReplaceFlag       = FALSE;\r
 \r
   if (argc == 1) {\r
-    Usage();\r
+    Error (NULL, 0, 1001, "Missing options", "Input file");\r
+    Usage ();\r
     return STATUS_ERROR;\r
   }\r
   \r
@@ -986,15 +1017,15 @@ Returns:
   argv ++;  \r
 \r
   if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
-    Usage();\r
-    return STATUS_ERROR;    \r
+    Usage ();\r
+    return STATUS_SUCCESS;    \r
   }\r
 \r
-  if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--version") == 0)) {\r
-    Version();\r
-    return STATUS_ERROR;    \r
+  if (stricmp (argv[0], "--version") == 0) {\r
+    Version ();\r
+    return STATUS_SUCCESS;\r
   }\r
-  \r
+\r
   while (argc > 0) {\r
     if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
       OutImageName = argv[1];\r
@@ -1057,7 +1088,7 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--replace") == 0)) {\r
-      OutImageType |= FW_REPLACE_IMAGE;\r
+      ReplaceFlag = TRUE;\r
       argc --;\r
       argv ++;\r
       continue;\r
@@ -1079,7 +1110,7 @@ Returns:
 \r
     if ((stricmp (argv[0], "-a") == 0) || (stricmp (argv[0], "--align") == 0)) {\r
       if (AsciiStringToUint64 (argv[1], FALSE, &Temp64) != EFI_SUCCESS) {\r
-        Error (NULL, 0, 0, NULL, "Your input alginment is incorrect format.\n");\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
       MciAlignment = (UINT32) Temp64;\r
@@ -1090,7 +1121,7 @@ Returns:
 \r
     if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--pad") == 0)) {\r
       if (AsciiStringToUint64 (argv[1], FALSE, &Temp64) != EFI_SUCCESS) {\r
-        Error (NULL, 0, 0, NULL, "Incorrect format of PadValue\n");\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
       MciPadValue = (UINT8) Temp64;\r
@@ -1099,13 +1130,20 @@ Returns:
       continue;\r
     }\r
 \r
+    if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
+      VerboseMode = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
+\r
     //\r
     // Get Input file name\r
     //\r
     if ((InputFileNum == 0) && (InputFileName == NULL)) {\r
       InputFileName = (CHAR8 **) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *));\r
       if (InputFileName == NULL) {\r
-        Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         return EFI_OUT_OF_RESOURCES;\r
       }\r
 \r
@@ -1120,7 +1158,7 @@ Returns:
                                   );\r
 \r
       if (InputFileName == NULL) {\r
-        Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         return EFI_OUT_OF_RESOURCES;\r
       }\r
 \r
@@ -1131,9 +1169,13 @@ Returns:
     argc --;\r
     argv ++;\r
   }\r
+  \r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool start.\n", UTILITY_NAME);\r
+  }\r
 \r
   if (OutImageType == FW_DUMMY_IMAGE) {\r
-    Error (NULL, 0, 0, NULL, "No action specified, such as -e, -c or -t\n");\r
+    Error (NULL, 0, 1001, "Missing option", "No action specified, such as -e, -c or -t\n");\r
     goto Finish;\r
   }\r
 \r
@@ -1141,15 +1183,15 @@ Returns:
   // check input files\r
   //\r
   if (InputFileNum == 0) {\r
-    Error (NULL, 0, 0, NULL, "No input files\n");\r
+    Error (NULL, 0, 1001, "Missing option", "Input files\n");\r
     goto Finish;\r
   }\r
 \r
   //\r
   // Combine MciBinary files to one file\r
   //\r
-  if (OutImageType == (FW_MERGE_IMAGE | FW_REPLACE_IMAGE)) {\r
-    Error (NULL, 0, 0, NULL, "-r replace parameter can't be input together with -j merge files");\r
+  if ((OutImageType == FW_MERGE_IMAGE) && ReplaceFlag) {\r
+    Error (NULL, 0, 1002, "Conflicting option", "-r replace parameter can't be input together with -j merge files");\r
     goto Finish;\r
   }\r
    \r
@@ -1163,33 +1205,31 @@ Returns:
   // if OutImageName == NULL, output data to stdout.\r
   //\r
   if (OutImageName == NULL) {\r
-    if ((OutImageType & FW_REPLACE_IMAGE) != 0) {\r
+    if (ReplaceFlag) {\r
       fpOut = fopen (InImageName, "wb");\r
       if (!fpOut) {\r
-        Error (NULL, 0, 0, InImageName, "could not open input file for modify");\r
+        Error (NULL, 0, 0001, "Error opening file", InImageName);\r
         goto Finish;\r
       }\r
-      OutImageType = OutImageType & ~FW_REPLACE_IMAGE;\r
     } else {\r
-      Error (NULL, 0, 0, NULL, "No output file name is specified.");\r
+      Error (NULL, 0, 1001, "Missing option", "output file\n");\r
       goto Finish;\r
       // binary stream can't be output to string strem stdout\r
       // because 0x0A can be auto converted to 0x0D 0x0A.\r
       // fpOut = stdout;\r
-    } \r
+    }\r
   } else {\r
     fpOut = fopen (OutImageName, "wb");\r
     if (!fpOut) {\r
-      Error (NULL, 0, 0, OutImageName, "could not open output file for writing");\r
+      Error (NULL, 0, 0001, "Error opening file", OutImageName);\r
       goto Finish;\r
     }\r
-    if ((OutImageType & FW_REPLACE_IMAGE) != 0) {\r
+    if (ReplaceFlag != 0) {\r
       fpInOut = fopen (InImageName, "wb");\r
       if (!fpInOut) {\r
-        Error (NULL, 0, 0, InImageName, "could not open input file for modify");\r
+        Error (NULL, 0, 0001, "Error opening file", InImageName);\r
         goto Finish;\r
       }\r
-      OutImageType = OutImageType & ~FW_REPLACE_IMAGE;\r
     }\r
   }
 \r
@@ -1200,14 +1240,14 @@ Returns:
     for (Index = 0; Index < InputFileNum; Index ++) {\r
       fpIn = fopen (InputFileName [Index], "rb");\r
       if (!fpIn) {\r
-        Error (NULL, 0, 0, InputFileName [Index], "failed to open input file for reading");\r
+        Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
         goto Finish;\r
       }\r
     \r
       FileLength = _filelength (fileno (fpIn));\r
       FileBuffer = malloc (FileLength);\r
       if (FileBuffer == NULL) {\r
-        Error (NULL, 0, 0, NULL, "can't allocate enough memory space");\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         fclose (fpIn);\r
         goto Finish;\r
       }\r
@@ -1241,7 +1281,7 @@ Returns:
   if (OutImageType == FW_MCI_IMAGE) {\r
     fpIn = fopen (InImageName, "r");\r
     if (!fpIn) {\r
-      Error (NULL, 0, 0, InImageName, "failed to open input file for reading");\r
+      Error (NULL, 0, 0001, "Error opening file", InImageName);\r
       goto Finish;\r
     }\r
     \r
@@ -1261,11 +1301,11 @@ Returns:
     // Error if no data.\r
     //\r
     if (FileLength == 0) {\r
-      Error (NULL, 0, 0, InImageName, "no parse-able data found in file");\r
+      Error (NULL, 0, 3000, "Invalid", "no parse-able data found in file %s", InImageName);\r
       goto Finish;\r
     }\r
     if (FileLength < sizeof (MICROCODE_IMAGE_HEADER)) {\r
-      Error (NULL, 0, 0, InImageName, "amount of parse-able data is insufficient to contain a microcode header");\r
+      Error (NULL, 0, 3000, "Invalid", "amount of parse-able data in %s is insufficient to contain a microcode header", InImageName);\r
       goto Finish;\r
     }\r
 \r
@@ -1274,7 +1314,7 @@ Returns:
     //\r
     FileBuffer = malloc (FileLength);\r
     if (FileBuffer == NULL) {\r
-      Error (NULL, 0, 0, NULL, "can't allocate enough memory space");\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
       goto Finish;\r
     }\r
     //\r
@@ -1304,7 +1344,7 @@ Returns:
     }\r
 \r
     if (Index != FileLength) {\r
-      Error (NULL, 0, 0, InImageName, "file contents do not contain expected TotalSize 0x%04X", Index);\r
+      Error (NULL, 0, 3000, "Invalid", "file contents of %s do not contain expected TotalSize 0x%04X", InImageName, Index);\r
       goto Finish;\r
     }\r
 \r
@@ -1320,14 +1360,14 @@ Returns:
       Index       += sizeof (UINTN);\r
     }\r
     if (CheckSum != 0) {\r
-      Error (NULL, 0, 0, InImageName, "checksum failed on file contents");\r
+      Error (NULL, 0, 3000, "Invalid", "checksum failed on file contents of %s", InImageName);\r
       goto Finish;\r
     }\r
     //\r
     // Open the output file and write the buffer contents\r
     //\r
     if (fwrite (FileBuffer, FileLength, 1, fpOut) != 1) {\r
-      Error (NULL, 0, 0, OutImageName, "failed to write microcode data to output file");\r
+      Error (NULL, 0, 0002, "Error writing file", OutImageName);\r
       goto Finish;\r
     }\r
     //\r
@@ -1341,14 +1381,14 @@ Returns:
   //\r
   fpIn = fopen (InImageName, "rb");\r
   if (!fpIn) {\r
-    Error (NULL, 0, 0, InImageName, "failed to open input file for reading");\r
+    Error (NULL, 0, 0001, "Error opening file", InImageName);\r
     goto Finish;\r
   }\r
 \r
   FileLength = _filelength (fileno (fpIn));\r
   FileBuffer = malloc (FileLength);\r
   if (FileBuffer == NULL) {\r
-    Error (NULL, 0, 0, NULL, "can't allocate enough memory space");\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
     fclose (fpIn);\r
     goto Finish;\r
   }\r
@@ -1362,7 +1402,7 @@ Returns:
   if (OutImageType == DUMP_TE_HEADER) {\r
     memcpy (&TEImageHeader, FileBuffer, sizeof (TEImageHeader));\r
     if (TEImageHeader.Signature != EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
-      Error (NULL, 0, 0, InImageName, "TE header signature is not correct");\r
+      Error (NULL, 0, 3000, "Invalid", "TE header signature of file %s is not correct", InImageName);\r
       goto Finish;      \r
     }\r
     fprintf (fpOut, "Dump of file %s\n\n", InImageName);\r
@@ -1386,7 +1426,7 @@ Returns:
   if ((OutImageType == FW_EFI_IMAGE) || (OutImageType == FW_TE_IMAGE)) {\r
     if (ModuleType == NULL) {\r
       if (OutImageType == FW_EFI_IMAGE) {\r
-        Error (NULL, 0, 0, NULL, "No ModuleType specified, such as PEIM, DXE_DRIVER\n");\r
+        Error (NULL, 0, 1001, "Missing option", "EFI_FILETYPE");\r
         goto Finish;\r
       } else if (OutImageType == FW_TE_IMAGE) {\r
         //\r
@@ -1423,7 +1463,7 @@ Returns:
         Type = EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER;\r
     \r
       } else {\r
-        Error (NULL, 0, 0, NULL, "%s is not one valid Module type.\n", ModuleType);\r
+        Error (NULL, 0, 1003, "Invalid option value", "EFI_FILETYPE = %s", ModuleType);\r
         goto Finish;\r
       }\r
     }\r
@@ -1443,13 +1483,13 @@ Returns:
   //\r
   DosHdr = (EFI_IMAGE_DOS_HEADER *)FileBuffer;\r
   if (DosHdr->e_magic != EFI_IMAGE_DOS_SIGNATURE) {\r
-    Error (NULL, 0, 0, InImageName, "DOS header signature not found in source image");\r
+    Error (NULL, 0, 3000, "Invalid", "DOS header signature not found in source image");\r
     goto Finish;\r
   }\r
 \r
   PeHdr = (EFI_IMAGE_NT_HEADERS *)(FileBuffer + DosHdr->e_lfanew);\r
   if (PeHdr->Signature != EFI_IMAGE_NT_SIGNATURE) {\r
-    Error (NULL, 0, 0, InImageName, "PE header signature not found in source image");\r
+    Error (NULL, 0, 3000, "Invalid", "PE header signature not found in source image");\r
     goto Finish;\r
   }\r
   \r
@@ -1458,7 +1498,7 @@ Returns:
   //\r
   if (OutImageType == FW_BIN_IMAGE) {\r
     if (FileLength < PeHdr->OptionalHeader.SizeOfHeaders) {\r
-      Error (NULL, 0, 0, InImageName, "FileSize is not a legal size.");\r
+      Error (NULL, 0, 3000, "Invalid", "FileSize of %s is not a legal size.", InImageName);\r
       goto Finish;\r
     }\r
     //\r
@@ -1520,7 +1560,7 @@ Returns:
         }\r
 \r
         if (CheckAcpiTable (FileBuffer + SectionHeader->PointerToRawData, FileLength) != STATUS_SUCCESS) {\r
-          Error (NULL, 0, 0, InImageName, "failed to check ACPI table");\r
+          Error (NULL, 0, 3000, "Invalid", "failed to check ACPI table in %s", InImageName);\r
           goto Finish;\r
         }\r
         \r
@@ -1534,7 +1574,7 @@ Returns:
         goto Finish;\r
       }\r
     }\r
-    Error (NULL, 0, 0, InImageName, "failed to get ACPI table");\r
+    Error (NULL, 0, 3000, "Invalid", "failed to get ACPI table from %s", InImageName);\r
     goto Finish;\r
   }\r
   //\r
@@ -1736,7 +1776,7 @@ Returns:
       //\r
       // Pack the subsystem and NumberOfSections into 1 byte. Make sure they fit both.\r
       //\r
-      Error (NULL, 0, 0, InImageName, "image subsystem or NumberOfSections cannot be packed into 1 byte");\r
+      Error (NULL, 0, 3000, "Invalid", "Image subsystem or NumberOfSections of PeImage %s cannot be packed into 1 byte", InImageName);\r
       goto Finish;\r
     }\r
 \r
@@ -1744,7 +1784,7 @@ Returns:
       //\r
       // TeImage has the same section alignment and file alignment.\r
       //\r
-      Error (NULL, 0, 0, InImageName, "Section-Alignment and File-Alignment does not match for TeImage");\r
+      Error (NULL, 0, 3000, "Invalid", "Section-Alignment and File-Alignment of PeImage %s does not match for TeImage", InImageName);\r
       goto Finish;\r
     }\r
 \r
@@ -1790,9 +1830,11 @@ Finish:
     //\r
     fclose (fpInOut);\r
   }\r
-\r
-  fprintf (stdout, "GenFw tool done with return code is 0x%x.\n", GetUtilityStatus ());  \r
-\r
+  \r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool done with return code is 0x%x.\n", UTILITY_NAME, GetUtilityStatus ());  \r
+  }\r
+  \r
   return GetUtilityStatus ();\r
 }\r
 \r
@@ -1858,7 +1900,7 @@ ZeroDebugData (
   }\r
   \r
   if (Index >= FileHdr->NumberOfSections) {\r
-    Error (NULL, 0, 0, NULL, "Invalid PeImage.");\r
+    Error (NULL, 0, 3000, "Invalid", "PeImage");\r
     return EFI_ABORTED;\r
   }\r
   \r
@@ -1905,7 +1947,10 @@ SetStamp (
   //\r
   // Get time and date that will be set.\r
   //\r
-  \r
+  if (TimeStamp == NULL) {\r
+    Error (NULL, 0, 3000, "Invalid", "TimeData can't be NULL");\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
   //\r
   // compare the value with "NOW", if yes, current system time is set.\r
   //\r
@@ -1926,7 +1971,7 @@ SetStamp (
             &stime.tm_min,\r
             &stime.tm_sec\r
             ) != 6) {\r
-      Error (NULL, 0, 0, TimeStamp, "Invaild date or time!");\r
+      Error (NULL, 0, 3000, "Invalid", "%s Invaild date or time!", TimeStamp);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
@@ -1956,7 +2001,7 @@ SetStamp (
     //\r
     newtime = mktime (&stime);\r
     if (newtime == (time_t) - 1) {\r
-      Error (NULL, 0, 0, TimeStamp, "Invaild date or time!");\r
+      Error (NULL, 0, 3000, "Invalid", "%s Invaild date or time!", TimeStamp);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
index d51c95d..2cc90c2 100644 (file)
@@ -36,13 +36,12 @@ Abstract:
 // GenSec Tool Information\r
 //\r
 #define UTILITY_NAME            "GenSec"\r
-#define UTILITY_MAJOR_VERSION   1\r
-#define UTILITY_MINOR_VERSION   0\r
+#define UTILITY_MAJOR_VERSION   0\r
+#define UTILITY_MINOR_VERSION   1\r
 \r
-#define MAXIMUM_INPUT_FILE_NUM  10\r
 #define MAX_SECTION_SIZE        0x1000000\r
 \r
-CHAR8      *SectionTypeName[] = {\r
+static CHAR8      *SectionTypeName[] = {\r
   NULL,                                 // 0x00 - reserved\r
   "EFI_SECTION_COMPRESSION",            // 0x01\r
   "EFI_SECTION_GUID_DEFINED",           // 0x02\r
@@ -73,8 +72,8 @@ CHAR8      *SectionTypeName[] = {
   "EFI_SECTION_PEI_DEPEX"               // 0x1B\r
 };\r
 \r
-CHAR8      *CompressionTypeName[]    = { "PI_NONE", "PI_STD" };\r
-CHAR8      *GUIDedSectionAttribue[]  = { NULL, "PROCESSING_REQUIRED", "AUTH_STATUS_VALID"};\r
+static CHAR8      *CompressionTypeName[]    = { "PI_NONE", "PI_STD" };\r
+static CHAR8      *GUIDedSectionAttribue[]  = { NULL, "PROCESSING_REQUIRED", "AUTH_STATUS_VALID"};\r
 \r
 //\r
 // Crc32 GUID section related definitions.\r
@@ -84,12 +83,17 @@ typedef struct {
   UINT32                    CRC32Checksum;\r
 } CRC32_SECTION_HEADER;\r
 \r
-EFI_GUID  gZeroGuid                 = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};\r
-EFI_GUID  gEfiCrc32SectionGuid      = EFI_CRC32_GUIDED_SECTION_EXTRACTION_PROTOCOL_GUID;\r
+static EFI_GUID  gZeroGuid                 = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};\r
+static EFI_GUID  gEfiCrc32SectionGuid      = EFI_CRC32_GUIDED_SECTION_EXTRACTION_PROTOCOL_GUID;\r
+\r
+//\r
+// VerboseMode setting\r
+//\r
+static BOOLEAN VerboseMode = FALSE;\r
 \r
 STATIC\r
 VOID \r
-Version(\r
+Version (\r
   VOID\r
   )\r
 /*++\r
@@ -108,8 +112,7 @@ Returns:
   \r
 --*/ \r
 {\r
-  printf ("%s v%d.%d - EDKII Utility to create output file with formed section per the PI spec.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
-  printf ("Copyright (c) 2007 Intel Corporation. All rights reserved.\n");\r
+  fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
 }\r
 \r
 STATIC\r
@@ -118,30 +121,49 @@ Usage (
   VOID\r
   )\r
 {\r
-  Version();\r
-\r
-  printf ("\nUsage: " UTILITY_NAME " [inputfilename]\n\\r
-        -o, --outputfile [FileName]\n\\r
-        -s, --SectionType <EFI_SECTION_COMPRESSION|\n\\r
-                          EFI_SECTION_GUID_DEFINED|\n\\r
-                          EFI_SECTION_PE32|\n\\r
-                          EFI_SECTION_PIC|\n\\r
-                          EFI_SECTION_TE|\n\\r
-                          EFI_SECTION_DXE_DEPEX|\n\\r
-                          EFI_SECTION_VERSION|\n\\r
-                          EFI_SECTION_USER_INTERFACE|\n\\r
-                          EFI_SECTION_COMPATIBILITY16|\n\\r
-                          EFI_SECTION_FIRMWARE_VOLUME_IMAGE|\n\\r
-                          EFI_SECTION_FREEFORM_SUBTYPE_GUID|\n\\r
-                          EFI_SECTION_RAW|\n\\r
-                          EFI_SECTION_PEI_DEPEX>\n\\r
-        -c, --compress <PI_NONE|PI_STD>\n\\r
-        -g, --vendorguid [GuidValue (########-####-####-####-############)]\n\\r
-        -r, --attributes <PROCESSING_REQUIRED|AUTH_STATUS_VALID>\n\\r
-        -n, --name \"string\"\n\\r
-        -j, --buildnumber #### (0000~9999)\n\\r
-        -h, --help\n\\r
-        -V, --version\n");\r
+  //\r
+  // Summary usage\r
+  //\r
+  fprintf (stdout, "Usage: %s [options] <input_file>\n\n", UTILITY_NAME);\r
+  \r
+  //\r
+  // Copyright declaration\r
+  // \r
+  fprintf (stdout, "Copyright (c) 2007, Intel Corporation. All rights reserved.\n\n");\r
+\r
+  //\r
+  // Details Option\r
+  //\r
+  fprintf (stdout, "Options:\n");\r
+  fprintf (stdout, "  -o FileName, --outputfile FileName\n\\r
+                        File is the SectionFile to be created.\n");\r
+  fprintf (stdout, "  -s [SectionType], --sectiontype [SectionType]\n\\r
+                        SectionType defined in PI spec is one type of\n\\r
+                        EFI_SECTION_COMPRESSION, EFI_SECTION_GUID_DEFINED,\n\\r
+                        EFI_SECTION_PE32, EFI_SECTION_PIC, EFI_SECTION_TE,\n\\r
+                        EFI_SECTION_DXE_DEPEX, EFI_SECTION_COMPATIBILITY16,\n\\r
+                        EFI_SECTION_USER_INTERFACE, EFI_SECTION_VERSION,\n\\r
+                        EFI_SECTION_FIRMWARE_VOLUME_IMAGE, EFI_SECTION_RAW,\n\\r
+                        EFI_SECTION_FREEFORM_SUBTYPE_GUID,\n\\r
+                        EFI_SECTION_PEI_DEPEX. if sectiontype is not given, \n\\r
+                        EFI_SECTION_ALL is default type.\n");\r
+  fprintf (stdout, "  -c [Type], --compress [Type]\n\\r
+                        Compress method type can be PI_NONE or PI_STD.\n\\r
+                        if Type is not given, PI_STD is default type.\n"); \r
+  fprintf (stdout, "  -g GuidValue, --vendorguid GuidValue\n\\r
+                        GuidValue is one specific vendor guid value.\n\\r
+                        Its format is 00000000-0000-0000-0000-000000000000\n");\r
+  fprintf (stdout, "  -r GuidAttr, --attributes GuidAttr\n\\r
+                        GuidAttr is guid section atttributes, which may be\n\\r
+                        PROCESSING_REQUIRED or AUTH_STATUS_VALID\n");\r
+  fprintf (stdout, "  -n String, --name String\n\\r
+                        String is a NULL terminated string used in Ui section.\n");\r
+  fprintf (stdout, "  -j Number, --buildnumber Number\n\\r
+                        Number is an integer value between 0000 and 9999\n\\r
+                        used in Ver section.\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
 }\r
 \r
 VOID\r
@@ -207,10 +229,10 @@ Returns:
   STATUS                    Status;\r
 \r
   if (InputFileNum > 1) {\r
-    Error (NULL, 0, 0, "invalid parameter", "more than one input file specified");\r
+    Error (NULL, 0, 2000, "Invalid paramter", "more than one input file specified");\r
     return STATUS_ERROR;\r
   } else if (InputFileNum < 1) {\r
-    Error (NULL, 0, 0, "no input file specified", NULL);\r
+    Error (NULL, 0, 2000, "Invalid paramter", "no input file specified");\r
     return STATUS_ERROR;\r
   }\r
   //\r
@@ -218,7 +240,7 @@ Returns:
   //\r
   InFile = fopen (InputFileName[0], "rb");\r
   if (InFile == NULL) {\r
-    Error (NULL, 0, 0, InputFileName[0], "failed to open input file");\r
+    Error (NULL, 0, 0001, "Error opening file", InputFileName[0]);\r
     return STATUS_ERROR;\r
   }\r
 \r
@@ -239,7 +261,7 @@ Returns:
   // Size must fit in 3 bytes\r
   //\r
   if (TotalLength >= MAX_SECTION_SIZE) {\r
-    Error (NULL, 0, 0, InputFileName[0], "file size (0x%X) exceeds section size limit(%dM).", TotalLength, MAX_SECTION_SIZE>>20);\r
+    Error (NULL, 0, 2000, "Invalid paramter", "%s file size (0x%X) exceeds section size limit(%dM).", InputFileName[0], TotalLength, MAX_SECTION_SIZE>>20);\r
     goto Done;\r
   }\r
   //\r
@@ -254,17 +276,17 @@ Returns:
   if (InputFileLength != 0) {\r
     Buffer = (UINT8 *) malloc ((size_t) InputFileLength);\r
     if (Buffer == NULL) {\r
-      Error (__FILE__, __LINE__, 0, "memory allocation failure", NULL);\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated"); \r
       goto Done;\r
     }\r
 \r
     if (fread (Buffer, (size_t) InputFileLength, 1, InFile) != 1) {\r
-      Error (NULL, 0, 0, InputFileName[0], "failed to read contents of file");\r
+      Error (NULL, 0, 0004, "Error reading file", InputFileName[0]);\r
       goto Done;\r
     }\r
 \r
     if (fwrite (Buffer, (size_t) InputFileLength, 1, OutFile) != 1) {\r
-      Error (NULL, 0, 0, "failed to write to output file", NULL);\r
+      Error (NULL, 0, 0002, "Error writing file", NULL);\r
       goto Done;\r
     }\r
   }\r
@@ -319,12 +341,12 @@ Returns:
   FILE    *InFile;\r
 \r
   if (InputFileNum < 1) {\r
-    Error (NULL, 0, 0, "must specify at least one input file", NULL);\r
+    Error (NULL, 0, 2000, "Invalid paramter", "must specify at least one input file");\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   if (BufferLength == NULL) {\r
-    Error (NULL, 0, 0, "BufferLength can't be NULL", NULL);\r
+    Error (NULL, 0, 2000, "Invalid paramter", "BufferLength can't be NULL");\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -349,7 +371,7 @@ Returns:
     //\r
     InFile = fopen (InputFileName[Index], "rb");\r
     if (InFile == NULL) {\r
-      Error (NULL, 0, 0, InputFileName[Index], "failed to open input file");\r
+      Error (NULL, 0, 0001, "Error opening file", InputFileName[Index]);\r
       return EFI_ABORTED;\r
     }\r
 \r
@@ -362,7 +384,7 @@ Returns:
     //\r
     if (FileSize > 0 && FileBuffer != NULL && (Size + FileSize) <= *BufferLength) {\r
       if (fread (FileBuffer + Size, (size_t) FileSize, 1, InFile) != 1) {\r
-        Error (NULL, 0, 0, InputFileName[Index], "failed to read contents of input file");\r
+        Error (NULL, 0, 0004, "Error reading file", InputFileName[Index]);\r
         fclose (InFile);\r
         return EFI_ABORTED;\r
       }\r
@@ -442,7 +464,7 @@ Returns:
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
     FileBuffer = (UINT8 *) malloc (InputLength);\r
     if (FileBuffer == NULL) {\r
-      Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     //\r
@@ -478,7 +500,7 @@ Returns:
     break;\r
 \r
   default:\r
-    Error (NULL, 0, 0, "unknown compression type", NULL);\r
+    Error (NULL, 0, 2000, "Invalid paramter", "unknown compression type");\r
     free (FileBuffer);\r
     return EFI_ABORTED;\r
   }\r
@@ -510,7 +532,7 @@ Returns:
 \r
   TotalLength = CompressedLength + sizeof (EFI_COMPRESSION_SECTION);\r
   if (TotalLength >= MAX_SECTION_SIZE) {\r
-    Error (__FILE__, __LINE__, 0, "input error", "The size of all files exceeds section size limit(%dM).", MAX_SECTION_SIZE>>20);\r
+    Error (NULL, 0, 2000, "Invalid paramter", "The size of all files exceeds section size limit(%dM).", MAX_SECTION_SIZE>>20);\r
     if (FileBuffer != NULL) {\r
       free (FileBuffer);\r
     }\r
@@ -598,7 +620,7 @@ Returns:
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
     FileBuffer = (UINT8 *) malloc (InputLength);\r
     if (FileBuffer == NULL) {\r
-      Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     //\r
@@ -631,7 +653,7 @@ Returns:
 \r
     TotalLength = InputLength + sizeof (CRC32_SECTION_HEADER);\r
     if (TotalLength >= MAX_SECTION_SIZE) {\r
-      Error (__FILE__, __LINE__, 0, "input error", "The size of all files exceeds section size limit(%dM).", MAX_SECTION_SIZE>>20);\r
+      Error (NULL, 0, 2000, "Invalid paramter", "The size of all files exceeds section size limit(%dM).", MAX_SECTION_SIZE>>20);\r
       free (FileBuffer);\r
       return STATUS_ERROR;\r
     }\r
@@ -649,7 +671,7 @@ Returns:
   } else {\r
     TotalLength = InputLength + sizeof (EFI_GUID_DEFINED_SECTION);\r
     if (TotalLength >= MAX_SECTION_SIZE) {\r
-      Error (__FILE__, __LINE__, 0, "input error", "The size of all files exceeds section size limit(%dM).", MAX_SECTION_SIZE>>20);\r
+      Error (NULL, 0, 2000, "Invalid paramter", "The size of all files exceeds section size limit(%dM).", MAX_SECTION_SIZE>>20);\r
       free (FileBuffer);\r
       return STATUS_ERROR;\r
     }\r
@@ -711,15 +733,12 @@ Returns:
   UINT32                    InputLength;\r
   UINT8                     *FileBuffer;\r
   EFI_STATUS                Status;\r
\r
-  fprintf (stdout, "GenSec tool start.\n");  \r
   \r
   InputFileName         = NULL;\r
   OutputFileName        = NULL;\r
   SectionName           = NULL;\r
   CompressionName       = NULL;\r
   StringBuffer          = "";\r
-\r
   InFile                = NULL;\r
   OutFile               = NULL;\r
   VersionNumber         = 0;\r
@@ -731,10 +750,10 @@ Returns:
   InputLength           = 0;\r
   Status                = STATUS_SUCCESS;\r
   \r
-\r
   SetUtilityName (UTILITY_NAME);\r
   \r
   if (argc == 1) {\r
+    Error (NULL, 0, 1001, "Missing options", "Input file");\r
     Usage ();\r
     return STATUS_ERROR;\r
   }\r
@@ -747,12 +766,12 @@ Returns:
 \r
   if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
     Usage();\r
-    return STATUS_ERROR;    \r
+    return STATUS_SUCCESS;    \r
   }\r
 \r
-  if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--version") == 0)) {\r
-    Version();\r
-    return STATUS_ERROR;    \r
+  if (stricmp (argv[0], "--version") == 0) {\r
+    Version ();\r
+    return STATUS_SUCCESS;    \r
   }\r
 \r
   while (argc > 0) {\r
@@ -780,7 +799,7 @@ Returns:
     if ((stricmp (argv[0], "-g") == 0) || (stricmp (argv[0], "--vendorguid") == 0)) {\r
       Status = StringToGuid (argv[1], &VendorGuid);\r
       if (EFI_ERROR (Status)) {\r
-        Error (NULL, 0, 0, NULL, "ERROR: %s is not a formal GUID value.", argv[1]);\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
       argc -= 2;\r
@@ -794,7 +813,7 @@ Returns:
       } else if (stricmp (argv[1], GUIDedSectionAttribue[EFI_GUIDED_SECTION_AUTH_STATUS_VALID]) == 0) {\r
         SectGuidAttribute |= EFI_GUIDED_SECTION_AUTH_STATUS_VALID;\r
       } else {\r
-        Error (NULL, 0, 0, argv[1], "unknown Guid Section Attribute");\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
       argc -= 2;\r
@@ -815,7 +834,7 @@ Returns:
       //\r
       for (Index = 0; Index < strlen (argv[1]); Index++) {\r
         if ((argv[1][Index] != '-') && (isdigit (argv[1][Index]) == 0)) {\r
-          Error (NULL, 0, 0, NULL, "ERROR: %s is not a valid integer.", argv[1]);\r
+          Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
           goto Finish;\r
         }\r
       }\r
@@ -826,13 +845,19 @@ Returns:
       continue;\r
     }\r
 \r
+    if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
+      VerboseMode = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
     //\r
     // Get Input file name\r
     //\r
     if ((InputFileNum == 0) && (InputFileName == NULL)) {\r
       InputFileName = (CHAR8 **) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *));\r
       if (InputFileName == NULL) {\r
-        Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         return EFI_OUT_OF_RESOURCES;\r
       }\r
 \r
@@ -847,7 +872,7 @@ Returns:
                                   );\r
 \r
       if (InputFileName == NULL) {\r
-        Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         return EFI_OUT_OF_RESOURCES;\r
       }\r
 \r
@@ -859,6 +884,9 @@ Returns:
     argv ++;\r
   }\r
 \r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool start.\n", UTILITY_NAME);\r
+  }\r
   //\r
   // Parse all command line parameters to get the corresponding section type.\r
   //\r
@@ -879,7 +907,7 @@ Returns:
     } else if (stricmp (CompressionName, CompressionTypeName[EFI_STANDARD_COMPRESSION]) == 0) {\r
       SectCompSubType = EFI_STANDARD_COMPRESSION;\r
     } else {\r
-      Error (NULL, 0, 0, CompressionName, "unknown compression type");\r
+      Error (NULL, 0, 1003, "Invalid option value", "--compress = %s", CompressionName);\r
       goto Finish;\r
     }\r
   } else if (stricmp (SectionName, SectionTypeName[EFI_SECTION_GUID_DEFINED]) == 0) {\r
@@ -903,13 +931,13 @@ Returns:
   } else if (stricmp (SectionName, SectionTypeName[EFI_SECTION_VERSION]) == 0) {\r
     SectType = EFI_SECTION_VERSION;\r
     if (VersionNumber < 0 || VersionNumber > 9999) {\r
-      Error (NULL, 0, 0, NULL, "%d is illegal version number\n", VersionNumber);\r
+      Error (NULL, 0, 1003, "Invalid option value", "%d is not in 0~9999", VersionNumber);\r
       goto Finish;\r
     }\r
   } else if (stricmp (SectionName, SectionTypeName[EFI_SECTION_USER_INTERFACE]) == 0) {\r
     SectType = EFI_SECTION_USER_INTERFACE;\r
     if (StringBuffer[0] == '\0') {\r
-      Error (NULL, 0, 0, "user interface string not specified", NULL);\r
+      Error (NULL, 0, 1001, "Missing option", "user interface string");\r
       goto Finish;\r
     }\r
   } else if (stricmp (SectionName, SectionTypeName[EFI_SECTION_COMPATIBILITY16]) == 0) {\r
@@ -923,7 +951,7 @@ Returns:
   } else if (stricmp (SectionName, SectionTypeName[EFI_SECTION_PEI_DEPEX]) == 0) {\r
     SectType = EFI_SECTION_PEI_DEPEX;\r
   } else {\r
-    Error (NULL, 0, 0, SectionName, "unknown section type");\r
+    Error (NULL, 0, 1003, "Invalid option value", "SectionType = %s", SectionName);\r
     goto Finish;\r
   }\r
   \r
@@ -932,7 +960,7 @@ Returns:
     // The input file are required for those section type.\r
     //\r
     if (InputFileNum == 0) {\r
-      Error (NULL, 0, 0, NULL, "No input files is specified.");\r
+      Error (NULL, 0, 1001, "Missing options", "Input files");\r
       goto Finish;\r
     }\r
   }\r
@@ -941,7 +969,7 @@ Returns:
   // Open output file\r
   //\r
   if (OutputFileName == NULL) {\r
-    Error (NULL, 0, 0, NULL, "No output file name is specified.");\r
+    Error (NULL, 0, 1001, "Missing options", "Output file");\r
     goto Finish;\r
     // OutFile = stdout;\r
   } else {\r
@@ -949,7 +977,7 @@ Returns:
   }\r
 \r
   if (OutFile == NULL) {\r
-    Error (NULL, 0, 0, OutputFileName, "failed to open output file for writing");\r
+    Error (NULL, 0, 0001, "Error opening file", OutputFileName);\r
     goto Finish;\r
   }\r
   \r
@@ -1026,7 +1054,7 @@ Returns:
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
       FileBuffer = (UINT8 *) malloc (InputLength);\r
       if (FileBuffer == NULL) {\r
-        Error (__FILE__, __LINE__, 0, "application error", "failed to allocate memory");\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
         goto Finish;\r
       }\r
       //\r
@@ -1070,8 +1098,10 @@ Finish:
   if (OutFile != NULL) {\r
     fclose (OutFile);\r
   }\r
-\r
-  fprintf (stdout, "GenSec tool done with return code is 0x%x.\n", GetUtilityStatus ()); \r
+  \r
+  if (VerboseMode) {\r
+    fprintf (stdout, "%s tool done with return code is 0x%x.\n", UTILITY_NAME, GetUtilityStatus ());  \r
+  }\r
 \r
   return GetUtilityStatus ();\r
 }\r
index 6c49e52..9219e66 100644 (file)
@@ -3,7 +3,7 @@ MAKEROOT ?= ..
 
 APPNAME = GenVtf
 
-LIBS = -lCommon -lString
+LIBS = -lCommon
 
 OBJECTS = GenVtf.o
 
index 1bd3bb3..5fb88f3 100644 (file)
@@ -3,7 +3,7 @@ MAKEROOT ?= ..
 
 APPNAME = TianoCompress
 
-LIBS = -lCommon -lString
+LIBS = -lCommon
 
 OBJECTS = TianoCompress.o