From nobody Thu May 2 22:28:27 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529919835794340.08493713743405; Mon, 25 Jun 2018 02:43:55 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id E69BE207DF286; Mon, 25 Jun 2018 02:43:54 -0700 (PDT) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 05F31203B8CE9 for ; Mon, 25 Jun 2018 02:43:53 -0700 (PDT) Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jun 2018 02:43:53 -0700 Received: from shwdeopenpsi105.ccr.corp.intel.com ([10.239.9.110]) by fmsmga007.fm.intel.com with ESMTP; 25 Jun 2018 02:43:51 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=bob.c.feng@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,269,1526367600"; d="scan'208";a="49681580" From: BobCF To: edk2-devel@lists.01.org Date: Mon, 25 Jun 2018 17:43:48 +0800 Message-Id: <20180625094348.203720-1-bob.c.feng@intel.com> X-Mailer: git-send-email 2.16.2.windows.1 Subject: [edk2] [Patch] BaseTools: Enable structure pcd in FDF file X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Bob Feng Cc: Liming Gao --- BaseTools/Source/Python/AutoGen/AutoGen.py | 3 +- BaseTools/Source/Python/AutoGen/GenC.py | 4 + BaseTools/Source/Python/GenFds/FdfParser.py | 81 ++++++++-- .../Source/Python/Workspace/BuildClassObject.py | 14 ++ BaseTools/Source/Python/Workspace/DscBuildData.py | 171 +++++++++++++++++= +++- BaseTools/Source/Python/build/BuildReport.py | 3 + 6 files changed, 256 insertions(+), 20 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/= Python/AutoGen/AutoGen.py index ed0be3bc74..e3f404bd6b 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -565,11 +565,11 @@ class WorkspaceAutoGen(AutoGen): for Pcd in Pkg.Pcds: DecPcds.add((Pcd[0], Pcd[1])) DecPcdsKey.add((Pcd[0], Pcd[1], Pcd[2])) =20 Platform.SkuName =3D self.SkuId - for Name, Guid in PcdSet: + for Name, Guid,Fileds in PcdSet: if (Name, Guid) not in DecPcds: EdkLogger.error( 'build', PARSER_ERROR, "PCD (%s.%s) used in FDF is not declared in DEC fi= les." % (Guid, Name), @@ -579,11 +579,10 @@ class WorkspaceAutoGen(AutoGen): else: # Check whether Dynamic or DynamicEx PCD used in FDF f= ile. If used, build break and give a error message. if (Name, Guid, TAB_PCDS_FIXED_AT_BUILD) in DecPcdsKey= \ or (Name, Guid, TAB_PCDS_PATCHABLE_IN_MODULE) in D= ecPcdsKey \ or (Name, Guid, TAB_PCDS_FEATURE_FLAG) in DecPcdsK= ey: - Platform.AddPcd(Name, Guid, PcdSet[Name, Guid]) continue elif (Name, Guid, TAB_PCDS_DYNAMIC) in DecPcdsKey or (= Name, Guid, TAB_PCDS_DYNAMIC_EX) in DecPcdsKey: EdkLogger.error( 'build', PARSER_ERROR, diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Pyt= hon/AutoGen/GenC.py index ae3af085a1..d186f399ba 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -888,10 +888,12 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd= ): FixPcdSizeTokenName =3D '_PCD_SIZE_' + TokenCName FixedPcdSizeVariableName =3D '_gPcd_FixedAtBuild_Size_' + TokenCName =20 if Pcd.PcdValueFromComm: Pcd.DefaultValue =3D Pcd.PcdValueFromComm + elif Pcd.PcdValueFromFdf: + Pcd.DefaultValue =3D Pcd.PcdValueFromFdf =20 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET: TokenNumber =3D int(Pcd.TokenValue, 0) # Add TokenSpaceGuidValue value to PcdTokenName to discriminate th= e DynamicEx PCDs with=20 # different Guids but same TokenCName @@ -1181,10 +1183,12 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, = Pcd): PatchPcdMaxSizeVariable =3D '_gPcd_BinaryPatch_MaxSize_' + TokenCName FixedPcdSizeVariableName =3D '_gPcd_FixedAtBuild_Size_' + TokenCName =20 if Pcd.PcdValueFromComm: Pcd.DefaultValue =3D Pcd.PcdValueFromComm + elif Pcd.PcdValueFromFdf: + Pcd.DefaultValue =3D Pcd.PcdValueFromFdf # # Write PCDs # if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET: TokenNumber =3D int(Pcd.TokenValue, 0) diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source= /Python/GenFds/FdfParser.py index 78cb049c61..a8a2e7d70e 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -80,17 +80,16 @@ T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QU= OTE, T_CHAR_STAR, T_CHAR_ (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#') =20 SEPERATOR_TUPLE =3D ('=3D', '|', ',', '{', '}') =20 RegionSizePattern =3D re.compile("\s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*\|= \s*(?P(?:0x|0X)?[a-fA-F0-9]+)\s*") -RegionSizeGuidPattern =3D re.compile("\s*(?P\w+\.\w+)\s*\|\s*(?P\w+\.\w+)\s*") -RegionOffsetPcdPattern =3D re.compile("\s*(?P\w+\.\w+)\s*$") +RegionSizeGuidPattern =3D re.compile("\s*(?P\w+\.\w+[\.\w\[\]]*)\s*\= |\s*(?P\w+\.\w+[\.\w\[\]]*)\s*") +RegionOffsetPcdPattern =3D re.compile("\s*(?P\w+\.\w+[\.\w\[\]]*)\s*= $") ShortcutPcdPattern =3D re.compile("\s*\w+\s*=3D\s*(?P(?:0x|0X)?[a-f= A-F0-9]+)\s*\|\s*(?P\w+\.\w+)\s*") BaseAddrValuePattern =3D re.compile('^0[xX][0-9a-fA-F]+') FileExtensionPattern =3D re.compile(r'([a-zA-Z][a-zA-Z0-9]*)') TokenFindPattern =3D re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-= Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)') - AllIncludeFileList =3D [] =20 # Get the closest parent def GetParentAtLine (Line): for Profile in AllIncludeFileList: @@ -223,12 +222,13 @@ class FileProfile : fsock.close() =20 except: EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=3DFi= leName) =20 - + self.FileName =3D FileName self.PcdDict =3D {} + self.PcdLocalDict =3D {} self.InfList =3D [] self.InfDict =3D {'ArchTBD':[]} # ECC will use this Dict and List information self.PcdFileLineDict =3D {} self.InfFileLineList =3D [] @@ -784,21 +784,22 @@ class FdfParser: elif self.__Token =3D=3D 'SET': if not self.__GetIfListCurrentItemStat(IfList): continue SetLine =3D self.CurrentLineNumber - 1 SetOffset =3D self.CurrentOffsetWithinLine - len('SET') - PcdPair =3D self.__GetNextPcdName() + PcdPair =3D self.__GetNextPcdSettings() PcdName =3D "%s.%s" % (PcdPair[1], PcdPair[0]) if not self.__IsToken( "=3D"): raise Warning("expected '=3D'", self.FileName, self.Cu= rrentLineNumber) =20 Value =3D self.__GetExpression() Value =3D self.__EvaluateConditional(Value, self.CurrentLi= neNumber, 'eval', True) =20 self.__PcdDict[PcdName] =3D Value =20 self.Profile.PcdDict[PcdPair] =3D Value + self.SetPcdLocalation(PcdPair) FileLineTuple =3D GetRealFileLine(self.FileName, self.Curr= entLineNumber) self.Profile.PcdFileLineDict[PcdPair] =3D FileLineTuple =20 self.__WipeOffArea.append(((SetLine, SetOffset), (self.Cur= rentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) elif self.__Token in ('!ifdef', '!ifndef', '!if'): @@ -1046,10 +1047,33 @@ class FdfParser: self.__Token =3D self.__CurrentLine()[StartPos : self.CurrentO= ffsetWithinLine] return True =20 return False =20 + def __GetNextPcdWord(self): + self.__SkipWhiteSpace() + if self.__EndOfFile(): + return False + + TempChar =3D self.__CurrentChar() + StartPos =3D self.CurrentOffsetWithinLine + if (TempChar >=3D 'a' and TempChar <=3D 'z') or (TempChar >=3D 'A'= and TempChar <=3D 'Z') or TempChar =3D=3D '_' or TempChar =3D=3D '[' or Te= mpChar =3D=3D ']': + self.__GetOneChar() + while not self.__EndOfLine(): + TempChar =3D self.__CurrentChar() + if (TempChar >=3D 'a' and TempChar <=3D 'z') or (TempChar = >=3D 'A' and TempChar <=3D 'Z') \ + or (TempChar >=3D '0' and TempChar <=3D '9') or TempChar = =3D=3D '_' or TempChar =3D=3D '-' or TempChar =3D=3D '[' or TempChar =3D=3D= ']': + self.__GetOneChar() + + else: + break + + self.__Token =3D self.__CurrentLine()[StartPos : self.CurrentO= ffsetWithinLine] + return True + + return False + ## __GetNextToken() method # # Get next token unit before a seperator # If found, the string value is put into self.__Token # @@ -1237,10 +1261,30 @@ class FdfParser: raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) pcdCName =3D self.__Token =20 return (pcdCName, pcdTokenSpaceCName) =20 + def __GetNextPcdSettings(self): + if not self.__GetNextWord(): + raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) + pcdTokenSpaceCName =3D self.__Token + + if not self.__IsToken( "."): + raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) + + if not self.__GetNextWord(): + raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) + pcdCName =3D self.__Token + =20 + Fields =3D [] + while self.__IsToken("."): + if not self.__GetNextPcdWord(): + raise Warning("expected format of .", self.FileName, self.CurrentLineNumber) + Fields.append(self.__Token) + + return (pcdCName, pcdTokenSpaceCName,".".join(Fields)) + ## __GetStringData() method # # Get string contents quoted in "" # If found, the decimal data is put into self.__Token # @@ -1552,10 +1596,13 @@ class FdfParser: FileName =3D self.__Token Obj.CreateFileName =3D FileName =20 return True =20 + def SetPcdLocalation(self,pcdpair): + self.Profile.PcdLocalDict[pcdpair] =3D (self.Profile.FileName,self= .CurrentLineNumber) + ## __GetTokenStatements() method # # Get token statements # # @param self The object pointer @@ -1570,13 +1617,14 @@ class FdfParser: raise Warning("expected Hex base address", self.FileName, = self.CurrentLineNumber) =20 Obj.BaseAddress =3D self.__Token =20 if self.__IsToken( "|"): - pcdPair =3D self.__GetNextPcdName() + pcdPair =3D self.__GetNextPcdSettings() Obj.BaseAddressPcd =3D pcdPair self.Profile.PcdDict[pcdPair] =3D Obj.BaseAddress + self.SetPcdLocalation(pcdPair) FileLineTuple =3D GetRealFileLine(self.FileName, self.Curr= entLineNumber) self.Profile.PcdFileLineDict[pcdPair] =3D FileLineTuple return True =20 if self.__IsKeyword( "Size"): @@ -1586,13 +1634,14 @@ class FdfParser: if not self.__GetNextHexNumber(): raise Warning("expected Hex size", self.FileName, self.Cur= rentLineNumber) =20 Size =3D self.__Token if self.__IsToken( "|"): - pcdPair =3D self.__GetNextPcdName() + pcdPair =3D self.__GetNextPcdSettings() Obj.SizePcd =3D pcdPair self.Profile.PcdDict[pcdPair] =3D Size + self.SetPcdLocalation(pcdPair) FileLineTuple =3D GetRealFileLine(self.FileName, self.Curr= entLineNumber) self.Profile.PcdFileLineDict[pcdPair] =3D FileLineTuple Obj.Size =3D long(Size, 0) return True =20 @@ -1679,13 +1728,14 @@ class FdfParser: raise Warning("expected Hex or Integer block size", self.FileN= ame, self.CurrentLineNumber) =20 BlockSize =3D self.__Token BlockSizePcd =3D None if self.__IsToken( "|"): - PcdPair =3D self.__GetNextPcdName() + PcdPair =3D self.__GetNextPcdSettings() BlockSizePcd =3D PcdPair self.Profile.PcdDict[PcdPair] =3D BlockSize + self.SetPcdLocalation(PcdPair) FileLineTuple =3D GetRealFileLine(self.FileName, self.CurrentL= ineNumber) self.Profile.PcdFileLineDict[PcdPair] =3D FileLineTuple BlockSize =3D long(BlockSize, 0) =20 BlockNumber =3D None @@ -1762,21 +1812,22 @@ class FdfParser: # @retval True Successfully find # @retval False Not able to find # def __GetSetStatement(self, Obj): if self.__IsKeyword("SET"): - PcdPair =3D self.__GetNextPcdName() + PcdPair =3D self.__GetNextPcdSettings() =20 if not self.__IsToken( "=3D"): raise Warning("expected '=3D'", self.FileName, self.Curren= tLineNumber) =20 Value =3D self.__GetExpression() Value =3D self.__EvaluateConditional(Value, self.CurrentLineNu= mber, 'eval', True) =20 if Obj: Obj.SetVarDict[PcdPair] =3D Value self.Profile.PcdDict[PcdPair] =3D Value + self.SetPcdLocalation(PcdPair) FileLineTuple =3D GetRealFileLine(self.FileName, self.CurrentL= ineNumber) self.Profile.PcdFileLineDict[PcdPair] =3D FileLineTuple return True =20 return False @@ -1849,18 +1900,20 @@ class FdfParser: # self.__UndoToken() IsRegionPcd =3D (RegionSizeGuidPattern.match(self.__CurrentLin= e()[self.CurrentOffsetWithinLine:]) or RegionOffsetPcdPattern.match(self.__CurrentLine= ()[self.CurrentOffsetWithinLine:])) if IsRegionPcd: - RegionObj.PcdOffset =3D self.__GetNextPcdName() + RegionObj.PcdOffset =3D self.__GetNextPcdSettings() self.Profile.PcdDict[RegionObj.PcdOffset] =3D "0x%08X" % (= RegionObj.Offset + long(Fd.BaseAddress, 0)) + self.SetPcdLocalation(RegionObj.PcdOffset) self.__PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionOb= j.PcdOffset[0])] =3D "0x%x" % RegionObj.Offset FileLineTuple =3D GetRealFileLine(self.FileName, self.Curr= entLineNumber) self.Profile.PcdFileLineDict[RegionObj.PcdOffset] =3D File= LineTuple if self.__IsToken( "|"): - RegionObj.PcdSize =3D self.__GetNextPcdName() + RegionObj.PcdSize =3D self.__GetNextPcdSettings() self.Profile.PcdDict[RegionObj.PcdSize] =3D "0x%08X" %= RegionObj.Size + self.SetPcdLocalation(RegionObj.PcdSize) self.__PcdDict['%s.%s' % (RegionObj.PcdSize[1], Region= Obj.PcdSize[0])] =3D "0x%x" % RegionObj.Size FileLineTuple =3D GetRealFileLine(self.FileName, self.= CurrentLineNumber) self.Profile.PcdFileLineDict[RegionObj.PcdSize] =3D Fi= leLineTuple =20 if not self.__GetNextWord(): @@ -2594,11 +2647,11 @@ class FdfParser: if not self.__GetNextWord(): raise Warning("expected File GUID", self.FileName, self.Cu= rrentLineNumber) if self.__Token =3D=3D 'PCD': if not self.__IsToken( "("): raise Warning("expected '('", self.FileName, self.Curr= entLineNumber) - PcdPair =3D self.__GetNextPcdName() + PcdPair =3D self.__GetNextPcdSettings() if not self.__IsToken( ")"): raise Warning("expected ')'", self.FileName, self.Curr= entLineNumber) self.__Token =3D 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')' =20 FfsFileObj.NameGuid =3D self.__Token @@ -3682,11 +3735,11 @@ class FdfParser: if not self.__GetNextWord(): raise Warning("expected $(NAMED_GUID)", self.FileName, sel= f.CurrentLineNumber) if self.__Token =3D=3D 'PCD': if not self.__IsToken( "("): raise Warning("expected '('", self.FileName, self.Curr= entLineNumber) - PcdPair =3D self.__GetNextPcdName() + PcdPair =3D self.__GetNextPcdSettings() if not self.__IsToken( ")"): raise Warning("expected ')'", self.FileName, self.Curr= entLineNumber) self.__Token =3D 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')' =20 NameGuid =3D self.__Token @@ -3956,11 +4009,11 @@ class FdfParser: self.__GetNextWord() =20 if self.__Token =3D=3D 'PCD': if not self.__IsToken( "("): raise Warning("expected '('", self.FileName, s= elf.CurrentLineNumber) - PcdPair =3D self.__GetNextPcdName() + PcdPair =3D self.__GetNextPcdSettings() if not self.__IsToken( ")"): raise Warning("expected ')'", self.FileName, s= elf.CurrentLineNumber) self.__Token =3D 'PCD('+PcdPair[1]+'.'+PcdPair[0]+= ')' =20 EfiSectionObj.FileName =3D self.__Token =20 diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTo= ols/Source/Python/Workspace/BuildClassObject.py index 209315d901..59b7f5fe20 100644 --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py @@ -68,18 +68,29 @@ class PcdClassObject(object): self.DscDefaultValue =3D None self.DscRawValue =3D None if IsDsc: self.DscDefaultValue =3D Value self.PcdValueFromComm =3D "" + self.PcdValueFromFdf =3D "" self.DefinitionPosition =3D ("","") =20 ## Get the maximum number of bytes def GetPcdMaxSize(self): if self.DatumType in TAB_PCD_NUMERIC_TYPES: return MAX_SIZE_TYPE[self.DatumType] =20 MaxSize =3D int(self.MaxDatumSize,10) if self.MaxDatumSize else 0 + if self.PcdValueFromFdf: + if self.PcdValueFromFdf.startswith("{") and self.PcdValueFromF= df.endswith("}"): + MaxSize =3D max([len(self.PcdValueFromFdf.split(",")),Max= Size]) + elif self.PcdValueFromFdf.startswith("\"") or self.PcdValueFro= mFdf.startswith("\'"): + MaxSize =3D max([len(self.PcdValueFromFdf)-2+1,MaxSize]) + elif self.PcdValueFromFdf.startswith("L\""): + MaxSize =3D max([2*(len(self.PcdValueFromFdf)-3+1),MaxSiz= e]) + else: + MaxSize =3D max([len(self.PcdValueFromFdf),MaxSize]) + if self.PcdValueFromComm: if self.PcdValueFromComm.startswith("{") and self.PcdValueFrom= Comm.endswith("}"): return max([len(self.PcdValueFromComm.split(",")),MaxSize]) elif self.PcdValueFromComm.startswith("\"") or self.PcdValueFr= omComm.startswith("\'"): return max([len(self.PcdValueFromComm)-2+1,MaxSize]) @@ -167,10 +178,11 @@ class StructurePcd(PcdClassObject): self.PcdDefineLineNo =3D 0 self.PkgPath =3D "" self.DefaultValueFromDec =3D "" self.ValueChain =3D set() self.PcdFieldValueFromComm =3D collections.OrderedDict() + self.PcdFieldValueFromFdf =3D collections.OrderedDict() def __repr__(self): return self.TypeName =20 def AddDefaultValue (self, FieldName, Value, FileName=3D"", LineNo=3D0= ): if FieldName in self.DefaultValues: @@ -214,10 +226,11 @@ class StructurePcd(PcdClassObject): self.validateranges =3D PcdObject.validateranges if PcdObject.vali= dateranges else self.validateranges self.validlists =3D PcdObject.validlists if PcdObject.validlists e= lse self.validlists self.expressions =3D PcdObject.expressions if PcdObject.expression= s else self.expressions self.DscRawValue =3D PcdObject.DscRawValue if PcdObject.DscRawValu= e else self.DscRawValue self.PcdValueFromComm =3D PcdObject.PcdValueFromComm if PcdObject.= PcdValueFromComm else self.PcdValueFromComm + self.PcdValueFromFdf =3D PcdObject.PcdValueFromFdf if PcdObject.Pc= dValueFromFdf else self.PcdValueFromFdf self.DefinitionPosition =3D PcdObject.DefinitionPosition if PcdObj= ect.DefinitionPosition else self.DefinitionPosition if type(PcdObject) is StructurePcd: self.StructuredPcdIncludeFile =3D PcdObject.StructuredPcdInclu= deFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdInclude= File self.PackageDecs =3D PcdObject.PackageDecs if PcdObject.Packag= eDecs else self.PackageDecs self.DefaultValues =3D PcdObject.DefaultValues if PcdObject.De= faultValues else self.DefaultValues @@ -229,10 +242,11 @@ class StructurePcd(PcdClassObject): self.StructName =3D PcdObject.DatumType if PcdObject.DatumType= else self.StructName self.PcdDefineLineNo =3D PcdObject.PcdDefineLineNo if PcdObjec= t.PcdDefineLineNo else self.PcdDefineLineNo self.PkgPath =3D PcdObject.PkgPath if PcdObject.PkgPath else s= elf.PkgPath self.ValueChain =3D PcdObject.ValueChain if PcdObject.ValueCha= in else self.ValueChain self.PcdFieldValueFromComm =3D PcdObject.PcdFieldValueFromComm= if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm + self.PcdFieldValueFromFdf =3D PcdObject.PcdFieldValueFromFdf i= f PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf =20 ## LibraryClassObject # # This Class defines LibraryClassObject used in BuildDatabase # diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/= Source/Python/Workspace/DscBuildData.py index 1ed7eb1c2c..c3d40f7daf 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -1128,11 +1128,12 @@ class DscBuildData(PlatformBuildClassObject): self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEF= AULT)) self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_= HII)) self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_= VPD)) =20 self._Pcds =3D self.CompletePcdValues(self._Pcds) - self._Pcds =3D self.OverrideByFdfCommOverAll(self._Pcds) + self._Pcds =3D self.OverrideByFdfOverAll(self._Pcds) + self._Pcds =3D self.OverrideByCommOverAll(self._Pcds) self._Pcds =3D self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, = self._Pcds) self._Pcds =3D self.CompleteHiiPcdsDefaultStores(self._Pcds) self._Pcds =3D self._FilterPcdBySkuUsage(self._Pcds) =20 self.RecoverCommandLinePcd() @@ -1188,11 +1189,38 @@ class DscBuildData(PlatformBuildClassObject): structure_pcd_data[(item[0],item[1])].append(item) =20 return structure_pcd_data =20 @staticmethod - def OverrideByFdfComm(StruPcds): + def OverrideByFdf(StruPcds,workspace): + if GlobalData.gFdfParser is None: + return StruPcds + StructurePcdInFdf =3D OrderedDict() + fdfpcd =3D GlobalData.gFdfParser.Profile.PcdDict + fdfpcdlocation =3D GlobalData.gFdfParser.Profile.PcdLocalDict + for item in fdfpcd : + if len(item[2]) and (item[0],item[1]) in StruPcds: + StructurePcdInFdf[(item[1],item[0],item[2] )] =3D fdfpcd[i= tem] + GlobalPcds =3D {(item[0],item[1]) for item in StructurePcdInFdf} + for Pcd in StruPcds.values(): + if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds: + continue + FieldValues =3D OrderedDict() + for item in StructurePcdInFdf: + if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) =3D=3D (item[0= ],item[1]) and item[2]: + FieldValues[item[2]] =3D StructurePcdInFdf[item] + for field in FieldValues: + if field not in Pcd.PcdFieldValueFromFdf: + Pcd.PcdFieldValueFromFdf[field] =3D ["","",""] + Pcd.PcdFieldValueFromFdf[field][0] =3D FieldValues[field] + Pcd.PcdFieldValueFromFdf[field][1] =3D os.path.relpath(fdf= pcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][0],workspace) + Pcd.PcdFieldValueFromFdf[field][2] =3D fdfpcdlocation[(Pcd= .TokenCName,Pcd.TokenSpaceGuidCName,field)][1] + + return StruPcds + + @staticmethod + def OverrideByComm(StruPcds): StructurePcdInCom =3D OrderedDict() for item in GlobalData.BuildOptionPcd: if len(item) =3D=3D 5 and (item[1],item[0]) in StruPcds: StructurePcdInCom[(item[0],item[1],item[2] )] =3D (item[3]= ,item[4]) GlobalPcds =3D {(item[0],item[1]) for item in StructurePcdInCom} @@ -1209,11 +1237,11 @@ class DscBuildData(PlatformBuildClassObject): Pcd.PcdFieldValueFromComm[field][0] =3D FieldValues[field]= [0] Pcd.PcdFieldValueFromComm[field][1] =3D FieldValues[field]= [1][0] Pcd.PcdFieldValueFromComm[field][2] =3D FieldValues[field]= [1][1] return StruPcds =20 - def OverrideByFdfCommOverAll(self,AllPcds): + def OverrideByCommOverAll(self,AllPcds): def CheckStructureInComm(commpcds): if not commpcds: return False if len(commpcds[0]) =3D=3D 5: return True @@ -1256,10 +1284,54 @@ class DscBuildData(PlatformBuildClassObject): self._PCD_TYPE_STRING_[MODEL_PCD_P= ATCHABLE_IN_MODULE], self._PCD_TYPE_STRING_[MODEL_PCD_F= EATURE_FLAG]]: self.Pcds[Name, Guid] =3D copy.deepcopy(PcdInDec) self.Pcds[Name, Guid].DefaultValue =3D NoFiledValu= es[( Guid,Name)][0] return AllPcds + + def OverrideByFdfOverAll(self,AllPcds): + + if GlobalData.gFdfParser is None: + return + NoFiledValues =3D GlobalData.gFdfParser.Profile.PcdDict + for Guid,Name,Field in NoFiledValues: + if len(Field): + continue + Value =3D NoFiledValues[(Guid,Name,Field)] + if (Name,Guid) in AllPcds: + Pcd =3D AllPcds.get((Name,Guid)) + if isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenS= paceGuidCName), None),StructurePcd): + self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCN= ame)).PcdValueFromComm =3D Value + else: + Pcd.PcdValueFromComm =3D Value + Pcd.DefaultValue =3D Value + for sku in Pcd.SkuInfoList: + SkuInfo =3D Pcd.SkuInfoList[sku] + if SkuInfo.DefaultValue: + SkuInfo.DefaultValue =3D Value + else: + SkuInfo.HiiDefaultValue =3D Value + for defaultstore in SkuInfo.DefaultStoreDict: + SkuInfo.DefaultStoreDict[defaultstore] =3D= Value + if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAM= IC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]: + if Pcd.DatumType =3D=3D TAB_VOID: + if not Pcd.MaxDatumSize: + Pcd.MaxDatumSize =3D '0' + CurrentSize =3D int(Pcd.MaxDatumSize,16) if Pc= d.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize) + OptionSize =3D len((StringToArray(Pcd.PcdValue= FromComm)).split(",")) + MaxSize =3D max(CurrentSize, OptionSize) + Pcd.MaxDatumSize =3D str(MaxSize) + else: + PcdInDec =3D self.DecPcds.get((Name,Guid)) + if PcdInDec: + PcdInDec.PcdValueFromComm =3D Value + if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_= FIXED_AT_BUILD], + self._PCD_TYPE_STRING_[MODEL_PCD_P= ATCHABLE_IN_MODULE], + self._PCD_TYPE_STRING_[MODEL_PCD_F= EATURE_FLAG]]: + self.Pcds[Name, Guid] =3D copy.deepcopy(PcdInDec) + self.Pcds[Name, Guid].DefaultValue =3D Value + return AllPcds + def UpdateStructuredPcds(self, TypeList, AllPcds): =20 DynamicPcdType =3D [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAU= LT], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD], @@ -1365,11 +1437,12 @@ class DscBuildData(PlatformBuildClassObject): =20 for defaultstoreid in DefaultStores: if defaultstoreid not in stru_pcd.SkuOverrideValue= s[skuid]: stru_pcd.SkuOverrideValues[skuid][defaultstore= id] =3D copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstore= name]) stru_pcd.ValueChain.add((skuid,defaultstoreid)) - S_pcd_set =3D DscBuildData.OverrideByFdfComm(S_pcd_set) + S_pcd_set =3D DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceD= ir) + S_pcd_set =3D DscBuildData.OverrideByComm(S_pcd_set) Str_Pcd_Values =3D self.GenerateByteArrayValue(S_pcd_set) if Str_Pcd_Values: for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Va= lues: str_pcd_obj =3D S_pcd_set.get((PcdName, PcdGuid)) if str_pcd_obj is None: @@ -1591,10 +1664,34 @@ class DscBuildData(PlatformBuildClassObject): FieldName =3D FieldName.split(']', 1)[1] FieldName =3D NewFieldName + FieldName while '[' in FieldName: FieldName =3D FieldName.rsplit('[', 1)[0] CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, = %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.st= rip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_= ori][2], FieldList[FieldName_ori][0]) + if Pcd.PcdFieldValueFromFdf: + CApp =3D CApp + "// From fdf \n" + for FieldName in Pcd.PcdFieldValueFromFdf: + FieldName =3D "." + FieldName + IsArray =3D IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[Field= Name.strip(".")][0]) + if IsArray and not (Pcd.PcdFieldValueFromFdf[FieldName.strip("= .")][0].startswith('{GUID') and Pcd.PcdFieldValueFromFdf[FieldName.strip(".= ")][0].endswith('}')): + try: + Value =3D ValueExpressionEx(Pcd.PcdFieldValueFromFdf[F= ieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True) + except BadExpression: + EdkLogger.error('Build', FORMAT_INVALID, "Invalid valu= e format for %s. From %s Line %d " % + (".".join((Pcd.TokenSpaceGuidCName, Pc= d.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromFdf[FieldName.st= rip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2])) + Value, ValueSize =3D ParseFieldValue(Value) + CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __A= RRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0))= ; // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), Va= lueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, Fie= ldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.P= cdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[Fiel= dName.strip(".")][0]); + else: + NewFieldName =3D '' + FieldName_ori =3D FieldName.strip('.') + while '[' in FieldName: + NewFieldName =3D NewFieldName + FieldName.split('[', 1= )[0] + '[0]' + ArrayIndex =3D int(FieldName.split('[', 1)[1].split(']= ', 1)[0]) + FieldName =3D FieldName.split(']', 1)[1] + FieldName =3D NewFieldName + FieldName + while '[' in FieldName: + FieldName =3D FieldName.rsplit('[', 1)[0] + CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d);= // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Ar= rayIndex + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValue= FromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0]) if Pcd.PcdFieldValueFromComm: CApp =3D CApp + "// From Command Line \n" for FieldName in Pcd.PcdFieldValueFromComm: FieldName =3D "." + FieldName IsArray =3D IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[Fiel= dName.strip(".")][0]) @@ -1832,10 +1929,74 @@ class DscBuildData(PlatformBuildClassObject): =20 @staticmethod def GenerateCommandLineValueStatement(Pcd): CApp =3D ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSp= aceGuidCName, Pcd.TokenCName) return CApp + def GenerateFdfValue(self,Pcd): + CApp =3D "// Value in Fdf\n" + CApp =3D CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.T= okenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType) + CApp =3D CApp + ' UINT32 FieldSize;\n' + CApp =3D CApp + ' CHAR8 *Value;\n' + + pcddefaultvalue =3D Pcd.PcdValueFromFdf + for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromFdf]: + if not FieldList: + continue + if pcddefaultvalue and FieldList =3D=3D pcddefaultvalue: + IsArray =3D IsFieldValueAnArray(FieldList) + if IsArray: + try: + FieldList =3D ValueExpressionEx(FieldList, TAB_VOI= D)(True) + except BadExpression: + EdkLogger.error("Build", FORMAT_INVALID, "Invalid = value format for %s.%s, from Fdf: %s" % + (Pcd.TokenSpaceGuidCName, Pcd.Toke= nCName, FieldList)) + Value, ValueSize =3D ParseFieldValue (FieldList) + + if isinstance(Value, str): + CApp =3D CApp + ' Pcd =3D %s; // From Fdf \n' % (Valu= e) + elif IsArray: + # + # Use memcpy() to copy value into field + # + CApp =3D CApp + ' Value =3D %s; // From Fdf .\n' = % (DscBuildData.IntToCString(Value, ValueSize)) + CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n' % (Valu= eSize) + continue + for FieldName in FieldList: + IsArray =3D IsFieldValueAnArray(FieldList[FieldName][0]) + if IsArray: + try: + FieldList[FieldName][0] =3D ValueExpressionEx(Fiel= dList[FieldName][0], TAB_VOID, self._GuidDict)(True) + except BadExpression: + EdkLogger.error('Build', FORMAT_INVALID, "Invalid = value format for %s. From %s Line %d " % + (".".join((Pcd.TokenSpaceGuidCName= , Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName= ][2])) + except: + print "error" + try: + Value, ValueSize =3D ParseFieldValue (FieldList[FieldN= ame][0]) + except Exception: + EdkLogger.error('Build', FORMAT_INVALID, "Invalid valu= e format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd= .TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2])) + if isinstance(Value, str): + CApp =3D CApp + ' Pcd->%s =3D %s; // From %s Line %d = Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldNa= me][2], FieldList[FieldName][0]) + elif IsArray: + # + # Use memcpy() to copy value into field + # + CApp =3D CApp + ' FieldSize =3D __FIELD_SIZE(%s, %s);= \n' % (Pcd.DatumType, FieldName) + CApp =3D CApp + ' Value =3D %s; // From %s Line %= d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[Fie= ldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + CApp =3D CApp + ' memcpy (&Pcd->%s, Value, (FieldSize= > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, Valu= eSize) + else: + if ValueSize > 4: + CApp =3D CApp + ' Pcd->%s =3D %dULL; // From %s L= ine %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[= FieldName][2], FieldList[FieldName][0]) + else: + CApp =3D CApp + ' Pcd->%s =3D %d; // From %s Line= %s Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[Fie= ldName][2], FieldList[FieldName][0]) + CApp =3D CApp + "}\n" + return CApp + + @staticmethod + def GenerateFdfValueStatement(Pcd): + CApp =3D ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidC= Name, Pcd.TokenCName) + return CApp =20 def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteV= alue, CApp): OverrideValues =3D {DefaultStore:""} if Pcd.SkuOverrideValues: OverrideValues =3D Pcd.SkuOverrideValues[SkuName] @@ -1904,10 +2065,11 @@ class DscBuildData(PlatformBuildClassObject): if skuname =3D=3D SkuName: break else: CApp =3D CApp + "// SkuName: %s, DefaultStoreName: STANDA= RD \n" % self.SkuIdMgr.SystemSkuId CApp =3D CApp + DscBuildData.GenerateInitValueStatement(Pc= d,self.SkuIdMgr.SystemSkuId,TAB_DEFAULT_STORES_DEFAULT) + CApp =3D CApp + DscBuildData.GenerateFdfValueStatement(Pcd) CApp =3D CApp + DscBuildData.GenerateCommandLineValueStatement= (Pcd) # # Set new PCD value and size # CApp =3D CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)P= cd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCNa= me) @@ -1940,10 +2102,11 @@ class DscBuildData(PlatformBuildClassObject): CApp =3D CApp + '\n' for PcdName in StructuredPcds: Pcd =3D StructuredPcds[PcdName] CApp =3D CApp + self.GenerateSizeFunction(Pcd) CApp =3D CApp + self.GenerateDefaultValueAssignFunction(Pcd) + CApp =3D CApp + self.GenerateFdfValue(Pcd) CApp =3D CApp + self.GenerateCommandLineValue(Pcd) if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_ST= RING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODU= LE]]: CApp =3D CApp + self.GenerateInitValueFunction(Pcd,self.Sk= uIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT) else: diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Sourc= e/Python/build/BuildReport.py index 324b6ff6aa..bc0b6e5d68 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -1329,10 +1329,13 @@ class PcdReport(object): OverrideFieldStruct =3D collections.OrderedDict() if OverrideStruct: for Key, Values in OverrideStruct.items(): if Values[1] and Values[1].endswith('.dsc'): OverrideFieldStruct[Key] =3D Values + if Pcd.PcdFieldValueFromFdf: + for Key, Values in Pcd.PcdFieldValueFromFdf.items(): + OverrideFieldStruct[Key] =3D Values if Pcd.PcdFieldValueFromComm: for Key, Values in Pcd.PcdFieldValueFromComm.items(): OverrideFieldStruct[Key] =3D Values return OverrideFieldStruct =20 --=20 2.16.2.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel