]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFv/GenFv.c
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / C / GenFv / GenFv.c
index 8f452c7374f6765a58daabc10316312937d3b2ea..77537552bd40fcc2e32938cb3d6b30902e243984 100644 (file)
@@ -1,25 +1,18 @@
 /** @file\r
-\r
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-\r
-Module Name:\r
-\r
-  GenFv.c\r
-\r
-Abstract:\r
-\r
-  This contains all code necessary to build the GenFvImage.exe utility.       \r
+  This contains all code necessary to build the GenFvImage.exe utility.\r
   This utility relies heavily on the GenFvImage Lib.  Definitions for both\r
-  can be found in the Tiano Firmware Volume Generation Utility \r
+  can be found in the Tiano Firmware Volume Generation Utility\r
   Specification, review draft.\r
 \r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
 **/\r
 \r
 //\r
@@ -42,9 +35,10 @@ Abstract:
 #define UTILITY_MINOR_VERSION 1\r
 \r
 EFI_GUID  mEfiFirmwareFileSystem2Guid = EFI_FIRMWARE_FILE_SYSTEM2_GUID;\r
+EFI_GUID  mEfiFirmwareFileSystem3Guid = EFI_FIRMWARE_FILE_SYSTEM3_GUID;\r
 \r
 STATIC\r
-VOID \r
+VOID\r
 Version (\r
   VOID\r
 )\r
@@ -68,7 +62,7 @@ Returns:
 }\r
 \r
 STATIC\r
-VOID \r
+VOID\r
 Usage (\r
   VOID\r
   )\r
@@ -92,11 +86,11 @@ Returns:
   // Summary usage\r
   //\r
   fprintf (stdout, "\nUsage: %s [options]\n\n", UTILITY_NAME);\r
-  \r
+\r
   //\r
   // Copyright declaration\r
-  // \r
-  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
+  //\r
+  fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -124,12 +118,17 @@ Returns:
                         Address is the rebase start address for drivers that\n\\r
                         run in Flash. It supports DEC or HEX digital format.\n\\r
                         If it is set to zero, no rebase action will be taken\n");\r
