* Re: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd [not found] <163E2552F529AEC6.4805@groups.io> @ 2020-10-26 3:59 ` Bob Feng 2020-10-27 6:19 ` 回复: " gaoliming 0 siblings, 1 reply; 4+ messages in thread From: Bob Feng @ 2020-10-26 3:59 UTC (permalink / raw) To: devel@edk2.groups.io, Feng, Bob C, Liming Gao Cc: Chen, Christine, Kinney, Michael D Liming, would you review this patch? Thanks, Bob -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob Feng Sent: Thursday, October 15, 2020 6:59 PM To: devel@edk2.groups.io Cc: Liming Gao <gaoliming@byosoft.com.cn>; Chen, Christine <yuwei.chen@intel.com> Subject: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd This patch is to enable the Module scoped Structure Pcd usage. User can set structure pcd field value in module scope. For example, under the [components] section of a dsc file, user can override some field value for a specific module. Package/Module.inf{ <PcdsFixedAtBuild> gUefiTokenSpaceGuid.StructurePcdModule.FieldName | 5 } Signed-off-by: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Yuwei Chen <yuwei.chen@intel.com> --- V2: Fixed the incorrect format in build report. BaseTools/Source/Python/AutoGen/DataPipe.py | 5 +- .../Source/Python/AutoGen/ModuleAutoGen.py | 4 +- .../Python/AutoGen/ModuleAutoGenHelper.py | 10 +- .../Source/Python/AutoGen/PlatformAutoGen.py | 8 +- .../Python/Workspace/BuildClassObject.py | 12 + .../Source/Python/Workspace/DscBuildData.py | 243 ++++++++++++++++-- BaseTools/Source/Python/build/BuildReport.py | 109 ++++---- 7 files changed, 319 insertions(+), 72 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/DataPipe.py b/BaseTools/Source/Python/AutoGen/DataPipe.py index 50403fbfb5..86ac2b928d 100755 --- a/BaseTools/Source/Python/AutoGen/DataPipe.py +++ b/BaseTools/Source/Python/AutoGen/DataPipe.py @@ -70,13 +70,14 @@ class MemoryDataPipe(DataPipe): } #Platform Module Pcds ModulePcds = {} for m in PlatformInfo.Platform.Modules: - m_pcds = PlatformInfo.Platform.Modules[m].Pcds + module = PlatformInfo.Platform.Modules[m] + m_pcds = module.Pcds if m_pcds: - ModulePcds[(m.File,m.Root,m.Arch)] = [PCD_DATA( + ModulePcds[module.Guid] = [PCD_DATA( pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type, pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue, pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges, pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue) for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()] diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py index eebf6e87f5..d70b0d7ae8 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -1030,11 +1030,11 @@ class ModuleAutoGen(AutoGen): # @retval list The list of PCD # @cached_property def ModulePcdList(self): # apply PCD settings from platform - RetVal = self.PlatformInfo.ApplyPcdSetting(self.Module, self.Module.Pcds) + RetVal = self.PlatformInfo.ApplyPcdSetting(self, self.Module.Pcds) return RetVal @cached_property def _PcdComments(self): ReVal = OrderedListDict() @@ -1061,11 +1061,11 @@ class ModuleAutoGen(AutoGen): # skip duplicated PCDs if Key in self.Module.Pcds or Key in Pcds: continue Pcds.add(Key) PcdsInLibrary[Key] = copy.copy(Library.Pcds[Key]) - RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self.Module, PcdsInLibrary, Library=Library)) + RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self, PcdsInLibrary, Library=Library)) return RetVal ## Get the GUID value mapping # # @retval dict The mapping between GUID cname and its value diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py index 9dd93b9beb..8e60643d1f 100644 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py @@ -477,12 +477,13 @@ class PlatformInfo(AutoGenInfo): SkuName = TAB_DEFAULT ToPcd.SkuInfoList = { SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue) } - def ApplyPcdSetting(self, Module, Pcds, Library=""): + def ApplyPcdSetting(self, Ma, Pcds, Library=""): # for each PCD in module + Module=Ma.Module for Name, Guid in Pcds: PcdInModule = Pcds[Name, Guid] # find out the PCD setting in platform if (Name, Guid) in self.Pcds: PcdInPlatform = self.Pcds[Name, Guid] @@ -505,13 +506,16 @@ class PlatformInfo(AutoGenInfo): % (Guid, Name, str(Module)), File=self.MetaFile ) # override PCD settings with module specific setting + ModuleScopePcds = self.DataPipe.Get("MOL_PCDS") if Module in self.Platform.Modules: PlatformModule = self.Platform.Modules[str(Module)] - for Key in PlatformModule.Pcds: + PCD_DATA = ModuleScopePcds.get(Ma.Guid,{}) + mPcds = {(pcd.TokenCName,pcd.TokenSpaceGuidCName): pcd for pcd in PCD_DATA} + for Key in mPcds: if self.BuildOptionPcd: for pcd in self.BuildOptionPcd: (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd if (TokenCName, TokenSpaceGuidCName) == Key and FieldName =="": PlatformModule.Pcds[Key].DefaultValue = pcdvalue @@ -526,11 +530,11 @@ class PlatformInfo(AutoGenInfo): if PcdItem in Pcds: ToPcd = Pcds[PcdItem] Flag = True break if Flag: - self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], Module, Msg="DSC Components Module scoped PCD section", Library=Library) + self._OverridePcd(ToPcd, mPcds[Key], Module, Msg="DSC Components Module scoped PCD section", Library=Library) # use PCD value to calculate the MaxDatumSize when it is not specified for Name, Guid in Pcds: Pcd = Pcds[Name, Guid] if Pcd.DatumType == TAB_VOID and not Pcd.MaxDatumSize: Pcd.MaxSizeUserSet = None diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py index 26ab8e7f36..c7a4cb9a08 100644 --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py @@ -1041,11 +1041,17 @@ class PlatformAutoGen(AutoGen): TokenNumber += 1 return RetVal @cached_property def _MbList(self): - return [self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain] for m in self.Platform.Modules] + mlist = [] + for m in self.Platform.Modules: + component = self.Platform.Modules[m] + module = self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain] + module.Guid = component.Guid + mlist.append(module) + return mlist @cached_property def _MaList(self): for ModuleFile in self.Platform.Modules: Ma = ModuleAutoGen( diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTools/Source/Python/Workspace/BuildClassObject.py index db40e3b10c..ebb65fc2fe 100644 --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py @@ -68,10 +68,11 @@ class PcdClassObject(object): self.DscRawValueInfo = {} if IsDsc: self.DscDefaultValue = Value self.PcdValueFromComm = "" self.PcdValueFromFdf = "" + self.PcdValueFromComponents = {} #{ModuleGuid:value, file_path,lineNo} self.CustomAttribute = {} self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag self._Capacity = None @property @@ -296,10 +297,11 @@ class StructurePcd(PcdClassObject): self.DefaultValueFromDecInfo = None self.ValueChain = set() self.PcdFieldValueFromComm = OrderedDict() self.PcdFieldValueFromFdf = OrderedDict() self.DefaultFromDSC=None + self.PcdFiledValueFromDscComponent = OrderedDict() def __repr__(self): return self.TypeName def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0,DimensionAttr ="-1"): if DimensionAttr not in self.DefaultValues: @@ -322,10 +324,16 @@ class StructurePcd(PcdClassObject): if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]: del self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo] return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] + def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, FileName="", LineNo=0, DimensionAttr = '-1'): + self.PcdFiledValueFromDscComponent.setdefault(ModuleGuid, OrderedDict()) + self.PcdFiledValueFromDscComponent[ModuleGuid].setdefault(DimensionAttr,OrderedDict()) + self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo] + return self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName] + def SetPcdMode (self, PcdMode): self.PcdMode = PcdMode def copy(self, PcdObject): self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName @@ -363,10 +371,11 @@ class StructurePcd(PcdClassObject): self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf + self.PcdFiledValueFromDscComponent = PcdObject.PcdFiledValueFromDscComponent if PcdObject.PcdFiledValueFromDscComponent else self.PcdFiledValueFromDscComponent def __deepcopy__(self,memo): new_pcd = StructurePcd() self.sharedcopy(new_pcd) @@ -381,10 +390,11 @@ class StructurePcd(PcdClassObject): new_pcd.DefaultValues = CopyDict(self.DefaultValues) new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC) new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues) new_pcd.PcdFieldValueFromComm = CopyDict(self.PcdFieldValueFromComm) new_pcd.PcdFieldValueFromFdf = CopyDict(self.PcdFieldValueFromFdf) + new_pcd.PcdFiledValueFromDscComponent = CopyDict(self.PcdFiledValueFromDscComponent) new_pcd.ValueChain = {item for item in self.ValueChain} return new_pcd LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModList']) @@ -461,10 +471,12 @@ class ModuleBuildClassObject(object): self.Includes = [] self.Packages = [] self.Pcds = {} self.BuildOptions = {} self.Depex = {} + self.StrPcdSet = [] + self.StrPcdOverallValue = {} ## Convert the class to a string # # Convert member MetaFile of the class to a string # diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 1ed3d9b909..1bb4fdc183 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -753,13 +753,14 @@ class DscBuildData(PlatformBuildClassObject): ErrorCode, ErrorInfo = ModuleFile.Validate('.inf') if ErrorCode != 0: EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo, ExtraData=ErrorInfo) + ModuleBuildData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain] Module = ModuleBuildClassObject() Module.MetaFile = ModuleFile - + Module.Guid = ModuleBuildData.Guid # get module private library instance RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId] for Record in RecordList: LibraryClass = Record[0] LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch) @@ -776,11 +777,11 @@ class DscBuildData(PlatformBuildClassObject): LibraryClass = 'NULL%d' % self._NullLibraryNumber EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass)) Module.LibraryClasses[LibraryClass] = LibraryPath if LibraryPath not in self.LibraryInstances: self.LibraryInstances.append(LibraryPath) - + S_PcdSet = [] # get module private PCD setting for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \ MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]: RecordList = self._RawData[Type, self._Arch, None, ModuleId] for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: @@ -790,24 +791,35 @@ class DscBuildData(PlatformBuildClassObject): if len(TokenList) > 2: MaxDatumSize = TokenList[2] else: MaxDatumSize = '' TypeString = self._PCD_TYPE_STRING_[Type] - Pcd = PcdClassObject( - PcdCName, - TokenSpaceGuid, - TypeString, - '', - DefaultValue, - '', - MaxDatumSize, - {}, - False, - None - ) - Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd + TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName) + + if ("." in TokenSpaceGuid or "[" in PcdCName): + S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]]) + DefaultValue = '' + if ( PCName,TCName) not in Module.Pcds: + Pcd = PcdClassObject( + PCName, + TCName, + TypeString, + '', + DefaultValue, + '', + MaxDatumSize, + {}, + False, + None, + IsDsc=True) + Module.Pcds[PCName, TCName] = Pcd + + Module.StrPcdSet = S_PcdSet + for TCName,PCName, _,_,_,_,_,_ in S_PcdSet: + if (PCName,TCName) in Module.Pcds: + Module.StrPcdOverallValue[(PCName,TCName)] = Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5 # get module private build options RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId] for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: if (ToolChainFamily, ToolChain) not in Module.BuildOptions: Module.BuildOptions[ToolChainFamily, ToolChain] = Option @@ -820,11 +832,13 @@ class DscBuildData(PlatformBuildClassObject): if len(RecordList) != 1: EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.', File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo) ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace) ModuleFile.Arch = self._Arch - + Module.Guid = RecordList[0][2] + for item in Module.StrPcdSet: + item[4] = RecordList[0][2] self._Modules[ModuleFile] = Module return self._Modules ## Retrieve all possible library instances used in this platform @property @@ -1497,11 +1511,19 @@ class DscBuildData(PlatformBuildClassObject): EdkLogger.error('build', PARSER_ERROR, "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch), File=self.MetaFile, Line = Dummy5) S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]]) - + ModuleScopeOverallValue = {} + for m in self.Modules.values(): + mguid = m.Guid + if m.StrPcdSet: + S_PcdSet.extend(m.StrPcdSet) + mguid = m.StrPcdSet[0][4] + for (PCName,TCName) in m.StrPcdOverallValue: + Value, dsc_file, lineNo = m.StrPcdOverallValue[(PCName,TCName)] + ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, dsc_file, lineNo # handle pcd value override StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet) S_pcd_set = OrderedDict() for str_pcd in StrPcdSet: str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None) @@ -1515,10 +1537,15 @@ class DscBuildData(PlatformBuildClassObject): else: str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList} for str_pcd_data in StrPcdSet[str_pcd]: if str_pcd_data[4] in SkuIds: str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) + elif GlobalData.gGuidPattern.match(str_pcd_data[4]): + str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) + PcdComponentValue = ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str.TokenSpaceGuidCName)) + for module_guid in PcdComponentValue: + str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = PcdComponentValue[module_guid] S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str # Add the Structure PCD that only defined in DEC, don't have override in DSC file for Pcd in self.DecPcds: if isinstance(self._DecPcds[Pcd], StructurePcd): @@ -1573,11 +1600,14 @@ class DscBuildData(PlatformBuildClassObject): if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]: stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename]) stru_pcd.ValueChain.add((skuid, defaultstoreid)) S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir) S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set) + + # Create a tool to caculate structure pcd value Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) + if Str_Pcd_Values: for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values: str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid)) if str_pcd_obj is None: print(PcdName, PcdGuid) @@ -1591,10 +1621,18 @@ class DscBuildData(PlatformBuildClassObject): str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue}) elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON): str_pcd_obj.DefaultValue = PcdValue + else: + #Module Scope Structure Pcd + moduleguid = skuname.replace("S","-") + if GlobalData.gGuidPattern.match(moduleguid): + for component in self.Modules.values(): + if component.Guid == moduleguid: + component.Pcds[(PcdName, PcdGuid)].DefaultValue = PcdValue + else: if skuname not in str_pcd_obj.SkuInfoList: nextskuid = self.SkuIdMgr.GetNextSkuId(skuname) NoDefault = False while nextskuid not in str_pcd_obj.SkuInfoList: @@ -2339,10 +2377,79 @@ class DscBuildData(PlatformBuildClassObject): else: CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + "}\n" return CApp + def GenerateModuleScopeValue(self, Pcd): + CApp = "// Value in Dsc Module scope \n" + for ModuleGuid in Pcd.PcdFiledValueFromDscComponent: + + CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, ModuleGuid,Pcd.BaseDatumType) + CApp = CApp + ' UINT32 FieldSize;\n' + CApp = CApp + ' CHAR8 *Value;\n' + pcddefaultvalue, file_path,lineNo = Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None)) + + if pcddefaultvalue: + IsArray = _IsFieldValueAnArray(pcddefaultvalue) + if IsArray: + try: + FieldList = ValueExpressionEx(pcddefaultvalue, TAB_VOID)(True) + except BadExpression: + EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from %s Line %s: %s" % + (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList)) + Value, ValueSize = ParseFieldValue (FieldList) + + if isinstance(Value, str): + CApp = CApp + ' Pcd = %s; // From %s Line %s \n' % (Value, file_path, lineNo) + elif IsArray: + # + # Use memcpy() to copy value into field + # + CApp = CApp + ' Value = %s; // From %s Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo) + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) + + + PcdFiledValue = Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid) + for index in PcdFiledValue: + FieldList = PcdFiledValue[index] + if not FieldList: + continue + for FieldName in FieldList: + IsArray = _IsFieldValueAnArray(FieldList[FieldName][0]) + if IsArray: + try: + FieldList[FieldName][0] = ValueExpressionEx(FieldList[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 = ParseFieldValue (FieldList[FieldName][0]) + except Exception: + 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])) + if isinstance(Value, str): + CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + elif IsArray: + # + # Use memcpy() to copy value into field + # + CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName) + CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) + else: + if '[' in FieldName and ']' in FieldName: + Index = int(FieldName.split('[')[1].split(']')[0]) + CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName) + if ValueSize > 4: + CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + else: + CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) + CApp = CApp + "}\n" + return CApp + @staticmethod def GenerateCommandLineValueStatement(Pcd): CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) return CApp def GenerateFdfValue(self,Pcd): @@ -2412,10 +2519,88 @@ class DscBuildData(PlatformBuildClassObject): @staticmethod def GenerateFdfValueStatement(Pcd): CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) return CApp + @staticmethod + def GenerateModuleValueStatement(module_guid, Pcd): + CApp = " Assign_%s_%s_%s_Value(Pcd);\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid) + return CApp + def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd, InitByteValue, CApp): + for module_guid in Pcd.PcdFiledValueFromDscComponent: + CApp = CApp + 'void\n' + CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + CApp = CApp + ' void\n' + CApp = CApp + ' )\n' + CApp = CApp + '{\n' + CApp = CApp + ' UINT32 Size;\n' + CApp = CApp + ' UINT32 FieldSize;\n' + CApp = CApp + ' CHAR8 *Value;\n' + CApp = CApp + ' UINT32 OriginalSize;\n' + CApp = CApp + ' VOID *OriginalPcd;\n' + + CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo) + + CApp = CApp + '\n' + + PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip()) + InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue) + # + # Get current PCD value and size + # + CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + + # + # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides + # the correct value. For structures with a flexible array member, the flexible + # array member is detected, and the size is based on the highest index used with + # the flexible array member. The flexible array member must be the last field + # in a structure. The size formula for this case is: + # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1) + # + CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_DEFAULT) + if Pcd.IsArray() and Pcd.Capacity[-1] != "-1": + CApp = CApp + ' OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize()) + CApp = CApp + ' Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize()) + + # + # Allocate and zero buffer for the PCD + # Must handle cases where current value is smaller, larger, or same size + # Always keep that larger one as the current size + # + CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n' + CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,) + CApp = CApp + ' memset (Pcd, 0, Size);\n' + + # + # Copy current PCD value into allocated buffer. + # + CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n' + + # + # Assign field values in PCD + # + CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd) + + CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId + CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT) + CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd) + CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd) + CApp = CApp + DscBuildData.GenerateModuleValueStatement(module_guid,Pcd) + # + # Set new PCD value and size + # + CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + + # + # Free PCD + # + CApp = CApp + ' free (Pcd);\n' + CApp = CApp + '}\n' + CApp = CApp + '\n' + return InitByteValue,CApp + def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp): OverrideValues = {DefaultStore:{}} if Pcd.SkuOverrideValues: OverrideValues = Pcd.SkuOverrideValues[SkuName] if not OverrideValues: @@ -2584,26 +2769,42 @@ class DscBuildData(PlatformBuildClassObject): CApp = CApp + '\n' for Pcd in StructuredPcds.values(): CApp = CApp + self.GenerateArrayAssignment(Pcd) for PcdName in sorted(StructuredPcds.keys()): Pcd = StructuredPcds[PcdName] + + #create void void Cal_tocken_cname_Size functions CApp = CApp + self.GenerateSizeFunction(Pcd) + + #create void Assign_ functions + + # From DEC CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd) + # From Fdf CApp = CApp + self.GenerateFdfValue(Pcd) + # From CommandLine CApp = CApp + self.GenerateCommandLineValue(Pcd) + + # From Dsc Global setting if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT) else: for SkuName in self.SkuIdMgr.SkuOverrideOrder(): if SkuName not in Pcd.SkuOverrideValues: continue for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]: CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName) + + # From Dsc module scope setting + CApp = CApp + self.GenerateModuleScopeValue(Pcd) + + #create Initialize_ functions if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp) + InitByteValue, CApp = self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitByteValue,CApp) else: for SkuName in self.SkuIdMgr.SkuOverrideOrder(): if SkuName not in Pcd.SkuOverrideValues: continue for DefaultStoreName in Pcd.DefaultStoreName: @@ -2616,10 +2817,12 @@ class DscBuildData(PlatformBuildClassObject): CApp = CApp + ' )\n' CApp = CApp + '{\n' for Pcd in StructuredPcds.values(): if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + for ModuleGuid in Pcd.PcdFiledValueFromDscComponent: + CApp += " Initialize_%s_%s_%s_%s();\n" % (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, Pcd.TokenCName) else: for SkuName in self.SkuIdMgr.SkuOverrideOrder(): if SkuName not in self.SkuIdMgr.AvailableSkuIdSet: continue for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]: @@ -2631,10 +2834,11 @@ class DscBuildData(PlatformBuildClassObject): if not os.path.exists(self.OutputPath): os.makedirs(self.OutputPath) CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName) SaveFileOnChange(CAppBaseFileName + '.c', CApp, False) + # start generating makefile MakeApp = PcdMakefileHeader if sys.platform == "win32": MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + 'INC = ' else: MakeApp = MakeApp + PcdGccMakefile @@ -2753,19 +2957,22 @@ class DscBuildData(PlatformBuildClassObject): MakeApp = MakeApp + '\tcp -f %s %s/PcdValueCommon.c\n' % (PcdValueCommonPath, self.OutputPath) MakeFileName = os.path.join(self.OutputPath, 'Makefile') MakeApp += "$(OBJECTS) : %s\n" % MakeFileName SaveFileOnChange(MakeFileName, MakeApp, False) + # start generating input file InputValueFile = os.path.join(self.OutputPath, 'Input.txt') OutputValueFile = os.path.join(self.OutputPath, 'Output.txt') SaveFileOnChange(InputValueFile, InitByteValue, False) Dest_PcdValueInitExe = PcdValueInitName if not sys.platform == "win32": Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) else: Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe" + + #start building the structure pcd value tool Messages = '' if sys.platform == "win32": MakeCommand = 'nmake -f %s' % (MakeFileName) returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand) Messages = StdOut @@ -2824,17 +3031,19 @@ class DscBuildData(PlatformBuildClassObject): if MessageGroup: EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) ) else: EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr)) + #start executing the structure pcd value tool if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile): Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile) returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command) EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, StdErr)) if returncode != 0: EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s\n%s\n' % (Command, StdOut, StdErr)) + #start update structure pcd final value File = open (OutputValueFile, 'r') FileBuffer = File.readlines() File.close() StructurePcdSet = [] diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index 8efa869162..d4de07cae2 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -694,11 +694,11 @@ class ModuleReport(object): FileWrite(File, "PCI Class Code: %s" % self.PciClassCode) FileWrite(File, gSectionSep) if "PCD" in ReportType: - GlobalPcdReport.GenerateReport(File, self.ModulePcdSet) + GlobalPcdReport.GenerateReport(File, self.ModulePcdSet,self.FileGuid) if "LIBRARY" in ReportType: self.LibraryReport.GenerateReport(File) if "DEPEX" in ReportType: @@ -879,11 +879,11 @@ class PcdReport(object): for (TokenCName, TokenSpaceGuidCName) in Pa.Platform.Pcds: DscDefaultValue = Pa.Platform.Pcds[(TokenCName, TokenSpaceGuidCName)].DscDefaultValue if DscDefaultValue: self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue - def GenerateReport(self, File, ModulePcdSet): + def GenerateReport(self, File, ModulePcdSet,module_guid=None): if not ModulePcdSet: if self.ConditionalPcds: self.GenerateReportDetail(File, ModulePcdSet, 1) if self.UnusedPcds: IsEmpty = True @@ -895,11 +895,11 @@ class PcdReport(object): break if not IsEmpty: break if not IsEmpty: self.GenerateReportDetail(File, ModulePcdSet, 2) - self.GenerateReportDetail(File, ModulePcdSet) + self.GenerateReportDetail(File, ModulePcdSet,module_guid = module_guid) ## # Generate report for PCD information # # This function generates report for separate module expression @@ -911,11 +911,11 @@ class PcdReport(object): # platform PCD report # @param ReportySubType 0 means platform/module PCD report, 1 means Conditional # directives section report, 2 means Unused Pcds section report # @param DscOverridePcds Module DSC override PCDs set # - def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0): + def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0,module_guid=None): PcdDict = self.AllPcds if ReportSubType == 1: PcdDict = self.ConditionalPcds elif ReportSubType == 2: PcdDict = self.UnusedPcds @@ -991,14 +991,16 @@ class PcdReport(object): if DscDefaultValue: PcdValue = DscDefaultValue #The DefaultValue of StructurePcd already be the latest, no need to update. if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName): Pcd.DefaultValue = PcdValue + PcdComponentValue = None if ModulePcdSet is not None: if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet: continue - InfDefaultValue, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] + InfDefaultValue, PcdComponentValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] + PcdValue = PcdComponentValue #The DefaultValue of StructurePcd already be the latest, no need to update. if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName): Pcd.DefaultValue = PcdValue if InfDefaultValue: try: @@ -1079,62 +1081,68 @@ class PcdReport(object): if self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName): IsStructure = True if TypeName in ('DYNVPD', 'DEXVPD'): SkuInfoList = Pcd.SkuInfoList Pcd = GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)] + if ModulePcdSet and ModulePcdSet.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type)): + InfDefaultValue, PcdComponentValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] + DscDefaultValBak = Pcd.DefaultValue + Pcd.DefaultValue = PcdComponentValue + Pcd.DatumType = Pcd.StructName if TypeName in ('DYNVPD', 'DEXVPD'): Pcd.SkuInfoList = SkuInfoList if Pcd.PcdValueFromComm or Pcd.PcdFieldValueFromComm: BuildOptionMatch = True DecMatch = False elif Pcd.PcdValueFromFdf or Pcd.PcdFieldValueFromFdf: DscDefaultValue = True DscMatch = True DecMatch = False - elif Pcd.SkuOverrideValues: - DscOverride = False - if Pcd.DefaultFromDSC: - DscOverride = True - else: - DictLen = 0 - for item in Pcd.SkuOverrideValues: - DictLen += len(Pcd.SkuOverrideValues[item]) - if not DictLen: - DscOverride = False + else: + if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET: + DscOverride = False + if Pcd.DefaultFromDSC: + DscOverride = True else: - if not Pcd.SkuInfoList: - OverrideValues = Pcd.SkuOverrideValues - if OverrideValues: - for Data in OverrideValues.values(): - Struct = list(Data.values()) - if Struct: - DscOverride = self.ParseStruct(Struct[0]) - break + DictLen = 0 + for item in Pcd.SkuOverrideValues: + DictLen += len(Pcd.SkuOverrideValues[item]) + if not DictLen: + DscOverride = False else: - SkuList = sorted(Pcd.SkuInfoList.keys()) - for Sku in SkuList: - SkuInfo = Pcd.SkuInfoList[Sku] - if SkuInfo.DefaultStoreDict: - DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys()) - for DefaultStore in DefaultStoreList: - OverrideValues = Pcd.SkuOverrideValues[Sku] - DscOverride = self.ParseStruct(OverrideValues[DefaultStore]) - if DscOverride: + if not Pcd.SkuInfoList: + OverrideValues = Pcd.SkuOverrideValues + if OverrideValues: + for Data in OverrideValues.values(): + Struct = list(Data.values()) + if Struct: + DscOverride = self.ParseStruct(Struct[0]) break - if DscOverride: - break - if DscOverride: + else: + SkuList = sorted(Pcd.SkuInfoList.keys()) + for Sku in SkuList: + SkuInfo = Pcd.SkuInfoList[Sku] + if SkuInfo.DefaultStoreDict: + DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys()) + for DefaultStore in DefaultStoreList: + OverrideValues = Pcd.SkuOverrideValues[Sku] + DscOverride = self.ParseStruct(OverrideValues[DefaultStore]) + if DscOverride: + break + if DscOverride: + break + if DscOverride: + DscDefaultValue = True + DscMatch = True + DecMatch = False + else: + DecMatch = True + else: DscDefaultValue = True DscMatch = True DecMatch = False - else: - DecMatch = True - else: - DscDefaultValue = True - DscMatch = True - DecMatch = False # # Report PCD item according to their override relationship # if Pcd.DatumType == 'BOOLEAN': @@ -1151,17 +1159,18 @@ class PcdReport(object): elif InfDefaultValue and InfMatch: self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M') elif BuildOptionMatch: self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B') else: - if DscDefaultValue and DscMatch: + if PcdComponentValue: + self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, PcdComponentValue, DecMatch, DecDefaultValue, '*M', module_guid) + elif DscDefaultValue and DscMatch: if (Pcd.TokenCName, Key, Field) in self.FdfPcdSet: self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F') else: self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P') - else: - self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M') + if ModulePcdSet is None: if IsStructure: continue if not TypeName in ('PATCH', 'FLAG', 'FIXED'): @@ -1263,11 +1272,11 @@ class PcdReport(object): self.PrintStructureInfo(File, filedvalues) if DecMatch and IsStructure: for filedvalues in Pcd.DefaultValues.values(): self.PrintStructureInfo(File, filedvalues) - def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = ' '): + def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = ' ',module_guid=None): if not Pcd.SkuInfoList: Value = Pcd.DefaultValue IsByteArray, ArrayList = ByteArrayForamt(Value) if IsByteArray: FileWrite(File, ' %-*s : %6s %10s = %s' % (self.MaxLen, Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{')) @@ -1286,18 +1295,24 @@ class PcdReport(object): FiledOverrideFlag = False if (Pcd.TokenCName,Pcd.TokenSpaceGuidCName) in GlobalData.gPcdSkuOverrides: OverrideValues = GlobalData.gPcdSkuOverrides[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName)] else: OverrideValues = Pcd.SkuOverrideValues + FieldOverrideValues = None if OverrideValues: for Data in OverrideValues.values(): Struct = list(Data.values()) if Struct: - OverrideFieldStruct = self.OverrideFieldValue(Pcd, Struct[0]) - self.PrintStructureInfo(File, OverrideFieldStruct) + FieldOverrideValues = Struct[0] FiledOverrideFlag = True break + if Pcd.PcdFiledValueFromDscComponent and module_guid and module_guid.replace("-","S") in Pcd.PcdFiledValueFromDscComponent: + FieldOverrideValues = Pcd.PcdFiledValueFromDscComponent[module_guid.replace("-","S")] + if FieldOverrideValues: + OverrideFieldStruct = self.OverrideFieldValue(Pcd, FieldOverrideValues) + self.PrintStructureInfo(File, OverrideFieldStruct) + if not FiledOverrideFlag and (Pcd.PcdFieldValueFromComm or Pcd.PcdFieldValueFromFdf): OverrideFieldStruct = self.OverrideFieldValue(Pcd, {}) self.PrintStructureInfo(File, OverrideFieldStruct) self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue) else: -- 2.20.1.windows.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* 回复: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd 2020-10-26 3:59 ` [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd Bob Feng @ 2020-10-27 6:19 ` gaoliming 2020-10-28 15:07 ` Bob Feng 0 siblings, 1 reply; 4+ messages in thread From: gaoliming @ 2020-10-27 6:19 UTC (permalink / raw) To: 'Feng, Bob C', devel Cc: 'Chen, Christine', 'Kinney, Michael D' Bob: I will review this change this week. Can you share your test case? I also want to check the build output. Thanks Liming > -----邮件原件----- > 发件人: Feng, Bob C <bob.c.feng@intel.com> > 发送时间: 2020年10月26日 12:00 > 收件人: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; Liming > Gao <gaoliming@byosoft.com.cn> > 抄送: Chen, Christine <yuwei.chen@intel.com>; Kinney, Michael D > <michael.d.kinney@intel.com> > 主题: RE: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure > Pcd > > Liming, would you review this patch? > > Thanks, > Bob > > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob Feng > Sent: Thursday, October 15, 2020 6:59 PM > To: devel@edk2.groups.io > Cc: Liming Gao <gaoliming@byosoft.com.cn>; Chen, Christine > <yuwei.chen@intel.com> > Subject: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure > Pcd > > This patch is to enable the Module scoped Structure Pcd usage. > User can set structure pcd field value in module scope. For example, > under the [components] section of a dsc file, user can override some > field value for a specific module. > > Package/Module.inf{ > <PcdsFixedAtBuild> > gUefiTokenSpaceGuid.StructurePcdModule.FieldName | 5 > } > > Signed-off-by: Bob Feng <bob.c.feng@intel.com> > Cc: Liming Gao <gaoliming@byosoft.com.cn> > Cc: Yuwei Chen <yuwei.chen@intel.com> > --- > V2: Fixed the incorrect format in build report. > BaseTools/Source/Python/AutoGen/DataPipe.py | 5 +- > .../Source/Python/AutoGen/ModuleAutoGen.py | 4 +- > .../Python/AutoGen/ModuleAutoGenHelper.py | 10 +- > .../Source/Python/AutoGen/PlatformAutoGen.py | 8 +- > .../Python/Workspace/BuildClassObject.py | 12 + > .../Source/Python/Workspace/DscBuildData.py | 243 > ++++++++++++++++-- > BaseTools/Source/Python/build/BuildReport.py | 109 ++++---- > 7 files changed, 319 insertions(+), 72 deletions(-) > > diff --git a/BaseTools/Source/Python/AutoGen/DataPipe.py > b/BaseTools/Source/Python/AutoGen/DataPipe.py > index 50403fbfb5..86ac2b928d 100755 > --- a/BaseTools/Source/Python/AutoGen/DataPipe.py > +++ b/BaseTools/Source/Python/AutoGen/DataPipe.py > @@ -70,13 +70,14 @@ class MemoryDataPipe(DataPipe): > } > > #Platform Module Pcds > ModulePcds = {} > for m in PlatformInfo.Platform.Modules: > - m_pcds = PlatformInfo.Platform.Modules[m].Pcds > + module = PlatformInfo.Platform.Modules[m] > + m_pcds = module.Pcds > if m_pcds: > - ModulePcds[(m.File,m.Root,m.Arch)] = [PCD_DATA( > + ModulePcds[module.Guid] = [PCD_DATA( > pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type, > pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue, > > pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges, > > pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue) > for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()] > diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > index eebf6e87f5..d70b0d7ae8 100755 > --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > @@ -1030,11 +1030,11 @@ class ModuleAutoGen(AutoGen): > # @retval list The list of PCD > # > @cached_property > def ModulePcdList(self): > # apply PCD settings from platform > - RetVal = self.PlatformInfo.ApplyPcdSetting(self.Module, > self.Module.Pcds) > + RetVal = self.PlatformInfo.ApplyPcdSetting(self, self.Module.Pcds) > > return RetVal > @cached_property > def _PcdComments(self): > ReVal = OrderedListDict() > @@ -1061,11 +1061,11 @@ class ModuleAutoGen(AutoGen): > # skip duplicated PCDs > if Key in self.Module.Pcds or Key in Pcds: > continue > Pcds.add(Key) > PcdsInLibrary[Key] = copy.copy(Library.Pcds[Key]) > - RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self.Module, > PcdsInLibrary, Library=Library)) > + RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self, > PcdsInLibrary, Library=Library)) > return RetVal > > ## Get the GUID value mapping > # > # @retval dict The mapping between GUID cname and its > value > diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > index 9dd93b9beb..8e60643d1f 100644 > --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > @@ -477,12 +477,13 @@ class PlatformInfo(AutoGenInfo): > SkuName = TAB_DEFAULT > ToPcd.SkuInfoList = { > SkuName : SkuInfoClass(SkuName, > self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue) > } > > - def ApplyPcdSetting(self, Module, Pcds, Library=""): > + def ApplyPcdSetting(self, Ma, Pcds, Library=""): > # for each PCD in module > + Module=Ma.Module > for Name, Guid in Pcds: > PcdInModule = Pcds[Name, Guid] > # find out the PCD setting in platform > if (Name, Guid) in self.Pcds: > PcdInPlatform = self.Pcds[Name, Guid] > @@ -505,13 +506,16 @@ class PlatformInfo(AutoGenInfo): > % > (Guid, Name, str(Module)), > File=self.MetaFile > ) > > # override PCD settings with module specific setting > + ModuleScopePcds = self.DataPipe.Get("MOL_PCDS") > if Module in self.Platform.Modules: > PlatformModule = self.Platform.Modules[str(Module)] > - for Key in PlatformModule.Pcds: > + PCD_DATA = ModuleScopePcds.get(Ma.Guid,{}) > + mPcds = {(pcd.TokenCName,pcd.TokenSpaceGuidCName): > pcd for pcd in PCD_DATA} > + for Key in mPcds: > if self.BuildOptionPcd: > for pcd in self.BuildOptionPcd: > (TokenSpaceGuidCName, TokenCName, > FieldName, pcdvalue, _) = pcd > if (TokenCName, TokenSpaceGuidCName) == > Key and FieldName =="": > PlatformModule.Pcds[Key].DefaultValue > = pcdvalue > @@ -526,11 +530,11 @@ class PlatformInfo(AutoGenInfo): > if PcdItem in Pcds: > ToPcd = Pcds[PcdItem] > Flag = True > break > if Flag: > - self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], > Module, Msg="DSC Components Module scoped PCD section", > Library=Library) > + self._OverridePcd(ToPcd, mPcds[Key], Module, > Msg="DSC Components Module scoped PCD section", Library=Library) > # use PCD value to calculate the MaxDatumSize when it is not > specified > for Name, Guid in Pcds: > Pcd = Pcds[Name, Guid] > if Pcd.DatumType == TAB_VOID and not Pcd.MaxDatumSize: > Pcd.MaxSizeUserSet = None > diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > index 26ab8e7f36..c7a4cb9a08 100644 > --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > @@ -1041,11 +1041,17 @@ class PlatformAutoGen(AutoGen): > TokenNumber += 1 > return RetVal > > @cached_property > def _MbList(self): > - return [self.BuildDatabase[m, self.Arch, self.BuildTarget, > self.ToolChain] for m in self.Platform.Modules] > + mlist = [] > + for m in self.Platform.Modules: > + component = self.Platform.Modules[m] > + module = self.BuildDatabase[m, self.Arch, self.BuildTarget, > self.ToolChain] > + module.Guid = component.Guid > + mlist.append(module) > + return mlist > > @cached_property > def _MaList(self): > for ModuleFile in self.Platform.Modules: > Ma = ModuleAutoGen( > diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py > b/BaseTools/Source/Python/Workspace/BuildClassObject.py > index db40e3b10c..ebb65fc2fe 100644 > --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py > +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py > @@ -68,10 +68,11 @@ class PcdClassObject(object): > self.DscRawValueInfo = {} > if IsDsc: > self.DscDefaultValue = Value > self.PcdValueFromComm = "" > self.PcdValueFromFdf = "" > + self.PcdValueFromComponents = {} #{ModuleGuid:value, > file_path,lineNo} > self.CustomAttribute = {} > self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag > self._Capacity = None > > @property > @@ -296,10 +297,11 @@ class StructurePcd(PcdClassObject): > self.DefaultValueFromDecInfo = None > self.ValueChain = set() > self.PcdFieldValueFromComm = OrderedDict() > self.PcdFieldValueFromFdf = OrderedDict() > self.DefaultFromDSC=None > + self.PcdFiledValueFromDscComponent = OrderedDict() > def __repr__(self): > return self.TypeName > > def AddDefaultValue (self, FieldName, Value, FileName="", > LineNo=0,DimensionAttr ="-1"): > if DimensionAttr not in self.DefaultValues: > @@ -322,10 +324,16 @@ class StructurePcd(PcdClassObject): > if FieldName in > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]: > del > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > ame] > > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > ame] = [Value.strip(), FileName, LineNo] > return > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > ame] > > + def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, > FileName="", LineNo=0, DimensionAttr = '-1'): > + self.PcdFiledValueFromDscComponent.setdefault(ModuleGuid, > OrderedDict()) > + > self.PcdFiledValueFromDscComponent[ModuleGuid].setdefault(DimensionAtt > r,OrderedDict()) > + > self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldNa > me] = [Value.strip(), FileName, LineNo] > + return > self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldNa > me] > + > def SetPcdMode (self, PcdMode): > self.PcdMode = PcdMode > > def copy(self, PcdObject): > self.TokenCName = PcdObject.TokenCName if > PcdObject.TokenCName else self.TokenCName > @@ -363,10 +371,11 @@ class StructurePcd(PcdClassObject): > self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if > PcdObject.PcdDefineLineNo else self.PcdDefineLineNo > self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else > self.PkgPath > self.ValueChain = PcdObject.ValueChain if > PcdObject.ValueChain else self.ValueChain > self.PcdFieldValueFromComm = > PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm > else self.PcdFieldValueFromComm > self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf > if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf > + self.PcdFiledValueFromDscComponent = > PcdObject.PcdFiledValueFromDscComponent if > PcdObject.PcdFiledValueFromDscComponent else > self.PcdFiledValueFromDscComponent > > def __deepcopy__(self,memo): > new_pcd = StructurePcd() > self.sharedcopy(new_pcd) > > @@ -381,10 +390,11 @@ class StructurePcd(PcdClassObject): > new_pcd.DefaultValues = CopyDict(self.DefaultValues) > new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC) > new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues) > new_pcd.PcdFieldValueFromComm = > CopyDict(self.PcdFieldValueFromComm) > new_pcd.PcdFieldValueFromFdf = > CopyDict(self.PcdFieldValueFromFdf) > + new_pcd.PcdFiledValueFromDscComponent = > CopyDict(self.PcdFiledValueFromDscComponent) > new_pcd.ValueChain = {item for item in self.ValueChain} > return new_pcd > > LibraryClassObject = namedtuple('LibraryClassObject', > ['LibraryClass','SupModList']) > > @@ -461,10 +471,12 @@ class ModuleBuildClassObject(object): > self.Includes = [] > self.Packages = [] > self.Pcds = {} > self.BuildOptions = {} > self.Depex = {} > + self.StrPcdSet = [] > + self.StrPcdOverallValue = {} > > ## Convert the class to a string > # > # Convert member MetaFile of the class to a string > # > diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > b/BaseTools/Source/Python/Workspace/DscBuildData.py > index 1ed3d9b909..1bb4fdc183 100644 > --- a/BaseTools/Source/Python/Workspace/DscBuildData.py > +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > @@ -753,13 +753,14 @@ class DscBuildData(PlatformBuildClassObject): > ErrorCode, ErrorInfo = ModuleFile.Validate('.inf') > if ErrorCode != 0: > EdkLogger.error('build', ErrorCode, File=self.MetaFile, > Line=LineNo, > ExtraData=ErrorInfo) > > + ModuleBuildData = self._Bdb[ModuleFile, self._Arch, > self._Target, self._Toolchain] > Module = ModuleBuildClassObject() > Module.MetaFile = ModuleFile > - > + Module.Guid = ModuleBuildData.Guid > # get module private library instance > RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, > self._Arch, None, ModuleId] > for Record in RecordList: > LibraryClass = Record[0] > LibraryPath = PathClass(NormPath(Record[1], Macros), > GlobalData.gWorkspace, Arch=self._Arch) > @@ -776,11 +777,11 @@ class DscBuildData(PlatformBuildClassObject): > LibraryClass = 'NULL%d' % self._NullLibraryNumber > EdkLogger.verbose("Found forced library > for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass)) > Module.LibraryClasses[LibraryClass] = LibraryPath > if LibraryPath not in self.LibraryInstances: > self.LibraryInstances.append(LibraryPath) > - > + S_PcdSet = [] > # get module private PCD setting > for Type in [MODEL_PCD_FIXED_AT_BUILD, > MODEL_PCD_PATCHABLE_IN_MODULE, \ > MODEL_PCD_FEATURE_FLAG, > MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]: > RecordList = self._RawData[Type, self._Arch, None, > ModuleId] > for TokenSpaceGuid, PcdCName, Setting, Dummy1, > Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: > @@ -790,24 +791,35 @@ class DscBuildData(PlatformBuildClassObject): > if len(TokenList) > 2: > MaxDatumSize = TokenList[2] > else: > MaxDatumSize = '' > TypeString = self._PCD_TYPE_STRING_[Type] > - Pcd = PcdClassObject( > - PcdCName, > - TokenSpaceGuid, > - TypeString, > - '', > - DefaultValue, > - '', > - MaxDatumSize, > - {}, > - False, > - None > - ) > - Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd > > + TCName,PCName,DimensionAttr,Field = > self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName) > + > + if ("." in TokenSpaceGuid or "[" in PcdCName): > + > S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, > ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]]) > + DefaultValue = '' > + if ( PCName,TCName) not in Module.Pcds: > + Pcd = PcdClassObject( > + PCName, > + TCName, > + TypeString, > + '', > + DefaultValue, > + '', > + MaxDatumSize, > + {}, > + False, > + None, > + IsDsc=True) > + Module.Pcds[PCName, TCName] = Pcd > + > + Module.StrPcdSet = S_PcdSet > + for TCName,PCName, _,_,_,_,_,_ in S_PcdSet: > + if (PCName,TCName) in Module.Pcds: > + Module.StrPcdOverallValue[(PCName,TCName)] = > Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5 > # get module private build options > RecordList = > self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, > ModuleId] > for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, > Dummy3, Dummy4, Dummy5 in RecordList: > if (ToolChainFamily, ToolChain) not in > Module.BuildOptions: > Module.BuildOptions[ToolChainFamily, ToolChain] = > Option > @@ -820,11 +832,13 @@ class DscBuildData(PlatformBuildClassObject): > if len(RecordList) != 1: > EdkLogger.error('build', OPTION_UNKNOWN, 'Only > FILE_GUID can be listed in <Defines> section.', > File=self.MetaFile, > ExtraData=str(ModuleFile), Line=LineNo) > ModuleFile = ProcessDuplicatedInf(ModuleFile, > RecordList[0][2], GlobalData.gWorkspace) > ModuleFile.Arch = self._Arch > - > + Module.Guid = RecordList[0][2] > + for item in Module.StrPcdSet: > + item[4] = RecordList[0][2] > self._Modules[ModuleFile] = Module > return self._Modules > > ## Retrieve all possible library instances used in this platform > @property > @@ -1497,11 +1511,19 @@ class DscBuildData(PlatformBuildClassObject): > EdkLogger.error('build', PARSER_ERROR, > "Pcd (%s.%s) is not declared as > Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch), > File=self.MetaFile, Line = Dummy5) > > > S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, > default_store, Dummy5, AnalyzePcdExpression(Setting)[0]]) > - > + ModuleScopeOverallValue = {} > + for m in self.Modules.values(): > + mguid = m.Guid > + if m.StrPcdSet: > + S_PcdSet.extend(m.StrPcdSet) > + mguid = m.StrPcdSet[0][4] > + for (PCName,TCName) in m.StrPcdOverallValue: > + Value, dsc_file, lineNo = > m.StrPcdOverallValue[(PCName,TCName)] > + > ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, > dsc_file, lineNo > # handle pcd value override > StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet) > S_pcd_set = OrderedDict() > for str_pcd in StrPcdSet: > str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None) > @@ -1515,10 +1537,15 @@ class DscBuildData(PlatformBuildClassObject): > else: > str_pcd_obj_str.DefaultFromDSC = > {skuname:{defaultstore: > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > for str_pcd_data in StrPcdSet[str_pcd]: > if str_pcd_data[4] in SkuIds: > str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], > str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else > str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == > TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir > not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > + elif GlobalData.gGuidPattern.match(str_pcd_data[4]): > + > str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], > str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File if > self.WorkspaceDir not in self.MetaFile.File else > self.MetaFile.File[len(self.WorkspaceDir) if > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > + PcdComponentValue = > ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str. > TokenSpaceGuidCName)) > + for module_guid in PcdComponentValue: > + > str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = > PcdComponentValue[module_guid] > S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str > > # Add the Structure PCD that only defined in DEC, don't have > override in DSC file > for Pcd in self.DecPcds: > if isinstance(self._DecPcds[Pcd], StructurePcd): > @@ -1573,11 +1600,14 @@ class DscBuildData(PlatformBuildClassObject): > if defaultstoreid not in > stru_pcd.SkuOverrideValues[skuid]: > > stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = > CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename]) > stru_pcd.ValueChain.add((skuid, > defaultstoreid)) > S_pcd_set = > DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir) > S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set) > + > + # Create a tool to caculate structure pcd value > Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) > + > if Str_Pcd_Values: > for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in > Str_Pcd_Values: > str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid)) > if str_pcd_obj is None: > print(PcdName, PcdGuid) > @@ -1591,10 +1621,18 @@ class DscBuildData(PlatformBuildClassObject): > > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdV > alue}) > elif str_pcd_obj.Type in > [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > if skuname in (self.SkuIdMgr.SystemSkuId, > TAB_DEFAULT, TAB_COMMON): > str_pcd_obj.DefaultValue = PcdValue > + else: > + #Module Scope Structure Pcd > + moduleguid = skuname.replace("S","-") > + if > GlobalData.gGuidPattern.match(moduleguid): > + for component in self.Modules.values(): > + if component.Guid == moduleguid: > + component.Pcds[(PcdName, > PcdGuid)].DefaultValue = PcdValue > + > else: > if skuname not in str_pcd_obj.SkuInfoList: > nextskuid = > self.SkuIdMgr.GetNextSkuId(skuname) > NoDefault = False > while nextskuid not in str_pcd_obj.SkuInfoList: > @@ -2339,10 +2377,79 @@ class DscBuildData(PlatformBuildClassObject): > else: > CApp = CApp + ' Pcd->%s = %d; // From %s > Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > CApp = CApp + "}\n" > return CApp > > + def GenerateModuleScopeValue(self, Pcd): > + CApp = "// Value in Dsc Module scope \n" > + for ModuleGuid in Pcd.PcdFiledValueFromDscComponent: > + > + CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, > ModuleGuid,Pcd.BaseDatumType) > + CApp = CApp + ' UINT32 FieldSize;\n' > + CApp = CApp + ' CHAR8 *Value;\n' > + pcddefaultvalue, file_path,lineNo = > Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None)) > + > + if pcddefaultvalue: > + IsArray = _IsFieldValueAnArray(pcddefaultvalue) > + if IsArray: > + try: > + FieldList = ValueExpressionEx(pcddefaultvalue, > TAB_VOID)(True) > + except BadExpression: > + EdkLogger.error("Build", FORMAT_INVALID, > "Invalid value format for %s.%s, from %s Line %s: %s" % > + > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList)) > + Value, ValueSize = ParseFieldValue (FieldList) > + > + if isinstance(Value, str): > + CApp = CApp + ' Pcd = %s; // From %s Line %s \n' % > (Value, file_path, lineNo) > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + CApp = CApp + ' Value = %s; // From %s > Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo) > + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % > (ValueSize) > + > + > + PcdFiledValue = > Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid) > + for index in PcdFiledValue: > + FieldList = PcdFiledValue[index] > + if not FieldList: > + continue > + for FieldName in FieldList: > + IsArray = > _IsFieldValueAnArray(FieldList[FieldName][0]) > + if IsArray: > + try: > + FieldList[FieldName][0] = > ValueExpressionEx(FieldList[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 = ParseFieldValue > (FieldList[FieldName][0]) > + except Exception: > + 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])) > + if isinstance(Value, str): > + CApp = CApp + ' Pcd->%s = %s; // From %s > Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + CApp = CApp + ' FieldSize = > __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName) > + CApp = CApp + ' Value = %s; // > From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), > FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) > + CApp = CApp + ' > __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == > 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % > (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, > FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) > + CApp = CApp + ' memcpy (&Pcd->%s, Value, > (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, > ValueSize) > + else: > + if '[' in FieldName and ']' in FieldName: > + Index = > int(FieldName.split('[')[1].split(']')[0]) > + CApp = CApp + ' __STATIC_ASSERT((%d > < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index > exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, > FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], > FieldList[FieldName][2], FieldName) > + if ValueSize > 4: > + CApp = CApp + ' Pcd->%s = %dULL; // > From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > + else: > + CApp = CApp + ' Pcd->%s = %d; // > From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > + CApp = CApp + "}\n" > + return CApp > + > @staticmethod > def GenerateCommandLineValueStatement(Pcd): > CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > return CApp > def GenerateFdfValue(self,Pcd): > @@ -2412,10 +2519,88 @@ class DscBuildData(PlatformBuildClassObject): > @staticmethod > def GenerateFdfValueStatement(Pcd): > CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > return CApp > > + @staticmethod > + def GenerateModuleValueStatement(module_guid, Pcd): > + CApp = " Assign_%s_%s_%s_Value(Pcd);\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid) > + return CApp > + def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd, > InitByteValue, CApp): > + for module_guid in Pcd.PcdFiledValueFromDscComponent: > + CApp = CApp + 'void\n' > + CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, > TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, > Pcd.TokenCName) > + CApp = CApp + ' void\n' > + CApp = CApp + ' )\n' > + CApp = CApp + '{\n' > + CApp = CApp + ' UINT32 Size;\n' > + CApp = CApp + ' UINT32 FieldSize;\n' > + CApp = CApp + ' CHAR8 *Value;\n' > + CApp = CApp + ' UINT32 OriginalSize;\n' > + CApp = CApp + ' VOID *OriginalPcd;\n' > + > + CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % > (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo) > + > + CApp = CApp + '\n' > + > + PcdDefaultValue = > StringToArray(Pcd.DefaultValueFromDec.strip()) > + InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, > TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, > Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue) > + # > + # Get current PCD value and size > + # > + CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, > &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + > + # > + # Determine the size of the PCD. For simple structures, > sizeof(TYPE) provides > + # the correct value. For structures with a flexible array > member, the flexible > + # array member is detected, and the size is based on the > highest index used with > + # the flexible array member. The flexible array member > must be the last field > + # in a structure. The size formula for this case is: > + # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * > (HighestIndex + 1) > + # > + CApp = CApp + > DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_D > EFAULT) > + if Pcd.IsArray() and Pcd.Capacity[-1] != "-1": > + CApp = CApp + ' OriginalSize = OriginalSize < sizeof(%s) > * %d? OriginalSize:sizeof(%s) * %d; \n' % > (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySiz > e()) > + CApp = CApp + ' Size = sizeof(%s) * %d; \n' % > (Pcd.BaseDatumType,Pcd.PcdArraySize()) > + > + # > + # Allocate and zero buffer for the PCD > + # Must handle cases where current value is smaller, larger, or > same size > + # Always keep that larger one as the current size > + # > + CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : > Size);\n' > + CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % > (Pcd.BaseDatumType,) > + CApp = CApp + ' memset (Pcd, 0, Size);\n' > + > + # > + # Copy current PCD value into allocated buffer. > + # > + CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n' > + > + # > + # Assign field values in PCD > + # > + CApp = CApp + > DscBuildData.GenerateDefaultValueAssignStatement(Pcd) > + > + CApp = CApp + "// SkuName: %s, DefaultStoreName: > STANDARD \n" % self.SkuIdMgr.SystemSkuId > + CApp = CApp + > DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, > TAB_DEFAULT_STORES_DEFAULT) > + CApp = CApp + > DscBuildData.GenerateFdfValueStatement(Pcd) > + CApp = CApp + > DscBuildData.GenerateCommandLineValueStatement(Pcd) > + CApp = CApp + > DscBuildData.GenerateModuleValueStatement(module_guid,Pcd) > + # > + # Set new PCD value and size > + # > + CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void > *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + > + # > + # Free PCD > + # > + CApp = CApp + ' free (Pcd);\n' > + CApp = CApp + '}\n' > + CApp = CApp + '\n' > + return InitByteValue,CApp > + > def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, > InitByteValue, CApp): > OverrideValues = {DefaultStore:{}} > if Pcd.SkuOverrideValues: > OverrideValues = Pcd.SkuOverrideValues[SkuName] > if not OverrideValues: > @@ -2584,26 +2769,42 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + '\n' > for Pcd in StructuredPcds.values(): > CApp = CApp + self.GenerateArrayAssignment(Pcd) > for PcdName in sorted(StructuredPcds.keys()): > Pcd = StructuredPcds[PcdName] > + > + #create void void Cal_tocken_cname_Size functions > CApp = CApp + self.GenerateSizeFunction(Pcd) > + > + #create void Assign_ functions > + > + # From DEC > CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd) > + # From Fdf > CApp = CApp + self.GenerateFdfValue(Pcd) > + # From CommandLine > CApp = CApp + self.GenerateCommandLineValue(Pcd) > + > + # From Dsc Global setting > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > CApp = CApp + self.GenerateInitValueFunction(Pcd, > self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT) > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > if SkuName not in Pcd.SkuOverrideValues: > continue > for DefaultStoreName in > Pcd.SkuOverrideValues[SkuName]: > CApp = CApp + > self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName) > + > + # From Dsc module scope setting > + CApp = CApp + self.GenerateModuleScopeValue(Pcd) > + > + #create Initialize_ functions > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > InitByteValue, CApp = > self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, > TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp) > + InitByteValue, CApp = > self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitBy > teValue,CApp) > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > if SkuName not in Pcd.SkuOverrideValues: > continue > for DefaultStoreName in Pcd.DefaultStoreName: > @@ -2616,10 +2817,12 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + ' )\n' > CApp = CApp + '{\n' > for Pcd in StructuredPcds.values(): > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % > (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + for ModuleGuid in > Pcd.PcdFiledValueFromDscComponent: > + CApp += " Initialize_%s_%s_%s_%s();\n" % > (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, > Pcd.TokenCName) > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > if SkuName not in self.SkuIdMgr.AvailableSkuIdSet: > continue > for DefaultStoreName in > Pcd.SkuOverrideValues[SkuName]: > @@ -2631,10 +2834,11 @@ class DscBuildData(PlatformBuildClassObject): > if not os.path.exists(self.OutputPath): > os.makedirs(self.OutputPath) > CAppBaseFileName = os.path.join(self.OutputPath, > PcdValueInitName) > SaveFileOnChange(CAppBaseFileName + '.c', CApp, False) > > + # start generating makefile > MakeApp = PcdMakefileHeader > if sys.platform == "win32": > MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % > (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % > (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, > PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + > 'INC = ' > else: > MakeApp = MakeApp + PcdGccMakefile > @@ -2753,19 +2957,22 @@ class DscBuildData(PlatformBuildClassObject): > MakeApp = MakeApp + '\tcp -f %s %s/PcdValueCommon.c\n' % > (PcdValueCommonPath, self.OutputPath) > MakeFileName = os.path.join(self.OutputPath, 'Makefile') > MakeApp += "$(OBJECTS) : %s\n" % MakeFileName > SaveFileOnChange(MakeFileName, MakeApp, False) > > + # start generating input file > InputValueFile = os.path.join(self.OutputPath, 'Input.txt') > OutputValueFile = os.path.join(self.OutputPath, 'Output.txt') > SaveFileOnChange(InputValueFile, InitByteValue, False) > > Dest_PcdValueInitExe = PcdValueInitName > if not sys.platform == "win32": > Dest_PcdValueInitExe = os.path.join(self.OutputPath, > PcdValueInitName) > else: > Dest_PcdValueInitExe = os.path.join(self.OutputPath, > PcdValueInitName) +".exe" > + > + #start building the structure pcd value tool > Messages = '' > if sys.platform == "win32": > MakeCommand = 'nmake -f %s' % (MakeFileName) > returncode, StdOut, StdErr = DscBuildData.ExecuteCommand > (MakeCommand) > Messages = StdOut > @@ -2824,17 +3031,19 @@ class DscBuildData(PlatformBuildClassObject): > if MessageGroup: > EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, > "\n".join(MessageGroup) ) > else: > EdkLogger.error('Build', COMMAND_FAILURE, 'Can not > execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr)) > > + #start executing the structure pcd value tool > if DscBuildData.NeedUpdateOutput(OutputValueFile, > Dest_PcdValueInitExe, InputValueFile): > Command = Dest_PcdValueInitExe + ' -i %s -o %s' % > (InputValueFile, OutputValueFile) > returncode, StdOut, StdErr = DscBuildData.ExecuteCommand > (Command) > EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, > StdErr)) > if returncode != 0: > EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not > collect output from command: %s\n%s\n' % (Command, StdOut, StdErr)) > > + #start update structure pcd final value > File = open (OutputValueFile, 'r') > FileBuffer = File.readlines() > File.close() > > StructurePcdSet = [] > diff --git a/BaseTools/Source/Python/build/BuildReport.py > b/BaseTools/Source/Python/build/BuildReport.py > index 8efa869162..d4de07cae2 100644 > --- a/BaseTools/Source/Python/build/BuildReport.py > +++ b/BaseTools/Source/Python/build/BuildReport.py > @@ -694,11 +694,11 @@ class ModuleReport(object): > FileWrite(File, "PCI Class Code: %s" % > self.PciClassCode) > > FileWrite(File, gSectionSep) > > if "PCD" in ReportType: > - GlobalPcdReport.GenerateReport(File, self.ModulePcdSet) > + GlobalPcdReport.GenerateReport(File, > self.ModulePcdSet,self.FileGuid) > > if "LIBRARY" in ReportType: > self.LibraryReport.GenerateReport(File) > > if "DEPEX" in ReportType: > @@ -879,11 +879,11 @@ class PcdReport(object): > for (TokenCName, TokenSpaceGuidCName) in > Pa.Platform.Pcds: > DscDefaultValue = Pa.Platform.Pcds[(TokenCName, > TokenSpaceGuidCName)].DscDefaultValue > if DscDefaultValue: > self.DscPcdDefault[(TokenCName, > TokenSpaceGuidCName)] = DscDefaultValue > > - def GenerateReport(self, File, ModulePcdSet): > + def GenerateReport(self, File, ModulePcdSet,module_guid=None): > if not ModulePcdSet: > if self.ConditionalPcds: > self.GenerateReportDetail(File, ModulePcdSet, 1) > if self.UnusedPcds: > IsEmpty = True > @@ -895,11 +895,11 @@ class PcdReport(object): > break > if not IsEmpty: > break > if not IsEmpty: > self.GenerateReportDetail(File, ModulePcdSet, 2) > - self.GenerateReportDetail(File, ModulePcdSet) > + self.GenerateReportDetail(File, ModulePcdSet,module_guid = > module_guid) > > ## > # Generate report for PCD information > # > # This function generates report for separate module expression > @@ -911,11 +911,11 @@ class PcdReport(object): > # platform PCD report > # @param ReportySubType 0 means platform/module PCD report, 1 > means Conditional > # directives section report, 2 means > Unused Pcds section report > # @param DscOverridePcds Module DSC override PCDs set > # > - def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0): > + def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = > 0,module_guid=None): > PcdDict = self.AllPcds > if ReportSubType == 1: > PcdDict = self.ConditionalPcds > elif ReportSubType == 2: > PcdDict = self.UnusedPcds > @@ -991,14 +991,16 @@ class PcdReport(object): > if DscDefaultValue: > PcdValue = DscDefaultValue > #The DefaultValue of StructurePcd already be the latest, > no need to update. > if not self.IsStructurePcd(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName): > Pcd.DefaultValue = PcdValue > + PcdComponentValue = None > if ModulePcdSet is not None: > if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, > Type) not in ModulePcdSet: > continue > - InfDefaultValue, PcdValue = > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > + InfDefaultValue, PcdComponentValue = > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > + PcdValue = PcdComponentValue > #The DefaultValue of StructurePcd already be the > latest, no need to update. > if not self.IsStructurePcd(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName): > Pcd.DefaultValue = PcdValue > if InfDefaultValue: > try: > @@ -1079,62 +1081,68 @@ class PcdReport(object): > if self.IsStructurePcd(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName): > IsStructure = True > if TypeName in ('DYNVPD', 'DEXVPD'): > SkuInfoList = Pcd.SkuInfoList > Pcd = > GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName)] > + if ModulePcdSet and > ModulePcdSet.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type)): > + InfDefaultValue, PcdComponentValue = > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > + DscDefaultValBak = Pcd.DefaultValue > + Pcd.DefaultValue = PcdComponentValue > + > Pcd.DatumType = Pcd.StructName > if TypeName in ('DYNVPD', 'DEXVPD'): > Pcd.SkuInfoList = SkuInfoList > if Pcd.PcdValueFromComm or > Pcd.PcdFieldValueFromComm: > BuildOptionMatch = True > DecMatch = False > elif Pcd.PcdValueFromFdf or > Pcd.PcdFieldValueFromFdf: > DscDefaultValue = True > DscMatch = True > DecMatch = False > - elif Pcd.SkuOverrideValues: > - DscOverride = False > - if Pcd.DefaultFromDSC: > - DscOverride = True > - else: > - DictLen = 0 > - for item in Pcd.SkuOverrideValues: > - DictLen += > len(Pcd.SkuOverrideValues[item]) > - if not DictLen: > - DscOverride = False > + else: > + if Pcd.Type in PCD_DYNAMIC_TYPE_SET | > PCD_DYNAMIC_EX_TYPE_SET: > + DscOverride = False > + if Pcd.DefaultFromDSC: > + DscOverride = True > else: > - if not Pcd.SkuInfoList: > - OverrideValues = > Pcd.SkuOverrideValues > - if OverrideValues: > - for Data in > OverrideValues.values(): > - Struct = > list(Data.values()) > - if Struct: > - DscOverride = > self.ParseStruct(Struct[0]) > - break > + DictLen = 0 > + for item in Pcd.SkuOverrideValues: > + DictLen += > len(Pcd.SkuOverrideValues[item]) > + if not DictLen: > + DscOverride = False > else: > - SkuList = > sorted(Pcd.SkuInfoList.keys()) > - for Sku in SkuList: > - SkuInfo = > Pcd.SkuInfoList[Sku] > - if > SkuInfo.DefaultStoreDict: > - DefaultStoreList = > sorted(SkuInfo.DefaultStoreDict.keys()) > - for DefaultStore in > DefaultStoreList: > - OverrideValues = > Pcd.SkuOverrideValues[Sku] > - DscOverride = > self.ParseStruct(OverrideValues[DefaultStore]) > - if DscOverride: > + if not Pcd.SkuInfoList: > + OverrideValues = > Pcd.SkuOverrideValues > + if OverrideValues: > + for Data in > OverrideValues.values(): > + Struct = > list(Data.values()) > + if Struct: > + > DscOverride = self.ParseStruct(Struct[0]) > break > - if DscOverride: > - break > - if DscOverride: > + else: > + SkuList = > sorted(Pcd.SkuInfoList.keys()) > + for Sku in SkuList: > + SkuInfo = > Pcd.SkuInfoList[Sku] > + if > SkuInfo.DefaultStoreDict: > + DefaultStoreList > = sorted(SkuInfo.DefaultStoreDict.keys()) > + for DefaultStore > in DefaultStoreList: > + > OverrideValues = Pcd.SkuOverrideValues[Sku] > + > DscOverride = self.ParseStruct(OverrideValues[DefaultStore]) > + if > DscOverride: > + break > + if DscOverride: > + break > + if DscOverride: > + DscDefaultValue = True > + DscMatch = True > + DecMatch = False > + else: > + DecMatch = True > + else: > DscDefaultValue = True > DscMatch = True > DecMatch = False > - else: > - DecMatch = True > - else: > - DscDefaultValue = True > - DscMatch = True > - DecMatch = False > > # > # Report PCD item according to their override > relationship > # > if Pcd.DatumType == 'BOOLEAN': > @@ -1151,17 +1159,18 @@ class PcdReport(object): > elif InfDefaultValue and InfMatch: > self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > InfDefaultValue, DecMatch, DecDefaultValue, '*M') > elif BuildOptionMatch: > self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > InfDefaultValue, DecMatch, DecDefaultValue, '*B') > else: > - if DscDefaultValue and DscMatch: > + if PcdComponentValue: > + self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > PcdComponentValue, DecMatch, DecDefaultValue, '*M', module_guid) > + elif DscDefaultValue and DscMatch: > if (Pcd.TokenCName, Key, Field) in > self.FdfPcdSet: > self.PrintPcdValue(File, Pcd, > PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, > InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F') > else: > self.PrintPcdValue(File, Pcd, > PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, > InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P') > - else: > - self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > InfDefaultValue, DecMatch, DecDefaultValue, '*M') > + > > if ModulePcdSet is None: > if IsStructure: > continue > if not TypeName in ('PATCH', 'FLAG', 'FIXED'): > @@ -1263,11 +1272,11 @@ class PcdReport(object): > self.PrintStructureInfo(File, filedvalues) > if DecMatch and IsStructure: > for filedvalues in Pcd.DefaultValues.values(): > self.PrintStructureInfo(File, filedvalues) > > - def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, > IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, > DecDefaultValue, Flag = ' '): > + def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, > IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, > DecDefaultValue, Flag = ' ',module_guid=None): > if not Pcd.SkuInfoList: > Value = Pcd.DefaultValue > IsByteArray, ArrayList = ByteArrayForamt(Value) > if IsByteArray: > FileWrite(File, ' %-*s : %6s %10s = %s' % (self.MaxLen, > Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{')) > @@ -1286,18 +1295,24 @@ class PcdReport(object): > FiledOverrideFlag = False > if (Pcd.TokenCName,Pcd.TokenSpaceGuidCName) in > GlobalData.gPcdSkuOverrides: > OverrideValues = > GlobalData.gPcdSkuOverrides[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName) > ] > else: > OverrideValues = Pcd.SkuOverrideValues > + FieldOverrideValues = None > if OverrideValues: > for Data in OverrideValues.values(): > Struct = list(Data.values()) > if Struct: > - OverrideFieldStruct = > self.OverrideFieldValue(Pcd, Struct[0]) > - self.PrintStructureInfo(File, > OverrideFieldStruct) > + FieldOverrideValues = Struct[0] > FiledOverrideFlag = True > break > + if Pcd.PcdFiledValueFromDscComponent and > module_guid and module_guid.replace("-","S") in > Pcd.PcdFiledValueFromDscComponent: > + FieldOverrideValues = > Pcd.PcdFiledValueFromDscComponent[module_guid.replace("-","S")] > + if FieldOverrideValues: > + OverrideFieldStruct = self.OverrideFieldValue(Pcd, > FieldOverrideValues) > + self.PrintStructureInfo(File, OverrideFieldStruct) > + > if not FiledOverrideFlag and > (Pcd.PcdFieldValueFromComm or Pcd.PcdFieldValueFromFdf): > OverrideFieldStruct = self.OverrideFieldValue(Pcd, > {}) > self.PrintStructureInfo(File, OverrideFieldStruct) > self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, > DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue) > else: > -- > 2.20.1.windows.1 > > > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd 2020-10-27 6:19 ` 回复: " gaoliming @ 2020-10-28 15:07 ` Bob Feng 2020-10-30 3:26 ` 回复: " gaoliming 0 siblings, 1 reply; 4+ messages in thread From: Bob Feng @ 2020-10-28 15:07 UTC (permalink / raw) To: devel@edk2.groups.io, gaoliming@byosoft.com.cn Cc: Chen, Christine, Kinney, Michael D Liming, You can verify this patch with Mike's case. Clone Mike's edk2 repo, and checkout the branch Bug_xxx_CryptoPkg_UseModuleScopedPcds https://github.com/mdkinney/edk2/tree/Bug_xxx_CryptoPkg_UseModuleScopedPcds Then build the CryptoPkg. build -p CryptoPkg\CryptoPkg.dsc -a IA32 -y report.txt Thanks, Bob -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of gaoliming Sent: Tuesday, October 27, 2020 2:20 PM To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io Cc: Chen, Christine <yuwei.chen@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com> Subject: 回复: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd Bob: I will review this change this week. Can you share your test case? I also want to check the build output. Thanks Liming > -----邮件原件----- > 发件人: Feng, Bob C <bob.c.feng@intel.com> > 发送时间: 2020年10月26日 12:00 > 收件人: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; Liming > Gao <gaoliming@byosoft.com.cn> > 抄送: Chen, Christine <yuwei.chen@intel.com>; Kinney, Michael D > <michael.d.kinney@intel.com> > 主题: RE: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure > Pcd > > Liming, would you review this patch? > > Thanks, > Bob > > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob Feng > Sent: Thursday, October 15, 2020 6:59 PM > To: devel@edk2.groups.io > Cc: Liming Gao <gaoliming@byosoft.com.cn>; Chen, Christine > <yuwei.chen@intel.com> > Subject: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure > Pcd > > This patch is to enable the Module scoped Structure Pcd usage. > User can set structure pcd field value in module scope. For example, > under the [components] section of a dsc file, user can override some > field value for a specific module. > > Package/Module.inf{ > <PcdsFixedAtBuild> > gUefiTokenSpaceGuid.StructurePcdModule.FieldName | 5 > } > > Signed-off-by: Bob Feng <bob.c.feng@intel.com> > Cc: Liming Gao <gaoliming@byosoft.com.cn> > Cc: Yuwei Chen <yuwei.chen@intel.com> > --- > V2: Fixed the incorrect format in build report. > BaseTools/Source/Python/AutoGen/DataPipe.py | 5 +- > .../Source/Python/AutoGen/ModuleAutoGen.py | 4 +- > .../Python/AutoGen/ModuleAutoGenHelper.py | 10 +- > .../Source/Python/AutoGen/PlatformAutoGen.py | 8 +- > .../Python/Workspace/BuildClassObject.py | 12 + > .../Source/Python/Workspace/DscBuildData.py | 243 > ++++++++++++++++-- > BaseTools/Source/Python/build/BuildReport.py | 109 ++++---- > 7 files changed, 319 insertions(+), 72 deletions(-) > > diff --git a/BaseTools/Source/Python/AutoGen/DataPipe.py > b/BaseTools/Source/Python/AutoGen/DataPipe.py > index 50403fbfb5..86ac2b928d 100755 > --- a/BaseTools/Source/Python/AutoGen/DataPipe.py > +++ b/BaseTools/Source/Python/AutoGen/DataPipe.py > @@ -70,13 +70,14 @@ class MemoryDataPipe(DataPipe): > } > > #Platform Module Pcds > ModulePcds = {} > for m in PlatformInfo.Platform.Modules: > - m_pcds = PlatformInfo.Platform.Modules[m].Pcds > + module = PlatformInfo.Platform.Modules[m] > + m_pcds = module.Pcds > if m_pcds: > - ModulePcds[(m.File,m.Root,m.Arch)] = [PCD_DATA( > + ModulePcds[module.Guid] = [PCD_DATA( > pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type, > pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue, > > pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges, > > pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue) > for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()] > diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > index eebf6e87f5..d70b0d7ae8 100755 > --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > @@ -1030,11 +1030,11 @@ class ModuleAutoGen(AutoGen): > # @retval list The list of PCD > # > @cached_property > def ModulePcdList(self): > # apply PCD settings from platform > - RetVal = self.PlatformInfo.ApplyPcdSetting(self.Module, > self.Module.Pcds) > + RetVal = self.PlatformInfo.ApplyPcdSetting(self, self.Module.Pcds) > > return RetVal > @cached_property > def _PcdComments(self): > ReVal = OrderedListDict() > @@ -1061,11 +1061,11 @@ class ModuleAutoGen(AutoGen): > # skip duplicated PCDs > if Key in self.Module.Pcds or Key in Pcds: > continue > Pcds.add(Key) > PcdsInLibrary[Key] = copy.copy(Library.Pcds[Key]) > - RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self.Module, > PcdsInLibrary, Library=Library)) > + RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self, > PcdsInLibrary, Library=Library)) > return RetVal > > ## Get the GUID value mapping > # > # @retval dict The mapping between GUID cname and its > value > diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > index 9dd93b9beb..8e60643d1f 100644 > --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > @@ -477,12 +477,13 @@ class PlatformInfo(AutoGenInfo): > SkuName = TAB_DEFAULT > ToPcd.SkuInfoList = { > SkuName : SkuInfoClass(SkuName, > self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue) > } > > - def ApplyPcdSetting(self, Module, Pcds, Library=""): > + def ApplyPcdSetting(self, Ma, Pcds, Library=""): > # for each PCD in module > + Module=Ma.Module > for Name, Guid in Pcds: > PcdInModule = Pcds[Name, Guid] > # find out the PCD setting in platform > if (Name, Guid) in self.Pcds: > PcdInPlatform = self.Pcds[Name, Guid] > @@ -505,13 +506,16 @@ class PlatformInfo(AutoGenInfo): > % > (Guid, Name, str(Module)), > File=self.MetaFile > ) > > # override PCD settings with module specific setting > + ModuleScopePcds = self.DataPipe.Get("MOL_PCDS") > if Module in self.Platform.Modules: > PlatformModule = self.Platform.Modules[str(Module)] > - for Key in PlatformModule.Pcds: > + PCD_DATA = ModuleScopePcds.get(Ma.Guid,{}) > + mPcds = {(pcd.TokenCName,pcd.TokenSpaceGuidCName): > pcd for pcd in PCD_DATA} > + for Key in mPcds: > if self.BuildOptionPcd: > for pcd in self.BuildOptionPcd: > (TokenSpaceGuidCName, TokenCName, > FieldName, pcdvalue, _) = pcd > if (TokenCName, TokenSpaceGuidCName) == > Key and FieldName =="": > PlatformModule.Pcds[Key].DefaultValue > = pcdvalue > @@ -526,11 +530,11 @@ class PlatformInfo(AutoGenInfo): > if PcdItem in Pcds: > ToPcd = Pcds[PcdItem] > Flag = True > break > if Flag: > - self._OverridePcd(ToPcd, PlatformModule.Pcds[Key], > Module, Msg="DSC Components Module scoped PCD section", > Library=Library) > + self._OverridePcd(ToPcd, mPcds[Key], Module, > Msg="DSC Components Module scoped PCD section", Library=Library) > # use PCD value to calculate the MaxDatumSize when it is not > specified > for Name, Guid in Pcds: > Pcd = Pcds[Name, Guid] > if Pcd.DatumType == TAB_VOID and not Pcd.MaxDatumSize: > Pcd.MaxSizeUserSet = None > diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > index 26ab8e7f36..c7a4cb9a08 100644 > --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > @@ -1041,11 +1041,17 @@ class PlatformAutoGen(AutoGen): > TokenNumber += 1 > return RetVal > > @cached_property > def _MbList(self): > - return [self.BuildDatabase[m, self.Arch, self.BuildTarget, > self.ToolChain] for m in self.Platform.Modules] > + mlist = [] > + for m in self.Platform.Modules: > + component = self.Platform.Modules[m] > + module = self.BuildDatabase[m, self.Arch, self.BuildTarget, > self.ToolChain] > + module.Guid = component.Guid > + mlist.append(module) > + return mlist > > @cached_property > def _MaList(self): > for ModuleFile in self.Platform.Modules: > Ma = ModuleAutoGen( > diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py > b/BaseTools/Source/Python/Workspace/BuildClassObject.py > index db40e3b10c..ebb65fc2fe 100644 > --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py > +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py > @@ -68,10 +68,11 @@ class PcdClassObject(object): > self.DscRawValueInfo = {} > if IsDsc: > self.DscDefaultValue = Value > self.PcdValueFromComm = "" > self.PcdValueFromFdf = "" > + self.PcdValueFromComponents = {} #{ModuleGuid:value, > file_path,lineNo} > self.CustomAttribute = {} > self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag > self._Capacity = None > > @property > @@ -296,10 +297,11 @@ class StructurePcd(PcdClassObject): > self.DefaultValueFromDecInfo = None > self.ValueChain = set() > self.PcdFieldValueFromComm = OrderedDict() > self.PcdFieldValueFromFdf = OrderedDict() > self.DefaultFromDSC=None > + self.PcdFiledValueFromDscComponent = OrderedDict() > def __repr__(self): > return self.TypeName > > def AddDefaultValue (self, FieldName, Value, FileName="", > LineNo=0,DimensionAttr ="-1"): > if DimensionAttr not in self.DefaultValues: > @@ -322,10 +324,16 @@ class StructurePcd(PcdClassObject): > if FieldName in > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]: > del > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > ame] > > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > ame] = [Value.strip(), FileName, LineNo] > return > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > ame] > > + def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, > FileName="", LineNo=0, DimensionAttr = '-1'): > + self.PcdFiledValueFromDscComponent.setdefault(ModuleGuid, > OrderedDict()) > + > self.PcdFiledValueFromDscComponent[ModuleGuid].setdefault(DimensionAtt > r,OrderedDict()) > + > self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldNa > me] = [Value.strip(), FileName, LineNo] > + return > self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldNa > me] > + > def SetPcdMode (self, PcdMode): > self.PcdMode = PcdMode > > def copy(self, PcdObject): > self.TokenCName = PcdObject.TokenCName if > PcdObject.TokenCName else self.TokenCName > @@ -363,10 +371,11 @@ class StructurePcd(PcdClassObject): > self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if > PcdObject.PcdDefineLineNo else self.PcdDefineLineNo > self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else > self.PkgPath > self.ValueChain = PcdObject.ValueChain if > PcdObject.ValueChain else self.ValueChain > self.PcdFieldValueFromComm = > PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm > else self.PcdFieldValueFromComm > self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf > if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf > + self.PcdFiledValueFromDscComponent = > PcdObject.PcdFiledValueFromDscComponent if > PcdObject.PcdFiledValueFromDscComponent else > self.PcdFiledValueFromDscComponent > > def __deepcopy__(self,memo): > new_pcd = StructurePcd() > self.sharedcopy(new_pcd) > > @@ -381,10 +390,11 @@ class StructurePcd(PcdClassObject): > new_pcd.DefaultValues = CopyDict(self.DefaultValues) > new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC) > new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues) > new_pcd.PcdFieldValueFromComm = > CopyDict(self.PcdFieldValueFromComm) > new_pcd.PcdFieldValueFromFdf = > CopyDict(self.PcdFieldValueFromFdf) > + new_pcd.PcdFiledValueFromDscComponent = > CopyDict(self.PcdFiledValueFromDscComponent) > new_pcd.ValueChain = {item for item in self.ValueChain} > return new_pcd > > LibraryClassObject = namedtuple('LibraryClassObject', > ['LibraryClass','SupModList']) > > @@ -461,10 +471,12 @@ class ModuleBuildClassObject(object): > self.Includes = [] > self.Packages = [] > self.Pcds = {} > self.BuildOptions = {} > self.Depex = {} > + self.StrPcdSet = [] > + self.StrPcdOverallValue = {} > > ## Convert the class to a string > # > # Convert member MetaFile of the class to a string > # > diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > b/BaseTools/Source/Python/Workspace/DscBuildData.py > index 1ed3d9b909..1bb4fdc183 100644 > --- a/BaseTools/Source/Python/Workspace/DscBuildData.py > +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > @@ -753,13 +753,14 @@ class DscBuildData(PlatformBuildClassObject): > ErrorCode, ErrorInfo = ModuleFile.Validate('.inf') > if ErrorCode != 0: > EdkLogger.error('build', ErrorCode, File=self.MetaFile, > Line=LineNo, > ExtraData=ErrorInfo) > > + ModuleBuildData = self._Bdb[ModuleFile, self._Arch, > self._Target, self._Toolchain] > Module = ModuleBuildClassObject() > Module.MetaFile = ModuleFile > - > + Module.Guid = ModuleBuildData.Guid > # get module private library instance > RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, > self._Arch, None, ModuleId] > for Record in RecordList: > LibraryClass = Record[0] > LibraryPath = PathClass(NormPath(Record[1], Macros), > GlobalData.gWorkspace, Arch=self._Arch) > @@ -776,11 +777,11 @@ class DscBuildData(PlatformBuildClassObject): > LibraryClass = 'NULL%d' % self._NullLibraryNumber > EdkLogger.verbose("Found forced library > for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass)) > Module.LibraryClasses[LibraryClass] = LibraryPath > if LibraryPath not in self.LibraryInstances: > self.LibraryInstances.append(LibraryPath) > - > + S_PcdSet = [] > # get module private PCD setting > for Type in [MODEL_PCD_FIXED_AT_BUILD, > MODEL_PCD_PATCHABLE_IN_MODULE, \ > MODEL_PCD_FEATURE_FLAG, > MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]: > RecordList = self._RawData[Type, self._Arch, None, > ModuleId] > for TokenSpaceGuid, PcdCName, Setting, Dummy1, > Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: > @@ -790,24 +791,35 @@ class DscBuildData(PlatformBuildClassObject): > if len(TokenList) > 2: > MaxDatumSize = TokenList[2] > else: > MaxDatumSize = '' > TypeString = self._PCD_TYPE_STRING_[Type] > - Pcd = PcdClassObject( > - PcdCName, > - TokenSpaceGuid, > - TypeString, > - '', > - DefaultValue, > - '', > - MaxDatumSize, > - {}, > - False, > - None > - ) > - Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd > > + TCName,PCName,DimensionAttr,Field = > self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName) > + > + if ("." in TokenSpaceGuid or "[" in PcdCName): > + > S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, > ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]]) > + DefaultValue = '' > + if ( PCName,TCName) not in Module.Pcds: > + Pcd = PcdClassObject( > + PCName, > + TCName, > + TypeString, > + '', > + DefaultValue, > + '', > + MaxDatumSize, > + {}, > + False, > + None, > + IsDsc=True) > + Module.Pcds[PCName, TCName] = Pcd > + > + Module.StrPcdSet = S_PcdSet > + for TCName,PCName, _,_,_,_,_,_ in S_PcdSet: > + if (PCName,TCName) in Module.Pcds: > + Module.StrPcdOverallValue[(PCName,TCName)] = > Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5 > # get module private build options > RecordList = > self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, > ModuleId] > for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, > Dummy3, Dummy4, Dummy5 in RecordList: > if (ToolChainFamily, ToolChain) not in > Module.BuildOptions: > Module.BuildOptions[ToolChainFamily, ToolChain] = > Option > @@ -820,11 +832,13 @@ class DscBuildData(PlatformBuildClassObject): > if len(RecordList) != 1: > EdkLogger.error('build', OPTION_UNKNOWN, 'Only > FILE_GUID can be listed in <Defines> section.', > File=self.MetaFile, > ExtraData=str(ModuleFile), Line=LineNo) > ModuleFile = ProcessDuplicatedInf(ModuleFile, > RecordList[0][2], GlobalData.gWorkspace) > ModuleFile.Arch = self._Arch > - > + Module.Guid = RecordList[0][2] > + for item in Module.StrPcdSet: > + item[4] = RecordList[0][2] > self._Modules[ModuleFile] = Module > return self._Modules > > ## Retrieve all possible library instances used in this platform > @property > @@ -1497,11 +1511,19 @@ class DscBuildData(PlatformBuildClassObject): > EdkLogger.error('build', PARSER_ERROR, > "Pcd (%s.%s) is not declared as > Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch), > File=self.MetaFile, Line = Dummy5) > > > S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, > default_store, Dummy5, AnalyzePcdExpression(Setting)[0]]) > - > + ModuleScopeOverallValue = {} > + for m in self.Modules.values(): > + mguid = m.Guid > + if m.StrPcdSet: > + S_PcdSet.extend(m.StrPcdSet) > + mguid = m.StrPcdSet[0][4] > + for (PCName,TCName) in m.StrPcdOverallValue: > + Value, dsc_file, lineNo = > m.StrPcdOverallValue[(PCName,TCName)] > + > ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, > dsc_file, lineNo > # handle pcd value override > StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet) > S_pcd_set = OrderedDict() > for str_pcd in StrPcdSet: > str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None) > @@ -1515,10 +1537,15 @@ class DscBuildData(PlatformBuildClassObject): > else: > str_pcd_obj_str.DefaultFromDSC = > {skuname:{defaultstore: > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > for str_pcd_data in StrPcdSet[str_pcd]: > if str_pcd_data[4] in SkuIds: > str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], > str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else > str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == > TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir > not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > + elif GlobalData.gGuidPattern.match(str_pcd_data[4]): > + > str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], > str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File if > self.WorkspaceDir not in self.MetaFile.File else > self.MetaFile.File[len(self.WorkspaceDir) if > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > + PcdComponentValue = > ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str. > TokenSpaceGuidCName)) > + for module_guid in PcdComponentValue: > + > str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = > PcdComponentValue[module_guid] > S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str > > # Add the Structure PCD that only defined in DEC, don't have > override in DSC file > for Pcd in self.DecPcds: > if isinstance(self._DecPcds[Pcd], StructurePcd): > @@ -1573,11 +1600,14 @@ class DscBuildData(PlatformBuildClassObject): > if defaultstoreid not in > stru_pcd.SkuOverrideValues[skuid]: > > stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = > CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename]) > stru_pcd.ValueChain.add((skuid, > defaultstoreid)) > S_pcd_set = > DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir) > S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set) > + > + # Create a tool to caculate structure pcd value > Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) > + > if Str_Pcd_Values: > for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in > Str_Pcd_Values: > str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid)) > if str_pcd_obj is None: > print(PcdName, PcdGuid) > @@ -1591,10 +1621,18 @@ class DscBuildData(PlatformBuildClassObject): > > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdV > alue}) > elif str_pcd_obj.Type in > [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > if skuname in (self.SkuIdMgr.SystemSkuId, > TAB_DEFAULT, TAB_COMMON): > str_pcd_obj.DefaultValue = PcdValue > + else: > + #Module Scope Structure Pcd > + moduleguid = skuname.replace("S","-") > + if > GlobalData.gGuidPattern.match(moduleguid): > + for component in self.Modules.values(): > + if component.Guid == moduleguid: > + component.Pcds[(PcdName, > PcdGuid)].DefaultValue = PcdValue > + > else: > if skuname not in str_pcd_obj.SkuInfoList: > nextskuid = > self.SkuIdMgr.GetNextSkuId(skuname) > NoDefault = False > while nextskuid not in str_pcd_obj.SkuInfoList: > @@ -2339,10 +2377,79 @@ class DscBuildData(PlatformBuildClassObject): > else: > CApp = CApp + ' Pcd->%s = %d; // From %s > Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > CApp = CApp + "}\n" > return CApp > > + def GenerateModuleScopeValue(self, Pcd): > + CApp = "// Value in Dsc Module scope \n" > + for ModuleGuid in Pcd.PcdFiledValueFromDscComponent: > + > + CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, > ModuleGuid,Pcd.BaseDatumType) > + CApp = CApp + ' UINT32 FieldSize;\n' > + CApp = CApp + ' CHAR8 *Value;\n' > + pcddefaultvalue, file_path,lineNo = > Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None)) > + > + if pcddefaultvalue: > + IsArray = _IsFieldValueAnArray(pcddefaultvalue) > + if IsArray: > + try: > + FieldList = ValueExpressionEx(pcddefaultvalue, > TAB_VOID)(True) > + except BadExpression: > + EdkLogger.error("Build", FORMAT_INVALID, > "Invalid value format for %s.%s, from %s Line %s: %s" % > + > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList)) > + Value, ValueSize = ParseFieldValue (FieldList) > + > + if isinstance(Value, str): > + CApp = CApp + ' Pcd = %s; // From %s Line %s \n' % > (Value, file_path, lineNo) > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + CApp = CApp + ' Value = %s; // From %s > Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo) > + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % > (ValueSize) > + > + > + PcdFiledValue = > Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid) > + for index in PcdFiledValue: > + FieldList = PcdFiledValue[index] > + if not FieldList: > + continue > + for FieldName in FieldList: > + IsArray = > _IsFieldValueAnArray(FieldList[FieldName][0]) > + if IsArray: > + try: > + FieldList[FieldName][0] = > ValueExpressionEx(FieldList[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 = ParseFieldValue > (FieldList[FieldName][0]) > + except Exception: > + 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])) > + if isinstance(Value, str): > + CApp = CApp + ' Pcd->%s = %s; // From %s > Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + CApp = CApp + ' FieldSize = > __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName) > + CApp = CApp + ' Value = %s; // > From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), > FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) > + CApp = CApp + ' > __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == > 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % > (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, > FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) > + CApp = CApp + ' memcpy (&Pcd->%s, Value, > (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, > ValueSize) > + else: > + if '[' in FieldName and ']' in FieldName: > + Index = > int(FieldName.split('[')[1].split(']')[0]) > + CApp = CApp + ' __STATIC_ASSERT((%d > < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index > exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, > FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], > FieldList[FieldName][2], FieldName) > + if ValueSize > 4: > + CApp = CApp + ' Pcd->%s = %dULL; // > From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > + else: > + CApp = CApp + ' Pcd->%s = %d; // > From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > FieldList[FieldName][2], FieldList[FieldName][0]) > + CApp = CApp + "}\n" > + return CApp > + > @staticmethod > def GenerateCommandLineValueStatement(Pcd): > CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > return CApp > def GenerateFdfValue(self,Pcd): > @@ -2412,10 +2519,88 @@ class DscBuildData(PlatformBuildClassObject): > @staticmethod > def GenerateFdfValueStatement(Pcd): > CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > return CApp > > + @staticmethod > + def GenerateModuleValueStatement(module_guid, Pcd): > + CApp = " Assign_%s_%s_%s_Value(Pcd);\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid) > + return CApp > + def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd, > InitByteValue, CApp): > + for module_guid in Pcd.PcdFiledValueFromDscComponent: > + CApp = CApp + 'void\n' > + CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, > TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, > Pcd.TokenCName) > + CApp = CApp + ' void\n' > + CApp = CApp + ' )\n' > + CApp = CApp + '{\n' > + CApp = CApp + ' UINT32 Size;\n' > + CApp = CApp + ' UINT32 FieldSize;\n' > + CApp = CApp + ' CHAR8 *Value;\n' > + CApp = CApp + ' UINT32 OriginalSize;\n' > + CApp = CApp + ' VOID *OriginalPcd;\n' > + > + CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % > (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo) > + > + CApp = CApp + '\n' > + > + PcdDefaultValue = > StringToArray(Pcd.DefaultValueFromDec.strip()) > + InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, > TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, > Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue) > + # > + # Get current PCD value and size > + # > + CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, > &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + > + # > + # Determine the size of the PCD. For simple structures, > sizeof(TYPE) provides > + # the correct value. For structures with a flexible array > member, the flexible > + # array member is detected, and the size is based on the > highest index used with > + # the flexible array member. The flexible array member > must be the last field > + # in a structure. The size formula for this case is: > + # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * > (HighestIndex + 1) > + # > + CApp = CApp + > DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_D > EFAULT) > + if Pcd.IsArray() and Pcd.Capacity[-1] != "-1": > + CApp = CApp + ' OriginalSize = OriginalSize < sizeof(%s) > * %d? OriginalSize:sizeof(%s) * %d; \n' % > (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySiz > e()) > + CApp = CApp + ' Size = sizeof(%s) * %d; \n' % > (Pcd.BaseDatumType,Pcd.PcdArraySize()) > + > + # > + # Allocate and zero buffer for the PCD > + # Must handle cases where current value is smaller, larger, or > same size > + # Always keep that larger one as the current size > + # > + CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : > Size);\n' > + CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % > (Pcd.BaseDatumType,) > + CApp = CApp + ' memset (Pcd, 0, Size);\n' > + > + # > + # Copy current PCD value into allocated buffer. > + # > + CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n' > + > + # > + # Assign field values in PCD > + # > + CApp = CApp + > DscBuildData.GenerateDefaultValueAssignStatement(Pcd) > + > + CApp = CApp + "// SkuName: %s, DefaultStoreName: > STANDARD \n" % self.SkuIdMgr.SystemSkuId > + CApp = CApp + > DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, > TAB_DEFAULT_STORES_DEFAULT) > + CApp = CApp + > DscBuildData.GenerateFdfValueStatement(Pcd) > + CApp = CApp + > DscBuildData.GenerateCommandLineValueStatement(Pcd) > + CApp = CApp + > DscBuildData.GenerateModuleValueStatement(module_guid,Pcd) > + # > + # Set new PCD value and size > + # > + CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void > *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + > + # > + # Free PCD > + # > + CApp = CApp + ' free (Pcd);\n' > + CApp = CApp + '}\n' > + CApp = CApp + '\n' > + return InitByteValue,CApp > + > def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, > InitByteValue, CApp): > OverrideValues = {DefaultStore:{}} > if Pcd.SkuOverrideValues: > OverrideValues = Pcd.SkuOverrideValues[SkuName] > if not OverrideValues: > @@ -2584,26 +2769,42 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + '\n' > for Pcd in StructuredPcds.values(): > CApp = CApp + self.GenerateArrayAssignment(Pcd) > for PcdName in sorted(StructuredPcds.keys()): > Pcd = StructuredPcds[PcdName] > + > + #create void void Cal_tocken_cname_Size functions > CApp = CApp + self.GenerateSizeFunction(Pcd) > + > + #create void Assign_ functions > + > + # From DEC > CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd) > + # From Fdf > CApp = CApp + self.GenerateFdfValue(Pcd) > + # From CommandLine > CApp = CApp + self.GenerateCommandLineValue(Pcd) > + > + # From Dsc Global setting > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > CApp = CApp + self.GenerateInitValueFunction(Pcd, > self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT) > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > if SkuName not in Pcd.SkuOverrideValues: > continue > for DefaultStoreName in > Pcd.SkuOverrideValues[SkuName]: > CApp = CApp + > self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName) > + > + # From Dsc module scope setting > + CApp = CApp + self.GenerateModuleScopeValue(Pcd) > + > + #create Initialize_ functions > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > InitByteValue, CApp = > self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, > TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp) > + InitByteValue, CApp = > self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitBy > teValue,CApp) > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > if SkuName not in Pcd.SkuOverrideValues: > continue > for DefaultStoreName in Pcd.DefaultStoreName: > @@ -2616,10 +2817,12 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + ' )\n' > CApp = CApp + '{\n' > for Pcd in StructuredPcds.values(): > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % > (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + for ModuleGuid in > Pcd.PcdFiledValueFromDscComponent: > + CApp += " Initialize_%s_%s_%s_%s();\n" % > (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, > Pcd.TokenCName) > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > if SkuName not in self.SkuIdMgr.AvailableSkuIdSet: > continue > for DefaultStoreName in > Pcd.SkuOverrideValues[SkuName]: > @@ -2631,10 +2834,11 @@ class DscBuildData(PlatformBuildClassObject): > if not os.path.exists(self.OutputPath): > os.makedirs(self.OutputPath) > CAppBaseFileName = os.path.join(self.OutputPath, > PcdValueInitName) > SaveFileOnChange(CAppBaseFileName + '.c', CApp, False) > > + # start generating makefile > MakeApp = PcdMakefileHeader > if sys.platform == "win32": > MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % > (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % > (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, > PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + > 'INC = ' > else: > MakeApp = MakeApp + PcdGccMakefile > @@ -2753,19 +2957,22 @@ class DscBuildData(PlatformBuildClassObject): > MakeApp = MakeApp + '\tcp -f %s %s/PcdValueCommon.c\n' % > (PcdValueCommonPath, self.OutputPath) > MakeFileName = os.path.join(self.OutputPath, 'Makefile') > MakeApp += "$(OBJECTS) : %s\n" % MakeFileName > SaveFileOnChange(MakeFileName, MakeApp, False) > > + # start generating input file > InputValueFile = os.path.join(self.OutputPath, 'Input.txt') > OutputValueFile = os.path.join(self.OutputPath, 'Output.txt') > SaveFileOnChange(InputValueFile, InitByteValue, False) > > Dest_PcdValueInitExe = PcdValueInitName > if not sys.platform == "win32": > Dest_PcdValueInitExe = os.path.join(self.OutputPath, > PcdValueInitName) > else: > Dest_PcdValueInitExe = os.path.join(self.OutputPath, > PcdValueInitName) +".exe" > + > + #start building the structure pcd value tool > Messages = '' > if sys.platform == "win32": > MakeCommand = 'nmake -f %s' % (MakeFileName) > returncode, StdOut, StdErr = DscBuildData.ExecuteCommand > (MakeCommand) > Messages = StdOut > @@ -2824,17 +3031,19 @@ class DscBuildData(PlatformBuildClassObject): > if MessageGroup: > EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, > "\n".join(MessageGroup) ) > else: > EdkLogger.error('Build', COMMAND_FAILURE, 'Can not > execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr)) > > + #start executing the structure pcd value tool > if DscBuildData.NeedUpdateOutput(OutputValueFile, > Dest_PcdValueInitExe, InputValueFile): > Command = Dest_PcdValueInitExe + ' -i %s -o %s' % > (InputValueFile, OutputValueFile) > returncode, StdOut, StdErr = DscBuildData.ExecuteCommand > (Command) > EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, > StdErr)) > if returncode != 0: > EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not > collect output from command: %s\n%s\n' % (Command, StdOut, StdErr)) > > + #start update structure pcd final value > File = open (OutputValueFile, 'r') > FileBuffer = File.readlines() > File.close() > > StructurePcdSet = [] > diff --git a/BaseTools/Source/Python/build/BuildReport.py > b/BaseTools/Source/Python/build/BuildReport.py > index 8efa869162..d4de07cae2 100644 > --- a/BaseTools/Source/Python/build/BuildReport.py > +++ b/BaseTools/Source/Python/build/BuildReport.py > @@ -694,11 +694,11 @@ class ModuleReport(object): > FileWrite(File, "PCI Class Code: %s" % > self.PciClassCode) > > FileWrite(File, gSectionSep) > > if "PCD" in ReportType: > - GlobalPcdReport.GenerateReport(File, self.ModulePcdSet) > + GlobalPcdReport.GenerateReport(File, > self.ModulePcdSet,self.FileGuid) > > if "LIBRARY" in ReportType: > self.LibraryReport.GenerateReport(File) > > if "DEPEX" in ReportType: > @@ -879,11 +879,11 @@ class PcdReport(object): > for (TokenCName, TokenSpaceGuidCName) in > Pa.Platform.Pcds: > DscDefaultValue = Pa.Platform.Pcds[(TokenCName, > TokenSpaceGuidCName)].DscDefaultValue > if DscDefaultValue: > self.DscPcdDefault[(TokenCName, > TokenSpaceGuidCName)] = DscDefaultValue > > - def GenerateReport(self, File, ModulePcdSet): > + def GenerateReport(self, File, ModulePcdSet,module_guid=None): > if not ModulePcdSet: > if self.ConditionalPcds: > self.GenerateReportDetail(File, ModulePcdSet, 1) > if self.UnusedPcds: > IsEmpty = True > @@ -895,11 +895,11 @@ class PcdReport(object): > break > if not IsEmpty: > break > if not IsEmpty: > self.GenerateReportDetail(File, ModulePcdSet, 2) > - self.GenerateReportDetail(File, ModulePcdSet) > + self.GenerateReportDetail(File, ModulePcdSet,module_guid = > module_guid) > > ## > # Generate report for PCD information > # > # This function generates report for separate module expression > @@ -911,11 +911,11 @@ class PcdReport(object): > # platform PCD report > # @param ReportySubType 0 means platform/module PCD report, 1 > means Conditional > # directives section report, 2 means > Unused Pcds section report > # @param DscOverridePcds Module DSC override PCDs set > # > - def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0): > + def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = > 0,module_guid=None): > PcdDict = self.AllPcds > if ReportSubType == 1: > PcdDict = self.ConditionalPcds > elif ReportSubType == 2: > PcdDict = self.UnusedPcds > @@ -991,14 +991,16 @@ class PcdReport(object): > if DscDefaultValue: > PcdValue = DscDefaultValue > #The DefaultValue of StructurePcd already be the latest, > no need to update. > if not self.IsStructurePcd(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName): > Pcd.DefaultValue = PcdValue > + PcdComponentValue = None > if ModulePcdSet is not None: > if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, > Type) not in ModulePcdSet: > continue > - InfDefaultValue, PcdValue = > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > + InfDefaultValue, PcdComponentValue = > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > + PcdValue = PcdComponentValue > #The DefaultValue of StructurePcd already be the > latest, no need to update. > if not self.IsStructurePcd(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName): > Pcd.DefaultValue = PcdValue > if InfDefaultValue: > try: > @@ -1079,62 +1081,68 @@ class PcdReport(object): > if self.IsStructurePcd(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName): > IsStructure = True > if TypeName in ('DYNVPD', 'DEXVPD'): > SkuInfoList = Pcd.SkuInfoList > Pcd = > GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, > Pcd.TokenSpaceGuidCName)] > + if ModulePcdSet and > ModulePcdSet.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type)): > + InfDefaultValue, PcdComponentValue = > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > + DscDefaultValBak = Pcd.DefaultValue > + Pcd.DefaultValue = PcdComponentValue > + > Pcd.DatumType = Pcd.StructName > if TypeName in ('DYNVPD', 'DEXVPD'): > Pcd.SkuInfoList = SkuInfoList > if Pcd.PcdValueFromComm or > Pcd.PcdFieldValueFromComm: > BuildOptionMatch = True > DecMatch = False > elif Pcd.PcdValueFromFdf or > Pcd.PcdFieldValueFromFdf: > DscDefaultValue = True > DscMatch = True > DecMatch = False > - elif Pcd.SkuOverrideValues: > - DscOverride = False > - if Pcd.DefaultFromDSC: > - DscOverride = True > - else: > - DictLen = 0 > - for item in Pcd.SkuOverrideValues: > - DictLen += > len(Pcd.SkuOverrideValues[item]) > - if not DictLen: > - DscOverride = False > + else: > + if Pcd.Type in PCD_DYNAMIC_TYPE_SET | > PCD_DYNAMIC_EX_TYPE_SET: > + DscOverride = False > + if Pcd.DefaultFromDSC: > + DscOverride = True > else: > - if not Pcd.SkuInfoList: > - OverrideValues = > Pcd.SkuOverrideValues > - if OverrideValues: > - for Data in > OverrideValues.values(): > - Struct = > list(Data.values()) > - if Struct: > - DscOverride = > self.ParseStruct(Struct[0]) > - break > + DictLen = 0 > + for item in Pcd.SkuOverrideValues: > + DictLen += > len(Pcd.SkuOverrideValues[item]) > + if not DictLen: > + DscOverride = False > else: > - SkuList = > sorted(Pcd.SkuInfoList.keys()) > - for Sku in SkuList: > - SkuInfo = > Pcd.SkuInfoList[Sku] > - if > SkuInfo.DefaultStoreDict: > - DefaultStoreList = > sorted(SkuInfo.DefaultStoreDict.keys()) > - for DefaultStore in > DefaultStoreList: > - OverrideValues = > Pcd.SkuOverrideValues[Sku] > - DscOverride = > self.ParseStruct(OverrideValues[DefaultStore]) > - if DscOverride: > + if not Pcd.SkuInfoList: > + OverrideValues = > Pcd.SkuOverrideValues > + if OverrideValues: > + for Data in > OverrideValues.values(): > + Struct = > list(Data.values()) > + if Struct: > + > DscOverride = self.ParseStruct(Struct[0]) > break > - if DscOverride: > - break > - if DscOverride: > + else: > + SkuList = > sorted(Pcd.SkuInfoList.keys()) > + for Sku in SkuList: > + SkuInfo = > Pcd.SkuInfoList[Sku] > + if > SkuInfo.DefaultStoreDict: > + DefaultStoreList > = sorted(SkuInfo.DefaultStoreDict.keys()) > + for DefaultStore > in DefaultStoreList: > + > OverrideValues = Pcd.SkuOverrideValues[Sku] > + > DscOverride = self.ParseStruct(OverrideValues[DefaultStore]) > + if > DscOverride: > + break > + if DscOverride: > + break > + if DscOverride: > + DscDefaultValue = True > + DscMatch = True > + DecMatch = False > + else: > + DecMatch = True > + else: > DscDefaultValue = True > DscMatch = True > DecMatch = False > - else: > - DecMatch = True > - else: > - DscDefaultValue = True > - DscMatch = True > - DecMatch = False > > # > # Report PCD item according to their override > relationship > # > if Pcd.DatumType == 'BOOLEAN': > @@ -1151,17 +1159,18 @@ class PcdReport(object): > elif InfDefaultValue and InfMatch: > self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > InfDefaultValue, DecMatch, DecDefaultValue, '*M') > elif BuildOptionMatch: > self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > InfDefaultValue, DecMatch, DecDefaultValue, '*B') > else: > - if DscDefaultValue and DscMatch: > + if PcdComponentValue: > + self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > PcdComponentValue, DecMatch, DecDefaultValue, '*M', module_guid) > + elif DscDefaultValue and DscMatch: > if (Pcd.TokenCName, Key, Field) in > self.FdfPcdSet: > self.PrintPcdValue(File, Pcd, > PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, > InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F') > else: > self.PrintPcdValue(File, Pcd, > PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, > InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P') > - else: > - self.PrintPcdValue(File, Pcd, PcdTokenCName, > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > InfDefaultValue, DecMatch, DecDefaultValue, '*M') > + > > if ModulePcdSet is None: > if IsStructure: > continue > if not TypeName in ('PATCH', 'FLAG', 'FIXED'): > @@ -1263,11 +1272,11 @@ class PcdReport(object): > self.PrintStructureInfo(File, filedvalues) > if DecMatch and IsStructure: > for filedvalues in Pcd.DefaultValues.values(): > self.PrintStructureInfo(File, filedvalues) > > - def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, > IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, > DecDefaultValue, Flag = ' '): > + def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, > IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, > DecDefaultValue, Flag = ' ',module_guid=None): > if not Pcd.SkuInfoList: > Value = Pcd.DefaultValue > IsByteArray, ArrayList = ByteArrayForamt(Value) > if IsByteArray: > FileWrite(File, ' %-*s : %6s %10s = %s' % (self.MaxLen, > Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{')) > @@ -1286,18 +1295,24 @@ class PcdReport(object): > FiledOverrideFlag = False > if (Pcd.TokenCName,Pcd.TokenSpaceGuidCName) in > GlobalData.gPcdSkuOverrides: > OverrideValues = > GlobalData.gPcdSkuOverrides[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName) > ] > else: > OverrideValues = Pcd.SkuOverrideValues > + FieldOverrideValues = None > if OverrideValues: > for Data in OverrideValues.values(): > Struct = list(Data.values()) > if Struct: > - OverrideFieldStruct = > self.OverrideFieldValue(Pcd, Struct[0]) > - self.PrintStructureInfo(File, > OverrideFieldStruct) > + FieldOverrideValues = Struct[0] > FiledOverrideFlag = True > break > + if Pcd.PcdFiledValueFromDscComponent and > module_guid and module_guid.replace("-","S") in > Pcd.PcdFiledValueFromDscComponent: > + FieldOverrideValues = > Pcd.PcdFiledValueFromDscComponent[module_guid.replace("-","S")] > + if FieldOverrideValues: > + OverrideFieldStruct = self.OverrideFieldValue(Pcd, > FieldOverrideValues) > + self.PrintStructureInfo(File, OverrideFieldStruct) > + > if not FiledOverrideFlag and > (Pcd.PcdFieldValueFromComm or Pcd.PcdFieldValueFromFdf): > OverrideFieldStruct = self.OverrideFieldValue(Pcd, > {}) > self.PrintStructureInfo(File, OverrideFieldStruct) > self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, > DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue) > else: > -- > 2.20.1.windows.1 > > > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* 回复: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd 2020-10-28 15:07 ` Bob Feng @ 2020-10-30 3:26 ` gaoliming 0 siblings, 0 replies; 4+ messages in thread From: gaoliming @ 2020-10-30 3:26 UTC (permalink / raw) To: devel, bob.c.feng; +Cc: 'Chen, Christine', 'Kinney, Michael D' Bob: I review the generated PcdValueInit.c file and Report.txt. I find two issues. PcdValueInit.c: Assign_gEfiCryptoPkgTokenSpaceGuid_PcdCryptoServiceFamilyEnable_Default_Value(Pcd); // SkuName: DEFAULT, DefaultStoreName: STANDARD Assign_gEfiCryptoPkgTokenSpaceGuid_PcdCryptoServiceFamilyEnable_DEFAULT_STANDARD_Value(Pcd); Assign_gEfiCryptoPkgTokenSpaceGuid_PcdCryptoServiceFamilyEnable_Fdf_Value(Pcd); Assign_gEfiCryptoPkgTokenSpaceGuid_PcdCryptoServiceFamilyEnable_CommandLine_Value(Pcd); Assign_gEfiCryptoPkgTokenSpaceGuid_PcdCryptoServiceFamilyEnable_A3542CE8S77F7S49DCSA834S45D37D2EC1FA_Value(Pcd); Module level PCD values will have higher priority than the global level PCD setting. But, FDF and Command Line level PCD have higher priority than module level PCD. So, the module level PCD value assignment should be before Assign_gEfiCryptoPkgTokenSpaceGuid_PcdCryptoServiceFamilyEnable_Fdf_Value(Pcd); Report.txt: Pcd value in Module section is always zero. It doesn't match its real value. And, module level PCD setting should be displayed in report. gEfiCryptoPkgTokenSpaceGuid PcdCryptoServiceFamilyEnable : FIXED (PCD_CRYPTO_SERVICE_FAMILY_ENABLE) = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} Thanks Liming > -----邮件原件----- > 发件人: bounce+27952+66694+4905953+8761045@groups.io > <bounce+27952+66694+4905953+8761045@groups.io> 代表 Bob Feng > 发送时间: 2020年10月28日 23:08 > 收件人: devel@edk2.groups.io; gaoliming@byosoft.com.cn > 抄送: Chen, Christine <yuwei.chen@intel.com>; Kinney, Michael D > <michael.d.kinney@intel.com> > 主题: Re: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure > Pcd > > Liming, > > You can verify this patch with Mike's case. > > Clone Mike's edk2 repo, and checkout the branch > Bug_xxx_CryptoPkg_UseModuleScopedPcds > https://github.com/mdkinney/edk2/tree/Bug_xxx_CryptoPkg_UseModuleSco > pedPcds > > Then build the CryptoPkg. > > build -p CryptoPkg\CryptoPkg.dsc -a IA32 -y report.txt > > Thanks, > Bob > > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of gaoliming > Sent: Tuesday, October 27, 2020 2:20 PM > To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io > Cc: Chen, Christine <yuwei.chen@intel.com>; Kinney, Michael D > <michael.d.kinney@intel.com> > Subject: 回复: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope > Structure Pcd > > Bob: > I will review this change this week. Can you share your test case? I also > want to check the build output. > > Thanks > Liming > > -----邮件原件----- > > 发件人: Feng, Bob C <bob.c.feng@intel.com> > > 发送时间: 2020年10月26日 12:00 > > 收件人: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; > Liming > > Gao <gaoliming@byosoft.com.cn> > > 抄送: Chen, Christine <yuwei.chen@intel.com>; Kinney, Michael D > > <michael.d.kinney@intel.com> > > 主题: RE: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope > Structure > > Pcd > > > > Liming, would you review this patch? > > > > Thanks, > > Bob > > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob > Feng > > Sent: Thursday, October 15, 2020 6:59 PM > > To: devel@edk2.groups.io > > Cc: Liming Gao <gaoliming@byosoft.com.cn>; Chen, Christine > > <yuwei.chen@intel.com> > > Subject: [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure > > Pcd > > > > This patch is to enable the Module scoped Structure Pcd usage. > > User can set structure pcd field value in module scope. For example, > > under the [components] section of a dsc file, user can override some > > field value for a specific module. > > > > Package/Module.inf{ > > <PcdsFixedAtBuild> > > gUefiTokenSpaceGuid.StructurePcdModule.FieldName | 5 > > } > > > > Signed-off-by: Bob Feng <bob.c.feng@intel.com> > > Cc: Liming Gao <gaoliming@byosoft.com.cn> > > Cc: Yuwei Chen <yuwei.chen@intel.com> > > --- > > V2: Fixed the incorrect format in build report. > > BaseTools/Source/Python/AutoGen/DataPipe.py | 5 +- > > .../Source/Python/AutoGen/ModuleAutoGen.py | 4 +- > > .../Python/AutoGen/ModuleAutoGenHelper.py | 10 +- > > .../Source/Python/AutoGen/PlatformAutoGen.py | 8 +- > > .../Python/Workspace/BuildClassObject.py | 12 + > > .../Source/Python/Workspace/DscBuildData.py | 243 > > ++++++++++++++++-- > > BaseTools/Source/Python/build/BuildReport.py | 109 ++++---- > > 7 files changed, 319 insertions(+), 72 deletions(-) > > > > diff --git a/BaseTools/Source/Python/AutoGen/DataPipe.py > > b/BaseTools/Source/Python/AutoGen/DataPipe.py > > index 50403fbfb5..86ac2b928d 100755 > > --- a/BaseTools/Source/Python/AutoGen/DataPipe.py > > +++ b/BaseTools/Source/Python/AutoGen/DataPipe.py > > @@ -70,13 +70,14 @@ class MemoryDataPipe(DataPipe): > > } > > > > #Platform Module Pcds > > ModulePcds = {} > > for m in PlatformInfo.Platform.Modules: > > - m_pcds = PlatformInfo.Platform.Modules[m].Pcds > > + module = PlatformInfo.Platform.Modules[m] > > + m_pcds = module.Pcds > > if m_pcds: > > - ModulePcds[(m.File,m.Root,m.Arch)] = [PCD_DATA( > > + ModulePcds[module.Guid] = [PCD_DATA( > > pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type, > > pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue, > > > > pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges, > > > > pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue) > > for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()] > > diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > > b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > > index eebf6e87f5..d70b0d7ae8 100755 > > --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > > +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py > > @@ -1030,11 +1030,11 @@ class ModuleAutoGen(AutoGen): > > # @retval list The list of PCD > > # > > @cached_property > > def ModulePcdList(self): > > # apply PCD settings from platform > > - RetVal = self.PlatformInfo.ApplyPcdSetting(self.Module, > > self.Module.Pcds) > > + RetVal = self.PlatformInfo.ApplyPcdSetting(self, > self.Module.Pcds) > > > > return RetVal > > @cached_property > > def _PcdComments(self): > > ReVal = OrderedListDict() > > @@ -1061,11 +1061,11 @@ class ModuleAutoGen(AutoGen): > > # skip duplicated PCDs > > if Key in self.Module.Pcds or Key in Pcds: > > continue > > Pcds.add(Key) > > PcdsInLibrary[Key] = copy.copy(Library.Pcds[Key]) > > - > RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self.Module, > > PcdsInLibrary, Library=Library)) > > + RetVal.extend(self.PlatformInfo.ApplyPcdSetting(self, > > PcdsInLibrary, Library=Library)) > > return RetVal > > > > ## Get the GUID value mapping > > # > > # @retval dict The mapping between GUID cname and > its > > value > > diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > > b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > > index 9dd93b9beb..8e60643d1f 100644 > > --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > > +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py > > @@ -477,12 +477,13 @@ class PlatformInfo(AutoGenInfo): > > SkuName = TAB_DEFAULT > > ToPcd.SkuInfoList = { > > SkuName : SkuInfoClass(SkuName, > > self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue) > > } > > > > - def ApplyPcdSetting(self, Module, Pcds, Library=""): > > + def ApplyPcdSetting(self, Ma, Pcds, Library=""): > > # for each PCD in module > > + Module=Ma.Module > > for Name, Guid in Pcds: > > PcdInModule = Pcds[Name, Guid] > > # find out the PCD setting in platform > > if (Name, Guid) in self.Pcds: > > PcdInPlatform = self.Pcds[Name, Guid] > > @@ -505,13 +506,16 @@ class PlatformInfo(AutoGenInfo): > > % > > (Guid, Name, str(Module)), > > File=self.MetaFile > > ) > > > > # override PCD settings with module specific setting > > + ModuleScopePcds = self.DataPipe.Get("MOL_PCDS") > > if Module in self.Platform.Modules: > > PlatformModule = self.Platform.Modules[str(Module)] > > - for Key in PlatformModule.Pcds: > > + PCD_DATA = ModuleScopePcds.get(Ma.Guid,{}) > > + mPcds = {(pcd.TokenCName,pcd.TokenSpaceGuidCName): > > pcd for pcd in PCD_DATA} > > + for Key in mPcds: > > if self.BuildOptionPcd: > > for pcd in self.BuildOptionPcd: > > (TokenSpaceGuidCName, TokenCName, > > FieldName, pcdvalue, _) = pcd > > if (TokenCName, TokenSpaceGuidCName) > == > > Key and FieldName =="": > > > PlatformModule.Pcds[Key].DefaultValue > > = pcdvalue > > @@ -526,11 +530,11 @@ class PlatformInfo(AutoGenInfo): > > if PcdItem in Pcds: > > ToPcd = Pcds[PcdItem] > > Flag = True > > break > > if Flag: > > - self._OverridePcd(ToPcd, > PlatformModule.Pcds[Key], > > Module, Msg="DSC Components Module scoped PCD section", > > Library=Library) > > + self._OverridePcd(ToPcd, mPcds[Key], Module, > > Msg="DSC Components Module scoped PCD section", Library=Library) > > # use PCD value to calculate the MaxDatumSize when it is not > > specified > > for Name, Guid in Pcds: > > Pcd = Pcds[Name, Guid] > > if Pcd.DatumType == TAB_VOID and not > Pcd.MaxDatumSize: > > Pcd.MaxSizeUserSet = None > > diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > > b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > > index 26ab8e7f36..c7a4cb9a08 100644 > > --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > > +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py > > @@ -1041,11 +1041,17 @@ class PlatformAutoGen(AutoGen): > > TokenNumber += 1 > > return RetVal > > > > @cached_property > > def _MbList(self): > > - return [self.BuildDatabase[m, self.Arch, self.BuildTarget, > > self.ToolChain] for m in self.Platform.Modules] > > + mlist = [] > > + for m in self.Platform.Modules: > > + component = self.Platform.Modules[m] > > + module = self.BuildDatabase[m, self.Arch, self.BuildTarget, > > self.ToolChain] > > + module.Guid = component.Guid > > + mlist.append(module) > > + return mlist > > > > @cached_property > > def _MaList(self): > > for ModuleFile in self.Platform.Modules: > > Ma = ModuleAutoGen( > > diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py > > b/BaseTools/Source/Python/Workspace/BuildClassObject.py > > index db40e3b10c..ebb65fc2fe 100644 > > --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py > > +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py > > @@ -68,10 +68,11 @@ class PcdClassObject(object): > > self.DscRawValueInfo = {} > > if IsDsc: > > self.DscDefaultValue = Value > > self.PcdValueFromComm = "" > > self.PcdValueFromFdf = "" > > + self.PcdValueFromComponents = {} #{ModuleGuid:value, > > file_path,lineNo} > > self.CustomAttribute = {} > > self.UserDefinedDefaultStoresFlag = > UserDefinedDefaultStoresFlag > > self._Capacity = None > > > > @property > > @@ -296,10 +297,11 @@ class StructurePcd(PcdClassObject): > > self.DefaultValueFromDecInfo = None > > self.ValueChain = set() > > self.PcdFieldValueFromComm = OrderedDict() > > self.PcdFieldValueFromFdf = OrderedDict() > > self.DefaultFromDSC=None > > + self.PcdFiledValueFromDscComponent = OrderedDict() > > def __repr__(self): > > return self.TypeName > > > > def AddDefaultValue (self, FieldName, Value, FileName="", > > LineNo=0,DimensionAttr ="-1"): > > if DimensionAttr not in self.DefaultValues: > > @@ -322,10 +324,16 @@ class StructurePcd(PcdClassObject): > > if FieldName in > > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]: > > del > > > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > > ame] > > > > > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > > ame] = [Value.strip(), FileName, LineNo] > > return > > > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldN > > ame] > > > > + def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, > > FileName="", LineNo=0, DimensionAttr = '-1'): > > + self.PcdFiledValueFromDscComponent.setdefault(ModuleGuid, > > OrderedDict()) > > + > > > self.PcdFiledValueFromDscComponent[ModuleGuid].setdefault(DimensionAtt > > r,OrderedDict()) > > + > > > self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldNa > > me] = [Value.strip(), FileName, LineNo] > > + return > > > self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldNa > > me] > > + > > def SetPcdMode (self, PcdMode): > > self.PcdMode = PcdMode > > > > def copy(self, PcdObject): > > self.TokenCName = PcdObject.TokenCName if > > PcdObject.TokenCName else self.TokenCName > > @@ -363,10 +371,11 @@ class StructurePcd(PcdClassObject): > > self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if > > PcdObject.PcdDefineLineNo else self.PcdDefineLineNo > > self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else > > self.PkgPath > > self.ValueChain = PcdObject.ValueChain if > > PcdObject.ValueChain else self.ValueChain > > self.PcdFieldValueFromComm = > > PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm > > else self.PcdFieldValueFromComm > > self.PcdFieldValueFromFdf = > PcdObject.PcdFieldValueFromFdf > > if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf > > + self.PcdFiledValueFromDscComponent = > > PcdObject.PcdFiledValueFromDscComponent if > > PcdObject.PcdFiledValueFromDscComponent else > > self.PcdFiledValueFromDscComponent > > > > def __deepcopy__(self,memo): > > new_pcd = StructurePcd() > > self.sharedcopy(new_pcd) > > > > @@ -381,10 +390,11 @@ class StructurePcd(PcdClassObject): > > new_pcd.DefaultValues = CopyDict(self.DefaultValues) > > new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC) > > new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues) > > new_pcd.PcdFieldValueFromComm = > > CopyDict(self.PcdFieldValueFromComm) > > new_pcd.PcdFieldValueFromFdf = > > CopyDict(self.PcdFieldValueFromFdf) > > + new_pcd.PcdFiledValueFromDscComponent = > > CopyDict(self.PcdFiledValueFromDscComponent) > > new_pcd.ValueChain = {item for item in self.ValueChain} > > return new_pcd > > > > LibraryClassObject = namedtuple('LibraryClassObject', > > ['LibraryClass','SupModList']) > > > > @@ -461,10 +471,12 @@ class ModuleBuildClassObject(object): > > self.Includes = [] > > self.Packages = [] > > self.Pcds = {} > > self.BuildOptions = {} > > self.Depex = {} > > + self.StrPcdSet = [] > > + self.StrPcdOverallValue = {} > > > > ## Convert the class to a string > > # > > # Convert member MetaFile of the class to a string > > # > > diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > > b/BaseTools/Source/Python/Workspace/DscBuildData.py > > index 1ed3d9b909..1bb4fdc183 100644 > > --- a/BaseTools/Source/Python/Workspace/DscBuildData.py > > +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > > @@ -753,13 +753,14 @@ class DscBuildData(PlatformBuildClassObject): > > ErrorCode, ErrorInfo = ModuleFile.Validate('.inf') > > if ErrorCode != 0: > > EdkLogger.error('build', ErrorCode, File=self.MetaFile, > > Line=LineNo, > > ExtraData=ErrorInfo) > > > > + ModuleBuildData = self._Bdb[ModuleFile, self._Arch, > > self._Target, self._Toolchain] > > Module = ModuleBuildClassObject() > > Module.MetaFile = ModuleFile > > - > > + Module.Guid = ModuleBuildData.Guid > > # get module private library instance > > RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, > > self._Arch, None, ModuleId] > > for Record in RecordList: > > LibraryClass = Record[0] > > LibraryPath = PathClass(NormPath(Record[1], > Macros), > > GlobalData.gWorkspace, Arch=self._Arch) > > @@ -776,11 +777,11 @@ class DscBuildData(PlatformBuildClassObject): > > LibraryClass = 'NULL%d' % > self._NullLibraryNumber > > EdkLogger.verbose("Found forced library > > for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass)) > > Module.LibraryClasses[LibraryClass] = LibraryPath > > if LibraryPath not in self.LibraryInstances: > > self.LibraryInstances.append(LibraryPath) > > - > > + S_PcdSet = [] > > # get module private PCD setting > > for Type in [MODEL_PCD_FIXED_AT_BUILD, > > MODEL_PCD_PATCHABLE_IN_MODULE, \ > > MODEL_PCD_FEATURE_FLAG, > > MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]: > > RecordList = self._RawData[Type, self._Arch, None, > > ModuleId] > > for TokenSpaceGuid, PcdCName, Setting, Dummy1, > > Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: > > @@ -790,24 +791,35 @@ class DscBuildData(PlatformBuildClassObject): > > if len(TokenList) > 2: > > MaxDatumSize = TokenList[2] > > else: > > MaxDatumSize = '' > > TypeString = self._PCD_TYPE_STRING_[Type] > > - Pcd = PcdClassObject( > > - PcdCName, > > - TokenSpaceGuid, > > - TypeString, > > - '', > > - DefaultValue, > > - '', > > - MaxDatumSize, > > - {}, > > - False, > > - None > > - ) > > - Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd > > > > + TCName,PCName,DimensionAttr,Field = > > self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName) > > + > > + if ("." in TokenSpaceGuid or "[" in PcdCName): > > + > > S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, > > ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]]) > > + DefaultValue = '' > > + if ( PCName,TCName) not in Module.Pcds: > > + Pcd = PcdClassObject( > > + PCName, > > + TCName, > > + TypeString, > > + '', > > + DefaultValue, > > + '', > > + MaxDatumSize, > > + {}, > > + False, > > + None, > > + IsDsc=True) > > + Module.Pcds[PCName, TCName] = Pcd > > + > > + Module.StrPcdSet = S_PcdSet > > + for TCName,PCName, _,_,_,_,_,_ in S_PcdSet: > > + if (PCName,TCName) in Module.Pcds: > > + Module.StrPcdOverallValue[(PCName,TCName)] > = > > Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5 > > # get module private build options > > RecordList = > > self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, > > ModuleId] > > for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, > > Dummy3, Dummy4, Dummy5 in RecordList: > > if (ToolChainFamily, ToolChain) not in > > Module.BuildOptions: > > Module.BuildOptions[ToolChainFamily, ToolChain] > = > > Option > > @@ -820,11 +832,13 @@ class DscBuildData(PlatformBuildClassObject): > > if len(RecordList) != 1: > > EdkLogger.error('build', OPTION_UNKNOWN, > 'Only > > FILE_GUID can be listed in <Defines> section.', > > File=self.MetaFile, > > ExtraData=str(ModuleFile), Line=LineNo) > > ModuleFile = ProcessDuplicatedInf(ModuleFile, > > RecordList[0][2], GlobalData.gWorkspace) > > ModuleFile.Arch = self._Arch > > - > > + Module.Guid = RecordList[0][2] > > + for item in Module.StrPcdSet: > > + item[4] = RecordList[0][2] > > self._Modules[ModuleFile] = Module > > return self._Modules > > > > ## Retrieve all possible library instances used in this platform > > @property > > @@ -1497,11 +1511,19 @@ class DscBuildData(PlatformBuildClassObject): > > EdkLogger.error('build', PARSER_ERROR, > > "Pcd (%s.%s) is not declared as > > Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch), > > File=self.MetaFile, Line = > Dummy5) > > > > > > S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, > > default_store, Dummy5, AnalyzePcdExpression(Setting)[0]]) > > - > > + ModuleScopeOverallValue = {} > > + for m in self.Modules.values(): > > + mguid = m.Guid > > + if m.StrPcdSet: > > + S_PcdSet.extend(m.StrPcdSet) > > + mguid = m.StrPcdSet[0][4] > > + for (PCName,TCName) in m.StrPcdOverallValue: > > + Value, dsc_file, lineNo = > > m.StrPcdOverallValue[(PCName,TCName)] > > + > > ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, > > dsc_file, lineNo > > # handle pcd value override > > StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet) > > S_pcd_set = OrderedDict() > > for str_pcd in StrPcdSet: > > str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None) > > @@ -1515,10 +1537,15 @@ class DscBuildData(PlatformBuildClassObject): > > else: > > str_pcd_obj_str.DefaultFromDSC = > > {skuname:{defaultstore: > > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > > str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in > > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > > for str_pcd_data in StrPcdSet[str_pcd]: > > if str_pcd_data[4] in SkuIds: > > > str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], > > str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON > else > > str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == > > TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir > > not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) > if > > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > > + elif GlobalData.gGuidPattern.match(str_pcd_data[4]): > > + > > str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], > > str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File > if > > self.WorkspaceDir not in self.MetaFile.File else > > self.MetaFile.File[len(self.WorkspaceDir) if > > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > > + PcdComponentValue = > > > ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str. > > TokenSpaceGuidCName)) > > + for module_guid in PcdComponentValue: > > + > > str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = > > PcdComponentValue[module_guid] > > S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str > > > > # Add the Structure PCD that only defined in DEC, don't have > > override in DSC file > > for Pcd in self.DecPcds: > > if isinstance(self._DecPcds[Pcd], StructurePcd): > > @@ -1573,11 +1600,14 @@ class DscBuildData(PlatformBuildClassObject): > > if defaultstoreid not in > > stru_pcd.SkuOverrideValues[skuid]: > > > > stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = > > CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename]) > > stru_pcd.ValueChain.add((skuid, > > defaultstoreid)) > > S_pcd_set = > > DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir) > > S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set) > > + > > + # Create a tool to caculate structure pcd value > > Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) > > + > > if Str_Pcd_Values: > > for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in > > Str_Pcd_Values: > > str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid)) > > if str_pcd_obj is None: > > print(PcdName, PcdGuid) > > @@ -1591,10 +1621,18 @@ class DscBuildData(PlatformBuildClassObject): > > > > > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdV > > alue}) > > elif str_pcd_obj.Type in > > [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > > if skuname in (self.SkuIdMgr.SystemSkuId, > > TAB_DEFAULT, TAB_COMMON): > > str_pcd_obj.DefaultValue = PcdValue > > + else: > > + #Module Scope Structure Pcd > > + moduleguid = skuname.replace("S","-") > > + if > > GlobalData.gGuidPattern.match(moduleguid): > > + for component in self.Modules.values(): > > + if component.Guid == moduleguid: > > + component.Pcds[(PcdName, > > PcdGuid)].DefaultValue = PcdValue > > + > > else: > > if skuname not in str_pcd_obj.SkuInfoList: > > nextskuid = > > self.SkuIdMgr.GetNextSkuId(skuname) > > NoDefault = False > > while nextskuid not in > str_pcd_obj.SkuInfoList: > > @@ -2339,10 +2377,79 @@ class DscBuildData(PlatformBuildClassObject): > > else: > > CApp = CApp + ' Pcd->%s = %d; // > From %s > > Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > > FieldList[FieldName][2], FieldList[FieldName][0]) > > CApp = CApp + "}\n" > > return CApp > > > > + def GenerateModuleScopeValue(self, Pcd): > > + CApp = "// Value in Dsc Module scope \n" > > + for ModuleGuid in Pcd.PcdFiledValueFromDscComponent: > > + > > + CApp = CApp + "void Assign_%s_%s_%s_Value(%s > *Pcd){\n" % > > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, > > ModuleGuid,Pcd.BaseDatumType) > > + CApp = CApp + ' UINT32 FieldSize;\n' > > + CApp = CApp + ' CHAR8 *Value;\n' > > + pcddefaultvalue, file_path,lineNo = > > Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None)) > > + > > + if pcddefaultvalue: > > + IsArray = _IsFieldValueAnArray(pcddefaultvalue) > > + if IsArray: > > + try: > > + FieldList = > ValueExpressionEx(pcddefaultvalue, > > TAB_VOID)(True) > > + except BadExpression: > > + EdkLogger.error("Build", FORMAT_INVALID, > > "Invalid value format for %s.%s, from %s Line %s: %s" % > > + > > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList)) > > + Value, ValueSize = ParseFieldValue (FieldList) > > + > > + if isinstance(Value, str): > > + CApp = CApp + ' Pcd = %s; // From %s Line %s > \n' % > > (Value, file_path, lineNo) > > + elif IsArray: > > + # > > + # Use memcpy() to copy value into field > > + # > > + CApp = CApp + ' Value = %s; // From %s > > Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, > lineNo) > > + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % > > (ValueSize) > > + > > + > > + PcdFiledValue = > > Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid) > > + for index in PcdFiledValue: > > + FieldList = PcdFiledValue[index] > > + if not FieldList: > > + continue > > + for FieldName in FieldList: > > + IsArray = > > _IsFieldValueAnArray(FieldList[FieldName][0]) > > + if IsArray: > > + try: > > + FieldList[FieldName][0] = > > ValueExpressionEx(FieldList[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 = ParseFieldValue > > (FieldList[FieldName][0]) > > + except Exception: > > + 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])) > > + if isinstance(Value, str): > > + CApp = CApp + ' Pcd->%s = %s; // From %s > > Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > > FieldList[FieldName][2], FieldList[FieldName][0]) > > + elif IsArray: > > + # > > + # Use memcpy() to copy value into field > > + # > > + CApp = CApp + ' FieldSize = > > __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName) > > + CApp = CApp + ' Value = %s; // > > From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, > ValueSize), > > FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) > > + CApp = CApp + ' > > __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) > == > > 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value > %s\n' % > > (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, > FieldName, > > FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) > > + CApp = CApp + ' memcpy (&Pcd->%s, > Value, > > (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, > ValueSize, > > ValueSize) > > + else: > > + if '[' in FieldName and ']' in FieldName: > > + Index = > > int(FieldName.split('[')[1].split(']')[0]) > > + CApp = CApp + ' > __STATIC_ASSERT((%d > > < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index > > exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, > > FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], > > FieldList[FieldName][2], FieldName) > > + if ValueSize > 4: > > + CApp = CApp + ' Pcd->%s = %dULL; // > > From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > > FieldList[FieldName][2], FieldList[FieldName][0]) > > + else: > > + CApp = CApp + ' Pcd->%s = %d; // > > From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], > > FieldList[FieldName][2], FieldList[FieldName][0]) > > + CApp = CApp + "}\n" > > + return CApp > > + > > @staticmethod > > def GenerateCommandLineValueStatement(Pcd): > > CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % > > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > > return CApp > > def GenerateFdfValue(self,Pcd): > > @@ -2412,10 +2519,88 @@ class DscBuildData(PlatformBuildClassObject): > > @staticmethod > > def GenerateFdfValueStatement(Pcd): > > CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % > > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > > return CApp > > > > + @staticmethod > > + def GenerateModuleValueStatement(module_guid, Pcd): > > + CApp = " Assign_%s_%s_%s_Value(Pcd);\n" % > > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid) > > + return CApp > > + def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd, > > InitByteValue, CApp): > > + for module_guid in Pcd.PcdFiledValueFromDscComponent: > > + CApp = CApp + 'void\n' > > + CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % > (module_guid, > > TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, > > Pcd.TokenCName) > > + CApp = CApp + ' void\n' > > + CApp = CApp + ' )\n' > > + CApp = CApp + '{\n' > > + CApp = CApp + ' UINT32 Size;\n' > > + CApp = CApp + ' UINT32 FieldSize;\n' > > + CApp = CApp + ' CHAR8 *Value;\n' > > + CApp = CApp + ' UINT32 OriginalSize;\n' > > + CApp = CApp + ' VOID *OriginalPcd;\n' > > + > > + CApp = CApp + ' %s *Pcd; // From %s Line %d > \n' % > > (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo) > > + > > + CApp = CApp + '\n' > > + > > + PcdDefaultValue = > > StringToArray(Pcd.DefaultValueFromDec.strip()) > > + InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, > > TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, > > Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue) > > + # > > + # Get current PCD value and size > > + # > > + CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, > > &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, > > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > > + > > + # > > + # Determine the size of the PCD. For simple structures, > > sizeof(TYPE) provides > > + # the correct value. For structures with a flexible array > > member, the flexible > > + # array member is detected, and the size is based on the > > highest index used with > > + # the flexible array member. The flexible array member > > must be the last field > > + # in a structure. The size formula for this case is: > > + # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * > > (HighestIndex + 1) > > + # > > + CApp = CApp + > > > DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_D > > EFAULT) > > + if Pcd.IsArray() and Pcd.Capacity[-1] != "-1": > > + CApp = CApp + ' OriginalSize = OriginalSize < > sizeof(%s) > > * %d? OriginalSize:sizeof(%s) * %d; \n' % > > > (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySiz > > e()) > > + CApp = CApp + ' Size = sizeof(%s) * %d; \n' % > > (Pcd.BaseDatumType,Pcd.PcdArraySize()) > > + > > + # > > + # Allocate and zero buffer for the PCD > > + # Must handle cases where current value is smaller, larger, > or > > same size > > + # Always keep that larger one as the current size > > + # > > + CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : > > Size);\n' > > + CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % > > (Pcd.BaseDatumType,) > > + CApp = CApp + ' memset (Pcd, 0, Size);\n' > > + > > + # > > + # Copy current PCD value into allocated buffer. > > + # > > + CApp = CApp + ' memcpy (Pcd, OriginalPcd, > OriginalSize);\n' > > + > > + # > > + # Assign field values in PCD > > + # > > + CApp = CApp + > > DscBuildData.GenerateDefaultValueAssignStatement(Pcd) > > + > > + CApp = CApp + "// SkuName: %s, DefaultStoreName: > > STANDARD \n" % self.SkuIdMgr.SystemSkuId > > + CApp = CApp + > > DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, > > TAB_DEFAULT_STORES_DEFAULT) > > + CApp = CApp + > > DscBuildData.GenerateFdfValueStatement(Pcd) > > + CApp = CApp + > > DscBuildData.GenerateCommandLineValueStatement(Pcd) > > + CApp = CApp + > > DscBuildData.GenerateModuleValueStatement(module_guid,Pcd) > > + # > > + # Set new PCD value and size > > + # > > + CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void > > *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, > > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > > + > > + # > > + # Free PCD > > + # > > + CApp = CApp + ' free (Pcd);\n' > > + CApp = CApp + '}\n' > > + CApp = CApp + '\n' > > + return InitByteValue,CApp > > + > > def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, > > InitByteValue, CApp): > > OverrideValues = {DefaultStore:{}} > > if Pcd.SkuOverrideValues: > > OverrideValues = Pcd.SkuOverrideValues[SkuName] > > if not OverrideValues: > > @@ -2584,26 +2769,42 @@ class DscBuildData(PlatformBuildClassObject): > > CApp = CApp + '\n' > > for Pcd in StructuredPcds.values(): > > CApp = CApp + self.GenerateArrayAssignment(Pcd) > > for PcdName in sorted(StructuredPcds.keys()): > > Pcd = StructuredPcds[PcdName] > > + > > + #create void void Cal_tocken_cname_Size functions > > CApp = CApp + self.GenerateSizeFunction(Pcd) > > + > > + #create void Assign_ functions > > + > > + # From DEC > > CApp = CApp + > self.GenerateDefaultValueAssignFunction(Pcd) > > + # From Fdf > > CApp = CApp + self.GenerateFdfValue(Pcd) > > + # From CommandLine > > CApp = CApp + self.GenerateCommandLineValue(Pcd) > > + > > + # From Dsc Global setting > > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > > CApp = CApp + self.GenerateInitValueFunction(Pcd, > > self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT) > > else: > > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > > if SkuName not in Pcd.SkuOverrideValues: > > continue > > for DefaultStoreName in > > Pcd.SkuOverrideValues[SkuName]: > > CApp = CApp + > > self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName) > > + > > + # From Dsc module scope setting > > + CApp = CApp + self.GenerateModuleScopeValue(Pcd) > > + > > + #create Initialize_ functions > > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > > InitByteValue, CApp = > > self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, > > TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp) > > + InitByteValue, CApp = > > > self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitBy > > teValue,CApp) > > else: > > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > > if SkuName not in Pcd.SkuOverrideValues: > > continue > > for DefaultStoreName in Pcd.DefaultStoreName: > > @@ -2616,10 +2817,12 @@ class DscBuildData(PlatformBuildClassObject): > > CApp = CApp + ' )\n' > > CApp = CApp + '{\n' > > for Pcd in StructuredPcds.values(): > > if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or > > Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > > CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % > > (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, > > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > > + for ModuleGuid in > > Pcd.PcdFiledValueFromDscComponent: > > + CApp += " Initialize_%s_%s_%s_%s();\n" % > > (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, > > Pcd.TokenCName) > > else: > > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > > if SkuName not in > self.SkuIdMgr.AvailableSkuIdSet: > > continue > > for DefaultStoreName in > > Pcd.SkuOverrideValues[SkuName]: > > @@ -2631,10 +2834,11 @@ class DscBuildData(PlatformBuildClassObject): > > if not os.path.exists(self.OutputPath): > > os.makedirs(self.OutputPath) > > CAppBaseFileName = os.path.join(self.OutputPath, > > PcdValueInitName) > > SaveFileOnChange(CAppBaseFileName + '.c', CApp, False) > > > > + # start generating makefile > > MakeApp = PcdMakefileHeader > > if sys.platform == "win32": > > MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % > > (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % > > (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, > > PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + > > 'INC = ' > > else: > > MakeApp = MakeApp + PcdGccMakefile > > @@ -2753,19 +2957,22 @@ class DscBuildData(PlatformBuildClassObject): > > MakeApp = MakeApp + '\tcp > -f %s %s/PcdValueCommon.c\n' % > > (PcdValueCommonPath, self.OutputPath) > > MakeFileName = os.path.join(self.OutputPath, 'Makefile') > > MakeApp += "$(OBJECTS) : %s\n" % MakeFileName > > SaveFileOnChange(MakeFileName, MakeApp, False) > > > > + # start generating input file > > InputValueFile = os.path.join(self.OutputPath, 'Input.txt') > > OutputValueFile = os.path.join(self.OutputPath, 'Output.txt') > > SaveFileOnChange(InputValueFile, InitByteValue, False) > > > > Dest_PcdValueInitExe = PcdValueInitName > > if not sys.platform == "win32": > > Dest_PcdValueInitExe = os.path.join(self.OutputPath, > > PcdValueInitName) > > else: > > Dest_PcdValueInitExe = os.path.join(self.OutputPath, > > PcdValueInitName) +".exe" > > + > > + #start building the structure pcd value tool > > Messages = '' > > if sys.platform == "win32": > > MakeCommand = 'nmake -f %s' % (MakeFileName) > > returncode, StdOut, StdErr = > DscBuildData.ExecuteCommand > > (MakeCommand) > > Messages = StdOut > > @@ -2824,17 +3031,19 @@ class DscBuildData(PlatformBuildClassObject): > > if MessageGroup: > > EdkLogger.error("build", > PCD_STRUCTURE_PCD_ERROR, > > "\n".join(MessageGroup) ) > > else: > > EdkLogger.error('Build', COMMAND_FAILURE, 'Can > not > > execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr)) > > > > + #start executing the structure pcd value tool > > if DscBuildData.NeedUpdateOutput(OutputValueFile, > > Dest_PcdValueInitExe, InputValueFile): > > Command = Dest_PcdValueInitExe + ' -i %s -o %s' % > > (InputValueFile, OutputValueFile) > > returncode, StdOut, StdErr = > DscBuildData.ExecuteCommand > > (Command) > > EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, > > StdErr)) > > if returncode != 0: > > EdkLogger.warn('Build', COMMAND_FAILURE, 'Can > not > > collect output from command: %s\n%s\n' % (Command, StdOut, StdErr)) > > > > + #start update structure pcd final value > > File = open (OutputValueFile, 'r') > > FileBuffer = File.readlines() > > File.close() > > > > StructurePcdSet = [] > > diff --git a/BaseTools/Source/Python/build/BuildReport.py > > b/BaseTools/Source/Python/build/BuildReport.py > > index 8efa869162..d4de07cae2 100644 > > --- a/BaseTools/Source/Python/build/BuildReport.py > > +++ b/BaseTools/Source/Python/build/BuildReport.py > > @@ -694,11 +694,11 @@ class ModuleReport(object): > > FileWrite(File, "PCI Class Code: %s" % > > self.PciClassCode) > > > > FileWrite(File, gSectionSep) > > > > if "PCD" in ReportType: > > - GlobalPcdReport.GenerateReport(File, self.ModulePcdSet) > > + GlobalPcdReport.GenerateReport(File, > > self.ModulePcdSet,self.FileGuid) > > > > if "LIBRARY" in ReportType: > > self.LibraryReport.GenerateReport(File) > > > > if "DEPEX" in ReportType: > > @@ -879,11 +879,11 @@ class PcdReport(object): > > for (TokenCName, TokenSpaceGuidCName) in > > Pa.Platform.Pcds: > > DscDefaultValue = Pa.Platform.Pcds[(TokenCName, > > TokenSpaceGuidCName)].DscDefaultValue > > if DscDefaultValue: > > self.DscPcdDefault[(TokenCName, > > TokenSpaceGuidCName)] = DscDefaultValue > > > > - def GenerateReport(self, File, ModulePcdSet): > > + def GenerateReport(self, File, ModulePcdSet,module_guid=None): > > if not ModulePcdSet: > > if self.ConditionalPcds: > > self.GenerateReportDetail(File, ModulePcdSet, 1) > > if self.UnusedPcds: > > IsEmpty = True > > @@ -895,11 +895,11 @@ class PcdReport(object): > > break > > if not IsEmpty: > > break > > if not IsEmpty: > > self.GenerateReportDetail(File, ModulePcdSet, 2) > > - self.GenerateReportDetail(File, ModulePcdSet) > > + self.GenerateReportDetail(File, ModulePcdSet,module_guid = > > module_guid) > > > > ## > > # Generate report for PCD information > > # > > # This function generates report for separate module expression > > @@ -911,11 +911,11 @@ class PcdReport(object): > > # platform PCD report > > # @param ReportySubType 0 means platform/module PCD report, > 1 > > means Conditional > > # directives section report, 2 means > > Unused Pcds section report > > # @param DscOverridePcds Module DSC override PCDs set > > # > > - def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = > 0): > > + def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = > > 0,module_guid=None): > > PcdDict = self.AllPcds > > if ReportSubType == 1: > > PcdDict = self.ConditionalPcds > > elif ReportSubType == 2: > > PcdDict = self.UnusedPcds > > @@ -991,14 +991,16 @@ class PcdReport(object): > > if DscDefaultValue: > > PcdValue = DscDefaultValue > > #The DefaultValue of StructurePcd already be the > latest, > > no need to update. > > if not self.IsStructurePcd(Pcd.TokenCName, > > Pcd.TokenSpaceGuidCName): > > Pcd.DefaultValue = PcdValue > > + PcdComponentValue = None > > if ModulePcdSet is not None: > > if (Pcd.TokenCName, > Pcd.TokenSpaceGuidCName, > > Type) not in ModulePcdSet: > > continue > > - InfDefaultValue, PcdValue = > > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > > + InfDefaultValue, PcdComponentValue = > > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > > + PcdValue = PcdComponentValue > > #The DefaultValue of StructurePcd already be > the > > latest, no need to update. > > if not self.IsStructurePcd(Pcd.TokenCName, > > Pcd.TokenSpaceGuidCName): > > Pcd.DefaultValue = PcdValue > > if InfDefaultValue: > > try: > > @@ -1079,62 +1081,68 @@ class PcdReport(object): > > if self.IsStructurePcd(Pcd.TokenCName, > > Pcd.TokenSpaceGuidCName): > > IsStructure = True > > if TypeName in ('DYNVPD', 'DEXVPD'): > > SkuInfoList = Pcd.SkuInfoList > > Pcd = > > GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, > > Pcd.TokenSpaceGuidCName)] > > + if ModulePcdSet and > > ModulePcdSet.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type)): > > + InfDefaultValue, PcdComponentValue = > > ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type] > > + DscDefaultValBak = Pcd.DefaultValue > > + Pcd.DefaultValue = PcdComponentValue > > + > > Pcd.DatumType = Pcd.StructName > > if TypeName in ('DYNVPD', 'DEXVPD'): > > Pcd.SkuInfoList = SkuInfoList > > if Pcd.PcdValueFromComm or > > Pcd.PcdFieldValueFromComm: > > BuildOptionMatch = True > > DecMatch = False > > elif Pcd.PcdValueFromFdf or > > Pcd.PcdFieldValueFromFdf: > > DscDefaultValue = True > > DscMatch = True > > DecMatch = False > > - elif Pcd.SkuOverrideValues: > > - DscOverride = False > > - if Pcd.DefaultFromDSC: > > - DscOverride = True > > - else: > > - DictLen = 0 > > - for item in Pcd.SkuOverrideValues: > > - DictLen += > > len(Pcd.SkuOverrideValues[item]) > > - if not DictLen: > > - DscOverride = False > > + else: > > + if Pcd.Type in PCD_DYNAMIC_TYPE_SET | > > PCD_DYNAMIC_EX_TYPE_SET: > > + DscOverride = False > > + if Pcd.DefaultFromDSC: > > + DscOverride = True > > else: > > - if not Pcd.SkuInfoList: > > - OverrideValues = > > Pcd.SkuOverrideValues > > - if OverrideValues: > > - for Data in > > OverrideValues.values(): > > - Struct = > > list(Data.values()) > > - if Struct: > > - DscOverride = > > self.ParseStruct(Struct[0]) > > - break > > + DictLen = 0 > > + for item in Pcd.SkuOverrideValues: > > + DictLen += > > len(Pcd.SkuOverrideValues[item]) > > + if not DictLen: > > + DscOverride = False > > else: > > - SkuList = > > sorted(Pcd.SkuInfoList.keys()) > > - for Sku in SkuList: > > - SkuInfo = > > Pcd.SkuInfoList[Sku] > > - if > > SkuInfo.DefaultStoreDict: > > - DefaultStoreList = > > sorted(SkuInfo.DefaultStoreDict.keys()) > > - for DefaultStore in > > DefaultStoreList: > > - OverrideValues > = > > Pcd.SkuOverrideValues[Sku] > > - DscOverride = > > self.ParseStruct(OverrideValues[DefaultStore]) > > - if DscOverride: > > + if not Pcd.SkuInfoList: > > + OverrideValues = > > Pcd.SkuOverrideValues > > + if OverrideValues: > > + for Data in > > OverrideValues.values(): > > + Struct = > > list(Data.values()) > > + if Struct: > > + > > DscOverride = self.ParseStruct(Struct[0]) > > break > > - if DscOverride: > > - break > > - if DscOverride: > > + else: > > + SkuList = > > sorted(Pcd.SkuInfoList.keys()) > > + for Sku in SkuList: > > + SkuInfo = > > Pcd.SkuInfoList[Sku] > > + if > > SkuInfo.DefaultStoreDict: > > + > DefaultStoreList > > = sorted(SkuInfo.DefaultStoreDict.keys()) > > + for > DefaultStore > > in DefaultStoreList: > > + > > OverrideValues = Pcd.SkuOverrideValues[Sku] > > + > > DscOverride = self.ParseStruct(OverrideValues[DefaultStore]) > > + if > > DscOverride: > > + > break > > + if DscOverride: > > + break > > + if DscOverride: > > + DscDefaultValue = True > > + DscMatch = True > > + DecMatch = False > > + else: > > + DecMatch = True > > + else: > > DscDefaultValue = True > > DscMatch = True > > DecMatch = False > > - else: > > - DecMatch = True > > - else: > > - DscDefaultValue = True > > - DscMatch = True > > - DecMatch = False > > > > # > > # Report PCD item according to their override > > relationship > > # > > if Pcd.DatumType == 'BOOLEAN': > > @@ -1151,17 +1159,18 @@ class PcdReport(object): > > elif InfDefaultValue and InfMatch: > > self.PrintPcdValue(File, Pcd, PcdTokenCName, > > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > > InfDefaultValue, DecMatch, DecDefaultValue, '*M') > > elif BuildOptionMatch: > > self.PrintPcdValue(File, Pcd, PcdTokenCName, > > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > > InfDefaultValue, DecMatch, DecDefaultValue, '*B') > > else: > > - if DscDefaultValue and DscMatch: > > + if PcdComponentValue: > > + self.PrintPcdValue(File, Pcd, > PcdTokenCName, > > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > > PcdComponentValue, DecMatch, DecDefaultValue, '*M', module_guid) > > + elif DscDefaultValue and DscMatch: > > if (Pcd.TokenCName, Key, Field) in > > self.FdfPcdSet: > > self.PrintPcdValue(File, Pcd, > > PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, > > InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F') > > else: > > self.PrintPcdValue(File, Pcd, > > PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, > > InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P') > > - else: > > - self.PrintPcdValue(File, Pcd, > PcdTokenCName, > > TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, > > InfDefaultValue, DecMatch, DecDefaultValue, '*M') > > + > > > > if ModulePcdSet is None: > > if IsStructure: > > continue > > if not TypeName in ('PATCH', 'FLAG', 'FIXED'): > > @@ -1263,11 +1272,11 @@ class PcdReport(object): > > self.PrintStructureInfo(File, filedvalues) > > if DecMatch and IsStructure: > > for filedvalues in Pcd.DefaultValues.values(): > > self.PrintStructureInfo(File, filedvalues) > > > > - def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, > > IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, > DecMatch, > > DecDefaultValue, Flag = ' '): > > + def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, > > IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, > DecMatch, > > DecDefaultValue, Flag = ' ',module_guid=None): > > if not Pcd.SkuInfoList: > > Value = Pcd.DefaultValue > > IsByteArray, ArrayList = ByteArrayForamt(Value) > > if IsByteArray: > > FileWrite(File, ' %-*s : %6s %10s = %s' % > (self.MaxLen, > > Flag + ' ' + PcdTokenCName, TypeName, '(' + Pcd.DatumType + ')', '{')) > > @@ -1286,18 +1295,24 @@ class PcdReport(object): > > FiledOverrideFlag = False > > if (Pcd.TokenCName,Pcd.TokenSpaceGuidCName) in > > GlobalData.gPcdSkuOverrides: > > OverrideValues = > > > GlobalData.gPcdSkuOverrides[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName) > > ] > > else: > > OverrideValues = Pcd.SkuOverrideValues > > + FieldOverrideValues = None > > if OverrideValues: > > for Data in OverrideValues.values(): > > Struct = list(Data.values()) > > if Struct: > > - OverrideFieldStruct = > > self.OverrideFieldValue(Pcd, Struct[0]) > > - self.PrintStructureInfo(File, > > OverrideFieldStruct) > > + FieldOverrideValues = Struct[0] > > FiledOverrideFlag = True > > break > > + if Pcd.PcdFiledValueFromDscComponent and > > module_guid and module_guid.replace("-","S") in > > Pcd.PcdFiledValueFromDscComponent: > > + FieldOverrideValues = > > Pcd.PcdFiledValueFromDscComponent[module_guid.replace("-","S")] > > + if FieldOverrideValues: > > + OverrideFieldStruct = self.OverrideFieldValue(Pcd, > > FieldOverrideValues) > > + self.PrintStructureInfo(File, OverrideFieldStruct) > > + > > if not FiledOverrideFlag and > > (Pcd.PcdFieldValueFromComm or Pcd.PcdFieldValueFromFdf): > > OverrideFieldStruct = > self.OverrideFieldValue(Pcd, > > {}) > > self.PrintStructureInfo(File, OverrideFieldStruct) > > self.PrintPcdDefault(File, Pcd, IsStructure, DscMatch, > > DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue) > > else: > > -- > > 2.20.1.windows.1 > > > > > > > > > > > > > > > > > > > > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-10-30 3:26 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <163E2552F529AEC6.4805@groups.io> 2020-10-26 3:59 ` [edk2-devel] [Patch V2] BaseTools: Enable Module Scope Structure Pcd Bob Feng 2020-10-27 6:19 ` 回复: " gaoliming 2020-10-28 15:07 ` Bob Feng 2020-10-30 3:26 ` 回复: " gaoliming
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox