]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
Sync BaseTools Branch (version r2362) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index 9e7771dc7de8b2c14cb266426c5400ad1130cb90..4f555e32bbaea27de65ee3f9cfc9899a73db24e2 100644 (file)
@@ -45,6 +45,7 @@ from Common.BuildToolError import *
 from Common import EdkLogger\r
 from Common.Misc import PathClass\r
 from Common.String import NormPath\r
+from Common import GlobalData\r
 \r
 import re\r
 import os\r
@@ -1689,9 +1690,13 @@ class FdfParser:
             self.__UndoToken()\r
             self.__GetRegionFileType( RegionObj)\r
 \r
-        else:\r
+        elif self.__Token == "DATA":\r
             self.__UndoToken()\r
             self.__GetRegionDataType( RegionObj)\r
+        else:\r
+            raise Warning("A valid region type was not found. "\r
+                          "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",\r
+                          self.FileName, self.CurrentLineNumber)\r
 \r
         return True\r
 \r
@@ -1926,6 +1931,10 @@ class FdfParser:
             pass\r
 \r
         self.__GetSetStatements(FvObj)\r
+        \r
+        self.__GetFvBaseAddress(FvObj)\r
+        \r
+        self.__GetFvForceRebase(FvObj)\r
 \r
         self.__GetFvAlignment(FvObj)\r
 \r
@@ -1979,7 +1988,66 @@ class FdfParser:
             raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         Obj.FvAlignment = self.__Token\r
         return True\r
+    \r
+    ## __GetFvBaseAddress() method\r
+    #\r
+    #   Get BaseAddress for FV\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  Obj         for whom FvBaseAddress is got\r
+    #   @retval True        Successfully find a FvBaseAddress statement\r
+    #   @retval False       Not able to find a FvBaseAddress statement\r
+    #\r
+    def __GetFvBaseAddress(self, Obj):\r
+\r
+        if not self.__IsKeyword("FvBaseAddress"):\r
+            return False\r
+\r
+        if not self.__IsToken( "="):\r
+            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
+\r
+        IsValidBaseAddrValue = re.compile('^0[x|X][0-9a-fA-F]+')\r
+\r
+        if not IsValidBaseAddrValue.match(self.__Token.upper()):\r
+            raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
+        Obj.FvBaseAddress = self.__Token\r
+        return True    \r
+    \r
+    ## __GetFvForceRebase() method\r
+    #\r
+    #   Get FvForceRebase for FV\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  Obj         for whom FvForceRebase is got\r
+    #   @retval True        Successfully find a FvForceRebase statement\r
+    #   @retval False       Not able to find a FvForceRebase statement\r
+    #\r
+    def __GetFvForceRebase(self, Obj):\r
+\r
+        if not self.__IsKeyword("FvForceRebase"):\r
+            return False\r
+\r
+        if not self.__IsToken( "="):\r
+            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
+        if not self.__GetNextToken():\r
+            raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber)\r
+\r
+        if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:\r
+            raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
+        \r
+        if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]:\r
+            Obj.FvForceRebase = True\r
+        elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]:\r
+            Obj.FvForceRebase = False\r
+        else:\r
+            Obj.FvForceRebase = None\r
+           \r
+        return True\r
+    \r
     ## __GetFvAttributes() method\r
     #\r
     #   Get attributes for FV\r
@@ -2184,7 +2252,10 @@ class FdfParser:
                 ffsInf.KeepReloc = True\r
             else:\r
                 raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
-\r
+        \r
+        ffsInf.CurrentLineNum = self.CurrentLineNumber\r
+        ffsInf.CurrentLineContent = self.__CurrentLine()\r
+        \r
         if ForCapsule:\r
             capsuleFfs = CapsuleData.CapsuleFfs()\r
             capsuleFfs.Ffs = ffsInf\r
@@ -2268,10 +2339,15 @@ class FdfParser:
         if not self.__IsKeyword( "FILE"):\r
             return False\r
 \r
-        FfsFileObj = FfsFileStatement.FileStatement()\r
-\r
         if not self.__GetNextWord():\r
             raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
+\r
+        if ForCapsule and self.__Token == 'DATA':\r
+            self.__UndoToken()\r
+            self.__UndoToken()\r
+            return False\r
+        \r
+        FfsFileObj = FfsFileStatement.FileStatement()\r
         FfsFileObj.FvFileType = self.__Token\r
 \r
         if not self.__IsToken( "="):\r
@@ -2289,7 +2365,10 @@ class FdfParser:
                 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
                 \r
         FfsFileObj.NameGuid = self.__Token\r
-\r
+        \r
+        FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
+        FfsFileObj.CurrentLineContent = self.__CurrentLine()\r
+        \r
         self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
 \r
         if ForCapsule:\r
@@ -2381,10 +2460,20 @@ class FdfParser:
         else:\r
             FfsFileObj.FileName = self.__Token\r
             if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
