]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/Fv.py
BaseTools: remove unused member variable
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fv.py
index 7b6305b48eb9f20e73f6fb8889285a8c794fdf43..adb7c185b82b81e90d55a1c7c8d32cc3a5369bef 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
+from Common.DataType import *\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
@@ -46,7 +50,11 @@ class FV (FvClassObject):
         self.InfFileName = None\r
         self.FvAddressFileName = None\r
         self.CapsuleName = None\r
         self.InfFileName = None\r
         self.FvAddressFileName = None\r
         self.CapsuleName = None\r
-\r
+        self.FvBaseAddress = None\r
+        self.FvForceRebase = None\r
+        self.FvRegionInFD = None\r
+        self.UsedSizeEnable = False\r
+        \r
     ## AddToBuffer()\r
     #\r
     #   Generate Fv and add it to the Buffer\r
     ## AddToBuffer()\r
     #\r
     #   Generate Fv and add it to the Buffer\r
@@ -61,31 +69,35 @@ 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:\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
-            for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():\r
-                FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName]\r
+        if self.CapsuleName is not None:\r
+            for FdObj in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values():\r
                 for RegionObj in FdObj.RegionList:\r
                 for RegionObj in FdObj.RegionList:\r
-                    if RegionObj.RegionType == 'FV':\r
+                    if RegionObj.RegionType == BINARY_FILE_TYPE_FV:\r
                         for RegionData in RegionObj.RegionDataList:\r
                             if RegionData.endswith(".fv"):\r
                                 continue\r
                         for RegionData in RegionObj.RegionDataList:\r
                             if RegionData.endswith(".fv"):\r
                                 continue\r
-                            elif RegionData.upper() + 'fv' in GenFds.ImageBinDict.keys():\r
+                            elif RegionData.upper() + 'fv' in GenFds.ImageBinDict:\r
                                 continue\r
                             elif self.UiFvName.upper() == RegionData.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
-\r
-        self.__InitializeInf__(BaseAddress, BlockSize, BlockNum, ErasePloarity, VtfDict)\r
+                                GenFdsGlobalVariable.ErrorLogger("Capsule %s in FD region can't contain a FV %s in FD region." % (self.CapsuleName, self.UiFvName.upper()))\r
+        if not Flag:\r
+            GenFdsGlobalVariable.InfLogger( "\nGenerating %s FV" %self.UiFvName)\r
+        GenFdsGlobalVariable.LargeFileInFvFlags.append(False)\r
+        FFSGuid = None\r
+        \r
+        if self.FvBaseAddress is not None:\r
+            BaseAddress = self.FvBaseAddress\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
@@ -94,101 +106,149 @@ 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
-                                )\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
-                                        )\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 FdObj in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values():\r
+            for RegionObj in FdObj.RegionList:\r
+                if RegionObj.RegionType != BINARY_FILE_TYPE_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
@@ -212,39 +272,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
@@ -255,14 +316,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
+        if not (self.FvAttributeDict is None):\r
             for FvAttribute in self.FvAttributeDict.keys() :\r
             for FvAttribute in self.FvAttributeDict.keys() :\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
@@ -271,22 +336,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
@@ -309,7 +404,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
@@ -345,7 +440,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 and self.UiFvName in VtfDict:\r
             self.FvInfFile.writelines("EFI_FILE_NAME = "                   + \\r
             self.FvInfFile.writelines("EFI_FILE_NAME = "                   + \\r
-                                       VtfDict.get(self.UiFvName)          + \\r
+                                       VtfDict[self.UiFvName]              + \\r
                                        T_CHAR_LF)\r
                                        T_CHAR_LF)\r