]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/Fv.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fv.py
index 3c3cd0b308042358984aff0a6a3f668a10f9762a..206bd02005977d29e276d429fff532eb2aa016f7 100644 (file)
@@ -3,29 +3,19 @@
 #\r
 #  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #\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
-#  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
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 ##\r
 # Import Modules\r
 #\r
 #\r
 \r
 ##\r
 # Import Modules\r
 #\r
+from __future__ import absolute_import\r
 import Common.LongFilePathOs as os\r
 import subprocess\r
 from io import BytesIO\r
 import Common.LongFilePathOs as os\r
 import subprocess\r
 from io import BytesIO\r
-from io import StringIO\r
 from struct import *\r
 from struct import *\r
-\r
-from . import Ffs\r
-from . import AprioriSection\r
 from . import FfsFileStatement\r
 from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
 from . import FfsFileStatement\r
 from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
-from CommonDataClass.FdfClass import FvClassObject\r
 from Common.Misc import SaveFileOnChange, PackGUID\r
 from Common.LongFilePathSupport import CopyLongFilePath\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.Misc import SaveFileOnChange, PackGUID\r
 from Common.LongFilePathSupport import CopyLongFilePath\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
@@ -36,13 +26,25 @@ FV_UI_EXT_ENTY_GUID = 'A67DF1FA-8DE8-4E98-AF09-4BDF2EFFBC7C'
 ## generate FV\r
 #\r
 #\r
 ## generate FV\r
 #\r
 #\r
-class FV (FvClassObject):\r
+class FV (object):\r
     ## The constructor\r
     #\r
     #   @param  self        The object pointer\r
     #\r
     ## The constructor\r
     #\r
     #   @param  self        The object pointer\r
     #\r
-    def __init__(self):\r
-        FvClassObject.__init__(self)\r
+    def __init__(self, Name=None):\r
+        self.UiFvName = Name\r
+        self.CreateFileName = None\r
+        self.BlockSizeList = []\r
+        self.DefineVarDict = {}\r
+        self.SetVarDict = {}\r
+        self.FvAlignment = None\r
+        self.FvAttributeDict = {}\r
+        self.FvNameGuid = None\r
+        self.FvNameString = None\r
+        self.AprioriSectionList = []\r
+        self.FfsList = []\r
+        self.BsBaseAddress = None\r
+        self.RtBaseAddress = None\r
         self.FvInfFile = None\r
         self.FvAddressFile = None\r
         self.BaseAddress = None\r
         self.FvInfFile = None\r
         self.FvAddressFile = None\r
         self.BaseAddress = None\r
@@ -53,7 +55,9 @@ class FV (FvClassObject):
         self.FvForceRebase = None\r
         self.FvRegionInFD = None\r
         self.UsedSizeEnable = False\r
         self.FvForceRebase = None\r
         self.FvRegionInFD = None\r
         self.UsedSizeEnable = False\r
-\r
+        self.FvExtEntryTypeValue = []\r
+        self.FvExtEntryType = []\r
+        self.FvExtEntryData = []\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
@@ -64,12 +68,10 @@ class FV (FvClassObject):
     #   @param  BlockSize   block size of FV\r
     #   @param  BlockNum    How many blocks in FV\r
     #   @param  ErasePolarity      Flash erase polarity\r
     #   @param  BlockSize   block size of FV\r
     #   @param  BlockNum    How many blocks in FV\r
     #   @param  ErasePolarity      Flash erase polarity\r
-    #   @param  VtfDict     VTF objects\r
     #   @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 = {}, Flag=False) :\r
-\r
+    def AddToBuffer (self, Buffer, BaseAddress=None, BlockSize= None, BlockNum=None, ErasePloarity='1',  MacroDict = {}, Flag=False):\r
         if BaseAddress is None and self.UiFvName.upper() + 'fv' in GenFdsGlobalVariable.ImageBinDict:\r
             return GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv']\r
 \r
         if BaseAddress is None and self.UiFvName.upper() + 'fv' in GenFdsGlobalVariable.ImageBinDict:\r
             return GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv']\r
 \r
