]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
CryptoPkg: Fix GCC build break for BaseCryptLib.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index ea19156dafbff4b0f8cce47d773d9e7befd979fb..4f555e32bbaea27de65ee3f9cfc9899a73db24e2 100644 (file)
@@ -43,6 +43,9 @@ import OptRomFileStatement
 from GenFdsGlobalVariable import GenFdsGlobalVariable\r
 from Common.BuildToolError import *\r
 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
@@ -205,6 +208,8 @@ class FdfParser:
         self.__SkippedChars = ""\r
 \r
         self.__WipeOffArea = []\r
+        if GenFdsGlobalVariable.WorkSpaceDir == '':\r
+            GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE")\r
 \r
     ## __IsWhiteSpace() method\r
     #\r
@@ -560,10 +565,20 @@ class FdfParser:
 \r
         self.Rewind()\r
 \r
-    \r
-    ## PreprocessIncludeFile() method\r
+    def __GetIfListCurrentItemStat(self, IfList):\r
+        if len(IfList) == 0:\r
+            return True\r
+        \r
+        for Item in IfList:\r
+            if Item[1] == False:\r
+                return False\r
+        \r
+        return True\r
+                   \r
+\r
+    ## PreprocessConditionalStatement() method\r
     #\r
-    #   Preprocess file contents, replace !include statements with file contents.\r
+    #   Preprocess conditional statement.\r
     #   In the end, rewind the file buffer pointer to the beginning\r
     #\r
     #   @param  self        The object pointer\r
@@ -573,27 +588,28 @@ class FdfParser:
         IfList = []\r
         while self.__GetNextToken():\r
             if self.__Token == 'DEFINE':\r
-                DefineLine = self.CurrentLineNumber - 1\r
-                DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')\r
-                if not self.__GetNextToken():\r
-                    raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
-                Macro = self.__Token\r
-                if not self.__IsToken( "="):\r
-                    raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-                if not self.__GetNextToken():\r
-                    raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
-\r
-                if self.__GetStringData():\r
-                    pass\r
-                Value = self.__Token\r
-                if not Macro in InputMacroDict:\r
-                    FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)\r
-                    MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
-                    MacProfile.MacroName = Macro\r
-                    MacProfile.MacroValue = Value\r
-                    AllMacroList.append(MacProfile)\r
-                self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
+                if self.__GetIfListCurrentItemStat(IfList):\r
+                    DefineLine = self.CurrentLineNumber - 1\r
+                    DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')\r
+                    if not self.__GetNextToken():\r
+                        raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
+                    Macro = self.__Token\r
+                    if not self.__IsToken( "="):\r
+                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+    \r
+                    if not self.__GetNextToken():\r
+                        raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
+    \r
+                    if self.__GetStringData():\r
+                        pass\r
+                    Value = self.__Token\r
+                    if not Macro in InputMacroDict:\r
+                        FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)\r
+                        MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
+                        MacProfile.MacroName = Macro\r
+                        MacProfile.MacroValue = Value\r
+                        AllMacroList.append(MacProfile)\r
+                    self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
 \r
             elif self.__Token in ('!ifdef', '!ifndef', '!if'):\r
                 IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
@@ -747,7 +763,7 @@ class FdfParser:
                     raise Warning("Value %s is not a number", self.FileName, Line)\r
 \r
         for Profile in AllMacroList:\r
-            if Profile.FileName == FileLineTuple[0] and Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]:\r
+            if Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]:\r
                 if Op == None:\r
                     if Value == 'Bool' and Profile.MacroValue == None or Profile.MacroValue.upper() == 'FALSE':\r
                         return False\r
@@ -1260,6 +1276,12 @@ class FdfParser:
             raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
 \r
         while self.__GetNextWord():\r
+            # handle the SET statement\r
+            if self.__Token == 'SET':\r
+                self.__UndoToken()\r
+                self.__GetSetStatement(None)\r
+                continue\r
+            \r
             Macro = self.__Token\r
             \r
             if not self.__IsToken("="):\r
@@ -1485,7 +1507,7 @@ class FdfParser:
         \r
         for Item in Obj.BlockSizeList:\r
             if Item[0] == None or Item[1] == None:\r
-                raise Warning("expected block statement for Fd Section", self.FileName, self.CurrentLineNumber)\r
+                raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
 \r
     ## __GetBlockStatement() method\r
     #\r
@@ -1504,7 +1526,7 @@ class FdfParser:
             raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
-            raise Warning("expected Hex block size", self.FileName, self.CurrentLineNumber)\r
+            raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
 \r
         BlockSize = self.__Token\r
         BlockSizePcd = None\r