+  fprintf (stdout, "  -F ForceRebase, --force-rebase ForceRebase\n\\r
+                        If value is TRUE, will always take rebase action\n\\r
+                        If value is FALSE, will always not take reabse action\n\\r
+                        If not specified, will take rebase action if rebase address greater than zero, \n\\r
+                        will not take rebase action if rebase address is zero.\n");\r
   fprintf (stdout, "  -a AddressFile, --addrfile AddressFile\n\\r
                         AddressFile is one file used to record the child\n\\r
                         FV base address when current FV base address is set.\n");\r
   fprintf (stdout, "  -m logfile, --map logfile\n\\r
                         Logfile is the output fv map file name. if it is not\n\\r
-                        given, the FvName.map will be the default map file name\n"); \r
+                        given, the FvName.map will be the default map file name\n");\r
   fprintf (stdout, "  -g Guid, --guid Guid\n\\r
                         GuidValue is one specific capsule guid value\n\\r
                         or fv file system guid value.\n\\r
@@ -138,9 +137,11 @@ Returns:
                         Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
   fprintf (stdout, "  --capflag CapFlag     Capsule Reset Flag can be PersistAcrossReset,\n\\r
                         or PopulateSystemTable or InitiateReset or not set\n");\r
+  fprintf (stdout, "  --capoemflag CapOEMFlag\n\\r
+                        Capsule OEM Flag is an integer between 0x0000 and 0xffff\n");\r
   fprintf (stdout, "  --capheadsize HeadSize\n\\r
                         HeadSize is one HEX or DEC format value\n\\r
-                        HeadSize is required by Capsule Image.\n");                        \r
+                        HeadSize is required by Capsule Image.\n");\r
   fprintf (stdout, "  -c, --capsule         Create Capsule Image.\n");\r
   fprintf (stdout, "  -p, --dump            Dump Capsule Image header.\n");\r
   fprintf (stdout, "  -v, --verbose         Turn on verbose output with informational messages.\n");\r
@@ -169,14 +170,14 @@ Arguments:
   FvInfFileName      The name of an FV image description file or Capsule Image.\r
 \r
   Arguments come in pair in any order.\r
-    -I FvInfFileName \r
+    -I FvInfFileName\r
 \r
 Returns:\r
 \r
   EFI_SUCCESS            No error conditions detected.\r
   EFI_INVALID_PARAMETER  One or more of the input parameters is invalid.\r
-  EFI_OUT_OF_RESOURCES   A resource required by the utility was unavailable.  \r
-                         Most commonly this will be memory allocation \r
+  EFI_OUT_OF_RESOURCES   A resource required by the utility was unavailable.\r
+                         Most commonly this will be memory allocation\r
                          or file creation.\r
   EFI_LOAD_ERROR         GenFvImage.lib could not be loaded.\r
   EFI_ABORTED            Error executing the GenFvImage lib.\r
@@ -215,7 +216,7 @@ Returns:
   Status        = EFI_SUCCESS;\r
 \r
   SetUtilityName (UTILITY_NAME);\r
-  \r
+\r
   if (argc == 1) {\r
     Error (NULL, 0, 1001, "Missing options", "No input options specified.");\r
     Usage ();\r
@@ -226,12 +227,13 @@ Returns:
   // Init global data to Zero\r
   //\r
   memset (&mFvDataInfo, 0, sizeof (FV_INFO));\r
-  memset (&mCapDataInfo, 0, sizeof (CAP_INFO)); \r
+  memset (&mCapDataInfo, 0, sizeof (CAP_INFO));\r
   //\r
   // Set the default FvGuid\r
   //\r
   memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
-   \r
+  mFvDataInfo.ForceRebase = -1;\r
+\r
   //\r
   // Parse command line\r
   //\r
@@ -241,12 +243,12 @@ Returns:
   if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
     Version ();\r
     Usage ();\r
-    return STATUS_SUCCESS;    \r
+    return STATUS_SUCCESS;\r
   }\r
 \r
   if (stricmp (argv[0], "--version") == 0) {\r
     Version ();\r
-    return STATUS_SUCCESS;    \r
+    return STATUS_SUCCESS;\r
   }\r
 \r
   while (argc > 0) {\r
@@ -258,7 +260,7 @@ Returns:
       }\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-a") == 0) || (stricmp (argv[0], "--addrfile") == 0)) {\r
@@ -269,7 +271,7 @@ Returns:
       }\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--outputfile") == 0)) {\r
@@ -280,97 +282,122 @@ Returns:
       }\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) {\r
       Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
-        return STATUS_ERROR;        \r
+        return STATUS_ERROR;\r
       }\r
       mFvDataInfo.BaseAddress    = TempNumber;\r
       mFvDataInfo.BaseAddressSet = TRUE;\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-b") == 0) || (stricmp (argv[0], "--blocksize") == 0)) {\r
       Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
-        return STATUS_ERROR;        \r
+        return STATUS_ERROR;\r
       }\r
       if (TempNumber == 0) {\r
         Error (NULL, 0, 1003, "Invalid option value", "Fv block size can't be be set to zero");\r
-        return STATUS_ERROR;        \r
+        return STATUS_ERROR;\r
       }\r
       mFvDataInfo.FvBlocks[0].Length = (UINT32) TempNumber;\r
       DebugMsg (NULL, 0, 9, "FV Block Size", "%s = 0x%llx", EFI_BLOCK_SIZE_STRING, (unsigned long long) TempNumber);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-n") == 0) || (stricmp (argv[0], "--numberblock") == 0)) {\r
       Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
-        return STATUS_ERROR;        \r
+        return STATUS_ERROR;\r
       }\r
       if (TempNumber == 0) {\r
         Error (NULL, 0, 1003, "Invalid option value", "Fv block number can't be set to zero");\r
-        return STATUS_ERROR;        \r
+        return STATUS_ERROR;\r
       }\r
       mFvDataInfo.FvBlocks[0].NumBlocks = (UINT32) TempNumber;\r
       DebugMsg (NULL, 0, 9, "FV Number Block", "%s = 0x%llx", EFI_NUM_BLOCKS_STRING, (unsigned long long) TempNumber);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
-    if ((stricmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--ffsfile") == 0)) {\r
+    if ((strcmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--ffsfile") == 0)) {\r
       if (argv[1] == NULL) {\r
         Error (NULL, 0, 1003, "Invalid option value", "Input Ffsfile can't be null");\r
         return STATUS_ERROR;\r
       }\r
-      strcpy (mFvDataInfo.FvFiles[Index], argv[1]);\r
+      if (strlen (argv[1]) > MAX_LONG_FILE_PATH - 1) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Input Ffsfile name %s is too long!", argv[1]);\r
+        return STATUS_ERROR;\r
+      }\r
+      strncpy (mFvDataInfo.FvFiles[Index], argv[1], MAX_LONG_FILE_PATH - 1);\r
+      mFvDataInfo.FvFiles[Index][MAX_LONG_FILE_PATH - 1] = 0;\r
       DebugMsg (NULL, 0, 9, "FV component file", "the %uth name is %s", (unsigned) Index + 1, argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
 \r
       if (argc > 0) {\r
-                   if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--filetakensize") == 0)) {\r
-                     if (argv[1] == NULL) {\r
-                       Error (NULL, 0, 1003, "Invalid option value", "Ffsfile Size can't be null");\r
-                       return STATUS_ERROR;\r
-                     }\r
-                     Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
-                     if (EFI_ERROR (Status)) {\r
-                       Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
-                       return STATUS_ERROR;        \r
-                     }\r
-                     mFvDataInfo.SizeofFvFiles[Index] = (UINT32) TempNumber;\r
-               DebugMsg (NULL, 0, 9, "FV component file size", "the %uth size is %s", (unsigned) Index + 1, argv[1]);\r
-               argc -= 2;\r
-               argv += 2;\r
+        if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--filetakensize") == 0)) {\r
+          if (argv[1] == NULL) {\r
+            Error (NULL, 0, 1003, "Invalid option value", "Ffsfile Size can't be null");\r
+            return STATUS_ERROR;\r
+          }\r
+          Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
+          if (EFI_ERROR (Status)) {\r
+            Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
+            return STATUS_ERROR;\r
+          }\r
+          mFvDataInfo.SizeofFvFiles[Index] = (UINT32) TempNumber;\r
+          DebugMsg (NULL, 0, 9, "FV component file size", "the %uth size is %s", (unsigned) Index + 1, argv[1]);\r
+          argc -= 2;\r
+          argv += 2;\r
         }\r
       }\r
       Index ++;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--filetakensize") == 0)) {\r
       Error (NULL, 0, 1003, "Invalid option", "It must be specified together with -f option to specify the file size.");\r
-      return STATUS_ERROR; \r
+      return STATUS_ERROR;\r
     }\r
 \r
     if ((stricmp (argv[0], "-c") == 0) || (stricmp (argv[0], "--capsule") == 0)) {\r
       CapsuleFlag = TRUE;\r
       argc --;\r
       argv ++;\r
-      continue; \r
+      continue;\r
+    }\r
+\r
+    if ((strcmp (argv[0], "-F") == 0) || (stricmp (argv[0], "--force-rebase") == 0)) {\r
+      if (argv[1] == NULL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Froce rebase flag can't be null");\r
+        return STATUS_ERROR;\r
+      }\r
+\r
+      if (stricmp (argv[1], "TRUE") == 0) {\r
+        mFvDataInfo.ForceRebase = 1;\r
+      } else if (stricmp (argv[1], "FALSE") == 0) {\r
+        mFvDataInfo.ForceRebase = 0;\r
+      } else {\r
+        Error (NULL, 0, 1003, "Invalid option value", "froce rebase flag value must be \"TRUE\" or \"FALSE\"");\r
+        return STATUS_ERROR;\r
+      }\r
+\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue;\r
     }\r
 \r
     if (stricmp (argv[0], "--capheadsize") == 0) {\r
@@ -380,13 +407,13 @@ Returns:
       Status = AsciiStringToUint64 (argv[1], FALSE, &TempNumber);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
-        return STATUS_ERROR;        \r
+        return STATUS_ERROR;\r
       }\r
       mCapDataInfo.HeaderSize = (UINT32) TempNumber;\r
       DebugMsg (NULL, 0, 9, "Capsule Header size", "%s = 0x%llx", EFI_CAPSULE_HEADER_SIZE_STRING, (unsigned long long) TempNumber);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if (stricmp (argv[0], "--capflag") == 0) {\r
@@ -410,7 +437,23 @@ Returns:
       DebugMsg (NULL, 0, 9, "Capsule Flag", argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
+    }\r
+\r
+    if (stricmp (argv[0], "--capoemflag") == 0) {\r
+      if (argv[1] == NULL) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Capsule OEM flag can't be null");\r
+      }\r
+      Status = AsciiStringToUint64(argv[1], FALSE, &TempNumber);\r
+      if (EFI_ERROR (Status) || TempNumber > 0xffff) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "Capsule OEM flag value must be integer value between 0x0000 and 0xffff");\r
+        return STATUS_ERROR;\r
+      }\r
+      mCapDataInfo.Flags |= TempNumber;\r
+      DebugMsg( NULL, 0, 9, "Capsule OEM Flags", argv[1]);\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue;\r
     }\r
 \r
     if (stricmp (argv[0], "--capguid") == 0) {\r
@@ -425,7 +468,7 @@ Returns:
       DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-g") == 0) || (stricmp (argv[0], "--guid") == 0)) {\r
@@ -443,7 +486,7 @@ Returns:
       DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_FILESYSTEMGUID_STRING, argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if (stricmp (argv[0], "--FvNameGuid") == 0) {\r
@@ -459,14 +502,14 @@ Returns:
       DebugMsg (NULL, 0, 9, "FV Name Guid", "%s = %s", EFI_FV_NAMEGUID_STRING, argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--dump") == 0)) {\r
       DumpCapsule = TRUE;\r
       argc --;\r
       argv ++;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-m") == 0) || (stricmp (argv[0], "--map") == 0)) {\r
@@ -477,7 +520,7 @@ Returns:
       }\r
       argc -= 2;\r
       argv += 2;\r
-      continue; \r
+      continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-v") == 0) || (stricmp (argv[0], "--verbose") == 0)) {\r
@@ -521,7 +564,7 @@ Returns:
   }\r
 \r
   VerboseMsg ("%s tool start.", UTILITY_NAME);\r
-  \r
+\r
   //\r
   // check input parameter, InfFileName can be NULL\r
   //\r
@@ -538,7 +581,7 @@ Returns:
   if (OutFileName != NULL) {\r
     VerboseMsg ("the output file name is %s", OutFileName);\r
   }\r
-  \r
+\r
   //\r
   // Read the INF file image\r
   //\r
@@ -548,7 +591,7 @@ Returns:
       return STATUS_ERROR;\r
     }\r
   }\r
-  \r
+\r
   if (DumpCapsule) {\r
     VerboseMsg ("Dump the capsule header information for the input capsule image %s", InfFileName);\r
     //\r
@@ -558,29 +601,31 @@ Returns:
     if (OutFileName == NULL) {\r
       FpFile = stdout;\r
     } else {\r
-      FpFile = fopen (OutFileName, "w");\r
+      FpFile = fopen (LongFilePath (OutFileName), "w");\r
       if (FpFile == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", OutFileName);\r
         return STATUS_ERROR;\r
       }\r
     }\r
-    fprintf (FpFile, "Capsule %s Image Header Information\n", InfFileName);\r
-    fprintf (FpFile, "  GUID                  %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n", \r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data1,\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data2,\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data3,\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[0],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[1],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[2],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[3],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[4],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[5],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[6],\r
-                    (unsigned) CapsuleHeader->CapsuleGuid.Data4[7]);\r
-    fprintf (FpFile, "  Header size           0x%08X\n", (unsigned) CapsuleHeader->HeaderSize);\r
-    fprintf (FpFile, "  Flags                 0x%08X\n", (unsigned) CapsuleHeader->Flags);\r
-    fprintf (FpFile, "  Capsule image size    0x%08X\n", (unsigned) CapsuleHeader->CapsuleImageSize);\r
-    fclose (FpFile);\r
+    if (FpFile != NULL) {\r
+      fprintf (FpFile, "Capsule %s Image Header Information\n", InfFileName);\r
+      fprintf (FpFile, "  GUID                  %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data1,\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data2,\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data3,\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[0],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[1],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[2],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[3],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[4],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[5],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[6],\r
+                      (unsigned) CapsuleHeader->CapsuleGuid.Data4[7]);\r
+      fprintf (FpFile, "  Header size           0x%08X\n", (unsigned) CapsuleHeader->HeaderSize);\r
+      fprintf (FpFile, "  Flags                 0x%08X\n", (unsigned) CapsuleHeader->Flags);\r
+      fprintf (FpFile, "  Capsule image size    0x%08X\n", (unsigned) CapsuleHeader->CapsuleImageSize);\r
+      fclose (FpFile);\r
+    }\r
   } else if (CapsuleFlag) {\r
     VerboseMsg ("Create capsule image");\r
     //\r
@@ -591,13 +636,18 @@ Returns:
     }\r
 \r
     Status = GenerateCapImage (\r
-              InfFileImage, \r
+              InfFileImage,\r
               InfFileSize,\r
               OutFileName\r
               );\r
   } else {\r
     VerboseMsg ("Create Fv image and its map file");\r
-    if (mFvDataInfo.BaseAddress != 0) {\r
+    //\r
+    // Will take rebase action at below situation:\r
+    // 1. ForceRebase Flag specified to TRUE;\r
+    // 2. ForceRebase Flag not specified, BaseAddress greater than zero.\r
+    //\r
+    if (((mFvDataInfo.BaseAddress > 0) && (mFvDataInfo.ForceRebase == -1)) || (mFvDataInfo.ForceRebase == 1)) {\r
       VerboseMsg ("FvImage Rebase Address is 0x%llX", (unsigned long long) mFvDataInfo.BaseAddress);\r
     }\r
     //\r
@@ -617,12 +667,12 @@ Returns:
   if (InfFileImage != NULL) {\r
     free (InfFileImage);\r
   }\r
-  \r
+\r
   //\r
   //  update boot driver address and runtime driver address in address file\r
   //\r
   if (Status == EFI_SUCCESS && AddrFileName != NULL && mFvBaseAddressNumber > 0) {\r
-    FpFile = fopen (AddrFileName, "w");\r
+    FpFile = fopen (LongFilePath (AddrFileName), "w");\r
     if (FpFile == NULL) {\r
       Error (NULL, 0, 0001, "Error opening file", AddrFileName);\r
       return STATUS_ERROR;\r
@@ -639,7 +689,7 @@ Returns:
     fflush (FpFile);\r
     fclose (FpFile);\r
   }\r
-  \r
+\r
   if (Status == EFI_SUCCESS) {\r
     DebugMsg (NULL, 0, 9, "The Total Fv Size", "%s = 0x%x", EFI_FV_TOTAL_SIZE_STRING, (unsigned) mFvTotalSize);\r
     DebugMsg (NULL, 0, 9, "The used Fv Size", "%s = 0x%x", EFI_FV_TAKEN_SIZE_STRING, (unsigned) mFvTakenSize);\r