@@ -96,7 +98,7 @@ class FV (FvClassObject):
         if self.FvBaseAddress is not None:\r
             BaseAddress = self.FvBaseAddress\r
         if not Flag:\r
         if self.FvBaseAddress is not None:\r
             BaseAddress = self.FvBaseAddress\r
         if not Flag:\r
-            self.__InitializeInf__(BaseAddress, BlockSize, BlockNum, ErasePloarity, VtfDict)\r
+            self._InitializeInf(BaseAddress, BlockSize, BlockNum, ErasePloarity)\r
         #\r
         # First Process the Apriori section\r
         #\r
         #\r
         # First Process the Apriori section\r
         #\r
@@ -109,12 +111,12 @@ class FV (FvClassObject):
             FfsFileList.append(FileName)\r
             # Add Apriori file name to Inf file\r
             if not Flag:\r
             FfsFileList.append(FileName)\r
             # Add Apriori file name to Inf file\r
             if not Flag:\r
-                self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
+                self.FvInfFile.append("EFI_FILE_NAME = " + \\r
                                             FileName          + \\r
                                             TAB_LINE_BREAK)\r
 \r
         # Process Modules in FfsList\r
                                             FileName          + \\r
                                             TAB_LINE_BREAK)\r
 \r
         # Process Modules in FfsList\r
-        for FfsFile in self.FfsList :\r
+        for FfsFile in self.FfsList:\r
             if Flag:\r
                 if isinstance(FfsFile, FfsFileStatement.FileStatement):\r
                     continue\r
             if Flag:\r
                 if isinstance(FfsFile, FfsFileStatement.FileStatement):\r
                     continue\r
@@ -123,12 +125,12 @@ class FV (FvClassObject):
             FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
             FfsFileList.append(FileName)\r
             if not Flag:\r
             FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
             FfsFileList.append(FileName)\r
             if not Flag:\r
-                self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
+                self.FvInfFile.append("EFI_FILE_NAME = " + \\r
                                             FileName          + \\r
                                             TAB_LINE_BREAK)\r
         if not Flag:\r
                                             FileName          + \\r
                                             TAB_LINE_BREAK)\r
         if not Flag:\r
-            SaveFileOnChange(self.InfFileName, self.FvInfFile.getvalue(), False)\r
-            self.FvInfFile.close()\r
+            FvInfFile = ''.join(self.FvInfFile)\r
+            SaveFileOnChange(self.InfFileName, FvInfFile, False)\r
         #\r
         # Call GenFv tool\r
         #\r
         #\r
         # Call GenFv tool\r
         #\r
@@ -177,7 +179,7 @@ class FV (FvClassObject):
 \r
                 if FvChildAddr != []:\r
                     # Update Ffs again\r
 \r
                 if FvChildAddr != []:\r
                     # Update Ffs again\r
-                    for FfsFile in self.FfsList :\r
+                    for FfsFile in self.FfsList:\r
                         FileName = FfsFile.GenFfs(MacroDict, FvChildAddr, BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
 \r
                     if GenFdsGlobalVariable.LargeFileInFvFlags[-1]:\r
                         FileName = FfsFile.GenFfs(MacroDict, FvChildAddr, BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
 \r
                     if GenFdsGlobalVariable.LargeFileInFvFlags[-1]:\r
@@ -195,32 +197,36 @@ class FV (FvClassObject):
             #\r
             # Write the Fv contents to Buffer\r
             #\r
             #\r
             # Write the Fv contents to Buffer\r
             #\r
-            if os.path.isfile(FvOutputFile):\r
+            if os.path.isfile(FvOutputFile) and os.path.getsize(FvOutputFile) >= 0x48:\r
                 FvFileObj = open(FvOutputFile, 'rb')\r
                 FvFileObj = open(FvOutputFile, 'rb')\r
-                GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)\r
-                GenFdsGlobalVariable.SharpCounter = 0\r
-\r
-                Buffer.write(FvFileObj.read())\r
-                FvFileObj.seek(0)\r
                 # PI FvHeader is 0x48 byte\r
                 FvHeaderBuffer = FvFileObj.read(0x48)\r
                 # PI FvHeader is 0x48 byte\r
                 FvHeaderBuffer = FvFileObj.read(0x48)\r
-                # FV alignment position.\r
-                FvAlignmentValue = 1 << (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
+                Signature = FvHeaderBuffer[0x28:0x32]\r
+                if Signature and Signature.startswith(b'_FVH'):\r
+                    GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)\r
+                    GenFdsGlobalVariable.SharpCounter = 0\r
+\r
+                    FvFileObj.seek(0)\r
+                    Buffer.write(FvFileObj.read())\r
+                    # FV alignment position.\r
+                    FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E:0x2F]) & 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
                         else:\r
