]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/Fv.py
BaseTools: fix None comparisons
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fv.py
index fd5ad0e9ac382f104a8a249bec7529dc940ca52f..aae644bef9058d3a415b910584f236ca5705c41d 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # process FV generation\r
 #\r
 ## @file\r
 # process FV generation\r
 #\r
-#  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
 ##\r
 # Import Modules\r
 #\r
 ##\r
 # Import Modules\r
 #\r
-import os\r
-import shutil\r
+import Common.LongFilePathOs as os\r
 import subprocess\r
 import StringIO\r
 from struct import *\r
 \r
 import Ffs\r
 import AprioriSection\r
 import subprocess\r
 import StringIO\r
 from struct import *\r
 \r
 import Ffs\r
 import AprioriSection\r
+import FfsFileStatement\r
 from GenFdsGlobalVariable import GenFdsGlobalVariable\r
 from GenFds import GenFds\r
 from CommonDataClass.FdfClass import FvClassObject\r
 from Common.Misc import SaveFileOnChange\r
 from GenFdsGlobalVariable import GenFdsGlobalVariable\r
 from GenFds import GenFds\r
 from CommonDataClass.FdfClass import FvClassObject\r
 from Common.Misc import SaveFileOnChange\r
+from Common.LongFilePathSupport import CopyLongFilePath\r
+from Common.LongFilePathSupport import OpenLongFilePath as open\r
 \r
 T_CHAR_LF = '\n'\r
 \r
 T_CHAR_LF = '\n'\r
+FV_UI_EXT_ENTY_GUID = 'A67DF1FA-8DE8-4E98-AF09-4BDF2EFFBC7C'\r
 \r
 ## generate FV\r
 #\r
 \r
 ## generate FV\r
 #\r
@@ -48,6 +51,8 @@ class FV (FvClassObject):
         self.CapsuleName = None\r
         self.FvBaseAddress = None\r
         self.FvForceRebase = None\r
         self.CapsuleName = None\r
         self.FvBaseAddress = None\r
         self.FvForceRebase = None\r
+        self.FvRegionInFD = None\r
+        self.UsedSizeEnable = False\r
         \r
     ## AddToBuffer()\r
     #\r
         \r
     ## AddToBuffer()\r
     #\r
@@ -63,16 +68,16 @@ class FV (FvClassObject):
     #   @param  MacroDict   macro value pair\r
     #   @retval string      Generated FV file path\r
     #\r
     #   @param  MacroDict   macro value pair\r
     #   @retval string      Generated FV file path\r
     #\r
-    def AddToBuffer (self, Buffer, BaseAddress=None, BlockSize= None, BlockNum=None, ErasePloarity='1', VtfDict=None, MacroDict = {}) :\r
+    def AddToBuffer (self, Buffer, BaseAddress=None, BlockSize= None, BlockNum=None, ErasePloarity='1', VtfDict=None, MacroDict = {}, Flag=False) :\r
 \r
 \r
-        if BaseAddress == None and self.UiFvName.upper() + 'fv' in GenFds.ImageBinDict.keys():\r
+        if BaseAddress is None and self.UiFvName.upper() + 'fv' in GenFds.ImageBinDict.keys():\r
             return GenFds.ImageBinDict[self.UiFvName.upper() + 'fv']\r
         \r
         #\r
         # Check whether FV in Capsule is in FD flash region.\r
         # If yes, return error. Doesn't support FV in Capsule image is also in FD flash region.\r
         #\r
             return GenFds.ImageBinDict[self.UiFvName.upper() + 'fv']\r
         \r
         #\r
         # Check whether FV in Capsule is in FD flash region.\r
         # If yes, return error. Doesn't support FV in Capsule image is also in FD flash region.\r
         #\r
-        if self.CapsuleName != None:\r
+        if self.CapsuleName is not None:\r
             for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():\r
                 FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName]\r
                 for RegionObj in FdObj.RegionList:\r
             for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():\r
                 FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName]\r
                 for RegionObj in FdObj.RegionList:\r
