How concerned with spaces in the DSC lines are we? The following looks very sensitive to spaces and could be replaced with a regular expression that would be more flexible.
if "{CODE(" not in PcdValue: aprox: if re.match('[{]\w*CODE\w*[(]', PcdValue) > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > BobCF > Sent: Wednesday, November 07, 2018 1:19 AM > To: edk2-devel@lists.01.org > Cc: Gao, Liming <liming....@intel.com> > Subject: [edk2] [PATCH] BaseTools: Enable Pcd Array support. > > From: "bob.c.f...@intel.com" <bob.c.f...@intel.com> > > https://bugzilla.tianocore.org/show_bug.cgi?id=1292 > > This patch is going to enable Array data type for PCD. > > 1. Support Pcd ARRAY as Structure PCD type > including basic datatype array and structure array. > For example: > gStructuredPcdPkgTokenSpaceGuid.PcdTest|{0x0}|TEST[10]|0x00010080 > > gStructuredPcdPkgTokenSpaceGuid.PcdTest2|{0x0}|UINT8[10]|0x00010081 > 2. Support C CODE style value initialization in DEC/DSC. > For example: > gStructuredPcdPkgTokenSpaceGuid.PcdTest|{CODE({ > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > {0, {0, 0, 0, 0, 0, 0, 0}}, > })} > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Bob Feng <bob.c.f...@intel.com> > Cc: Liming Gao <liming....@intel.com> > --- > BaseTools/Source/Python/Common/Expression.py | 396 +++++++++-------- > - > BaseTools/Source/Python/Common/Misc.py | 2 + > .../Python/Workspace/BuildClassObject.py | 85 +++- > .../Source/Python/Workspace/DecBuildData.py | 29 +- > .../Source/Python/Workspace/DscBuildData.py | 384 +++++++++++------ > .../Source/Python/Workspace/MetaFileParser.py | 86 +++- > 6 files changed, 644 insertions(+), 338 deletions(-) > > diff --git a/BaseTools/Source/Python/Common/Expression.py > b/BaseTools/Source/Python/Common/Expression.py > index a21ab5daa7..f6e245be70 100644 > --- a/BaseTools/Source/Python/Common/Expression.py > +++ b/BaseTools/Source/Python/Common/Expression.py > @@ -820,221 +820,219 @@ class ValueExpressionEx(ValueExpression): > > def __call__(self, RealValue=False, Depth=0): > PcdValue = self.PcdValue > - try: > - PcdValue = ValueExpression.__call__(self, RealValue, Depth) > - if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or > PcdValue.startswith("L'")): > - PcdValue, Size = ParseFieldValue(PcdValue) > - PcdValueList = [] > - for I in range(Size): > - PcdValueList.append('0x%02X'%(PcdValue & 0xff)) > - PcdValue = PcdValue >> 8 > - PcdValue = '{' + ','.join(PcdValueList) + '}' > - elif self.PcdType in TAB_PCD_NUMERIC_TYPES and > (PcdValue.startswith("'") or \ > - PcdValue.startswith('"') or PcdValue.startswith("L'") > or > PcdValue.startswith('L"') or PcdValue.startswith('{')): > - raise BadExpression > - except WrnExpression as Value: > - PcdValue = Value.result > - except BadExpression as Value: > - if self.PcdType in TAB_PCD_NUMERIC_TYPES: > - PcdValue = PcdValue.strip() > - if PcdValue.startswith('{') and PcdValue.endswith('}'): > - PcdValue = SplitPcdValueString(PcdValue[1:-1]) > - if ERR_STRING_CMP.split(':')[0] in Value.message: > - raise BadExpression("Type: %s, Value: %s, %s" % > (self.PcdType, > PcdValue, Value)) > - if isinstance(PcdValue, type([])): > - TmpValue = 0 > - Size = 0 > - ValueType = '' > - for Item in PcdValue: > - Item = Item.strip() > - if Item.startswith(TAB_UINT8): > - ItemSize = 1 > - ValueType = TAB_UINT8 > - elif Item.startswith(TAB_UINT16): > - ItemSize = 2 > - ValueType = TAB_UINT16 > - elif Item.startswith(TAB_UINT32): > - ItemSize = 4 > - ValueType = TAB_UINT32 > - elif Item.startswith(TAB_UINT64): > - ItemSize = 8 > - ValueType = TAB_UINT64 > - elif Item[0] in {'"', "'", 'L'}: > - ItemSize = 0 > - ValueType = TAB_VOID > - else: > - ItemSize = 0 > - ValueType = TAB_UINT8 > - Item = ValueExpressionEx(Item, ValueType, > self._Symb)(True) > - > - if ItemSize == 0: > - try: > - tmpValue = int(Item, 0) > - if tmpValue > 255: > - raise BadExpression("Byte array number > %s should less > than 0xFF." % Item) > - except BadExpression as Value: > - raise BadExpression(Value) > - except ValueError: > - pass > - ItemValue, ItemSize = ParseFieldValue(Item) > - else: > - ItemValue = ParseFieldValue(Item)[0] > - > - if isinstance(ItemValue, type('')): > - ItemValue = int(ItemValue, 0) > - > - TmpValue = (ItemValue << (Size * 8)) | TmpValue > - Size = Size + ItemSize > - else: > - try: > - TmpValue, Size = ParseFieldValue(PcdValue) > - except BadExpression as Value: > - raise BadExpression("Type: %s, Value: %s, %s" % > (self.PcdType, > PcdValue, Value)) > - if isinstance(TmpValue, type('')): > - try: > - TmpValue = int(TmpValue) > - except: > - raise BadExpression(Value) > - else: > - PcdValue = '0x%0{}X'.format(Size) % (TmpValue) > - if TmpValue < 0: > - raise BadExpression('Type %s PCD Value is negative' % > self.PcdType) > - if self.PcdType == TAB_UINT8 and Size > 1: > - raise BadExpression('Type %s PCD Value Size is Larger > than 1 byte' > % self.PcdType) > - if self.PcdType == TAB_UINT16 and Size > 2: > - raise BadExpression('Type %s PCD Value Size is Larger > than 2 byte' > % self.PcdType) > - if self.PcdType == TAB_UINT32 and Size > 4: > - raise BadExpression('Type %s PCD Value Size is Larger > than 4 byte' > % self.PcdType) > - if self.PcdType == TAB_UINT64 and Size > 8: > - raise BadExpression('Type %s PCD Value Size is Larger > than 8 byte' > % self.PcdType) > - else: > - try: > - TmpValue = int(PcdValue) > - TmpList = [] > - if TmpValue.bit_length() == 0: > - PcdValue = '{0x00}' > - else: > - for I in range((TmpValue.bit_length() + 7) / 8): > - TmpList.append('0x%02x' % ((TmpValue >> I * 8) & > 0xff)) > - PcdValue = '{' + ', '.join(TmpList) + '}' > - except: > - if PcdValue.strip().startswith('{'): > - PcdValueList = > SplitPcdValueString(PcdValue.strip()[1:-1]) > - LabelDict = {} > - NewPcdValueList = [] > - LabelOffset = 0 > - for Item in PcdValueList: > - # compute byte offset of every LABEL > - LabelList = _ReLabel.findall(Item) > - Item = _ReLabel.sub('', Item) > + if "{CODE(" not in PcdValue: > + try: > + PcdValue = ValueExpression.__call__(self, RealValue, Depth) > + if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or > PcdValue.startswith("L'")): > + PcdValue, Size = ParseFieldValue(PcdValue) > + PcdValueList = [] > + for I in range(Size): > + PcdValueList.append('0x%02X'%(PcdValue & 0xff)) > + PcdValue = PcdValue >> 8 > + PcdValue = '{' + ','.join(PcdValueList) + '}' > + elif self.PcdType in TAB_PCD_NUMERIC_TYPES and > (PcdValue.startswith("'") or \ > + PcdValue.startswith('"') or > PcdValue.startswith("L'") or > PcdValue.startswith('L"') or PcdValue.startswith('{')): > + raise BadExpression > + except WrnExpression as Value: > + PcdValue = Value.result > + except BadExpression as Value: > + if self.PcdType in TAB_PCD_NUMERIC_TYPES: > + PcdValue = PcdValue.strip() > + if PcdValue.startswith('{') and PcdValue.endswith('}'): > + PcdValue = SplitPcdValueString(PcdValue[1:-1]) > + if isinstance(PcdValue, type([])): > + TmpValue = 0 > + Size = 0 > + ValueType = '' > + for Item in PcdValue: > Item = Item.strip() > - if LabelList: > - for Label in LabelList: > - if not IsValidCName(Label): > - raise BadExpression('%s is not a > valid c variable name' % > Label) > - if Label not in LabelDict: > - LabelDict[Label] = str(LabelOffset) > if Item.startswith(TAB_UINT8): > - LabelOffset = LabelOffset + 1 > + ItemSize = 1 > + ValueType = TAB_UINT8 > elif Item.startswith(TAB_UINT16): > - LabelOffset = LabelOffset + 2 > + ItemSize = 2 > + ValueType = TAB_UINT16 > elif Item.startswith(TAB_UINT32): > - LabelOffset = LabelOffset + 4 > + ItemSize = 4 > + ValueType = TAB_UINT32 > elif Item.startswith(TAB_UINT64): > - LabelOffset = LabelOffset + 8 > + ItemSize = 8 > + ValueType = TAB_UINT64 > + elif Item[0] in {'"', "'", 'L'}: > + ItemSize = 0 > + ValueType = TAB_VOID > else: > + ItemSize = 0 > + ValueType = TAB_UINT8 > + Item = ValueExpressionEx(Item, ValueType, > self._Symb)(True) > + if ItemSize == 0: > try: > - ItemValue, ItemSize = > ParseFieldValue(Item) > - LabelOffset = LabelOffset + ItemSize > - except: > - LabelOffset = LabelOffset + 1 > - > - for Item in PcdValueList: > - # for LABEL parse > - Item = Item.strip() > - try: > - Item = _ReLabel.sub('', Item) > - except: > - pass > - try: > - OffsetList = _ReOffset.findall(Item) > - except: > - pass > - # replace each offset, except errors > - for Offset in OffsetList: > - try: > - Item = > Item.replace('OFFSET_OF({})'.format(Offset), > LabelDict[Offset]) > - except: > - raise BadExpression('%s not defined' % > Offset) > - > - NewPcdValueList.append(Item) > - > - AllPcdValueList = [] > - for Item in NewPcdValueList: > - Size = 0 > - ValueStr = '' > - TokenSpaceGuidName = '' > - if Item.startswith(TAB_GUID) and > Item.endswith(')'): > - try: > - TokenSpaceGuidName = > re.search('GUID\((\w+)\)', > Item).group(1) > - except: > + tmpValue = int(Item, 0) > + if tmpValue > 255: > + raise BadExpression("Byte array > number %s should less > than 0xFF." % Item) > + except BadExpression as Value: > + raise BadExpression(Value) > + except ValueError: > pass > - if TokenSpaceGuidName and TokenSpaceGuidName > in > self._Symb: > - Item = 'GUID(' + > self._Symb[TokenSpaceGuidName] + ')' > - elif TokenSpaceGuidName: > - raise BadExpression('%s not found in DEC > file' % > TokenSpaceGuidName) > - Item, Size = ParseFieldValue(Item) > - for Index in range(0, Size): > - ValueStr = '0x%02X' % (int(Item) & 255) > - Item >>= 8 > - AllPcdValueList.append(ValueStr) > - continue > - elif Item.startswith('DEVICE_PATH') and > Item.endswith(')'): > - Item, Size = ParseFieldValue(Item) > - AllPcdValueList.append(Item[1:-1]) > - continue > + ItemValue, ItemSize = ParseFieldValue(Item) > else: > - ValueType = "" > + ItemValue = ParseFieldValue(Item)[0] > + > + if isinstance(ItemValue, type('')): > + ItemValue = int(ItemValue, 0) > + > + TmpValue = (ItemValue << (Size * 8)) | TmpValue > + Size = Size + ItemSize > + else: > + try: > + TmpValue, Size = ParseFieldValue(PcdValue) > + except BadExpression as Value: > + raise BadExpression("Type: %s, Value: %s, %s" % > (self.PcdType, PcdValue, Value)) > + if isinstance(TmpValue, type('')): > + try: > + TmpValue = int(TmpValue) > + except: > + raise BadExpression(Value) > + else: > + PcdValue = '0x%0{}X'.format(Size) % (TmpValue) > + if TmpValue < 0: > + raise BadExpression('Type %s PCD Value is negative' > % > self.PcdType) > + if self.PcdType == TAB_UINT8 and Size > 1: > + raise BadExpression('Type %s PCD Value Size is > Larger than 1 > byte' % self.PcdType) > + if self.PcdType == TAB_UINT16 and Size > 2: > + raise BadExpression('Type %s PCD Value Size is > Larger than 2 > byte' % self.PcdType) > + if self.PcdType == TAB_UINT32 and Size > 4: > + raise BadExpression('Type %s PCD Value Size is > Larger than 4 > byte' % self.PcdType) > + if self.PcdType == TAB_UINT64 and Size > 8: > + raise BadExpression('Type %s PCD Value Size is > Larger than 8 > byte' % self.PcdType) > + else: > + try: > + TmpValue = int(PcdValue) > + TmpList = [] > + if TmpValue.bit_length() == 0: > + PcdValue = '{0x00}' > + else: > + for I in range((TmpValue.bit_length() + 7) / 8): > + TmpList.append('0x%02x' % ((TmpValue >> I * > 8) & 0xff)) > + PcdValue = '{' + ', '.join(TmpList) + '}' > + except: > + if PcdValue.strip().startswith('{'): > + PcdValueList = > SplitPcdValueString(PcdValue.strip()[1:-1]) > + LabelDict = {} > + NewPcdValueList = [] > + LabelOffset = 0 > + for Item in PcdValueList: > + # compute byte offset of every LABEL > + LabelList = _ReLabel.findall(Item) > + Item = _ReLabel.sub('', Item) > + Item = Item.strip() > + if LabelList: > + for Label in LabelList: > + if not IsValidCName(Label): > + raise BadExpression('%s is not a > valid c variable name' > % Label) > + if Label not in LabelDict: > + LabelDict[Label] = > str(LabelOffset) > if Item.startswith(TAB_UINT8): > - ItemSize = 1 > - ValueType = TAB_UINT8 > + LabelOffset = LabelOffset + 1 > elif Item.startswith(TAB_UINT16): > - ItemSize = 2 > - ValueType = TAB_UINT16 > + LabelOffset = LabelOffset + 2 > elif Item.startswith(TAB_UINT32): > - ItemSize = 4 > - ValueType = TAB_UINT32 > + LabelOffset = LabelOffset + 4 > elif Item.startswith(TAB_UINT64): > - ItemSize = 8 > - ValueType = TAB_UINT64 > - else: > - ItemSize = 0 > - if ValueType: > - TmpValue = ValueExpressionEx(Item, > ValueType, > self._Symb)(True) > + LabelOffset = LabelOffset + 8 > else: > - TmpValue = ValueExpressionEx(Item, > self.PcdType, > self._Symb)(True) > - Item = '0x%x' % TmpValue if not > isinstance(TmpValue, > type('')) else TmpValue > - if ItemSize == 0: > - ItemValue, ItemSize = > ParseFieldValue(Item) > - if Item[0] not in {'"', 'L', '{'} and > ItemSize > 1: > - raise BadExpression("Byte array > number %s should less > than 0xFF." % Item) > + try: > + ItemValue, ItemSize = > ParseFieldValue(Item) > + LabelOffset = LabelOffset + ItemSize > + except: > + LabelOffset = LabelOffset + 1 > + > + for Item in PcdValueList: > + # for LABEL parse > + Item = Item.strip() > + try: > + Item = _ReLabel.sub('', Item) > + except: > + pass > + try: > + OffsetList = _ReOffset.findall(Item) > + except: > + pass > + # replace each offset, except errors > + for Offset in OffsetList: > + try: > + Item = > Item.replace('OFFSET_OF({})'.format(Offset), > LabelDict[Offset]) > + except: > + raise BadExpression('%s not defined' > % Offset) > + > + NewPcdValueList.append(Item) > + > + AllPcdValueList = [] > + for Item in NewPcdValueList: > + Size = 0 > + ValueStr = '' > + TokenSpaceGuidName = '' > + if Item.startswith(TAB_GUID) and > Item.endswith(')'): > + try: > + TokenSpaceGuidName = > re.search('GUID\((\w+)\)', > Item).group(1) > + except: > + pass > + if TokenSpaceGuidName and > TokenSpaceGuidName in > self._Symb: > + Item = 'GUID(' + > self._Symb[TokenSpaceGuidName] + > ')' > + elif TokenSpaceGuidName: > + raise BadExpression('%s not found in > DEC file' % > TokenSpaceGuidName) > + Item, Size = ParseFieldValue(Item) > + for Index in range(0, Size): > + ValueStr = '0x%02X' % (int(Item) & > 255) > + Item >>= 8 > + AllPcdValueList.append(ValueStr) > + continue > + elif Item.startswith('DEVICE_PATH') and > Item.endswith(')'): > + Item, Size = ParseFieldValue(Item) > + AllPcdValueList.append(Item[1:-1]) > + continue > else: > - ItemValue = ParseFieldValue(Item)[0] > - for I in range(0, ItemSize): > - ValueStr = '0x%02X' % (int(ItemValue) & > 255) > - ItemValue >>= 8 > - AllPcdValueList.append(ValueStr) > - Size += ItemSize > - > - if Size > 0: > - PcdValue = '{' + ','.join(AllPcdValueList) + '}' > - else: > - raise BadExpression("Type: %s, Value: %s, > %s"%(self.PcdType, > PcdValue, Value)) > + ValueType = "" > + if Item.startswith(TAB_UINT8): > + ItemSize = 1 > + ValueType = TAB_UINT8 > + elif Item.startswith(TAB_UINT16): > + ItemSize = 2 > + ValueType = TAB_UINT16 > + elif Item.startswith(TAB_UINT32): > + ItemSize = 4 > + ValueType = TAB_UINT32 > + elif Item.startswith(TAB_UINT64): > + ItemSize = 8 > + ValueType = TAB_UINT64 > + else: > + ItemSize = 0 > + if ValueType: > + TmpValue = ValueExpressionEx(Item, > ValueType, > self._Symb)(True) > + else: > + TmpValue = ValueExpressionEx(Item, > self.PcdType, > self._Symb)(True) > + Item = '0x%x' % TmpValue if not > isinstance(TmpValue, > type('')) else TmpValue > + if ItemSize == 0: > + ItemValue, ItemSize = > ParseFieldValue(Item) > + if Item[0] not in {'"', 'L', '{'} > and ItemSize > 1: > + raise BadExpression("Byte array > number %s should > less than 0xFF." % Item) > + else: > + ItemValue = ParseFieldValue(Item)[0] > + for I in range(0, ItemSize): > + ValueStr = '0x%02X' % > (int(ItemValue) & 255) > + ItemValue >>= 8 > + AllPcdValueList.append(ValueStr) > + Size += ItemSize > + > + if Size > 0: > + PcdValue = '{' + ','.join(AllPcdValueList) + > '}' > + else: > + raise BadExpression("Type: %s, Value: %s, > %s"%(self.PcdType, PcdValue, Value)) > > - if PcdValue == 'True': > - PcdValue = '1' > - if PcdValue == 'False': > - PcdValue = '0' > + if PcdValue == 'True': > + PcdValue = '1' > + if PcdValue == 'False': > + PcdValue = '0' > > if RealValue: > return PcdValue > diff --git a/BaseTools/Source/Python/Common/Misc.py > b/BaseTools/Source/Python/Common/Misc.py > index 3b8efb2e71..e23772c297 100644 > --- a/BaseTools/Source/Python/Common/Misc.py > +++ b/BaseTools/Source/Python/Common/Misc.py > @@ -1297,6 +1297,8 @@ def ParseDevPathValue (Value): > return '{' + out + '}', Size > > def ParseFieldValue (Value): > + if "{CODE(" in Value: > + return Value, len(Value.split(",")) > if isinstance(Value, type(0)): > return Value, (Value.bit_length() + 7) / 8 > if not isinstance(Value, type('')): > diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py > b/BaseTools/Source/Python/Workspace/BuildClassObject.py > index 95edc376fe..15bb822910 100644 > --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py > +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py > @@ -50,7 +50,7 @@ class PcdClassObject(object): > self.TokenSpaceGuidCName = Guid > self.TokenSpaceGuidValue = GuidValue > self.Type = Type > - self.DatumType = DatumType > + self._DatumType = DatumType > self.DefaultValue = Value > self.TokenValue = Token > self.MaxDatumSize = MaxDatumSize > @@ -72,6 +72,63 @@ class PcdClassObject(object): > self.PcdValueFromFdf = "" > self.CustomAttribute = {} > self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag > + self._Capacity = None > + > + @property > + def Capacity(self): > + self._Capacity = [] > + dimension = ArrayIndex.findall(self._DatumType) > + for item in dimension: > + maxsize = item.lstrip("[").rstrip("]").strip() > + if not maxsize: > + maxsize = "-1" > + self._Capacity.append(maxsize) > + if hasattr(self, "SkuOverrideValues"): > + for sku in self.SkuOverrideValues: > + for defaultstore in self.SkuOverrideValues[sku]: > + fields = self.SkuOverrideValues[sku][defaultstore] > + for demesionattr in fields: > + deme = ArrayIndex.findall(demesionattr) > + for i in range(len(deme)-1): > + if int(deme[i].lstrip("[").rstrip("]").strip()) > > int(self._Capacity[i]): > + print "error" > + if hasattr(self,"DefaultValues"): > + for demesionattr in self.DefaultValues: > + deme = ArrayIndex.findall(demesionattr) > + for i in range(len(deme)-1): > + if int(deme[i].lstrip("[").rstrip("]").strip()) > > int(self._Capacity[i]): > + print "error" > + self._Capacity = [str(int(d) + 1) for d in self._Capacity] > + return self._Capacity > + @property > + def DatumType(self): > + return self._DatumType > + > + @DatumType.setter > + def DatumType(self,DataType): > + self._DatumType = DataType > + self._Capacity = None > + > + @property > + def BaseDatumType(self): > + if self.IsArray(): > + return self._DatumType[:self._DatumType.index("[")] > + else: > + return self._DatumType > + def IsArray(self): > + return True if len(self.Capacity) else False > + > + def IsAggregateDatumType(self): > + if self.DatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, > TAB_UINT64, TAB_VOID, "BOOLEAN"]: > + return False > + if self.IsArray() or StructPattern.match(self.DatumType): > + return True > + return False > + > + def IsSimpleTypeArray(self): > + if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, > TAB_UINT32, TAB_UINT64, "BOOLEAN"]: > + return True > + return False > > @staticmethod > def GetPcdMaxSizeWorker(PcdString, MaxSize): > @@ -183,23 +240,27 @@ class StructurePcd(PcdClassObject): > def __repr__(self): > return self.TypeName > > - def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0): > - if FieldName in self.DefaultValues: > - del self.DefaultValues[FieldName] > - self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo] > - return self.DefaultValues[FieldName] > + def AddDefaultValue (self, FieldName, Value, FileName="", > LineNo=0,DimensionAttr ="-1"): > + if DimensionAttr not in self.DefaultValues: > + self.DefaultValues[DimensionAttr] = collections.OrderedDict() > + if FieldName in self.DefaultValues[DimensionAttr]: > + del self.DefaultValues[DimensionAttr][FieldName] > + self.DefaultValues[DimensionAttr][FieldName] = [Value.strip(), > FileName, LineNo] > + return self.DefaultValues[DimensionAttr][FieldName] > > def SetDecDefaultValue(self, DefaultValue): > self.DefaultValueFromDec = DefaultValue > - def AddOverrideValue (self, FieldName, Value, SkuName, > DefaultStoreName, FileName="", LineNo=0): > + def AddOverrideValue (self, FieldName, Value, SkuName, > DefaultStoreName, FileName="", LineNo=0, DimensionAttr = '-1'): > if SkuName not in self.SkuOverrideValues: > self.SkuOverrideValues[SkuName] = OrderedDict() > if DefaultStoreName not in self.SkuOverrideValues[SkuName]: > self.SkuOverrideValues[SkuName][DefaultStoreName] = > OrderedDict() > - if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]: > - del > self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] > - self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = > [Value.strip(), FileName, LineNo] > - return > self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] > + if DimensionAttr not in > self.SkuOverrideValues[SkuName][DefaultStoreName]: > + > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr] = > collections.OrderedDict() > + if FieldName in > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]: > + del > self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName][Dimensi > onAttr] > + > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][Field > Name] = [Value.strip(), FileName, LineNo] > + return > self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][Field > Name] > > def SetPcdMode (self, PcdMode): > self.PcdMode = PcdMode > @@ -209,7 +270,7 @@ class StructurePcd(PcdClassObject): > self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if > PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName > self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if > PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue > self.Type = PcdObject.Type if PcdObject.Type else self.Type > - self.DatumType = PcdObject.DatumType if PcdObject.DatumType else > self.DatumType > + self._DatumType = PcdObject.DatumType if PcdObject.DatumType else > self.DatumType > self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue > else self.DefaultValue > self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else > self.TokenValue > self.MaxDatumSize = PcdObject.MaxDatumSize if > PcdObject.MaxDatumSize else self.MaxDatumSize > diff --git a/BaseTools/Source/Python/Workspace/DecBuildData.py > b/BaseTools/Source/Python/Workspace/DecBuildData.py > index 31ee13eca9..cc00409fee 100644 > --- a/BaseTools/Source/Python/Workspace/DecBuildData.py > +++ b/BaseTools/Source/Python/Workspace/DecBuildData.py > @@ -361,6 +361,21 @@ class DecBuildData(PackageBuildClassObject): > self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX)) > return self._Pcds > > + def ParsePcdName(self,TokenCName): > + TokenCName = TokenCName.strip() > + if TokenCName.startswith("["): > + if "." in TokenCName: > + Demesionattr = TokenCName[:TokenCName.index(".")] > + Fields = TokenCName[TokenCName.index(".")+1:] > + else: > + Demesionattr = TokenCName > + Fields = "" > + else: > + Demesionattr = "" > + Fields = TokenCName > + > + return Demesionattr,Fields > + > def ProcessStructurePcd(self, StructurePcdRawDataSet): > s_pcd_set = OrderedDict() > for s_pcd, LineNo in StructurePcdRawDataSet: > @@ -373,6 +388,8 @@ class DecBuildData(PackageBuildClassObject): > dep_pkgs = [] > struct_pcd = StructurePcd() > for item, LineNo in s_pcd_set[pcdname]: > + if not item.TokenCName: > + continue > if "<HeaderFiles>" in item.TokenCName: > > struct_pcd.StructuredPcdIncludeFile.append(item.DefaultValue) > elif "<Packages>" in item.TokenCName: > @@ -385,7 +402,8 @@ class DecBuildData(PackageBuildClassObject): > struct_pcd.PkgPath = self.MetaFile.File > struct_pcd.SetDecDefaultValue(item.DefaultValue) > else: > - struct_pcd.AddDefaultValue(item.TokenCName, > item.DefaultValue, self.MetaFile.File, LineNo) > + DemesionAttr, Fields = self.ParsePcdName(item.TokenCName) > + struct_pcd.AddDefaultValue(Fields, item.DefaultValue, > self.MetaFile.File, LineNo,DemesionAttr) > > struct_pcd.PackageDecs = dep_pkgs > str_pcd_set.append(struct_pcd) > @@ -446,15 +464,12 @@ class DecBuildData(PackageBuildClassObject): > StructurePcds = self.ProcessStructurePcd(StrPcdSet) > for pcd in StructurePcds: > Pcds[pcd.TokenCName, pcd.TokenSpaceGuidCName, > self._PCD_TYPE_STRING_[Type]] = pcd > - StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*$') > for pcd in Pcds.values(): > if pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, > TAB_UINT64, TAB_VOID, "BOOLEAN"]: > - if StructPattern.match(pcd.DatumType) is None: > + if not pcd.IsAggregateDatumType(): > EdkLogger.error('build', FORMAT_INVALID, "DatumType only > support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct > name.", DefinitionPosition[pcd][0], DefinitionPosition[pcd][1]) > - for struct_pcd in Pcds.values(): > - if isinstance(struct_pcd, StructurePcd) and not > struct_pcd.StructuredPcdIncludeFile: > - EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The > structure Pcd %s.%s header file is not found in %s line %s \n" % > (struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName, > DefinitionPosition[struct_pcd][0], DefinitionPosition[struct_pcd][1] )) > - > + elif not pcd.IsArray() and not pcd.StructuredPcdIncludeFile: > + EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The > structure Pcd %s.%s header file is not found in %s line %s \n" % > (pcd.TokenSpaceGuidCName, pcd.TokenCName, pcd.DefinitionPosition[0], > pcd.DefinitionPosition[1] )) > return Pcds > > @property > diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py > b/BaseTools/Source/Python/Workspace/DscBuildData.py > index 11aa63fb26..66d1881aac 100644 > --- a/BaseTools/Source/Python/Workspace/DscBuildData.py > +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py > @@ -42,6 +42,7 @@ import subprocess > from Common.Misc import SaveFileOnChange > from Workspace.BuildClassObject import PlatformBuildClassObject, > StructurePcd, PcdClassObject, ModuleBuildClassObject > from collections import OrderedDict, defaultdict > +from .BuildClassObject import ArrayIndex > > PcdValueInitName = 'PcdValueInit' > > @@ -912,25 +913,26 @@ class DscBuildData(PlatformBuildClassObject): > ExtraData="%s.%s|%s" % (TokenSpaceGuid, > PcdCName, > Setting)) > if ValueList[Index]: > DatumType = self._DecPcds[PcdCName, > TokenSpaceGuid].DatumType > - try: > - ValueList[Index] = ValueExpressionEx(ValueList[Index], > DatumType, > self._GuidDict)(True) > - except BadExpression as Value: > - EdkLogger.error('Parser', FORMAT_INVALID, Value, > File=self.MetaFile, Line=LineNo, > - ExtraData="PCD [%s.%s] Value \"%s\" " % ( > - TokenSpaceGuid, PcdCName, ValueList[Index])) > - except EvaluationException as Excpt: > - if hasattr(Excpt, 'Pcd'): > - if Excpt.Pcd in GlobalData.gPlatformOtherPcds: > - EdkLogger.error('Parser', FORMAT_INVALID, "Cannot > use this > PCD (%s) in an expression as" > - " it must be defined in a > [PcdsFixedAtBuild] or > [PcdsFeatureFlag] section" > - " of the DSC file" % Excpt.Pcd, > - File=self.MetaFile, Line=LineNo) > + if "{CODE(" not in ValueList[Index]: > + try: > + ValueList[Index] = ValueExpressionEx(ValueList[Index], > DatumType, self._GuidDict)(True) > + except BadExpression as Value: > + EdkLogger.error('Parser', FORMAT_INVALID, Value, > File=self.MetaFile, Line=LineNo, > + ExtraData="PCD [%s.%s] Value \"%s\" " % ( > + TokenSpaceGuid, PcdCName, > ValueList[Index])) > + except EvaluationException as Excpt: > + if hasattr(Excpt, 'Pcd'): > + if Excpt.Pcd in GlobalData.gPlatformOtherPcds: > + EdkLogger.error('Parser', FORMAT_INVALID, > "Cannot use this > PCD (%s) in an expression as" > + " it must be defined in a > [PcdsFixedAtBuild] or > [PcdsFeatureFlag] section" > + " of the DSC file" % Excpt.Pcd, > + File=self.MetaFile, Line=LineNo) > + else: > + EdkLogger.error('Parser', FORMAT_INVALID, "PCD > (%s) is not > defined in DSC file" % Excpt.Pcd, > + File=self.MetaFile, Line=LineNo) > else: > - EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) > is not > defined in DSC file" % Excpt.Pcd, > + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid > expression: %s" % str(Excpt), > File=self.MetaFile, Line=LineNo) > - else: > - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid > expression: > %s" % str(Excpt), > - File=self.MetaFile, Line=LineNo) > > if ValueList[Index]: > Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, > TokenSpaceGuid].DatumType, ValueList[Index]) > @@ -1395,6 +1397,26 @@ class DscBuildData(PlatformBuildClassObject): > self.Pcds[Name, Guid].DefaultValue = Value > return AllPcds > > + def ParsePcdNameStruct(self,NamePart1,NamePart2): > + TokenSpaceCName = PcdCName = DimensionAttr = Field = "" > + if "." in NamePart1: > + TokenSpaceCName, TempPcdCName = NamePart1.split(".") > + if "[" in TempPcdCName: > + PcdCName = TempPcdCName[:TempPcdCName.index("[")] > + DimensionAttr = TempPcdCName[TempPcdCName.index("["):] > + else: > + PcdCName = TempPcdCName > + Field = NamePart2 > + else: > + TokenSpaceCName = NamePart1 > + if "[" in NamePart2: > + PcdCName = NamePart2[:NamePart2.index("[")] > + DimensionAttr = NamePart2[NamePart2.index("["):] > + else: > + PcdCName = NamePart2 > + > + return TokenSpaceCName,PcdCName,DimensionAttr,Field > + > def UpdateStructuredPcds(self, TypeList, AllPcds): > > DynamicPcdType = > [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT], > @@ -1424,9 +1446,19 @@ class DscBuildData(PlatformBuildClassObject): > SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else > SkuName > if SkuName not in SkuIds: > continue > + TCName,PCName,DimensionAttr,Field = > self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName) > + pcd_in_dec = self._DecPcds.get((PCName,TCName), None) > + if pcd_in_dec is None: > + EdkLogger.error('build', PARSER_ERROR, > + "Pcd (%s.%s) defined in DSC is not declared in > DEC files. Arch: > ['%s']" % (TCName, PCName, self._Arch), > + File=self.MetaFile, Line = Dummy5) > + if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in > PcdCName): > + if not isinstance (pcd_in_dec, StructurePcd): > + EdkLogger.error('build', PARSER_ERROR, > + "Pcd (%s.%s) is not declared as Structure > PCD in DEC files. > Arch: ['%s']" % (TCName, PCName, self._Arch), > + File=self.MetaFile, Line = Dummy5) > > - if SkuName in SkuIds and "." in TokenSpaceGuid: > - S_PcdSet.append([ TokenSpaceGuid.split(".")[0], > TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, > Dummy5, AnalyzePcdExpression(Setting)[0]]) > + S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, > SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]]) > > # handle pcd value override > StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet) > @@ -1434,27 +1466,19 @@ class DscBuildData(PlatformBuildClassObject): > for str_pcd in StrPcdSet: > str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None) > str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None) > - if not isinstance (str_pcd_dec, StructurePcd): > - EdkLogger.error('build', PARSER_ERROR, > - "Pcd (%s.%s) is not declared as Structure PCD in > DEC files. > Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch), > - File=self.MetaFile, Line = > StrPcdSet[str_pcd][0][5]) > - if str_pcd_dec: > - str_pcd_obj_str = StructurePcd() > - str_pcd_obj_str.copy(str_pcd_dec) > - if str_pcd_obj: > - str_pcd_obj_str.copy(str_pcd_obj) > - if str_pcd_obj.Type in > [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], > self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]: > - str_pcd_obj_str.DefaultFromDSC = > {skuname:{defaultstore: > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > - else: > - str_pcd_obj_str.DefaultFromDSC = > {skuname:{defaultstore: > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > - for str_pcd_data in StrPcdSet[str_pcd]: > - if str_pcd_data[3] in SkuIds: > - str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], > str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON > else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == > TAB_COMMON else str_pcd_data[4], 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[5]) > - S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str > - else: > - EdkLogger.error('build', PARSER_ERROR, > - "Pcd (%s.%s) defined in DSC is not declared in > DEC files. Arch: > ['%s']" % (str_pcd[0], str_pcd[1], self._Arch), > - File=self.MetaFile, Line = > StrPcdSet[str_pcd][0][5]) > + str_pcd_obj_str = StructurePcd() > + str_pcd_obj_str.copy(str_pcd_dec) > + if str_pcd_obj: > + str_pcd_obj_str.copy(str_pcd_obj) > + if str_pcd_obj.Type in > [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], > self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]: > + str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > + else: > + str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: > str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, > str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in > DefaultStores} for skuname in str_pcd_obj.SkuInfoList} > + for str_pcd_data in StrPcdSet[str_pcd]: > + if str_pcd_data[4] in SkuIds: > + str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], > str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON > else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == > TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir > not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if > self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], > LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2]) > + S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str > + > # Add the Structure PCD that only defined in DEC, don't have > override in > DSC file > for Pcd in self.DecPcds: > if isinstance(self._DecPcds[Pcd], StructurePcd): > @@ -1590,9 +1614,10 @@ class DscBuildData(PlatformBuildClassObject): > if SkuName not in AvailableSkuIdSet: > EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not > defined in [SkuIds] section' % SkuName, > File=self.MetaFile, Line=Dummy5) > - if "." not in TokenSpaceGuid: > - PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) > - PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting > + if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, > TAB_COMMON): > + if "." not in TokenSpaceGuid and "[" not in PcdCName: > + PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) > + PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting > > for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet: > Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName] > @@ -1688,7 +1713,20 @@ class DscBuildData(PlatformBuildClassObject): > 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 Pcd.IsArray(): > + if (len(Pcd.Capacity) == 1 and Pcd.Capacity[0] != '0') or > (len(Pcd.Capacity) >1 and reduce(lambda x,y:int(x)*int(y), Pcd.Capacity)) > 0: > + CApp += " *Size = (sizeof (%s) * (%s) > *Size) ? sizeof > (%s) * (%s): > *Size; \n" % (Pcd.BaseDatumType, > "*".join(Pcd.Capacity),Pcd.BaseDatumType, "*".join(Pcd.Capacity)) > + if "{CODE(" in Pcd.DefaultValueFromDec: > + CApp += " *Size = (sizeof (%s_%s_INIT_Value) > *Size ? > sizeof > (%s_%s_INIT_Value) : *Size);\n" % > (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName > ,Pcd.TokenCName) > + for skuname in Pcd.SkuInfoList: > + skuobj = Pcd.SkuInfoList[skuname] > + if skuobj.VariableName: > + for defaultstore in skuobj.DefaultStoreDict: > + CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > > *Size ? > sizeof (%s_%s_%s_%s_Value) : *Size);\n" % > (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.T > okenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore) > + else: > + CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? > sizeof > (%s_%s_%s_%s_Value) : *Size);\n" % > (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_ST > ORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TA > B_DEFAULT_STORES_DEFAULT) > + for index in Pcd.DefaultValues: > + FieldList = Pcd.DefaultValues[index] > if not FieldList: > continue > for FieldName in FieldList: > @@ -1718,31 +1756,32 @@ class DscBuildData(PlatformBuildClassObject): > continue > for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]: > CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % > (skuname, defaultstorenameitem) > - for FieldList in > [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]: > - if not FieldList: > - continue > - for FieldName in FieldList: > - FieldName = "." + FieldName > - IsArray = > 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], 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.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]) > + for index in > Pcd.SkuOverrideValues[skuname][defaultstorenameitem]: > + for FieldList in > [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]: > + if not FieldList: > + continue > + for FieldName in FieldList: > + FieldName = "." + FieldName > + IsArray = > 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], 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.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]) > if Pcd.PcdFieldValueFromFdf: > CApp = CApp + "// From fdf \n" > for FieldName in Pcd.PcdFieldValueFromFdf: > @@ -1791,19 +1830,64 @@ class DscBuildData(PlatformBuildClassObject): > 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, Pcd.PcdFieldValueFromComm[FieldName_ori][1], > Pcd.PcdFieldValueFromComm[FieldName_ori][2], > Pcd.PcdFieldValueFromComm[FieldName_ori][0]) > - CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd > maxsize is > %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), > Pcd.GetPcdMaxSize()) > + if Pcd.GetPcdMaxSize(): > + CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd > maxsize > is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), > Pcd.GetPcdMaxSize()) > CApp = CApp + "}\n" > return CApp > > @staticmethod > def GenerateSizeStatments(Pcd): > - CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType) > + if Pcd.IsArray(): > + r_datatype = [Pcd.BaseDatumType] > + for dem in Pcd.Capacity: > + if dem == '0': > + r_datatype.append("[1]") > + else: > + r_datatype.append("[" + dem + "]") > + CApp = ' Size = sizeof(%s);\n' % ("".join(r_datatype)) > + else: > + CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType) > CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > return CApp > > + def GetIndicator(self,index,FieldName,Pcd): > + def cleanupindex(indexstr): > + return indexstr.strip("[").strip("]").strip() > + index_elements = ArrayIndex.findall(index) > + pcd_capacity = Pcd.Capacity > + if index: > + indicator = "(Pcd" > + if len(pcd_capacity)>2: > + for i in xrange(0,len(index_elements)): > + index_ele = index_elements[i] > + index_num = index_ele.strip("[").strip("]").strip() > + if i == len(index_elements) -2: > + indicator += "+ %d*Size/sizeof(%s)/%d + %s)" > %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lam > bda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i])) > + break > + else: > + indicator += " + %d*%s*Size/sizeof(%s)/%d" > %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: > int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: > int(x)*int(y),pcd_capacity[:-1])) > + elif len(pcd_capacity) == 2: > + indicator += "+ %d*Size/sizeof(%s)/%d + %s)" > %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capac > ity[0]), index_elements[1].strip("[").strip("]").strip()) > + elif len(pcd_capacity) == 1: > + index_ele = index_elements[0] > + index_num = index_ele.strip("[").strip("]").strip() > + indicator += " + %s)" % (index_num) > + else: > + indicator = "Pcd" > + if FieldName: > + indicator += "->" + FieldName > + return indicator > + > + def GetStarNum(self,Pcd): > + if not Pcd.IsArray(): > + return 1 > + elif Pcd.IsSimpleTypeArray(): > + return len(Pcd.Capacity) > + else: > + return len(Pcd.Capacity) + 1 > def GenerateDefaultValueAssignFunction(self, Pcd): > CApp = "// Default value in Dec \n" > - CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType) > + CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType) > CApp = CApp + ' UINT32 FieldSize;\n' > CApp = CApp + ' CHAR8 *Value;\n' > DefaultValueFromDec = Pcd.DefaultValueFromDec > @@ -1822,9 +1906,13 @@ class DscBuildData(PlatformBuildClassObject): > # > # Use memcpy() to copy value into field > # > - CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' > % > (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec) > - CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) > - for FieldList in [Pcd.DefaultValues]: > + if "{CODE(" in Pcd.DefaultValueFromDec: > + CApp = CApp + ' memcpy (Pcd, %s_%s_INIT_Value, > sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName) > + else: > + CApp = CApp + ' Value = %s; // From DEC Default Value > %s\n' % > (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec) > + CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) > + for index in Pcd.DefaultValues: > + FieldList = Pcd.DefaultValues[index] > if not FieldList: > continue > for FieldName in FieldList: > @@ -1840,8 +1928,10 @@ class DscBuildData(PlatformBuildClassObject): > 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])) > + > + indicator = self.GetIndicator(index, FieldName,Pcd) > 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]) > + CApp = CApp + ' %s = %s; // From %s Line %d Value %s\n' > % > (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], > FieldList[FieldName][0]) > elif IsArray: > # > # Use memcpy() to copy value into field > @@ -1850,14 +1940,16 @@ class DscBuildData(PlatformBuildClassObject): > 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.DatumType, FieldName, ValueSize, > Pcd.DatumType, 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) > + CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && > FieldSize > < %d) ? FieldSize : %d);\n' % (indicator, 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]) > + CApp = CApp + ' %s = %dULL; // From %s Line %d > Value %s\n' % > (indicator, 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 + ' %s = %d; // From %s Line %d Value > %s\n' % > (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], > FieldList[FieldName][0]) > CApp = CApp + "}\n" > return CApp > > @@ -1868,7 +1960,7 @@ class DscBuildData(PlatformBuildClassObject): > > def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName): > CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, > DefaultStoreName) > - CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, > DefaultStoreName, Pcd.DatumType) > + CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, > DefaultStoreName, Pcd.BaseDatumType) > CApp = CApp + ' UINT32 FieldSize;\n' > CApp = CApp + ' CHAR8 *Value;\n' > > @@ -1881,40 +1973,60 @@ class DscBuildData(PlatformBuildClassObject): > pcddefaultvalue = Pcd.DscRawValue.get(SkuName, > {}).get(DefaultStoreName) > else: > pcddefaultvalue = Pcd.DscRawValue.get(SkuName, > {}).get(TAB_DEFAULT_STORES_DEFAULT) > - for FieldList in [pcddefaultvalue, > inherit_OverrideValues.get(DefaultStoreName)]: > - if not FieldList: > - continue > - if pcddefaultvalue and FieldList == pcddefaultvalue: > - IsArray = IsFieldValueAnArray(FieldList) > - if IsArray: > + > + if pcddefaultvalue: > + FieldList = pcddefaultvalue > + IsArray = IsFieldValueAnArray(FieldList) > + if IsArray: > + if "{CODE(" not in FieldList: > try: > FieldList = ValueExpressionEx(FieldList, > TAB_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) > + Value, ValueSize = ParseFieldValue (FieldList) > > - if (SkuName, DefaultStoreName) == (TAB_DEFAULT, > TAB_DEFAULT_STORES_DEFAULT): > - if isinstance(Value, str): > + if (SkuName, DefaultStoreName) == (TAB_DEFAULT, > TAB_DEFAULT_STORES_DEFAULT): > + if isinstance(Value, str): > + if "{CODE(" in Value: > + CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, > sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, > DefaultStoreName,Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, DefaultStoreName) > + else: > CApp = CApp + ' Pcd = %s; // From DSC Default Value > %s\n' % > (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, > {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if > Pcd.DefaultFromDSC else Pcd.DefaultValue) > - elif IsArray: > - # > - # Use memcpy() to copy value into field > - # > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + if Pcd.IsArray(): > + CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, > sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, > DefaultStoreName,Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, DefaultStoreName) > + else: > CApp = CApp + ' Value = %s; // From DSC Default > Value %s\n' > % (DscBuildData.IntToCString(Value, ValueSize), > Pcd.DefaultFromDSC.get(TAB_DEFAULT, > {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if > Pcd.DefaultFromDSC else Pcd.DefaultValue) > CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % > (ValueSize) > - else: > - if isinstance(Value, str): > + else: > + if isinstance(Value, str): > + if "{CODE(" in Value: > + CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, > sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, > DefaultStoreName,Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, DefaultStoreName) > + else: > CApp = CApp + ' Pcd = %s; // From DSC Default Value > %s\n' % > (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)) > - elif IsArray: > - # > - # Use memcpy() to copy value into field > - # > + elif IsArray: > + # > + # Use memcpy() to copy value into field > + # > + if Pcd.IsArray(): > + CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, > sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, > DefaultStoreName,Pcd.TokenSpaceGuidCName, > Pcd.TokenCName,SkuName, DefaultStoreName) > + else: > CApp = CApp + ' Value = %s; // From DSC Default > Value %s\n' > % (DscBuildData.IntToCString(Value, ValueSize), > Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)) > CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % > (ValueSize) > + > + inheritvalue = inherit_OverrideValues.get(DefaultStoreName) > + if not inheritvalue: > + inheritvalue = [] > + for index in inheritvalue: > + FieldList = inheritvalue[index] > + if not FieldList: > continue > if (SkuName, DefaultStoreName) == (TAB_DEFAULT, > TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) > and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )): > for FieldName in FieldList: > + indicator = self.GetIndicator(index, FieldName,Pcd) > IsArray = IsFieldValueAnArray(FieldList[FieldName][0]) > if IsArray: > try: > @@ -1932,18 +2044,19 @@ class DscBuildData(PlatformBuildClassObject): > # > # Use memcpy() to copy value into field > # > - CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, > %s);\n' % > (Pcd.DatumType, FieldName) > + 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.DatumType, FieldName, > ValueSize, Pcd.DatumType, 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) > + CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 > && > FieldSize < %d) ? FieldSize : %d);\n' % (indicator, 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]) > + CApp = CApp + ' %s = %dULL; // From %s Line %d > Value %s\n' > % (indicator, 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 + ' %s = %d; // From %s Line %d > Value %s\n' % > (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], > FieldList[FieldName][0]) > CApp = CApp + "}\n" > return CApp > > @@ -1954,7 +2067,7 @@ class DscBuildData(PlatformBuildClassObject): > > 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 + "void Assign_%s_%s_CommandLine_Value(%s > *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, > Pcd.BaseDatumType) > CApp = CApp + ' UINT32 FieldSize;\n' > CApp = CApp + ' CHAR8 *Value;\n' > > @@ -2001,7 +2114,7 @@ class DscBuildData(PlatformBuildClassObject): > # > # Use memcpy() to copy value into field > # > - CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % > (Pcd.DatumType, FieldName) > + 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.DatumType, FieldName, ValueSize, > Pcd.DatumType, 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) > @@ -2022,7 +2135,7 @@ class DscBuildData(PlatformBuildClassObject): > return CApp > def GenerateFdfValue(self,Pcd): > CApp = "// Value in Fdf\n" > - CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType) > + CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % > (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType) > CApp = CApp + ' UINT32 FieldSize;\n' > CApp = CApp + ' CHAR8 *Value;\n' > > @@ -2069,7 +2182,7 @@ class DscBuildData(PlatformBuildClassObject): > # > # Use memcpy() to copy value into field > # > - CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % > (Pcd.DatumType, FieldName) > + 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.DatumType, FieldName, ValueSize, > Pcd.DatumType, 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) > @@ -2090,7 +2203,7 @@ class DscBuildData(PlatformBuildClassObject): > return CApp > > def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, > InitByteValue, CApp): > - OverrideValues = {DefaultStore:""} > + OverrideValues = {DefaultStore:{}} > if Pcd.SkuOverrideValues: > OverrideValues = Pcd.SkuOverrideValues[SkuName] > if not OverrideValues: > @@ -2106,16 +2219,14 @@ class DscBuildData(PlatformBuildClassObject): > 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.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo) > + > + CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % > (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo) > + > CApp = CApp + '\n' > > - if SkuName in Pcd.SkuInfoList: > - DefaultValue = > Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, > Pcd.SkuInfoList[SkuName].HiiDefaultValue if > Pcd.SkuInfoList[SkuName].HiiDefaultValue else > Pcd.SkuInfoList[SkuName].DefaultValue) > - else: > - DefaultValue = Pcd.DefaultValue > - PcdDefaultValue = StringToArray(DefaultValue.strip()) > + PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip()) > > - InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, > DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, > Pcd.DatumType, PcdDefaultValue) > + InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, > DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, > Pcd.BaseDatumType, PcdDefaultValue) > > # > # Get current PCD value and size > @@ -2138,7 +2249,7 @@ class DscBuildData(PlatformBuildClassObject): > # 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.DatumType) > + CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % > (Pcd.BaseDatumType,) > CApp = CApp + ' memset (Pcd, 0, Size);\n' > > # > @@ -2167,7 +2278,7 @@ class DscBuildData(PlatformBuildClassObject): > # > # Set new PCD value and size > # > - CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 > *)Pcd);\n' % > (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, > Pcd.TokenCName) > + CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void > *)Pcd);\n' % > (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, > Pcd.TokenCName) > > # > # Free PCD > @@ -2176,6 +2287,39 @@ class DscBuildData(PlatformBuildClassObject): > CApp = CApp + '}\n' > CApp = CApp + '\n' > return InitByteValue, CApp > + > + def GenerateArrayAssignment(self, Pcd): > + CApp = "" > + if not Pcd: > + return CApp > + if not Pcd.IsArray(): > + return CApp > + Demesion = "" > + for d in Pcd.Capacity: > + if d == "0": > + Demesion += "[]" > + else: > + Demesion += "["+d+"]" > + > + Value = Pcd.DefaultValueFromDec > + if "{CODE(" in Pcd.DefaultValueFromDec: > + realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # > "{CODE(").rstrip(")}" > + CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % > (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demes > ion,realvalue) > + > + for skuname in Pcd.SkuInfoList: > + skuinfo = Pcd.SkuInfoList[skuname] > + if skuinfo.VariableName: > + for defaultstore in skuinfo.DefaultStoreDict: > + Value = skuinfo[defaultstore] > + if "{CODE(" in Value: > + realvalue = Value.strip()[6:-2] # > "{CODE(").rstrip(")}" > + CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % > (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuna > me,defaultstore,Demesion,realvalue) > + else: > + Value = skuinfo.DefaultValue > + if "{CODE(" in Value: > + realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}" > + CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % > (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuna > me,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue) > + return CApp > def SkuOverrideValuesEmpty(self,OverrideValues): > if not OverrideValues: > return True > @@ -2215,6 +2359,8 @@ class DscBuildData(PlatformBuildClassObject): > IncludeFiles.add(IncludeFile) > CApp = CApp + '#include <%s>\n' % (IncludeFile) > CApp = CApp + '\n' > + for Pcd in StructuredPcds.values(): > + CApp = CApp + self.GenerateArrayAssignment(Pcd) > for PcdName in StructuredPcds: > Pcd = StructuredPcds[PcdName] > CApp = CApp + self.GenerateSizeFunction(Pcd) > @@ -2395,6 +2541,8 @@ class DscBuildData(PlatformBuildClassObject): > FileLine = FileInfo [1].split (')')[0] > else: > FileInfo = Message.strip().split(':') > + if len(FileInfo) < 2: > + continue > FileName = FileInfo [0] > FileLine = FileInfo [1] > if FileLine.isdigit(): > @@ -2478,7 +2626,7 @@ class DscBuildData(PlatformBuildClassObject): > if SkuName not in AvailableSkuIdSet: > EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not > defined in [SkuIds] section' % SkuName, > File=self.MetaFile, Line=Dummy5) > - if "." not in TokenSpaceGuid: > + if "." not in TokenSpaceGuid and "[" not in PcdCName: > PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) > PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting > > @@ -2651,7 +2799,7 @@ class DscBuildData(PlatformBuildClassObject): > if DefaultStore not in DefaultStoresDefine: > EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores > %s is > not defined in [DefaultStores] section' % DefaultStore, > File=self.MetaFile, Line=Dummy5) > - if "." not in TokenSpaceGuid: > + if "." not in TokenSpaceGuid and "[" not in PcdCName: > PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, > Dummy5)) > PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = > Setting > > @@ -2814,7 +2962,7 @@ class DscBuildData(PlatformBuildClassObject): > if SkuName not in AvailableSkuIdSet: > EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not > defined in [SkuIds] section' % SkuName, > File=self.MetaFile, Line=Dummy5) > - if "." not in TokenSpaceGuid: > + if "." not in TokenSpaceGuid and "[" not in PcdCName: > PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) > PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting > > diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py > b/BaseTools/Source/Python/Workspace/MetaFileParser.py > index 804a4aa5cb..6fde9e54f5 100644 > --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py > +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py > @@ -40,6 +40,7 @@ from .MetaFileCommentParser import > CheckInfComment > ## RegEx for finding file versions > hexVersionPattern = re.compile(r'0[xX][\da-f-A-F]{5,8}') > decVersionPattern = re.compile(r'\d+\.\d+') > +CODEPattern = re.compile(r"{CODE\([a-fA-F0-9Xx\{\},\s]*\)}") > > ## A decorator used to parse macro definition > def ParseMacro(Parser): > @@ -913,6 +914,10 @@ class DscParser(MetaFileParser): > # > self._IdMapping = {-1:-1} > > + self._PcdCodeValue = "" > + self._PcdDataTypeCODE = False > + self._CurrentPcdName = "" > + > ## Parser starter > def Start(self): > Content = '' > @@ -922,6 +927,9 @@ class DscParser(MetaFileParser): > EdkLogger.error("Parser", FILE_READ_FAILURE, > ExtraData=self.MetaFile) > > OwnerId = {} > + > + Content = self.ProcessMultipleLineCODEValue(Content) > + > for Index in range(0, len(Content)): > Line = CleanString(Content[Index]) > # skip empty line > @@ -1133,6 +1141,41 @@ class DscParser(MetaFileParser): > def _LibraryInstanceParser(self): > self._ValueList[0] = self._CurrentLine > > + def ProcessMultipleLineCODEValue(self,Content): > + CODEBegin = False > + CODELine = "" > + continuelinecount = 0 > + newContent = [] > + for Index in range(0, len(Content)): > + Line = Content[Index] > + if CODEBegin: > + CODELine = CODELine + Line > + continuelinecount +=1 > + if ")}" in Line: > + newContent.append(CODELine) > + for _ in range(continuelinecount): > + newContent.append("") > + CODEBegin = False > + CODELine = "" > + continuelinecount = 0 > + else: > + if not Line: > + newContent.append(Line) > + continue > + if "{CODE(" not in Line: > + newContent.append(Line) > + continue > + elif CODEPattern.findall(Line): > + newContent.append(Line) > + continue > + else: > + CODEBegin = True > + CODELine = Line > + > + return newContent > + > + def _DecodeCODEData(self): > + pass > ## PCD sections parser > # > # [PcdsFixedAtBuild] > @@ -1149,7 +1192,28 @@ class DscParser(MetaFileParser): > # > @ParseMacro > def _PcdParser(self): > + if self._PcdDataTypeCODE: > + self._PcdCodeValue = self._PcdCodeValue + "\n " + > self._CurrentLine > + if self._CurrentLine.endswith(")}"): > + self._CurrentLine = "|".join((self._CurrentPcdName, > self._PcdCodeValue)) > + self._PcdDataTypeCODE = False > + self._PcdCodeValue = "" > + else: > + self._ValueList = None > + return > TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) > + self._CurrentPcdName = TokenList[0] > + if TokenList[1].strip().startswith("{CODE"): > + self._PcdDataTypeCODE = True > + self._PcdCodeValue = TokenList[1].strip() > + > + if self._PcdDataTypeCODE: > + if self._CurrentLine.endswith(")}"): > + self._PcdDataTypeCODE = False > + self._PcdCodeValue = "" > + else: > + self._ValueList = None > + return > self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) > PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT) > if len(PcdNameTockens) == 2: > @@ -1907,6 +1971,17 @@ class DecParser(MetaFileParser): > if self._ValueList[0] not in self._GuidDict: > self._GuidDict[self._ValueList[0]] = self._ValueList[1] > > + def ParsePcdName(self,namelist): > + if "[" in namelist[1]: > + pcdname = namelist[1][:namelist[1].index("[")] > + arrayindex = namelist[1][namelist[1].index("["):] > + namelist[1] = pcdname > + if len(namelist) == 2: > + namelist.append(arrayindex) > + else: > + namelist[2] = ".".join((arrayindex,namelist[2])) > + return namelist > + > ## PCD sections parser > # > # [PcdsFixedAtBuild] > @@ -1945,9 +2020,16 @@ class DecParser(MetaFileParser): > return > else: > PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT) > - PcdNames = PcdTockens[0].split(TAB_SPLIT) > + PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT)) > if len(PcdNames) == 2: > - self._CurrentStructurePcdName = "" > + if PcdNames[1].strip().endswith("]"): > + PcdName = PcdNames[1][:PcdNames[1].index('[')] > + Index = PcdNames[1][PcdNames[1].index('['):] > + self._ValueList[0] = > TAB_SPLIT.join((PcdNames[0],PcdName)) > + self._ValueList[1] = Index > + self._ValueList[2] = PcdTockens[1] > + else: > + self._CurrentStructurePcdName = "" > else: > if self._CurrentStructurePcdName != > TAB_SPLIT.join(PcdNames[:2]): > EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name > does > not match: %s and %s " % (self._CurrentStructurePcdName, > TAB_SPLIT.join(PcdNames[:2])), > -- > 2.19.1.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel