EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
ExtraData=ErrorInfo)\r
\r
+ ModuleBuildData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
Module = ModuleBuildClassObject()\r
Module.MetaFile = ModuleFile\r
-\r
+ Module.Guid = ModuleBuildData.Guid\r
# get module private library instance\r
RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
for Record in RecordList:\r
Module.LibraryClasses[LibraryClass] = LibraryPath\r
if LibraryPath not in self.LibraryInstances:\r
self.LibraryInstances.append(LibraryPath)\r
-\r
+ S_PcdSet = []\r
# get module private PCD setting\r
for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
else:\r
MaxDatumSize = ''\r
TypeString = self._PCD_TYPE_STRING_[Type]\r
- Pcd = PcdClassObject(\r
- PcdCName,\r
- TokenSpaceGuid,\r
- TypeString,\r
- '',\r
- DefaultValue,\r
- '',\r
- MaxDatumSize,\r
- {},\r
- False,\r
- None\r
- )\r
- Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
\r
+ TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+\r
+ if ("." in TokenSpaceGuid or "[" in PcdCName):\r
+ S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+ DefaultValue = ''\r
+ if ( PCName,TCName) not in Module.Pcds:\r
+ Pcd = PcdClassObject(\r
+ PCName,\r
+ TCName,\r
+ TypeString,\r
+ '',\r
+ DefaultValue,\r
+ '',\r
+ MaxDatumSize,\r
+ {},\r
+ False,\r
+ None,\r
+ IsDsc=True)\r
+ Module.Pcds[PCName, TCName] = Pcd\r
+\r
+ Module.StrPcdSet = S_PcdSet\r
+ for TCName,PCName, _,_,_,_,_,_ in S_PcdSet:\r
+ if (PCName,TCName) in Module.Pcds:\r
+ Module.StrPcdOverallValue[(PCName,TCName)] = Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5\r
# get module private build options\r
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
ModuleFile.Arch = self._Arch\r
-\r
+ Module.Guid = RecordList[0][2]\r
+ for item in Module.StrPcdSet:\r
+ item[4] = RecordList[0][2]\r
self._Modules[ModuleFile] = Module\r
return self._Modules\r
\r
File=self.MetaFile, Line = Dummy5)\r
\r
S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
-\r
+ ModuleScopeOverallValue = {}\r
+ for m in self.Modules.values():\r
+ mguid = m.Guid\r
+ if m.StrPcdSet:\r
+ S_PcdSet.extend(m.StrPcdSet)\r
+ mguid = m.StrPcdSet[0][4]\r
+ for (PCName,TCName) in m.StrPcdOverallValue:\r
+ Value, dsc_file, lineNo = m.StrPcdOverallValue[(PCName,TCName)]\r
+ ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, dsc_file, lineNo\r
# handle pcd value override\r
StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
S_pcd_set = OrderedDict()\r
for str_pcd_data in StrPcdSet[str_pcd]:\r
if str_pcd_data[4] in SkuIds:\r
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])\r
+ elif GlobalData.gGuidPattern.match(str_pcd_data[4]):\r
+ 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])\r
+ PcdComponentValue = ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str.TokenSpaceGuidCName))\r
+ for module_guid in PcdComponentValue:\r
+ str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = PcdComponentValue[module_guid]\r
S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
\r
# Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
+\r
+ # Create a tool to caculate structure pcd value\r
Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
+\r
if Str_Pcd_Values:\r
for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
str_pcd_obj.DefaultValue = PcdValue\r
+ else:\r
+ #Module Scope Structure Pcd\r
+ moduleguid = skuname.replace("S","-")\r
+ if GlobalData.gGuidPattern.match(moduleguid):\r
+ for component in self.Modules.values():\r
+ if component.Guid == moduleguid:\r
+ component.Pcds[(PcdName, PcdGuid)].DefaultValue = PcdValue\r
+\r
else:\r
if skuname not in str_pcd_obj.SkuInfoList:\r
nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
CApp = CApp + "}\n"\r
return CApp\r
\r
+ def GenerateModuleScopeValue(self, Pcd):\r
+ CApp = "// Value in Dsc Module scope \n"\r
+ for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+\r
+ CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, ModuleGuid,Pcd.BaseDatumType)\r
+ CApp = CApp + ' UINT32 FieldSize;\n'\r
+ CApp = CApp + ' CHAR8 *Value;\n'\r
+ pcddefaultvalue, file_path,lineNo = Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None))\r
+\r
+ if pcddefaultvalue:\r
+ IsArray = _IsFieldValueAnArray(pcddefaultvalue)\r
+ if IsArray:\r
+ try:\r
+ FieldList = ValueExpressionEx(pcddefaultvalue, TAB_VOID)(True)\r
+ except BadExpression:\r
+ EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from %s Line %s: %s" %\r
+ (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList))\r
+ Value, ValueSize = ParseFieldValue (FieldList)\r
+\r
+ if isinstance(Value, str):\r
+ CApp = CApp + ' Pcd = %s; // From %s Line %s \n' % (Value, file_path, lineNo)\r
+ elif IsArray:\r
+ #\r
+ # Use memcpy() to copy value into field\r
+ #\r
+ CApp = CApp + ' Value = %s; // From %s Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo)\r
+ CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+\r
+ PcdFiledValue = Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid)\r
+ for index in PcdFiledValue:\r
+ FieldList = PcdFiledValue[index]\r
+ if not FieldList:\r
+ continue\r
+ for FieldName in FieldList:\r
+ IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
+ if IsArray:\r
+ try:\r
+ FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
+ except BadExpression:\r
+ EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+ (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
+ except:\r
+ print("error")\r
+ try:\r
+ Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+ except Exception:\r
+ 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]))\r
+ if isinstance(Value, str):\r
+ CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ elif IsArray:\r
+ #\r
+ # Use memcpy() to copy value into field\r
+ #\r
+ CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
+ CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ 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])\r
+ CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+ else:\r
+ if '[' in FieldName and ']' in FieldName:\r
+ Index = int(FieldName.split('[')[1].split(']')[0])\r
+ 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)\r
+ if ValueSize > 4:\r
+ CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ else:\r
+ CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + "}\n"\r
+ return CApp\r
+\r
@staticmethod\r
def GenerateCommandLineValueStatement(Pcd):\r
CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
return CApp\r
\r
+ @staticmethod\r
+ def GenerateModuleValueStatement(module_guid, Pcd):\r
+ CApp = " Assign_%s_%s_%s_Value(Pcd);\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid)\r
+ return CApp\r
+ def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd, InitByteValue, CApp):\r
+ for module_guid in Pcd.PcdFiledValueFromDscComponent:\r
+ CApp = CApp + 'void\n'\r
+ CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ CApp = CApp + ' void\n'\r
+ CApp = CApp + ' )\n'\r
+ CApp = CApp + '{\n'\r
+ CApp = CApp + ' UINT32 Size;\n'\r
+ CApp = CApp + ' UINT32 FieldSize;\n'\r
+ CApp = CApp + ' CHAR8 *Value;\n'\r
+ CApp = CApp + ' UINT32 OriginalSize;\n'\r
+ CApp = CApp + ' VOID *OriginalPcd;\n'\r
+\r
+ CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+ CApp = CApp + '\n'\r
+\r
+ PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
+ InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
+ #\r
+ # Get current PCD value and size\r
+ #\r
+ CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+ #\r
+ # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
+ # the correct value. For structures with a flexible array member, the flexible\r
+ # array member is detected, and the size is based on the highest index used with\r
+ # the flexible array member. The flexible array member must be the last field\r
+ # in a structure. The size formula for this case is:\r
+ # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
+ #\r
+ CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_DEFAULT)\r
+ if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+ CApp = CApp + ' OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+ CApp = CApp + ' Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+\r
+ #\r
+ # Allocate and zero buffer for the PCD\r
+ # Must handle cases where current value is smaller, larger, or same size\r
+ # Always keep that larger one as the current size\r
+ #\r
+ CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
+ CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
+ CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
+\r
+ #\r
+ # Copy current PCD value into allocated buffer.\r
+ #\r
+ CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
+\r
+ #\r
+ # Assign field values in PCD\r
+ #\r
+ CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
+\r
+ CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
+ CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
+ CApp = CApp + DscBuildData.GenerateModuleValueStatement(module_guid,Pcd)\r
+ CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
+ CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
+\r
+ #\r
+ # Set new PCD value and size\r
+ #\r
+ CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+ #\r
+ # Free PCD\r
+ #\r
+ CApp = CApp + ' free (Pcd);\n'\r
+ CApp = CApp + '}\n'\r
+ CApp = CApp + '\n'\r
+ return InitByteValue,CApp\r
+\r
def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
OverrideValues = {DefaultStore:{}}\r
if Pcd.SkuOverrideValues:\r
CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
for PcdName in sorted(StructuredPcds.keys()):\r
Pcd = StructuredPcds[PcdName]\r
+\r
+ #create void void Cal_tocken_cname_Size functions\r
CApp = CApp + self.GenerateSizeFunction(Pcd)\r
+\r
+ #create void Assign_ functions\r
+\r
+ # From DEC\r
CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
+ # From Fdf\r
CApp = CApp + self.GenerateFdfValue(Pcd)\r
+ # From CommandLine\r
CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
+\r
+ # From Dsc Global setting\r
if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
continue\r
for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
+\r
+ # From Dsc module scope setting\r
+ CApp = CApp + self.GenerateModuleScopeValue(Pcd)\r
+\r
+ #create Initialize_ functions\r
if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
+ InitByteValue, CApp = self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitByteValue,CApp)\r
else:\r
for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
if SkuName not in Pcd.SkuOverrideValues:\r
for Pcd in StructuredPcds.values():\r
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]]:\r
CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+ CApp += " Initialize_%s_%s_%s_%s();\n" % (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
else:\r
for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
\r
+ # start generating makefile\r
MakeApp = PcdMakefileHeader\r
if sys.platform == "win32":\r
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 = '\r
MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
SaveFileOnChange(MakeFileName, MakeApp, False)\r
\r
+ # start generating input file\r
InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
SaveFileOnChange(InputValueFile, InitByteValue, False)\r
Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
else:\r
Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
+\r
+ #start building the structure pcd value tool\r
Messages = ''\r
if sys.platform == "win32":\r
MakeCommand = 'nmake -f %s' % (MakeFileName)\r
else:\r
EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
\r
+ #start executing the structure pcd value tool\r
if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
if returncode != 0:\r
EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s\n%s\n' % (Command, StdOut, StdErr))\r
\r
+ #start update structure pcd final value\r
File = open (OutputValueFile, 'r')\r
FileBuffer = File.readlines()\r
File.close()\r
FileWrite(File, gSectionSep)\r
\r
if "PCD" in ReportType:\r
- GlobalPcdReport.GenerateReport(File, self.ModulePcdSet)\r
+ GlobalPcdReport.GenerateReport(File, self.ModulePcdSet,self.FileGuid)\r
\r
if "LIBRARY" in ReportType:\r
self.LibraryReport.GenerateReport(File)\r
if DscDefaultValue:\r
self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue\r
\r
- def GenerateReport(self, File, ModulePcdSet):\r
+ def GenerateReport(self, File, ModulePcdSet,ModuleGuid=None):\r
if not ModulePcdSet:\r
if self.ConditionalPcds:\r
self.GenerateReportDetail(File, ModulePcdSet, 1)\r
break\r
if not IsEmpty:\r
self.GenerateReportDetail(File, ModulePcdSet, 2)\r
- self.GenerateReportDetail(File, ModulePcdSet)\r
+ self.GenerateReportDetail(File, ModulePcdSet,ModuleGuid = ModuleGuid)\r
\r
##\r
# Generate report for PCD information\r
# directives section report, 2 means Unused Pcds section report\r
# @param DscOverridePcds Module DSC override PCDs set\r
#\r
- def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0):\r
+ def GenerateReportDetail(self, File, ModulePcdSet, ReportSubType = 0,ModuleGuid=None):\r
PcdDict = self.AllPcds\r
if ReportSubType == 1:\r
PcdDict = self.ConditionalPcds\r
#The DefaultValue of StructurePcd already be the latest, no need to update.\r
if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
Pcd.DefaultValue = PcdValue\r
+ PcdComponentValue = None\r
if ModulePcdSet is not None:\r
if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type) not in ModulePcdSet:\r
continue\r
- InfDefaultValue, PcdValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+ InfDefaultValue, PcdComponentValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+ PcdValue = PcdComponentValue\r
#The DefaultValue of StructurePcd already be the latest, no need to update.\r
if not self.IsStructurePcd(Pcd.TokenCName, Pcd.TokenSpaceGuidCName):\r
Pcd.DefaultValue = PcdValue\r
if TypeName in ('DYNVPD', 'DEXVPD'):\r
SkuInfoList = Pcd.SkuInfoList\r
Pcd = GlobalData.gStructurePcd[self.Arch][(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)]\r
+ if ModulePcdSet and ModulePcdSet.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type)):\r
+ InfDefaultValue, PcdComponentValue = ModulePcdSet[Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Type]\r
+ DscDefaultValBak = Pcd.DefaultValue\r
+ Pcd.DefaultValue = PcdComponentValue\r
+\r
Pcd.DatumType = Pcd.StructName\r
if TypeName in ('DYNVPD', 'DEXVPD'):\r
Pcd.SkuInfoList = SkuInfoList\r
DscDefaultValue = True\r
DscMatch = True\r
DecMatch = False\r
- elif Pcd.SkuOverrideValues:\r
- DscOverride = False\r
- if Pcd.DefaultFromDSC:\r
- DscOverride = True\r
- else:\r
- DictLen = 0\r
- for item in Pcd.SkuOverrideValues:\r
- DictLen += len(Pcd.SkuOverrideValues[item])\r
- if not DictLen:\r
- DscOverride = False\r
+ else:\r
+ if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
+ DscOverride = False\r
+ if Pcd.DefaultFromDSC:\r
+ DscOverride = True\r
else:\r
- if not Pcd.SkuInfoList:\r
- OverrideValues = Pcd.SkuOverrideValues\r
- if OverrideValues:\r
- for Data in OverrideValues.values():\r
- Struct = list(Data.values())\r
- if Struct:\r
- DscOverride = self.ParseStruct(Struct[0])\r
- break\r
+ DictLen = 0\r
+ for item in Pcd.SkuOverrideValues:\r
+ DictLen += len(Pcd.SkuOverrideValues[item])\r
+ if not DictLen:\r
+ DscOverride = False\r
else:\r
- SkuList = sorted(Pcd.SkuInfoList.keys())\r
- for Sku in SkuList:\r
- SkuInfo = Pcd.SkuInfoList[Sku]\r
- if SkuInfo.DefaultStoreDict:\r
- DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
- for DefaultStore in DefaultStoreList:\r
- OverrideValues = Pcd.SkuOverrideValues[Sku]\r
- DscOverride = self.ParseStruct(OverrideValues[DefaultStore])\r
- if DscOverride:\r
+ if not Pcd.SkuInfoList:\r
+ OverrideValues = Pcd.SkuOverrideValues\r
+ if OverrideValues:\r
+ for Data in OverrideValues.values():\r
+ Struct = list(Data.values())\r
+ if Struct:\r
+ DscOverride = self.ParseStruct(Struct[0])\r
break\r
- if DscOverride:\r
- break\r
- if DscOverride:\r
- DscDefaultValue = True\r
- DscMatch = True\r
- DecMatch = False\r
+ else:\r
+ SkuList = sorted(Pcd.SkuInfoList.keys())\r
+ for Sku in SkuList:\r
+ SkuInfo = Pcd.SkuInfoList[Sku]\r
+ if SkuInfo.DefaultStoreDict:\r
+ DefaultStoreList = sorted(SkuInfo.DefaultStoreDict.keys())\r
+ for DefaultStore in DefaultStoreList:\r
+ OverrideValues = Pcd.SkuOverrideValues[Sku]\r
+ DscOverride = self.ParseStruct(OverrideValues[DefaultStore])\r
+ if DscOverride:\r
+ break\r
+ if DscOverride:\r
+ break\r
+ if DscOverride:\r
+ DscDefaultValue = True\r
+ DscMatch = True\r
+ DecMatch = False\r
+ else:\r
+ DecMatch = True\r
else:\r
- DecMatch = True\r
- else:\r
- DscDefaultValue = True\r
- DscMatch = True\r
- DecMatch = False\r
+ if Pcd.DscRawValue or (ModuleGuid and ModuleGuid.replace("-","S") in Pcd.PcdValueFromComponents):\r
+ DscDefaultValue = True\r
+ DscMatch = True\r
+ DecMatch = False\r
+ else:\r
+ DscDefaultValue = False\r
+ DecMatch = True\r
\r
#\r
# Report PCD item according to their override relationship\r
elif BuildOptionMatch:\r
self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*B')\r
else:\r
- if DscDefaultValue and DscMatch:\r
+ if PcdComponentValue:\r
+ self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, PcdComponentValue, DecMatch, DecDefaultValue, '*M', ModuleGuid)\r
+ elif DscDefaultValue and DscMatch:\r
if (Pcd.TokenCName, Key, Field) in self.FdfPcdSet:\r
self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*F')\r
else:\r
self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*P')\r
- else:\r
- self.PrintPcdValue(File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValBak, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, '*M')\r
+\r
\r
if ModulePcdSet is None:\r
if IsStructure:\r
for filedvalues in Pcd.DefaultValues.values():\r
self.PrintStructureInfo(File, filedvalues)\r
\r
- def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = ' '):\r
+ def PrintPcdValue(self, File, Pcd, PcdTokenCName, TypeName, IsStructure, DscMatch, DscDefaultValue, InfMatch, InfDefaultValue, DecMatch, DecDefaultValue, Flag = ' ',ModuleGuid=None):\r
if not Pcd.SkuInfoList:\r
Value = Pcd.DefaultValue\r
IsByteArray, ArrayList = ByteArrayForamt(Value)\r
OverrideValues = GlobalData.gPcdSkuOverrides[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName)]\r
else:\r
OverrideValues = Pcd.SkuOverrideValues\r
+ FieldOverrideValues = None\r
if OverrideValues:\r
for Data in OverrideValues.values():\r
Struct = list(Data.values())\r
if Struct:\r
- OverrideFieldStruct = self.OverrideFieldValue(Pcd, Struct[0])\r
- self.PrintStructureInfo(File, OverrideFieldStruct)\r
+ FieldOverrideValues = Struct[0]\r
FiledOverrideFlag = True\r
break\r
+ if Pcd.PcdFiledValueFromDscComponent and ModuleGuid and ModuleGuid.replace("-","S") in Pcd.PcdFiledValueFromDscComponent:\r
+ FieldOverrideValues = Pcd.PcdFiledValueFromDscComponent[ModuleGuid.replace("-","S")]\r
+ if FieldOverrideValues:\r
+ OverrideFieldStruct = self.OverrideFieldValue(Pcd, FieldOverrideValues)\r
+ self.PrintStructureInfo(File, OverrideFieldStruct)\r
+\r
if not FiledOverrideFlag and (Pcd.PcdFieldValueFromComm or Pcd.PcdFieldValueFromFdf):\r
OverrideFieldStruct = self.OverrideFieldValue(Pcd, {})\r
self.PrintStructureInfo(File, OverrideFieldStruct)\r