Support R8 modules in GenFds tool.
authorjlin16 <jlin16@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 23 Jan 2008 04:01:52 +0000 (04:01 +0000)
committerjlin16 <jlin16@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 23 Jan 2008 04:01:52 +0000 (04:01 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@969 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/CommonDataClass/FdfClassObject.py
Source/Python/GenFds/Fd.py
Source/Python/GenFds/FdfParser.py
Source/Python/GenFds/FfsInfStatement.py
Source/Python/GenFds/GenFds.py
Source/Python/GenFds/Region.py

index e82ea46..aeb05b2 100644 (file)
@@ -75,7 +75,6 @@ class RegionClassObject:
         self.Size = None         # The Size of the Region\r
         self.PcdOffset = None\r
         self.PcdSize = None\r
-        self.RegionSize = None\r
         self.SetVarDict = {}\r
         self.RegionType = None\r
         self.RegionDataList = []\r
index ab7e577..22cc7a0 100644 (file)
@@ -49,6 +49,11 @@ class FD(FDClassObject):
         # Print Information\r
         #\r
         GenFdsGlobalVariable.InfLogger("Fd File Name:%s" %self.FdUiName)\r
+        Offset = 0x00\r
+        for item in self.BlockSizeList:\r
+            Offset = Offset + item[0]  * item[1]\r
+        if Offset != self.Size:\r
+            raise Exception ('FD %s Size not consistent with block array', self.FdUiName)\r
         GenFdsGlobalVariable.VerboseLogger('Following Fv will be add to Fd !!!')\r
         for FvObj in GenFdsGlobalVariable.FdfParser.Profile.FvDict:\r
             GenFdsGlobalVariable.VerboseLogger(FvObj)\r
@@ -75,6 +80,8 @@ class FD(FDClassObject):
             #\r
             # Call each region's AddToBuffer function \r
             #\r
+            if PreviousRegionSize > self.Size:\r
+                raise Exception ('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
         #\r
index 00c6355..985b042 100644 (file)
@@ -1214,8 +1214,9 @@ class FdfParser:
         \r
         self.__UndoToken()\r
         if not self.__IsToken("[FD.", True):\r
-            print 'Parsing String: %s At line: %d, Offset Within Line: %d' \\r
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
+            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
+            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
+                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             raise Warning("expected [FD.] At Line ", self.FileName, self.CurrentLineNumber)\r
         \r
         FdName = self.__GetUiName()\r
@@ -1727,8 +1728,9 @@ class FdfParser:
 \r
         self.__UndoToken()\r
         if not self.__IsToken("[FV.", True):\r
-            print 'Parsing String: %s At line: %d, Offset Within Line: %d' \\r
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
+            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
+            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
+                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             raise Warning("Unknown Keyword At Line ", self.FileName, self.CurrentLineNumber)\r
         \r
         FvName = self.__GetUiName()\r
@@ -2472,8 +2474,9 @@ class FdfParser:
 \r
         self.__UndoToken()\r
         if not self.__IsToken("[CAPSULE.", True):\r
-            print 'Parsing String: %s At line: %d, Offset Within Line: %d' \\r
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
+            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
+            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
+                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             raise Warning("expected [Capsule.] At Line ", self.FileName, self.CurrentLineNumber)        \r
             \r
         CapsuleObj = Capsule.Capsule()\r
@@ -2592,8 +2595,9 @@ class FdfParser:
 \r
         self.__UndoToken()\r
         if not self.__IsToken("[Rule.", True):\r
-            print 'Parsing String: %s At line: %d, Offset Within Line: %d' \\r
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
+            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
+            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
+                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             raise Warning("expected [Rule.] At Line ", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__SkipToToken("."):\r
@@ -2649,7 +2653,9 @@ class FdfParser:
         if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
                              "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
                              "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
-                             "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE"):\r
+                             "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
+                             "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
+                             "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION"):\r
             raise Warning("Unknown Module type At line ", self.FileName, self.CurrentLineNumber)\r
         return self.__Token\r
     \r
@@ -3151,8 +3157,9 @@ class FdfParser:
 \r
         self.__UndoToken()\r
         if not self.__IsToken("[VTF.", True):\r
-            print 'Parsing String: %s At line: %d, Offset Within Line: %d' \\r
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
+            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
+            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
+                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             raise Warning("expected [VTF.] At Line ", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__SkipToToken("."):\r
index 4d9bfb7..0888a10 100644 (file)
@@ -284,7 +284,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
             Arch = ArchList[0]\r
             return Arch\r
         elif len(ArchList) > 1:\r
-            return None \r
+            raise Exception("Not able to determine ARCH for Module %s !" %self.InfFileName) \r
         else:\r
             raise Exception("Don't find legal ARCH in Module %s !" %self.InfFileName)\r
     \r
index e1e47f2..15b2f48 100644 (file)
@@ -27,6 +27,7 @@ from EfiSection import EfiSection
 import StringIO\r
 import Common.TargetTxtClassObject\r
 import Common.DataType\r
+import Common.GlobalData as GlobalData\r
 from Common import EdkLogger\r
 from Common.String import *\r
 \r
@@ -136,6 +137,15 @@ def main():
             GenFdsGlobalVariable.ErrorLogger("You must specify a build ARCH")\r
             sys.exit(1)\r
         \r
+        if Options.Macros:\r
+            for Pair in Options.Macros:\r
+                Pair.strip('"')\r
+                List = Pair.split('=')\r
+                if len(List) == 2:\r
+                    FdfParser.InputMacroDict[List[0].strip()] = List[1].strip()\r
+                    GlobalData.gGlobalDefines[List[0].strip()] = List[1].strip()\r
+                else:\r
+                    FdfParser.InputMacroDict[List[0].strip()] = None\r
             \r
         """call Workspace build create database"""\r
         os.environ["WORKSPACE"] = Workspace\r
@@ -159,15 +169,6 @@ def main():
         if not os.path.exists(OutputDir):\r
             GenFdsGlobalVariable.ErrorLogger ("Directory %s not found" % (OutputDir))\r
             sys.exit(1)\r
-    \r
-        if Options.Macros:\r
-            for Pair in Options.Macros:\r
-                Pair.strip('"')\r
-                List = Pair.split('=')\r
-                if len(List) == 2:\r
-                    FdfParser.InputMacroDict[List[0].strip()] = List[1].strip()\r
-                else:\r
-                    FdfParser.InputMacroDict[List[0].strip()] = None\r
                     \r
         """ Parse Fdf file, has to place after build Workspace as FDF may contain macros from DSC file """\r
         try:\r
@@ -194,7 +195,7 @@ def main():
             else:\r
                 GenFdsGlobalVariable.ErrorLogger("No such an FV in FDF file.")\r
                 sys.exit(1)\r
-            \r
+       \r
         BuildWorkSpace.GenBuildDatabase({}, FdfParserObj.Profile.InfList)\r
         \r
         """Call GenFds"""\r
index 8922942..fa63660 100644 (file)
@@ -102,7 +102,10 @@ class Region(RegionClassObject):
                             BlockSize = FvObj.BlockSizeList[0][0]\r
                         if FvObj.BlockSizeList[0][1] != None:\r
                             BlockNum = FvObj.BlockSizeList[0][1]\r
-                    self.FvAddress = self.FvAddress + FvBuffer.len                    \r
+                    self.FvAddress = self.FvAddress + FvBuffer.len\r
+                    FvAlignValue = self.GetFvAlignValue(FvObj.FvAlignment)\r
+                    if self.FvAddress % FvAlignValue != 0:\r
+                        raise Exception ("FV (%s) is NOT %s Aligned!" % (FvObj.UiFvName, FvObj.FvAlignment))                    \r
                     FvBaseAddress = '0x%X' %self.FvAddress\r
                     FileName = FvObj.AddToBuffer(FvBuffer, FvBaseAddress, BlockSize, BlockNum, ErasePolarity, vtfDict)\r
                     \r
@@ -172,6 +175,24 @@ class Region(RegionClassObject):
             else :\r
                 Buffer.write(pack(str(Size)+'B', *(int('0x00', 16) for i in range(0, Size))))\r
 \r
+    def GetFvAlignValue(self, Str):\r
+        AlignValue = 1\r
+        Granu = 1\r
+        Str = Str.strip().upper()\r
+        if Str.endswith('K'):\r
+            Granu = 1024\r
+            Str = Str[:-1]\r
+        elif Str.endswith('M'):\r
+            Granu = 1024*1024\r
+            Str = Str[:-1]\r
+        elif Str.endswith('G'):\r
+            Granu = 1024*1024*1024\r
+            Str = Str[:-1]\r
+        else:\r
+            pass\r
+        \r
+        AlignValue = int(Str)*Granu\r
+        return AlignValue\r
     ## BlockSizeOfRegion()\r
     #\r
     #   @param  BlockSizeList        List of block information\r
@@ -186,6 +207,8 @@ class Region(RegionClassObject):
             GenFdsGlobalVariable.VerboseLogger ("self.Offset 0x%X" %self.Offset)\r
 \r
             if self.Offset < Offset :\r
+                if Offset - self.Offset < self.Size:\r
+                    raise Exception ("Region at Offset 0x%X can NOT fit into Block array with BlockSize %X", (self.Offset, item[0]))\r
                 BlockSize = item[0]\r
                 GenFdsGlobalVariable.VerboseLogger ("BlockSize = %X" %BlockSize)\r
                 return BlockSize\r