-                            self.FvAlignment = str(FvAlignmentValue // 0x100000) + "M"\r
+                            self.FvAlignment = str(FvAlignmentValue // 0x400) + "K"\r
                     else:\r
                     else:\r
-                        self.FvAlignment = str(FvAlignmentValue // 0x400) + "K"\r
+                        # FvAlignmentValue is less than 1K\r
+                        self.FvAlignment = str (FvAlignmentValue)\r
+                    FvFileObj.close()\r
+                    GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
+                    GenFdsGlobalVariable.LargeFileInFvFlags.pop()\r
                 else:\r
                 else:\r
-                    # FvAlignmentValue is less than 1K\r
-                    self.FvAlignment = str (FvAlignmentValue)\r
-                FvFileObj.close()\r
-                GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
-                GenFdsGlobalVariable.LargeFileInFvFlags.pop()\r
+                    GenFdsGlobalVariable.ErrorLogger("Invalid FV file %s." % self.UiFvName)\r
             else:\r
                 GenFdsGlobalVariable.ErrorLogger("Failed to generate %s FV file." %self.UiFvName)\r
         return FvOutputFile\r
             else:\r
                 GenFdsGlobalVariable.ErrorLogger("Failed to generate %s FV file." %self.UiFvName)\r
         return FvOutputFile\r
@@ -248,86 +254,85 @@ class FV (FvClassObject):
                             return True\r
         return False\r
 \r
                             return True\r
         return False\r
 \r
-    ## __InitializeInf__()\r
+    ## _InitializeInf()\r
     #\r
     #\r
-    #   Initilize the inf file to create FV\r
+    #   Initialize the inf file to create FV\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  BaseAddress base address of FV\r
     #   @param  BlockSize   block size of FV\r
     #   @param  BlockNum    How many blocks in FV\r
     #   @param  ErasePolarity      Flash erase polarity\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  BaseAddress base address of FV\r
     #   @param  BlockSize   block size of FV\r
     #   @param  BlockNum    How many blocks in FV\r
     #   @param  ErasePolarity      Flash erase polarity\r
-    #   @param  VtfDict     VTF objects\r
     #\r
     #\r
-    def __InitializeInf__ (self, BaseAddress = None, BlockSize= None, BlockNum = None, ErasePloarity='1', VtfDict=None) :\r
+    def _InitializeInf (self, BaseAddress = None, BlockSize= None, BlockNum = None, ErasePloarity='1'):\r
         #\r
         # Create FV inf file\r
         #\r
         self.InfFileName = os.path.join(GenFdsGlobalVariable.FvDir,\r
                                    self.UiFvName + '.inf')\r
         #\r
         # Create FV inf file\r
         #\r
         self.InfFileName = os.path.join(GenFdsGlobalVariable.FvDir,\r
                                    self.UiFvName + '.inf')\r
-        self.FvInfFile = StringIO()\r
+        self.FvInfFile = []\r
 \r
         #\r
         # Add [Options]\r
         #\r
 \r
         #\r
         # Add [Options]\r
         #\r
-        self.FvInfFile.writelines("[options]" + TAB_LINE_BREAK)\r
-        if BaseAddress is not None :\r
-            self.FvInfFile.writelines("EFI_BASE_ADDRESS = " + \\r
+        self.FvInfFile.append("[options]" + TAB_LINE_BREAK)\r
+        if BaseAddress is not None:\r
+            self.FvInfFile.append("EFI_BASE_ADDRESS = " + \\r
                                        BaseAddress          + \\r
                                        TAB_LINE_BREAK)\r
 \r
         if BlockSize is not None:\r
                                        BaseAddress          + \\r
                                        TAB_LINE_BREAK)\r
 \r
         if BlockSize is not None:\r
-            self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \\r
+            self.FvInfFile.append("EFI_BLOCK_SIZE = " + \\r
                                       '0x%X' %BlockSize    + \\r
                                       TAB_LINE_BREAK)\r
             if BlockNum is not None:\r
                                       '0x%X' %BlockSize    + \\r
                                       TAB_LINE_BREAK)\r
             if BlockNum is not None:\r
-                self.FvInfFile.writelines("EFI_NUM_BLOCKS   = "  + \\r
+                self.FvInfFile.append("EFI_NUM_BLOCKS   = "  + \\r
                                       ' 0x%X' %BlockNum    + \\r
                                       TAB_LINE_BREAK)\r
         else:\r
             if self.BlockSizeList == []:\r
                 if not self._GetBlockSize():\r
                     #set default block size is 1\r
                                       ' 0x%X' %BlockNum    + \\r
                                       TAB_LINE_BREAK)\r
         else:\r
             if self.BlockSizeList == []:\r
                 if not self._GetBlockSize():\r
                     #set default block size is 1\r
-                    self.FvInfFile.writelines("EFI_BLOCK_SIZE  = 0x1" + TAB_LINE_BREAK)\r
+                    self.FvInfFile.append("EFI_BLOCK_SIZE  = 0x1" + TAB_LINE_BREAK)\r
 \r
 \r
-            for BlockSize in self.BlockSizeList :\r
+            for BlockSize in self.BlockSizeList:\r
                 if BlockSize[0] is not None:\r
                 if BlockSize[0] is not None:\r
-                    self.FvInfFile.writelines("EFI_BLOCK_SIZE  = "  + \\r
+                    self.FvInfFile.append("EFI_BLOCK_SIZE  = "  + \\r
                                           '0x%X' %BlockSize[0]    + \\r
                                           TAB_LINE_BREAK)\r
 \r
                 if BlockSize[1] is not None:\r
                                           '0x%X' %BlockSize[0]    + \\r
                                           TAB_LINE_BREAK)\r
 \r
                 if BlockSize[1] is not None:\r
-                    self.FvInfFile.writelines("EFI_NUM_BLOCKS   = "  + \\r
+                    self.FvInfFile.append("EFI_NUM_BLOCKS   = "  + \\r
                                           ' 0x%X' %BlockSize[1]    + \\r
                                           TAB_LINE_BREAK)\r
 \r
         if self.BsBaseAddress is not None:\r
                                           ' 0x%X' %BlockSize[1]    + \\r
                                           TAB_LINE_BREAK)\r
 \r
         if self.BsBaseAddress is not None:\r
-            self.FvInfFile.writelines('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \\r
+            self.FvInfFile.append('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \\r
                                        '0x%X' %self.BsBaseAddress)\r
         if self.RtBaseAddress is not None:\r
                                        '0x%X' %self.BsBaseAddress)\r
         if self.RtBaseAddress is not None:\r
-            self.FvInfFile.writelines('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \\r
+            self.FvInfFile.append('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \\r
                                       '0x%X' %self.RtBaseAddress)\r
         #\r
         # Add attribute\r
         #\r
                                       '0x%X' %self.RtBaseAddress)\r
         #\r
         # Add attribute\r
         #\r
-        self.FvInfFile.writelines("[attributes]" + TAB_LINE_BREAK)\r
+        self.FvInfFile.append("[attributes]" + TAB_LINE_BREAK)\r
 \r
 \r
-        self.FvInfFile.writelines("EFI_ERASE_POLARITY   = "       + \\r
+        self.FvInfFile.append("EFI_ERASE_POLARITY   = "       + \\r
                                           ' %s' %ErasePloarity    + \\r
                                           TAB_LINE_BREAK)\r
         if not (self.FvAttributeDict is None):\r
                                           ' %s' %ErasePloarity    + \\r
                                           TAB_LINE_BREAK)\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 FvAttribute == "FvUsedSizeEnable":\r
-                    if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', '1') :\r
+                    if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', '1'):\r
                         self.UsedSizeEnable = True\r
                     continue\r
                         self.UsedSizeEnable = True\r
                     continue\r
-                self.FvInfFile.writelines("EFI_"            + \\r
+                self.FvInfFile.append("EFI_"            + \\r
                                           FvAttribute       + \\r
                                           ' = '             + \\r
                                           self.FvAttributeDict[FvAttribute] + \\r
                                           TAB_LINE_BREAK )\r
         if self.FvAlignment is not None:\r
                                           FvAttribute       + \\r
                                           ' = '             + \\r
                                           self.FvAttributeDict[FvAttribute] + \\r
                                           TAB_LINE_BREAK )\r
         if self.FvAlignment is not None:\r
-            self.FvInfFile.writelines("EFI_FVB2_ALIGNMENT_"     + \\r
+            self.FvInfFile.append("EFI_FVB2_ALIGNMENT_"     + \\r
                                        self.FvAlignment.strip() + \\r
                                        " = TRUE"                + \\r
                                        TAB_LINE_BREAK)\r
                                        self.FvAlignment.strip() + \\r
                                        " = TRUE"                + \\r
                                        TAB_LINE_BREAK)\r
@@ -361,13 +366,13 @@ class FV (FvClassObject):
                 Guid = FV_UI_EXT_ENTY_GUID.split('-')\r
                 #\r
                 # Layout:\r
                 Guid = FV_UI_EXT_ENTY_GUID.split('-')\r
                 #\r
                 # Layout:\r
-                #   EFI_FIRMWARE_VOLUME_EXT_ENTRY : size 4\r
-                #   GUID                          : size 16\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
                            + PackGUID(Guid)\r
                 #   FV UI name\r
                 #\r
                 Buffer += (pack('HH', (FvUiLen + 16 + 4), 0x0002)\r
                            + PackGUID(Guid)\r
-                           + bytes(self.UiFvName, 'utf-8'))\r
+                           + self.UiFvName.encode('utf-8'))\r
 \r
             for Index in range (0, len(self.FvExtEntryType)):\r
                 if self.FvExtEntryType[Index] == 'FILE':\r
 \r
             for Index in range (0, len(self.FvExtEntryType)):\r
                 if self.FvExtEntryType[Index] == 'FILE':\r
@@ -414,16 +419,11 @@ class FV (FvClassObject):
                 if Changed:\r
                   if os.path.exists (self.InfFileName):\r
                     os.remove (self.InfFileName)\r
                 if Changed:\r
                   if os.path.exists (self.InfFileName):\r
                     os.remove (self.InfFileName)\r
-                self.FvInfFile.writelines("EFI_FV_EXT_HEADER_FILE_NAME = "      + \\r
+                self.FvInfFile.append("EFI_FV_EXT_HEADER_FILE_NAME = "      + \\r
                                            FvExtHeaderFileName                  + \\r
                                            TAB_LINE_BREAK)\r
 \r
                                            FvExtHeaderFileName                  + \\r
                                            TAB_LINE_BREAK)\r
 \r
-\r
         #\r
         # Add [Files]\r
         #\r
         #\r
         # Add [Files]\r
         #\r
-        self.FvInfFile.writelines("[files]" + TAB_LINE_BREAK)\r
-        if VtfDict and self.UiFvName in VtfDict:\r
-            self.FvInfFile.writelines("EFI_FILE_NAME = "                   + \\r
-                                       VtfDict[self.UiFvName]              + \\r
-                                       TAB_LINE_BREAK)\r
+        self.FvInfFile.append("[files]" + TAB_LINE_BREAK)\r