@@ -84,13 +89,15 @@ class FV (FvClassObject):
                                 continue\r
                             elif self.UiFvName.upper() == RegionData.upper():\r
                                 GenFdsGlobalVariable.ErrorLogger("Capsule %s in FD region can't contain a FV %s in FD region." % (self.CapsuleName, self.UiFvName.upper()))\r
                                 continue\r
                             elif self.UiFvName.upper() == RegionData.upper():\r
                                 GenFdsGlobalVariable.ErrorLogger("Capsule %s in FD region can't contain a FV %s in FD region." % (self.CapsuleName, self.UiFvName.upper()))\r
-\r
-        GenFdsGlobalVariable.InfLogger( "\nGenerating %s FV" %self.UiFvName)\r
+        if not Flag:\r
+            GenFdsGlobalVariable.InfLogger( "\nGenerating %s FV" %self.UiFvName)\r
+        GenFdsGlobalVariable.LargeFileInFvFlags.append(False)\r
+        FFSGuid = None\r
         \r
         \r
-        if self.FvBaseAddress != None:\r
+        if self.FvBaseAddress is not None:\r
             BaseAddress = self.FvBaseAddress\r
             BaseAddress = self.FvBaseAddress\r
-\r
-        self.__InitializeInf__(BaseAddress, BlockSize, BlockNum, ErasePloarity, VtfDict)\r
+        if not Flag:\r
+            self.__InitializeInf__(BaseAddress, BlockSize, BlockNum, ErasePloarity, VtfDict)\r
         #\r
         # First Process the Apriori section\r
         #\r
         #\r
         # First Process the Apriori section\r
         #\r
@@ -99,103 +106,150 @@ class FV (FvClassObject):
         GenFdsGlobalVariable.VerboseLogger('First generate Apriori file !')\r
         FfsFileList = []\r
         for AprSection in self.AprioriSectionList:\r
         GenFdsGlobalVariable.VerboseLogger('First generate Apriori file !')\r
         FfsFileList = []\r
         for AprSection in self.AprioriSectionList:\r
-            FileName = AprSection.GenFfs (self.UiFvName, MacroDict)\r
+            FileName = AprSection.GenFfs (self.UiFvName, MacroDict, IsMakefile=Flag)\r
             FfsFileList.append(FileName)\r
             # Add Apriori file name to Inf file\r
             FfsFileList.append(FileName)\r
             # Add Apriori file name to Inf file\r
-            self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
-                                       FileName          + \\r
-                                           T_CHAR_LF)\r
+            if not Flag:\r
+                self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
+                                            FileName          + \\r
+                                            T_CHAR_LF)\r
 \r
         # Process Modules in FfsList\r
         for FfsFile in self.FfsList :\r
 \r
         # Process Modules in FfsList\r
         for FfsFile in self.FfsList :\r
-            FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress)\r
+            if Flag:\r
+                if isinstance(FfsFile, FfsFileStatement.FileStatement):\r
+                    continue\r
+            if GenFdsGlobalVariable.EnableGenfdsMultiThread and GenFdsGlobalVariable.ModuleFile and GenFdsGlobalVariable.ModuleFile.Path.find(os.path.normpath(FfsFile.InfFileName)) == -1:\r
+                continue\r
+            FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
             FfsFileList.append(FileName)\r
             FfsFileList.append(FileName)\r
-            self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
-                                       FileName          + \\r
-                                       T_CHAR_LF)\r
-\r
-        SaveFileOnChange(self.InfFileName, self.FvInfFile.getvalue(), False)\r
-        self.FvInfFile.close()\r
+            if not Flag:\r
+                self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
+                                            FileName          + \\r
+                                            T_CHAR_LF)\r
+        if not Flag:\r
+            SaveFileOnChange(self.InfFileName, self.FvInfFile.getvalue(), False)\r
+            self.FvInfFile.close()\r
         #\r
         # Call GenFv tool\r
         #\r
         FvOutputFile = os.path.join(GenFdsGlobalVariable.FvDir, self.UiFvName)\r
         FvOutputFile = FvOutputFile + '.Fv'\r
         # BUGBUG: FvOutputFile could be specified from FDF file (FV section, CreateFile statement)\r
         #\r
         # Call GenFv tool\r
         #\r
         FvOutputFile = os.path.join(GenFdsGlobalVariable.FvDir, self.UiFvName)\r
         FvOutputFile = FvOutputFile + '.Fv'\r
         # BUGBUG: FvOutputFile could be specified from FDF file (FV section, CreateFile statement)\r
