mirror of https://github.com/acidanthera/audk.git
BaseTools: Enable Module Scope Structure Pcd
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2648 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> Tested-by: Liming Gao <gaoliming@byosoft.com.cn> Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
parent
978b9d511f
commit
09af9bd9be
|
@ -72,9 +72,10 @@ 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,
|
||||
|
|
|
@ -1032,7 +1032,7 @@ class ModuleAutoGen(AutoGen):
|
|||
@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
|
||||
|
@ -1063,7 +1063,7 @@ class ModuleAutoGen(AutoGen):
|
|||
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
|
||||
|
|
|
@ -479,8 +479,9 @@ class PlatformInfo(AutoGenInfo):
|
|||
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
|
||||
|
@ -507,9 +508,12 @@ class PlatformInfo(AutoGenInfo):
|
|||
)
|
||||
|
||||
# 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
|
||||
|
@ -528,7 +532,7 @@ class PlatformInfo(AutoGenInfo):
|
|||
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]
|
||||
|
|
|
@ -1043,7 +1043,13 @@ class PlatformAutoGen(AutoGen):
|
|||
|
||||
@cached_property
|
||||
def _MbList(self):
|
||||
return [self.BuildDatabase[m, self.Arch, self.BuildTarget, self.ToolChain] for m in self.Platform.Modules]
|
||||
ModuleList = []
|
||||
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
|
||||
ModuleList.append(module)
|
||||
return ModuleList
|
||||
|
||||
@cached_property
|
||||
def _MaList(self):
|
||||
|
|
|
@ -70,6 +70,7 @@ class PcdClassObject(object):
|
|||
self.DscDefaultValue = Value
|
||||
self.PcdValueFromComm = ""
|
||||
self.PcdValueFromFdf = ""
|
||||
self.PcdValueFromComponents = {} #{ModuleGuid:value, file_path,lineNo}
|
||||
self.CustomAttribute = {}
|
||||
self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag
|
||||
self._Capacity = None
|
||||
|
@ -298,6 +299,7 @@ class StructurePcd(PcdClassObject):
|
|||
self.PcdFieldValueFromComm = OrderedDict()
|
||||
self.PcdFieldValueFromFdf = OrderedDict()
|
||||
self.DefaultFromDSC=None
|
||||
self.PcdFiledValueFromDscComponent = OrderedDict()
|
||||
def __repr__(self):
|
||||
return self.TypeName
|
||||
|
||||
|
@ -324,6 +326,12 @@ class StructurePcd(PcdClassObject):
|
|||
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
|
||||
|
||||
|
@ -365,6 +373,7 @@ class StructurePcd(PcdClassObject):
|
|||
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()
|
||||
|
@ -383,6 +392,7 @@ class StructurePcd(PcdClassObject):
|
|||
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
|
||||
|
||||
|
@ -463,6 +473,8 @@ class ModuleBuildClassObject(object):
|
|||
self.Pcds = {}
|
||||
self.BuildOptions = {}
|
||||
self.Depex = {}
|
||||
self.StrPcdSet = []
|
||||
self.StrPcdOverallValue = {}
|
||||
|
||||
## Convert the class to a string
|
||||
#
|
||||
|
|
|
@ -755,9 +755,10 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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:
|
||||
|
@ -778,7 +779,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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]:
|
||||
|
@ -792,20 +793,31 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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:
|
||||
|
@ -822,7 +834,9 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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
|
||||
|
||||
|
@ -1499,7 +1513,15 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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()
|
||||
|
@ -1517,6 +1539,11 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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
|
||||
|
@ -1575,7 +1602,10 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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))
|
||||
|
@ -1593,6 +1623,14 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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)
|
||||
|
@ -2341,6 +2379,75 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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)
|
||||
|
@ -2414,6 +2521,85 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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.GenerateModuleValueStatement(module_guid,Pcd)
|
||||
CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)
|
||||
CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(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:
|
||||
|
@ -2586,10 +2772,20 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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)
|
||||
|
@ -2599,9 +2795,15 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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:
|
||||
|
@ -2618,6 +2820,8 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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:
|
||||
|
@ -2633,6 +2837,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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 = '
|
||||
|
@ -2755,6 +2960,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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)
|
||||
|
@ -2764,6 +2970,8 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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)
|
||||
|
@ -2826,6 +3034,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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)
|
||||
|
@ -2833,6 +3042,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
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()
|
||||
|
|
|
@ -696,7 +696,7 @@ class ModuleReport(object):
|
|||
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)
|
||||
|
@ -881,7 +881,7 @@ class PcdReport(object):
|
|||
if DscDefaultValue:
|
||||
self.DscPcdDefault[(TokenCName, TokenSpaceGuidCName)] = DscDefaultValue
|
||||
|
||||
def GenerateReport(self, File, ModulePcdSet):
|
||||
def GenerateReport(self, File, ModulePcdSet,ModuleGuid=None):
|
||||
if not ModulePcdSet:
|
||||
if self.ConditionalPcds:
|
||||
self.GenerateReportDetail(File, ModulePcdSet, 1)
|
||||
|
@ -897,7 +897,7 @@ class PcdReport(object):
|
|||
break
|
||||
if not IsEmpty:
|
||||
self.GenerateReportDetail(File, ModulePcdSet, 2)
|
||||
self.GenerateReportDetail(File, ModulePcdSet)
|
||||
self.GenerateReportDetail(File, ModulePcdSet,ModuleGuid = ModuleGuid)
|
||||
|
||||
##
|
||||
# Generate report for PCD information
|
||||
|
@ -913,7 +913,7 @@ class PcdReport(object):
|
|||
# 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,ModuleGuid=None):
|
||||
PcdDict = self.AllPcds
|
||||
if ReportSubType == 1:
|
||||
PcdDict = self.ConditionalPcds
|
||||
|
@ -993,10 +993,12 @@ class PcdReport(object):
|
|||
#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
|
||||
|
@ -1081,6 +1083,11 @@ class PcdReport(object):
|
|||
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
|
||||
|
@ -1091,48 +1098,53 @@ class PcdReport(object):
|
|||
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 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
|
||||
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
|
||||
if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:
|
||||
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 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
|
||||
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:
|
||||
if Pcd.DscRawValue or (ModuleGuid and ModuleGuid.replace("-","S") in Pcd.PcdValueFromComponents):
|
||||
DscDefaultValue = True
|
||||
DscMatch = True
|
||||
DecMatch = False
|
||||
else:
|
||||
DscDefaultValue = False
|
||||
DecMatch = True
|
||||
|
||||
#
|
||||
# Report PCD item according to their override relationship
|
||||
|
@ -1153,13 +1165,14 @@ class PcdReport(object):
|
|||
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', ModuleGuid)
|
||||
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:
|
||||
|
@ -1265,7 +1278,7 @@ class PcdReport(object):
|
|||
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 = ' ',ModuleGuid=None):
|
||||
if not Pcd.SkuInfoList:
|
||||
Value = Pcd.DefaultValue
|
||||
IsByteArray, ArrayList = ByteArrayForamt(Value)
|
||||
|
@ -1288,14 +1301,20 @@ class PcdReport(object):
|
|||
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 ModuleGuid and ModuleGuid.replace("-","S") in Pcd.PcdFiledValueFromDscComponent:
|
||||
FieldOverrideValues = Pcd.PcdFiledValueFromDscComponent[ModuleGuid.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)
|
||||
|
|
Loading…
Reference in New Issue