]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/Fd.py
BaseTools: Enhance BaseTools supports FixedAtBuild usage in VFR file
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fd.py
index 99baa6abe55796c8c0d897bebfad6aa503e18730..0c06ff57dc319f532ca187187a763ec91a206341 100644 (file)
@@ -1,9 +1,9 @@
 ## @file\r
 # process FD generation\r
 #\r
-#  Copyright (c) 2007, Intel Corporation\r
+#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
-#  All rights reserved. This program and the accompanying materials\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
@@ -17,7 +17,7 @@
 #\r
 import Region\r
 import Fv\r
-import os\r
+import Common.LongFilePathOs as os\r
 import StringIO\r
 import sys\r
 from struct import *\r
@@ -26,6 +26,7 @@ from CommonDataClass.FdfClass import FDClassObject
 from Common import EdkLogger\r
 from Common.BuildToolError import *\r
 from Common.Misc import SaveFileOnChange\r
+from GenFds import GenFds\r
 \r
 ## generate FD\r
 #\r
@@ -42,11 +43,12 @@ class FD(FDClassObject):
     #\r
     #   Generate FD\r
     #\r
-    #   @param  self        The object pointer\r
-    #   @param  FvBinDict   dictionary contains generated FV name and its file name\r
     #   @retval string      Generated FD file name\r
     #\r
-    def GenFd (self, FvBinDict):\r
+    def GenFd (self):\r
+        if self.FdUiName.upper() + 'fd' in GenFds.ImageBinDict.keys():\r
+            return GenFds.ImageBinDict[self.FdUiName.upper() + 'fd']\r
+\r
         #\r
         # Print Information\r
         #\r
@@ -63,6 +65,33 @@ class FD(FDClassObject):
         GenFdsGlobalVariable.VerboseLogger('################### Gen VTF ####################')\r
         self.GenVtfFile()\r
 \r
+        TempFdBuffer = StringIO.StringIO('')\r
+        PreviousRegionStart = -1\r
+        PreviousRegionSize = 1\r
+        \r
+        for RegionObj in self.RegionList :\r
+            if RegionObj.RegionType == 'CAPSULE':\r
+                continue\r
+            if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:\r
+                pass\r
+            elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):\r
+                pass\r
+            elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:\r
+                GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))\r
+                PadRegion = Region.Region()\r
+                PadRegion.Offset = PreviousRegionStart + PreviousRegionSize\r
+                PadRegion.Size = RegionObj.Offset - PadRegion.Offset\r
+                PadRegion.AddToBuffer(TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
+            PreviousRegionStart = RegionObj.Offset\r
+            PreviousRegionSize = RegionObj.Size\r
+            #\r
+            # Call each region's AddToBuffer function\r
+            #\r
+            if PreviousRegionSize > self.Size:\r
+                pass\r
+            GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r
+            RegionObj.AddToBuffer (TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
+        \r
         FdBuffer = StringIO.StringIO('')\r
         PreviousRegionStart = -1\r
         PreviousRegionSize = 1\r
@@ -80,32 +109,33 @@ class FD(FDClassObject):
                 PadRegion = Region.Region()\r
                 PadRegion.Offset = PreviousRegionStart + PreviousRegionSize\r
                 PadRegion.Size = RegionObj.Offset - PadRegion.Offset\r
-                PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, FvBinDict, self.vtfRawDict, self.DefineVarDict)\r
+                PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
             PreviousRegionStart = RegionObj.Offset\r
             PreviousRegionSize = RegionObj.Size\r
             #\r
+            # Verify current region fits within allocated FD section Size\r
+            #\r
+            if PreviousRegionStart + PreviousRegionSize > self.Size:\r
+                EdkLogger.error("GenFds", GENFDS_ERROR,\r
+                                'FD %s size too small to fit region with offset 0x%X and size 0x%X'\r
+                                % (self.FdUiName, PreviousRegionStart, PreviousRegionSize))\r
+            #\r
             # Call each region's AddToBuffer function\r
             #\r
-            if PreviousRegionSize > self.Size:\r
-                EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s size too small' % self.FdUiName)\r
             GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r
-            RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, FvBinDict, self.vtfRawDict, self.DefineVarDict)\r
+            RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
         #\r
         # Create a empty Fd file\r
         #\r
         GenFdsGlobalVariable.VerboseLogger ('Create an empty Fd file')\r
-        FdFileName = os.path.join(GenFdsGlobalVariable.FvDir,\r
-                                  self.FdUiName + '.fd')\r
-        #FdFile = open(FdFileName, 'wb')\r
-\r
+        FdFileName = os.path.join(GenFdsGlobalVariable.FvDir,self.FdUiName + '.fd')\r
         #\r
         # Write the buffer contents to Fd file\r
         #\r
         GenFdsGlobalVariable.VerboseLogger('Write the buffer contents to Fd file')\r
         SaveFileOnChange(FdFileName, FdBuffer.getvalue())\r
-        #FdFile.write(FdBuffer.getvalue());\r
-        #FdFile.close();\r
         FdBuffer.close();\r
+        GenFds.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName\r
         return FdFileName\r
 \r
     ## generate VTF\r