-        if self.CreateFileName != None:\r
+        if self.CreateFileName is not None:\r
             FvOutputFile = self.CreateFileName\r
 \r
             FvOutputFile = self.CreateFileName\r
 \r
+        if Flag:\r
+            GenFds.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
+            return FvOutputFile\r
+\r
         FvInfoFileName = os.path.join(GenFdsGlobalVariable.FfsDir, self.UiFvName + '.inf')\r
         FvInfoFileName = os.path.join(GenFdsGlobalVariable.FfsDir, self.UiFvName + '.inf')\r
-        shutil.copy(GenFdsGlobalVariable.FvAddressFileName, FvInfoFileName)\r
-        OrigFvInfo = None\r
-        if os.path.exists (FvInfoFileName):\r
-            OrigFvInfo = open(FvInfoFileName, 'r').read()\r
-        GenFdsGlobalVariable.GenerateFirmwareVolume(\r
-                                FvOutputFile,\r
-                                [self.InfFileName],\r
-                                AddressFile=FvInfoFileName,\r
-                                FfsList=FfsFileList,\r
-                                ForceRebase=self.FvForceRebase\r
-                                )\r
+        if not Flag:\r
+            CopyLongFilePath(GenFdsGlobalVariable.FvAddressFileName, FvInfoFileName)\r
+            OrigFvInfo = None\r
+            if os.path.exists (FvInfoFileName):\r
+                OrigFvInfo = open(FvInfoFileName, 'r').read()\r
+            if GenFdsGlobalVariable.LargeFileInFvFlags[-1]:\r
+                FFSGuid = GenFdsGlobalVariable.EFI_FIRMWARE_FILE_SYSTEM3_GUID\r
+            GenFdsGlobalVariable.GenerateFirmwareVolume(\r
+                                    FvOutputFile,\r
+                                    [self.InfFileName],\r
+                                    AddressFile=FvInfoFileName,\r
+                                    FfsList=FfsFileList,\r
+                                    ForceRebase=self.FvForceRebase,\r
+                                    FileSystemGuid=FFSGuid\r
+                                    )\r
 \r
 \r
-        NewFvInfo = None\r
-        if os.path.exists (FvInfoFileName):\r
-            NewFvInfo = open(FvInfoFileName, 'r').read()\r
-        if NewFvInfo != None and NewFvInfo != OrigFvInfo:\r
-            FvChildAddr = []\r
-            AddFileObj = open(FvInfoFileName, 'r')\r
-            AddrStrings = AddFileObj.readlines()\r
-            AddrKeyFound = False\r
-            for AddrString in AddrStrings:\r
-                if AddrKeyFound:\r
-                    #get base address for the inside FvImage\r
-                    FvChildAddr.append (AddrString)\r
-                elif AddrString.find ("[FV_BASE_ADDRESS]") != -1:\r
-                    AddrKeyFound = True\r
-            AddFileObj.close()\r
+            NewFvInfo = None\r
+            if os.path.exists (FvInfoFileName):\r
+                NewFvInfo = open(FvInfoFileName, 'r').read()\r
+            if NewFvInfo is not None and NewFvInfo != OrigFvInfo:\r
+                FvChildAddr = []\r
+                AddFileObj = open(FvInfoFileName, 'r')\r
+                AddrStrings = AddFileObj.readlines()\r
+                AddrKeyFound = False\r
+                for AddrString in AddrStrings:\r
+                    if AddrKeyFound:\r
+                        #get base address for the inside FvImage\r
+                        FvChildAddr.append (AddrString)\r
+                    elif AddrString.find ("[FV_BASE_ADDRESS]") != -1:\r
+                        AddrKeyFound = True\r
+                AddFileObj.close()\r
 \r
 \r
