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