From nobody Mon May 6 20:09:53 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+40310+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+40310+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1557393603; cv=none; d=zoho.com; s=zohoarc; b=BGlrfF8STCGhv/Dg3m1ThhnylqCHNDU+bIm0Od+EIM+R+CnwFNiSlV+vUlz35Fb7dUolR9k9fgUsEkznTMFtOEtkaiY6YuGHbdw692hAXGYY8v+oEDJxKtKs8w+/Hr6YswxROwGOB34LirVDCgVSrGQZGagPH+QikhTG1pLOkJY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557393603; h=Content-Type:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To:ARC-Authentication-Results; bh=t4Z8wtq9EgFwCq0xagxUEzvlJlpklkQypI7bMLEPC9w=; b=I9tT2PaQPMImhtWS4/YSwQZUKkSm/IAB8HJZqCgsh30MFhk+IQUfaOjb1wijPDC8TdKOV4xTOpCRI9jkcfsYx2TNLdMwCBvfqDESYfXQlyBhgZ5ERtV+axVGhgsuOeFDlNNH/fqjPL7KNP2JUwQTxaxDuwb+R7NwtVs0O3A3w/s= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+40310+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1557393603024787.4703413855631; Thu, 9 May 2019 02:20:03 -0700 (PDT) Return-Path: X-Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by groups.io with SMTP; Thu, 09 May 2019 02:20:01 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False X-Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 May 2019 02:20:00 -0700 X-ExtLoop1: 1 X-Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga005.jf.intel.com with ESMTP; 09 May 2019 02:19:59 -0700 X-Received: from fmsmsx151.amr.corp.intel.com (10.18.125.4) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Thu, 9 May 2019 02:19:59 -0700 X-Received: from shsmsx106.ccr.corp.intel.com (10.239.4.159) by FMSMSX151.amr.corp.intel.com (10.18.125.4) with Microsoft SMTP Server (TLS) id 14.3.408.0; Thu, 9 May 2019 02:19:58 -0700 X-Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX106.ccr.corp.intel.com ([169.254.10.213]) with mapi id 14.03.0415.000; Thu, 9 May 2019 17:19:56 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" Subject: [edk2-devel] [Patch V3] BaseTools: Correct the value assignment for StructurePcd Thread-Topic: [Patch V3] BaseTools: Correct the value assignment for StructurePcd Thread-Index: AdUGSFxHVyZaXHS2RjiKZIpy5sIGSw== Date: Thu, 9 May 2019 09:19:56 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,zhijux.fan@intel.com Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5D885SHSMSX101ccrcor_" Content-Language: en-US DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1557393602; bh=wQ/YSYxkBtJrQPTceYb950pnJXFd46uTFXmHTh6zmd0=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=uZgmnd2uMxat1qVph0OaNhLOAPHQ5zUyNJiMN+2eBVvQZsg5ciI0FggT7TxLNa9BYkf VtcZ+PIzS39ZHFRM8YN3e/IlkoG70Hj+icZa6ZtoghWQnV7XDfIT3OLO+q5qPshxLWCpz u3d4AjFfBQ2mBOpc/4WUh/br0taRltSSxvM= X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: pass (identity @groups.io) --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5D885SHSMSX101ccrcor_ Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1752 This patch is to fix the code bug in StructurePcd overall value assignment logic. If a Pcd Array size is fixed but the size of actual value in Dsc or Dec is bigger than the Pcd array size, the tool will report error about such setting and stop build. The patch is tested minplatform, Ovmf, structure pcd regression test These tests are build pass. The patch also tested the following cases. Our cases focused on PcdArraySize. 1.flexiable PcdArraySize. 2.Fixed PcdArraySize, Pcd overall value exceeds the size of PcdArray. 3.Fixed PcdArraySize, Pcd overall value Not exceeds the size of PcdArray. Signed-off-by: Bob Feng Cc: Liming Gao --- BaseTools/Source/Python/Common/Misc.py | 1 + .../Python/Workspace/BuildClassObject.py | 78 ++++--- .../Source/Python/Workspace/DecBuildData.py | 2 +- .../Source/Python/Workspace/DscBuildData.py | 211 ++++++++++++++---- 4 files changed, 218 insertions(+), 74 deletions(-) diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Pyth= on/Common/Misc.py index c7daf5417c..526aa2dd54 100644 --- a/BaseTools/Source/Python/Common/Misc.py +++ b/BaseTools/Source/Python/Common/Misc.py @@ -40,10 +40,11 @@ from Common.Parsing import GetSplitValueList from Common.LongFilePathSupport import OpenLongFilePath as open from Common.MultipleWorkspace import MultipleWorkspace as mws from CommonDataClass.Exceptions import BadExpression from Common.caching import cached_property =20 +ArrayIndex =3D re.compile("\[\s*[0-9a-fA-FxX]*\s*\]") ## Regular expression used to find out place holders in string template gPlaceholderPattern =3D re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.= UNICODE) =20 ## regular expressions for map file processing startPatternGeneral =3D re.compile("^Start[' ']+Length[' ']+Name[' ']+Clas= s") diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTo= ols/Source/Python/Workspace/BuildClassObject.py index b82af49236..b50e250cfb 100644 --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py @@ -14,14 +14,16 @@ from collections import OrderedDict, namedtuple from Common.DataType import * import collections import re from collections import OrderedDict -from Common.Misc import CopyDict +from Common.Misc import CopyDict,ArrayIndex import copy +import Common.EdkLogger as EdkLogger +from Common.BuildToolError import OPTION_VALUE_INVALID StructPattern =3D re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$') -ArrayIndex =3D re.compile("\[\s*[0-9a-fA-FxX]*\s*\]") + ## PcdClassObject # # This Class is used for PcdObject # # @param object: Inherited from object class @@ -66,44 +68,62 @@ class PcdClassObject(object): self.validateranges =3D validateranges if validateranges is not No= ne else [] self.validlists =3D validlists if validlists is not None else [] self.expressions =3D expressions if expressions is not None else [] self.DscDefaultValue =3D None self.DscRawValue =3D {} + self.DscRawValueInfo =3D {} if IsDsc: self.DscDefaultValue =3D Value self.PcdValueFromComm =3D "" self.PcdValueFromFdf =3D "" self.CustomAttribute =3D {} self.UserDefinedDefaultStoresFlag =3D UserDefinedDefaultStoresFlag self._Capacity =3D None =20 @property def Capacity(self): - self._Capacity =3D [] - dimension =3D ArrayIndex.findall(self._DatumType) - for item in dimension: - maxsize =3D item.lstrip("[").rstrip("]").strip() - if not maxsize: - maxsize =3D "-1" - maxsize =3D str(int(maxsize,16)) if maxsize.startswith(("0x","= 0X")) else maxsize - self._Capacity.append(maxsize) - if hasattr(self, "SkuOverrideValues"): - for sku in self.SkuOverrideValues: - for defaultstore in self.SkuOverrideValues[sku]: - fields =3D self.SkuOverrideValues[sku][defaultstore] - for demesionattr in fields: - deme =3D 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 =3D ArrayIndex.findall(demesionattr) - for i in range(len(deme)-1): - if int(deme[i].lstrip("[").rstrip("]").strip()) > int(= self._Capacity[i]): - print ("error") + if self._Capacity is None: + self._Capacity =3D [] + dimension =3D ArrayIndex.findall(self._DatumType) + for item in dimension: + maxsize =3D item.lstrip("[").rstrip("]").strip() + if not maxsize: + maxsize =3D "-1" + maxsize =3D str(int(maxsize,16)) if maxsize.startswith(("0= x","0X")) else maxsize + self._Capacity.append(maxsize) + if hasattr(self, "SkuOverrideValues"): + for sku in self.SkuOverrideValues: + for defaultstore in self.SkuOverrideValues[sku]: + fields =3D self.SkuOverrideValues[sku][defaultstor= e] + for demesionattr in fields: + fieldinfo =3D fields[demesionattr] + deme =3D ArrayIndex.findall(demesionattr) + for i in range(len(deme)): + if int(deme[i].lstrip("[").rstrip("]").str= ip()) >=3D int(self._Capacity[i]): + if self._Capacity[i] !=3D "-1": + firstfieldinfo =3D list(fieldinfo.= values())[0] + EdkLogger.error('Build', OPTION_VA= LUE_INVALID, "For Pcd %s, Array Index exceed the Array size. From %s Line %= s \n " % + (".".join((self.TokenSpaceGuidCName, s= elf.TokenCName)), firstfieldinfo[1],firstfieldinfo[2] )) + if hasattr(self,"DefaultValues"): + for demesionattr in self.DefaultValues: + fieldinfo =3D self.DefaultValues[demesionattr] + deme =3D ArrayIndex.findall(demesionattr) + for i in range(len(deme)): + if int(deme[i].lstrip("[").rstrip("]").strip()) >= =3D int(self._Capacity[i]): + if self._Capacity[i] !=3D "-1": + firstfieldinfo =3D list(fieldinfo.values()= )[0] + EdkLogger.error('Build', OPTION_VALUE_INVA= LID, "For Pcd %s, Array Index exceed the Array size. From %s Line %s \n " % + (".".join((self.TokenSpaceGuidCName, s= elf.TokenCName)), firstfieldinfo[1],firstfieldinfo[2] )) return self._Capacity + + def PcdArraySize(self): + if self.Capacity[-1] =3D=3D "-1": + return -1 + size =3D 1 + for de in self.Capacity: + size =3D size * int(de) + return size @property def DatumType(self): return self._DatumType =20 @DatumType.setter @@ -231,10 +251,11 @@ class PcdClassObject(object): new_pcd.IsFromDsc =3D self.IsFromDsc new_pcd.PcdValueFromComm =3D self.PcdValueFromComm new_pcd.PcdValueFromFdf =3D self.PcdValueFromFdf new_pcd.UserDefinedDefaultStoresFlag =3D self.UserDefinedDefaultSt= oresFlag new_pcd.DscRawValue =3D self.DscRawValue + new_pcd.DscRawValueInfo =3D self.DscRawValueInfo new_pcd.CustomAttribute =3D self.CustomAttribute new_pcd.validateranges =3D [item for item in self.validateranges] new_pcd.validlists =3D [item for item in self.validlists] new_pcd.expressions =3D [item for item in self.expressions] new_pcd.SkuInfoList =3D {key: copy.deepcopy(skuobj) for key,skuobj= in self.SkuInfoList.items()} @@ -266,10 +287,11 @@ class StructurePcd(PcdClassObject): self.SkuOverrideValues =3D OrderedDict() self.StructName =3D None self.PcdDefineLineNo =3D 0 self.PkgPath =3D "" self.DefaultValueFromDec =3D "" + self.DefaultValueFromDecInfo =3D None self.ValueChain =3D set() self.PcdFieldValueFromComm =3D OrderedDict() self.PcdFieldValueFromFdf =3D OrderedDict() self.DefaultFromDSC=3DNone def __repr__(self): @@ -281,12 +303,13 @@ class StructurePcd(PcdClassObject): if FieldName in self.DefaultValues[DimensionAttr]: del self.DefaultValues[DimensionAttr][FieldName] self.DefaultValues[DimensionAttr][FieldName] =3D [Value.strip(), F= ileName, LineNo] return self.DefaultValues[DimensionAttr][FieldName] =20 - def SetDecDefaultValue(self, DefaultValue): + def SetDecDefaultValue(self, DefaultValue,decpath=3DNone,lineno=3DNone= ): self.DefaultValueFromDec =3D DefaultValue + self.DefaultValueFromDecInfo =3D (decpath,lineno) def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreNam= e, FileName=3D"", LineNo=3D0, DimensionAttr =3D '-1'): if SkuName not in self.SkuOverrideValues: self.SkuOverrideValues[SkuName] =3D OrderedDict() if DefaultStoreName not in self.SkuOverrideValues[SkuName]: self.SkuOverrideValues[SkuName][DefaultStoreName] =3D OrderedD= ict() @@ -317,20 +340,22 @@ class StructurePcd(PcdClassObject): self.IsFromDsc =3D PcdObject.IsFromDsc if PcdObject.IsFromDsc else= self.IsFromDsc self.validateranges =3D PcdObject.validateranges if PcdObject.vali= dateranges else self.validateranges self.validlists =3D PcdObject.validlists if PcdObject.validlists e= lse self.validlists self.expressions =3D PcdObject.expressions if PcdObject.expression= s else self.expressions self.DscRawValue =3D PcdObject.DscRawValue if PcdObject.DscRawValu= e else self.DscRawValue + self.DscRawValueInfo =3D PcdObject.DscRawValueInfo if PcdObject.Ds= cRawValueInfo else self.DscRawValueInfo self.PcdValueFromComm =3D PcdObject.PcdValueFromComm if PcdObject.= PcdValueFromComm else self.PcdValueFromComm self.PcdValueFromFdf =3D PcdObject.PcdValueFromFdf if PcdObject.Pc= dValueFromFdf else self.PcdValueFromFdf self.CustomAttribute =3D PcdObject.CustomAttribute if PcdObject.Cu= stomAttribute else self.CustomAttribute self.UserDefinedDefaultStoresFlag =3D PcdObject.UserDefinedDefault= StoresFlag if PcdObject.UserDefinedDefaultStoresFlag else self.UserDefinedD= efaultStoresFlag if isinstance(PcdObject, StructurePcd): self.StructuredPcdIncludeFile =3D PcdObject.StructuredPcdInclu= deFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdInclude= File self.PackageDecs =3D PcdObject.PackageDecs if PcdObject.Packag= eDecs else self.PackageDecs self.DefaultValues =3D PcdObject.DefaultValues if PcdObject.De= faultValues else self.DefaultValues self.PcdMode =3D PcdObject.PcdMode if PcdObject.PcdMode else s= elf.PcdMode self.DefaultValueFromDec =3D PcdObject.DefaultValueFromDec if = PcdObject.DefaultValueFromDec else self.DefaultValueFromDec + self.DefaultValueFromDecInfo =3D PcdObject.DefaultValueFromDec= Info if PcdObject.DefaultValueFromDecInfo else self.DefaultValueFromDecInfo self.SkuOverrideValues =3D PcdObject.SkuOverrideValues if PcdO= bject.SkuOverrideValues else self.SkuOverrideValues self.StructName =3D PcdObject.DatumType if PcdObject.DatumType= else self.StructName self.PcdDefineLineNo =3D PcdObject.PcdDefineLineNo if PcdObjec= t.PcdDefineLineNo else self.PcdDefineLineNo self.PkgPath =3D PcdObject.PkgPath if PcdObject.PkgPath else s= elf.PkgPath self.ValueChain =3D PcdObject.ValueChain if PcdObject.ValueCha= in else self.ValueChain @@ -340,10 +365,11 @@ class StructurePcd(PcdClassObject): def __deepcopy__(self,memo): new_pcd =3D StructurePcd() self.sharedcopy(new_pcd) =20 new_pcd.DefaultValueFromDec =3D self.DefaultValueFromDec + new_pcd.DefaultValueFromDecInfo =3D self.DefaultValueFromDecInfo new_pcd.PcdMode =3D self.PcdMode new_pcd.StructName =3D self.DatumType new_pcd.PcdDefineLineNo =3D self.PcdDefineLineNo new_pcd.PkgPath =3D self.PkgPath new_pcd.StructuredPcdIncludeFile =3D [item for item in self.Struct= uredPcdIncludeFile] diff --git a/BaseTools/Source/Python/Workspace/DecBuildData.py b/BaseTools/= Source/Python/Workspace/DecBuildData.py index 149c057b70..ea0f816e27 100644 --- a/BaseTools/Source/Python/Workspace/DecBuildData.py +++ b/BaseTools/Source/Python/Workspace/DecBuildData.py @@ -399,11 +399,11 @@ class DecBuildData(PackageBuildClassObject): struct_pcd.copy(item) struct_pcd.TokenValue =3D struct_pcd.TokenValue.strip(= "{").strip() struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName = =3D pcdname.split(".") struct_pcd.PcdDefineLineNo =3D LineNo struct_pcd.PkgPath =3D self.MetaFile.File - struct_pcd.SetDecDefaultValue(item.DefaultValue) + struct_pcd.SetDecDefaultValue(item.DefaultValue,self.M= etaFile.File,LineNo) else: DemesionAttr, Fields =3D self.ParsePcdName(item.TokenC= Name) struct_pcd.AddDefaultValue(Fields, item.DefaultValue, = self.MetaFile.File, LineNo,DemesionAttr) =20 struct_pcd.PackageDecs =3D dep_pkgs diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/= Source/Python/Workspace/DscBuildData.py index 1ffefe6e7e..7b8c9eedf6 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -31,21 +31,20 @@ from .MetaDataTable import * from .MetaFileTable import * from .MetaFileParser import * =20 from .WorkspaceCommon import GetDeclaredPcd from Common.Misc import AnalyzeDscPcd -from Common.Misc import ProcessDuplicatedInf,RemoveCComments +from Common.Misc import ProcessDuplicatedInf,RemoveCComments,ArrayIndex import re from Common.Parsing import IsValidWord from Common.VariableAttributes import VariableAttributes import Common.GlobalData as GlobalData import subprocess from functools import reduce from Common.Misc import SaveFileOnChange from Workspace.BuildClassObject import PlatformBuildClassObject, Structure= Pcd, PcdClassObject, ModuleBuildClassObject from collections import OrderedDict, defaultdict -from .BuildClassObject import ArrayIndex =20 def _IsFieldValueAnArray (Value): Value =3D Value.strip() if Value.startswith(TAB_GUID) and Value.endswith(')'): return True @@ -1681,21 +1680,21 @@ class DscBuildData(PlatformBuildClassObject): File=3Dself.MetaFile, Line=3DDummy4) if int(MaxDatumSize, 0) < 0: EdkLogger.error('build', FORMAT_INVALID, "The size val= ue can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdC= Name)), File=3Dself.MetaFile, Line=3DDummy4) if (PcdCName, TokenSpaceGuid) in PcdValueDict: - PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] =3D (PcdVa= lue, DatumType, MaxDatumSize) + PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] =3D (PcdVa= lue, DatumType, MaxDatumSize,Dummy4) else: - PcdValueDict[PcdCName, TokenSpaceGuid] =3D {SkuName:(PcdVa= lue, DatumType, MaxDatumSize)} + PcdValueDict[PcdCName, TokenSpaceGuid] =3D {SkuName:(PcdVa= lue, DatumType, MaxDatumSize,Dummy4)} =20 for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items= (): if self.SkuIdMgr.SystemSkuId in PcdSetting: - PcdValue, DatumType, MaxDatumSize =3D PcdSetting[self.SkuI= dMgr.SystemSkuId] + PcdValue, DatumType, MaxDatumSize,_ =3D PcdSetting[self.Sk= uIdMgr.SystemSkuId] elif TAB_DEFAULT in PcdSetting: - PcdValue, DatumType, MaxDatumSize =3D PcdSetting[TAB_DEFAU= LT] + PcdValue, DatumType, MaxDatumSize,_ =3D PcdSetting[TAB_DE= FAULT] elif TAB_COMMON in PcdSetting: - PcdValue, DatumType, MaxDatumSize =3D PcdSetting[TAB_COMMO= N] + PcdValue, DatumType, MaxDatumSize,_ =3D PcdSetting[TAB_CO= MMON] else: PcdValue =3D None DatumType =3D None MaxDatumSize =3D None =20 @@ -1713,11 +1712,13 @@ class DscBuildData(PlatformBuildClassObject): IsDsc=3DTrue) for SkuName in PcdValueDict[PcdCName, TokenSpaceGuid]: Settings =3D PcdValueDict[PcdCName, TokenSpaceGuid][SkuNam= e] if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawVal= ue: Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = =3D {} + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName= ] =3D {} Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DE= FAULT_STORES_DEFAULT] =3D Settings[0] + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TA= B_DEFAULT_STORES_DEFAULT] =3D (self.MetaFile.File,Settings[3]) return Pcds =20 @staticmethod def GetStructurePcdMaxSize(str_pcd): pcd_default_value =3D str_pcd.DefaultValue @@ -1766,28 +1767,45 @@ class DscBuildData(PlatformBuildClassObject): return Result =20 def GenerateSizeFunction(self, Pcd): CApp =3D "// Default Value in Dec \n" CApp =3D CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.Toke= nSpaceGuidCName, Pcd.TokenCName) - if Pcd.IsArray(): + + if Pcd.IsArray() and Pcd.Capacity[-1] !=3D "-1": + CApp +=3D " *Size =3D (sizeof (%s) > *Size ? sizeof (%s) : *S= ize);\n" % (Pcd.DatumType,Pcd.DatumType) + else: + if "{CODE(" in Pcd.DefaultValueFromDec: + CApp +=3D " *Size =3D (sizeof (%s_%s_INIT_Value) > *Size = ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.Tok= enCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName) if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET: for skuname in Pcd.SkuInfoList: skuobj =3D Pcd.SkuInfoList[skuname] if skuobj.VariableName: for defaultstore in skuobj.DefaultStoreDict: pcddef =3D self.GetPcdDscRawDefaultValue(Pcd,s= kuname,defaultstore) - if pcddef and "{CODE(" in pcddef: - CApp +=3D " *Size =3D (sizeof (%s_%s_%s_%= s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpac= eGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.= TokenCName,skuname,defaultstore) + if pcddef: + if "{CODE(" in pcddef: + CApp +=3D " *Size =3D (sizeof (%s_%s_= %s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.Token= SpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,= Pcd.TokenCName,skuname,defaultstore) + else: + CApp +=3D " *Size =3D %s > *Size ? %s= : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSiz= e(Pcd)) else: pcddef =3D self.GetPcdDscRawDefaultValue(Pcd,skuna= me,TAB_DEFAULT_STORES_DEFAULT) - if pcddef and "{CODE(" in pcddef: - CApp +=3D " *Size =3D (sizeof (%s_%s_%s_%s_Va= lue) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGui= dCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuid= CName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT) + if pcddef: + if "{CODE(" in pcddef: + CApp +=3D " *Size =3D (sizeof (%s_%s_%s_%= s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpac= eGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpace= GuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT) + else: + CApp +=3D " *Size =3D %s > *Size ? %s : *= Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pc= d)) else: pcddef =3D self.GetPcdDscRawDefaultValue(Pcd,TAB_DEFAULT,T= AB_DEFAULT_STORES_DEFAULT) - if pcddef and "{CODE(" in pcddef: - CApp +=3D " *Size =3D (sizeof (%s_%s_%s_%s_Value) > *= Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,P= cd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCNam= e,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT) + if pcddef: + if "{CODE(" in pcddef: + CApp +=3D " *Size =3D (sizeof (%s_%s_%s_%s_Value)= > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCNa= me,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuid= CName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT) + else: + CApp +=3D " *Size =3D %s > *Size ? %s : *Size;\n"= % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd)) + ActualCap =3D [] for index in Pcd.DefaultValues: + if index: + ActualCap.append(index) FieldList =3D Pcd.DefaultValues[index] if not FieldList: continue for FieldName in FieldList: FieldName =3D "." + FieldName @@ -1804,22 +1822,24 @@ class DscBuildData(PlatformBuildClassObject): else: NewFieldName =3D '' FieldName_ori =3D FieldName.strip('.') while '[' in FieldName: NewFieldName =3D NewFieldName + FieldName.split('[= ', 1)[0] + '[0]' - ArrayIndex =3D int(FieldName.split('[', 1)[1].spli= t(']', 1)[0]) + Array_Index =3D int(FieldName.split('[', 1)[1].spl= it(']', 1)[0]) FieldName =3D FieldName.split(']', 1)[1] FieldName =3D NewFieldName + FieldName while '[' in FieldName and not Pcd.IsArray: FieldName =3D FieldName.rsplit('[', 1)[0] - CApp =3D 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 =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, = %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."),= Array_Index + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2],= FieldList[FieldName_ori][0]) for skuname in Pcd.SkuOverrideValues: if skuname =3D=3D TAB_COMMON: continue for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]: CApp =3D CApp + "// SkuName: %s, DefaultStoreName: %s \n"= % (skuname, defaultstorenameitem) for index in Pcd.SkuOverrideValues[skuname][defaultstorena= meitem]: + if index: + ActualCap.append(index) for FieldList in [Pcd.SkuOverrideValues[skuname][defau= ltstorenameitem][index]]: if not FieldList: continue for FieldName in FieldList: FieldName =3D "." + FieldName @@ -1836,16 +1856,16 @@ class DscBuildData(PlatformBuildClassObject): else: NewFieldName =3D '' FieldName_ori =3D FieldName.strip('.') while '[' in FieldName: NewFieldName =3D NewFieldName + FieldN= ame.split('[', 1)[0] + '[0]' - ArrayIndex =3D int(FieldName.split('['= , 1)[1].split(']', 1)[0]) + Array_Index =3D int(FieldName.split('[= ', 1)[1].split(']', 1)[0]) FieldName =3D FieldName.split(']', 1)[= 1] FieldName =3D NewFieldName + FieldName while '[' in FieldName and not Pcd.IsArray: FieldName =3D FieldName.rsplit('[', 1)= [0] - CApp =3D CApp + ' __FLEXIBLE_SIZE(*Si= ze, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldNam= e.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldN= ame_ori][2], FieldList[FieldName_ori][0]) + CApp =3D CApp + ' __FLEXIBLE_SIZE(*Si= ze, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldNam= e.strip("."), Array_Index + 1, FieldList[FieldName_ori][1], FieldList[Field= Name_ori][2], FieldList[FieldName_ori][0]) if Pcd.PcdFieldValueFromFdf: CApp =3D CApp + "// From fdf \n" for FieldName in Pcd.PcdFieldValueFromFdf: FieldName =3D "." + FieldName IsArray =3D _IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[Fiel= dName.strip(".")][0]) @@ -1861,16 +1881,16 @@ class DscBuildData(PlatformBuildClassObject): else: NewFieldName =3D '' FieldName_ori =3D FieldName.strip('.') while '[' in FieldName: NewFieldName =3D NewFieldName + FieldName.split('[', 1= )[0] + '[0]' - ArrayIndex =3D int(FieldName.split('[', 1)[1].split(']= ', 1)[0]) + Array_Index =3D int(FieldName.split('[', 1)[1].split('= ]', 1)[0]) FieldName =3D FieldName.split(']', 1)[1] FieldName =3D NewFieldName + FieldName while '[' in FieldName: FieldName =3D FieldName.rsplit('[', 1)[0] - CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d);= // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Ar= rayIndex + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValue= FromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0]) + CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d);= // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Ar= ray_Index + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValu= eFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0]) if Pcd.PcdFieldValueFromComm: CApp =3D CApp + "// From Command Line \n" for FieldName in Pcd.PcdFieldValueFromComm: FieldName =3D "." + FieldName IsArray =3D _IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[Fie= ldName.strip(".")][0]) @@ -1886,20 +1906,41 @@ class DscBuildData(PlatformBuildClassObject): else: NewFieldName =3D '' FieldName_ori =3D FieldName.strip('.') while '[' in FieldName: NewFieldName =3D NewFieldName + FieldName.split('[', 1= )[0] + '[0]' - ArrayIndex =3D int(FieldName.split('[', 1)[1].split(']= ', 1)[0]) + Array_Index =3D int(FieldName.split('[', 1)[1].split('= ]', 1)[0]) FieldName =3D FieldName.split(']', 1)[1] FieldName =3D NewFieldName + FieldName while '[' in FieldName and not Pcd.IsArray: FieldName =3D FieldName.rsplit('[', 1)[0] - CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d);= // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Ar= rayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValu= eFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0]) + CApp =3D CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d);= // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Ar= ray_Index + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldVal= ueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0]) if Pcd.GetPcdMaxSize(): CApp =3D CApp + " *Size =3D (%d > *Size ? %d : *Size); // The= Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.Get= PcdMaxSize()) + ArraySizeByAssign =3D self.CalculateActualCap(ActualCap) + if ArraySizeByAssign > 1: + CApp =3D CApp + " *Size =3D (%d > *Size ? %d : *Size); \n" % = (ArraySizeByAssign, ArraySizeByAssign) CApp =3D CApp + "}\n" return CApp + def CalculateActualCap(self,ActualCap): + if not ActualCap: + return 1 + maxsize =3D 1 + for item in ActualCap: + index_elements =3D ArrayIndex.findall(item) + rt =3D 1 + for index_e in index_elements: + index_num =3D index_e.lstrip("[").rstrip("]").strip() + if not index_num: + # Not support flexiable pcd array assignment + return 1 + index_num =3D int(index_num,16) if index_num.startswith(("= 0x","0X")) else int(index_num) + rt =3D rt * (index_num+1) + if rt >maxsize: + maxsize =3D rt + + return maxsize =20 @staticmethod def GenerateSizeStatments(Pcd,skuname,defaultstorename): if Pcd.IsArray(): r_datatype =3D [Pcd.BaseDatumType] @@ -1974,10 +2015,11 @@ class DscBuildData(PlatformBuildClassObject): def GenerateDefaultValueAssignFunction(self, Pcd): CApp =3D "// Default value in Dec \n" CApp =3D CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (P= cd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType) CApp =3D CApp + ' UINT32 FieldSize;\n' CApp =3D CApp + ' CHAR8 *Value;\n' + CApp =3D CApp + ' UINT32 PcdArraySize;\n' DefaultValueFromDec =3D Pcd.DefaultValueFromDec IsArray =3D _IsFieldValueAnArray(Pcd.DefaultValueFromDec) if IsArray: try: DefaultValueFromDec =3D ValueExpressionEx(Pcd.DefaultValue= FromDec, TAB_VOID)(True) @@ -1985,18 +2027,33 @@ class DscBuildData(PlatformBuildClassObject): EdkLogger.error("Build", FORMAT_INVALID, "Invalid value fo= rmat for %s.%s, from DEC: %s" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, = DefaultValueFromDec)) DefaultValueFromDec =3D StringToArray(DefaultValueFromDec) Value, ValueSize =3D ParseFieldValue (DefaultValueFromDec) if IsArray: - # - # Use memcpy() to copy value into field - # - if "{CODE(" in Pcd.DefaultValueFromDec: - CApp =3D CApp + ' memcpy (Pcd, %s_%s_INIT_Value, sizeof(%= s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.TokenS= paceGuidCName, Pcd.TokenCName) + # + # Use memcpy() to copy value into field + # + if Pcd.IsArray(): + pcdarraysize =3D Pcd.PcdArraySize() + if "{CODE(" in Pcd.DefaultValueFromDec: + if Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + '__STATIC_ASSERT(sizeof(%s_%s_INIT= _Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capabil= ity %s"); // From %s Line %s \n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCNa= me,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,P= cd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1]) + CApp =3D CApp + ' PcdArraySize =3D sizeof(%s_%s_INIT_V= alue);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + CApp =3D CApp + ' memcpy (Pcd, %s_%s_INIT_Value,PcdAr= raySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + else: + if Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + '__STATIC_ASSERT(%d < %d * sizeof(= %s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From %s L= ine %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCN= ame, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.Defaul= tValueFromDecInfo[1]) + CApp =3D CApp + ' PcdArraySize =3D %d;\n' % ValueSize + CApp =3D CApp + ' Value =3D %s; // From DEC Defau= lt Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultV= alueFromDec) + CApp =3D CApp + ' memcpy (Pcd, Value, PcdArraySize);\= n' else: - CApp =3D CApp + ' Value =3D %s; // From DEC Default V= alue %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValue= FromDec) - CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSiz= e) + if "{CODE(" in Pcd.DefaultValueFromDec: + CApp =3D CApp + ' PcdArraySize =3D sizeof(%s_%s_INIT_= Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + CApp =3D CApp + ' memcpy (Pcd, &%s_%s_INIT_Value,PcdA= rraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) + else: + CApp =3D CApp + ' Value =3D %s; // From DEC Defau= lt Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultV= alueFromDec) + CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n' % (Valu= eSize) elif isinstance(Value, str): CApp =3D CApp + ' Pcd =3D %s; // From DEC Default Value %s\n'= % (Value, Pcd.DefaultValueFromDec) for index in Pcd.DefaultValues: FieldList =3D Pcd.DefaultValues[index] if not FieldList: @@ -2050,18 +2107,33 @@ class DscBuildData(PlatformBuildClassObject): pcddefaultvalue =3D Pcd.DscRawValue.get(SkuName, {}).get(D= efaultStoreName) else: pcddefaultvalue =3D Pcd.DscRawValue.get(SkuName, {}).get(TAB_D= EFAULT_STORES_DEFAULT) =20 return pcddefaultvalue + def GetPcdDscRawValueInfo(self,Pcd, SkuName,DefaultStoreName): + DscValueInfo =3D Pcd.DscRawValueInfo.get(SkuName, {}).get(DefaultS= toreName) + if DscValueInfo: + dscfilepath,lineno =3D DscValueInfo + else: + dscfilepath =3D self.MetaFile.File + lineno =3D "" + return dscfilepath,lineno + def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName): CApp =3D "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuNa= me, DefaultStoreName) CApp =3D CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd= .TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDa= tumType) CApp =3D CApp + ' UINT32 FieldSize;\n' CApp =3D CApp + ' CHAR8 *Value;\n' + CApp =3D CApp + ' UINT32 PcdArraySize;\n' =20 CApp =3D CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_= DEFAULT, TAB_DEFAULT_STORES_DEFAULT) inherit_OverrideValues =3D Pcd.SkuOverrideValues[SkuName] + dscfilepath,lineno =3D self.GetPcdDscRawValueInfo(Pcd, SkuName, De= faultStoreName) + if lineno: + valuefrom =3D "%s Line %s" % (dscfilepath,str(lineno)) + else: + valuefrom =3D dscfilepath =20 pcddefaultvalue =3D self.GetPcdDscRawDefaultValue(Pcd, SkuName, De= faultStoreName) if pcddefaultvalue: FieldList =3D pcddefaultvalue IsArray =3D _IsFieldValueAnArray(FieldList) @@ -2075,37 +2147,75 @@ class DscBuildData(PlatformBuildClassObject): Value, ValueSize =3D ParseFieldValue (FieldList) =20 if (SkuName, DefaultStoreName) =3D=3D (TAB_DEFAULT, TAB_DEFAUL= T_STORES_DEFAULT): if isinstance(Value, str): if "{CODE(" in Value: - CApp =3D 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) + if Pcd.IsArray() and Pcd.Capacity[-1] !=3D "-1": + pcdarraysize =3D Pcd.PcdArraySize() + CApp =3D CApp + '__STATIC_ASSERT(sizeof(%s_%s_= %s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array ca= pability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Sk= uName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCN= ame, Pcd.TokenCName,Pcd.DatumType, valuefrom) + CApp =3D CApp+ ' PcdArraySize =3D sizeof(%s_%s_%s_= %s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultS= toreName) + CApp =3D CApp + ' memcpy (Pcd, &%s_%s_%s_%s_Value= ,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, Def= aultStoreName) else: CApp =3D CApp + ' Pcd =3D %s; // From DSC Default= Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFA= ULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.Defaul= tValue) elif IsArray: - # - # Use memcpy() to copy value into field - # - if Pcd.IsArray() and "{CODE(" in pcddefaultvalue: - CApp =3D 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) + # + # Use memcpy() to copy value into field + # + if Pcd.IsArray(): + pcdarraysize =3D Pcd.PcdArraySize() + if "{CODE(" in pcddefaultvalue: + if Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + '__STATIC_ASSERT(sizeof(%s= _%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the arra= y capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCNa= me,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceG= uidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom) + CApp =3D CApp + ' PcdArraySize =3D sizeof(%s_%= s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, Def= aultStoreName) + CApp =3D CApp + ' memcpy (Pcd, %s_%s_%s_%s_Va= lue, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, = DefaultStoreName) + else: + if Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + '__STATIC_ASSERT(%d < %d *= sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // F= rom %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidC= Name, Pcd.TokenCName,Pcd.DatumType,valuefrom) + CApp =3D CApp + ' PcdArraySize =3D %d;\n' % Va= lueSize + CApp =3D CApp + ' Value =3D %s; // From D= SC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.= DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.Def= aultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue) + CApp =3D CApp + ' memcpy (Pcd, Value, PcdArra= ySize);\n' else: - CApp =3D CApp + ' Value =3D %s; // From DSC D= efault Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.Defa= ultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.Default= Value) if Pcd.DefaultFromDSC else Pcd.DefaultValue) - CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n' % (= ValueSize) + if "{CODE(" in pcddefaultvalue: + CApp =3D CApp + ' PcdArraySize =3D %d < sizeo= f(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarr= aysize,ValueSize,Pcd.BaseDatumType,pcdarraysize) + CApp =3D CApp + ' memcpy (Pcd, &%s_%s_%s_%s_V= alue, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,= DefaultStoreName) + else: + CApp =3D CApp + ' Value =3D %s; // From D= SC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.= DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.Def= aultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue) + CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n'= % (ValueSize) else: if isinstance(Value, str): if "{CODE(" in Value: - CApp =3D 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) + if Pcd.IsArray() and Pcd.Capacity[-1] !=3D "-1": + pcdarraysize =3D Pcd.PcdArraySize() + CApp =3D CApp + '__STATIC_ASSERT(sizeof(%s_%s_= %s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array ca= pability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Sk= uName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCN= ame, Pcd.TokenCName,Pcd.DatumType,valuefrom) + CApp =3D CApp + ' PcdArraySize =3D sizeof(%s_%s_%s= _%s_Value);\n '% (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultS= toreName) + CApp =3D CApp + ' memcpy (Pcd, &%s_%s_%s_%s_Value= , PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, Def= aultStoreName) else: CApp =3D CApp + ' Pcd =3D %s; // From DSC Default= Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreNam= e)) elif IsArray: - # - # Use memcpy() to copy value into field - # - if Pcd.IsArray() and "{CODE(" in pcddefaultvalue: - CApp =3D 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) + # + # Use memcpy() to copy value into field + # + if Pcd.IsArray(): + pcdarraysize =3D Pcd.PcdArraySize() + if "{CODE(" in pcddefaultvalue: + if Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + '__STATIC_ASSERT(sizeof(%s= _%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the arra= y capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCNa= me,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceG= uidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom) + CApp + ' PcdArraySize =3D sizeof(%s_%s_%s_%s_V= alue);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStore= Name) + CApp =3D CApp + ' memcpy (Pcd, %s_%s_%s_%s_Va= lue, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, = DefaultStoreName) + else: + if Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + '__STATIC_ASSERT(%d < %d *= sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // F= rom %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidC= Name, Pcd.TokenCName,Pcd.DatumType,valuefrom) + CApp =3D CApp + ' PcdArraySize =3D %d;\n' % Va= lueSize + CApp =3D CApp + ' Value =3D %s; // From D= SC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.= DscRawValue.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.Defaul= tValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue) + CApp =3D CApp + ' memcpy (Pcd, Value, PcdArra= ySize);\n' else: - CApp =3D CApp + ' Value =3D %s; // From DSC D= efault Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscR= awValue.get(SkuName, {}).get(DefaultStoreName)) - CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n' % (= ValueSize) + if "{CODE(" in pcddefaultvalue: + CApp =3D CApp + ' PcdArraySize =3D %d < sizeo= f(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarr= aysize,ValueSize,Pcd.BaseDatumType,pcdarraysize) + CApp =3D CApp + ' memcpy (Pcd, &%s_%s_%s_%s_V= alue, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,= DefaultStoreName) + else: + CApp =3D CApp + ' Value =3D %s; // From D= SC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.= DscRawValue.get(SkuName, {}).get(DefaultStoreName)) + CApp =3D CApp + ' memcpy (Pcd, Value, %d);\n'= % (ValueSize) =20 inheritvalue =3D inherit_OverrideValues.get(DefaultStoreName) if not inheritvalue: inheritvalue =3D [] for index in inheritvalue: @@ -2327,10 +2437,13 @@ class DscBuildData(PlatformBuildClassObject): # the flexible array member. The flexible array member must b= e the last field # in a structure. The size formula for this case is: # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (H= ighestIndex + 1) # CApp =3D CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName= ,DefaultStoreName) + if Pcd.IsArray() and Pcd.Capacity[-1] !=3D "-1": + CApp =3D CApp + ' OriginalSize =3D OriginalSize < sizeof(= %s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArr= aySize(),Pcd.BaseDatumType,Pcd.PcdArraySize()) + CApp =3D CApp + ' Size =3D sizeof(%s) * %d; \n' % (Pcd.Ba= seDatumType,Pcd.PcdArraySize()) =20 # # Allocate and zero buffer for the PCD # Must handle cases where current value is smaller, larger, or= same size # Always keep that larger one as the current size @@ -2377,12 +2490,10 @@ class DscBuildData(PlatformBuildClassObject): =20 def GenerateArrayAssignment(self, Pcd): CApp =3D "" if not Pcd: return CApp - if not Pcd.IsArray(): - return CApp Demesion =3D "" for d in Pcd.Capacity: Demesion +=3D "[]" =20 Value =3D Pcd.DefaultValueFromDec @@ -2770,11 +2881,13 @@ class DscBuildData(PlatformBuildClassObject): None, IsDsc=3DTrue) =20 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue: Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] =3D {} + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = =3D {} Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAUL= T_STORES_DEFAULT] =3D PcdValue + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DE= FAULT_STORES_DEFAULT] =3D (self.MetaFile.File,Dummy4) =20 for pcd in Pcds.values(): pcdDecObject =3D self._DecPcds[pcd.TokenCName, pcd.TokenSpaceG= uidCName] # Only fix the value while no value provided in DSC file. for sku in pcd.SkuInfoList.values(): @@ -2972,11 +3085,13 @@ class DscBuildData(PlatformBuildClassObject): Pcds[PcdCName, TokenSpaceGuid] =3D PcdClassObj =20 Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPositio= n'] =3D int(Dummy4) if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue: Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] =3D {} + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = =3D {} Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultSto= re] =3D DefaultValue + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][Defaul= tStore] =3D (self.MetaFile.File,Dummy4) for pcd in Pcds.values(): pcdDecObject =3D self._DecPcds[pcd.TokenCName, pcd.TokenSpaceG= uidCName] pcd.DatumType =3D pcdDecObject.DatumType # Only fix the value while no value provided in DSC file. for sku in pcd.SkuInfoList.values(): @@ -3110,11 +3225,13 @@ class DscBuildData(PlatformBuildClassObject): None, IsDsc=3DTrue) =20 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue: Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] =3D {} + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = =3D {} Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAUL= T_STORES_DEFAULT] =3D InitialValue + Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DE= FAULT_STORES_DEFAULT] =3D (self.MetaFile.File,Dummy4) for pcd in Pcds.values(): pcdDecObject =3D self._DecPcds[pcd.TokenCName, pcd.TokenSpaceG= uidCName] pcd.DatumType =3D pcdDecObject.DatumType # Only fix the value while no value provided in DSC file. for sku in pcd.SkuInfoList.values(): --=20 2.18.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#40310): https://edk2.groups.io/g/devel/message/40310 Mute This Topic: https://groups.io/mt/31553370/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5D885SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+ImgJAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAAEQ0M0U4NjlD QTVDNkZENEE4QTUzNDUwNzExRDQ1NDU1ACYHAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHBQAJAAkA EwA4AAQAUAEBIIADAA4AAADjBwUACQAJABMAOAAEAFABAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABAEQAAABbUGF0Y2ggVjNdIEJhc2VUb29sczogQ29ycmVjdCB0aGUgdmFs dWUgYXNzaWdubWVudCBmb3IgU3RydWN0dXJlUGNkAI8YAQuAAQAhAAAARDQzRTg2OUNBNUM2RkQ0 QThBNTM0NTA3MTFENDU0NTUAJgcBA5AGAHw+AAAzAAAAAgF/AAEAAABIAAAAPEZBRDBEN0UwQUUw RkE1NEQ5ODdGNkU3MjQzNUNBRkQ1MEFGNUQ4ODVAU0hTTVNYMTAxLmNjci5jb3JwLmludGVsLmNv bT4ACwAfDgEAAAACAQkQAQAAALs0AAC3NAAAWtQAAExaRnUjuz7RYQAKZmJpZAQAAGNjwHBnMTI1 MgD+A0PwdGV4dAH3AqQD4wIABGNoCsBzZXQwIO8HbQKDAFARTTIKgAa0AoCWfQqACMg7CWIxOQ7A vwnDFnIKMhZxAoAVYioJsHMJ8ASQYXQFsg5QA2Bzom8BgCBFeBHBbhgwXQZSdgSQF7YCEHIAwHR9 CFBuGjEQIAXABaAbZGSaIANSIBAiF7JcdgiQ5HdrC4BkNR1TBPAHQA0XcDAKcRfyYmttawZzAZAA ICBCTV9C4EVHSU59CvwB8QvxIR+wWjogaAJAcHOAOi8vYnVnegMQSQtgLnQHMG5vBaFlAi4FsGcv c2hvd4JfImEuY2dpPw3QqD0xNw6xbAuAZQqBqSUkVGgEACAKsHQRwE4gJhEYkBxwaXgcwGh3GeAF oAEAICJhJpADoFMgdHJ1Y3QIcGVQemMcYG8aMQdACVAlJHYTB0AKUCBhBBBpZ24bB4ACMCAJACRw Yy4gdElmKkAgKNIHEBhwefogAJB6GeAmEScBHFEiYP8FQCdBJRUsYxkwKkAogQdAdiAp9CgRRATw KQAFwET3BZAmkg3AZxgwBcAnQAOR3ydCKNElFQrALCYsJzMYkK0G8CAD8CKwIAlwcAkRfiAEkANg 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 //+nD6gfqm+wzzD/JT8mT7UP/7FPnp8pz7Sful+Zry1PLl//uX+/r7afMd8y76KPxP9iX/9Gn0ev SL9JzmXSSv9MDzzv/04/T0/PH1Fv0T9DT9Uf1i//xk/HX8hvyX/Kj8ufzK9NH//Ov8/P0q/R7+I/ U39YGfQSj+gx81NW49rSRmRmvl/31x9jY9rTZugwZdNUD4I+/+bf5+/Af4Z/uP+OBb3l8QHlq8Bz 7hhBbqTj3NPt79/u8eDY3mnUSgB0NuAQiMT+OPlTiY+Kn4uv8l+Oz51v/5Hv/x+VD93Ply+7D5pP /r///4+3H7gvoJ+hrw5fpM+sf/+tj66f1O+rHxA/EU8SXwgf/wIvsn+zjxkvGn8Kz/G/Bb//u+8H 7x3PGv/Cb8N/6N/Xn//Yr9m/2s36oNvf3O/3D84P/2Rg9V/2b+F4Mq8zv+NINW//Nn/UDyi/KZ8q ryu/LM8t3/8u7y//3p8yDzifNC83/0ZvvzdfSI9Jn+Vf5m/uSUPa8P5tI888X+p4UDK9IttT61// 7G/tf0/P74/wnyBv8r/zzz/031bu9t/374hD+TAsMpIwiOE5MIigNDH6L//7P/xPWw/+bwkPAI9n 3wKv/wO/BM8hrwbvZ39oTx6/H8//DD8NT3GfD28WHxcvGD87H/8Uv3j/eg97H23fau8l7xwv/4Hv gz9zj1pvbn8ij7zvvf//jn+DjyafJ6+SvzyfPa8+v/8/z9ufQe9C/zE/RS9ez0c//5y/nc9KX5/v oP97/5Lvk///lQ+WH5cvmD+ZT5pfRC+cb/+jH56Pr9+w76G/sw+0H4GvEU6XR2V0rGFNYXj9qPIo Ze+mj+phZoCo41nBqiirIT681T+rEjq81Fmp9FRojICsYSBTYHj+c70C5ECrElQCrCa5nbVEP8Fv wn+6YKUPeGOo8kJ5ckFjYGlni+B+sGdgbMhmLkOrYGN1ZHFdgP1lwHWrYMeQmzDIJ8T/TrH7xg+9 kTG6hqWLu9+8773/P8CXyp+blcZauB9RzVx9y1QPZoFyuaB1covgUcK/y/rfsE7Ax5+bMMdCLMjI v8vvTrGM4sgn2m/WWTHcjt+/xn6w3j9VQnVQZaqAi9Fv2++li7qwrzFfZ0DhUGXPfuBjcH6weGgu ZuORq2D8bCjhMslf1lONAN/P4Jnf46Rv8uOc4k/jHG6s0H6j7eOzLmdQmwRbm3CQ8ZsE/l3uMa30 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 5//ub//vf+tv8V/yZbt/vI++H78v/+1fwU/CX8NvxH/Fj/5oGzD/Y6YVgf7aBJgDL8bfx+/I/9/K D8sfzC/NPzEWM5GgkYT9MaAyz4/Qn9Gv/X8UvxXP/5i/FC8Y/xoPnT/Xf96/38//9Y/h7xx/9I8f f/Bv7J/oT/8izyPf9t8lv+2fKB8pL/DP/7mfs4tF0NxxbkDzTyyvLb//Ka+4zzCvuu/53/rv+//9 D//+H/8vAD8BTwJfPi8EfwWP/wafB68IvwnPCt8L7wz/Dg8HhNaFQITVMi4xOC6IMC53TABkb3c9 MGYxhNWE1X19IbBSkAAfAEIAAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAGUAAQAA ACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AZAABAAAA CgAAAFMATQBUAFAAAAAAAAIBQQABAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBu ACwAIABaAGgAaQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQA ZQBsAC4AYwBvAG0AAAAfAAJdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBs AC4AYwBvAG0AAAAAAB8A5V8BAAAAMgAAAHMAaQBwADoAegBoAGkAagB1AHgALgBmAGEAbgBAAGkA bgB0AGUAbAAuAGMAbwBtAAAAAAAfABoMAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAf AB8MAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8A HgwBAAAACgAAAFMATQBUAFAAAAAAAAIBGQwBAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAA gEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAA aQBuAHQAZQBsAC4AYwBvAG0AAAAfAAFdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBu AHQAZQBsAC4AYwBvAG0AAAAAAB8A+D8BAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8A I0ABAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAi QAEAAAAKAAAAUwBNAFQAUAAAAAAAAgH5PwEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACA RgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABp AG4AdABlAGwALgBjAG8AbQAAAB8ACV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4A dABlAGwALgBjAG8AbQAAAAAACwBAOgEAAAAfABoAAQAAABIAAABJAFAATQAuAE4AbwB0AGUAAAAA AAMA8T8JBAAACwBAOgEAAAADAP0/5AQAAAIBCzABAAAAEAAAANQ+hpylxv1KilNFBxHUVFUDABcA AQAAAEAAOQAABuVdSAbVAUAACDBdd+ddSAbVAR8AAICGAwIAAAAAAMAAAAAAAABGAQAAAB4AAABh AGMAYwBlAHAAdABsAGEAbgBnAHUAYQBnAGUAAAAAAAEAAAAMAAAAZQBuAC0AVQBTAAAAHwA3AAEA AACIAAAAWwBQAGEAdABjAGgAIABWADMAXQAgAEIAYQBzAGUAVABvAG8AbABzADoAIABDAG8AcgBy AGUAYwB0ACAAdABoAGUAIAB2AGEAbAB1AGUAIABhAHMAcwBpAGcAbgBtAGUAbgB0ACAAZgBvAHIA IABTAHQAcgB1AGMAdAB1AHIAZQBQAGMAZAAAAB8APQABAAAAAgAAAAAAAAADADYAAAAAAAIBcQAB AAAAFgAAAAHVBkhcR1cmWlx0tkY4imSKcubCBksAAB8AcAABAAAAiAAAAFsAUABhAHQAYwBoACAA VgAzAF0AIABCAGEAcwBlAFQAbwBvAGwAcwA6ACAAQwBvAHIAcgBlAGMAdAAgAHQAaABlACAAdgBh AGwAdQBlACAAYQBzAHMAaQBnAG4AbQBlAG4AdAAgAGYAbwByACAAUwB0AHIAdQBjAHQAdQByAGUA UABjAGQAAAAfADUQAQAAAJAAAAA8AEYAQQBEADAARAA3AEUAMABBAEUAMABGAEEANQA0AEQAOQA4 ADcARgA2AEUANwAyADQAMwA1AEMAQQBGAEQANQAwAEEARgA1AEQAOAA4ADUAQABTAEgAUwBNAFMA WAAxADAAMQAuAGMAYwByAC4AYwBvAHIAcAAuAGkAbgB0AGUAbAAuAGMAbwBtAD4AAAADAN4/n04A AEAABzBNbNRdSAbVAQIBCwABAAAAEAAAANQ+hpylxv1KilNFBxHUVFUDACYAAAAAAAIBRwABAAAA MgAAAGM9VVM7YT1NQ0k7cD1JbnRlbDtsPVNIU01TWDEwMS0xOTA1MDkwOTE5NTZaLTkyMjkAAAAC ARAwAQAAAEYAAAAAAAAAJne9OTvsOEmkphU9y6V7QgcA+tDX4K4PpU2Yf25yQ1yv1QAAAEQRXgAA ppNoNoh2bEunStPrR5pMZAAACVSPbgAAAAAfAPo/AQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1 AFgAAAADAAlZAQAAAEAAAIAIIAYAAAAAAMAAAAAAAABGAAAAAL+FAADAQUpcSAbVAQsAAIAIIAYA AAAAAMAAAAAAAABGAAAAAIKFAAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABw AC0AcAByAG8AZAB1AGMAdAAAAAEAAAAaAAAAZABsAHAAZQAtAHcAaQBuAGQAbwB3AHMAAAAAAB8A AICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAtAHYAZQByAHMAaQBvAG4AAAABAAAAFgAA ADEAMQAuADAALgA2ADAAMAAuADcAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwA cAAtAHIAZQBhAGMAdABpAG8AbgAAAAAAAQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAMADTT9 PwAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEA YwBoAAAAAQAAAAIAAAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBn AGkAbgBhAHQAaQBuAGcALQBpAHAAAAAAAAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4A NAAwAF0AAAD7yw== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5D885SHSMSX101ccrcor_--