-            if FvChildAddr != []:\r
-                # Update Ffs again\r
-                for FfsFile in self.FfsList :\r
-                    FileName = FfsFile.GenFfs(MacroDict, FvChildAddr, BaseAddress)\r
-                \r
-                #Update GenFv again\r
-                GenFdsGlobalVariable.GenerateFirmwareVolume(\r
-                                        FvOutputFile,\r
-                                        [self.InfFileName],\r
-                                        AddressFile=FvInfoFileName,\r
-                                        FfsList=FfsFileList,\r
-                                        ForceRebase=self.FvForceRebase\r
-                                        )\r
+                if FvChildAddr != []:\r
+                    # Update Ffs again\r
+                    for FfsFile in self.FfsList :\r
+                        FileName = FfsFile.GenFfs(MacroDict, FvChildAddr, BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
 \r
 \r
-        #\r
-        # Write the Fv contents to Buffer\r
-        #\r
-        FvFileObj = open ( FvOutputFile,'r+b')\r
+                    if GenFdsGlobalVariable.LargeFileInFvFlags[-1]:\r
+                        FFSGuid = GenFdsGlobalVariable.EFI_FIRMWARE_FILE_SYSTEM3_GUID;\r
+                    #Update GenFv again\r
+                    GenFdsGlobalVariable.GenerateFirmwareVolume(\r
+                                                FvOutputFile,\r
+                                                [self.InfFileName],\r
+                                                AddressFile=FvInfoFileName,\r
+                                                FfsList=FfsFileList,\r
+                                                ForceRebase=self.FvForceRebase,\r
+                                                FileSystemGuid=FFSGuid\r
+                                                )\r
 \r
 \r
-        GenFdsGlobalVariable.VerboseLogger( "\nGenerate %s FV Successfully" %self.UiFvName)\r
-        GenFdsGlobalVariable.SharpCounter = 0\r
+            #\r
+            # Write the Fv contents to Buffer\r
+            #\r
+            if os.path.isfile(FvOutputFile):\r
+                FvFileObj = open(FvOutputFile, 'rb')\r
+                GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)\r
+                GenFdsGlobalVariable.SharpCounter = 0\r
 \r
 \r
-        Buffer.write(FvFileObj.read())\r
-        FvFileObj.seek(0)\r
-        # PI FvHeader is 0x48 byte\r
-        FvHeaderBuffer = FvFileObj.read(0x48)\r
-        # FV alignment position.\r
-        FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F)\r
-        # FvAlignmentValue is larger than or equal to 1K\r
-        if FvAlignmentValue >= 0x400:\r
-            if FvAlignmentValue >= 0x10000:\r
-                #The max alignment supported by FFS is 64K.\r
-                self.FvAlignment = "64K"\r
+                Buffer.write(FvFileObj.read())\r
+                FvFileObj.seek(0)\r
+                # PI FvHeader is 0x48 byte\r
+                FvHeaderBuffer = FvFileObj.read(0x48)\r
+                # FV alignment position.\r
+                FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)\r
+                if FvAlignmentValue >= 0x400:\r
+                    if FvAlignmentValue >= 0x100000:\r
+                        if FvAlignmentValue >= 0x1000000:\r
+                        #The max alignment supported by FFS is 16M.\r
+                            self.FvAlignment = "16M"\r
+                        else:\r
+                            self.FvAlignment = str(FvAlignmentValue / 0x100000) + "M"\r
+                    else:\r
+                        self.FvAlignment = str(FvAlignmentValue / 0x400) + "K"\r
+                else:\r
+                    # FvAlignmentValue is less than 1K\r
+                    self.FvAlignment = str (FvAlignmentValue)\r
+                FvFileObj.close()\r
+                GenFds.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
+                GenFdsGlobalVariable.LargeFileInFvFlags.pop()\r
             else:\r
             else:\r
-                self.FvAlignment = str (FvAlignmentValue / 0x400) + "K"\r
-        else:\r
-            # FvAlignmentValue is less than 1K\r
-            self.FvAlignment = str (FvAlignmentValue)\r
-        FvFileObj.close()\r
-        GenFds.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
+                GenFdsGlobalVariable.ErrorLogger("Failed to generate %s FV file." %self.UiFvName)\r
         return FvOutputFile\r
 \r
         return FvOutputFile\r
 \r
