From nobody Sat May 4 04:51:13 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+40024+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+40024+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1557110262; cv=none; d=zoho.com; s=zohoarc; b=kiN4TLpJtwv6uLVs+IHn0IDWyf+OGnrSWMAjJX78SKg9ao5YVstqjSRV9vSebNhONLhcS5cu5NgYxNZFWRe98FYFfuTufJ3zmYKP2YMFJNe9nR7zIyuVKzlPNluTLOE7uuV4M5KmYVATt5oWE7I973Su5dcT4w5vL5UWNeqvyVQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557110262; h=Content-Type:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To:ARC-Authentication-Results; bh=XmzNvxslcL/ZBw6LwuxFnG8fvlcVmBJvkrolM0lh8NM=; b=iWZTd4gvsXLxj1dvSkyIWn8l865UGIANCki7PyvXXvCLsh6k3UwuWeLW+jihyT2rteRP9wS9z5TFKJwyLIR0kZGmtx/7DZ7RuKAmkyqEf+fcJbVW97K/4rpDuqTqhurbzBzJp/pzeeRRqRDMHitA195mCwVmor0VUGLkLLMYAdk= 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+40024+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 15571102621021010.7181697787175; Sun, 5 May 2019 19:37:42 -0700 (PDT) Return-Path: X-Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by groups.io with SMTP; Sun, 05 May 2019 19:37:41 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False X-Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 May 2019 19:37:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,435,1549958400"; d="dat'59?scan'59,208,59";a="297361559" X-Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga004.jf.intel.com with ESMTP; 05 May 2019 19:37:39 -0700 X-Received: from fmsmsx155.amr.corp.intel.com (10.18.116.71) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sun, 5 May 2019 19:37:39 -0700 X-Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by FMSMSX155.amr.corp.intel.com (10.18.116.71) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sun, 5 May 2019 19:37:38 -0700 X-Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.33]) with mapi id 14.03.0415.000; Mon, 6 May 2019 10:37:36 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" Subject: [edk2-devel] [Patch V2] BaseTools: Correct the value assignment for StructurePcd Thread-Topic: [Patch V2] BaseTools: Correct the value assignment for StructurePcd Thread-Index: AdUDtKkBIA6oHicoRXmX8qIozuoH1A== Date: Mon, 6 May 2019 02:37:36 +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_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB83SHSMSX101ccrcor_" Content-Language: en-US DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1557110261; bh=h0EARlW4SWA3o99ezAfJZb8fuwiKk9rrli8HxKcuzHs=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=JFSn+hHHUoq81mclf8yOUdI+Wwff9aZ89IFhwGd+Bgatlm3ZOXWsAWYst5vjqakqE++ Qdm2Vsm74t3aIvAuz+LdwTE4kYyixbDXODJe+NrqWtUyIRDQ2Ex3vWOZ1mO42TqSq33ch Q6SQDSM+KXdvyhKM8yJI6xqwCvFWqFlOF+U= X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: pass (identity @groups.io) --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB83SHSMSX101ccrcor_ 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. Contributed-under: TianoCore Contribution Agreement 1.1 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 (#40024): https://edk2.groups.io/g/devel/message/40024 Mute This Topic: https://groups.io/mt/31515987/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_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB83SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+IqQsAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAADRDMEE4MUQ3 NUM3MEU4NDRCRjk2QkI0OTI4MkMwNzU2ACkHAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHBQAGAAIA JQAkAAEAQQEBIIADAA4AAADjBwUABgACACUAJAABAEEBAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABAEQAAABbUGF0Y2ggVjJdIEJhc2VUb29sczogQ29ycmVjdCB0aGUgdmFs dWUgYXNzaWdubWVudCBmb3IgU3RydWN0dXJlUGNkAI4YAQuAAQAhAAAANEMwQTgxRDc1QzcwRTg0 NEJGOTZCQjQ5MjgyQzA3NTYAKQcBA5AGAPA9AAAzAAAAAgF/AAEAAABIAAAAPEZBRDBEN0UwQUUw RkE1NEQ5ODdGNkU3MjQzNUNBRkQ1MEFGNUJCODNAU0hTTVNYMTAxLmNjci5jb3JwLmludGVsLmNv bT4ACwAfDgEAAAACAQkQAQAAADA0AAAsNAAAF9MAAExaRnXw2LEEYQAKZmJpZAQAAGNjwHBnMTI1 MgD+A0PwdGV4dAH3AqQD4wIABGNoCsBzZXQwIO8HbQKDAFARTTIKgAa0AoCWfQqACMg7CWIxOQ7A vwnDFnIKMhZxAoAVYioJsHMJ8ASQYXQFsg5QA2Bzom8BgCBFeBHBbhgwXQZSdgSQF7YCEHIAwHR9 CFBuGjEQIAXABaAbZGSaIANSIBAiF7JcdgiQ5HdrC4BkNR1TBPAHQA0XcDAKcRfyYmttawZzAZAA ICBCTV9C4EVHSU59CvwB8QvxER+wWjpoAkBwczrALy9idWd6AxALYCQudAcwbm8FoWUuAQWwZy9z aG93X0EiUS5jZ2k/DdA91DE3DrFsC4BlCoElFFRUaAQAIAqwdBHAIKcmARiQHHBpeBzAaBngOwWg AQAgIlEmgAOgU3QQcnVjdAhwZVBjvRxgbxoxB0AJUCUUdgdAiQpQIGEEEGlnbgeADQIwIAkAJGBj LiBJOmYqMCAowgcQGHB5IP0AkHoZ4CYBJvEcUSJQBUB/JzElBSxTGTAqMChxB0AguynkKAFEBPAo 8AXARAWQ+yaCDcBnGDAFwCcwA5EnMu8owSUFCsAsFiwnIxiQBvBWIAPwIqAgCXBwCREgvwSQA2AF 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 b59bMaDIQf9aEN8fGH8ZjxV/pJ8cf6a//+Wv5r/nz+jf6e/q/+wP7R//7i8p//BP8V/yb/N/9I/1 n3/2r/e/+M/533CmcRBwpTKALjE4LjAudzfQaGRvdykAMXClcKV9Bn0NgD5gHwBCAAEAAAAYAAAA RgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwBlAAEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBA AGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAGQAAQAAAAoAAABTAE0AVABQAAAAAAACAUEAAQAAAGQA AAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1AFgAAABTAE0AVABQ AAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAHwACXQEAAAAqAAAA egBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAOVfAQAAADIAAABz AGkAcAA6AHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAaDAEA AAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwAfDAEAAAAqAAAAegBoAGkAagB1AHgALgBm AGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAB4MAQAAAAoAAABTAE0AVABQAAAAAAACARkM AQAAAGQAAAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1AFgAAABT AE0AVABQAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAHwABXQEA AAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAPg/AQAA ABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfACNAAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYA YQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AIkABAAAACgAAAFMATQBUAFAAAAAAAAIB+T8B AAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAFMA TQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAfAAldAQAA ACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAAsAQDoBAAAA HwAaAAEAAAASAAAASQBQAE0ALgBOAG8AdABlAAAAAAADAPE/CQQAAAsAQDoBAAAAAwD9P+QEAAAC AQswAQAAABAAAABMCoHXXHDoRL+Wu0koLAdWAwAXAAEAAABAADkAABgYqrQD1QFAAAgwQxRAqrQD 1QEfAACAhgMCAAAAAADAAAAAAAAARgEAAAAeAAAAYQBjAGMAZQBwAHQAbABhAG4AZwB1AGEAZwBl AAAAAAABAAAADAAAAGUAbgAtAFUAUwAAAB8ANwABAAAAiAAAAFsAUABhAHQAYwBoACAAVgAyAF0A IABCAGEAcwBlAFQAbwBvAGwAcwA6ACAAQwBvAHIAcgBlAGMAdAAgAHQAaABlACAAdgBhAGwAdQBl ACAAYQBzAHMAaQBnAG4AbQBlAG4AdAAgAGYAbwByACAAUwB0AHIAdQBjAHQAdQByAGUAUABjAGQA AAAfAD0AAQAAAAIAAAAAAAAAAwA2AAAAAAACAXEAAQAAABYAAAAB1QO0qQEgDqgeJyhFeZfyoijO 6gfUAAAfAHAAAQAAAIgAAABbAFAAYQB0AGMAaAAgAFYAMgBdACAAQgBhAHMAZQBUAG8AbwBsAHMA OgAgAEMAbwByAHIAZQBjAHQAIAB0AGgAZQAgAHYAYQBsAHUAZQAgAGEAcwBzAGkAZwBuAG0AZQBu AHQAIABmAG8AcgAgAFMAdAByAHUAYwB0AHUAcgBlAFAAYwBkAAAAHwA1EAEAAACQAAAAPABGAEEA RAAwAEQANwBFADAAQQBFADAARgBBADUANABEADkAOAA3AEYANgBFADcAMgA0ADMANQBDAEEARgBE ADUAMABBAEYANQBCAEIAOAAzAEAAUwBIAFMATQBTAFgAMQAwADEALgBjAGMAcgAuAGMAbwByAHAA LgBpAG4AdABlAGwALgBjAG8AbQA+AAAAAwDeP59OAABAAAcwu442qrQD1QECAQsAAQAAABAAAABM CoHXXHDoRL+Wu0koLAdWAwAmAAAAAAACAUcAAQAAADIAAABjPVVTO2E9TUNJO3A9SW50ZWw7bD1T SFNNU1gxMDEtMTkwNTA2MDIzNzM2Wi00NTMyAAAAAgEQMAEAAABGAAAAAAAAACZ3vTk77DhJpKYV Pcule0IHAPrQ1+CuD6VNmH9uckNcr9UAAABEEV4AAKaTaDaIdmxLp0rT60eaTGQAAAlUj2EAAAAA HwD6PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAAwAJWQEAAABAAACACCAGAAAAAADA AAAAAAAARgAAAAC/hQAA4OgDqbQD1QELAACACCAGAAAAAADAAAAAAAAARgAAAACChQAAAAAAAB8A AICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAtAHAAcgBvAGQAdQBjAHQAAAABAAAAGgAA AGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAYAAAA ZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABYAAAAxADEALgAwAC4ANgAwADAALgA3AAAAAAAf AACAhgMCAAAAAADAAAAAAAAARgEAAAAaAAAAZABsAHAALQByAGUAYQBjAHQAaQBvAG4AAAAAAAEA AAAUAAAAbgBvAC0AYQBjAHQAaQBvAG4AAAADAA00/T8AAB8AAICGAwIAAAAAAMAAAAAAAABGAQAA ACAAAAB4AC0AbQBzAC0AaABhAHMALQBhAHQAdABhAGMAaAAAAAEAAAACAAAAAAAAAB8AAICGAwIA AAAAAMAAAAAAAABGAQAAACIAAAB4AC0AbwByAGkAZwBpAG4AYQB0AGkAbgBnAC0AaQBwAAAAAAAB AAAAIAAAAFsAMQAwAC4AMgAzADkALgAxADIANwAuADQAMABdAAAA01g= --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF5BB83SHSMSX101ccrcor_--