@@ -1605,7 +1627,8 @@ class FdfParser:
                     raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
                 Value += self.__SkippedChars\r
 \r
-            Obj.SetVarDict[PcdPair] = Value\r
+            if Obj:\r
+                Obj.SetVarDict[PcdPair] = Value\r
             self.Profile.PcdDict[PcdPair] = Value\r
             return True\r
 \r
@@ -1667,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
@@ -1900,9 +1927,14 @@ class FdfParser:
 \r
         self.__GetAddressStatements(FvObj)\r
 \r
-        self.__GetBlockStatement(FvObj)\r
+        while self.__GetBlockStatement(FvObj):\r
+            pass\r
 \r
         self.__GetSetStatements(FvObj)\r
+        \r
+        self.__GetFvBaseAddress(FvObj)\r
+        \r
+        self.__GetFvForceRebase(FvObj)\r
 \r
         self.__GetFvAlignment(FvObj)\r
 \r
@@ -1956,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
@@ -2145,6 +2236,11 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
         ffsInf.InfFileName = self.__Token\r
+        if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
+            #do case sensitive check for file path\r
+            ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+            if ErrorCode != 0:\r
+                EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
         if not ffsInf.InfFileName in self.Profile.InfList:\r
             self.Profile.InfList.append(ffsInf.InfFileName)\r
@@ -2156,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
@@ -2240,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
@@ -2261,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
@@ -2352,6 +2459,21 @@ class FdfParser:
             self.__GetSectionData( FfsFileObj, MacroDict)\r
         else:\r
             FfsFileObj.FileName = self.__Token\r
+            if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\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
@@ -2388,9 +2510,11 @@ class FdfParser:
             FfsFileObj.CheckSum = True\r
 \r
         if self.__GetAlignment():\r
-            FfsFileObj.Alignment = self.__Token\r
-\r
-\r
+            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
+                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
+            #For FFS, Auto is default option same to ""\r
+            if not self.__Token == "Auto":\r
+                FfsFileObj.Alignment = self.__Token\r
 \r
     ## __GetAlignment() method\r
     #\r
@@ -2595,6 +2719,11 @@ class FdfParser:
                 if not self.__GetNextToken():\r
                     raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
                 DataSectionObj.SectFileName = self.__Token\r
+                if DataSectionObj.SectFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
+                    #do case sensitive check for file path\r
+                    ErrorCode, ErrorInfo = PathClass(NormPath(DataSectionObj.SectFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+                    if ErrorCode != 0:\r
+                        EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
             else:\r
                 if not self.__GetCglSection(DataSectionObj):\r
                     return False\r
@@ -2682,8 +2811,8 @@ class FdfParser:
     def __GetGuidAttrib(self):\r
 \r
         AttribDict = {}\r
-        AttribDict["PROCESSING_REQUIRED"] = False\r
-        AttribDict["AUTH_STATUS_VALID"] = False\r
+        AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
+        AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
         if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
             AttribKey = self.__Token\r
 \r
@@ -2847,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
@@ -2875,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
@@ -3511,6 +3701,11 @@ class FdfParser:
                 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
 \r
             VtfObj.ResetBin = self.__Token\r
+            if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
+                #check for file path\r
+                ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+                if ErrorCode != 0:\r
+                    EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
         while self.__GetComponentStatement(VtfObj):\r
             pass\r
@@ -3585,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
@@ -3613,6 +3808,11 @@ class FdfParser:
             raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
 \r
         CompStatementObj.CompBin = self.__Token\r
+        if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
+            #check for file path\r
+            ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+            if ErrorCode != 0:\r
+                EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
         if not self.__IsKeyword("COMP_SYM"):\r
             raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
@@ -3624,6 +3824,11 @@ class FdfParser:
             raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
 \r
         CompStatementObj.CompSym = self.__Token\r
+        if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1:\r
+            #check for file path\r
+            ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+            if ErrorCode != 0:\r
+                EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
         if not self.__IsKeyword("COMP_SIZE"):\r
             raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
@@ -3701,6 +3906,11 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
         ffsInf.InfFileName = self.__Token\r
+        if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
+            #check for file path\r
+            ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
+            if ErrorCode != 0:\r
+                EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
         if not ffsInf.InfFileName in self.Profile.InfList:\r
             self.Profile.InfList.append(ffsInf.InfFileName)\r
@@ -3755,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
@@ -3793,6 +4003,11 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
         FfsFileObj.FileName = self.__Token\r
+        if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
+            #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 FfsFileObj.FileType == 'EFI':\r
             self.__GetOptRomOverrides(FfsFileObj)\r
@@ -3835,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
@@ -4044,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