]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
CommitLineData
e8a47801
LG
1## @file\r
2# Routines for generating Pcd Database\r
3#\r
c33081c9 4# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
2e351cbe 5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
e8a47801 6#\r
1ccc4d89 7from __future__ import absolute_import\r
86379ac4 8from io import BytesIO\r
e8a47801 9from Common.Misc import *\r
5a57246e 10from Common.StringUtils import StringToArray\r
e8a47801 11from struct import pack\r
0ff3b52e
GL
12from .ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER\r
13from .ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB\r
14from .ValidCheckingInfoObject import GetValidationObject\r
82a6a960 15from Common.VariableAttributes import VariableAttributes\r
2b8a6c44
LG
16import copy\r
17from struct import unpack\r
656d2539 18from Common.DataType import *\r
938cf4c3
CJ
19from Common import GlobalData\r
20from Common import EdkLogger\r
21import Common.LongFilePathOs as os\r
e8a47801 22\r
2b8a6c44 23DATABASE_VERSION = 7\r
e8a47801
LG
24\r
25gPcdDatabaseAutoGenC = TemplateString("""\r
26//\r
27// External PCD database debug information\r
28//\r
29#if 0\r
30${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
a01f68bd
YZ
31 /* SkuIdTable */\r
32 { ${BEGIN}${SKUID_VALUE}, ${END} },\r
e8a47801
LG
33${BEGIN} { ${INIT_VALUE_UINT64} }, /* ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */\r
34${END}\r
35${BEGIN} ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */\r
36${END}\r
37${BEGIN} { ${INIT_VALUE_UINT32} }, /* ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}] */\r
38${END}\r
39${BEGIN} ${VARDEF_VALUE_UINT32}, /* ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32} */\r
40${END}\r
41 /* VPD */\r
42${BEGIN} { ${VPD_HEAD_VALUE} }, /* ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}] */\r
43${END}\r
44 /* ExMapTable */\r
45 {\r
46${BEGIN} { ${EXMAPPING_TABLE_EXTOKEN}, ${EXMAPPING_TABLE_LOCAL_TOKEN}, ${EXMAPPING_TABLE_GUID_INDEX} },\r
47${END}\r
48 },\r
49 /* LocalTokenNumberTable */\r
50 {\r
51${BEGIN} offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}${VARDEF_HEADER}) | ${TOKEN_TYPE},\r
52${END}\r
53 },\r
54 /* GuidTable */\r
55 {\r
56${BEGIN} ${GUID_STRUCTURE},\r
57${END}\r
58 },\r
59${BEGIN} { ${STRING_HEAD_VALUE} }, /* ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}] */\r
60${END}\r
61${BEGIN} /* ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}] */\r
62 {\r
63 ${VARIABLE_HEAD_VALUE}\r
64 },\r
65${END}\r
66/* SkuHead */\r
67 {\r
68 ${BEGIN} offsetof (${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}${VARDEF_HEADER}) | ${TOKEN_TYPE}, /* */\r
69 offsetof (${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.SkuHead) /* */\r
70 ${END}\r
71 },\r
72 /* StringTable */\r
73${BEGIN} ${STRING_TABLE_VALUE}, /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */\r
74${END}\r
75 /* SizeTable */\r
76 {\r
77${BEGIN} ${SIZE_TABLE_MAXIMUM_LENGTH}, ${SIZE_TABLE_CURRENT_LENGTH}, /* ${SIZE_TABLE_CNAME}_${SIZE_TABLE_GUID} */\r
78${END}\r
79 },\r
80${BEGIN} { ${INIT_VALUE_UINT16} }, /* ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}] */\r
81${END}\r
82${BEGIN} ${VARDEF_VALUE_UINT16}, /* ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16} */\r
83${END}\r
84${BEGIN} { ${INIT_VALUE_UINT8} }, /* ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}] */\r
85${END}\r
86${BEGIN} ${VARDEF_VALUE_UINT8}, /* ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8} */\r
87${END}\r
88${BEGIN} { ${INIT_VALUE_BOOLEAN} }, /* ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}] */\r
89${END}\r
90${BEGIN} ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */\r
91${END}\r
e8a47801
LG
92 ${SYSTEM_SKU_ID_VALUE}\r
93};\r
94#endif\r
95""")\r
96\r
97## Mapping between PCD driver type and EFI phase\r
98gPcdPhaseMap = {\r
99 "PEI_PCD_DRIVER" : "PEI",\r
100 "DXE_PCD_DRIVER" : "DXE"\r
101}\r
102\r
103gPcdDatabaseAutoGenH = TemplateString("""\r
104#define PCD_${PHASE}_SERVICE_DRIVER_VERSION ${SERVICE_DRIVER_VERSION}\r
105\r
106//\r
107// External PCD database debug information\r
108//\r
109#if 0\r
110#define ${PHASE}_GUID_TABLE_SIZE ${GUID_TABLE_SIZE}\r
111#define ${PHASE}_STRING_TABLE_SIZE ${STRING_TABLE_SIZE}\r
112#define ${PHASE}_SKUID_TABLE_SIZE ${SKUID_TABLE_SIZE}\r
113#define ${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE ${LOCAL_TOKEN_NUMBER_TABLE_SIZE}\r
114#define ${PHASE}_LOCAL_TOKEN_NUMBER ${LOCAL_TOKEN_NUMBER}\r
115#define ${PHASE}_EXMAPPING_TABLE_SIZE ${EXMAPPING_TABLE_SIZE}\r
116#define ${PHASE}_EX_TOKEN_NUMBER ${EX_TOKEN_NUMBER}\r
117#define ${PHASE}_SIZE_TABLE_SIZE ${SIZE_TABLE_SIZE}\r
e8a47801
LG
118#define ${PHASE}_GUID_TABLE_EMPTY ${GUID_TABLE_EMPTY}\r
119#define ${PHASE}_STRING_TABLE_EMPTY ${STRING_TABLE_EMPTY}\r
120#define ${PHASE}_SKUID_TABLE_EMPTY ${SKUID_TABLE_EMPTY}\r
121#define ${PHASE}_DATABASE_EMPTY ${DATABASE_EMPTY}\r
122#define ${PHASE}_EXMAP_TABLE_EMPTY ${EXMAP_TABLE_EMPTY}\r
123\r
124typedef struct {\r
a01f68bd 125 UINT64 SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
e8a47801
LG
126${BEGIN} UINT64 ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}];\r
127${END}\r
128${BEGIN} UINT64 ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64};\r
129${END}\r
130${BEGIN} UINT32 ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}];\r
131${END}\r
132${BEGIN} UINT32 ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32};\r
133${END}\r
134${BEGIN} VPD_HEAD ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}];\r
135${END}\r
136 DYNAMICEX_MAPPING ExMapTable[${PHASE}_EXMAPPING_TABLE_SIZE];\r
137 UINT32 LocalTokenNumberTable[${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r
138 GUID GuidTable[${PHASE}_GUID_TABLE_SIZE];\r
139${BEGIN} STRING_HEAD ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}];\r
140${END}\r
141${BEGIN} VARIABLE_HEAD ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}];\r
e8a47801
LG
142${BEGIN} UINT8 StringTable${STRING_TABLE_INDEX}[${STRING_TABLE_LENGTH}]; /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */\r
143${END}\r
144 SIZE_INFO SizeTable[${PHASE}_SIZE_TABLE_SIZE];\r
145${BEGIN} UINT16 ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}];\r
146${END}\r
147${BEGIN} UINT16 ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16};\r
148${END}\r
149${BEGIN} UINT8 ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}];\r
150${END}\r
151${BEGIN} UINT8 ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8};\r
152${END}\r
153${BEGIN} BOOLEAN ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}];\r
154${END}\r
155${BEGIN} BOOLEAN ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN};\r
156${END}\r
e8a47801
LG
157${SYSTEM_SKU_ID}\r
158} ${PHASE}_PCD_DATABASE_INIT;\r
159\r
160typedef struct {\r
161${PCD_DATABASE_UNINIT_EMPTY}\r
162${BEGIN} UINT64 ${UNINIT_CNAME_DECL_UINT64}_${UNINIT_GUID_DECL_UINT64}[${UNINIT_NUMSKUS_DECL_UINT64}];\r
163${END}\r
164${BEGIN} UINT32 ${UNINIT_CNAME_DECL_UINT32}_${UNINIT_GUID_DECL_UINT32}[${UNINIT_NUMSKUS_DECL_UINT32}];\r
165${END}\r
166${BEGIN} UINT16 ${UNINIT_CNAME_DECL_UINT16}_${UNINIT_GUID_DECL_UINT16}[${UNINIT_NUMSKUS_DECL_UINT16}];\r
167${END}\r
168${BEGIN} UINT8 ${UNINIT_CNAME_DECL_UINT8}_${UNINIT_GUID_DECL_UINT8}[${UNINIT_NUMSKUS_DECL_UINT8}];\r
169${END}\r
170${BEGIN} BOOLEAN ${UNINIT_CNAME_DECL_BOOLEAN}_${UNINIT_GUID_DECL_BOOLEAN}[${UNINIT_NUMSKUS_DECL_BOOLEAN}];\r
171${END}\r
172} ${PHASE}_PCD_DATABASE_UNINIT;\r
173\r
174typedef struct {\r
175 //GUID Signature; // PcdDataBaseGuid\r
a01f68bd 176 //UINT32 BuildVersion;\r
e8a47801 177 //UINT32 Length;\r
7e6e459a
LG
178 //SKU_ID SystemSkuId; // Current SkuId value.\r
179 //UINT32 LengthForAllSkus; // Length of all SKU PCD DB\r
e8a47801
LG
180 //UINT32 UninitDataBaseSize;// Total size for PCD those default value with 0.\r
181 //TABLE_OFFSET LocalTokenNumberTableOffset;\r
182 //TABLE_OFFSET ExMapTableOffset;\r
f7496d71 183 //TABLE_OFFSET GuidTableOffset;\r
e8a47801
LG
184 //TABLE_OFFSET StringTableOffset;\r
185 //TABLE_OFFSET SizeTableOffset;\r
f7496d71 186 //TABLE_OFFSET SkuIdTableOffset;\r
a01f68bd 187 //TABLE_OFFSET PcdNameTableOffset;\r
e8a47801
LG
188 //UINT16 LocalTokenCount; // LOCAL_TOKEN_NUMBER for all\r
189 //UINT16 ExTokenCount; // EX_TOKEN_NUMBER for DynamicEx\r
190 //UINT16 GuidTableCount; // The Number of Guid in GuidTable\r
7e6e459a 191 //UINT8 Pad[6];\r
e8a47801
LG
192 ${PHASE}_PCD_DATABASE_INIT Init;\r
193 ${PHASE}_PCD_DATABASE_UNINIT Uninit;\r
194} ${PHASE}_PCD_DATABASE;\r
195\r
196#define ${PHASE}_NEX_TOKEN_NUMBER (${PHASE}_LOCAL_TOKEN_NUMBER - ${PHASE}_EX_TOKEN_NUMBER)\r
197#endif\r
198""")\r
199\r
200\r
201gEmptyPcdDatabaseAutoGenC = TemplateString("""\r
202//\r
203// External PCD database debug information\r
204//\r
205#if 0\r
206${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
a01f68bd
YZ
207 /* SkuIdTable */\r
208 { 0 },\r
e8a47801
LG
209 /* ExMapTable */\r
210 {\r
211 {0, 0, 0}\r
212 },\r
213 /* LocalTokenNumberTable */\r
214 {\r
215 0\r
216 },\r
217 /* GuidTable */\r
218 {\r
219 {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}\r
220 },\r
221 /* StringTable */\r
222 { 0 },\r
223 /* SkuHead */\r
224 {\r
225 0, 0\r
226 },\r
227 /* SizeTable */\r
228 {\r
229 0, 0\r
230 },\r
e8a47801
LG
231 ${SYSTEM_SKU_ID_VALUE}\r
232};\r
233#endif\r
234""")\r
235\r
e8a47801
LG
236## DbItemList\r
237#\r
f7496d71 238# The class holds the Pcd database items. ItemSize if not zero should match the item datum type in the C structure.\r
e8a47801 239# When the structure is changed, remember to check the ItemSize and the related PackStr in PackData()\r
f7496d71 240# RawDataList is the RawData that may need some kind of calculation or transformation,\r
e8a47801 241# the DataList corresponds to the data that need to be written to database. If DataList is not present, then RawDataList\r
f7496d71 242# will be written to the database.\r
e8a47801
LG
243#\r
244class DbItemList:\r
245 def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
e8a47801 246 self.ItemSize = ItemSize\r
64bb8d4d
CJ
247 self.DataList = DataList if DataList else []\r
248 self.RawDataList = RawDataList if RawDataList else []\r
e8a47801
LG
249 self.ListSize = 0\r
250\r
251 def GetInterOffset(self, Index):\r
252 Offset = 0\r
253 if self.ItemSize == 0:\r
254 #\r
255 # Variable length, need to calculate one by one\r
256 #\r
257 assert(Index < len(self.RawDataList))\r
e77e59c9 258 for ItemIndex in range(Index):\r
e8a47801
LG
259 Offset += len(self.RawDataList[ItemIndex])\r
260 else:\r
61f5b77d 261 Offset = self.ItemSize * Index\r
e8a47801
LG
262\r
263 return Offset\r
264\r
265 def GetListSize(self):\r
266 if self.ListSize:\r
267 return self.ListSize\r
268 if len(self.RawDataList) == 0:\r
269 self.ListSize = 0\r
270 return self.ListSize\r
271 if self.ItemSize == 0:\r
272 self.ListSize = self.GetInterOffset(len(self.RawDataList) - 1) + len(self.RawDataList[len(self.RawDataList)-1])\r
273 else:\r
274 self.ListSize = self.ItemSize * len(self.RawDataList)\r
275 return self.ListSize\r
276\r
277 def PackData(self):\r
8b88b163
CJ
278 ## PackGuid\r
279 #\r
280 # Pack the GUID value in C structure format into data array\r
281 #\r
282 # @param GuidStructureValue: The GUID value in C structure format\r
283 #\r
284 # @retval Buffer: a data array contains the Guid\r
285 #\r
286 def PackGuid(GuidStructureValue):\r
287 GuidString = GuidStructureStringToGuidString(GuidStructureValue)\r
d3054be5 288 return PackGUID(GuidString.split('-'))\r
8b88b163 289\r
d0a0c52c 290 PackStr = PACK_CODE_BY_SIZE[self.ItemSize]\r
e8a47801 291\r
d943b0c3 292 Buffer = bytearray()\r
e8a47801
LG
293 for Datas in self.RawDataList:\r
294 if type(Datas) in (list, tuple):\r
295 for Data in Datas:\r
296 if PackStr:\r
297 Buffer += pack(PackStr, GetIntegerValue(Data))\r
298 else:\r
299 Buffer += PackGuid(Data)\r
300 else:\r
301 if PackStr:\r
302 Buffer += pack(PackStr, GetIntegerValue(Datas))\r
303 else:\r
304 Buffer += PackGuid(Datas)\r
305\r
306 return Buffer\r
307\r
308## DbExMapTblItemList\r
309#\r
f7496d71 310# The class holds the ExMap table\r
e8a47801
LG
311#\r
312class DbExMapTblItemList (DbItemList):\r
313 def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
e8a47801 314 DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
64bb8d4d 315\r
e8a47801 316 def PackData(self):\r
d943b0c3 317 Buffer = bytearray()\r
e8a47801
LG
318 PackStr = "=LHH"\r
319 for Datas in self.RawDataList:\r
f7496d71 320 Buffer += pack(PackStr,\r
e8a47801
LG
321 GetIntegerValue(Datas[0]),\r
322 GetIntegerValue(Datas[1]),\r
f7496d71 323 GetIntegerValue(Datas[2]))\r
e8a47801
LG
324 return Buffer\r
325\r
326## DbComItemList\r
327#\r
f7496d71 328# The DbComItemList is a special kind of DbItemList in case that the size of the List can not be computed by the\r
e8a47801
LG
329# ItemSize multiply the ItemCount.\r
330#\r
331class DbComItemList (DbItemList):\r
332 def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
e8a47801 333 DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
64bb8d4d 334\r
e8a47801
LG
335 def GetInterOffset(self, Index):\r
336 Offset = 0\r
337 if self.ItemSize == 0:\r
338 #\r
fb0b35e0 339 # Variable length, need to calculate one by one\r
e8a47801
LG
340 # The only variable table is stringtable, it is not Composite item, should not reach here\r
341 #\r
342 assert(False)\r
343 else:\r
344 assert(Index < len(self.RawDataList))\r
e77e59c9 345 for ItemIndex in range(Index):\r
f7496d71 346 Offset += len(self.RawDataList[ItemIndex]) * self.ItemSize\r
e8a47801
LG
347\r
348 return Offset\r
349\r
350 def GetListSize(self):\r
351 if self.ListSize:\r
352 return self.ListSize\r
353 if self.ItemSize == 0:\r
354 assert(False)\r
355 else:\r
356 if len(self.RawDataList) == 0:\r
357 self.ListSize = 0\r
358 else:\r
359 self.ListSize = self.GetInterOffset(len(self.RawDataList) - 1) + len(self.RawDataList[len(self.RawDataList)-1]) * self.ItemSize\r
360\r
361 return self.ListSize\r
362\r
363 def PackData(self):\r
d0a0c52c 364 PackStr = PACK_CODE_BY_SIZE[self.ItemSize]\r
e8a47801 365\r
d943b0c3 366 Buffer = bytearray()\r
e8a47801
LG
367 for DataList in self.RawDataList:\r
368 for Data in DataList:\r
369 if type(Data) in (list, tuple):\r
370 for SingleData in Data:\r
371 Buffer += pack(PackStr, GetIntegerValue(SingleData))\r
372 else:\r
373 Buffer += pack(PackStr, GetIntegerValue(Data))\r
f7496d71 374\r
e8a47801
LG
375 return Buffer\r
376\r
377## DbVariableTableItemList\r
378#\r
f7496d71 379# The class holds the Variable header value table\r
e8a47801
LG
380#\r
381class DbVariableTableItemList (DbComItemList):\r
382 def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
e8a47801 383 DbComItemList.__init__(self, ItemSize, DataList, RawDataList)\r
64bb8d4d 384\r
e8a47801 385 def PackData(self):\r
82a6a960 386 PackStr = "=LLHHLHH"\r
d943b0c3 387 Buffer = bytearray()\r
e8a47801
LG
388 for DataList in self.RawDataList:\r
389 for Data in DataList:\r
f7496d71 390 Buffer += pack(PackStr,\r
e8a47801
LG
391 GetIntegerValue(Data[0]),\r
392 GetIntegerValue(Data[1]),\r
393 GetIntegerValue(Data[2]),\r
82a6a960
BF
394 GetIntegerValue(Data[3]),\r
395 GetIntegerValue(Data[4]),\r
396 GetIntegerValue(Data[5]),\r
397 GetIntegerValue(0))\r
e8a47801
LG
398 return Buffer\r
399\r
400class DbStringHeadTableItemList(DbItemList):\r
401 def __init__(self,ItemSize,DataList=None,RawDataList=None):\r
e8a47801 402 DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
f7496d71 403\r
e8a47801
LG
404 def GetInterOffset(self, Index):\r
405 Offset = 0\r
406 if self.ItemSize == 0:\r
407 #\r
408 # Variable length, need to calculate one by one\r
409 #\r
410 assert(Index < len(self.RawDataList))\r
e77e59c9 411 for ItemIndex in range(Index):\r
e8a47801
LG
412 Offset += len(self.RawDataList[ItemIndex])\r
413 else:\r
414 for innerIndex in range(Index):\r
415 if type(self.RawDataList[innerIndex]) in (list, tuple):\r
416 Offset += len(self.RawDataList[innerIndex]) * self.ItemSize\r
417 else:\r
418 Offset += self.ItemSize\r
419\r
420 return Offset\r
421\r
422 def GetListSize(self):\r
423 if self.ListSize:\r
424 return self.ListSize\r
425 if len(self.RawDataList) == 0:\r
426 self.ListSize = 0\r
427 return self.ListSize\r
428 if self.ItemSize == 0:\r
429 self.ListSize = self.GetInterOffset(len(self.RawDataList) - 1) + len(self.RawDataList[len(self.RawDataList)-1])\r
430 else:\r
431 for Datas in self.RawDataList:\r
432 if type(Datas) in (list, tuple):\r
433 self.ListSize += len(Datas) * self.ItemSize\r
434 else:\r
435 self.ListSize += self.ItemSize\r
f7496d71 436 return self.ListSize\r
e8a47801
LG
437\r
438## DbSkuHeadTableItemList\r
439#\r
f7496d71 440# The class holds the Sku header value table\r
e8a47801
LG
441#\r
442class DbSkuHeadTableItemList (DbItemList):\r
443 def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
e8a47801 444 DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
64bb8d4d 445\r
e8a47801
LG
446 def PackData(self):\r
447 PackStr = "=LL"\r
d943b0c3 448 Buffer = bytearray()\r
e8a47801 449 for Data in self.RawDataList:\r
f7496d71 450 Buffer += pack(PackStr,\r
e8a47801
LG
451 GetIntegerValue(Data[0]),\r
452 GetIntegerValue(Data[1]))\r
453 return Buffer\r
454\r
455## DbSizeTableItemList\r
456#\r
f7496d71 457# The class holds the size table\r
e8a47801
LG
458#\r
459class DbSizeTableItemList (DbItemList):\r
460 def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
e8a47801 461 DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
64bb8d4d 462\r
2bc3256c
LG
463 def GetListSize(self):\r
464 length = 0\r
465 for Data in self.RawDataList:\r
466 length += (1 + len(Data[1]))\r
467 return length * self.ItemSize\r
e8a47801 468 def PackData(self):\r
2bc3256c 469 PackStr = "=H"\r
d943b0c3 470 Buffer = bytearray()\r
e8a47801 471 for Data in self.RawDataList:\r
f7496d71 472 Buffer += pack(PackStr,\r
2bc3256c
LG
473 GetIntegerValue(Data[0]))\r
474 for subData in Data[1]:\r
f7496d71 475 Buffer += pack(PackStr,\r
2bc3256c 476 GetIntegerValue(subData))\r
e8a47801
LG
477 return Buffer\r
478\r
479## DbStringItemList\r
480#\r
f7496d71 481# The class holds the string table\r
e8a47801
LG
482#\r
483class DbStringItemList (DbComItemList):\r
484 def __init__(self, ItemSize, DataList=None, RawDataList=None, LenList=None):\r
485 if DataList is None:\r
486 DataList = []\r
487 if RawDataList is None:\r
488 RawDataList = []\r
489 if LenList is None:\r
490 LenList = []\r
f7496d71 491\r
e8a47801
LG
492 assert(len(RawDataList) == len(LenList))\r
493 DataList = []\r
494 # adjust DataList according to the LenList\r
e77e59c9 495 for Index in range(len(RawDataList)):\r
e8a47801
LG
496 Len = LenList[Index]\r
497 RawDatas = RawDataList[Index]\r
498 assert(Len >= len(RawDatas))\r
499 ActualDatas = []\r
e77e59c9 500 for i in range(len(RawDatas)):\r
e8a47801 501 ActualDatas.append(RawDatas[i])\r
e77e59c9 502 for i in range(len(RawDatas), Len):\r
e8a47801
LG
503 ActualDatas.append(0)\r
504 DataList.append(ActualDatas)\r
505 self.LenList = LenList\r
506 DbComItemList.__init__(self, ItemSize, DataList, RawDataList)\r
507 def GetInterOffset(self, Index):\r
508 Offset = 0\r
509\r
510 assert(Index < len(self.LenList))\r
e77e59c9 511 for ItemIndex in range(Index):\r
e8a47801
LG
512 Offset += self.LenList[ItemIndex]\r
513\r
514 return Offset\r
515\r
516 def GetListSize(self):\r
517 if self.ListSize:\r
518 return self.ListSize\r
519\r
520 if len(self.LenList) == 0:\r
521 self.ListSize = 0\r
522 else:\r
523 self.ListSize = self.GetInterOffset(len(self.LenList) - 1) + self.LenList[len(self.LenList)-1]\r
524\r
525 return self.ListSize\r
526\r
527 def PackData(self):\r
528 self.RawDataList = self.DataList\r
529 return DbComItemList.PackData(self)\r
530\r
531\r
532\r
533## Find the index in two list where the item matches the key separately\r
534#\r
535# @param Key1 The key used to search the List1\r
536# @param List1 The list that Key1 will be searched\r
537# @param Key2 The key used to search the List2\r
538# @param List2 The list that Key2 will be searched\r
539#\r
540# @retval Index The position inside the list where list1[Index] == Key1 and list2[Index] == Key2\r
541#\r
542def GetMatchedIndex(Key1, List1, Key2, List2):\r
543 StartPos = 0\r
544 while StartPos < len(List1):\r
545 Index = List1.index(Key1, StartPos)\r
546 if List2[Index] == Key2:\r
547 return Index\r
548 else:\r
549 StartPos = Index + 1\r
f7496d71 550\r
e8a47801
LG
551 return -1\r
552\r
553\r
e8a47801
LG
554## convert StringArray like {0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00}\r
555# to List like [0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00]\r
556#\r
557# @param StringArray A string array like {0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00}\r
f7496d71 558#\r
e8a47801
LG
559# @retval A list object of integer items\r
560#\r
561def StringArrayToList(StringArray):\r
562 StringArray = StringArray[1:-1]\r
563 StringArray = '[' + StringArray + ']'\r
564 return eval(StringArray)\r
565\r
566\r
567## Convert TokenType String like "PCD_DATUM_TYPE_UINT32 | PCD_TYPE_HII" to TokenType value\r
568#\r
569# @param TokenType A TokenType string like "PCD_DATUM_TYPE_UINT32 | PCD_TYPE_HII"\r
f7496d71 570#\r
e8a47801
LG
571# @retval A integer representation of the TokenType\r
572#\r
573def GetTokenTypeValue(TokenType):\r
574 TokenTypeDict = {\r
ccaa7754
GL
575 "PCD_TYPE_SHIFT": 28,\r
576 "PCD_TYPE_DATA": (0x0 << 28),\r
577 "PCD_TYPE_HII": (0x8 << 28),\r
578 "PCD_TYPE_VPD": (0x4 << 28),\r
2b8a6c44 579# "PCD_TYPE_SKU_ENABLED":(0x2 << 28),\r
ccaa7754 580 "PCD_TYPE_STRING": (0x1 << 28),\r
e8a47801 581\r
ccaa7754
GL
582 "PCD_DATUM_TYPE_SHIFT": 24,\r
583 "PCD_DATUM_TYPE_POINTER": (0x0 << 24),\r
584 "PCD_DATUM_TYPE_UINT8": (0x1 << 24),\r
585 "PCD_DATUM_TYPE_UINT16": (0x2 << 24),\r
586 "PCD_DATUM_TYPE_UINT32": (0x4 << 24),\r
587 "PCD_DATUM_TYPE_UINT64": (0x8 << 24),\r
e8a47801 588\r
ccaa7754
GL
589 "PCD_DATUM_TYPE_SHIFT2": 20,\r
590 "PCD_DATUM_TYPE_UINT8_BOOLEAN": (0x1 << 20 | 0x1 << 24),\r
e8a47801
LG
591 }\r
592 return eval(TokenType, TokenTypeDict)\r
593\r
594## construct the external Pcd database using data from Dict\r
595#\r
596# @param Dict A dictionary contains Pcd related tables\r
f7496d71 597#\r
e8a47801
LG
598# @retval Buffer A byte stream of the Pcd database\r
599#\r
600def BuildExDataBase(Dict):\r
601 # init Db items\r
602 InitValueUint64 = Dict['INIT_DB_VALUE_UINT64']\r
603 DbInitValueUint64 = DbComItemList(8, RawDataList = InitValueUint64)\r
604 VardefValueUint64 = Dict['VARDEF_DB_VALUE_UINT64']\r
605 DbVardefValueUint64 = DbItemList(8, RawDataList = VardefValueUint64)\r
606 InitValueUint32 = Dict['INIT_DB_VALUE_UINT32']\r
607 DbInitValueUint32 = DbComItemList(4, RawDataList = InitValueUint32)\r
608 VardefValueUint32 = Dict['VARDEF_DB_VALUE_UINT32']\r
609 DbVardefValueUint32 = DbItemList(4, RawDataList = VardefValueUint32)\r
610 VpdHeadValue = Dict['VPD_DB_VALUE']\r
611 DbVpdHeadValue = DbComItemList(4, RawDataList = VpdHeadValue)\r
f8d11e5a 612 ExMapTable = list(zip(Dict['EXMAPPING_TABLE_EXTOKEN'], Dict['EXMAPPING_TABLE_LOCAL_TOKEN'], Dict['EXMAPPING_TABLE_GUID_INDEX']))\r
e8a47801
LG
613 DbExMapTable = DbExMapTblItemList(8, RawDataList = ExMapTable)\r
614 LocalTokenNumberTable = Dict['LOCAL_TOKEN_NUMBER_DB_VALUE']\r
615 DbLocalTokenNumberTable = DbItemList(4, RawDataList = LocalTokenNumberTable)\r
616 GuidTable = Dict['GUID_STRUCTURE']\r
617 DbGuidTable = DbItemList(16, RawDataList = GuidTable)\r
618 StringHeadValue = Dict['STRING_DB_VALUE']\r
619 # DbItemList to DbStringHeadTableItemList\r
620 DbStringHeadValue = DbStringHeadTableItemList(4, RawDataList = StringHeadValue)\r
621 VariableTable = Dict['VARIABLE_DB_VALUE']\r
82a6a960 622 DbVariableTable = DbVariableTableItemList(20, RawDataList = VariableTable)\r
e8a47801 623 NumberOfSkuEnabledPcd = GetIntegerValue(Dict['SKU_HEAD_SIZE'])\r
2b8a6c44 624\r
e8a47801 625 Dict['STRING_TABLE_DB_VALUE'] = [StringArrayToList(x) for x in Dict['STRING_TABLE_VALUE']]\r
f7496d71 626\r
e8a47801 627 StringTableValue = Dict['STRING_TABLE_DB_VALUE']\r
fb0b35e0 628 # when calcute the offset, should use StringTableLen instead of StringTableValue, as string maximum len may be different with actual len\r
e8a47801
LG
629 StringTableLen = Dict['STRING_TABLE_LENGTH']\r
630 DbStringTableLen = DbStringItemList(0, RawDataList = StringTableValue, LenList = StringTableLen)\r
631\r
f7496d71 632\r
e8a47801
LG
633 PcdTokenTable = Dict['PCD_TOKENSPACE']\r
634 PcdTokenLen = Dict['PCD_TOKENSPACE_LENGTH']\r
635 PcdTokenTableValue = [StringArrayToList(x) for x in Dict['PCD_TOKENSPACE']]\r
636 DbPcdTokenTable = DbStringItemList(0, RawDataList = PcdTokenTableValue, LenList = PcdTokenLen)\r
f7496d71 637\r
e8a47801
LG
638 PcdCNameTable = Dict['PCD_CNAME']\r
639 PcdCNameLen = Dict['PCD_CNAME_LENGTH']\r
640 PcdCNameTableValue = [StringArrayToList(x) for x in Dict['PCD_CNAME']]\r
641 DbPcdCNameTable = DbStringItemList(0, RawDataList = PcdCNameTableValue, LenList = PcdCNameLen)\r
f7496d71 642\r
e8a47801 643 PcdNameOffsetTable = Dict['PCD_NAME_OFFSET']\r
ccaa7754 644 DbPcdNameOffsetTable = DbItemList(4, RawDataList = PcdNameOffsetTable)\r
f7496d71 645\r
f8d11e5a 646 SizeTableValue = list(zip(Dict['SIZE_TABLE_MAXIMUM_LENGTH'], Dict['SIZE_TABLE_CURRENT_LENGTH']))\r
2bc3256c 647 DbSizeTableValue = DbSizeTableItemList(2, RawDataList = SizeTableValue)\r
e8a47801
LG
648 InitValueUint16 = Dict['INIT_DB_VALUE_UINT16']\r
649 DbInitValueUint16 = DbComItemList(2, RawDataList = InitValueUint16)\r
650 VardefValueUint16 = Dict['VARDEF_DB_VALUE_UINT16']\r
651 DbVardefValueUint16 = DbItemList(2, RawDataList = VardefValueUint16)\r
652 InitValueUint8 = Dict['INIT_DB_VALUE_UINT8']\r
653 DbInitValueUint8 = DbComItemList(1, RawDataList = InitValueUint8)\r
654 VardefValueUint8 = Dict['VARDEF_DB_VALUE_UINT8']\r
655 DbVardefValueUint8 = DbItemList(1, RawDataList = VardefValueUint8)\r
656 InitValueBoolean = Dict['INIT_DB_VALUE_BOOLEAN']\r
657 DbInitValueBoolean = DbComItemList(1, RawDataList = InitValueBoolean)\r
658 VardefValueBoolean = Dict['VARDEF_DB_VALUE_BOOLEAN']\r
659 DbVardefValueBoolean = DbItemList(1, RawDataList = VardefValueBoolean)\r
660 SkuidValue = Dict['SKUID_VALUE']\r
a01f68bd 661 DbSkuidValue = DbItemList(8, RawDataList = SkuidValue)\r
2b8a6c44
LG
662\r
663\r
f7496d71 664\r
e8a47801
LG
665 # Unit Db Items\r
666 UnInitValueUint64 = Dict['UNINIT_GUID_DECL_UINT64']\r
667 DbUnInitValueUint64 = DbItemList(8, RawDataList = UnInitValueUint64)\r
668 UnInitValueUint32 = Dict['UNINIT_GUID_DECL_UINT32']\r
669 DbUnInitValueUint32 = DbItemList(4, RawDataList = UnInitValueUint32)\r
670 UnInitValueUint16 = Dict['UNINIT_GUID_DECL_UINT16']\r
671 DbUnInitValueUint16 = DbItemList(2, RawDataList = UnInitValueUint16)\r
672 UnInitValueUint8 = Dict['UNINIT_GUID_DECL_UINT8']\r
673 DbUnInitValueUint8 = DbItemList(1, RawDataList = UnInitValueUint8)\r
674 UnInitValueBoolean = Dict['UNINIT_GUID_DECL_BOOLEAN']\r
675 DbUnInitValueBoolean = DbItemList(1, RawDataList = UnInitValueBoolean)\r
84cc912a 676 PcdTokenNumberMap = Dict['PCD_ORDER_TOKEN_NUMBER_MAP']\r
f7496d71 677\r
2b8a6c44 678 DbNameTotle = ["SkuidValue", "InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable",\r
ccaa7754 679 "LocalTokenNumberTable", "GuidTable", "StringHeadValue", "PcdNameOffsetTable", "VariableTable", "StringTableLen", "PcdTokenTable", "PcdCNameTable",\r
e8a47801 680 "SizeTableValue", "InitValueUint16", "VardefValueUint16", "InitValueUint8", "VardefValueUint8", "InitValueBoolean",\r
a01f68bd 681 "VardefValueBoolean", "UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\r
f7496d71 682\r
2b8a6c44 683 DbTotal = [SkuidValue, InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable,\r
ccaa7754 684 LocalTokenNumberTable, GuidTable, StringHeadValue, PcdNameOffsetTable, VariableTable, StringTableLen, PcdTokenTable, PcdCNameTable,\r
47fea6af 685 SizeTableValue, InitValueUint16, VardefValueUint16, InitValueUint8, VardefValueUint8, InitValueBoolean,\r
a01f68bd 686 VardefValueBoolean, UnInitValueUint64, UnInitValueUint32, UnInitValueUint16, UnInitValueUint8, UnInitValueBoolean]\r
2b8a6c44 687 DbItemTotal = [DbSkuidValue, DbInitValueUint64, DbVardefValueUint64, DbInitValueUint32, DbVardefValueUint32, DbVpdHeadValue, DbExMapTable,\r
ccaa7754 688 DbLocalTokenNumberTable, DbGuidTable, DbStringHeadValue, DbPcdNameOffsetTable, DbVariableTable, DbStringTableLen, DbPcdTokenTable, DbPcdCNameTable,\r
47fea6af 689 DbSizeTableValue, DbInitValueUint16, DbVardefValueUint16, DbInitValueUint8, DbVardefValueUint8, DbInitValueBoolean,\r
a01f68bd 690 DbVardefValueBoolean, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
f7496d71 691\r
a01f68bd
YZ
692 # VardefValueBoolean is the last table in the init table items\r
693 InitTableNum = DbNameTotle.index("VardefValueBoolean") + 1\r
e8a47801 694 # The FixedHeader length of the PCD_DATABASE_INIT, from Signature to Pad\r
7e6e459a 695 FixedHeaderLen = 80\r
e8a47801 696\r
f7496d71 697 # Get offset of SkuId table in the database\r
e8a47801 698 SkuIdTableOffset = FixedHeaderLen\r
e77e59c9 699 for DbIndex in range(len(DbTotal)):\r
e8a47801
LG
700 if DbTotal[DbIndex] is SkuidValue:\r
701 break\r
702 SkuIdTableOffset += DbItemTotal[DbIndex].GetListSize()\r
f7496d71
LG
703\r
704\r
705 # Get offset of SkuValue table in the database\r
a01f68bd 706\r
e8a47801 707 # Fix up the LocalTokenNumberTable, SkuHeader table\r
e8a47801
LG
708 for (LocalTokenNumberTableIndex, (Offset, Table)) in enumerate(LocalTokenNumberTable):\r
709 DbIndex = 0\r
710 DbOffset = FixedHeaderLen\r
e77e59c9 711 for DbIndex in range(len(DbTotal)):\r
e8a47801
LG
712 if DbTotal[DbIndex] is Table:\r
713 DbOffset += DbItemTotal[DbIndex].GetInterOffset(Offset)\r
714 break\r
715 DbOffset += DbItemTotal[DbIndex].GetListSize()\r
c1b9129c
BF
716 if DbIndex + 1 == InitTableNum:\r
717 if DbOffset % 8:\r
718 DbOffset += (8 - DbOffset % 8)\r
e8a47801
LG
719 else:\r
720 assert(False)\r
721\r
722 TokenTypeValue = Dict['TOKEN_TYPE'][LocalTokenNumberTableIndex]\r
723 TokenTypeValue = GetTokenTypeValue(TokenTypeValue)\r
724 LocalTokenNumberTable[LocalTokenNumberTableIndex] = DbOffset|int(TokenTypeValue)\r
725 # if PCD_TYPE_SKU_ENABLED, then we need to fix up the SkuTable\r
e8a47801 726\r
f7496d71
LG
727\r
728\r
729\r
730 # resolve variable table offset\r
e8a47801 731 for VariableEntries in VariableTable:\r
2bc3256c 732 skuindex = 0\r
e8a47801 733 for VariableEntryPerSku in VariableEntries:\r
82a6a960 734 (VariableHeadGuidIndex, VariableHeadStringIndex, SKUVariableOffset, VariableOffset, VariableRefTable, VariableAttribute) = VariableEntryPerSku[:]\r
e8a47801
LG
735 DbIndex = 0\r
736 DbOffset = FixedHeaderLen\r
e77e59c9 737 for DbIndex in range(len(DbTotal)):\r
e8a47801
LG
738 if DbTotal[DbIndex] is VariableRefTable:\r
739 DbOffset += DbItemTotal[DbIndex].GetInterOffset(VariableOffset)\r
740 break\r
741 DbOffset += DbItemTotal[DbIndex].GetListSize()\r
c1b9129c
BF
742 if DbIndex + 1 == InitTableNum:\r
743 if DbOffset % 8:\r
744 DbOffset += (8 - DbOffset % 8)\r
e8a47801
LG
745 else:\r
746 assert(False)\r
ccaa7754 747 if isinstance(VariableRefTable[0], list):\r
f7496d71 748 DbOffset += skuindex * 4\r
2bc3256c 749 skuindex += 1\r
e8a47801
LG
750 if DbIndex >= InitTableNum:\r
751 assert(False)\r
82a6a960
BF
752 VarAttr, VarProp = VariableAttributes.GetVarAttributes(VariableAttribute)\r
753 VariableEntryPerSku[:] = (VariableHeadStringIndex, DbOffset, VariableHeadGuidIndex, SKUVariableOffset, VarAttr, VarProp)\r
e8a47801
LG
754\r
755 # calculate various table offset now\r
756 DbTotalLength = FixedHeaderLen\r
e77e59c9 757 for DbIndex in range(len(DbItemTotal)):\r
e8a47801
LG
758 if DbItemTotal[DbIndex] is DbLocalTokenNumberTable:\r
759 LocalTokenNumberTableOffset = DbTotalLength\r
760 elif DbItemTotal[DbIndex] is DbExMapTable:\r
761 ExMapTableOffset = DbTotalLength\r
762 elif DbItemTotal[DbIndex] is DbGuidTable:\r
763 GuidTableOffset = DbTotalLength\r
764 elif DbItemTotal[DbIndex] is DbStringTableLen:\r
765 StringTableOffset = DbTotalLength\r
766 elif DbItemTotal[DbIndex] is DbSizeTableValue:\r
767 SizeTableOffset = DbTotalLength\r
768 elif DbItemTotal[DbIndex] is DbSkuidValue:\r
769 SkuIdTableOffset = DbTotalLength\r
770 elif DbItemTotal[DbIndex] is DbPcdNameOffsetTable:\r
771 DbPcdNameOffset = DbTotalLength\r
2b8a6c44 772\r
e8a47801
LG
773\r
774 DbTotalLength += DbItemTotal[DbIndex].GetListSize()\r
775 if not Dict['PCD_INFO_FLAG']:\r
f7496d71 776 DbPcdNameOffset = 0\r
e8a47801
LG
777 LocalTokenCount = GetIntegerValue(Dict['LOCAL_TOKEN_NUMBER'])\r
778 ExTokenCount = GetIntegerValue(Dict['EX_TOKEN_NUMBER'])\r
779 GuidTableCount = GetIntegerValue(Dict['GUID_TABLE_SIZE'])\r
780 SystemSkuId = GetIntegerValue(Dict['SYSTEM_SKU_ID_VALUE'])\r
781 Pad = 0xDA\r
f7496d71 782\r
e8a47801
LG
783 UninitDataBaseSize = 0\r
784 for Item in (DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean):\r
785 UninitDataBaseSize += Item.GetListSize()\r
f7496d71 786\r
c1b9129c
BF
787 if (DbTotalLength - UninitDataBaseSize) % 8:\r
788 DbTotalLength += (8 - (DbTotalLength - UninitDataBaseSize) % 8)\r
e8a47801
LG
789 # Construct the database buffer\r
790 Guid = "{0x3c7d193c, 0x682c, 0x4c14, 0xa6, 0x8f, 0x55, 0x2d, 0xea, 0x4f, 0x43, 0x7e}"\r
791 Guid = StringArrayToList(Guid)\r
d0a0c52c 792 Buffer = PackByteFormatGUID(Guid)\r
e8a47801
LG
793\r
794 b = pack("=L", DATABASE_VERSION)\r
795 Buffer += b\r
796\r
797 b = pack('=L', DbTotalLength - UninitDataBaseSize)\r
798\r
a01f68bd
YZ
799 Buffer += b\r
800 b = pack('=Q', SystemSkuId)\r
801\r
2b8a6c44
LG
802 Buffer += b\r
803 b = pack('=L', 0)\r
804\r
e8a47801
LG
805 Buffer += b\r
806 b = pack('=L', UninitDataBaseSize)\r
807\r
808 Buffer += b\r
809 b = pack('=L', LocalTokenNumberTableOffset)\r
810\r
811 Buffer += b\r
812 b = pack('=L', ExMapTableOffset)\r
f7496d71 813\r
e8a47801
LG
814 Buffer += b\r
815 b = pack('=L', GuidTableOffset)\r
816\r
817 Buffer += b\r
818 b = pack('=L', StringTableOffset)\r
819\r
820 Buffer += b\r
821 b = pack('=L', SizeTableOffset)\r
822\r
823 Buffer += b\r
824 b = pack('=L', SkuIdTableOffset)\r
825\r
826 Buffer += b\r
827 b = pack('=L', DbPcdNameOffset)\r
828\r
829 Buffer += b\r
830 b = pack('=H', LocalTokenCount)\r
831\r
832 Buffer += b\r
833 b = pack('=H', ExTokenCount)\r
834\r
835 Buffer += b\r
836 b = pack('=H', GuidTableCount)\r
f7496d71 837\r
e8a47801 838 Buffer += b\r
a01f68bd 839 b = pack('=B', Pad)\r
e8a47801 840 Buffer += b\r
7e6e459a
LG
841 Buffer += b\r
842 Buffer += b\r
843 Buffer += b\r
844 Buffer += b\r
e8a47801 845 Buffer += b\r
f7496d71 846\r
e8a47801
LG
847 Index = 0\r
848 for Item in DbItemTotal:\r
849 Index +=1\r
d943b0c3
FB
850 packdata = Item.PackData()\r
851 for i in range(len(packdata)):\r
852 Buffer += packdata[i:i + 1]\r
e8a47801 853 if Index == InitTableNum:\r
c1b9129c
BF
854 if len(Buffer) % 8:\r
855 for num in range(8 - len(Buffer) % 8):\r
856 b = pack('=B', Pad)\r
857 Buffer += b\r
f7496d71 858 break\r
e8a47801
LG
859 return Buffer\r
860\r
861## Create code for PCD database\r
862#\r
863# @param Info The ModuleAutoGen object\r
864# @param AutoGenC The TemplateString object for C code\r
865# @param AutoGenH The TemplateString object for header file\r
866#\r
867def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):\r
868 if Info.PcdIsDriver == "":\r
869 return\r
870 if Info.PcdIsDriver not in gPcdPhaseMap:\r
871 EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver,\r
872 ExtraData="[%s]" % str(Info))\r
873\r
2b8a6c44 874 AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = NewCreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')\r
e8a47801
LG
875 AutoGenH.Append(AdditionalAutoGenH.String)\r
876\r
877 Phase = gPcdPhaseMap[Info.PcdIsDriver]\r
878 if Phase == 'PEI':\r
879 AutoGenC.Append(AdditionalAutoGenC.String)\r
880\r
881 if Phase == 'DXE':\r
2b8a6c44 882 AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = NewCreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)\r
e8a47801
LG
883 AutoGenH.Append(AdditionalAutoGenH.String)\r
884 AutoGenC.Append(AdditionalAutoGenC.String)\r
885\r
886 if Info.IsBinaryModule:\r
91fa33ee 887 DbFileName = os.path.join(Info.PlatformInfo.BuildDir, TAB_FV_DIRECTORY, Phase + "PcdDataBase.raw")\r
e8a47801
LG
888 else:\r
889 DbFileName = os.path.join(Info.OutputDir, Phase + "PcdDataBase.raw")\r
86379ac4 890 DbFile = BytesIO()\r
e8a47801
LG
891 DbFile.write(PcdDbBuffer)\r
892 Changed = SaveFileOnChange(DbFileName, DbFile.getvalue(), True)\r
2b8a6c44
LG
893def CreatePcdDataBase(PcdDBData):\r
894 delta = {}\r
ccaa7754
GL
895 for skuname, skuid in PcdDBData:\r
896 if len(PcdDBData[(skuname, skuid)][1]) != len(PcdDBData[(TAB_DEFAULT, "0")][1]):\r
2b8a6c44 897 EdkLogger.ERROR("The size of each sku in one pcd are not same")\r
ccaa7754 898 for skuname, skuid in PcdDBData:\r
55c84777 899 if skuname == TAB_DEFAULT:\r
2b8a6c44 900 continue\r
ccaa7754
GL
901 delta[(skuname, skuid)] = [(index, data, hex(data)) for index, data in enumerate(PcdDBData[(skuname, skuid)][1]) if PcdDBData[(skuname, skuid)][1][index] != PcdDBData[(TAB_DEFAULT, "0")][1][index]]\r
902 databasebuff = PcdDBData[(TAB_DEFAULT, "0")][0]\r
2b8a6c44 903\r
ccaa7754 904 for skuname, skuid in delta:\r
7e6e459a
LG
905 # 8 byte align\r
906 if len(databasebuff) % 8 > 0:\r
907 for i in range(8 - (len(databasebuff) % 8)):\r
ccaa7754 908 databasebuff += pack("=B", 0)\r
7e6e459a
LG
909 databasebuff += pack('=Q', int(skuid))\r
910 databasebuff += pack('=Q', 0)\r
ccaa7754
GL
911 databasebuff += pack('=L', 8+8+4+4*len(delta[(skuname, skuid)]))\r
912 for item in delta[(skuname, skuid)]:\r
913 databasebuff += pack("=L", item[0])\r
914 databasebuff = databasebuff[:-1] + pack("=B", item[1])\r
2b8a6c44 915 totallen = len(databasebuff)\r
ccaa7754 916 totallenbuff = pack("=L", totallen)\r
2b8a6c44
LG
917 newbuffer = databasebuff[:32]\r
918 for i in range(4):\r
d943b0c3 919 newbuffer += totallenbuff[i:i+1]\r
ccaa7754 920 for i in range(36, totallen):\r
d943b0c3 921 newbuffer += databasebuff[i:i+1]\r
2b8a6c44
LG
922\r
923 return newbuffer\r
55c84777 924\r
2b8a6c44 925def CreateVarCheckBin(VarCheckTab):\r
ccaa7754 926 return VarCheckTab[(TAB_DEFAULT, "0")]\r
55c84777 927\r
2b8a6c44
LG
928def CreateAutoGen(PcdDriverAutoGenData):\r
929 autogenC = TemplateString()\r
ccaa7754 930 for skuname, skuid in PcdDriverAutoGenData:\r
2b8a6c44 931 autogenC.Append("//SKUID: %s" % skuname)\r
ccaa7754
GL
932 autogenC.Append(PcdDriverAutoGenData[(skuname, skuid)][1].String)\r
933 return (PcdDriverAutoGenData[(skuname, skuid)][0], autogenC)\r
934def NewCreatePcdDatabasePhaseSpecificAutoGen(Platform, Phase):\r
935 def prune_sku(pcd, skuname):\r
2b8a6c44
LG
936 new_pcd = copy.deepcopy(pcd)\r
937 new_pcd.SkuInfoList = {skuname:pcd.SkuInfoList[skuname]}\r
841d86fe 938 new_pcd.isinit = 'INIT'\r
4c6fda33 939 if new_pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
841d86fe
FB
940 for skuobj in pcd.SkuInfoList.values():\r
941 if skuobj.DefaultValue:\r
ccaa7754 942 defaultvalue = int(skuobj.DefaultValue, 16) if skuobj.DefaultValue.upper().startswith("0X") else int(skuobj.DefaultValue, 10)\r
841d86fe
FB
943 if defaultvalue != 0:\r
944 new_pcd.isinit = "INIT"\r
945 break\r
946 elif skuobj.VariableName:\r
947 new_pcd.isinit = "INIT"\r
948 break\r
949 else:\r
950 new_pcd.isinit = "UNINIT"\r
2b8a6c44
LG
951 return new_pcd\r
952 DynamicPcds = Platform.DynamicPcdList\r
ccaa7754
GL
953 DynamicPcdSet_Sku = {(SkuName, skuobj.SkuId):[] for pcd in DynamicPcds for (SkuName, skuobj) in pcd.SkuInfoList.items() }\r
954 for skuname, skuid in DynamicPcdSet_Sku:\r
955 DynamicPcdSet_Sku[(skuname, skuid)] = [prune_sku(pcd, skuname) for pcd in DynamicPcds]\r
2b8a6c44
LG
956 PcdDBData = {}\r
957 PcdDriverAutoGenData = {}\r
958 VarCheckTableData = {}\r
959 if DynamicPcdSet_Sku:\r
ccaa7754
GL
960 for skuname, skuid in DynamicPcdSet_Sku:\r
961 AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer, VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdSet_Sku[(skuname, skuid)], Phase)\r
2b8a6c44 962 final_data = ()\r
d943b0c3
FB
963 for item in range(len(PcdDbBuffer)):\r
964 final_data += unpack("B", PcdDbBuffer[item:item+1])\r
ccaa7754
GL
965 PcdDBData[(skuname, skuid)] = (PcdDbBuffer, final_data)\r
966 PcdDriverAutoGenData[(skuname, skuid)] = (AdditionalAutoGenH, AdditionalAutoGenC)\r
967 VarCheckTableData[(skuname, skuid)] = VarCheckTab\r
2b8a6c44 968 if Platform.Platform.VarCheckFlag:\r
91fa33ee 969 dest = os.path.join(Platform.BuildDir, TAB_FV_DIRECTORY)\r
2b8a6c44
LG
970 VarCheckTable = CreateVarCheckBin(VarCheckTableData)\r
971 VarCheckTable.dump(dest, Phase)\r
972 AdditionalAutoGenH, AdditionalAutoGenC = CreateAutoGen(PcdDriverAutoGenData)\r
973 else:\r
ccaa7754 974 AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer, VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform, {}, Phase)\r
0a4f2d48 975 final_data = ()\r
d943b0c3
FB
976 for item in range(len(PcdDbBuffer)):\r
977 final_data += unpack("B", PcdDbBuffer[item:item + 1])\r
ccaa7754 978 PcdDBData[(TAB_DEFAULT, "0")] = (PcdDbBuffer, final_data)\r
e8a47801 979\r
0a4f2d48 980 return AdditionalAutoGenH, AdditionalAutoGenC, CreatePcdDataBase(PcdDBData)\r
e8a47801
LG
981## Create PCD database in DXE or PEI phase\r
982#\r
983# @param Platform The platform object\r
984# @retval tuple Two TemplateString objects for C code and header file,\r
985# respectively\r
986#\r
2b8a6c44 987def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):\r
e8a47801
LG
988 AutoGenC = TemplateString()\r
989 AutoGenH = TemplateString()\r
990\r
991 Dict = {\r
992 'PHASE' : Phase,\r
993 'SERVICE_DRIVER_VERSION' : DATABASE_VERSION,\r
994 'GUID_TABLE_SIZE' : '1U',\r
995 'STRING_TABLE_SIZE' : '1U',\r
996 'SKUID_TABLE_SIZE' : '1U',\r
997 'LOCAL_TOKEN_NUMBER_TABLE_SIZE' : '0U',\r
998 'LOCAL_TOKEN_NUMBER' : '0U',\r
999 'EXMAPPING_TABLE_SIZE' : '1U',\r
1000 'EX_TOKEN_NUMBER' : '0U',\r
1001 'SIZE_TABLE_SIZE' : '2U',\r
1002 'SKU_HEAD_SIZE' : '1U',\r
1003 'GUID_TABLE_EMPTY' : 'TRUE',\r
1004 'STRING_TABLE_EMPTY' : 'TRUE',\r
1005 'SKUID_TABLE_EMPTY' : 'TRUE',\r
1006 'DATABASE_EMPTY' : 'TRUE',\r
1007 'EXMAP_TABLE_EMPTY' : 'TRUE',\r
fb0b35e0 1008 'PCD_DATABASE_UNINIT_EMPTY' : ' UINT8 dummy; /* PCD_DATABASE_UNINIT is empty */',\r
e8a47801
LG
1009 'SYSTEM_SKU_ID' : ' SKU_ID SystemSkuId;',\r
1010 'SYSTEM_SKU_ID_VALUE' : '0U'\r
1011 }\r
f7496d71 1012\r
65eff519
LG
1013 SkuObj = Platform.Platform.SkuIdMgr\r
1014 Dict['SYSTEM_SKU_ID_VALUE'] = 0 if SkuObj.SkuUsageType == SkuObj.SINGLE else Platform.Platform.SkuIds[SkuObj.SystemSkuId][0]\r
e8a47801
LG
1015\r
1016 Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag\r
1017\r
656d2539 1018 for DatumType in TAB_PCD_NUMERIC_TYPES_VOID:\r
e8a47801
LG
1019 Dict['VARDEF_CNAME_' + DatumType] = []\r
1020 Dict['VARDEF_GUID_' + DatumType] = []\r
1021 Dict['VARDEF_SKUID_' + DatumType] = []\r
1022 Dict['VARDEF_VALUE_' + DatumType] = []\r
1023 Dict['VARDEF_DB_VALUE_' + DatumType] = []\r
ccaa7754 1024 for Init in ['INIT', 'UNINIT']:\r
e8a47801
LG
1025 Dict[Init+'_CNAME_DECL_' + DatumType] = []\r
1026 Dict[Init+'_GUID_DECL_' + DatumType] = []\r
1027 Dict[Init+'_NUMSKUS_DECL_' + DatumType] = []\r
1028 Dict[Init+'_VALUE_' + DatumType] = []\r
1029 Dict[Init+'_DB_VALUE_'+DatumType] = []\r
f7496d71 1030\r
ccaa7754 1031 for Type in ['STRING_HEAD', 'VPD_HEAD', 'VARIABLE_HEAD']:\r
e8a47801
LG
1032 Dict[Type + '_CNAME_DECL'] = []\r
1033 Dict[Type + '_GUID_DECL'] = []\r
1034 Dict[Type + '_NUMSKUS_DECL'] = []\r
1035 Dict[Type + '_VALUE'] = []\r
1036\r
1037 Dict['STRING_DB_VALUE'] = []\r
1038 Dict['VPD_DB_VALUE'] = []\r
1039 Dict['VARIABLE_DB_VALUE'] = []\r
f7496d71 1040\r
e8a47801
LG
1041 Dict['STRING_TABLE_INDEX'] = []\r
1042 Dict['STRING_TABLE_LENGTH'] = []\r
1043 Dict['STRING_TABLE_CNAME'] = []\r
1044 Dict['STRING_TABLE_GUID'] = []\r
1045 Dict['STRING_TABLE_VALUE'] = []\r
1046 Dict['STRING_TABLE_DB_VALUE'] = []\r
1047\r
1048 Dict['SIZE_TABLE_CNAME'] = []\r
1049 Dict['SIZE_TABLE_GUID'] = []\r
1050 Dict['SIZE_TABLE_CURRENT_LENGTH'] = []\r
1051 Dict['SIZE_TABLE_MAXIMUM_LENGTH'] = []\r
1052\r
1053 Dict['EXMAPPING_TABLE_EXTOKEN'] = []\r
1054 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'] = []\r
1055 Dict['EXMAPPING_TABLE_GUID_INDEX'] = []\r
1056\r
1057 Dict['GUID_STRUCTURE'] = []\r
1058 Dict['SKUID_VALUE'] = [0] # init Dict length\r
1059 Dict['VARDEF_HEADER'] = []\r
1060\r
1061 Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'] = []\r
1062 Dict['VARIABLE_DB_VALUE'] = []\r
f7496d71 1063\r
e8a47801 1064 Dict['PCD_TOKENSPACE'] = []\r
f7496d71 1065 Dict['PCD_CNAME'] = []\r
e8a47801
LG
1066 Dict['PCD_TOKENSPACE_LENGTH'] = []\r
1067 Dict['PCD_CNAME_LENGTH'] = []\r
1068 Dict['PCD_TOKENSPACE_OFFSET'] = []\r
1069 Dict['PCD_CNAME_OFFSET'] = []\r
1070 Dict['PCD_TOKENSPACE_MAP'] = []\r
1071 Dict['PCD_NAME_OFFSET'] = []\r
f7496d71 1072\r
84cc912a 1073 Dict['PCD_ORDER_TOKEN_NUMBER_MAP'] = {}\r
2bc3256c 1074 PCD_STRING_INDEX_MAP = {}\r
f7496d71 1075\r
e8a47801
LG
1076 StringTableIndex = 0\r
1077 StringTableSize = 0\r
1078 NumberOfLocalTokens = 0\r
1079 NumberOfPeiLocalTokens = 0\r
1080 NumberOfDxeLocalTokens = 0\r
1081 NumberOfExTokens = 0\r
1082 NumberOfSizeItems = 0\r
1083 NumberOfSkuEnabledPcd = 0\r
1084 GuidList = []\r
82a6a960 1085 VarCheckTab = VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER()\r
e8a47801 1086 i = 0\r
2b8a6c44 1087 ReorderedDynPcdList = GetOrderedDynamicPcdList(DynamicPcdList, Platform.PcdTokenNumber)\r
ae7b6df8
LG
1088 for item in ReorderedDynPcdList:\r
1089 if item.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
656d2539 1090 item.DatumType = TAB_VOID\r
84cc912a 1091 for Pcd in ReorderedDynPcdList:\r
2bc3256c 1092 VoidStarTypeCurrSize = []\r
e8a47801
LG
1093 i += 1\r
1094 CName = Pcd.TokenCName\r
1095 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
1096\r
2a29017e
YZ
1097 for PcdItem in GlobalData.MixedPcd:\r
1098 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
1099 CName = PcdItem[0]\r
1100\r
e8a47801
LG
1101 EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))\r
1102\r
1103 if Pcd.Phase == 'PEI':\r
1104 NumberOfPeiLocalTokens += 1\r
1105 if Pcd.Phase == 'DXE':\r
1106 NumberOfDxeLocalTokens += 1\r
1107 if Pcd.Phase != Phase:\r
1108 continue\r
1109\r
1110 #\r
1111 # TODO: need GetGuidValue() definition\r
1112 #\r
1113 TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue\r
1114 TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure)\r
eece4292 1115 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
e8a47801 1116 if TokenSpaceGuid not in GuidList:\r
caf74495 1117 GuidList.append(TokenSpaceGuid)\r
e8a47801
LG
1118 Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure)\r
1119 NumberOfExTokens += 1\r
1120\r
1121 ValueList = []\r
1122 DbValueList = []\r
1123 StringHeadOffsetList = []\r
1124 StringDbOffsetList = []\r
1125 VpdHeadOffsetList = []\r
1126 VpdDbOffsetList = []\r
1127 VariableHeadValueList = []\r
1128 VariableDbValueList = []\r
1129 Pcd.InitString = 'UNINIT'\r
1130\r
656d2539 1131 if Pcd.DatumType == TAB_VOID:\r
be409b67 1132 if Pcd.Type not in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD]:\r
e8a47801
LG
1133 Pcd.TokenTypeList = ['PCD_TYPE_STRING']\r
1134 else:\r
1135 Pcd.TokenTypeList = []\r
1136 elif Pcd.DatumType == 'BOOLEAN':\r
1137 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_UINT8_BOOLEAN']\r
1138 else:\r
1139 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType]\r
1140\r
1141 if len(Pcd.SkuInfoList) > 1:\r
e8a47801 1142 NumberOfSkuEnabledPcd += 1\r
f7496d71
LG
1143\r
1144 SkuIdIndex = 1\r
2bc3256c 1145 VariableHeadList = []\r
e8a47801
LG
1146 for SkuName in Pcd.SkuInfoList:\r
1147 Sku = Pcd.SkuInfoList[SkuName]\r
1148 SkuId = Sku.SkuId\r
4231a819 1149 if SkuId is None or SkuId == '':\r
e8a47801
LG
1150 continue\r
1151\r
f7496d71 1152\r
e8a47801 1153 SkuIdIndex += 1\r
f7496d71 1154\r
e8a47801 1155 if len(Sku.VariableName) > 0:\r
82a6a960
BF
1156 VariableGuidStructure = Sku.VariableGuidValue\r
1157 VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure)\r
1158 if Platform.Platform.VarCheckFlag:\r
1159 var_check_obj = VAR_CHECK_PCD_VARIABLE_TAB(VariableGuidStructure, StringToArray(Sku.VariableName))\r
1160 try:\r
92a4eebb 1161 var_check_obj.push_back(GetValidationObject(Pcd, Sku.VariableOffset))\r
82a6a960
BF
1162 VarAttr, _ = VariableAttributes.GetVarAttributes(Sku.VariableAttribute)\r
1163 var_check_obj.SetAttributes(VarAttr)\r
1164 var_check_obj.UpdateSize()\r
1165 VarCheckTab.push_back(var_check_obj)\r
1166 except Exception:\r
1167 ValidInfo = ''\r
1168 if Pcd.validateranges:\r
1169 ValidInfo = Pcd.validateranges[0]\r
1170 if Pcd.validlists:\r
1171 ValidInfo = Pcd.validlists[0]\r
1172 if ValidInfo:\r
1173 EdkLogger.error("build", PCD_VALIDATION_INFO_ERROR,\r
1174 "The PCD '%s.%s' Validation information defined in DEC file has incorrect format." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),\r
1175 ExtraData = "[%s]" % str(ValidInfo))\r
1176 else:\r
1177 EdkLogger.error("build", PCD_VALIDATION_INFO_ERROR,\r
1178 "The PCD '%s.%s' Validation information defined in DEC file has incorrect format." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
caf74495 1179 Pcd.TokenTypeList.append('PCD_TYPE_HII')\r
e8a47801 1180 Pcd.InitString = 'INIT'\r
2bc3256c
LG
1181 # Store all variable names of one HII PCD under different SKU to stringTable\r
1182 # and calculate the VariableHeadStringIndex\r
2b8a6c44
LG
1183\r
1184 VariableNameStructure = StringToArray(Sku.VariableName)\r
4cf022f2
FB
1185\r
1186 # Make pointer of VaraibleName(HII PCD) 2 bytes aligned\r
1187 VariableNameStructureBytes = VariableNameStructure.lstrip("{").rstrip("}").split(",")\r
1188 if len(VariableNameStructureBytes) % 2:\r
1189 VariableNameStructure = "{%s,0x00}" % ",".join(VariableNameStructureBytes)\r
1190\r
2b8a6c44
LG
1191 if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:\r
1192 Dict['STRING_TABLE_CNAME'].append(CName)\r
1193 Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)\r
1194 if StringTableIndex == 0:\r
1195 Dict['STRING_TABLE_INDEX'].append('')\r
1196 else:\r
1197 Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
ccaa7754 1198 VarNameSize = len(VariableNameStructure.replace(',', ' ').split())\r
2b8a6c44
LG
1199 Dict['STRING_TABLE_LENGTH'].append(VarNameSize )\r
1200 Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)\r
1201 StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
1202 VarStringDbOffsetList = []\r
1203 VarStringDbOffsetList.append(StringTableSize)\r
1204 Dict['STRING_DB_VALUE'].append(VarStringDbOffsetList)\r
1205 StringTableIndex += 1\r
ccaa7754 1206 StringTableSize += len(VariableNameStructure.replace(',', ' ').split())\r
2b8a6c44
LG
1207 VariableHeadStringIndex = 0\r
1208 for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):\r
1209 VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]\r
1210 VariableHeadList.append(VariableHeadStringIndex)\r
f7496d71 1211\r
2bc3256c 1212 VariableHeadStringIndex = VariableHeadList[SkuIdIndex - 2]\r
e8a47801 1213 # store VariableGuid to GuidTable and get the VariableHeadGuidIndex\r
e8a47801
LG
1214\r
1215 if VariableGuid not in GuidList:\r
caf74495 1216 GuidList.append(VariableGuid)\r
e8a47801
LG
1217 Dict['GUID_STRUCTURE'].append(VariableGuidStructure)\r
1218 VariableHeadGuidIndex = GuidList.index(VariableGuid)\r
1219\r
1220 if "PCD_TYPE_STRING" in Pcd.TokenTypeList:\r
1221 VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s), %dU, %sU' %\r
f7496d71 1222 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid,\r
e8a47801
LG
1223 VariableHeadGuidIndex, Sku.VariableOffset))\r
1224 else:\r
1225 VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s), %dU, %sU' %\r
f7496d71 1226 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, SkuIdIndex,\r
e8a47801
LG
1227 VariableHeadGuidIndex, Sku.VariableOffset))\r
1228 Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName)\r
1229 Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid)\r
1230 Dict['VARDEF_SKUID_'+Pcd.DatumType].append(SkuIdIndex)\r
1231 if "PCD_TYPE_STRING" in Pcd.TokenTypeList:\r
1232 Dict['VARDEF_VALUE_' + Pcd.DatumType].append("%s_%s[%d]" % (Pcd.TokenCName, TokenSpaceGuid, SkuIdIndex))\r
1233 else:\r
1234 #\r
1235 # ULL (for UINT64) or U(other integer type) should be append to avoid\r
1236 # warning under linux building environment.\r
1237 #\r
1238 Dict['VARDEF_DB_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)\r
f7496d71 1239\r
656d2539 1240 if Pcd.DatumType == TAB_UINT64:\r
e8a47801 1241 Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "ULL")\r
656d2539 1242 elif Pcd.DatumType in (TAB_UINT32, TAB_UINT16, TAB_UINT8):\r
e8a47801
LG
1243 Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U")\r
1244 elif Pcd.DatumType == "BOOLEAN":\r
ccaa7754 1245 if eval(Sku.HiiDefaultValue) in [1, 0]:\r
e8a47801
LG
1246 Dict['VARDEF_VALUE_'+Pcd.DatumType].append(str(eval(Sku.HiiDefaultValue)) + "U")\r
1247 else:\r
1248 Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)\r
1249\r
1250 # construct the VariableHeader value\r
1251 if "PCD_TYPE_STRING" in Pcd.TokenTypeList:\r
1252 VariableHeadValueList.append('%dU, %dU, %sU, offsetof(%s_PCD_DATABASE, Init.%s_%s)' %\r
1253 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,\r
1254 Phase, CName, TokenSpaceGuid))\r
1255 # the Pcd default value will be filled later on\r
1256 VariableOffset = len(Dict['STRING_DB_VALUE'])\r
1257 VariableRefTable = Dict['STRING_DB_VALUE']\r
1258 else:\r
1259 VariableHeadValueList.append('%dU, %dU, %sU, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s)' %\r
1260 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,\r
1261 Phase, CName, TokenSpaceGuid, SkuIdIndex))\r
1262 # the Pcd default value was filled before\r
1263 VariableOffset = len(Dict['VARDEF_DB_VALUE_' + Pcd.DatumType]) - 1\r
1264 VariableRefTable = Dict['VARDEF_DB_VALUE_' + Pcd.DatumType]\r
82a6a960 1265 VariableDbValueList.append([VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset, VariableOffset, VariableRefTable, Sku.VariableAttribute])\r
e8a47801
LG
1266\r
1267 elif Sku.VpdOffset != '':\r
caf74495 1268 Pcd.TokenTypeList.append('PCD_TYPE_VPD')\r
e8a47801
LG
1269 Pcd.InitString = 'INIT'\r
1270 VpdHeadOffsetList.append(str(Sku.VpdOffset) + 'U')\r
1271 VpdDbOffsetList.append(Sku.VpdOffset)\r
f7496d71 1272 # Also add the VOID* string of VPD PCD to SizeTable\r
656d2539 1273 if Pcd.DatumType == TAB_VOID:\r
e8a47801 1274 NumberOfSizeItems += 1\r
e8a47801 1275 # For VPD type of PCD, its current size is equal to its MAX size.\r
f7496d71 1276 VoidStarTypeCurrSize = [str(Pcd.MaxDatumSize) + 'U']\r
e8a47801 1277 continue\r
f7496d71 1278\r
656d2539 1279 if Pcd.DatumType == TAB_VOID:\r
caf74495 1280 Pcd.TokenTypeList.append('PCD_TYPE_STRING')\r
e8a47801
LG
1281 Pcd.InitString = 'INIT'\r
1282 if Sku.HiiDefaultValue != '' and Sku.DefaultValue == '':\r
1283 Sku.DefaultValue = Sku.HiiDefaultValue\r
1284 if Sku.DefaultValue != '':\r
1285 NumberOfSizeItems += 1\r
1286 Dict['STRING_TABLE_CNAME'].append(CName)\r
1287 Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)\r
1288\r
1289 if StringTableIndex == 0:\r
1290 Dict['STRING_TABLE_INDEX'].append('')\r
1291 else:\r
1292 Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
1293 if Sku.DefaultValue[0] == 'L':\r
2bc3256c 1294 DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
ccaa7754 1295 Size = len(DefaultValueBinStructure.replace(',', ' ').split())\r
2bc3256c 1296 Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
e8a47801 1297 elif Sku.DefaultValue[0] == '"':\r
2bc3256c 1298 DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
47fea6af 1299 Size = len(Sku.DefaultValue) - 2 + 1\r
2bc3256c 1300 Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
e8a47801 1301 elif Sku.DefaultValue[0] == '{':\r
2bc3256c
LG
1302 DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
1303 Size = len(Sku.DefaultValue.split(","))\r
1304 Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
f7496d71 1305\r
e8a47801
LG
1306 StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
1307 StringDbOffsetList.append(StringTableSize)\r
e8a47801
LG
1308 if Pcd.MaxDatumSize != '':\r
1309 MaxDatumSize = int(Pcd.MaxDatumSize, 0)\r
1310 if MaxDatumSize < Size:\r
c33081c9
YZ
1311 if Pcd.MaxSizeUserSet:\r
1312 EdkLogger.error("build", AUTOGEN_ERROR,\r
2bc3256c
LG
1313 "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),\r
1314 ExtraData="[%s]" % str(Platform))\r
c33081c9
YZ
1315 else:\r
1316 MaxDatumSize = Size\r
2bc3256c
LG
1317 else:\r
1318 MaxDatumSize = Size\r
1319 StringTabLen = MaxDatumSize\r
1320 if StringTabLen % 2:\r
1321 StringTabLen += 1\r
1322 if Sku.VpdOffset == '':\r
1323 VoidStarTypeCurrSize.append(str(Size) + 'U')\r
1324 Dict['STRING_TABLE_LENGTH'].append(StringTabLen)\r
e8a47801 1325 StringTableIndex += 1\r
2bc3256c 1326 StringTableSize += (StringTabLen)\r
e8a47801
LG
1327 else:\r
1328 if "PCD_TYPE_HII" not in Pcd.TokenTypeList:\r
caf74495 1329 Pcd.TokenTypeList.append('PCD_TYPE_DATA')\r
e8a47801
LG
1330 if Sku.DefaultValue == 'TRUE':\r
1331 Pcd.InitString = 'INIT'\r
1332 else:\r
841d86fe 1333 Pcd.InitString = Pcd.isinit\r
e8a47801
LG
1334 #\r
1335 # For UNIT64 type PCD's value, ULL should be append to avoid\r
1336 # warning under linux building environment.\r
1337 #\r
656d2539 1338 if Pcd.DatumType == TAB_UINT64:\r
e8a47801 1339 ValueList.append(Sku.DefaultValue + "ULL")\r
656d2539 1340 elif Pcd.DatumType in (TAB_UINT32, TAB_UINT16, TAB_UINT8):\r
e8a47801
LG
1341 ValueList.append(Sku.DefaultValue + "U")\r
1342 elif Pcd.DatumType == "BOOLEAN":\r
1343 if Sku.DefaultValue in ["1", "0"]:\r
f7496d71 1344 ValueList.append(Sku.DefaultValue + "U")\r
e8a47801
LG
1345 else:\r
1346 ValueList.append(Sku.DefaultValue)\r
f7496d71 1347\r
e8a47801
LG
1348 DbValueList.append(Sku.DefaultValue)\r
1349\r
1ccc4d89 1350 Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
656d2539 1351 if Pcd.DatumType == TAB_VOID:\r
2bc3256c
LG
1352 Dict['SIZE_TABLE_CNAME'].append(CName)\r
1353 Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
1354 Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
1355 Dict['SIZE_TABLE_CURRENT_LENGTH'].append(VoidStarTypeCurrSize)\r
f7496d71
LG
1356\r
1357\r
e8a47801
LG
1358\r
1359 if 'PCD_TYPE_HII' in Pcd.TokenTypeList:\r
1360 Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)\r
1361 Dict['VARIABLE_HEAD_GUID_DECL'].append(TokenSpaceGuid)\r
1362 Dict['VARIABLE_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))\r
1363 Dict['VARIABLE_HEAD_VALUE'].append('{ %s }\n' % ' },\n { '.join(VariableHeadValueList))\r
1364 Dict['VARDEF_HEADER'].append('_Variable_Header')\r
1365 Dict['VARIABLE_DB_VALUE'].append(VariableDbValueList)\r
1366 else:\r
1367 Dict['VARDEF_HEADER'].append('')\r
1368 if 'PCD_TYPE_VPD' in Pcd.TokenTypeList:\r
1369 Dict['VPD_HEAD_CNAME_DECL'].append(CName)\r
1370 Dict['VPD_HEAD_GUID_DECL'].append(TokenSpaceGuid)\r
1371 Dict['VPD_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))\r
1372 Dict['VPD_HEAD_VALUE'].append('{ %s }' % ' }, { '.join(VpdHeadOffsetList))\r
1373 Dict['VPD_DB_VALUE'].append(VpdDbOffsetList)\r
1374 if 'PCD_TYPE_STRING' in Pcd.TokenTypeList:\r
1375 Dict['STRING_HEAD_CNAME_DECL'].append(CName)\r
1376 Dict['STRING_HEAD_GUID_DECL'].append(TokenSpaceGuid)\r
1377 Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))\r
1378 Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList))\r
1379 Dict['STRING_DB_VALUE'].append(StringDbOffsetList)\r
2bc3256c 1380 PCD_STRING_INDEX_MAP[len(Dict['STRING_HEAD_CNAME_DECL']) -1 ] = len(Dict['STRING_DB_VALUE']) -1\r
e8a47801
LG
1381 if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:\r
1382 Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName)\r
1383 Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid)\r
1384 Dict[Pcd.InitString+'_NUMSKUS_DECL_'+Pcd.DatumType].append(len(Pcd.SkuInfoList))\r
1385 if Pcd.InitString == 'UNINIT':\r
1386 Dict['PCD_DATABASE_UNINIT_EMPTY'] = ''\r
1387 else:\r
1388 Dict[Pcd.InitString+'_VALUE_'+Pcd.DatumType].append(', '.join(ValueList))\r
1389 Dict[Pcd.InitString+'_DB_VALUE_'+Pcd.DatumType].append(DbValueList)\r
f7496d71 1390\r
e8a47801
LG
1391 if Phase == 'PEI':\r
1392 NumberOfLocalTokens = NumberOfPeiLocalTokens\r
1393 if Phase == 'DXE':\r
1394 NumberOfLocalTokens = NumberOfDxeLocalTokens\r
1395\r
1396 Dict['TOKEN_INIT'] = ['' for x in range(NumberOfLocalTokens)]\r
1397 Dict['TOKEN_CNAME'] = ['' for x in range(NumberOfLocalTokens)]\r
1398 Dict['TOKEN_GUID'] = ['' for x in range(NumberOfLocalTokens)]\r
1399 Dict['TOKEN_TYPE'] = ['' for x in range(NumberOfLocalTokens)]\r
1400 Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'] = ['' for x in range(NumberOfLocalTokens)]\r
1401 Dict['PCD_CNAME'] = ['' for x in range(NumberOfLocalTokens)]\r
f7496d71 1402 Dict['PCD_TOKENSPACE_MAP'] = ['' for x in range(NumberOfLocalTokens)]\r
e8a47801 1403 Dict['PCD_CNAME_LENGTH'] = [0 for x in range(NumberOfLocalTokens)]\r
84cc912a
FB
1404 SkuEnablePcdIndex = 0\r
1405 for Pcd in ReorderedDynPcdList:\r
e8a47801
LG
1406 CName = Pcd.TokenCName\r
1407 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
1408 if Pcd.Phase != Phase:\r
1409 continue\r
1410\r
1411 TokenSpaceGuid = GuidStructureStringToGuidValueName(Pcd.TokenSpaceGuidValue) #(Platform.PackageList, TokenSpaceGuidCName))\r
1412 GeneratedTokenNumber = Platform.PcdTokenNumber[CName, TokenSpaceGuidCName] - 1\r
1413 if Phase == 'DXE':\r
1414 GeneratedTokenNumber -= NumberOfPeiLocalTokens\r
1415\r
84cc912a
FB
1416 if len(Pcd.SkuInfoList) > 1:\r
1417 Dict['PCD_ORDER_TOKEN_NUMBER_MAP'][GeneratedTokenNumber] = SkuEnablePcdIndex\r
1418 SkuEnablePcdIndex += 1\r
2a29017e
YZ
1419\r
1420 for PcdItem in GlobalData.MixedPcd:\r
1421 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
1422 CName = PcdItem[0]\r
1423\r
e8a47801
LG
1424 EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))\r
1425 EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)\r
1426 EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))\r
f7496d71 1427\r
e8a47801
LG
1428 #\r
1429 # following four Dict items hold the information for LocalTokenNumberTable\r
1430 #\r
1431 Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Init'\r
1432 if Pcd.InitString == 'UNINIT':\r
1433 Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Uninit'\r
1434\r
1435 Dict['TOKEN_CNAME'][GeneratedTokenNumber] = CName\r
1436 Dict['TOKEN_GUID'][GeneratedTokenNumber] = TokenSpaceGuid\r
1437 Dict['TOKEN_TYPE'][GeneratedTokenNumber] = ' | '.join(Pcd.TokenTypeList)\r
f7496d71 1438\r
e8a47801
LG
1439 if Platform.Platform.PcdInfoFlag:\r
1440 TokenSpaceGuidCNameArray = StringToArray('"' + TokenSpaceGuidCName + '"' )\r
1441 if TokenSpaceGuidCNameArray not in Dict['PCD_TOKENSPACE']:\r
1442 Dict['PCD_TOKENSPACE'].append(TokenSpaceGuidCNameArray)\r
2bc3256c 1443 Dict['PCD_TOKENSPACE_LENGTH'].append( len(TokenSpaceGuidCNameArray.split(",")) )\r
e8a47801 1444 Dict['PCD_TOKENSPACE_MAP'][GeneratedTokenNumber] = Dict['PCD_TOKENSPACE'].index(TokenSpaceGuidCNameArray)\r
2bc3256c
LG
1445 CNameBinArray = StringToArray('"' + CName + '"' )\r
1446 Dict['PCD_CNAME'][GeneratedTokenNumber] = CNameBinArray\r
f7496d71 1447\r
2bc3256c 1448 Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CNameBinArray.split(","))\r
f7496d71
LG
1449\r
1450\r
1ccc4d89 1451 Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
e8a47801
LG
1452\r
1453 # search the Offset and Table, used by LocalTokenNumberTableOffset\r
1454 if 'PCD_TYPE_HII' in Pcd.TokenTypeList:\r
1455 # Find index by CName, TokenSpaceGuid\r
1456 Offset = GetMatchedIndex(CName, Dict['VARIABLE_HEAD_CNAME_DECL'], TokenSpaceGuid, Dict['VARIABLE_HEAD_GUID_DECL'])\r
1457 assert(Offset != -1)\r
1458 Table = Dict['VARIABLE_DB_VALUE']\r
1459 if 'PCD_TYPE_VPD' in Pcd.TokenTypeList:\r
1460 Offset = GetMatchedIndex(CName, Dict['VPD_HEAD_CNAME_DECL'], TokenSpaceGuid, Dict['VPD_HEAD_GUID_DECL'])\r
1461 assert(Offset != -1)\r
1462 Table = Dict['VPD_DB_VALUE']\r
1463 if 'PCD_TYPE_STRING' in Pcd.TokenTypeList and 'PCD_TYPE_HII' not in Pcd.TokenTypeList:\r
1464 # Find index by CName, TokenSpaceGuid\r
1465 Offset = GetMatchedIndex(CName, Dict['STRING_HEAD_CNAME_DECL'], TokenSpaceGuid, Dict['STRING_HEAD_GUID_DECL'])\r
2bc3256c 1466 Offset = PCD_STRING_INDEX_MAP[Offset]\r
e8a47801
LG
1467 assert(Offset != -1)\r
1468 Table = Dict['STRING_DB_VALUE']\r
1469 if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:\r
1470 # need to store whether it is in init table or not\r
1471 Offset = GetMatchedIndex(CName, Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType], TokenSpaceGuid, Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType])\r
1472 assert(Offset != -1)\r
1473 if Pcd.InitString == 'UNINIT':\r
1474 Table = Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType]\r
1475 else:\r
f7496d71 1476 Table = Dict[Pcd.InitString+'_DB_VALUE_'+Pcd.DatumType]\r
e8a47801
LG
1477 Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'][GeneratedTokenNumber] = (Offset, Table)\r
1478\r
1479 #\r
1480 # Update VARDEF_HEADER\r
1481 #\r
1482 if 'PCD_TYPE_HII' in Pcd.TokenTypeList:\r
1483 Dict['VARDEF_HEADER'][GeneratedTokenNumber] = '_Variable_Header'\r
1484 else:\r
1485 Dict['VARDEF_HEADER'][GeneratedTokenNumber] = ''\r
f7496d71
LG
1486\r
1487\r
eece4292 1488 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f7496d71 1489\r
e8a47801
LG
1490 if Phase == 'DXE':\r
1491 GeneratedTokenNumber += NumberOfPeiLocalTokens\r
1492 #\r
1493 # Per, PCD architecture specification, PCD Token Number is 1 based and 0 is defined as invalid token number.\r
1494 # For each EX type PCD, a PCD Token Number is assigned. When the\r
1495 # PCD Driver/PEIM map EX_GUID and EX_TOKEN_NUMBER to the PCD Token Number,\r
1496 # the non-EX Protocol/PPI interface can be called to get/set the value. This assumption is made by\r
1497 # Pcd Driver/PEIM in MdeModulePkg.\r
1498 # Therefore, 1 is added to GeneratedTokenNumber to generate a PCD Token Number before being inserted\r
1499 # to the EXMAPPING_TABLE.\r
1500 #\r
f7496d71 1501\r
e8a47801
LG
1502\r
1503 Dict['EXMAPPING_TABLE_EXTOKEN'].append(str(Pcd.TokenValue) + 'U')\r
1504 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(str(GeneratedTokenNumber + 1) + 'U')\r
1505 Dict['EXMAPPING_TABLE_GUID_INDEX'].append(str(GuidList.index(TokenSpaceGuid)) + 'U')\r
1506\r
1507 if Platform.Platform.PcdInfoFlag:\r
1508 for index in range(len(Dict['PCD_TOKENSPACE_MAP'])):\r
1509 TokenSpaceIndex = StringTableSize\r
1510 for i in range(Dict['PCD_TOKENSPACE_MAP'][index]):\r
1511 TokenSpaceIndex += Dict['PCD_TOKENSPACE_LENGTH'][i]\r
f7496d71 1512 Dict['PCD_TOKENSPACE_OFFSET'].append(TokenSpaceIndex)\r
e8a47801
LG
1513 for index in range(len(Dict['PCD_TOKENSPACE'])):\r
1514 StringTableSize += Dict['PCD_TOKENSPACE_LENGTH'][index]\r
2bc3256c 1515 StringTableIndex += 1\r
e8a47801 1516 for index in range(len(Dict['PCD_CNAME'])):\r
f7496d71 1517 Dict['PCD_CNAME_OFFSET'].append(StringTableSize)\r
e8a47801
LG
1518 Dict['PCD_NAME_OFFSET'].append(Dict['PCD_TOKENSPACE_OFFSET'][index])\r
1519 Dict['PCD_NAME_OFFSET'].append(StringTableSize)\r
1520 StringTableSize += Dict['PCD_CNAME_LENGTH'][index]\r
2bc3256c 1521 StringTableIndex += 1\r
e8a47801
LG
1522 if GuidList != []:\r
1523 Dict['GUID_TABLE_EMPTY'] = 'FALSE'\r
1524 Dict['GUID_TABLE_SIZE'] = str(len(GuidList)) + 'U'\r
1525 else:\r
1526 Dict['GUID_STRUCTURE'] = [GuidStringToGuidStructureString('00000000-0000-0000-0000-000000000000')]\r
1527\r
1528 if StringTableIndex == 0:\r
1529 Dict['STRING_TABLE_INDEX'].append('')\r
1530 Dict['STRING_TABLE_LENGTH'].append(1)\r
1531 Dict['STRING_TABLE_CNAME'].append('')\r
1532 Dict['STRING_TABLE_GUID'].append('')\r
1533 Dict['STRING_TABLE_VALUE'].append('{ 0 }')\r
1534 else:\r
1535 Dict['STRING_TABLE_EMPTY'] = 'FALSE'\r
1536 Dict['STRING_TABLE_SIZE'] = str(StringTableSize) + 'U'\r
1537\r
1538 if Dict['SIZE_TABLE_CNAME'] == []:\r
1539 Dict['SIZE_TABLE_CNAME'].append('')\r
1540 Dict['SIZE_TABLE_GUID'].append('')\r
2bc3256c 1541 Dict['SIZE_TABLE_CURRENT_LENGTH'].append(['0U'])\r
e8a47801
LG
1542 Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append('0U')\r
1543\r
1544 if NumberOfLocalTokens != 0:\r
1545 Dict['DATABASE_EMPTY'] = 'FALSE'\r
1546 Dict['LOCAL_TOKEN_NUMBER_TABLE_SIZE'] = NumberOfLocalTokens\r
1547 Dict['LOCAL_TOKEN_NUMBER'] = NumberOfLocalTokens\r
1548\r
1549 if NumberOfExTokens != 0:\r
1550 Dict['EXMAP_TABLE_EMPTY'] = 'FALSE'\r
1551 Dict['EXMAPPING_TABLE_SIZE'] = str(NumberOfExTokens) + 'U'\r
1552 Dict['EX_TOKEN_NUMBER'] = str(NumberOfExTokens) + 'U'\r
1553 else:\r
1554 Dict['EXMAPPING_TABLE_EXTOKEN'].append('0U')\r
1555 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append('0U')\r
1556 Dict['EXMAPPING_TABLE_GUID_INDEX'].append('0U')\r
1557\r
1558 if NumberOfSizeItems != 0:\r
1559 Dict['SIZE_TABLE_SIZE'] = str(NumberOfSizeItems * 2) + 'U'\r
f7496d71
LG
1560\r
1561 if NumberOfSkuEnabledPcd != 0:\r
e8a47801 1562 Dict['SKU_HEAD_SIZE'] = str(NumberOfSkuEnabledPcd) + 'U'\r
f7496d71 1563\r
1ae469b9
BF
1564 for AvailableSkuNumber in SkuObj.SkuIdNumberSet:\r
1565 if AvailableSkuNumber not in Dict['SKUID_VALUE']:\r
1566 Dict['SKUID_VALUE'].append(AvailableSkuNumber)\r
2bc3256c 1567 Dict['SKUID_VALUE'][0] = len(Dict['SKUID_VALUE']) - 1\r
f7496d71 1568\r
e8a47801
LG
1569 AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))\r
1570 if NumberOfLocalTokens == 0:\r
1571 AutoGenC.Append(gEmptyPcdDatabaseAutoGenC.Replace(Dict))\r
1572 else:\r
1573 #\r
1574 # Update Size Table to the right order, it should be same with LocalTokenNumberTable\r
1575 #\r
1576 SizeCNameTempList = []\r
1577 SizeGuidTempList = []\r
1578 SizeCurLenTempList = []\r
1579 SizeMaxLenTempList = []\r
1580 ReOrderFlag = True\r
f7496d71 1581\r
e8a47801
LG
1582 if len(Dict['SIZE_TABLE_CNAME']) == 1:\r
1583 if not (Dict['SIZE_TABLE_CNAME'][0] and Dict['SIZE_TABLE_GUID'][0]):\r
1584 ReOrderFlag = False\r
f7496d71 1585\r
e8a47801
LG
1586 if ReOrderFlag:\r
1587 for Count in range(len(Dict['TOKEN_CNAME'])):\r
1588 for Count1 in range(len(Dict['SIZE_TABLE_CNAME'])):\r
1589 if Dict['TOKEN_CNAME'][Count] == Dict['SIZE_TABLE_CNAME'][Count1] and \\r
1590 Dict['TOKEN_GUID'][Count] == Dict['SIZE_TABLE_GUID'][Count1]:\r
1591 SizeCNameTempList.append(Dict['SIZE_TABLE_CNAME'][Count1])\r
1592 SizeGuidTempList.append(Dict['SIZE_TABLE_GUID'][Count1])\r
1593 SizeCurLenTempList.append(Dict['SIZE_TABLE_CURRENT_LENGTH'][Count1])\r
1594 SizeMaxLenTempList.append(Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count1])\r
f7496d71 1595\r
e8a47801
LG
1596 for Count in range(len(Dict['SIZE_TABLE_CNAME'])):\r
1597 Dict['SIZE_TABLE_CNAME'][Count] = SizeCNameTempList[Count]\r
1598 Dict['SIZE_TABLE_GUID'][Count] = SizeGuidTempList[Count]\r
1599 Dict['SIZE_TABLE_CURRENT_LENGTH'][Count] = SizeCurLenTempList[Count]\r
1600 Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count] = SizeMaxLenTempList[Count]\r
f7496d71 1601\r
e8a47801 1602 AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict))\r
f7496d71 1603\r
2b8a6c44
LG
1604\r
1605# print Phase\r
e8a47801 1606 Buffer = BuildExDataBase(Dict)\r
ccaa7754 1607 return AutoGenH, AutoGenC, Buffer, VarCheckTab\r
e8a47801 1608\r
84cc912a
FB
1609def GetOrderedDynamicPcdList(DynamicPcdList, PcdTokenNumberList):\r
1610 ReorderedDyPcdList = [None for i in range(len(DynamicPcdList))]\r
1611 for Pcd in DynamicPcdList:\r
1612 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in PcdTokenNumberList:\r
1613 ReorderedDyPcdList[PcdTokenNumberList[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]-1] = Pcd\r
1614 return ReorderedDyPcdList\r
1615\r