+    ## _GetBlockSize()\r
+    #\r
+    #   Calculate FV's block size\r
+    #   Inherit block size from FD if no block size specified in FV\r
+    #\r
+    def _GetBlockSize(self):\r
+        if self.BlockSizeList:\r
+            return True\r
+\r
+        for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():\r
+            FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName]\r
+            for RegionObj in FdObj.RegionList:\r
+                if RegionObj.RegionType != 'FV':\r
+                    continue\r
+                for RegionData in RegionObj.RegionDataList:\r
+                    #\r
+                    # Found the FD and region that contain this FV\r
+                    #\r
+                    if self.UiFvName.upper() == RegionData.upper():\r
+                        RegionObj.BlockInfoOfRegion(FdObj.BlockSizeList, self)\r
+                        if self.BlockSizeList:\r
+                            return True\r
+        return False\r
+\r
     ## __InitializeInf__()\r
     #\r
     #   Initilize the inf file to create FV\r
     ## __InitializeInf__()\r
     #\r
     #   Initilize the inf file to create FV\r
@@ -219,39 +273,40 @@ class FV (FvClassObject):
         # Add [Options]\r
         #\r
         self.FvInfFile.writelines("[options]" + T_CHAR_LF)\r
         # Add [Options]\r
         #\r
         self.FvInfFile.writelines("[options]" + T_CHAR_LF)\r
-        if BaseAddress != None :\r
+        if BaseAddress is not None :\r
             self.FvInfFile.writelines("EFI_BASE_ADDRESS = " + \\r
                                        BaseAddress          + \\r
                                        T_CHAR_LF)\r
 \r
             self.FvInfFile.writelines("EFI_BASE_ADDRESS = " + \\r
                                        BaseAddress          + \\r
                                        T_CHAR_LF)\r
 \r
-        if BlockSize != None:\r
+        if BlockSize is not None:\r
             self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \\r
                                       '0x%X' %BlockSize    + \\r
                                       T_CHAR_LF)\r
             self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \\r
                                       '0x%X' %BlockSize    + \\r
                                       T_CHAR_LF)\r
-            if BlockNum != None:\r
+            if BlockNum is not None:\r
                 self.FvInfFile.writelines("EFI_NUM_BLOCKS   = "  + \\r
                                       ' 0x%X' %BlockNum    + \\r
                                       T_CHAR_LF)\r
         else:\r
             if self.BlockSizeList == []:\r
                 self.FvInfFile.writelines("EFI_NUM_BLOCKS   = "  + \\r
                                       ' 0x%X' %BlockNum    + \\r
                                       T_CHAR_LF)\r
         else:\r
             if self.BlockSizeList == []:\r
-                #set default block size is 1\r
-                self.FvInfFile.writelines("EFI_BLOCK_SIZE  = 0x1" + T_CHAR_LF)\r
+                if not self._GetBlockSize():\r
+                    #set default block size is 1\r
+                    self.FvInfFile.writelines("EFI_BLOCK_SIZE  = 0x1" + T_CHAR_LF)\r
             \r
             for BlockSize in self.BlockSizeList :\r
             \r
             for BlockSize in self.BlockSizeList :\r
-                if BlockSize[0] != None:\r
+                if BlockSize[0] is not None:\r
                     self.FvInfFile.writelines("EFI_BLOCK_SIZE  = "  + \\r
                                           '0x%X' %BlockSize[0]    + \\r
                                           T_CHAR_LF)\r
 \r
                     self.FvInfFile.writelines("EFI_BLOCK_SIZE  = "  + \\r
                                           '0x%X' %BlockSize[0]    + \\r
                                           T_CHAR_LF)\r
 \r
-                if BlockSize[1] != None:\r
+                if BlockSize[1] is not None:\r
                     self.FvInfFile.writelines("EFI_NUM_BLOCKS   = "  + \\r
                                           ' 0x%X' %BlockSize[1]    + \\r
                                           T_CHAR_LF)\r
 \r
                     self.FvInfFile.writelines("EFI_NUM_BLOCKS   = "  + \\r
                                           ' 0x%X' %BlockSize[1]    + \\r
                                           T_CHAR_LF)\r
 \r
