X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FGenFds%2FFdfParser.py;h=4f555e32bbaea27de65ee3f9cfc9899a73db24e2;hb=79b74a03e018ecbf03d8d50e6f20301e249c1ba5;hp=ea19156dafbff4b0f8cce47d773d9e7befd979fb;hpb=40d841f6a8f84e75409178e19e69b95e01bada0f;p=mirror_edk2.git diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index ea19156daf..4f555e32bb 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -43,6 +43,9 @@ import OptRomFileStatement from GenFdsGlobalVariable import GenFdsGlobalVariable from Common.BuildToolError import * from Common import EdkLogger +from Common.Misc import PathClass +from Common.String import NormPath +from Common import GlobalData import re import os @@ -205,6 +208,8 @@ class FdfParser: self.__SkippedChars = "" self.__WipeOffArea = [] + if GenFdsGlobalVariable.WorkSpaceDir == '': + GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE") ## __IsWhiteSpace() method # @@ -560,10 +565,20 @@ class FdfParser: self.Rewind() - - ## PreprocessIncludeFile() method + def __GetIfListCurrentItemStat(self, IfList): + if len(IfList) == 0: + return True + + for Item in IfList: + if Item[1] == False: + return False + + return True + + + ## PreprocessConditionalStatement() method # - # Preprocess file contents, replace !include statements with file contents. + # Preprocess conditional statement. # In the end, rewind the file buffer pointer to the beginning # # @param self The object pointer @@ -573,27 +588,28 @@ class FdfParser: IfList = [] while self.__GetNextToken(): if self.__Token == 'DEFINE': - DefineLine = self.CurrentLineNumber - 1 - DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE') - if not self.__GetNextToken(): - raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber) - Macro = self.__Token - if not self.__IsToken( "="): - raise Warning("expected '='", self.FileName, self.CurrentLineNumber) - - if not self.__GetNextToken(): - raise Warning("expected value", self.FileName, self.CurrentLineNumber) - - if self.__GetStringData(): - pass - Value = self.__Token - if not Macro in InputMacroDict: - FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1) - MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1]) - MacProfile.MacroName = Macro - MacProfile.MacroValue = Value - AllMacroList.append(MacProfile) - self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) + if self.__GetIfListCurrentItemStat(IfList): + DefineLine = self.CurrentLineNumber - 1 + DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE') + if not self.__GetNextToken(): + raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber) + Macro = self.__Token + if not self.__IsToken( "="): + raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + + if not self.__GetNextToken(): + raise Warning("expected value", self.FileName, self.CurrentLineNumber) + + if self.__GetStringData(): + pass + Value = self.__Token + if not Macro in InputMacroDict: + FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1) + MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1]) + MacProfile.MacroName = Macro + MacProfile.MacroValue = Value + AllMacroList.append(MacProfile) + self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) elif self.__Token in ('!ifdef', '!ifndef', '!if'): IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token)) @@ -747,7 +763,7 @@ class FdfParser: raise Warning("Value %s is not a number", self.FileName, Line) for Profile in AllMacroList: - if Profile.FileName == FileLineTuple[0] and Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]: + if Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]: if Op == None: if Value == 'Bool' and Profile.MacroValue == None or Profile.MacroValue.upper() == 'FALSE': return False @@ -1260,6 +1276,12 @@ class FdfParser: raise Warning("expected ']'", self.FileName, self.CurrentLineNumber) while self.__GetNextWord(): + # handle the SET statement + if self.__Token == 'SET': + self.__UndoToken() + self.__GetSetStatement(None) + continue + Macro = self.__Token if not self.__IsToken("="): @@ -1485,7 +1507,7 @@ class FdfParser: for Item in Obj.BlockSizeList: if Item[0] == None or Item[1] == None: - raise Warning("expected block statement for Fd Section", self.FileName, self.CurrentLineNumber) + raise Warning("expected block statement", self.FileName, self.CurrentLineNumber) ## __GetBlockStatement() method # @@ -1504,7 +1526,7 @@ class FdfParser: raise Warning("expected '='", self.FileName, self.CurrentLineNumber) if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber(): - raise Warning("expected Hex block size", self.FileName, self.CurrentLineNumber) + raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber) BlockSize = self.__Token BlockSizePcd = None @@ -1605,7 +1627,8 @@ class FdfParser: raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) Value += self.__SkippedChars - Obj.SetVarDict[PcdPair] = Value + if Obj: + Obj.SetVarDict[PcdPair] = Value self.Profile.PcdDict[PcdPair] = Value return True @@ -1667,9 +1690,13 @@ class FdfParser: self.__UndoToken() self.__GetRegionFileType( RegionObj) - else: + elif self.__Token == "DATA": self.__UndoToken() self.__GetRegionDataType( RegionObj) + else: + raise Warning("A valid region type was not found. " + "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred", + self.FileName, self.CurrentLineNumber) return True @@ -1900,9 +1927,14 @@ class FdfParser: self.__GetAddressStatements(FvObj) - self.__GetBlockStatement(FvObj) + while self.__GetBlockStatement(FvObj): + pass self.__GetSetStatements(FvObj) + + self.__GetFvBaseAddress(FvObj) + + self.__GetFvForceRebase(FvObj) self.__GetFvAlignment(FvObj) @@ -1956,7 +1988,66 @@ class FdfParser: raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) Obj.FvAlignment = self.__Token return True + + ## __GetFvBaseAddress() method + # + # Get BaseAddress for FV + # + # @param self The object pointer + # @param Obj for whom FvBaseAddress is got + # @retval True Successfully find a FvBaseAddress statement + # @retval False Not able to find a FvBaseAddress statement + # + def __GetFvBaseAddress(self, Obj): + if not self.__IsKeyword("FvBaseAddress"): + return False + + if not self.__IsToken( "="): + raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + + if not self.__GetNextToken(): + raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber) + + IsValidBaseAddrValue = re.compile('^0[x|X][0-9a-fA-F]+') + + if not IsValidBaseAddrValue.match(self.__Token.upper()): + raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + Obj.FvBaseAddress = self.__Token + return True + + ## __GetFvForceRebase() method + # + # Get FvForceRebase for FV + # + # @param self The object pointer + # @param Obj for whom FvForceRebase is got + # @retval True Successfully find a FvForceRebase statement + # @retval False Not able to find a FvForceRebase statement + # + def __GetFvForceRebase(self, Obj): + + if not self.__IsKeyword("FvForceRebase"): + return False + + if not self.__IsToken( "="): + raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + + if not self.__GetNextToken(): + raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber) + + if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]: + raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + + if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]: + Obj.FvForceRebase = True + elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]: + Obj.FvForceRebase = False + else: + Obj.FvForceRebase = None + + return True + ## __GetFvAttributes() method # # Get attributes for FV @@ -2145,6 +2236,11 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber) ffsInf.InfFileName = self.__Token + if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1: + #do case sensitive check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if not ffsInf.InfFileName in self.Profile.InfList: self.Profile.InfList.append(ffsInf.InfFileName) @@ -2156,7 +2252,10 @@ class FdfParser: ffsInf.KeepReloc = True else: raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) - + + ffsInf.CurrentLineNum = self.CurrentLineNumber + ffsInf.CurrentLineContent = self.__CurrentLine() + if ForCapsule: capsuleFfs = CapsuleData.CapsuleFfs() capsuleFfs.Ffs = ffsInf @@ -2240,10 +2339,15 @@ class FdfParser: if not self.__IsKeyword( "FILE"): return False - FfsFileObj = FfsFileStatement.FileStatement() - if not self.__GetNextWord(): raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber) + + if ForCapsule and self.__Token == 'DATA': + self.__UndoToken() + self.__UndoToken() + return False + + FfsFileObj = FfsFileStatement.FileStatement() FfsFileObj.FvFileType = self.__Token if not self.__IsToken( "="): @@ -2261,7 +2365,10 @@ class FdfParser: self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')' FfsFileObj.NameGuid = self.__Token - + + FfsFileObj.CurrentLineNum = self.CurrentLineNumber + FfsFileObj.CurrentLineContent = self.__CurrentLine() + self.__GetFilePart( FfsFileObj, MacroDict.copy()) if ForCapsule: @@ -2352,6 +2459,21 @@ class FdfParser: self.__GetSectionData( FfsFileObj, MacroDict) else: FfsFileObj.FileName = self.__Token + if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1: + # + # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase. + # + if not GlobalData.gAutoGenPhase: + #do case sensitive check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) + else: + if not InputMacroDict["OUTPUT_DIRECTORY"] in FfsFileObj.FileName: + #do case sensitive check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if not self.__IsToken( "}"): raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) @@ -2388,9 +2510,11 @@ class FdfParser: FfsFileObj.CheckSum = True if self.__GetAlignment(): - FfsFileObj.Alignment = self.__Token - - + if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): + raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) + #For FFS, Auto is default option same to "" + if not self.__Token == "Auto": + FfsFileObj.Alignment = self.__Token ## __GetAlignment() method # @@ -2595,6 +2719,11 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected section file path", self.FileName, self.CurrentLineNumber) DataSectionObj.SectFileName = self.__Token + if DataSectionObj.SectFileName.replace('$(WORKSPACE)', '').find('$') == -1: + #do case sensitive check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(DataSectionObj.SectFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) else: if not self.__GetCglSection(DataSectionObj): return False @@ -2682,8 +2811,8 @@ class FdfParser: def __GetGuidAttrib(self): AttribDict = {} - AttribDict["PROCESSING_REQUIRED"] = False - AttribDict["AUTH_STATUS_VALID"] = False + AttribDict["PROCESSING_REQUIRED"] = "NONE" + AttribDict["AUTH_STATUS_VALID"] = "NONE" if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"): AttribKey = self.__Token @@ -2847,7 +2976,9 @@ class FdfParser: IsInf = self.__GetInfStatement(Obj, True) IsFile = self.__GetFileStatement(Obj, True) IsFv = self.__GetFvStatement(Obj) - if not IsInf and not IsFile and not IsFv: + IsFd = self.__GetFdStatement(Obj) + IsAnyFile = self.__GetAnyFileStatement(Obj) + if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile): break ## __GetFvStatement() method @@ -2875,6 +3006,65 @@ class FdfParser: CapsuleObj.CapsuleDataList.append(CapsuleFv) return True + ## __GetFdStatement() method + # + # Get FD for capsule + # + # @param self The object pointer + # @param CapsuleObj for whom FD is got + # @retval True Successfully find a FD statement + # @retval False Not able to find a FD statement + # + def __GetFdStatement(self, CapsuleObj): + + if not self.__IsKeyword("FD"): + return False + + if not self.__IsToken("="): + raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + + if not self.__GetNextToken(): + raise Warning("expected FD name", self.FileName, self.CurrentLineNumber) + + CapsuleFd = CapsuleData.CapsuleFd() + CapsuleFd.FdName = self.__Token + CapsuleObj.CapsuleDataList.append(CapsuleFd) + return True + + ## __GetAnyFileStatement() method + # + # Get AnyFile for capsule + # + # @param self The object pointer + # @param CapsuleObj for whom AnyFile is got + # @retval True Successfully find a Anyfile statement + # @retval False Not able to find a AnyFile statement + # + def __GetAnyFileStatement(self, CapsuleObj): + + if not self.__IsKeyword("FILE"): + return False + + if not self.__IsKeyword("DATA"): + self.__UndoToken() + return False + + if not self.__IsToken("="): + raise Warning("expected '='", self.FileName, self.CurrentLineNumber) + + if not self.__GetNextToken(): + raise Warning("expected File name", self.FileName, self.CurrentLineNumber) + + AnyFileName = self.__Token + AnyFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AnyFileName) + if not os.path.exists(AnyFileName): + raise Warning("File %s not exists"%AnyFileName, self.FileName, self.CurrentLineNumber) + + CapsuleAnyFile = CapsuleData.CapsuleAnyFile() + CapsuleAnyFile.FileName = AnyFileName + CapsuleObj.CapsuleDataList.append(CapsuleAnyFile) + return True + ## __GetRule() method # # Get Rule section contents and store its data into rule list of self.Profile @@ -3511,6 +3701,11 @@ class FdfParser: raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber) VtfObj.ResetBin = self.__Token + if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1: + #check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) while self.__GetComponentStatement(VtfObj): pass @@ -3585,7 +3780,7 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected Component version", self.FileName, self.CurrentLineNumber) - Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}') + Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL) if Pattern.match(self.__Token) == None: raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) CompStatementObj.CompVer = self.__Token @@ -3613,6 +3808,11 @@ class FdfParser: raise Warning("expected Component file", self.FileName, self.CurrentLineNumber) CompStatementObj.CompBin = self.__Token + if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1: + #check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if not self.__IsKeyword("COMP_SYM"): raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber) @@ -3624,6 +3824,11 @@ class FdfParser: raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber) CompStatementObj.CompSym = self.__Token + if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1: + #check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if not self.__IsKeyword("COMP_SIZE"): raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber) @@ -3701,6 +3906,11 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber) ffsInf.InfFileName = self.__Token + if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1: + #check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if not ffsInf.InfFileName in self.Profile.InfList: self.Profile.InfList.append(ffsInf.InfFileName) @@ -3755,7 +3965,7 @@ class FdfParser: Overrides.PciRevision = self.__Token continue - if self.__IsKeyword( "COMPRESS"): + if self.__IsKeyword( "PCI_COMPRESS"): if not self.__IsToken( "="): raise Warning("expected '='", self.FileName, self.CurrentLineNumber) if not self.__GetNextToken(): @@ -3793,6 +4003,11 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected File path", self.FileName, self.CurrentLineNumber) FfsFileObj.FileName = self.__Token + if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1: + #check for file path + ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate() + if ErrorCode != 0: + EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if FfsFileObj.FileType == 'EFI': self.__GetOptRomOverrides(FfsFileObj) @@ -3835,16 +4050,18 @@ class FdfParser: def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []): for CapsuleDataObj in CapObj.CapsuleDataList : - if CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList: + if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList: RefFvList.append (CapsuleDataObj.FvName.upper()) + elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName != None and CapsuleDataObj.FdName.upper() not in RefFdList: + RefFdList.append (CapsuleDataObj.FdName.upper()) elif CapsuleDataObj.Ffs != None: - if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement): - if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList: - RefFvList.append(CapsuleDataObj.Ffs.FvName.upper()) - elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList: - RefFdList.append(CapsuleDataObj.Ffs.FdName.upper()) - else: - self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList) + if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement): + if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList: + RefFvList.append(CapsuleDataObj.Ffs.FvName.upper()) + elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList: + RefFdList.append(CapsuleDataObj.Ffs.FdName.upper()) + else: + self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList) ## __GetFvInFd() method # @@ -4044,12 +4261,19 @@ class FdfParser: return False if __name__ == "__main__": - parser = FdfParser("..\LakeportX64Pkg.fdf") + import sys + try: + test_file = sys.argv[1] + except IndexError, v: + print "Usage: %s filename" % sys.argv[0] + sys.exit(1) + + parser = FdfParser(test_file) try: parser.ParseFile() parser.CycleReferenceCheck() except Warning, X: - print str(X) + print str(X) else: print "Success!"