-                #do case sensitive check for file path\r
-                ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
-                if ErrorCode != 0:\r
-                    EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
+                #\r
+                # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase.\r
+                #\r
+                if not GlobalData.gAutoGenPhase:\r
+                    #do case sensitive check for file path\r
+                    ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+                    if ErrorCode != 0:\r
+                        EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
+                else:\r
+                    if not InputMacroDict["OUTPUT_DIRECTORY"] in FfsFileObj.FileName:\r
+                        #do case sensitive check for file path\r
+                        ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+                        if ErrorCode != 0:\r
+                            EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)                    \r
 \r
         if not self.__IsToken( "}"):\r
             raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
@@ -2887,7 +2976,9 @@ class FdfParser:
             IsInf = self.__GetInfStatement(Obj, True)\r
             IsFile = self.__GetFileStatement(Obj, True)\r
             IsFv = self.__GetFvStatement(Obj)\r
-            if not IsInf and not IsFile and not IsFv:\r
+            IsFd = self.__GetFdStatement(Obj)\r
+            IsAnyFile = self.__GetAnyFileStatement(Obj)\r
+            if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile):\r
                 break\r
 \r
     ## __GetFvStatement() method\r
@@ -2915,6 +3006,65 @@ class FdfParser:
         CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
         return True\r
 \r
+    ## __GetFdStatement() method\r
+    #\r
+    #   Get FD for capsule\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  CapsuleObj  for whom FD is got\r
+    #   @retval True        Successfully find a FD statement\r
+    #   @retval False       Not able to find a FD statement\r
+    #\r
+    def __GetFdStatement(self, CapsuleObj):\r
+\r
+        if not self.__IsKeyword("FD"):\r
+            return False\r
+\r
+        if not self.__IsToken("="):\r
+            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
+\r
+        CapsuleFd = CapsuleData.CapsuleFd()\r
+        CapsuleFd.FdName = self.__Token\r
+        CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
+        return True\r
+\r
+    ## __GetAnyFileStatement() method\r
+    #\r
+    #   Get AnyFile for capsule\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  CapsuleObj  for whom AnyFile is got\r
+    #   @retval True        Successfully find a Anyfile statement\r
+    #   @retval False       Not able to find a AnyFile statement\r
+    #\r
+    def __GetAnyFileStatement(self, CapsuleObj):\r
+\r
+        if not self.__IsKeyword("FILE"):\r
+            return False\r
+\r
+        if not self.__IsKeyword("DATA"):\r
+            self.__UndoToken()\r
+            return False\r
+\r
+        if not self.__IsToken("="):\r
+            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
+        \r
+        AnyFileName = self.__Token\r
+        AnyFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AnyFileName)\r
+        if not os.path.exists(AnyFileName):\r
+            raise Warning("File %s not exists"%AnyFileName, self.FileName, self.CurrentLineNumber)\r
+\r
+        CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
+        CapsuleAnyFile.FileName = AnyFileName\r
+        CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
+        return True\r
+\r
     ## __GetRule() method\r
     #\r
     #   Get Rule section contents and store its data into rule list of self.Profile\r
@@ -3630,7 +3780,7 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
 \r
-        Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')\r
+        Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
         if Pattern.match(self.__Token) == None:\r
             raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         CompStatementObj.CompVer = self.__Token\r
@@ -3815,7 +3965,7 @@ class FdfParser:
                     Overrides.PciRevision = self.__Token\r
                     continue\r
 \r
-                if self.__IsKeyword( "COMPRESS"):\r
+                if self.__IsKeyword( "PCI_COMPRESS"):\r
                     if not self.__IsToken( "="):\r
                         raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
                     if not self.__GetNextToken():\r
@@ -3900,16 +4050,18 @@ class FdfParser:
     def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
 \r
         for CapsuleDataObj in CapObj.CapsuleDataList :\r
-            if CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
+            if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
                 RefFvList.append (CapsuleDataObj.FvName.upper())\r
+            elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName != None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
+                RefFdList.append (CapsuleDataObj.FdName.upper())            \r
             elif CapsuleDataObj.Ffs != None:\r
-              if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
-                  if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
-                      RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
-                  elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
-                      RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
-                  else:\r
-                      self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
+                if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
+                    if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
+                        RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
+                    elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
+                        RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
+                    else:\r
+                        self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
 \r
     ## __GetFvInFd() method\r
     #\r
@@ -4109,12 +4261,19 @@ class FdfParser:
         return False\r
 \r
 if __name__ == "__main__":\r
-    parser = FdfParser("..\LakeportX64Pkg.fdf")\r
+    import sys\r
+    try:\r
+        test_file = sys.argv[1]\r
+    except IndexError, v:\r
+        print "Usage: %s filename" % sys.argv[0]\r
+        sys.exit(1)\r
+\r
+    parser = FdfParser(test_file)\r
     try:\r
         parser.ParseFile()\r
         parser.CycleReferenceCheck()\r
     except Warning, X:\r
-            print str(X)\r
+        print str(X)\r
     else:\r
         print "Success!"\r
 \r