-        if self.BsBaseAddress != None:\r
+        if self.BsBaseAddress is not None:\r
             self.FvInfFile.writelines('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \\r
                                        '0x%X' %self.BsBaseAddress)\r
             self.FvInfFile.writelines('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \\r
                                        '0x%X' %self.BsBaseAddress)\r
-        if self.RtBaseAddress != None:\r
+        if self.RtBaseAddress is not None:\r
             self.FvInfFile.writelines('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \\r
                                       '0x%X' %self.RtBaseAddress)\r
         #\r
             self.FvInfFile.writelines('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \\r
                                       '0x%X' %self.RtBaseAddress)\r
         #\r
@@ -262,14 +317,18 @@ class FV (FvClassObject):
         self.FvInfFile.writelines("EFI_ERASE_POLARITY   = "       + \\r
                                           ' %s' %ErasePloarity    + \\r
                                           T_CHAR_LF)\r
         self.FvInfFile.writelines("EFI_ERASE_POLARITY   = "       + \\r
                                           ' %s' %ErasePloarity    + \\r
                                           T_CHAR_LF)\r
-        if not (self.FvAttributeDict == None):\r
-            for FvAttribute in self.FvAttributeDict.keys() :\r
+        if not (self.FvAttributeDict is None):\r
+            for FvAttribute in self.FvAttributeDict:\r
+                if FvAttribute == "FvUsedSizeEnable":\r
+                    if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', '1') :\r
+                        self.UsedSizeEnable = True\r
+                    continue\r
                 self.FvInfFile.writelines("EFI_"            + \\r
                                           FvAttribute       + \\r
                                           ' = '             + \\r
                                           self.FvAttributeDict[FvAttribute] + \\r
                                           T_CHAR_LF )\r
                 self.FvInfFile.writelines("EFI_"            + \\r
                                           FvAttribute       + \\r
                                           ' = '             + \\r
                                           self.FvAttributeDict[FvAttribute] + \\r
                                           T_CHAR_LF )\r
