Reviewed-by: Liming Gao <[email protected]>
> -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of BobCF > Sent: Friday, March 2, 2018 6:11 PM > To: [email protected] > Cc: Gao, Liming <[email protected]> > Subject: [edk2] [Patch 1/2] BaseTools: Fixed Pcd value override issue. > > 1. Handle the Pcd maxsize issue for the case > that the length of Pcd value from CommandLine > bigger that its maxsize > > 2. The Pcd value override in commandline. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Bob Feng <[email protected]> > Cc: Liming Gao <[email protected]> > --- > BaseTools/Source/Python/AutoGen/AutoGen.py | 26 --- > BaseTools/Source/Python/AutoGen/GenPcdDb.py | 12 -- > .../Source/Python/Workspace/BuildClassObject.py | 4 + > BaseTools/Source/Python/Workspace/DscBuildData.py | 175 > ++++++++++++++++++--- > BaseTools/Source/Python/build/build.py | 2 +- > 5 files changed, 157 insertions(+), 62 deletions(-) > > diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py > b/BaseTools/Source/Python/AutoGen/AutoGen.py > index e2589cfbae..439e360955 100644 > --- a/BaseTools/Source/Python/AutoGen/AutoGen.py > +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py > @@ -1366,31 +1366,10 @@ class PlatformAutoGen(AutoGen): > # > # Gather dynamic PCDs list from each module and their settings from > platform > # This interface should be invoked explicitly when platform action is > created. > # > def CollectPlatformDynamicPcds(self): > - # Override the platform Pcd's value by build option > - if GlobalData.BuildOptionPcd: > - for PcdItem in GlobalData.BuildOptionPcd: > - PlatformPcd = self.Platform.Pcds.get((PcdItem[1],PcdItem[0])) > - if PlatformPcd: > - if PlatformPcd.DatumType in [TAB_UINT8, TAB_UINT16, > TAB_UINT32, TAB_UINT64,'BOOLEAN']: > - for sku in PlatformPcd.SkuInfoList: > - PlatformPcd.SkuInfoList[sku].DefaultValue = > PcdItem[2] > - else: > - PcdDefaultValue = StringToArray(PcdItem[2]) > - for sku in PlatformPcd.SkuInfoList: > - skuinfo = PlatformPcd.SkuInfoList[sku] > - if skuinfo.VariableGuid: > - skuinfo.HiiDefaultValue = PcdDefaultValue > - else: > - skuinfo.DefaultValue = PcdDefaultValue > - PlatformPcd.DefaultValue = PcdDefaultValue > - if PlatformPcd.MaxDatumSize: > - PlatformPcd.MaxDatumSize = > str(max([int(PlatformPcd.MaxDatumSize),len(PcdDefaultValue.split(","))])) > - else: > - PlatformPcd.MaxDatumSize = > str(len(PcdDefaultValue.split(","))) > > for key in self.Platform.Pcds: > for SinglePcd in GlobalData.MixedPcd: > if (self.Platform.Pcds[key].TokenCName, > self.Platform.Pcds[key].TokenSpaceGuidCName) == SinglePcd: > for item in GlobalData.MixedPcd[SinglePcd]: > @@ -2371,15 +2350,10 @@ class PlatformAutoGen(AutoGen): > for PcdItem in GlobalData.MixedPcd: > if (ToPcd.TokenCName, ToPcd.TokenSpaceGuidCName) in > GlobalData.MixedPcd[PcdItem]: > TokenCName = PcdItem[0] > break > if FromPcd != None: > - if GlobalData.BuildOptionPcd: > - for pcd in GlobalData.BuildOptionPcd: > - if (FromPcd.TokenSpaceGuidCName, FromPcd.TokenCName) == > (pcd[0], pcd[1]): > - FromPcd.DefaultValue = pcd[2] > - break > if ToPcd.Pending and FromPcd.Type not in [None, '']: > ToPcd.Type = FromPcd.Type > elif (ToPcd.Type not in [None, '']) and (FromPcd.Type not in > [None, ''])\ > and (ToPcd.Type != FromPcd.Type) and (ToPcd.Type in > FromPcd.Type): > if ToPcd.Type.strip() == "DynamicEx": > diff --git a/BaseTools/Source/Python/AutoGen/GenPcdDb.py > b/BaseTools/Source/Python/AutoGen/GenPcdDb.py > index 82360ae57d..e2848e7aaf 100644 > --- a/BaseTools/Source/Python/AutoGen/GenPcdDb.py > +++ b/BaseTools/Source/Python/AutoGen/GenPcdDb.py > @@ -1182,16 +1182,10 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, > DynamicPcdList, Phase): > > for PcdItem in GlobalData.MixedPcd: > if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in > GlobalData.MixedPcd[PcdItem]: > CName = PcdItem[0] > > - if GlobalData.BuildOptionPcd: > - for PcdItem in GlobalData.BuildOptionPcd: > - if (Pcd.TokenSpaceGuidCName, CName) == (PcdItem[0], > PcdItem[1]): > - Pcd.DefaultValue = PcdItem[2] > - break > - > EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, > TokenSpaceGuidCName, Pcd.Phase, Phase)) > > if Pcd.Phase == 'PEI': > NumberOfPeiLocalTokens += 1 > if Pcd.Phase == 'DXE': > @@ -1503,16 +1497,10 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, > DynamicPcdList, Phase): > > for PcdItem in GlobalData.MixedPcd: > if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in > GlobalData.MixedPcd[PcdItem]: > CName = PcdItem[0] > > - if GlobalData.BuildOptionPcd: > - for PcdItem in GlobalData.BuildOptionPcd: > - if (Pcd.TokenSpaceGuidCName, CName) == (PcdItem[0], > PcdItem[1]): > - Pcd.DefaultValue = PcdItem[2] > - break > - > EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, > TokenSpaceGuidCName)) > EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase) > EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % > str(GeneratedTokenNumber)) > > # > diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py > b/BaseTools/Source/Python/Workspace/BuildClassObject.py > index edf2bdf4b9..711ba492ef 100644 > --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py > +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py > @@ -127,10 +127,12 @@ class StructurePcd(PcdClassObject): > self.StructName = None > self.PcdDefineLineNo = 0 > self.PkgPath = "" > self.DefaultValueFromDec = "" > self.ValueChain = dict() > + self.PcdValueFromComm = "" > + self.PcdFieldValueFromComm = collections.OrderedDict({}) > def __repr__(self): > return self.TypeName > > def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0): > if FieldName in self.DefaultValues: > @@ -186,10 +188,12 @@ class StructurePcd(PcdClassObject): > self.FlexibleFieldName = PcdObject.FlexibleFieldName if > PcdObject.FlexibleFieldName else self.FlexibleFieldName > self.StructName = PcdObject.DatumType if PcdObject.DatumType > else self.StructName > 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.PcdValueFromComm = PcdObject.PcdValueFromComm if > PcdObject.PcdValueFromComm else > self.PcdValueFromComm > + self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if > PcdObject.PcdFieldValueFromComm else > self.PcdFieldValueFromComm > > ## LibraryClassObject > # > # This Class defines LibraryClassObject used in BuildDatabase > # > diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > b/BaseTools/Source/Python/Workspace/DscBuildData.py > index a5089a900b..239531cd1c 100644 > --- a/BaseTools/Source/Python/Workspace/DscBuildData.py > +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > @@ -1131,14 +1131,15 @@ class DscBuildData(PlatformBuildClassObject): > > self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT)) > > self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII)) > > self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD)) > > self._Pcds = self.CompletePcdValues(self._Pcds) > + self._Pcds = self.OverrideByFdfCommOverAll(self._Pcds) > self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, > self._Pcds) > self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds) > self._Pcds = self._FilterPcdBySkuUsage(self._Pcds) > - self._Pcds = self.OverrideByFdfCommOverAll(self._Pcds) > + > self.RecoverCommandLinePcd() > return self._Pcds > > def _dumpPcdInfo(self,Pcds): > for pcd in Pcds: > @@ -1201,24 +1202,28 @@ class DscBuildData(PlatformBuildClassObject): > structure_pcd_data[(item[0],item[1])] = [] > structure_pcd_data[(item[0],item[1])].append(item) > > return structure_pcd_data > def OverrideByFdfComm(self,StruPcds): > - StructurePcdInCom = {(item[0],item[1],item[2] ):(item[3],item[4]) > for item in GlobalData.BuildOptionPcd if len(item) == 5 > and (item[1],item[0]) in StruPcds } if GlobalData.BuildOptionPcd else {} > + StructurePcdInCom = OrderedDict() > + for item in GlobalData.BuildOptionPcd: > + if len(item) == 5 and (item[1],item[0]) in StruPcds: > + StructurePcdInCom[(item[0],item[1],item[2] )] = > (item[3],item[4]) > GlobalPcds = set([(item[0],item[1]) for item in > StructurePcdInCom.keys()]) > for Pcd in StruPcds.values(): > if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds: > continue > - FieldValues = {item[2]:StructurePcdInCom[item] for item in > StructurePcdInCom if > (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]} > - for sku in Pcd.SkuOverrideValues: > - for defaultstore in Pcd.SkuOverrideValues[sku]: > - for field in FieldValues: > - if field not in > Pcd.SkuOverrideValues[sku][defaultstore]: > - Pcd.SkuOverrideValues[sku][defaultstore][field] > = ["","",""] > - Pcd.SkuOverrideValues[sku][defaultstore][field][0] = > FieldValues[field][0] > - Pcd.SkuOverrideValues[sku][defaultstore][field][1] = > FieldValues[field][1][0] > - Pcd.SkuOverrideValues[sku][defaultstore][field][2] = > FieldValues[field][1][1] > + FieldValues = OrderedDict() > + for item in StructurePcdInCom: > + if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == > (item[0],item[1]) and item[2]: > + FieldValues[item[2]] = StructurePcdInCom[item] > + for field in FieldValues: > + if field not in Pcd.PcdFieldValueFromComm: > + Pcd.PcdFieldValueFromComm[field] = ["","",""] > + Pcd.PcdFieldValueFromComm[field][0] = FieldValues[field][0] > + Pcd.PcdFieldValueFromComm[field][1] = > FieldValues[field][1][0] > + Pcd.PcdFieldValueFromComm[field][2] = > FieldValues[field][1][1] > return StruPcds > def OverrideByFdfCommOverAll(self,AllPcds): > def CheckStructureInComm(commpcds): > if not commpcds: > return False > @@ -1232,19 +1237,35 @@ class DscBuildData(PlatformBuildClassObject): > else: > NoFiledValues = {(item[0],item[1]):[item[2]] for item in > GlobalData.BuildOptionPcd} > for Guid,Name in NoFiledValues: > if (Name,Guid) in AllPcds: > Pcd = AllPcds.get((Name,Guid)) > - Pcd.DefaultValue = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > - for sku in Pcd.SkuInfoList: > - SkuInfo = Pcd.SkuInfoList[sku] > - if SkuInfo.DefaultValue: > - SkuInfo.DefaultValue = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > - else: > - SkuInfo.HiiDefaultValue = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > - for defaultstore in SkuInfo.DefaultStoreDict: > - SkuInfo.DefaultStoreDict[defaultstore] = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > + if > isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName), > None),StructurePcd): > + > self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName)).PcdValueFromComm = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > + else: > + Pcd.DefaultValue = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > + for sku in Pcd.SkuInfoList: > + SkuInfo = Pcd.SkuInfoList[sku] > + if SkuInfo.DefaultValue: > + SkuInfo.DefaultValue = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > + else: > + SkuInfo.HiiDefaultValue = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > + for defaultstore in SkuInfo.DefaultStoreDict: > + SkuInfo.DefaultStoreDict[defaultstore] = > NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0] > + if Pcd.DatumType == "VOID*": > + if Pcd.MaxDatumSize is None: > + Pcd.MaxDatumSize = '0' > + MaxSize = int(Pcd.MaxDatumSize,10) > + if Pcd.DefaultValue.startswith("{") and > Pcd.DefaultValue.endswith("}"): > + MaxSize = > max([len(Pcd.DefaultValue.split(",")),MaxSize]) > + elif Pcd.DefaultValue.startswith("\"") or > Pcd.DefaultValue.startswith("\'"): > + MaxSize = > max([len(Pcd.DefaultValue)-2+1,MaxSize]) > + elif Pcd.DefaultValue.startswith("L\""): > + MaxSize = > max([2*(len(Pcd.DefaultValue)-3+1),MaxSize]) > + else: > + MaxSize = max([len(Pcd.DefaultValue),MaxSize]) > + Pcd.MaxDatumSize = str(MaxSize) > else: > PcdInDec = self.DecPcds.get((Name,Guid)) > if PcdInDec: > if PcdInDec.Type in > [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], > > self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: > @@ -1541,14 +1562,12 @@ class DscBuildData(PlatformBuildClassObject): > if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > > 1: > return True > if Value[0] == '{' and Value[-1] == '}': > return True > if Value.startswith("L'") and Value.endswith("'") and > len(list(Value[2:-1])) > 1: > - print 'foo = ', list(Value[2:-1]) > return True > if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > > 1: > - print 'bar = ', list(Value[1:-1]) > return True > return False > > def ExecuteCommand (self, Command): > try: > @@ -1565,10 +1584,31 @@ class DscBuildData(PlatformBuildClassObject): > Result = Result + '\\x%02x' % (Value & 0xff) > Value = Value >> 8 > Result = Result + '"' > return Result > > + def GetPcdMaxSize(self,Pcd): > + MaxSize = int(Pcd.MaxDatumSize,10) if Pcd.MaxDatumSize else 0 > + if Pcd.DatumType not in > ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']: > + if Pcd.PcdValueFromComm: > + if Pcd.PcdValueFromComm.startswith("{") and > Pcd.PcdValueFromComm.endswith("}"): > + MaxSize = > max([len(Pcd.PcdValueFromComm.split(",")),MaxSize]) > + elif Pcd.PcdValueFromComm.startswith("\"") or > Pcd.PcdValueFromComm.startswith("\'"): > + MaxSize = max([len(Pcd.PcdValueFromComm)-2+1,MaxSize]) > + elif Pcd.PcdValueFromComm.startswith("L\""): > + MaxSize = > max([2*(len(Pcd.PcdValueFromComm)-3+1),MaxSize]) > + else: > + MaxSize = max([len(Pcd.PcdValueFromComm),MaxSize]) > + elif Pcd.DatumType not in ['BOOLEAN','UINT8']: > + MaxSize = 1 > + elif Pcd.DatumType == 'UINT16': > + MaxSize = 2 > + elif Pcd.DatumType == 'UINT32': > + MaxSize = 4 > + elif Pcd.DatumType == 'UINT64': > + MaxSize = 8 > + return MaxSize > def GenerateSizeFunction(self,Pcd): > CApp = "// Default Value in Dec \n" > CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > for FieldList in [Pcd.DefaultValues]: > if not FieldList: > @@ -1623,10 +1663,35 @@ class DscBuildData(PlatformBuildClassObject): > FieldName = FieldName.split(']', 1)[1] > FieldName = NewFieldName + FieldName > while '[' in FieldName: > FieldName = FieldName.rsplit('[', 1)[0] > CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, > %s, %d); // From %s Line %d Value %s \n' % > (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, > FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], > FieldList[FieldName_ori][0]) > + if Pcd.PcdFieldValueFromComm: > + CApp = CApp + "// From Command Line \n" > + for FieldName in Pcd.PcdFieldValueFromComm: > + FieldName = "." + FieldName > + IsArray = > self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0]) > + if IsArray and not > (FieldList[FieldName.strip(".")][0].startswith('{GUID') and > FieldList[FieldName.strip(".")][0].endswith('}')): > + try: > + Value = > ValueExpressionEx(FieldList[FieldName.strip(".")][0], "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.strip('.'))), > FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2])) > + Value, ValueSize = ParseFieldValue(Value) > + CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / > __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% > __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % > (Pcd.DatumType, FieldName.strip("."), ValueSize, > Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, > FieldName.strip("."), FieldList[FieldName.strip(".")][1], > FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]); > + else: > + NewFieldName = '' > + FieldName_ori = FieldName.strip('.') > + while '[' in FieldName: > + NewFieldName = NewFieldName + FieldName.split('[', 1)[0] > + '[0]' > + ArrayIndex = int(FieldName.split('[', 1)[1].split(']', > 1)[0]) > + FieldName = FieldName.split(']', 1)[1] > + FieldName = NewFieldName + FieldName > + while '[' in FieldName: > + FieldName = FieldName.rsplit('[', 1)[0] > + CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // > From %s Line %d Value %s \n' % (Pcd.DatumType, > FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], > FieldList[FieldName_ori][2], FieldList[FieldName_ori][0]) > + CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd > maxsize is %d \n" % > (self.GetPcdMaxSize(Pcd),self.GetPcdMaxSize(Pcd),self.GetPcdMaxSize(Pcd)) > CApp = CApp + "}\n" > return CApp > def GenerateSizeStatments(self,Pcd): > CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType) > CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > @@ -1762,10 +1827,72 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + "}\n" > return CApp > def GenerateInitValueStatement(self,Pcd,SkuName,DefaultStoreName): > CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % > (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName,DefaultStoreName) > return CApp > + def GenerateCommandLineValue(self,Pcd): > + CApp = "// Value in CommandLine\n" > + CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,Pcd.DatumType) > + CApp = CApp + ' UINT32 FieldSize;\n' > + CApp = CApp + ' CHAR8 *Value;\n' > + > + pcddefaultvalue = Pcd.PcdValueFromComm > + for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromComm]: > + if not FieldList: > + continue > + if pcddefaultvalue and FieldList == pcddefaultvalue: > + IsArray = self.IsFieldValueAnArray(FieldList) > + if IsArray: > + try: > + FieldList = ValueExpressionEx(FieldList, > "VOID*")(True) > + except BadExpression: > + EdkLogger.error("Build", FORMAT_INVALID, "Invalid > value format for %s.%s, from DSC: %s" % > + (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName, FieldList)) > + Value, ValueSize = ParseFieldValue (FieldList) > + > + if isinstance(Value, str): > + CApp = CApp + ' Pcd = %s; // From Command Line \n' % > (Value) > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + CApp = CApp + ' Value = %s; // From Command > Line.\n' % (self.IntToCString(Value, ValueSize)) > + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % > (ValueSize) > + continue > + for FieldName in FieldList: > + IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0]) > + if IsArray: > + try: > + FieldList[FieldName][0] = > ValueExpressionEx(FieldList[FieldName][0], "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.DatumType, FieldName) > + CApp = CApp + ' Value = %s; // From %s Line %d > Value %s\n' % (self.IntToCString(Value, ValueSize), > 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 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 > + def GenerateCommandLineValueStatement(self,Pcd): > + CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + return CApp > def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, > InitByteValue, CApp): > OverrideValues = {DefaultStore:""} > if Pcd.SkuOverrideValues: > OverrideValues = Pcd.SkuOverrideValues[SkuName] > for DefaultStoreName in OverrideValues.keys(): > @@ -1833,10 +1960,11 @@ class DscBuildData(PlatformBuildClassObject): > if skuname == SkuName: > break > else: > CApp = CApp + "// SkuName: DEFAULT, DefaultStoreName: > STANDARD \n" > CApp = CApp + > self.GenerateInitValueStatement(Pcd,"DEFAULT","STANDARD") > + CApp = CApp + self.GenerateCommandLineValueStatement(Pcd) > # > # Set new PCD value and size > # > CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 > *)Pcd);\n' % (SkuName, DefaultStoreName, > Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > > @@ -1868,10 +1996,11 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + '\n' > for PcdName in StructuredPcds: > Pcd = StructuredPcds[PcdName] > CApp = CApp + self.GenerateSizeFunction(Pcd) > CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd) > + CApp = CApp + self.GenerateCommandLineValue(Pcd) > if not 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, 'STANDARD') > else: > for SkuName in self.SkuIdMgr.SkuOverrideOrder(): > @@ -2372,11 +2501,11 @@ class DscBuildData(PlatformBuildClassObject): > > if pcd.MaxDatumSize.strip(): > MaxSize = int(pcd.MaxDatumSize, 0) > else: > MaxSize = 0 > - if pcdDecObject.DatumType == 'VOID*': > + if pcd.DatumType not in > ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']: > for (_, skuobj) in pcd.SkuInfoList.items(): > datalen = 0 > skuobj.HiiDefaultValue = > StringToArray(skuobj.HiiDefaultValue) > datalen = len(skuobj.HiiDefaultValue.split(",")) > if datalen > MaxSize: > diff --git a/BaseTools/Source/Python/build/build.py > b/BaseTools/Source/Python/build/build.py > index bb130a02cc..85612d90ce 100644 > --- a/BaseTools/Source/Python/build/build.py > +++ b/BaseTools/Source/Python/build/build.py > @@ -770,11 +770,11 @@ class Build(): > self.TargetTxt = TargetTxtClassObject() > self.ToolDef = ToolDefClassObject() > self.AutoGenTime = 0 > self.MakeTime = 0 > self.GenFdsTime = 0 > - GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if > BuildOptions.OptionPcd else {} > + GlobalData.BuildOptionPcd = BuildOptions.OptionPcd if > BuildOptions.OptionPcd else [] > #Set global flag for build mode > GlobalData.gIgnoreSource = BuildOptions.IgnoreSources > GlobalData.gUseHashCache = BuildOptions.UseHashCache > GlobalData.gBinCacheDest = BuildOptions.BinCacheDest > GlobalData.gBinCacheSource = BuildOptions.BinCacheSource > -- > 2.14.3.windows.1 > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

