X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FGenFds%2FFdfParser.py;h=4f555e32bbaea27de65ee3f9cfc9899a73db24e2;hb=79b74a03e018ecbf03d8d50e6f20301e249c1ba5;hp=9e7771dc7de8b2c14cb266426c5400ad1130cb90;hpb=da92f27632d2c89fa8726948ac9b02461ca8b61e;p=mirror_edk2.git diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 9e7771dc7d..4f555e32bb 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -45,6 +45,7 @@ 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 @@ -1689,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 @@ -1926,6 +1931,10 @@ class FdfParser: pass self.__GetSetStatements(FvObj) + + self.__GetFvBaseAddress(FvObj) + + self.__GetFvForceRebase(FvObj) self.__GetFvAlignment(FvObj) @@ -1979,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 @@ -2184,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 @@ -2268,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( "="): @@ -2289,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: @@ -2381,10 +2460,20 @@ class FdfParser: else: FfsFileObj.FileName = self.__Token if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1: - #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) + # + # 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) @@ -2887,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 @@ -2915,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 @@ -3630,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 @@ -3815,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(): @@ -3900,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 # @@ -4109,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!"