# This class is used to retrieve information stored in database and convert them\r
# into PlatformBuildClassObject form for easier use for AutoGen.\r
#\r
+from __future__ import print_function\r
+from __future__ import absolute_import\r
from Common.StringUtils import *\r
from Common.DataType import *\r
from Common.Misc import *\r
from Common.Misc import SaveFileOnChange\r
from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
from collections import OrderedDict, defaultdict\r
+from .BuildClassObject import ArrayIndex\r
\r
PcdValueInitName = 'PcdValueInit'\r
\r
!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
'''\r
\r
+AppTarget = '''\r
+all: $(APPFILE)\r
+$(APPFILE): $(OBJECTS)\r
+%s\r
+'''\r
+\r
PcdGccMakefile = '''\r
MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
LIBS = -lCommon\r
continue\r
\r
if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
- FileContent = str(FileContent, "utf-16")\r
- IncludedFileList = gIncludePattern.findall(FileContent)\r
- else:\r
- try:\r
- FileContent = str(FileContent, "utf-8")\r
- IncludedFileList = gIncludePattern.findall(FileContent)\r
- except:\r
- pass\r
+ FileContent = unicode(FileContent, "utf-16")\r
IncludedFileList = gIncludePattern.findall(FileContent)\r
\r
for Inc in IncludedFileList:\r
ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
if ValueList[Index]:\r
DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
- try:\r
- ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
- except BadExpression as Value:\r
- EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
- ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
- TokenSpaceGuid, PcdCName, ValueList[Index]))\r
- except EvaluationException as Excpt:\r
- if hasattr(Excpt, 'Pcd'):\r
- if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
- " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
- " of the DSC file" % Excpt.Pcd,\r
- File=self.MetaFile, Line=LineNo)\r
+ if "{CODE(" not in ValueList[Index]:\r
+ try:\r
+ ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
+ except BadExpression as Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
+ ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
+ TokenSpaceGuid, PcdCName, ValueList[Index]))\r
+ except EvaluationException as Excpt:\r
+ if hasattr(Excpt, 'Pcd'):\r
+ if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+ " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+ " of the DSC file" % Excpt.Pcd,\r
+ File=self.MetaFile, Line=LineNo)\r
+ else:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+ File=self.MetaFile, Line=LineNo)\r
else:\r
- EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
File=self.MetaFile, Line=LineNo)\r
- else:\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
- File=self.MetaFile, Line=LineNo)\r
\r
if ValueList[Index]:\r
Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
\r
+ if GlobalData.BuildOptionPcd:\r
+ for pcd in GlobalData.BuildOptionPcd:\r
+ (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
for BuildData in self._Bdb._CACHE_.values():\r
+ if BuildData.Arch != self.Arch:\r
+ continue\r
if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
continue\r
for key in BuildData.Pcds:\r
PcdItem = BuildData.Pcds[key]\r
if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
PcdItem.DefaultValue = pcdvalue\r
+ PcdItem.PcdValueFromComm = pcdvalue\r
#In command line, the latter full assign value in commandLine should override the former field assign value.\r
#For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"\r
delete_assign = []\r
if not FieldName:\r
if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
PcdValue = '"' + PcdValue + '"'\r
+ elif not PcdValue.isdigit() and not PcdValue.upper().startswith('0X'):\r
+ PcdValue = '"' + PcdValue + '"'\r
else:\r
IsArray = False\r
Base = 10\r
self.Pcds[Name, Guid].DefaultValue = Value\r
return AllPcds\r
\r
+ def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
+ TokenSpaceCName = PcdCName = DimensionAttr = Field = ""\r
+ if "." in NamePart1:\r
+ TokenSpaceCName, TempPcdCName = NamePart1.split(".")\r
+ if "[" in TempPcdCName:\r
+ PcdCName = TempPcdCName[:TempPcdCName.index("[")]\r
+ DimensionAttr = TempPcdCName[TempPcdCName.index("["):]\r
+ else:\r
+ PcdCName = TempPcdCName\r
+ Field = NamePart2\r
+ else:\r
+ TokenSpaceCName = NamePart1\r
+ if "[" in NamePart2:\r
+ PcdCName = NamePart2[:NamePart2.index("[")]\r
+ DimensionAttr = NamePart2[NamePart2.index("["):]\r
+ else:\r
+ PcdCName = NamePart2\r
+\r
+ return TokenSpaceCName,PcdCName,DimensionAttr,Field\r
+\r
def UpdateStructuredPcds(self, TypeList, AllPcds):\r
\r
DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
Pcds = AllPcds\r
DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
SkuIds = self.SkuIds\r
+ self.SkuIdMgr.AvailableSkuIdSet.update({TAB_DEFAULT:0})\r
DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
+ DefaultStores.add(TAB_DEFAULT_STORES_DEFAULT)\r
\r
S_PcdSet = []\r
# Find out all possible PCD candidates for self._Arch\r
SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
if SkuName not in SkuIds:\r
continue\r
+ TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+ pcd_in_dec = self._DecPcds.get((PCName,TCName), None)\r
+ if pcd_in_dec is None:\r
+ EdkLogger.error('build', PARSER_ERROR,\r
+ "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+ File=self.MetaFile, Line = Dummy5)\r
+ if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in PcdCName):\r
+ if not isinstance (pcd_in_dec, StructurePcd):\r
+ EdkLogger.error('build', PARSER_ERROR,\r
+ "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+ File=self.MetaFile, Line = Dummy5)\r
\r
- if SkuName in SkuIds and "." in TokenSpaceGuid:\r
- S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+ S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
\r
# handle pcd value override\r
StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
for str_pcd in StrPcdSet:\r
str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
- if not isinstance (str_pcd_dec, StructurePcd):\r
- EdkLogger.error('build', PARSER_ERROR,\r
- "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
- File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
- if str_pcd_dec:\r
- str_pcd_obj_str = StructurePcd()\r
- str_pcd_obj_str.copy(str_pcd_dec)\r
- if str_pcd_obj:\r
- str_pcd_obj_str.copy(str_pcd_obj)\r
- if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
- str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
- else:\r
- str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
- for str_pcd_data in StrPcdSet[str_pcd]:\r
- if str_pcd_data[3] in SkuIds:\r
- str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[5])\r
- S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
- else:\r
- EdkLogger.error('build', PARSER_ERROR,\r
- "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
- File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
+ str_pcd_obj_str = StructurePcd()\r
+ str_pcd_obj_str.copy(str_pcd_dec)\r
+ if str_pcd_obj:\r
+ str_pcd_obj_str.copy(str_pcd_obj)\r
+ if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+ str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+ else:\r
+ str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+ for str_pcd_data in StrPcdSet[str_pcd]:\r
+ if str_pcd_data[4] in SkuIds:\r
+ str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+ S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
+\r
# Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
for Pcd in self.DecPcds:\r
if isinstance(self._DecPcds[Pcd], StructurePcd):\r
#\r
AvailableSkuIdSet = copy.copy(self.SkuIds)\r
\r
- PcdDict = tdict(True, 3)\r
+ PcdDict = tdict(True, 4)\r
PcdSet = set()\r
# Find out all possible PCD candidates for self._Arch\r
RecordList = self._RawData[Type, self._Arch]\r
EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
File=self.MetaFile, Line=Dummy5)\r
if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
- if "." not in TokenSpaceGuid:\r
+ if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
\r
else:\r
PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
\r
- for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items():\r
+ for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\r
if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
elif TAB_DEFAULT in PcdSetting:\r
False,\r
None,\r
IsDsc=True)\r
-\r
- if self.SkuIdMgr.SystemSkuId not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
- Pcds[PcdCName, TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId] = {}\r
- Pcds[PcdCName, TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
+ for SkuName in PcdValueDict[PcdCName, TokenSpaceGuid]:\r
+ Settings = PcdValueDict[PcdCName, TokenSpaceGuid][SkuName]\r
+ if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
+ Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+ Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]\r
return Pcds\r
\r
def GetStructurePcdMaxSize(self, str_pcd):\r
except:\r
EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
Result = Process.communicate()\r
- return Process.returncode, Result[0].decode(encoding='utf-8', errors='ignore'), Result[1].decode(encoding='utf-8', errors='ignore')\r
+ return Process.returncode, Result[0], Result[1]\r
\r
@staticmethod\r
def IntToCString(Value, ValueSize):\r
def GenerateSizeFunction(self, Pcd):\r
CApp = "// Default Value in Dec \n"\r
CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
- for FieldList in [Pcd.DefaultValues]:\r
+ if Pcd.IsArray():\r
+ if (len(Pcd.Capacity) == 1 and Pcd.Capacity[0] != '0') or (len(Pcd.Capacity) >1 and reduce(lambda x,y:int(x)*int(y), Pcd.Capacity)) > 0:\r
+ CApp += " *Size = (sizeof (%s) * (%s) > *Size) ? sizeof (%s) * (%s): *Size; \n" % (Pcd.BaseDatumType, "*".join(Pcd.Capacity),Pcd.BaseDatumType, "*".join(Pcd.Capacity))\r
+ if "{CODE(" in Pcd.DefaultValueFromDec:\r
+ CApp += " *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)\r
+ for skuname in Pcd.SkuInfoList:\r
+ skuobj = Pcd.SkuInfoList[skuname]\r
+ if skuobj.VariableName:\r
+ for defaultstore in skuobj.DefaultStoreDict:\r
+ CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
+ else:\r
+ CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
+ for index in Pcd.DefaultValues:\r
+ FieldList = Pcd.DefaultValues[index]\r
if not FieldList:\r
continue\r
for FieldName in FieldList:\r
continue\r
for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
- for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
- if not FieldList:\r
- continue\r
- for FieldName in FieldList:\r
- FieldName = "." + FieldName\r
- IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
- if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
- try:\r
- Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
- except BadExpression:\r
- EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
- (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
- Value, ValueSize = ParseFieldValue(Value)\r
- CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
- else:\r
- NewFieldName = ''\r
- FieldName_ori = FieldName.strip('.')\r
- while '[' in FieldName:\r
- NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
- ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
- FieldName = FieldName.split(']', 1)[1]\r
- FieldName = NewFieldName + FieldName\r
- while '[' in FieldName:\r
- FieldName = FieldName.rsplit('[', 1)[0]\r
- CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+ for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:\r
+ for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
+ if not FieldList:\r
+ continue\r
+ for FieldName in FieldList:\r
+ FieldName = "." + FieldName\r
+ IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+ if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
+ try:\r
+ Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
+ except BadExpression:\r
+ EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+ (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
+ Value, ValueSize = ParseFieldValue(Value)\r
+ CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+ else:\r
+ NewFieldName = ''\r
+ FieldName_ori = FieldName.strip('.')\r
+ while '[' in FieldName:\r
+ NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
+ ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+ FieldName = FieldName.split(']', 1)[1]\r
+ FieldName = NewFieldName + FieldName\r
+ while '[' in FieldName:\r
+ FieldName = FieldName.rsplit('[', 1)[0]\r
+ CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
if Pcd.PcdFieldValueFromFdf:\r
CApp = CApp + "// From fdf \n"\r
for FieldName in Pcd.PcdFieldValueFromFdf:\r
while '[' in FieldName:\r
FieldName = FieldName.rsplit('[', 1)[0]\r
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
- CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
+ if Pcd.GetPcdMaxSize():\r
+ CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
CApp = CApp + "}\n"\r
return CApp\r
\r
@staticmethod\r
def GenerateSizeStatments(Pcd):\r
- CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
+ if Pcd.IsArray():\r
+ r_datatype = [Pcd.BaseDatumType]\r
+ for dem in Pcd.Capacity:\r
+ if dem == '0':\r
+ r_datatype.append("[1]")\r
+ else:\r
+ r_datatype.append("[" + dem + "]")\r
+ CApp = ' Size = sizeof(%s);\n' % ("".join(r_datatype))\r
+ else:\r
+ CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
return CApp\r
\r
+ def GetIndicator(self,index,FieldName,Pcd):\r
+ def cleanupindex(indexstr):\r
+ return indexstr.strip("[").strip("]").strip()\r
+ index_elements = ArrayIndex.findall(index)\r
+ pcd_capacity = Pcd.Capacity\r
+ if index:\r
+ indicator = "(Pcd"\r
+ if len(pcd_capacity)>2:\r
+ for i in xrange(0,len(index_elements)):\r
+ index_ele = index_elements[i]\r
+ index_num = index_ele.strip("[").strip("]").strip()\r
+ if i == len(index_elements) -2:\r
+ indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i]))\r
+ break\r
+ else:\r
+ indicator += " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]))\r
+ elif len(pcd_capacity) == 2:\r
+ indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capacity[0]), index_elements[1].strip("[").strip("]").strip())\r
+ elif len(pcd_capacity) == 1:\r
+ index_ele = index_elements[0]\r
+ index_num = index_ele.strip("[").strip("]").strip()\r
+ indicator += " + %s)" % (index_num)\r
+ else:\r
+ indicator = "Pcd"\r
+ if FieldName:\r
+ indicator += "->" + FieldName\r
+ return indicator\r
+\r
+ def GetStarNum(self,Pcd):\r
+ if not Pcd.IsArray():\r
+ return 1\r
+ elif Pcd.IsSimpleTypeArray():\r
+ return len(Pcd.Capacity)\r
+ else:\r
+ return len(Pcd.Capacity) + 1\r
def GenerateDefaultValueAssignFunction(self, Pcd):\r
CApp = "// Default value in Dec \n"\r
- CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+ CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
CApp = CApp + ' UINT32 FieldSize;\n'\r
CApp = CApp + ' CHAR8 *Value;\n'\r
DefaultValueFromDec = Pcd.DefaultValueFromDec\r
#\r
# Use memcpy() to copy value into field\r
#\r
- CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
- CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
- for FieldList in [Pcd.DefaultValues]:\r
+ if "{CODE(" in Pcd.DefaultValueFromDec:\r
+ CApp = CApp + ' memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ else:\r
+ CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+ CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+ for index in Pcd.DefaultValues:\r
+ FieldList = Pcd.DefaultValues[index]\r
if not FieldList:\r
continue\r
for FieldName in FieldList:\r
Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
except Exception:\r
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
+\r
+ indicator = self.GetIndicator(index, FieldName,Pcd)\r
if isinstance(Value, str):\r
- CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
elif IsArray:\r
#\r
# Use memcpy() to copy value into field\r
#\r
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+ CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
+\r
else:\r
+ if '[' in FieldName and ']' in FieldName:\r
+ Index = int(FieldName.split('[')[1].split(']')[0])\r
+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
if ValueSize > 4:\r
- CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
else:\r
- CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
CApp = CApp + "}\n"\r
return CApp\r
\r
\r
def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
- CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType)\r
+ CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)\r
CApp = CApp + ' UINT32 FieldSize;\n'\r
CApp = CApp + ' CHAR8 *Value;\n'\r
\r
CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
- if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
- pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
+ if Pcd.Type in PCD_DYNAMIC_TYPE_SET or Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+ if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+ pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
+ else:\r
+ pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
else:\r
- pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
- for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:\r
- if not FieldList:\r
- continue\r
- if pcddefaultvalue and FieldList == pcddefaultvalue:\r
- IsArray = IsFieldValueAnArray(FieldList)\r
- if IsArray:\r
+ pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
+\r
+ if pcddefaultvalue:\r
+ FieldList = pcddefaultvalue\r
+ IsArray = IsFieldValueAnArray(FieldList)\r
+ if IsArray:\r
+ if "{CODE(" not in FieldList:\r
try:\r
FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
except BadExpression:\r
EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
- Value, ValueSize = ParseFieldValue (FieldList)\r
+ Value, ValueSize = ParseFieldValue (FieldList)\r
\r
- if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
- if isinstance(Value, str):\r
+ if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+ if isinstance(Value, str):\r
+ if "{CODE(" in Value:\r
+ CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+ else:\r
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
- elif IsArray:\r
- #\r
- # Use memcpy() to copy value into field\r
- #\r
+ elif IsArray:\r
+ #\r
+ # Use memcpy() to copy value into field\r
+ #\r
+ if Pcd.IsArray():\r
+ CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+ else:\r
CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
- else:\r
- if isinstance(Value, str):\r
+ else:\r
+ if isinstance(Value, str):\r
+ if "{CODE(" in Value:\r
+ CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+ else:\r
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
- elif IsArray:\r
- #\r
- # Use memcpy() to copy value into field\r
- #\r
+ elif IsArray:\r
+ #\r
+ # Use memcpy() to copy value into field\r
+ #\r
+ if Pcd.IsArray():\r
+ CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+ else:\r
CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+ inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
+ if not inheritvalue:\r
+ inheritvalue = []\r
+ for index in inheritvalue:\r
+ FieldList = inheritvalue[index]\r
+ if not FieldList:\r
continue\r
if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
for FieldName in FieldList:\r
+ indicator = self.GetIndicator(index, FieldName,Pcd)\r
IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
if IsArray:\r
try:\r
#\r
# Use memcpy() to copy value into field\r
#\r
- CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+ CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+ CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
else:\r
+ if '[' in FieldName and ']' in FieldName:\r
+ Index = int(FieldName.split('[')[1].split(']')[0])\r
+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
if ValueSize > 4:\r
- CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
else:\r
- CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
CApp = CApp + "}\n"\r
return CApp\r
\r
\r
def GenerateCommandLineValue(self, Pcd):\r
CApp = "// Value in CommandLine\n"\r
- CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+ CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
CApp = CApp + ' UINT32 FieldSize;\n'\r
CApp = CApp + ' CHAR8 *Value;\n'\r
\r
#\r
# Use memcpy() to copy value into field\r
#\r
- CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+ CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
else:\r
+ if '[' in FieldName and ']' in FieldName:\r
+ Index = int(FieldName.split('[')[1].split(']')[0])\r
+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
if ValueSize > 4:\r
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
else:\r
return CApp\r
def GenerateFdfValue(self,Pcd):\r
CApp = "// Value in Fdf\n"\r
- CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
+ CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)\r
CApp = CApp + ' UINT32 FieldSize;\n'\r
CApp = CApp + ' CHAR8 *Value;\n'\r
\r
#\r
# Use memcpy() to copy value into field\r
#\r
- CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+ CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+ CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
else:\r
+ if '[' in FieldName and ']' in FieldName:\r
+ Index = int(FieldName.split('[')[1].split(']')[0])\r
+ CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
if ValueSize > 4:\r
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
else:\r
return CApp\r
\r
def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
- OverrideValues = {DefaultStore:""}\r
+ OverrideValues = {DefaultStore:{}}\r
if Pcd.SkuOverrideValues:\r
OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
if not OverrideValues:\r
CApp = CApp + ' CHAR8 *Value;\n'\r
CApp = CApp + ' UINT32 OriginalSize;\n'\r
CApp = CApp + ' VOID *OriginalPcd;\n'\r
- CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+ CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
CApp = CApp + '\n'\r
\r
- if SkuName in Pcd.SkuInfoList:\r
- DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue)\r
- else:\r
- DefaultValue = Pcd.DefaultValue\r
- PcdDefaultValue = StringToArray(DefaultValue.strip())\r
+ PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
\r
- InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
+ InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType, PcdDefaultValue)\r
\r
#\r
# Get current PCD value and size\r
# Always keep that larger one as the current size\r
#\r
CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
- CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
+ CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
\r
#\r
#\r
# Set new PCD value and size\r
#\r
- CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+ CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
\r
#\r
# Free PCD\r
CApp = CApp + '}\n'\r
CApp = CApp + '\n'\r
return InitByteValue, CApp\r
+\r
+ def GenerateArrayAssignment(self, Pcd):\r
+ CApp = ""\r
+ if not Pcd:\r
+ return CApp\r
+ if not Pcd.IsArray():\r
+ return CApp\r
+ Demesion = ""\r
+ for d in Pcd.Capacity:\r
+ if d == "0":\r
+ Demesion += "[]"\r
+ else:\r
+ Demesion += "["+d+"]"\r
+\r
+ Value = Pcd.DefaultValueFromDec\r
+ if "{CODE(" in Pcd.DefaultValueFromDec:\r
+ realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+ CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+\r
+ for skuname in Pcd.SkuInfoList:\r
+ skuinfo = Pcd.SkuInfoList[skuname]\r
+ if skuinfo.VariableName:\r
+ for defaultstore in skuinfo.DefaultStoreDict:\r
+ Value = skuinfo[defaultstore]\r
+ if "{CODE(" in Value:\r
+ realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+ CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
+ else:\r
+ Value = skuinfo.DefaultValue\r
+ if "{CODE(" in Value:\r
+ realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+ CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)\r
+ return CApp\r
def SkuOverrideValuesEmpty(self,OverrideValues):\r
if not OverrideValues:\r
return True\r
return False\r
return True\r
\r
+ def ParseCCFlags(self, ccflag):\r
+ ccflags = set()\r
+ flag = ""\r
+ for ch in ccflag:\r
+ if ch in (r"/", "-"):\r
+ if flag.strip():\r
+ ccflags.add(flag.strip())\r
+ flag = ch\r
+ else:\r
+ flag += ch\r
+ if flag.strip():\r
+ ccflags.add(flag.strip())\r
+ return ccflags\r
def GenerateByteArrayValue (self, StructuredPcds):\r
#\r
# Generate/Compile/Run C application to determine if there are any flexible array members\r
IncludeFiles.add(IncludeFile)\r
CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
CApp = CApp + '\n'\r
+ for Pcd in StructuredPcds.values():\r
+ CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
for PcdName in StructuredPcds:\r
Pcd = StructuredPcds[PcdName]\r
CApp = CApp + self.GenerateSizeFunction(Pcd)\r
\r
MakeApp = PcdMakefileHeader\r
if sys.platform == "win32":\r
- MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
+ MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
else:\r
MakeApp = MakeApp + PcdGccMakefile\r
- MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
+ MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
\r
IncSearchList = []\r
Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
if Tool != 'CC':\r
continue\r
+ if Attr != "FLAGS":\r
+ continue\r
+ if Target == TAB_STAR or Target == self._Target:\r
+ if Tag == TAB_STAR or Tag == self._Toolchain:\r
+ if 'COMMON' not in BuildOptions:\r
+ BuildOptions['COMMON'] = set()\r
+ if Arch == TAB_STAR:\r
+ BuildOptions['COMMON'].add(self.BuildOptions[Options])\r
+ if Arch in self.SupArchList:\r
+ if Arch not in BuildOptions:\r
+ BuildOptions[Arch] = set()\r
+ BuildOptions[Arch] |= self.ParseCCFlags(self.BuildOptions[Options])\r
\r
- if Target == "*" or Target == self._Target:\r
- if Tag == "*" or Tag == self._Toolchain:\r
- if Arch == "*" or Arch == self.Arch:\r
- if Tool not in BuildOptions:\r
- BuildOptions[Tool] = OrderedDict()\r
- if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
- BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
- else:\r
- # append options for the same tool except PATH\r
- if Attr != 'PATH':\r
- BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
- else:\r
- BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
if BuildOptions:\r
- for Tool in BuildOptions:\r
- for Attr in BuildOptions[Tool]:\r
- if Attr == "FLAGS":\r
- Value = BuildOptions[Tool][Attr]\r
- ValueList = Value.split()\r
- if ValueList:\r
- for Id, Item in enumerate(ValueList):\r
- if Item in ['-D', '/D', '-U', '/U']:\r
- CC_FLAGS += ' ' + Item\r
- if Id + 1 < len(ValueList):\r
- CC_FLAGS += ' ' + ValueList[Id + 1]\r
- elif Item.startswith(('-D', '/D', '-U', '/U')):\r
- CC_FLAGS += ' ' + Item\r
+ ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
+ if len(ArchBuildOptions.keys()) == 1:\r
+ BuildOptions['COMMON'] |= (ArchBuildOptions.values()[0])\r
+ elif len(ArchBuildOptions.keys()) > 1:\r
+ CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
+ BuildOptions['COMMON'] |= CommonBuildOptions\r
+ ValueList = list(BuildOptions['COMMON'])\r
+ CC_FLAGS += " ".join([item for item in ValueList if item.startswith(('-D', '/D', '-U', '/U'))])\r
MakeApp += CC_FLAGS\r
\r
if sys.platform == "win32":\r
MakeApp = MakeApp + PcdMakefileEnd\r
+ MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """)\r
+ else:\r
+ MakeApp = MakeApp + AppTarget % ("""\tcp $(APPLICATION) $(APPFILE) """)\r
MakeApp = MakeApp + '\n'\r
IncludeFileFullPaths = []\r
for includefile in IncludeFiles:\r
OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
SaveFileOnChange(InputValueFile, InitByteValue, False)\r
\r
- PcdValueInitExe = PcdValueInitName\r
+ Dest_PcdValueInitExe = PcdValueInitName\r
if not sys.platform == "win32":\r
- PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
+ Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
else:\r
- PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
-\r
+ Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
Messages = ''\r
if sys.platform == "win32":\r
MakeCommand = 'nmake -f %s' % (MakeFileName)\r
MakeCommand = 'make -f %s' % (MakeFileName)\r
returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
Messages = StdErr\r
+\r
Messages = Messages.split('\n')\r
MessageGroup = []\r
if returncode != 0:\r
FileLine = FileInfo [1].split (')')[0]\r
else:\r
FileInfo = Message.strip().split(':')\r
+ if len(FileInfo) < 2:\r
+ continue\r
FileName = FileInfo [0]\r
FileLine = FileInfo [1]\r
if FileLine.isdigit():\r
else:\r
EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
\r
- if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
- Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
+ if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
+ Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
if returncode != 0:\r
EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
if SkuName not in AvailableSkuIdSet:\r
EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
File=self.MetaFile, Line=Dummy5)\r
- if "." not in TokenSpaceGuid:\r
+ if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
\r
if DefaultStore not in DefaultStoresDefine:\r
EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
File=self.MetaFile, Line=Dummy5)\r
- if "." not in TokenSpaceGuid:\r
+ if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
for pcd in Pcds.values():\r
- SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
+ SkuInfoObj = pcd.SkuInfoList.values()[0]\r
pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
pcd.DatumType = pcdDecObject.DatumType\r
# Only fix the value while no value provided in DSC file.\r
if SkuName not in AvailableSkuIdSet:\r
EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
File=self.MetaFile, Line=Dummy5)\r
- if "." not in TokenSpaceGuid:\r
+ if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
\r
elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
del pcd.SkuInfoList[TAB_COMMON]\r
\r
+ #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",\r
+ #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".\r
+ for pcd in Pcds.values():\r
+ PcdValueTypeSet = set()\r
+ for sku in pcd.SkuInfoList.values():\r
+ PcdValueTypeSet.add("UnicodeString" if sku.DefaultValue.startswith(('L"',"L'")) else "OtherVOID*")\r
+ if len(PcdValueTypeSet) > 1:\r
+ for sku in pcd.SkuInfoList.values():\r
+ sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\r
\r
map(self.FilterSkuSettings, Pcds.values())\r
return Pcds\r
ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
PkgSet.update(ModuleData.Packages)\r
self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
+ self._GuidDict.update(GlobalData.gPlatformPcds)\r
return self._DecPcds\r