\r
def __call__(self, RealValue=False, Depth=0):\r
PcdValue = self.PcdValue\r
- try:\r
- PcdValue = ValueExpression.__call__(self, RealValue, Depth)\r
- if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or PcdValue.startswith("L'")):\r
- PcdValue, Size = ParseFieldValue(PcdValue)\r
- PcdValueList = []\r
- for I in range(Size):\r
- PcdValueList.append('0x%02X'%(PcdValue & 0xff))\r
- PcdValue = PcdValue >> 8\r
- PcdValue = '{' + ','.join(PcdValueList) + '}'\r
- elif self.PcdType in TAB_PCD_NUMERIC_TYPES and (PcdValue.startswith("'") or \\r
- PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')):\r
- raise BadExpression\r
- except WrnExpression as Value:\r
- PcdValue = Value.result\r
- except BadExpression as Value:\r
- if self.PcdType in TAB_PCD_NUMERIC_TYPES:\r
- PcdValue = PcdValue.strip()\r
- if PcdValue.startswith('{') and PcdValue.endswith('}'):\r
- PcdValue = SplitPcdValueString(PcdValue[1:-1])\r
- if ERR_STRING_CMP.split(':')[0] in Value.message:\r
- raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
- if isinstance(PcdValue, type([])):\r
- TmpValue = 0\r
- Size = 0\r
- ValueType = ''\r
- for Item in PcdValue:\r
- Item = Item.strip()\r
- if Item.startswith(TAB_UINT8):\r
- ItemSize = 1\r
- ValueType = TAB_UINT8\r
- elif Item.startswith(TAB_UINT16):\r
- ItemSize = 2\r
- ValueType = TAB_UINT16\r
- elif Item.startswith(TAB_UINT32):\r
- ItemSize = 4\r
- ValueType = TAB_UINT32\r
- elif Item.startswith(TAB_UINT64):\r
- ItemSize = 8\r
- ValueType = TAB_UINT64\r
- elif Item[0] in {'"', "'", 'L'}:\r
- ItemSize = 0\r
- ValueType = TAB_VOID\r
- else:\r
- ItemSize = 0\r
- ValueType = TAB_UINT8\r
- Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
-\r
- if ItemSize == 0:\r
- try:\r
- tmpValue = int(Item, 0)\r
- if tmpValue > 255:\r
- raise BadExpression("Byte array number %s should less than 0xFF." % Item)\r
- except BadExpression as Value:\r
- raise BadExpression(Value)\r
- except ValueError:\r
- pass\r
- ItemValue, ItemSize = ParseFieldValue(Item)\r
- else:\r
- ItemValue = ParseFieldValue(Item)[0]\r
-\r
- if isinstance(ItemValue, type('')):\r
- ItemValue = int(ItemValue, 0)\r
-\r
- TmpValue = (ItemValue << (Size * 8)) | TmpValue\r
- Size = Size + ItemSize\r
- else:\r
- try:\r
- TmpValue, Size = ParseFieldValue(PcdValue)\r
- except BadExpression as Value:\r
- raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
- if isinstance(TmpValue, type('')):\r
- try:\r
- TmpValue = int(TmpValue)\r
- except:\r
- raise BadExpression(Value)\r
- else:\r
- PcdValue = '0x%0{}X'.format(Size) % (TmpValue)\r
- if TmpValue < 0:\r
- raise BadExpression('Type %s PCD Value is negative' % self.PcdType)\r
- if self.PcdType == TAB_UINT8 and Size > 1:\r
- raise BadExpression('Type %s PCD Value Size is Larger than 1 byte' % self.PcdType)\r
- if self.PcdType == TAB_UINT16 and Size > 2:\r
- raise BadExpression('Type %s PCD Value Size is Larger than 2 byte' % self.PcdType)\r
- if self.PcdType == TAB_UINT32 and Size > 4:\r
- raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)\r
- if self.PcdType == TAB_UINT64 and Size > 8:\r
- raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)\r
- else:\r
- try:\r
- TmpValue = int(PcdValue)\r
- TmpList = []\r
- if TmpValue.bit_length() == 0:\r
- PcdValue = '{0x00}'\r
- else:\r
- for I in range((TmpValue.bit_length() + 7) / 8):\r
- TmpList.append('0x%02x' % ((TmpValue >> I * 8) & 0xff))\r
- PcdValue = '{' + ', '.join(TmpList) + '}'\r
- except:\r
- if PcdValue.strip().startswith('{'):\r
- PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])\r
- LabelDict = {}\r
- NewPcdValueList = []\r
- LabelOffset = 0\r
- for Item in PcdValueList:\r
- # compute byte offset of every LABEL\r
- LabelList = _ReLabel.findall(Item)\r
- Item = _ReLabel.sub('', Item)\r
+ if "{CODE(" not in PcdValue:\r
+ try:\r
+ PcdValue = ValueExpression.__call__(self, RealValue, Depth)\r
+ if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or PcdValue.startswith("L'")):\r
+ PcdValue, Size = ParseFieldValue(PcdValue)\r
+ PcdValueList = []\r
+ for I in range(Size):\r
+ PcdValueList.append('0x%02X'%(PcdValue & 0xff))\r
+ PcdValue = PcdValue >> 8\r
+ PcdValue = '{' + ','.join(PcdValueList) + '}'\r
+ elif self.PcdType in TAB_PCD_NUMERIC_TYPES and (PcdValue.startswith("'") or \\r
+ PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')):\r
+ raise BadExpression\r
+ except WrnExpression as Value:\r
+ PcdValue = Value.result\r
+ except BadExpression as Value:\r
+ if self.PcdType in TAB_PCD_NUMERIC_TYPES:\r
+ PcdValue = PcdValue.strip()\r
+ if PcdValue.startswith('{') and PcdValue.endswith('}'):\r
+ PcdValue = SplitPcdValueString(PcdValue[1:-1])\r
+ if isinstance(PcdValue, type([])):\r
+ TmpValue = 0\r
+ Size = 0\r
+ ValueType = ''\r
+ for Item in PcdValue:\r
Item = Item.strip()\r
- if LabelList:\r
- for Label in LabelList:\r
- if not IsValidCName(Label):\r
- raise BadExpression('%s is not a valid c variable name' % Label)\r
- if Label not in LabelDict:\r
- LabelDict[Label] = str(LabelOffset)\r
if Item.startswith(TAB_UINT8):\r
- LabelOffset = LabelOffset + 1\r
+ ItemSize = 1\r
+ ValueType = TAB_UINT8\r
elif Item.startswith(TAB_UINT16):\r
- LabelOffset = LabelOffset + 2\r
+ ItemSize = 2\r
+ ValueType = TAB_UINT16\r
elif Item.startswith(TAB_UINT32):\r
- LabelOffset = LabelOffset + 4\r
+ ItemSize = 4\r
+ ValueType = TAB_UINT32\r
elif Item.startswith(TAB_UINT64):\r
- LabelOffset = LabelOffset + 8\r
+ ItemSize = 8\r
+ ValueType = TAB_UINT64\r
+ elif Item[0] in {'"', "'", 'L'}:\r
+ ItemSize = 0\r
+ ValueType = TAB_VOID\r
else:\r
+ ItemSize = 0\r
+ ValueType = TAB_UINT8\r
+ Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+ if ItemSize == 0:\r
try:\r
- ItemValue, ItemSize = ParseFieldValue(Item)\r
- LabelOffset = LabelOffset + ItemSize\r
- except:\r
- LabelOffset = LabelOffset + 1\r
-\r
- for Item in PcdValueList:\r
- # for LABEL parse\r
- Item = Item.strip()\r
- try:\r
- Item = _ReLabel.sub('', Item)\r
- except:\r
- pass\r
- try:\r
- OffsetList = _ReOffset.findall(Item)\r
- except:\r
- pass\r
- # replace each offset, except errors\r
- for Offset in OffsetList:\r
- try:\r
- Item = Item.replace('OFFSET_OF({})'.format(Offset), LabelDict[Offset])\r
- except:\r
- raise BadExpression('%s not defined' % Offset)\r
-\r
- NewPcdValueList.append(Item)\r
-\r
- AllPcdValueList = []\r
- for Item in NewPcdValueList:\r
- Size = 0\r
- ValueStr = ''\r
- TokenSpaceGuidName = ''\r
- if Item.startswith(TAB_GUID) and Item.endswith(')'):\r
- try:\r
- TokenSpaceGuidName = re.search('GUID\((\w+)\)', Item).group(1)\r
- except:\r
+ tmpValue = int(Item, 0)\r
+ if tmpValue > 255:\r
+ raise BadExpression("Byte array number %s should less than 0xFF." % Item)\r
+ except BadExpression as Value:\r
+ raise BadExpression(Value)\r
+ except ValueError:\r
pass\r
- if TokenSpaceGuidName and TokenSpaceGuidName in self._Symb:\r
- Item = 'GUID(' + self._Symb[TokenSpaceGuidName] + ')'\r
- elif TokenSpaceGuidName:\r
- raise BadExpression('%s not found in DEC file' % TokenSpaceGuidName)\r
- Item, Size = ParseFieldValue(Item)\r
- for Index in range(0, Size):\r
- ValueStr = '0x%02X' % (int(Item) & 255)\r
- Item >>= 8\r
- AllPcdValueList.append(ValueStr)\r
- continue\r
- elif Item.startswith('DEVICE_PATH') and Item.endswith(')'):\r
- Item, Size = ParseFieldValue(Item)\r
- AllPcdValueList.append(Item[1:-1])\r
- continue\r
+ ItemValue, ItemSize = ParseFieldValue(Item)\r
else:\r
- ValueType = ""\r
+ ItemValue = ParseFieldValue(Item)[0]\r
+\r
+ if isinstance(ItemValue, type('')):\r
+ ItemValue = int(ItemValue, 0)\r
+\r
+ TmpValue = (ItemValue << (Size * 8)) | TmpValue\r
+ Size = Size + ItemSize\r
+ else:\r
+ try:\r
+ TmpValue, Size = ParseFieldValue(PcdValue)\r
+ except BadExpression as Value:\r
+ raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
+ if isinstance(TmpValue, type('')):\r
+ try:\r
+ TmpValue = int(TmpValue)\r
+ except:\r
+ raise BadExpression(Value)\r
+ else:\r
+ PcdValue = '0x%0{}X'.format(Size) % (TmpValue)\r
+ if TmpValue < 0:\r
+ raise BadExpression('Type %s PCD Value is negative' % self.PcdType)\r
+ if self.PcdType == TAB_UINT8 and Size > 1:\r
+ raise BadExpression('Type %s PCD Value Size is Larger than 1 byte' % self.PcdType)\r
+ if self.PcdType == TAB_UINT16 and Size > 2:\r
+ raise BadExpression('Type %s PCD Value Size is Larger than 2 byte' % self.PcdType)\r
+ if self.PcdType == TAB_UINT32 and Size > 4:\r
+ raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)\r
+ if self.PcdType == TAB_UINT64 and Size > 8:\r
+ raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)\r
+ else:\r
+ try:\r
+ TmpValue = int(PcdValue)\r
+ TmpList = []\r
+ if TmpValue.bit_length() == 0:\r
+ PcdValue = '{0x00}'\r
+ else:\r
+ for I in range((TmpValue.bit_length() + 7) / 8):\r
+ TmpList.append('0x%02x' % ((TmpValue >> I * 8) & 0xff))\r
+ PcdValue = '{' + ', '.join(TmpList) + '}'\r
+ except:\r
+ if PcdValue.strip().startswith('{'):\r
+ PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])\r
+ LabelDict = {}\r
+ NewPcdValueList = []\r
+ LabelOffset = 0\r
+ for Item in PcdValueList:\r
+ # compute byte offset of every LABEL\r
+ LabelList = _ReLabel.findall(Item)\r
+ Item = _ReLabel.sub('', Item)\r
+ Item = Item.strip()\r
+ if LabelList:\r
+ for Label in LabelList:\r
+ if not IsValidCName(Label):\r
+ raise BadExpression('%s is not a valid c variable name' % Label)\r
+ if Label not in LabelDict:\r
+ LabelDict[Label] = str(LabelOffset)\r
if Item.startswith(TAB_UINT8):\r
- ItemSize = 1\r
- ValueType = TAB_UINT8\r
+ LabelOffset = LabelOffset + 1\r
elif Item.startswith(TAB_UINT16):\r
- ItemSize = 2\r
- ValueType = TAB_UINT16\r
+ LabelOffset = LabelOffset + 2\r
elif Item.startswith(TAB_UINT32):\r
- ItemSize = 4\r
- ValueType = TAB_UINT32\r
+ LabelOffset = LabelOffset + 4\r
elif Item.startswith(TAB_UINT64):\r
- ItemSize = 8\r
- ValueType = TAB_UINT64\r
- else:\r
- ItemSize = 0\r
- if ValueType:\r
- TmpValue = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+ LabelOffset = LabelOffset + 8\r
else:\r
- TmpValue = ValueExpressionEx(Item, self.PcdType, self._Symb)(True)\r
- Item = '0x%x' % TmpValue if not isinstance(TmpValue, type('')) else TmpValue\r
- if ItemSize == 0:\r
- ItemValue, ItemSize = ParseFieldValue(Item)\r
- if Item[0] not in {'"', 'L', '{'} and ItemSize > 1:\r
- raise BadExpression("Byte array number %s should less than 0xFF." % Item)\r
+ try:\r
+ ItemValue, ItemSize = ParseFieldValue(Item)\r
+ LabelOffset = LabelOffset + ItemSize\r
+ except:\r
+ LabelOffset = LabelOffset + 1\r
+\r
+ for Item in PcdValueList:\r
+ # for LABEL parse\r
+ Item = Item.strip()\r
+ try:\r
+ Item = _ReLabel.sub('', Item)\r
+ except:\r
+ pass\r
+ try:\r
+ OffsetList = _ReOffset.findall(Item)\r
+ except:\r
+ pass\r
+ # replace each offset, except errors\r
+ for Offset in OffsetList:\r
+ try:\r
+ Item = Item.replace('OFFSET_OF({})'.format(Offset), LabelDict[Offset])\r
+ except:\r
+ raise BadExpression('%s not defined' % Offset)\r
+\r
+ NewPcdValueList.append(Item)\r
+\r
+ AllPcdValueList = []\r
+ for Item in NewPcdValueList:\r
+ Size = 0\r
+ ValueStr = ''\r
+ TokenSpaceGuidName = ''\r
+ if Item.startswith(TAB_GUID) and Item.endswith(')'):\r
+ try:\r
+ TokenSpaceGuidName = re.search('GUID\((\w+)\)', Item).group(1)\r
+ except:\r
+ pass\r
+ if TokenSpaceGuidName and TokenSpaceGuidName in self._Symb:\r
+ Item = 'GUID(' + self._Symb[TokenSpaceGuidName] + ')'\r
+ elif TokenSpaceGuidName:\r
+ raise BadExpression('%s not found in DEC file' % TokenSpaceGuidName)\r
+ Item, Size = ParseFieldValue(Item)\r
+ for Index in range(0, Size):\r
+ ValueStr = '0x%02X' % (int(Item) & 255)\r
+ Item >>= 8\r
+ AllPcdValueList.append(ValueStr)\r
+ continue\r
+ elif Item.startswith('DEVICE_PATH') and Item.endswith(')'):\r
+ Item, Size = ParseFieldValue(Item)\r
+ AllPcdValueList.append(Item[1:-1])\r
+ continue\r
else:\r
- ItemValue = ParseFieldValue(Item)[0]\r
- for I in range(0, ItemSize):\r
- ValueStr = '0x%02X' % (int(ItemValue) & 255)\r
- ItemValue >>= 8\r
- AllPcdValueList.append(ValueStr)\r
- Size += ItemSize\r
-\r
- if Size > 0:\r
- PcdValue = '{' + ','.join(AllPcdValueList) + '}'\r
- else:\r
- raise BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))\r
+ ValueType = ""\r
+ if Item.startswith(TAB_UINT8):\r
+ ItemSize = 1\r
+ ValueType = TAB_UINT8\r
+ elif Item.startswith(TAB_UINT16):\r
+ ItemSize = 2\r
+ ValueType = TAB_UINT16\r
+ elif Item.startswith(TAB_UINT32):\r
+ ItemSize = 4\r
+ ValueType = TAB_UINT32\r
+ elif Item.startswith(TAB_UINT64):\r
+ ItemSize = 8\r
+ ValueType = TAB_UINT64\r
+ else:\r
+ ItemSize = 0\r
+ if ValueType:\r
+ TmpValue = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+ else:\r
+ TmpValue = ValueExpressionEx(Item, self.PcdType, self._Symb)(True)\r
+ Item = '0x%x' % TmpValue if not isinstance(TmpValue, type('')) else TmpValue\r
+ if ItemSize == 0:\r
+ ItemValue, ItemSize = ParseFieldValue(Item)\r
+ if Item[0] not in {'"', 'L', '{'} and ItemSize > 1:\r
+ raise BadExpression("Byte array number %s should less than 0xFF." % Item)\r
+ else:\r
+ ItemValue = ParseFieldValue(Item)[0]\r
+ for I in range(0, ItemSize):\r
+ ValueStr = '0x%02X' % (int(ItemValue) & 255)\r
+ ItemValue >>= 8\r
+ AllPcdValueList.append(ValueStr)\r
+ Size += ItemSize\r
+\r
+ if Size > 0:\r
+ PcdValue = '{' + ','.join(AllPcdValueList) + '}'\r
+ else:\r
+ raise BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))\r
\r
- if PcdValue == 'True':\r
- PcdValue = '1'\r
- if PcdValue == 'False':\r
- PcdValue = '0'\r
+ if PcdValue == 'True':\r
+ PcdValue = '1'\r
+ if PcdValue == 'False':\r
+ PcdValue = '0'\r
\r
if RealValue:\r
return PcdValue\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
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
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
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
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
- PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
- PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
+ if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\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
for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\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
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
pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
else:\r
pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\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
+\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
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
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
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
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
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
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