-        if self.FvAlignment != None:\r
+        if self.FvAlignment is not None:\r
             self.FvInfFile.writelines("EFI_FVB2_ALIGNMENT_"     + \\r
                                        self.FvAlignment.strip() + \\r
                                        " = TRUE"                + \\r
             self.FvInfFile.writelines("EFI_FVB2_ALIGNMENT_"     + \\r
                                        self.FvAlignment.strip() + \\r
                                        " = TRUE"                + \\r
@@ -278,22 +337,52 @@ class FV (FvClassObject):
         #\r
         # Generate FV extension header file\r
         #\r
         #\r
         # Generate FV extension header file\r
         #\r
-        if self.FvNameGuid == None or self.FvNameGuid == '':\r
-            if len(self.FvExtEntryType) > 0:\r
+        if not self.FvNameGuid:\r
+            if len(self.FvExtEntryType) > 0 or self.UsedSizeEnable:\r
                 GenFdsGlobalVariable.ErrorLogger("FV Extension Header Entries declared for %s with no FvNameGuid declaration." % (self.UiFvName))\r
                 GenFdsGlobalVariable.ErrorLogger("FV Extension Header Entries declared for %s with no FvNameGuid declaration." % (self.UiFvName))\r
-        \r
-        if self.FvNameGuid <> None and self.FvNameGuid <> '':\r
+        else:\r
             TotalSize = 16 + 4\r
             Buffer = ''\r
             TotalSize = 16 + 4\r
             Buffer = ''\r
+            if self.UsedSizeEnable:\r
+                TotalSize += (4 + 4)\r
+                ## define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03\r
+                #typedef  struct\r
+                # {\r
+                #    EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr;\r
+                #    UINT32 UsedSize;\r
+                # } EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE;\r
+                Buffer += pack('HHL', 8, 3, 0)\r
+\r
+            if self.FvNameString == 'TRUE':\r
+                #\r
+                # Create EXT entry for FV UI name\r
+                # This GUID is used: A67DF1FA-8DE8-4E98-AF09-4BDF2EFFBC7C\r
+                #\r
+                FvUiLen = len(self.UiFvName)\r
+                TotalSize += (FvUiLen + 16 + 4)\r
+                Guid = FV_UI_EXT_ENTY_GUID.split('-')\r
+                #\r
+                # Layout:\r
+                #   EFI_FIRMWARE_VOLUME_EXT_ENTRY : size 4\r
+                #   GUID                          : size 16\r
+                #   FV UI name\r
+                #\r
+                Buffer += (pack('HH', (FvUiLen + 16 + 4), 0x0002)\r
+                           + pack('=LHHBBBBBBBB', int(Guid[0], 16), int(Guid[1], 16), int(Guid[2], 16),\r
+                                  int(Guid[3][-4:-2], 16), int(Guid[3][-2:], 16), int(Guid[4][-12:-10], 16),\r
+                                  int(Guid[4][-10:-8], 16), int(Guid[4][-8:-6], 16), int(Guid[4][-6:-4], 16),\r
+                                  int(Guid[4][-4:-2], 16), int(Guid[4][-2:], 16))\r
+                           + self.UiFvName)\r
+\r
             for Index in range (0, len(self.FvExtEntryType)):\r
                 if self.FvExtEntryType[Index] == 'FILE':\r
             for Index in range (0, len(self.FvExtEntryType)):\r
                 if self.FvExtEntryType[Index] == 'FILE':\r
-                    # check if the path is absolute or relative
-                    if os.path.isabs(self.FvExtEntryData[Index]):
-                        FileFullPath = os.path.normpath(self.FvExtEntryData[Index])
-                    else:
-                        FileFullPath = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, self.FvExtEntryData[Index]))
-                    # check if the file path exists or not
-                    if not os.path.isfile(FileFullPath):
+                    # check if the path is absolute or relative\r
+                    if os.path.isabs(self.FvExtEntryData[Index]):\r
+                        FileFullPath = os.path.normpath(self.FvExtEntryData[Index])\r
+                    else:\r
+                        FileFullPath = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, self.FvExtEntryData[Index]))\r
+                    # check if the file path exists or not\r
+                    if not os.path.isfile(FileFullPath):\r
                         GenFdsGlobalVariable.ErrorLogger("Error opening FV Extension Header Entry file %s." % (self.FvExtEntryData[Index]))\r
                     FvExtFile = open (FileFullPath,'rb')\r
                     FvExtFile.seek(0,2)\r
                         GenFdsGlobalVariable.ErrorLogger("Error opening FV Extension Header Entry file %s." % (self.FvExtEntryData[Index]))\r
                     FvExtFile = open (FileFullPath,'rb')\r
                     FvExtFile.seek(0,2)\r
@@ -316,7 +405,7 @@ class FV (FvClassObject):
                         Buffer += pack('B', int(ByteList[Index1], 16))\r
 \r
             Guid = self.FvNameGuid.split('-')\r
                         Buffer += pack('B', int(ByteList[Index1], 16))\r
 \r
             Guid = self.FvNameGuid.split('-')\r
-            Buffer = pack('LHHBBBBBBBBL', \r
+            Buffer = pack('=LHHBBBBBBBBL', \r
                         int(Guid[0], 16), \r
                         int(Guid[1], 16), \r
                         int(Guid[2], 16), \r
                         int(Guid[0], 16), \r
                         int(Guid[1], 16), \r
                         int(Guid[2], 16), \r
@@ -352,7 +441,7 @@ class FV (FvClassObject):
         # Add [Files]\r
         #\r
         self.FvInfFile.writelines("[files]" + T_CHAR_LF)\r
         # Add [Files]\r
         #\r
         self.FvInfFile.writelines("[files]" + T_CHAR_LF)\r
-        if VtfDict != None and self.UiFvName in VtfDict.keys():\r
+        if VtfDict is not None and self.UiFvName in VtfDict.keys():\r
             self.FvInfFile.writelines("EFI_FILE_NAME = "                   + \\r
                                        VtfDict.get(self.UiFvName)          + \\r
                                        T_CHAR_LF)\r
             self.FvInfFile.writelines("EFI_FILE_NAME = "                   + \\r
                                        VtfDict.get(self.UiFvName)          + \\r
                                        T_CHAR_LF)\r