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 <bob.c.feng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@ -1368,27 +1368,6 @@ class PlatformAutoGen(AutoGen):
|
|||||||
# This interface should be invoked explicitly when platform action is created.
|
# This interface should be invoked explicitly when platform action is created.
|
||||||
#
|
#
|
||||||
def CollectPlatformDynamicPcds(self):
|
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 key in self.Platform.Pcds:
|
||||||
for SinglePcd in GlobalData.MixedPcd:
|
for SinglePcd in GlobalData.MixedPcd:
|
||||||
@ -2373,11 +2352,6 @@ class PlatformAutoGen(AutoGen):
|
|||||||
TokenCName = PcdItem[0]
|
TokenCName = PcdItem[0]
|
||||||
break
|
break
|
||||||
if FromPcd != None:
|
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, '']:
|
if ToPcd.Pending and FromPcd.Type not in [None, '']:
|
||||||
ToPcd.Type = FromPcd.Type
|
ToPcd.Type = FromPcd.Type
|
||||||
elif (ToPcd.Type not in [None, '']) and (FromPcd.Type not in [None, ''])\
|
elif (ToPcd.Type not in [None, '']) and (FromPcd.Type not in [None, ''])\
|
||||||
|
@ -1184,12 +1184,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
|
|||||||
if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:
|
if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:
|
||||||
CName = PcdItem[0]
|
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))
|
EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))
|
||||||
|
|
||||||
if Pcd.Phase == 'PEI':
|
if Pcd.Phase == 'PEI':
|
||||||
@ -1505,12 +1499,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
|
|||||||
if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:
|
if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:
|
||||||
CName = PcdItem[0]
|
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, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))
|
||||||
EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)
|
EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)
|
||||||
EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))
|
EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))
|
||||||
|
@ -129,6 +129,8 @@ class StructurePcd(PcdClassObject):
|
|||||||
self.PkgPath = ""
|
self.PkgPath = ""
|
||||||
self.DefaultValueFromDec = ""
|
self.DefaultValueFromDec = ""
|
||||||
self.ValueChain = dict()
|
self.ValueChain = dict()
|
||||||
|
self.PcdValueFromComm = ""
|
||||||
|
self.PcdFieldValueFromComm = collections.OrderedDict({})
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return self.TypeName
|
return self.TypeName
|
||||||
|
|
||||||
@ -188,6 +190,8 @@ class StructurePcd(PcdClassObject):
|
|||||||
self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo
|
self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo
|
||||||
self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath
|
self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath
|
||||||
self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain
|
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
|
## LibraryClassObject
|
||||||
#
|
#
|
||||||
|
@ -1133,10 +1133,11 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))
|
self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))
|
||||||
|
|
||||||
self._Pcds = self.CompletePcdValues(self._Pcds)
|
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.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)
|
||||||
self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)
|
self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)
|
||||||
self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)
|
self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)
|
||||||
self._Pcds = self.OverrideByFdfCommOverAll(self._Pcds)
|
|
||||||
self.RecoverCommandLinePcd()
|
self.RecoverCommandLinePcd()
|
||||||
return self._Pcds
|
return self._Pcds
|
||||||
|
|
||||||
@ -1203,20 +1204,24 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
|
|
||||||
return structure_pcd_data
|
return structure_pcd_data
|
||||||
def OverrideByFdfComm(self,StruPcds):
|
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()])
|
GlobalPcds = set([(item[0],item[1]) for item in StructurePcdInCom.keys()])
|
||||||
for Pcd in StruPcds.values():
|
for Pcd in StruPcds.values():
|
||||||
if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:
|
if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:
|
||||||
continue
|
continue
|
||||||
FieldValues = {item[2]:StructurePcdInCom[item] for item in StructurePcdInCom if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]}
|
FieldValues = OrderedDict()
|
||||||
for sku in Pcd.SkuOverrideValues:
|
for item in StructurePcdInCom:
|
||||||
for defaultstore in Pcd.SkuOverrideValues[sku]:
|
if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]:
|
||||||
for field in FieldValues:
|
FieldValues[item[2]] = StructurePcdInCom[item]
|
||||||
if field not in Pcd.SkuOverrideValues[sku][defaultstore]:
|
for field in FieldValues:
|
||||||
Pcd.SkuOverrideValues[sku][defaultstore][field] = ["","",""]
|
if field not in Pcd.PcdFieldValueFromComm:
|
||||||
Pcd.SkuOverrideValues[sku][defaultstore][field][0] = FieldValues[field][0]
|
Pcd.PcdFieldValueFromComm[field] = ["","",""]
|
||||||
Pcd.SkuOverrideValues[sku][defaultstore][field][1] = FieldValues[field][1][0]
|
Pcd.PcdFieldValueFromComm[field][0] = FieldValues[field][0]
|
||||||
Pcd.SkuOverrideValues[sku][defaultstore][field][2] = FieldValues[field][1][1]
|
Pcd.PcdFieldValueFromComm[field][1] = FieldValues[field][1][0]
|
||||||
|
Pcd.PcdFieldValueFromComm[field][2] = FieldValues[field][1][1]
|
||||||
return StruPcds
|
return StruPcds
|
||||||
def OverrideByFdfCommOverAll(self,AllPcds):
|
def OverrideByFdfCommOverAll(self,AllPcds):
|
||||||
def CheckStructureInComm(commpcds):
|
def CheckStructureInComm(commpcds):
|
||||||
@ -1234,15 +1239,31 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
for Guid,Name in NoFiledValues:
|
for Guid,Name in NoFiledValues:
|
||||||
if (Name,Guid) in AllPcds:
|
if (Name,Guid) in AllPcds:
|
||||||
Pcd = AllPcds.get((Name,Guid))
|
Pcd = AllPcds.get((Name,Guid))
|
||||||
Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]
|
if isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName), None),StructurePcd):
|
||||||
for sku in Pcd.SkuInfoList:
|
self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName)).PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]
|
||||||
SkuInfo = Pcd.SkuInfoList[sku]
|
else:
|
||||||
if SkuInfo.DefaultValue:
|
Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]
|
||||||
SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]
|
for sku in Pcd.SkuInfoList:
|
||||||
else:
|
SkuInfo = Pcd.SkuInfoList[sku]
|
||||||
SkuInfo.HiiDefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]
|
if SkuInfo.DefaultValue:
|
||||||
for defaultstore in SkuInfo.DefaultStoreDict:
|
SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]
|
||||||
SkuInfo.DefaultStoreDict[defaultstore] = 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:
|
else:
|
||||||
PcdInDec = self.DecPcds.get((Name,Guid))
|
PcdInDec = self.DecPcds.get((Name,Guid))
|
||||||
if PcdInDec:
|
if PcdInDec:
|
||||||
@ -1543,10 +1564,8 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
if Value[0] == '{' and Value[-1] == '}':
|
if Value[0] == '{' and Value[-1] == '}':
|
||||||
return True
|
return True
|
||||||
if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:
|
if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:
|
||||||
print 'foo = ', list(Value[2:-1])
|
|
||||||
return True
|
return True
|
||||||
if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:
|
if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:
|
||||||
print 'bar = ', list(Value[1:-1])
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -1567,6 +1586,27 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
Result = Result + '"'
|
Result = Result + '"'
|
||||||
return 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):
|
def GenerateSizeFunction(self,Pcd):
|
||||||
CApp = "// Default Value in Dec \n"
|
CApp = "// Default Value in Dec \n"
|
||||||
CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||||
@ -1625,6 +1665,31 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
while '[' in FieldName:
|
while '[' in FieldName:
|
||||||
FieldName = FieldName.rsplit('[', 1)[0]
|
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 + ' __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"
|
CApp = CApp + "}\n"
|
||||||
return CApp
|
return CApp
|
||||||
def GenerateSizeStatments(self,Pcd):
|
def GenerateSizeStatments(self,Pcd):
|
||||||
@ -1764,6 +1829,68 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
def GenerateInitValueStatement(self,Pcd,SkuName,DefaultStoreName):
|
def GenerateInitValueStatement(self,Pcd,SkuName,DefaultStoreName):
|
||||||
CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,DefaultStoreName)
|
CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,DefaultStoreName)
|
||||||
return CApp
|
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):
|
def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):
|
||||||
OverrideValues = {DefaultStore:""}
|
OverrideValues = {DefaultStore:""}
|
||||||
if Pcd.SkuOverrideValues:
|
if Pcd.SkuOverrideValues:
|
||||||
@ -1835,6 +1962,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
else:
|
else:
|
||||||
CApp = CApp + "// SkuName: DEFAULT, DefaultStoreName: STANDARD \n"
|
CApp = CApp + "// SkuName: DEFAULT, DefaultStoreName: STANDARD \n"
|
||||||
CApp = CApp + self.GenerateInitValueStatement(Pcd,"DEFAULT","STANDARD")
|
CApp = CApp + self.GenerateInitValueStatement(Pcd,"DEFAULT","STANDARD")
|
||||||
|
CApp = CApp + self.GenerateCommandLineValueStatement(Pcd)
|
||||||
#
|
#
|
||||||
# Set new PCD value and size
|
# Set new PCD value and size
|
||||||
#
|
#
|
||||||
@ -1870,6 +1998,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
Pcd = StructuredPcds[PcdName]
|
Pcd = StructuredPcds[PcdName]
|
||||||
CApp = CApp + self.GenerateSizeFunction(Pcd)
|
CApp = CApp + self.GenerateSizeFunction(Pcd)
|
||||||
CApp = CApp + self.GenerateDefaultValueAssignFunction(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],
|
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]]:
|
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:
|
||||||
CApp = CApp + self.GenerateInitValueFunction(Pcd,self.SkuIdMgr.SystemSkuId, 'STANDARD')
|
CApp = CApp + self.GenerateInitValueFunction(Pcd,self.SkuIdMgr.SystemSkuId, 'STANDARD')
|
||||||
@ -2374,7 +2503,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||||||
MaxSize = int(pcd.MaxDatumSize, 0)
|
MaxSize = int(pcd.MaxDatumSize, 0)
|
||||||
else:
|
else:
|
||||||
MaxSize = 0
|
MaxSize = 0
|
||||||
if pcdDecObject.DatumType == 'VOID*':
|
if pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:
|
||||||
for (_, skuobj) in pcd.SkuInfoList.items():
|
for (_, skuobj) in pcd.SkuInfoList.items():
|
||||||
datalen = 0
|
datalen = 0
|
||||||
skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)
|
skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)
|
||||||
|
@ -772,7 +772,7 @@ class Build():
|
|||||||
self.AutoGenTime = 0
|
self.AutoGenTime = 0
|
||||||
self.MakeTime = 0
|
self.MakeTime = 0
|
||||||
self.GenFdsTime = 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
|
#Set global flag for build mode
|
||||||
GlobalData.gIgnoreSource = BuildOptions.IgnoreSources
|
GlobalData.gIgnoreSource = BuildOptions.IgnoreSources
|
||||||
GlobalData.gUseHashCache = BuildOptions.UseHashCache
|
GlobalData.gUseHashCache = BuildOptions.UseHashCache
|
||||||
|
Reference in New Issue
Block a user