]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/action/PcdDatabase.java
Using Common Definitions. Remove some unused codes.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / action / PcdDatabase.java
CommitLineData
241876c7 1/** @file\r
2 PcdDatabase class.\r
3\r
4Copyright (c) 2006, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
af98370e 9\r
241876c7 10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14package org.tianocore.build.pcd.action;\r
15\r
241876c7 16import java.util.ArrayList;\r
17import java.util.Comparator;\r
18import java.util.HashMap;\r
241876c7 19import java.util.List;\r
20import java.util.Map;\r
241876c7 21import java.util.UUID;\r
241876c7 22import org.tianocore.pcd.entity.DynamicTokenValue;\r
241876c7 23import org.tianocore.pcd.entity.Token;\r
241876c7 24import org.tianocore.pcd.exception.EntityException;\r
25\r
26/**\r
af98370e 27 CStructTypeDeclaration\r
28\r
241876c7 29 This class is used to store the declaration string, such as\r
af98370e 30 "UINT32 PcdPlatformFlashBaseAddress", of\r
241876c7 31 each memember in the C structure, which is a standard C language\r
32 feature used to implement a simple and efficient database for\r
33 dynamic(ex) type PCD entry.\r
34**/\r
35class CStructTypeDeclaration {\r
36 String key;\r
37 int alignmentSize;\r
38 String cCode;\r
39 boolean initTable;\r
af98370e 40\r
241876c7 41 public CStructTypeDeclaration (String key, int alignmentSize, String cCode, boolean initTable) {\r
42 this.key = key;\r
43 this.alignmentSize = alignmentSize;\r
44 this.cCode = cCode;\r
45 this.initTable = initTable;\r
46 }\r
47}\r
48\r
49/**\r
af98370e 50 StringTable\r
51\r
241876c7 52 This class is used to store the String in a PCD database.\r
af98370e 53\r
241876c7 54**/\r
55class StringTable {\r
af98370e 56 private ArrayList<String> al;\r
241876c7 57 private ArrayList<String> alComments;\r
58 private String phase;\r
af98370e 59 int len;\r
241876c7 60\r
61 public StringTable (String phase) {\r
62 this.phase = phase;\r
63 al = new ArrayList<String>();\r
64 alComments = new ArrayList<String>();\r
65 len = 0;\r
66 }\r
67\r
68 public String getSizeMacro () {\r
69 return String.format(PcdDatabase.StringTableSizeMacro, phase, getSize());\r
70 }\r
71\r
72 private int getSize () {\r
73 //\r
74 // We have at least one Unicode Character in the table.\r
75 //\r
76 return len == 0 ? 1 : len;\r
77 }\r
78\r
79 public String getExistanceMacro () {\r
80 return String.format(PcdDatabase.StringTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
81 }\r
af98370e 82\r
241876c7 83 public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable) {\r
84 final String stringTable = "StringTable";\r
85 final String tab = "\t";\r
86 final String newLine = "\r\n";\r
87 final String commaNewLine = ",\r\n";\r
af98370e 88\r
241876c7 89 CStructTypeDeclaration decl;\r
90\r
91 String cDeclCode = "";\r
92 String cInstCode = "";\r
93\r
94 //\r
95 // If we have a empty StringTable\r
96 //\r
97 if (al.size() == 0) {\r
af98370e 98 cDeclCode += String.format("%-20s%s[1]; /* StringTable is empty */", "UINT16", stringTable) + newLine;\r
241876c7 99 decl = new CStructTypeDeclaration (\r
100 stringTable,\r
101 2,\r
102 cDeclCode,\r
103 true\r
af98370e 104 );\r
241876c7 105 declaList.add(decl);\r
106\r
107 cInstCode = String.format("/* %s */", stringTable) + newLine + tab + "{ 0 }";\r
108 instTable.put(stringTable, cInstCode);\r
109 } else {\r
110\r
111 //\r
112 // If there is any String in the StringTable\r
113 //\r
114 for (int i = 0; i < al.size(); i++) {\r
115 String str = al.get(i);\r
116 String stringTableName;\r
af98370e 117\r
241876c7 118 if (i == 0) {\r
119 //\r
120 // StringTable is a well-known name in the PCD DXE driver\r
121 //\r
122 stringTableName = stringTable;\r
af98370e 123\r
241876c7 124 } else {\r
125 stringTableName = String.format("%s_%d", stringTable, i);\r
126 cDeclCode += tab;\r
127 }\r
af98370e 128 cDeclCode += String.format("%-20s%s[%d]; /* %s */", "UINT16",\r
129 stringTableName, str.length() + 1,\r
130 alComments.get(i))\r
241876c7 131 + newLine;\r
af98370e 132\r
241876c7 133 if (i == 0) {\r
134 cInstCode = "/* StringTable */" + newLine;\r
135 }\r
af98370e 136\r
241876c7 137 cInstCode += tab + String.format("L\"%s\" /* %s */", al.get(i), alComments.get(i));\r
138 if (i != al.size() - 1) {\r
139 cInstCode += commaNewLine;\r
140 }\r
141 }\r
af98370e 142\r
241876c7 143 decl = new CStructTypeDeclaration (\r
144 stringTable,\r
145 2,\r
146 cDeclCode,\r
147 true\r
af98370e 148 );\r
241876c7 149 declaList.add(decl);\r
af98370e 150\r
241876c7 151 instTable.put(stringTable, cInstCode);\r
152 }\r
153 }\r
154\r
155 public int add (String inputStr, Token token) {\r
156 int i;\r
157 int pos;\r
158\r
159 String str = inputStr;\r
af98370e 160\r
241876c7 161 //\r
162 // The input can be two types:\r
af98370e 163 // "L\"Bootmode\"" or "Bootmode".\r
164 // We drop the L\" and \" for the first type.\r
241876c7 165 if (str.startsWith("L\"") && str.endsWith("\"")) {\r
166 str = str.substring(2, str.length() - 1);\r
167 }\r
168 //\r
169 // Check if StringTable has this String already.\r
170 // If so, return the current pos.\r
171 //\r
172 for (i = 0, pos = 0; i < al.size(); i++) {\r
173 String s = al.get(i);;\r
174\r
175 if (str.equals(s)) {\r
176 return pos;\r
177 }\r
178 pos = s.length() + 1;\r
179 }\r
af98370e 180\r
241876c7 181 i = len;\r
182 //\r
183 // Include the NULL character at the end of String\r
184 //\r
af98370e 185 len += str.length() + 1;\r
241876c7 186 al.add(str);\r
187 alComments.add(token.getPrimaryKeyString());\r
188\r
189 return i;\r
190 }\r
191}\r
192\r
193/**\r
af98370e 194 SizeTable\r
195\r
241876c7 196 This class is used to store the Size information for\r
197 POINTER TYPE PCD entry in a PCD database.\r
198\r
199**/\r
200class SizeTable {\r
201 private ArrayList<ArrayList<Integer>> al;\r
202 private ArrayList<String> alComments;\r
203 private int len;\r
204 private String phase;\r
af98370e 205\r
241876c7 206 public SizeTable (String phase) {\r
207 al = new ArrayList<ArrayList<Integer>>();\r
208 alComments = new ArrayList<String>();\r
209 len = 0;\r
210 this.phase = phase;\r
211 }\r
212\r
213 public String getSizeMacro () {\r
214 return String.format(PcdDatabase.SizeTableSizeMacro, phase, getSize());\r
215 }\r
af98370e 216\r
241876c7 217 private int getSize() {\r
218 return len == 0 ? 1 : len;\r
219 }\r
220\r
221 public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
222 final String name = "SizeTable";\r
af98370e 223\r
241876c7 224 CStructTypeDeclaration decl;\r
225 String cCode;\r
226\r
af98370e 227 cCode = String.format(PcdDatabase.SizeTableDeclaration, phase);\r
241876c7 228 decl = new CStructTypeDeclaration (\r
229 name,\r
230 2,\r
231 cCode,\r
232 true\r
af98370e 233 );\r
241876c7 234 declaList.add(decl);\r
235\r
236\r
237 cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
238 instTable.put(name, cCode);\r
239 }\r
240\r
241 private ArrayList<String> getInstantiation () {\r
242 final String comma = ",";\r
243 ArrayList<String> Output = new ArrayList<String>();\r
244\r
245 Output.add("/* SizeTable */");\r
246 Output.add("{");\r
247 if (al.size() == 0) {\r
248 Output.add("\t0");\r
249 } else {\r
250 for (int index = 0; index < al.size(); index++) {\r
251 ArrayList<Integer> ial = al.get(index);\r
af98370e 252\r
241876c7 253 String str = "\t";\r
af98370e 254\r
241876c7 255 for (int index2 = 0; index2 < ial.size(); index2++) {\r
256 str += " " + ial.get(index2).toString();\r
257 if (index2 != ial.size() - 1) {\r
258 str += comma;\r
259 }\r
260 }\r
261\r
af98370e 262 str += " /* " + alComments.get(index) + " */";\r
263\r
241876c7 264 if (index != (al.size() - 1)) {\r
265 str += comma;\r
266 }\r
267\r
268 Output.add(str);\r
af98370e 269\r
241876c7 270 }\r
271 }\r
272 Output.add("}");\r
273\r
274 return Output;\r
275 }\r
276\r
277 public void add (Token token) {\r
278\r
279 //\r
280 // We only have size information for POINTER type PCD entry.\r
281 //\r
282 if (token.datumType != Token.DATUM_TYPE.POINTER) {\r
283 return;\r
284 }\r
af98370e 285\r
241876c7 286 ArrayList<Integer> ial = token.getPointerTypeSize();\r
af98370e 287\r
288 len+= ial.size();\r
241876c7 289\r
290 al.add(ial);\r
291 alComments.add(token.getPrimaryKeyString());\r
292\r
293 return;\r
294 }\r
af98370e 295\r
241876c7 296}\r
297\r
298/**\r
af98370e 299 GuidTable\r
300\r
241876c7 301 This class is used to store the GUIDs in a PCD database.\r
302**/\r
303class GuidTable {\r
304 private ArrayList<UUID> al;\r
305 private ArrayList<String> alComments;\r
306 private String phase;\r
307 private int len;\r
308 private int bodyLineNum;\r
309\r
310 public GuidTable (String phase) {\r
311 this.phase = phase;\r
312 al = new ArrayList<UUID>();\r
313 alComments = new ArrayList<String>();\r
314 len = 0;\r
315 bodyLineNum = 0;\r
316 }\r
317\r
318 public String getSizeMacro () {\r
319 return String.format(PcdDatabase.GuidTableSizeMacro, phase, getSize());\r
320 }\r
321\r
322 private int getSize () {\r
323 return (al.size() == 0)? 1 : al.size();\r
324 }\r
325\r
326 public String getExistanceMacro () {\r
327 return String.format(PcdDatabase.GuidTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
328 }\r
329\r
330 public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
331 final String name = "GuidTable";\r
af98370e 332\r
241876c7 333 CStructTypeDeclaration decl;\r
334 String cCode = "";\r
335\r
af98370e 336 cCode += String.format(PcdDatabase.GuidTableDeclaration, phase);\r
241876c7 337 decl = new CStructTypeDeclaration (\r
338 name,\r
339 4,\r
340 cCode,\r
341 true\r
af98370e 342 );\r
241876c7 343 declaList.add(decl);\r
344\r
345\r
346 cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
347 instTable.put(name, cCode);\r
348 }\r
349\r
350 private String getUuidCString (UUID uuid) {\r
351 String[] guidStrArray;\r
352\r
353 guidStrArray =(uuid.toString()).split("-");\r
354\r
355 return String.format("{0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
356 guidStrArray[0],\r
357 guidStrArray[1],\r
358 guidStrArray[2],\r
359 (guidStrArray[3].substring(0, 2)),\r
360 (guidStrArray[3].substring(2, 4)),\r
361 (guidStrArray[4].substring(0, 2)),\r
362 (guidStrArray[4].substring(2, 4)),\r
363 (guidStrArray[4].substring(4, 6)),\r
364 (guidStrArray[4].substring(6, 8)),\r
365 (guidStrArray[4].substring(8, 10)),\r
366 (guidStrArray[4].substring(10, 12))\r
367 );\r
368 }\r
369\r
370 private ArrayList<String> getInstantiation () {\r
371 ArrayList<String> Output = new ArrayList<String>();\r
372\r
373 Output.add("/* GuidTable */");\r
374 Output.add("{");\r
375\r
376 if (al.size() == 0) {\r
377 Output.add("\t" + getUuidCString(new UUID(0, 0)));\r
378 }\r
af98370e 379\r
241876c7 380 for (int i = 0; i < al.size(); i++) {\r
381 String str = "\t" + getUuidCString(al.get(i));\r
382\r
383 str += "/* " + alComments.get(i) + " */";\r
384 if (i != (al.size() - 1)) {\r
385 str += ",";\r
386 }\r
387 Output.add(str);\r
388 bodyLineNum++;\r
389\r
390 }\r
391 Output.add("}");\r
392\r
393 return Output;\r
394 }\r
395\r
396 public int add (UUID uuid, String name) {\r
397 //\r
398 // Check if GuidTable has this entry already.\r
399 // If so, return the GuidTable index.\r
400 //\r
401 for (int i = 0; i < al.size(); i++) {\r
402 if (al.get(i).compareTo(uuid) == 0) {\r
403 return i;\r
404 }\r
405 }\r
af98370e 406\r
407 len++;\r
241876c7 408 al.add(uuid);\r
409 alComments.add(name);\r
410\r
411 //\r
412 // Return the previous Table Index\r
413 //\r
414 return len - 1;\r
415 }\r
416\r
417}\r
418\r
419/**\r
af98370e 420 SkuIdTable\r
421\r
241876c7 422 This class is used to store the SKU IDs in a PCD database.\r
423\r
424**/\r
425class SkuIdTable {\r
426 private ArrayList<Integer[]> al;\r
427 private ArrayList<String> alComment;\r
428 private String phase;\r
429 private int len;\r
430\r
431 public SkuIdTable (String phase) {\r
432 this.phase = phase;\r
433 al = new ArrayList<Integer[]>();\r
434 alComment = new ArrayList<String>();\r
435 len = 0;\r
436 }\r
437\r
438 public String getSizeMacro () {\r
439 return String.format(PcdDatabase.SkuIdTableSizeMacro, phase, getSize());\r
440 }\r
441\r
442 private int getSize () {\r
443 return (len == 0)? 1 : len;\r
444 }\r
445\r
446 public String getExistanceMacro () {\r
447 return String.format(PcdDatabase.SkuTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
448 }\r
449\r
450 public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
451 final String name = "SkuIdTable";\r
af98370e 452\r
241876c7 453 CStructTypeDeclaration decl;\r
454 String cCode = "";\r
455\r
af98370e 456 cCode += String.format(PcdDatabase.SkuIdTableDeclaration, phase);\r
241876c7 457 decl = new CStructTypeDeclaration (\r
458 name,\r
459 1,\r
460 cCode,\r
461 true\r
af98370e 462 );\r
241876c7 463 declaList.add(decl);\r
464\r
465\r
466 cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
467 instTable.put(name, cCode);\r
468\r
469 //\r
470 // SystemSkuId is in PEI phase PCD Database\r
471 //\r
472 if (phase.equalsIgnoreCase("PEI")) {\r
473 decl = new CStructTypeDeclaration (\r
474 "SystemSkuId",\r
475 1,\r
476 String.format("%-20sSystemSkuId;\r\n", "SKU_ID"),\r
477 true\r
478 );\r
479 declaList.add(decl);\r
af98370e 480\r
241876c7 481 instTable.put("SystemSkuId", "0");\r
482 }\r
483\r
484 }\r
485\r
486 private ArrayList<String> getInstantiation () {\r
487 ArrayList<String> Output = new ArrayList<String> ();\r
488\r
489 Output.add("/* SkuIdTable */");\r
490 Output.add("{");\r
491\r
492 if (al.size() == 0) {\r
493 Output.add("\t0");\r
494 }\r
af98370e 495\r
241876c7 496 for (int index = 0; index < al.size(); index++) {\r
497 String str;\r
498\r
499 str = "/* " + alComment.get(index) + "*/ ";\r
500 str += "/* MaxSku */ ";\r
501\r
502\r
503 Integer[] ia = al.get(index);\r
504\r
505 str += "\t" + ia[0].toString() + ", ";\r
506 for (int index2 = 1; index2 < ia.length; index2++) {\r
507 str += ia[index2].toString();\r
508 if (!((index2 == ia.length - 1) && (index == al.size() - 1))) {\r
509 str += ", ";\r
510 }\r
511 }\r
512\r
513 Output.add(str);\r
514\r
515 }\r
516\r
517 Output.add("}");\r
518\r
519 return Output;\r
520 }\r
521\r
522 public int add (Token token) {\r
523\r
524 int index;\r
525 int pos;\r
af98370e 526\r
241876c7 527 //\r
528 // Check if this SKU_ID Array is already in the table\r
529 //\r
530 pos = 0;\r
531 for (Object o: al) {\r
532 Integer [] s = (Integer[]) o;\r
533 boolean different = false;\r
534 if (s[0] == token.getSkuIdCount()) {\r
535 for (index = 1; index < s.length; index++) {\r
536 if (s[index] != token.skuData.get(index-1).id) {\r
537 different = true;\r
538 break;\r
539 }\r
540 }\r
541 } else {\r
542 different = true;\r
543 }\r
544 if (different) {\r
545 pos += s[0] + 1;\r
546 } else {\r
547 return pos;\r
548 }\r
549 }\r
550\r
551 Integer [] skuIds = new Integer[token.skuData.size() + 1];\r
552 skuIds[0] = new Integer(token.skuData.size());\r
553 for (index = 1; index < skuIds.length; index++) {\r
554 skuIds[index] = new Integer(token.skuData.get(index - 1).id);\r
555 }\r
556\r
557 index = len;\r
558\r
af98370e 559 len += skuIds.length;\r
241876c7 560 al.add(skuIds);\r
561 alComment.add(token.getPrimaryKeyString());\r
562\r
563 return index;\r
564 }\r
565\r
566}\r
567\r
568class LocalTokenNumberTable {\r
569 private ArrayList<String> al;\r
570 private ArrayList<String> alComment;\r
571 private String phase;\r
572 private int len;\r
573\r
574 public LocalTokenNumberTable (String phase) {\r
575 this.phase = phase;\r
576 al = new ArrayList<String>();\r
577 alComment = new ArrayList<String>();\r
578\r
579 len = 0;\r
580 }\r
581\r
582 public String getSizeMacro () {\r
583 return String.format(PcdDatabase.LocalTokenNumberTableSizeMacro, phase, getSize())\r
584 + String.format(PcdDatabase.LocalTokenNumberSizeMacro, phase, al.size());\r
585 }\r
586\r
587 public int getSize () {\r
588 return (al.size() == 0)? 1 : al.size();\r
589 }\r
590\r
591 public String getExistanceMacro () {\r
592 return String.format(PcdDatabase.DatabaseExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
593 }\r
594\r
595 public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
596 final String name = "LocalTokenNumberTable";\r
af98370e 597\r
241876c7 598 CStructTypeDeclaration decl;\r
599 String cCode = "";\r
600\r
af98370e 601 cCode += String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase);\r
241876c7 602 decl = new CStructTypeDeclaration (\r
603 name,\r
604 4,\r
605 cCode,\r
606 true\r
af98370e 607 );\r
241876c7 608 declaList.add(decl);\r
609\r
610 cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
611 instTable.put(name, cCode);\r
612 }\r
613\r
614 private ArrayList<String> getInstantiation () {\r
615 ArrayList<String> output = new ArrayList<String>();\r
616\r
617 output.add("/* LocalTokenNumberTable */");\r
618 output.add("{");\r
619\r
620 if (al.size() == 0) {\r
621 output.add("\t0");\r
622 }\r
af98370e 623\r
241876c7 624 for (int index = 0; index < al.size(); index++) {\r
625 String str;\r
626\r
627 str = "\t" + (String)al.get(index);\r
628\r
629 str += " /* " + alComment.get(index) + " */ ";\r
630\r
631\r
632 if (index != (al.size() - 1)) {\r
633 str += ",";\r
634 }\r
635\r
636 output.add(str);\r
637\r
638 }\r
639\r
640 output.add("}");\r
641\r
642 return output;\r
643 }\r
644\r
645 public int add (Token token) {\r
646 int index = len;\r
647 String str;\r
648\r
af98370e 649 len++;\r
241876c7 650\r
651 str = String.format(PcdDatabase.offsetOfStrTemplate, phase, token.hasDefaultValue() ? "Init" : "Uninit", token.getPrimaryKeyString());\r
652\r
653 if (token.isUnicodeStringType()) {\r
654 str += " | PCD_TYPE_STRING";\r
655 }\r
656\r
657 if (token.isSkuEnable()) {\r
658 str += " | PCD_TYPE_SKU_ENABLED";\r
659 }\r
660\r
661 if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
662 str += " | PCD_TYPE_HII";\r
663 }\r
664\r
665 if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
666 str += " | PCD_TYPE_VPD";\r
667 }\r
af98370e 668\r
241876c7 669 switch (token.datumType) {\r
670 case UINT8:\r
671 case BOOLEAN:\r
672 str += " | PCD_DATUM_TYPE_UINT8";\r
673 break;\r
674 case UINT16:\r
675 str += " | PCD_DATUM_TYPE_UINT16";\r
676 break;\r
677 case UINT32:\r
678 str += " | PCD_DATUM_TYPE_UINT32";\r
679 break;\r
680 case UINT64:\r
681 str += " | PCD_DATUM_TYPE_UINT64";\r
682 break;\r
683 case POINTER:\r
684 str += " | PCD_DATUM_TYPE_POINTER";\r
685 break;\r
686 }\r
af98370e 687\r
241876c7 688 al.add(str);\r
689 alComment.add(token.getPrimaryKeyString());\r
690\r
691 return index;\r
692 }\r
693}\r
694\r
695/**\r
af98370e 696 ExMapTable\r
697\r
241876c7 698 This class is used to store the table of mapping information\r
699 between DynamicEX ID pair(Guid, TokenNumber) and\r
700 the local token number assigned by PcdDatabase class.\r
701**/\r
702class ExMapTable {\r
703\r
704 /**\r
af98370e 705 ExTriplet\r
706\r
241876c7 707 This class is used to store the mapping information\r
708 between DynamicEX ID pair(Guid, TokenNumber) and\r
709 the local token number assigned by PcdDatabase class.\r
710 **/\r
711 class ExTriplet {\r
712 public Integer guidTableIdx;\r
713 public Long exTokenNumber;\r
714 public Long localTokenIdx;\r
af98370e 715\r
241876c7 716 public ExTriplet (int guidTableIdx, long exTokenNumber, long localTokenIdx) {\r
717 this.guidTableIdx = new Integer(guidTableIdx);\r
718 this.exTokenNumber = new Long(exTokenNumber);\r
719 this.localTokenIdx = new Long(localTokenIdx);\r
720 }\r
721 }\r
722\r
723 private ArrayList<ExTriplet> al;\r
724 private Map<ExTriplet, String> alComment;\r
725 private String phase;\r
726 private int len;\r
727 private int bodyLineNum;\r
af98370e 728\r
241876c7 729 public ExMapTable (String phase) {\r
730 this.phase = phase;\r
731 al = new ArrayList<ExTriplet>();\r
732 alComment = new HashMap<ExTriplet, String>();\r
733 bodyLineNum = 0;\r
734 len = 0;\r
735 }\r
736\r
737 public String getSizeMacro () {\r
738 return String.format(PcdDatabase.ExMapTableSizeMacro, phase, getTableLen())\r
739 + String.format(PcdDatabase.ExTokenNumber, phase, al.size());\r
740 }\r
741\r
742 public String getExistanceMacro () {\r
743 return String.format(PcdDatabase.ExMapTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
744 }\r
745\r
746 public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
747 final String exMapTableName = "ExMapTable";\r
af98370e 748\r
241876c7 749 sortTable();\r
af98370e 750\r
241876c7 751 CStructTypeDeclaration decl;\r
752 String cCode = "";\r
753\r
af98370e 754 cCode += String.format(PcdDatabase.ExMapTableDeclaration, phase);\r
241876c7 755 decl = new CStructTypeDeclaration (\r
756 exMapTableName,\r
757 4,\r
758 cCode,\r
759 true\r
af98370e 760 );\r
241876c7 761 declaList.add(decl);\r
762\r
763\r
764 cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
765 instTable.put(exMapTableName, cCode);\r
766 }\r
af98370e 767\r
241876c7 768 private ArrayList<String> getInstantiation () {\r
769 ArrayList<String> Output = new ArrayList<String>();\r
770\r
771 Output.add("/* ExMapTable */");\r
772 Output.add("{");\r
773 if (al.size() == 0) {\r
774 Output.add("\t{0, 0, 0}");\r
775 }\r
af98370e 776\r
241876c7 777 int index;\r
778 for (index = 0; index < al.size(); index++) {\r
779 String str;\r
780\r
781 ExTriplet e = (ExTriplet)al.get(index);\r
782\r
783 str = "\t" + "{ " + String.format("0x%08X", e.exTokenNumber) + ", ";\r
784 str += e.localTokenIdx.toString() + ", ";\r
785 str += e.guidTableIdx.toString();\r
786\r
787 str += "}" + " /* " + alComment.get(e) + " */" ;\r
788\r
789 if (index != al.size() - 1) {\r
790 str += ",";\r
791 }\r
792\r
793 Output.add(str);\r
794 bodyLineNum++;\r
795\r
796 }\r
797\r
798 Output.add("}");\r
799\r
800 return Output;\r
801 }\r
802\r
803 public int add (int localTokenIdx, long exTokenNum, int guidTableIdx, String name) {\r
804 int index = len;\r
805\r
806 len++;\r
af98370e 807 ExTriplet et = new ExTriplet(guidTableIdx, exTokenNum, localTokenIdx);\r
241876c7 808\r
809 al.add(et);\r
810 alComment.put(et, name);\r
811\r
812 return index;\r
813 }\r
814\r
815 private int getTableLen () {\r
816 return al.size() == 0 ? 1 : al.size();\r
817 }\r
818\r
819 //\r
820 // To simplify the algorithm for GetNextToken and GetNextTokenSpace in\r
821 // PCD PEIM/Driver, we need to sort the ExMapTable according to the\r
822 // following order:\r
823 // 1) ExGuid\r
824 // 2) ExTokenNumber\r
af98370e 825 //\r
241876c7 826 class ExTripletComp implements Comparator<ExTriplet> {\r
827 public int compare (ExTriplet a, ExTriplet b) {\r
828 if (a.guidTableIdx == b.guidTableIdx ) {\r
829 //\r
830 // exTokenNumber is long, we can't use simple substraction.\r
831 //\r
832 if (a.exTokenNumber > b.exTokenNumber) {\r
833 return 1;\r
834 } else if (a.exTokenNumber == b.exTokenNumber) {\r
835 return 0;\r
836 } else {\r
837 return -1;\r
838 }\r
839 }\r
af98370e 840\r
241876c7 841 return a.guidTableIdx - b.guidTableIdx;\r
842 }\r
843 }\r
844\r
845 private void sortTable () {\r
846 java.util.Comparator<ExTriplet> comparator = new ExTripletComp();\r
847 java.util.Collections.sort(al, comparator);\r
848 }\r
849}\r
850\r
851/**\r
af98370e 852 PcdDatabase\r
853\r
241876c7 854 This class is used to generate C code for Autogen.h and Autogen.c of\r
855 a PCD service DXE driver and PCD service PEIM.\r
856**/\r
857public class PcdDatabase {\r
858\r
859 private final static int SkuHeadAlignmentSize = 4;\r
860 private final String newLine = "\r\n";\r
861 private final String commaNewLine = ",\r\n";\r
862 private final String tab = "\t";\r
863 public final static String ExMapTableDeclaration = "DYNAMICEX_MAPPING ExMapTable[%s_EXMAPPING_TABLE_SIZE];\r\n";\r
864 public final static String GuidTableDeclaration = "EFI_GUID GuidTable[%s_GUID_TABLE_SIZE];\r\n";\r
865 public final static String LocalTokenNumberTableDeclaration = "UINT32 LocalTokenNumberTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
866 public final static String StringTableDeclaration = "UINT16 StringTable[%s_STRING_TABLE_SIZE];\r\n";\r
867 public final static String SizeTableDeclaration = "SIZE_INFO SizeTable[%s_SIZE_TABLE_SIZE];\r\n";\r
868 public final static String SkuIdTableDeclaration = "UINT8 SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
869\r
870\r
871 public final static String ExMapTableSizeMacro = "#define %s_EXMAPPING_TABLE_SIZE %d\r\n";\r
872 public final static String ExTokenNumber = "#define %s_EX_TOKEN_NUMBER %d\r\n";\r
af98370e 873 public final static String GuidTableSizeMacro = "#define %s_GUID_TABLE_SIZE %d\r\n";\r
241876c7 874 public final static String LocalTokenNumberTableSizeMacro = "#define %s_LOCAL_TOKEN_NUMBER_TABLE_SIZE %d\r\n";\r
875 public final static String LocalTokenNumberSizeMacro = "#define %s_LOCAL_TOKEN_NUMBER %d\r\n";\r
876 public final static String SizeTableSizeMacro = "#define %s_SIZE_TABLE_SIZE %d\r\n";\r
877 public final static String StringTableSizeMacro = "#define %s_STRING_TABLE_SIZE %d\r\n";\r
878 public final static String SkuIdTableSizeMacro = "#define %s_SKUID_TABLE_SIZE %d\r\n";\r
879\r
880\r
af98370e 881 public final static String ExMapTableExistenceMacro = "#define %s_EXMAP_TABLE_EMPTY %s\r\n";\r
241876c7 882 public final static String GuidTableExistenceMacro = "#define %s_GUID_TABLE_EMPTY %s\r\n";\r
883 public final static String DatabaseExistenceMacro = "#define %s_DATABASE_EMPTY %s\r\n";\r
884 public final static String StringTableExistenceMacro = "#define %s_STRING_TABLE_EMPTY %s\r\n";\r
885 public final static String SkuTableExistenceMacro = "#define %s_SKUID_TABLE_EMPTY %s\r\n";\r
886\r
887 public final static String offsetOfSkuHeadStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s_SkuDataTable)";\r
888 public final static String offsetOfVariableEnabledDefault = "offsetof(%s_PCD_DATABASE, %s.%s_VariableDefault_%d)";\r
889 public final static String offsetOfStrTemplate = "offsetof(%s_PCD_DATABASE, %s.%s)";\r
af98370e 890\r
241876c7 891 private final static String skuDataTableTemplate = "SkuDataTable";\r
892\r
893\r
894 private StringTable stringTable;\r
895 private GuidTable guidTable;\r
896 private LocalTokenNumberTable localTokenNumberTable;\r
897 private SkuIdTable skuIdTable;\r
898 private SizeTable sizeTable;\r
899 private ExMapTable exMapTable;\r
900\r
901 private ArrayList<Token> alTokens;\r
902 private String phase;\r
903 private int assignedTokenNumber;\r
af98370e 904\r
241876c7 905 //\r
906 // Use two class global variable to store\r
af98370e 907 // temperary\r
241876c7 908 //\r
909 private String privateGlobalName;\r
910 private String privateGlobalCCode;\r
911 //\r
912 // After Major changes done to the PCD\r
913 // database generation class PcdDatabase\r
914 // Please increment the version and please\r
915 // also update the version number in PCD\r
916 // service PEIM and DXE driver accordingly.\r
917 //\r
918 private final int version = 2;\r
919\r
920 private String hString;\r
921 private String cString;\r
922\r
923 /**\r
af98370e 924 Constructor for PcdDatabase class.\r
925\r
241876c7 926 <p>We have two PCD dynamic(ex) database for the Framework implementation. One\r
927 for PEI phase and the other for DXE phase. </p>\r
af98370e 928\r
241876c7 929 @param alTokens A ArrayList of Dynamic(EX) PCD entry.\r
930 @param exePhase The phase to generate PCD database for: valid input\r
931 is "PEI" or "DXE".\r
932 @param startLen The starting Local Token Number for the PCD database. For\r
933 PEI phase, the starting Local Token Number starts from 0.\r
934 For DXE phase, the starting Local Token Number starts\r
935 from the total number of PCD entry of PEI phase.\r
936 @return void\r
937 **/\r
938 public PcdDatabase (ArrayList<Token> alTokens, String exePhase, int startLen) {\r
939 phase = exePhase;\r
940\r
941 stringTable = new StringTable(phase);\r
942 guidTable = new GuidTable(phase);\r
943 localTokenNumberTable = new LocalTokenNumberTable(phase);\r
944 skuIdTable = new SkuIdTable(phase);\r
945 sizeTable = new SizeTable(phase);\r
af98370e 946 exMapTable = new ExMapTable(phase);\r
241876c7 947\r
948 //\r
949 // Local token number 0 is reserved for INVALID_TOKEN_NUMBER.\r
af98370e 950 // So we will increment 1 for the startLen passed from the\r
241876c7 951 // constructor.\r
952 //\r
953 assignedTokenNumber = startLen + 1;\r
954 this.alTokens = alTokens;\r
955 }\r
956\r
957 private void getNonExAndExTokens (ArrayList<Token> alTokens, List<Token> nexTokens, List<Token> exTokens) {\r
958 for (int i = 0; i < alTokens.size(); i++) {\r
959 Token t = (Token)alTokens.get(i);\r
960 if (t.isDynamicEx()) {\r
961 exTokens.add(t);\r
962 } else {\r
963 nexTokens.add(t);\r
964 }\r
965 }\r
966\r
967 return;\r
968 }\r
969\r
970 private int getDataTypeAlignmentSize (Token token) {\r
971 switch (token.datumType) {\r
972 case UINT8:\r
973 return 1;\r
974 case UINT16:\r
975 return 2;\r
976 case UINT32:\r
977 return 4;\r
978 case UINT64:\r
979 return 8;\r
980 case POINTER:\r
981 return 1;\r
982 case BOOLEAN:\r
983 return 1;\r
984 default:\r
985 return 1;\r
986 }\r
987 }\r
af98370e 988\r
241876c7 989 private int getHiiPtrTypeAlignmentSize(Token token) {\r
990 switch (token.datumType) {\r
991 case UINT8:\r
992 return 1;\r
993 case UINT16:\r
994 return 2;\r
995 case UINT32:\r
996 return 4;\r
997 case UINT64:\r
998 return 8;\r
999 case POINTER:\r
1000 if (token.isHiiEnable()) {\r
1001 if (token.isHiiDefaultValueUnicodeStringType()) {\r
1002 return 2;\r
1003 }\r
1004 }\r
1005 return 1;\r
1006 case BOOLEAN:\r
1007 return 1;\r
1008 default:\r
1009 return 1;\r
1010 }\r
1011 }\r
af98370e 1012\r
241876c7 1013 private int getAlignmentSize (Token token) {\r
1014 if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
1015 return 2;\r
1016 }\r
1017\r
1018 if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
1019 return 4;\r
1020 }\r
1021\r
1022 if (token.isUnicodeStringType()) {\r
1023 return 2;\r
1024 }\r
af98370e 1025\r
241876c7 1026 return getDataTypeAlignmentSize(token);\r
1027 }\r
1028\r
1029 public String getCString () {\r
1030 return cString;\r
1031 }\r
1032\r
1033 public String getHString () {\r
1034 return hString;\r
1035 }\r
af98370e 1036\r
241876c7 1037 private void genCodeWorker(Token t,\r
1038 ArrayList<CStructTypeDeclaration> declaList,\r
1039 HashMap<String, String> instTable, String phase)\r
1040 throws EntityException {\r
1041\r
1042 CStructTypeDeclaration decl;\r
1043\r
1044 //\r
1045 // Insert SKU_HEAD if isSkuEnable is true\r
1046 //\r
1047 if (t.isSkuEnable()) {\r
1048 int tableIdx;\r
1049 tableIdx = skuIdTable.add(t);\r
1050 decl = new CStructTypeDeclaration(t.getPrimaryKeyString(),\r
1051 SkuHeadAlignmentSize, getSkuEnabledTypeDeclaration(t), true);\r
1052 declaList.add(decl);\r
1053 instTable.put(t.getPrimaryKeyString(),\r
1054 getSkuEnabledTypeInstantiaion(t, tableIdx));\r
1055 }\r
1056\r
1057 //\r
1058 // Insert PCD_ENTRY declaration and instantiation\r
1059 //\r
1060 getCDeclarationString(t);\r
1061\r
1062 decl = new CStructTypeDeclaration(privateGlobalName,\r
1063 getAlignmentSize(t), privateGlobalCCode, t.hasDefaultValue());\r
1064 declaList.add(decl);\r
1065\r
1066 if (t.hasDefaultValue()) {\r
af98370e 1067 instTable.put(privateGlobalName,\r
241876c7 1068 getTypeInstantiation(t, declaList, instTable, phase)\r
1069 );\r
1070 }\r
1071\r
1072 }\r
1073\r
af98370e 1074 private void ProcessTokens (List<Token> tokens,\r
241876c7 1075 ArrayList<CStructTypeDeclaration> cStructDeclList,\r
1076 HashMap<String, String> cStructInstTable,\r
1077 String phase\r
af98370e 1078 )\r
241876c7 1079 throws EntityException {\r
af98370e 1080\r
241876c7 1081 for (int idx = 0; idx < tokens.size(); idx++) {\r
1082 Token t = tokens.get(idx);\r
af98370e 1083\r
241876c7 1084 genCodeWorker (t, cStructDeclList, cStructInstTable, phase);\r
af98370e 1085\r
241876c7 1086 sizeTable.add(t);\r
1087 localTokenNumberTable.add(t);\r
1088 t.tokenNumber = assignedTokenNumber++;\r
af98370e 1089\r
241876c7 1090 //\r
1091 // Add a mapping if this dynamic PCD entry is a EX type\r
1092 //\r
1093 if (t.isDynamicEx()) {\r
af98370e 1094 exMapTable.add((int)t.tokenNumber,\r
1095 t.dynamicExTokenNumber,\r
1096 guidTable.add(translateSchemaStringToUUID(t.tokenSpaceName), t.getPrimaryKeyString()),\r
241876c7 1097 t.getPrimaryKeyString()\r
1098 );\r
1099 }\r
1100 }\r
1101\r
1102 }\r
af98370e 1103\r
241876c7 1104 public void genCode () throws EntityException {\r
af98370e 1105\r
241876c7 1106 ArrayList<CStructTypeDeclaration> cStructDeclList = new ArrayList<CStructTypeDeclaration>();\r
1107 HashMap<String, String> cStructInstTable = new HashMap<String, String>();\r
af98370e 1108\r
241876c7 1109 List<Token> nexTokens = new ArrayList<Token> ();\r
1110 List<Token> exTokens = new ArrayList<Token> ();\r
1111\r
1112 getNonExAndExTokens (alTokens, nexTokens, exTokens);\r
1113\r
1114 //\r
1115 // We have to process Non-Ex type PCD entry first. The reason is\r
af98370e 1116 // that our optimization assumes that the Token Number of Non-Ex\r
241876c7 1117 // PCD entry start from 1 (for PEI phase) and grows continously upwards.\r
af98370e 1118 //\r
241876c7 1119 // EX type token number starts from the last Non-EX PCD entry and\r
1120 // grows continously upwards.\r
1121 //\r
1122 ProcessTokens (nexTokens, cStructDeclList, cStructInstTable, phase);\r
1123 ProcessTokens (exTokens, cStructDeclList, cStructInstTable, phase);\r
af98370e 1124\r
241876c7 1125 stringTable.genCode(cStructDeclList, cStructInstTable);\r
1126 skuIdTable.genCode(cStructDeclList, cStructInstTable, phase);\r
1127 exMapTable.genCode(cStructDeclList, cStructInstTable, phase);\r
1128 localTokenNumberTable.genCode(cStructDeclList, cStructInstTable, phase);\r
1129 sizeTable.genCode(cStructDeclList, cStructInstTable, phase);\r
1130 guidTable.genCode(cStructDeclList, cStructInstTable, phase);\r
af98370e 1131\r
241876c7 1132 hString = genCMacroCode ();\r
af98370e 1133\r
241876c7 1134 HashMap <String, String> result;\r
af98370e 1135\r
1136 result = genCStructCode(cStructDeclList,\r
1137 cStructInstTable,\r
241876c7 1138 phase\r
1139 );\r
af98370e 1140\r
241876c7 1141 hString += result.get("initDeclStr");\r
1142 hString += result.get("uninitDeclStr");\r
af98370e 1143\r
241876c7 1144 hString += String.format("#define PCD_%s_SERVICE_DRIVER_VERSION %d", phase, version);\r
af98370e 1145\r
241876c7 1146 cString = newLine + newLine + result.get("initInstStr");\r
af98370e 1147\r
241876c7 1148 }\r
af98370e 1149\r
241876c7 1150 private String genCMacroCode () {\r
1151 String macroStr = "";\r
1152\r
1153 //\r
1154 // Generate size info Macro for all Tables\r
1155 //\r
1156 macroStr += guidTable.getSizeMacro();\r
1157 macroStr += stringTable.getSizeMacro();\r
1158 macroStr += skuIdTable.getSizeMacro();\r
1159 macroStr += localTokenNumberTable.getSizeMacro();\r
1160 macroStr += exMapTable.getSizeMacro();\r
1161 macroStr += sizeTable.getSizeMacro();\r
1162\r
1163 //\r
1164 // Generate existance info Macro for all Tables\r
1165 //\r
1166 macroStr += guidTable.getExistanceMacro();\r
1167 macroStr += stringTable.getExistanceMacro();\r
1168 macroStr += skuIdTable.getExistanceMacro();\r
1169 macroStr += localTokenNumberTable.getExistanceMacro();\r
1170 macroStr += exMapTable.getExistanceMacro();\r
1171\r
1172 macroStr += newLine;\r
af98370e 1173\r
241876c7 1174 return macroStr;\r
1175 }\r
af98370e 1176\r
241876c7 1177 private HashMap <String, String> genCStructCode(\r
af98370e 1178 ArrayList<CStructTypeDeclaration> declaList,\r
1179 HashMap<String, String> instTable,\r
241876c7 1180 String phase\r
1181 ) {\r
af98370e 1182\r
241876c7 1183 int i;\r
1184 HashMap <String, String> result = new HashMap<String, String>();\r
1185 HashMap <Integer, ArrayList<String>> alignmentInitDecl = new HashMap<Integer, ArrayList<String>>();\r
1186 HashMap <Integer, ArrayList<String>> alignmentUninitDecl = new HashMap<Integer, ArrayList<String>>();\r
1187 HashMap <Integer, ArrayList<String>> alignmentInitInst = new HashMap<Integer, ArrayList<String>>();\r
af98370e 1188\r
241876c7 1189 //\r
1190 // Initialize the storage for each alignment\r
1191 //\r
1192 for (i = 8; i > 0; i>>=1) {\r
1193 alignmentInitDecl.put(new Integer(i), new ArrayList<String>());\r
1194 alignmentInitInst.put(new Integer(i), new ArrayList<String>());\r
1195 alignmentUninitDecl.put(new Integer(i), new ArrayList<String>());\r
1196 }\r
af98370e 1197\r
241876c7 1198 String initDeclStr = "typedef struct {" + newLine;\r
1199 String initInstStr = String.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase.toUpperCase(), phase.toUpperCase()) + newLine;\r
1200 String uninitDeclStr = "typedef struct {" + newLine;\r
1201\r
1202 //\r
af98370e 1203 // Sort all C declaration and instantiation base on Alignment Size\r
241876c7 1204 //\r
1205 for (Object d : declaList) {\r
1206 CStructTypeDeclaration decl = (CStructTypeDeclaration) d;\r
af98370e 1207\r
241876c7 1208 if (decl.initTable) {\r
1209 alignmentInitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
1210 alignmentInitInst.get(new Integer(decl.alignmentSize)).add(instTable.get(decl.key));\r
1211 } else {\r
1212 alignmentUninitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
1213 }\r
1214 }\r
1215\r
1216 //\r
1217 // Generate code for every alignment size\r
1218 //\r
1219 boolean uinitDatabaseEmpty = true;\r
1220 for (int align = 8; align > 0; align >>= 1) {\r
1221 ArrayList<String> declaListBasedOnAlignment = alignmentInitDecl.get(new Integer(align));\r
1222 ArrayList<String> instListBasedOnAlignment = alignmentInitInst.get(new Integer(align));\r
1223 for (i = 0; i < declaListBasedOnAlignment.size(); i++) {\r
1224 initDeclStr += tab + declaListBasedOnAlignment.get(i);\r
1225 initInstStr += tab + instListBasedOnAlignment.get(i);\r
af98370e 1226\r
241876c7 1227 //\r
1228 // We made a assumption that both PEI_PCD_DATABASE and DXE_PCD_DATABASE\r
1229 // has a least one data memember with alignment size of 1. So we can\r
1230 // remove the last "," in the C structure instantiation string. Luckily,\r
1231 // this is true as both data structure has SKUID_TABLE anyway.\r
1232 //\r
1233 if ((align == 1) && (i == declaListBasedOnAlignment.size() - 1)) {\r
1234 initInstStr += newLine;\r
1235 } else {\r
1236 initInstStr += commaNewLine;\r
1237 }\r
1238 }\r
af98370e 1239\r
241876c7 1240 declaListBasedOnAlignment = alignmentUninitDecl.get(new Integer(align));\r
af98370e 1241\r
241876c7 1242 if (declaListBasedOnAlignment.size() != 0) {\r
1243 uinitDatabaseEmpty = false;\r
1244 }\r
af98370e 1245\r
241876c7 1246 for (Object d : declaListBasedOnAlignment) {\r
1247 String s = (String)d;\r
1248 uninitDeclStr += tab + s;\r
1249 }\r
1250 }\r
af98370e 1251\r
241876c7 1252 if (uinitDatabaseEmpty) {\r
1253 uninitDeclStr += tab + String.format("%-20sdummy; /* PCD_DATABASE_UNINIT is emptry */\r\n", "UINT8");\r
1254 }\r
af98370e 1255\r
241876c7 1256 initDeclStr += String.format("} %s_PCD_DATABASE_INIT;", phase) + newLine + newLine;\r
1257 initInstStr += "};" + newLine;\r
1258 uninitDeclStr += String.format("} %s_PCD_DATABASE_UNINIT;", phase) + newLine + newLine;\r
af98370e 1259\r
241876c7 1260 result.put("initDeclStr", initDeclStr);\r
1261 result.put("initInstStr", initInstStr);\r
1262 result.put("uninitDeclStr", uninitDeclStr);\r
1263\r
1264 return result;\r
1265 }\r
1266\r
1267 public static String genInstantiationStr (ArrayList<String> alStr) {\r
1268 String str = "";\r
1269 for (int i = 0; i< alStr.size(); i++) {\r
1270 if (i != 0) {\r
1271 str += "\t";\r
1272 }\r
1273 str += alStr.get(i);\r
1274 if (i != alStr.size() - 1) {\r
1275 str += "\r\n";\r
1276 }\r
1277 }\r
1278\r
1279 return str;\r
1280 }\r
1281\r
1282 private String getSkuEnabledTypeDeclaration (Token token) {\r
1283 return String.format("%-20s%s;\r\n", "SKU_HEAD", token.getPrimaryKeyString());\r
1284 }\r
1285\r
1286 private String getSkuEnabledTypeInstantiaion (Token token, int SkuTableIdx) {\r
1287\r
1288 String offsetof = String.format(PcdDatabase.offsetOfSkuHeadStrTemplate, phase, token.hasDefaultValue()? "Init" : "Uninit", token.getPrimaryKeyString());\r
1289 return String.format("{ %s, %d } /* SKU_ENABLED: %s */", offsetof, SkuTableIdx, token.getPrimaryKeyString());\r
1290 }\r
1291\r
1292 private String getDataTypeInstantiationForVariableDefault (Token token, String cName, int skuId) {\r
1293 return String.format("%s /* %s */", token.skuData.get(skuId).value.hiiDefaultValue, cName);\r
1294 }\r
1295\r
af98370e 1296 private String getCType (Token t)\r
241876c7 1297 throws EntityException {\r
af98370e 1298\r
241876c7 1299 if (t.isHiiEnable()) {\r
1300 return "VARIABLE_HEAD";\r
1301 }\r
af98370e 1302\r
241876c7 1303 if (t.isVpdEnable()) {\r
1304 return "VPD_HEAD";\r
1305 }\r
af98370e 1306\r
241876c7 1307 if (t.isUnicodeStringType()) {\r
1308 return "STRING_HEAD";\r
1309 }\r
af98370e 1310\r
241876c7 1311 switch (t.datumType) {\r
1312 case UINT64:\r
1313 return "UINT64";\r
1314 case UINT32:\r
1315 return "UINT32";\r
1316 case UINT16:\r
1317 return "UINT16";\r
1318 case UINT8:\r
1319 return "UINT8";\r
1320 case BOOLEAN:\r
1321 return "BOOLEAN";\r
1322 case POINTER:\r
1323 return "UINT8";\r
1324 default:\r
391dbbb1 1325 throw new EntityException("Unknown DatumType in getDataTypeCDeclaration");\r
241876c7 1326 }\r
1327 }\r
af98370e 1328\r
241876c7 1329 //\r
1330 // privateGlobalName and privateGlobalCCode is used to pass output to caller of getCDeclarationString\r
1331 //\r
af98370e 1332 private void getCDeclarationString(Token t)\r
241876c7 1333 throws EntityException {\r
af98370e 1334\r
241876c7 1335 if (t.isSkuEnable()) {\r
1336 privateGlobalName = String.format("%s_%s", t.getPrimaryKeyString(), skuDataTableTemplate);\r
1337 } else {\r
1338 privateGlobalName = t.getPrimaryKeyString();\r
1339 }\r
1340\r
1341 String type = getCType(t);\r
1342 if ((t.datumType == Token.DATUM_TYPE.POINTER) && (!t.isHiiEnable()) && (!t.isUnicodeStringType())) {\r
1343 int bufferSize;\r
1344 if (t.isASCIIStringType()) {\r
1345 //\r
1346 // Build tool will add a NULL string at the end of the ASCII string\r
1347 //\r
1348 bufferSize = t.datumSize + 1;\r
1349 } else {\r
1350 bufferSize = t.datumSize;\r
1351 }\r
1352 privateGlobalCCode = String.format("%-20s%s[%d][%d];\r\n", type, privateGlobalName, t.getSkuIdCount(), bufferSize);\r
1353 } else {\r
1354 privateGlobalCCode = String.format("%-20s%s[%d];\r\n", type, privateGlobalName, t.getSkuIdCount());\r
1355 }\r
1356 }\r
af98370e 1357\r
1358 private String getDataTypeDeclarationForVariableDefault (Token token, String cName, int skuId)\r
241876c7 1359 throws EntityException {\r
1360\r
1361 String typeStr;\r
1362\r
1363 if (token.datumType == Token.DATUM_TYPE.UINT8) {\r
1364 typeStr = "UINT8";\r
1365 } else if (token.datumType == Token.DATUM_TYPE.UINT16) {\r
1366 typeStr = "UINT16";\r
1367 } else if (token.datumType == Token.DATUM_TYPE.UINT32) {\r
1368 typeStr = "UINT32";\r
1369 } else if (token.datumType == Token.DATUM_TYPE.UINT64) {\r
1370 typeStr = "UINT64";\r
1371 } else if (token.datumType == Token.DATUM_TYPE.BOOLEAN) {\r
1372 typeStr = "BOOLEAN";\r
1373 } else if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
1374 int size;\r
1375 if (token.isHiiDefaultValueUnicodeStringType()) {\r
1376 typeStr = "UINT16";\r
1377 //\r
1378 // Include the NULL charactor\r
1379 //\r
1380 size = token.datumSize / 2 + 1;\r
1381 } else {\r
1382 typeStr = "UINT8";\r
1383 if (token.isHiiDefaultValueASCIIStringType()) {\r
1384 //\r
1385 // Include the NULL charactor\r
1386 //\r
1387 size = token.datumSize + 1;\r
1388 } else {\r
1389 size = token.datumSize;\r
1390 }\r
1391 }\r
1392 return String.format("%-20s%s[%d];\r\n", typeStr, cName, size);\r
1393 } else {\r
1394 throw new EntityException("Unknown DATUM_TYPE type in when generating code for VARIABLE_ENABLED PCD entry");\r
1395 }\r
1396\r
1397 return String.format("%-20s%s;\r\n", typeStr, cName);\r
1398 }\r
af98370e 1399\r
241876c7 1400 private String getTypeInstantiation (Token t, ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) throws EntityException {\r
af98370e 1401\r
241876c7 1402 int i;\r
1403\r
1404 String s;\r
1405 s = String.format("/* %s */", t.getPrimaryKeyString()) + newLine;\r
1406 s += tab + "{" + newLine;\r
1407\r
1408 for (i = 0; i < t.skuData.size(); i++) {\r
1409 if (t.isUnicodeStringType()) {\r
1410 s += tab + tab + String.format("{ %d }", stringTable.add(t.skuData.get(i).value.value, t));\r
1411 } else if (t.isHiiEnable()) {\r
1412 /* VPD_HEAD definition\r
1413 typedef struct {\r
1414 UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.\r
1415 UINT16 StringIndex; // Offset in String Table in units of UINT16.\r
1416 UINT16 Offset; // Offset in Variable\r
1417 UINT16 DefaultValueOffset; // Offset of the Default Value\r
1418 } VARIABLE_HEAD ;\r
1419 */\r
af98370e 1420 String variableDefaultName = String.format("%s_VariableDefault_%d", t.getPrimaryKeyString(), i);\r
1421\r
241876c7 1422 s += tab + tab + String.format("{ %d, %d, %s, %s }", guidTable.add(t.skuData.get(i).value.variableGuid, t.getPrimaryKeyString()),\r
1423 stringTable.add(t.skuData.get(i).value.getStringOfVariableName(), t),\r
1424 t.skuData.get(i).value.variableOffset,\r
1425 String.format("offsetof(%s_PCD_DATABASE, Init.%s)", phase, variableDefaultName)\r
1426 );\r
1427 //\r
1428 // We need to support the default value, so we add the declaration and\r
1429 // the instantiation for the default value.\r
1430 //\r
1431 CStructTypeDeclaration decl = new CStructTypeDeclaration (variableDefaultName,\r
1432 getHiiPtrTypeAlignmentSize(t),\r
1433 getDataTypeDeclarationForVariableDefault(t, variableDefaultName, i),\r
1434 true\r
af98370e 1435 );\r
241876c7 1436 declaList.add(decl);\r
1437 instTable.put(variableDefaultName, getDataTypeInstantiationForVariableDefault (t, variableDefaultName, i));\r
1438 } else if (t.isVpdEnable()) {\r
1439 /* typedef struct {\r
1440 UINT32 Offset;\r
1441 } VPD_HEAD;\r
1442 */\r
1443 s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.vpdOffset);\r
1444 } else {\r
1445 if (t.isByteStreamType()) {\r
1446 //\r
1447 // Byte stream type input has their own "{" "}", so we won't help to insert.\r
1448 //\r
1449 s += tab + tab + String.format(" %s ", t.skuData.get(i).value.value);\r
1450 } else {\r
1451 s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.value);\r
1452 }\r
1453 }\r
af98370e 1454\r
241876c7 1455 if (i != t.skuData.size() - 1) {\r
1456 s += commaNewLine;\r
1457 } else {\r
1458 s += newLine;\r
1459 }\r
1460\r
1461 }\r
af98370e 1462\r
241876c7 1463 s += tab + "}";\r
af98370e 1464\r
241876c7 1465 return s;\r
1466 }\r
af98370e 1467\r
2c0e2bcf 1468 public static String getPcdDatabaseCommonDefinitions () {\r
1469\r
1470 String retStr;\r
1471\r
1472 retStr = "//\r\n";\r
1473 retStr += "// The following definition will be generated by build tool\r\n";\r
1474 retStr += "//\r\n";\r
1475 retStr += "\r\n";\r
1476 retStr += "//\r\n";\r
1477 retStr += "// Common definitions\r\n";\r
1478 retStr += "//\r\n";\r
1479 retStr += "typedef UINT8 SKU_ID;\r\n";\r
1480 retStr += "\r\n";\r
1481 retStr += "#define PCD_TYPE_SHIFT 28\r\n";\r
1482 retStr += "\r\n";\r
1483 retStr += "#define PCD_TYPE_DATA (0x0 << PCD_TYPE_SHIFT)\r\n";\r
1484 retStr += "#define PCD_TYPE_HII (0x8 << PCD_TYPE_SHIFT)\r\n";\r
1485 retStr += "#define PCD_TYPE_VPD (0x4 << PCD_TYPE_SHIFT)\r\n";\r
1486 retStr += "#define PCD_TYPE_SKU_ENABLED (0x2 << PCD_TYPE_SHIFT)\r\n";\r
1487 retStr += "#define PCD_TYPE_STRING (0x1 << PCD_TYPE_SHIFT)\r\n";\r
1488 retStr += "\r\n";\r
1489 retStr += "#define PCD_TYPE_ALL_SET (PCD_TYPE_DATA | PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED | PCD_TYPE_STRING)\r\n";\r
1490 retStr += "\r\n";\r
1491 retStr += "#define PCD_DATUM_TYPE_SHIFT 24\r\n";\r
1492 retStr += "\r\n";\r
1493 retStr += "#define PCD_DATUM_TYPE_POINTER (0x0 << PCD_DATUM_TYPE_SHIFT)\r\n";\r
1494 retStr += "#define PCD_DATUM_TYPE_UINT8 (0x1 << PCD_DATUM_TYPE_SHIFT)\r\n";\r
1495 retStr += "#define PCD_DATUM_TYPE_UINT16 (0x2 << PCD_DATUM_TYPE_SHIFT)\r\n";\r
1496 retStr += "#define PCD_DATUM_TYPE_UINT32 (0x4 << PCD_DATUM_TYPE_SHIFT)\r\n";\r
1497 retStr += "#define PCD_DATUM_TYPE_UINT64 (0x8 << PCD_DATUM_TYPE_SHIFT)\r\n";\r
1498 retStr += "\r\n";\r
1499 retStr += "#define PCD_DATUM_TYPE_ALL_SET (PCD_DATUM_TYPE_POINTER | \\\r\n";\r
1500 retStr += " PCD_DATUM_TYPE_UINT8 | \\\r\n";\r
1501 retStr += " PCD_DATUM_TYPE_UINT16 | \\\r\n";\r
1502 retStr += " PCD_DATUM_TYPE_UINT32 | \\\r\n";\r
1503 retStr += " PCD_DATUM_TYPE_UINT64)\r\n";\r
1504 retStr += "\r\n";\r
1505 retStr += "\r\n";\r
1506 retStr += "#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_ALL_SET | PCD_DATUM_TYPE_ALL_SET))\r\n";\r
1507 retStr += "\r\n";\r
1508 retStr += "typedef struct {\r\n";\r
1509 retStr += " UINT32 ExTokenNumber;\r\n";\r
1510 retStr += " UINT16 LocalTokenNumber; // PCD Number of this particular platform build\r\n";\r
1511 retStr += " UINT16 ExGuidIndex; // Index of GuidTable\r\n";\r
1512 retStr += "} DYNAMICEX_MAPPING;\r\n";\r
1513 retStr += "\r\n";\r
1514 retStr += "\r\n";\r
1515 retStr += "typedef struct {\r\n";\r
1516 retStr += " UINT32 SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler\r\n";\r
1517 retStr += " UINT32 SkuIdTableOffset; //Offset from the PCD_DB\r\n";\r
1518 retStr += "} SKU_HEAD;\r\n";\r
1519 retStr += "\r\n";\r
1520 retStr += "\r\n";\r
1521 retStr += "typedef struct {\r\n";\r
1522 retStr += " UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.\r\n";\r
1523 retStr += " UINT16 StringIndex; // Offset in String Table in units of UINT16.\r\n";\r
1524 retStr += " UINT16 Offset; // Offset in Variable\r\n";\r
1525 retStr += " UINT16 DefaultValueOffset; // Offset of the Default Value\r\n";\r
1526 retStr += "} VARIABLE_HEAD ;\r\n";\r
1527 retStr += "\r\n";\r
1528 retStr += "\r\n";\r
1529 retStr += "typedef struct {\r\n";\r
1530 retStr += " UINT32 Offset;\r\n";\r
1531 retStr += "} VPD_HEAD;\r\n";\r
1532 retStr += "\r\n";\r
1533 retStr += "typedef UINT16 STRING_HEAD;\r\n";\r
1534 retStr += "\r\n";\r
1535 retStr += "typedef UINT16 SIZE_INFO;\r\n";\r
1536 retStr += "\r\n";\r
1537 retStr += "#define offsetof(s,m) (UINT32) (UINTN) &(((s *)0)->m)\r\n";\r
1538 retStr += "\r\n";\r
1539 retStr += "\r\n";\r
1540 retStr += "\r\n";\r
1541 \r
1542 return retStr;\r
241876c7 1543 }\r
1544\r
af98370e 1545 public static String getPcdDxeDatabaseDefinitions ()\r
241876c7 1546 throws EntityException {\r
1547\r
1548 String retStr = "";\r
2c0e2bcf 1549 \r
1550 retStr += "\r\n";\r
1551 retStr += "typedef struct {\r\n";\r
1552 retStr += " DXE_PCD_DATABASE_INIT Init;\r\n";\r
1553 retStr += " DXE_PCD_DATABASE_UNINIT Uninit;\r\n";\r
1554 retStr += "} DXE_PCD_DATABASE;\r\n";\r
1555 retStr += "\r\n";\r
1556 retStr += "\r\n";\r
1557 retStr += "typedef struct {\r\n";\r
1558 retStr += " PEI_PCD_DATABASE PeiDb;\r\n";\r
1559 retStr += " DXE_PCD_DATABASE DxeDb;\r\n";\r
1560 retStr += "} PCD_DATABASE;\r\n";\r
1561 retStr += "\r\n";\r
1562 retStr += "#define DXE_NEX_TOKEN_NUMBER (DXE_LOCAL_TOKEN_NUMBER - DXE_EX_TOKEN_NUMBER)\r\n";\r
1563 retStr += "\r\n";\r
1564 retStr += "#define PCD_TOTAL_TOKEN_NUMBER (PEI_LOCAL_TOKEN_NUMBER + DXE_LOCAL_TOKEN_NUMBER)\r\n";\r
1565 retStr += "\r\n";\r
1566 retStr += "\r\n";\r
241876c7 1567\r
1568 return retStr;\r
1569 }\r
1570\r
af98370e 1571 public static String getPcdPeiDatabaseDefinitions ()\r
241876c7 1572 throws EntityException {\r
1573\r
2c0e2bcf 1574 String retStr = "";\r
1575 \r
1576 retStr += "\r\n";\r
1577 retStr += "typedef struct {\r\n";\r
1578 retStr += " PEI_PCD_DATABASE_INIT Init;\r\n";\r
1579 retStr += " PEI_PCD_DATABASE_UNINIT Uninit;\r\n";\r
1580 retStr += "} PEI_PCD_DATABASE;\r\n";\r
1581 retStr += "\r\n";\r
1582 retStr += "#define PEI_NEX_TOKEN_NUMBER (PEI_LOCAL_TOKEN_NUMBER - PEI_EX_TOKEN_NUMBER)\r\n";\r
1583 retStr += "\r\n";\r
241876c7 1584\r
1585 return retStr;\r
1586 }\r
1587\r
1588 /**\r
1589 Translate the schema string to UUID instance.\r
af98370e 1590\r
241876c7 1591 In schema, the string of UUID is defined as following two types string:\r
1592 1) GuidArrayType: pattern = 0x[a-fA-F0-9]{1,8},( )*0x[a-fA-F0-9]{1,4},(\r
1593 )*0x[a-fA-F0-9]{1,4}(,( )*\{)?(,?( )*0x[a-fA-F0-9]{1,2}){8}( )*(\})?\r
af98370e 1594\r
241876c7 1595 2) GuidNamingConvention: pattern =\r
1596 [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\r
af98370e 1597\r
241876c7 1598 This function will convert string and create uuid instance.\r
af98370e 1599\r
241876c7 1600 @param uuidString UUID string in XML file\r
af98370e 1601\r
241876c7 1602 @return UUID UUID instance\r
1603 **/\r
af98370e 1604 private UUID translateSchemaStringToUUID(String uuidString)\r
241876c7 1605 throws EntityException {\r
1606 String temp;\r
1607 String[] splitStringArray;\r
1608 int index;\r
1609 int chIndex;\r
1610 int chLen;\r
1611\r
1612 if (uuidString == null) {\r
1613 return null;\r
1614 }\r
1615\r
1616 if (uuidString.length() == 0) {\r
1617 return null;\r
1618 }\r
1619\r
1620 if (uuidString.equals("0") ||\r
1621 uuidString.equalsIgnoreCase("0x0")) {\r
1622 return new UUID(0, 0);\r
1623 }\r
1624\r
1625 uuidString = uuidString.replaceAll("\\{", "");\r
1626 uuidString = uuidString.replaceAll("\\}", "");\r
1627\r
1628 //\r
af98370e 1629 // If the UUID schema string is GuidArrayType type then need translate\r
241876c7 1630 // to GuidNamingConvention type at first.\r
af98370e 1631 //\r
241876c7 1632 if ((uuidString.charAt(0) == '0') && ((uuidString.charAt(1) == 'x') || (uuidString.charAt(1) == 'X'))) {\r
1633 splitStringArray = uuidString.split("," );\r
1634 if (splitStringArray.length != 11) {\r
391dbbb1 1635 throw new EntityException ("[FPD file error] Wrong format for GUID string: " + uuidString);\r
241876c7 1636 }\r
1637\r
1638 //\r
1639 // Remove blank space from these string and remove header string "0x"\r
af98370e 1640 //\r
241876c7 1641 for (index = 0; index < 11; index ++) {\r
1642 splitStringArray[index] = splitStringArray[index].trim();\r
1643 splitStringArray[index] = splitStringArray[index].substring(2, splitStringArray[index].length());\r
1644 }\r
1645\r
1646 //\r
1647 // Add heading '0' to normalize the string length\r
af98370e 1648 //\r
241876c7 1649 for (index = 3; index < 11; index ++) {\r
1650 chLen = splitStringArray[index].length();\r
1651 for (chIndex = 0; chIndex < 2 - chLen; chIndex ++) {\r
1652 splitStringArray[index] = "0" + splitStringArray[index];\r
1653 }\r
1654 }\r
1655\r
1656 //\r
1657 // construct the final GuidNamingConvention string\r
af98370e 1658 //\r
241876c7 1659 temp = String.format("%s-%s-%s-%s%s-%s%s%s%s%s%s",\r
1660 splitStringArray[0],\r
1661 splitStringArray[1],\r
1662 splitStringArray[2],\r
1663 splitStringArray[3],\r
1664 splitStringArray[4],\r
1665 splitStringArray[5],\r
1666 splitStringArray[6],\r
1667 splitStringArray[7],\r
1668 splitStringArray[8],\r
1669 splitStringArray[9],\r
1670 splitStringArray[10]);\r
1671 uuidString = temp;\r
1672 }\r
1673\r
1674 return UUID.fromString(uuidString);\r
1675 }\r
391dbbb1 1676}\r