]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/GenC.py
BaseTools: DataType - cleanup list constants
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenC.py
CommitLineData
f51461c8
LG
1## @file\r
2# Routines for generating AutoGen.h and AutoGen.c\r
3#\r
eca980c0 4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
f51461c8
LG
5# This program and the accompanying materials\r
6# are licensed and made available under the terms and conditions of the BSD License\r
7# which accompanies this distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
14## Import Modules\r
15#\r
16import string\r
333ba578
YZ
17import collections\r
18import struct\r
f51461c8
LG
19from Common import EdkLogger\r
20\r
21from Common.BuildToolError import *\r
22from Common.DataType import *\r
23from Common.Misc import *\r
24from Common.String import StringToArray\r
25from StrGather import *\r
26from GenPcdDb import CreatePcdDatabaseCode\r
333ba578 27from IdfClassObject import *\r
f51461c8
LG
28\r
29## PCD type string\r
30gItemTypeStringDatabase = {\r
31 TAB_PCDS_FEATURE_FLAG : 'FixedAtBuild',\r
32 TAB_PCDS_FIXED_AT_BUILD : 'FixedAtBuild',\r
33 TAB_PCDS_PATCHABLE_IN_MODULE: 'BinaryPatch',\r
34 TAB_PCDS_DYNAMIC : '',\r
35 TAB_PCDS_DYNAMIC_DEFAULT : '',\r
36 TAB_PCDS_DYNAMIC_VPD : '',\r
37 TAB_PCDS_DYNAMIC_HII : '',\r
38 TAB_PCDS_DYNAMIC_EX : '',\r
39 TAB_PCDS_DYNAMIC_EX_DEFAULT : '',\r
40 TAB_PCDS_DYNAMIC_EX_VPD : '',\r
41 TAB_PCDS_DYNAMIC_EX_HII : '',\r
42}\r
43\r
f51461c8
LG
44\r
45## Datum size\r
656d2539
CJ
46gDatumSizeStringDatabase = {TAB_UINT8:'8',TAB_UINT16:'16',TAB_UINT32:'32',TAB_UINT64:'64','BOOLEAN':'BOOLEAN',TAB_VOID:'8'}\r
47gDatumSizeStringDatabaseH = {TAB_UINT8:'8',TAB_UINT16:'16',TAB_UINT32:'32',TAB_UINT64:'64','BOOLEAN':'BOOL',TAB_VOID:'PTR'}\r
48gDatumSizeStringDatabaseLib = {TAB_UINT8:'8',TAB_UINT16:'16',TAB_UINT32:'32',TAB_UINT64:'64','BOOLEAN':'Bool',TAB_VOID:'Ptr'}\r
f51461c8
LG
49\r
50## AutoGen File Header Templates\r
51gAutoGenHeaderString = TemplateString("""\\r
52/**\r
53 DO NOT EDIT\r
54 FILE auto-generated\r
55 Module name:\r
56 ${FileName}\r
57 Abstract: Auto-generated ${FileName} for building module or library.\r
58**/\r
59""")\r
60\r
61gAutoGenHPrologueString = TemplateString("""\r
62#ifndef _${File}_${Guid}\r
63#define _${File}_${Guid}\r
64\r
65""")\r
66\r
67gAutoGenHCppPrologueString = """\\r
68#ifdef __cplusplus\r
69extern "C" {\r
70#endif\r
71\r
72"""\r
73\r
74gAutoGenHEpilogueString = """\r
75\r
76#ifdef __cplusplus\r
77}\r
78#endif\r
79\r
80#endif\r
81"""\r
82\r
83## PEI Core Entry Point Templates\r
84gPeiCoreEntryPointPrototype = TemplateString("""\r
85${BEGIN}\r
86VOID\r
87EFIAPI\r
88${Function} (\r
89 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,\r
90 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,\r
91 IN VOID *Context\r
92 );\r
93${END}\r
94""")\r
95\r
96gPeiCoreEntryPointString = TemplateString("""\r
97${BEGIN}\r
98VOID\r
99EFIAPI\r
100ProcessModuleEntryPointList (\r
101 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,\r
102 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,\r
103 IN VOID *Context\r
104 )\r
105\r
106{\r
107 ${Function} (SecCoreData, PpiList, Context);\r
108}\r
109${END}\r
110""")\r
111\r
112\r
113## DXE Core Entry Point Templates\r
114gDxeCoreEntryPointPrototype = TemplateString("""\r
115${BEGIN}\r
116VOID\r
117EFIAPI\r
118${Function} (\r
119 IN VOID *HobStart\r
120 );\r
121${END}\r
122""")\r
123\r
124gDxeCoreEntryPointString = TemplateString("""\r
125${BEGIN}\r
126VOID\r
127EFIAPI\r
128ProcessModuleEntryPointList (\r
129 IN VOID *HobStart\r
130 )\r
131\r
132{\r
133 ${Function} (HobStart);\r
134}\r
135${END}\r
136""")\r
137\r
138## PEIM Entry Point Templates\r
139gPeimEntryPointPrototype = TemplateString("""\r
140${BEGIN}\r
141EFI_STATUS\r
142EFIAPI\r
143${Function} (\r
144 IN EFI_PEI_FILE_HANDLE FileHandle,\r
145 IN CONST EFI_PEI_SERVICES **PeiServices\r
146 );\r
147${END}\r
148""")\r
149\r
150gPeimEntryPointString = [\r
151TemplateString("""\r
152GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};\r
153\r
154EFI_STATUS\r
155EFIAPI\r
156ProcessModuleEntryPointList (\r
157 IN EFI_PEI_FILE_HANDLE FileHandle,\r
158 IN CONST EFI_PEI_SERVICES **PeiServices\r
159 )\r
160\r
161{\r
162 return EFI_SUCCESS;\r
163}\r
164"""),\r
165TemplateString("""\r
166GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};\r
167${BEGIN}\r
168EFI_STATUS\r
169EFIAPI\r
170ProcessModuleEntryPointList (\r
171 IN EFI_PEI_FILE_HANDLE FileHandle,\r
172 IN CONST EFI_PEI_SERVICES **PeiServices\r
173 )\r
174\r
175{\r
176 return ${Function} (FileHandle, PeiServices);\r
177}\r
178${END}\r
179"""),\r
180TemplateString("""\r
181GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};\r
182\r
183EFI_STATUS\r
184EFIAPI\r
185ProcessModuleEntryPointList (\r
186 IN EFI_PEI_FILE_HANDLE FileHandle,\r
187 IN CONST EFI_PEI_SERVICES **PeiServices\r
188 )\r
189\r
190{\r
191 EFI_STATUS Status;\r
192 EFI_STATUS CombinedStatus;\r
193\r
194 CombinedStatus = EFI_LOAD_ERROR;\r
195${BEGIN}\r
196 Status = ${Function} (FileHandle, PeiServices);\r
197 if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {\r
198 CombinedStatus = Status;\r
199 }\r
200${END}\r
201 return CombinedStatus;\r
202}\r
203""")\r
204]\r
205\r
206## SMM_CORE Entry Point Templates\r
207gSmmCoreEntryPointPrototype = TemplateString("""\r
208${BEGIN}\r
209EFI_STATUS\r
210EFIAPI\r
211${Function} (\r
212 IN EFI_HANDLE ImageHandle,\r
213 IN EFI_SYSTEM_TABLE *SystemTable\r
214 );\r
215${END}\r
216""")\r
217\r
218gSmmCoreEntryPointString = TemplateString("""\r
219${BEGIN}\r
220const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
221const UINT32 _gDxeRevision = ${PiSpecVersion};\r
222\r
223EFI_STATUS\r
224EFIAPI\r
225ProcessModuleEntryPointList (\r
226 IN EFI_HANDLE ImageHandle,\r
227 IN EFI_SYSTEM_TABLE *SystemTable\r
228 )\r
229{\r
230 return ${Function} (ImageHandle, SystemTable);\r
231}\r
232${END}\r
233""")\r
234\r
5a9c3e3e
SV
235## MM_CORE_STANDALONE Entry Point Templates\r
236gMmCoreStandaloneEntryPointPrototype = TemplateString("""\r
237${BEGIN}\r
238EFI_STATUS\r
239EFIAPI\r
240${Function} (\r
241 IN VOID *HobStart\r
242 );\r
243${END}\r
244""")\r
245\r
246gMmCoreStandaloneEntryPointString = TemplateString("""\r
247${BEGIN}\r
248const UINT32 _gMmRevision = ${PiSpecVersion};\r
249\r
250VOID\r
251EFIAPI\r
252ProcessModuleEntryPointList (\r
253 IN VOID *HobStart\r
254 )\r
255{\r
256 ${Function} (HobStart);\r
257}\r
258${END}\r
259""")\r
260\r
261## MM_STANDALONE Entry Point Templates\r
262gMmStandaloneEntryPointPrototype = TemplateString("""\r
263${BEGIN}\r
264EFI_STATUS\r
265EFIAPI\r
266${Function} (\r
267 IN EFI_HANDLE ImageHandle,\r
268 IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable\r
269 );\r
270${END}\r
271""")\r
272\r
273gMmStandaloneEntryPointString = [\r
274TemplateString("""\r
275GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gMmRevision = ${PiSpecVersion};\r
276\r
277EFI_STATUS\r
278EFIAPI\r
279ProcessModuleEntryPointList (\r
280 IN EFI_HANDLE ImageHandle,\r
281 IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable\r
282 )\r
283\r
284{\r
285 return EFI_SUCCESS;\r
286}\r
287"""),\r
288TemplateString("""\r
289GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gMmRevision = ${PiSpecVersion};\r
290${BEGIN}\r
291EFI_STATUS\r
292EFIAPI\r
293ProcessModuleEntryPointList (\r
294 IN EFI_HANDLE ImageHandle,\r
295 IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable\r
296 )\r
297\r
298{\r
299 return ${Function} (ImageHandle, MmSystemTable);\r
300}\r
301${END}\r
302"""),\r
303TemplateString("""\r
304GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gMmRevision = ${PiSpecVersion};\r
305\r
306EFI_STATUS\r
307EFIAPI\r
308ProcessModuleEntryPointList (\r
309 IN EFI_HANDLE ImageHandle,\r
310 IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable\r
311 )\r
312\r
313{\r
314 EFI_STATUS Status;\r
315 EFI_STATUS CombinedStatus;\r
316\r
317 CombinedStatus = EFI_LOAD_ERROR;\r
318${BEGIN}\r
319 Status = ${Function} (ImageHandle, MmSystemTable);\r
320 if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {\r
321 CombinedStatus = Status;\r
322 }\r
323${END}\r
324 return CombinedStatus;\r
325}\r
326""")\r
327]\r
328\r
f51461c8
LG
329## DXE SMM Entry Point Templates\r
330gDxeSmmEntryPointPrototype = TemplateString("""\r
331${BEGIN}\r
332EFI_STATUS\r
333EFIAPI\r
334${Function} (\r
335 IN EFI_HANDLE ImageHandle,\r
336 IN EFI_SYSTEM_TABLE *SystemTable\r
337 );\r
338${END}\r
339""")\r
340\r
341gDxeSmmEntryPointString = [\r
342TemplateString("""\r
343const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
344const UINT32 _gDxeRevision = ${PiSpecVersion};\r
345\r
346EFI_STATUS\r
347EFIAPI\r
348ProcessModuleEntryPointList (\r
349 IN EFI_HANDLE ImageHandle,\r
350 IN EFI_SYSTEM_TABLE *SystemTable\r
351 )\r
352\r
353{\r
354 return EFI_SUCCESS;\r
355}\r
356"""),\r
357TemplateString("""\r
358const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
359const UINT32 _gDxeRevision = ${PiSpecVersion};\r
360\r
361static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r
362static EFI_STATUS mDriverEntryPointStatus;\r
363\r
364VOID\r
365EFIAPI\r
366ExitDriver (\r
367 IN EFI_STATUS Status\r
368 )\r
369{\r
370 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\r
371 mDriverEntryPointStatus = Status;\r
372 }\r
373 LongJump (&mJumpContext, (UINTN)-1);\r
374 ASSERT (FALSE);\r
375}\r
376\r
377EFI_STATUS\r
378EFIAPI\r
379ProcessModuleEntryPointList (\r
380 IN EFI_HANDLE ImageHandle,\r
381 IN EFI_SYSTEM_TABLE *SystemTable\r
382 )\r
383{\r
384 mDriverEntryPointStatus = EFI_LOAD_ERROR;\r
385\r
386${BEGIN}\r
387 if (SetJump (&mJumpContext) == 0) {\r
388 ExitDriver (${Function} (ImageHandle, SystemTable));\r
389 ASSERT (FALSE);\r
390 }\r
391${END}\r
392\r
393 return mDriverEntryPointStatus;\r
394}\r
395""")\r
396]\r
397\r
398## UEFI Driver Entry Point Templates\r
399gUefiDriverEntryPointPrototype = TemplateString("""\r
400${BEGIN}\r
401EFI_STATUS\r
402EFIAPI\r
403${Function} (\r
404 IN EFI_HANDLE ImageHandle,\r
405 IN EFI_SYSTEM_TABLE *SystemTable\r
406 );\r
407${END}\r
408""")\r
409\r
410gUefiDriverEntryPointString = [\r
411TemplateString("""\r
412const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
413const UINT32 _gDxeRevision = ${PiSpecVersion};\r
414\r
415EFI_STATUS\r
416EFIAPI\r
417ProcessModuleEntryPointList (\r
418 IN EFI_HANDLE ImageHandle,\r
419 IN EFI_SYSTEM_TABLE *SystemTable\r
420 )\r
421{\r
422 return EFI_SUCCESS;\r
423}\r
424"""),\r
425TemplateString("""\r
426const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
427const UINT32 _gDxeRevision = ${PiSpecVersion};\r
428\r
429${BEGIN}\r
430EFI_STATUS\r
431EFIAPI\r
432ProcessModuleEntryPointList (\r
433 IN EFI_HANDLE ImageHandle,\r
434 IN EFI_SYSTEM_TABLE *SystemTable\r
435 )\r
436\r
437{\r
438 return ${Function} (ImageHandle, SystemTable);\r
439}\r
440${END}\r
441VOID\r
442EFIAPI\r
443ExitDriver (\r
444 IN EFI_STATUS Status\r
445 )\r
446{\r
447 if (EFI_ERROR (Status)) {\r
448 ProcessLibraryDestructorList (gImageHandle, gST);\r
449 }\r
450 gBS->Exit (gImageHandle, Status, 0, NULL);\r
451}\r
452"""),\r
453TemplateString("""\r
454const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
455const UINT32 _gDxeRevision = ${PiSpecVersion};\r
456\r
457static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r
458static EFI_STATUS mDriverEntryPointStatus;\r
459\r
460EFI_STATUS\r
461EFIAPI\r
462ProcessModuleEntryPointList (\r
463 IN EFI_HANDLE ImageHandle,\r
464 IN EFI_SYSTEM_TABLE *SystemTable\r
465 )\r
466{\r
467 mDriverEntryPointStatus = EFI_LOAD_ERROR;\r
468 ${BEGIN}\r
469 if (SetJump (&mJumpContext) == 0) {\r
470 ExitDriver (${Function} (ImageHandle, SystemTable));\r
471 ASSERT (FALSE);\r
472 }\r
473 ${END}\r
474 return mDriverEntryPointStatus;\r
475}\r
476\r
477VOID\r
478EFIAPI\r
479ExitDriver (\r
480 IN EFI_STATUS Status\r
481 )\r
482{\r
483 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\r
484 mDriverEntryPointStatus = Status;\r
485 }\r
486 LongJump (&mJumpContext, (UINTN)-1);\r
487 ASSERT (FALSE);\r
488}\r
489""")\r
490]\r
491\r
492\r
493## UEFI Application Entry Point Templates\r
494gUefiApplicationEntryPointPrototype = TemplateString("""\r
495${BEGIN}\r
496EFI_STATUS\r
497EFIAPI\r
498${Function} (\r
499 IN EFI_HANDLE ImageHandle,\r
500 IN EFI_SYSTEM_TABLE *SystemTable\r
501 );\r
502${END}\r
503""")\r
504\r
505gUefiApplicationEntryPointString = [\r
506TemplateString("""\r
507const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
508\r
509EFI_STATUS\r
510EFIAPI\r
511ProcessModuleEntryPointList (\r
512 IN EFI_HANDLE ImageHandle,\r
513 IN EFI_SYSTEM_TABLE *SystemTable\r
514 )\r
515{\r
516 return EFI_SUCCESS;\r
517}\r
518"""),\r
519TemplateString("""\r
520const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
521\r
522${BEGIN}\r
523EFI_STATUS\r
524EFIAPI\r
525ProcessModuleEntryPointList (\r
526 IN EFI_HANDLE ImageHandle,\r
527 IN EFI_SYSTEM_TABLE *SystemTable\r
528 )\r
529\r
530{\r
531 return ${Function} (ImageHandle, SystemTable);\r
532}\r
533${END}\r
534VOID\r
535EFIAPI\r
536ExitDriver (\r
537 IN EFI_STATUS Status\r
538 )\r
539{\r
540 if (EFI_ERROR (Status)) {\r
541 ProcessLibraryDestructorList (gImageHandle, gST);\r
542 }\r
543 gBS->Exit (gImageHandle, Status, 0, NULL);\r
544}\r
545"""),\r
546TemplateString("""\r
547const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};\r
548\r
549EFI_STATUS\r
550EFIAPI\r
551ProcessModuleEntryPointList (\r
552 IN EFI_HANDLE ImageHandle,\r
553 IN EFI_SYSTEM_TABLE *SystemTable\r
554 )\r
555\r
556{\r
557 ${BEGIN}\r
558 if (SetJump (&mJumpContext) == 0) {\r
559 ExitDriver (${Function} (ImageHandle, SystemTable));\r
560 ASSERT (FALSE);\r
561 }\r
562 ${END}\r
563 return mDriverEntryPointStatus;\r
564}\r
565\r
566static BASE_LIBRARY_JUMP_BUFFER mJumpContext;\r
567static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;\r
568\r
569VOID\r
570EFIAPI\r
571ExitDriver (\r
572 IN EFI_STATUS Status\r
573 )\r
574{\r
575 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {\r
576 mDriverEntryPointStatus = Status;\r
577 }\r
578 LongJump (&mJumpContext, (UINTN)-1);\r
579 ASSERT (FALSE);\r
580}\r
581""")\r
582]\r
583\r
584## UEFI Unload Image Templates\r
585gUefiUnloadImagePrototype = TemplateString("""\r
586${BEGIN}\r
587EFI_STATUS\r
588EFIAPI\r
589${Function} (\r
590 IN EFI_HANDLE ImageHandle\r
591 );\r
592${END}\r
593""")\r
594\r
595gUefiUnloadImageString = [\r
596TemplateString("""\r
597GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};\r
598\r
599EFI_STATUS\r
600EFIAPI\r
601ProcessModuleUnloadList (\r
602 IN EFI_HANDLE ImageHandle\r
603 )\r
604{\r
605 return EFI_SUCCESS;\r
606}\r
607"""),\r
608TemplateString("""\r
609GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};\r
610\r
611${BEGIN}\r
612EFI_STATUS\r
613EFIAPI\r
614ProcessModuleUnloadList (\r
615 IN EFI_HANDLE ImageHandle\r
616 )\r
617{\r
618 return ${Function} (ImageHandle);\r
619}\r
620${END}\r
621"""),\r
622TemplateString("""\r
623GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};\r
624\r
625EFI_STATUS\r
626EFIAPI\r
627ProcessModuleUnloadList (\r
628 IN EFI_HANDLE ImageHandle\r
629 )\r
630{\r
631 EFI_STATUS Status;\r
632\r
633 Status = EFI_SUCCESS;\r
634${BEGIN}\r
635 if (EFI_ERROR (Status)) {\r
636 ${Function} (ImageHandle);\r
637 } else {\r
638 Status = ${Function} (ImageHandle);\r
639 }\r
640${END}\r
641 return Status;\r
642}\r
643""")\r
644]\r
645\r
646gLibraryStructorPrototype = {\r
8bb63e37 647SUP_MODULE_BASE : TemplateString("""${BEGIN}\r
f51461c8
LG
648RETURN_STATUS\r
649EFIAPI\r
650${Function} (\r
651 VOID\r
652 );${END}\r
653"""),\r
654\r
655'PEI' : TemplateString("""${BEGIN}\r
656EFI_STATUS\r
657EFIAPI\r
658${Function} (\r
659 IN EFI_PEI_FILE_HANDLE FileHandle,\r
660 IN CONST EFI_PEI_SERVICES **PeiServices\r
661 );${END}\r
662"""),\r
663\r
664'DXE' : TemplateString("""${BEGIN}\r
665EFI_STATUS\r
666EFIAPI\r
667${Function} (\r
668 IN EFI_HANDLE ImageHandle,\r
669 IN EFI_SYSTEM_TABLE *SystemTable\r
670 );${END}\r
671"""),\r
5a9c3e3e
SV
672\r
673'MM' : TemplateString("""${BEGIN}\r
674EFI_STATUS\r
675EFIAPI\r
676${Function} (\r
677 IN EFI_HANDLE ImageHandle,\r
678 IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable\r
679 );${END}\r
680"""),\r
f51461c8
LG
681}\r
682\r
683gLibraryStructorCall = {\r
8bb63e37 684SUP_MODULE_BASE : TemplateString("""${BEGIN}\r
f51461c8
LG
685 Status = ${Function} ();\r
686 ASSERT_EFI_ERROR (Status);${END}\r
687"""),\r
688\r
689'PEI' : TemplateString("""${BEGIN}\r
690 Status = ${Function} (FileHandle, PeiServices);\r
691 ASSERT_EFI_ERROR (Status);${END}\r
692"""),\r
693\r
694'DXE' : TemplateString("""${BEGIN}\r
695 Status = ${Function} (ImageHandle, SystemTable);\r
696 ASSERT_EFI_ERROR (Status);${END}\r
697"""),\r
5a9c3e3e
SV
698\r
699'MM' : TemplateString("""${BEGIN}\r
700 Status = ${Function} (ImageHandle, MmSystemTable);\r
701 ASSERT_EFI_ERROR (Status);${END}\r
702"""),\r
f51461c8
LG
703}\r
704\r
705## Library Constructor and Destructor Templates\r
706gLibraryString = {\r
8bb63e37 707SUP_MODULE_BASE : TemplateString("""\r
f51461c8
LG
708${BEGIN}${FunctionPrototype}${END}\r
709\r
710VOID\r
711EFIAPI\r
712ProcessLibrary${Type}List (\r
713 VOID\r
714 )\r
715{\r
716${BEGIN} EFI_STATUS Status;\r
717${FunctionCall}${END}\r
718}\r
719"""),\r
720\r
721'PEI' : TemplateString("""\r
722${BEGIN}${FunctionPrototype}${END}\r
723\r
724VOID\r
725EFIAPI\r
726ProcessLibrary${Type}List (\r
727 IN EFI_PEI_FILE_HANDLE FileHandle,\r
728 IN CONST EFI_PEI_SERVICES **PeiServices\r
729 )\r
730{\r
731${BEGIN} EFI_STATUS Status;\r
732${FunctionCall}${END}\r
733}\r
734"""),\r
735\r
736'DXE' : TemplateString("""\r
737${BEGIN}${FunctionPrototype}${END}\r
738\r
739VOID\r
740EFIAPI\r
741ProcessLibrary${Type}List (\r
742 IN EFI_HANDLE ImageHandle,\r
743 IN EFI_SYSTEM_TABLE *SystemTable\r
744 )\r
745{\r
746${BEGIN} EFI_STATUS Status;\r
747${FunctionCall}${END}\r
748}\r
749"""),\r
5a9c3e3e
SV
750\r
751'MM' : TemplateString("""\r
752${BEGIN}${FunctionPrototype}${END}\r
753\r
754VOID\r
755EFIAPI\r
756ProcessLibrary${Type}List (\r
757 IN EFI_HANDLE ImageHandle,\r
758 IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable\r
759 )\r
760{\r
761${BEGIN} EFI_STATUS Status;\r
762${FunctionCall}${END}\r
763}\r
764"""),\r
f51461c8
LG
765}\r
766\r
767gBasicHeaderFile = "Base.h"\r
768\r
769gModuleTypeHeaderFile = {\r
8bb63e37
CJ
770 SUP_MODULE_BASE : [gBasicHeaderFile],\r
771 SUP_MODULE_SEC : ["PiPei.h", "Library/DebugLib.h"],\r
772 SUP_MODULE_PEI_CORE : ["PiPei.h", "Library/DebugLib.h", "Library/PeiCoreEntryPoint.h"],\r
773 SUP_MODULE_PEIM : ["PiPei.h", "Library/DebugLib.h", "Library/PeimEntryPoint.h"],\r
774 SUP_MODULE_DXE_CORE : ["PiDxe.h", "Library/DebugLib.h", "Library/DxeCoreEntryPoint.h"],\r
775 SUP_MODULE_DXE_DRIVER : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],\r
776 SUP_MODULE_DXE_SMM_DRIVER : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],\r
777 SUP_MODULE_DXE_RUNTIME_DRIVER: ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],\r
778 SUP_MODULE_DXE_SAL_DRIVER : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],\r
779 SUP_MODULE_UEFI_DRIVER : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],\r
780 SUP_MODULE_UEFI_APPLICATION : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"],\r
781 SUP_MODULE_SMM_CORE : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"],\r
782 SUP_MODULE_MM_STANDALONE : ["PiSmm.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/SmmDriverStandaloneEntryPoint.h"],\r
783 SUP_MODULE_MM_CORE_STANDALONE : ["PiSmm.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/SmmCoreStandaloneEntryPoint.h"],\r
784 SUP_MODULE_USER_DEFINED : [gBasicHeaderFile]\r
f51461c8
LG
785}\r
786\r
787## Autogen internal worker macro to define DynamicEx PCD name includes both the TokenSpaceGuidName \r
788# the TokenName and Guid comparison to avoid define name collisions.\r
789#\r
790# @param Info The ModuleAutoGen object\r
791# @param AutoGenH The TemplateString object for header file\r
792#\r
793#\r
794def DynExPcdTokenNumberMapping(Info, AutoGenH):\r
795 ExTokenCNameList = []\r
796 PcdExList = []\r
d590cce5
YZ
797 # Even it is the Library, the PCD is saved in the ModulePcdList\r
798 PcdList = Info.ModulePcdList\r
f51461c8 799 for Pcd in PcdList:\r
eece4292 800 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8
LG
801 ExTokenCNameList.append(Pcd.TokenCName)\r
802 PcdExList.append(Pcd)\r
803 if len(ExTokenCNameList) == 0:\r
804 return\r
805 AutoGenH.Append('\n#define COMPAREGUID(Guid1, Guid2) (BOOLEAN)(*(CONST UINT64*)Guid1 == *(CONST UINT64*)Guid2 && *((CONST UINT64*)Guid1 + 1) == *((CONST UINT64*)Guid2 + 1))\n')\r
806 # AutoGen for each PCD listed in a [PcdEx] section of a Module/Lib INF file.\r
807 # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter. \r
808 # Use the Guid pointer to see if it matches any of the token space GUIDs.\r
72fbe88d 809 TokenCNameList = set()\r
f51461c8
LG
810 for TokenCName in ExTokenCNameList:\r
811 if TokenCName in TokenCNameList:\r
812 continue\r
813 Index = 0\r
814 Count = ExTokenCNameList.count(TokenCName)\r
815 for Pcd in PcdExList:\r
2a29017e
YZ
816 RealTokenCName = Pcd.TokenCName\r
817 for PcdItem in GlobalData.MixedPcd:\r
818 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
819 RealTokenCName = PcdItem[0]\r
820 break\r
f51461c8
LG
821 if Pcd.TokenCName == TokenCName:\r
822 Index = Index + 1\r
823 if Index == 1:\r
2a29017e 824 AutoGenH.Append('\n#define __PCD_%s_ADDR_CMP(GuidPtr) (' % (RealTokenCName))\r
f51461c8 825 AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' \r
2a29017e 826 % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName))\r
f51461c8
LG
827 else:\r
828 AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' \r
2a29017e 829 % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName))\r
f51461c8
LG
830 if Index == Count:\r
831 AutoGenH.Append('0 \\\n )\n')\r
72fbe88d 832 TokenCNameList.add(TokenCName)\r
f51461c8 833 \r
72fbe88d 834 TokenCNameList = set()\r
f51461c8
LG
835 for TokenCName in ExTokenCNameList:\r
836 if TokenCName in TokenCNameList:\r
837 continue\r
838 Index = 0\r
839 Count = ExTokenCNameList.count(TokenCName)\r
840 for Pcd in PcdExList:\r
2a29017e
YZ
841 RealTokenCName = Pcd.TokenCName\r
842 for PcdItem in GlobalData.MixedPcd:\r
843 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
844 RealTokenCName = PcdItem[0]\r
845 break\r
eece4292 846 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenCName == TokenCName:\r
f51461c8
LG
847 Index = Index + 1\r
848 if Index == 1:\r
2a29017e 849 AutoGenH.Append('\n#define __PCD_%s_VAL_CMP(GuidPtr) (' % (RealTokenCName))\r
9023704f 850 AutoGenH.Append('\\\n (GuidPtr == NULL) ? 0:')\r
f51461c8 851 AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' \r
2a29017e 852 % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName))\r
f51461c8
LG
853 else:\r
854 AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' \r
2a29017e 855 % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName))\r
f51461c8
LG
856 if Index == Count:\r
857 AutoGenH.Append('0 \\\n )\n')\r
858 # Autogen internal worker macro to compare GUIDs. Guid1 is a pointer to a GUID. \r
859 # Guid2 is a C name for a GUID. Compare pointers first because optimizing compiler\r
860 # can do this at build time on CONST GUID pointers and optimize away call to COMPAREGUID().\r
861 # COMPAREGUID() will only be used if the Guid passed in is local to the module.\r
862 AutoGenH.Append('#define _PCD_TOKEN_EX_%s(GuidPtr) __PCD_%s_ADDR_CMP(GuidPtr) ? __PCD_%s_ADDR_CMP(GuidPtr) : __PCD_%s_VAL_CMP(GuidPtr) \n'\r
2a29017e 863 % (RealTokenCName, RealTokenCName, RealTokenCName, RealTokenCName))\r
72fbe88d 864 TokenCNameList.add(TokenCName)\r
f51461c8 865\r
2f5acc3b 866def GetPcdSize(Pcd):\r
656d2539 867 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
2f5acc3b
BF
868 Value = Pcd.DefaultValue\r
869 if Value in [None, '']:\r
870 return 1\r
871 elif Value[0] == 'L':\r
872 return (len(Value) - 2) * 2\r
873 elif Value[0] == '{':\r
874 return len(Value.split(','))\r
875 else:\r
876 return len(Value) - 1\r
656d2539 877 if Pcd.DatumType == TAB_UINT64:\r
2f5acc3b 878 return 8\r
656d2539 879 if Pcd.DatumType == TAB_UINT32:\r
2f5acc3b 880 return 4\r
656d2539 881 if Pcd.DatumType == TAB_UINT16:\r
2f5acc3b 882 return 2\r
656d2539 883 if Pcd.DatumType == TAB_UINT8:\r
2f5acc3b
BF
884 return 1\r
885 if Pcd.DatumType == 'BOOLEAN':\r
886 return 1\r
ae7b6df8
LG
887 else:\r
888 return Pcd.MaxDatumSize\r
2f5acc3b
BF
889\r
890\r
f51461c8
LG
891## Create code for module PCDs\r
892#\r
893# @param Info The ModuleAutoGen object\r
894# @param AutoGenC The TemplateString object for C code\r
895# @param AutoGenH The TemplateString object for header file\r
896# @param Pcd The PCD object\r
897#\r
898def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):\r
899 TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[Pcd.TokenSpaceGuidCName]\r
900 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber\r
2a29017e
YZ
901 #\r
902 # Write PCDs\r
903 #\r
904 TokenCName = Pcd.TokenCName\r
905 for PcdItem in GlobalData.MixedPcd:\r
906 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
907 TokenCName = PcdItem[0]\r
908 break\r
909 PcdTokenName = '_PCD_TOKEN_' + TokenCName\r
910 PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'\r
911 PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName\r
f7b31aa5 912 PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' + TokenCName\r
2a29017e 913 FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName\r
1bfcf64f 914 FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName\r
763e8edf 915\r
0f228f19
B
916 if Pcd.PcdValueFromComm:\r
917 Pcd.DefaultValue = Pcd.PcdValueFromComm\r
2f5acc3b 918 \r
eece4292 919 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8
LG
920 TokenNumber = int(Pcd.TokenValue, 0)\r
921 # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with \r
922 # different Guids but same TokenCName\r
2a29017e 923 PcdExTokenName = '_PCD_TOKEN_' + Pcd.TokenSpaceGuidCName + '_' + TokenCName\r
f51461c8
LG
924 AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber))\r
925 else:\r
926 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:\r
927 # If one of the Source built modules listed in the DSC is not listed in FDF modules, \r
928 # and the INF lists a PCD can only use the PcdsDynamic access method (it is only \r
929 # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will \r
930 # report warning message notify the PI that they are attempting to build a module \r
931 # that must be included in a flash image in order to be functional. These Dynamic PCD \r
932 # will not be added into the Database unless it is used by other modules that are \r
933 # included in the FDF file. \r
934 # In this case, just assign an invalid token number to make it pass build.\r
eece4292 935 if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
f51461c8
LG
936 TokenNumber = 0\r
937 else:\r
938 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 939 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
940 ExtraData="[%s]" % str(Info))\r
941 else:\r
942 TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]\r
943 AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber))\r
944\r
2a29017e 945 EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + TokenCName + "." + Pcd.TokenSpaceGuidCName)\r
f51461c8
LG
946 if Pcd.Type not in gItemTypeStringDatabase:\r
947 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 948 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 949 ExtraData="[%s]" % str(Info))\r
f51461c8 950\r
656d2539
CJ
951 DatumSize = gDatumSizeStringDatabase[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabase else gDatumSizeStringDatabase[TAB_VOID]\r
952 DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabaseLib else gDatumSizeStringDatabaseLib[TAB_VOID]\r
953 GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
954 SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
955 SetModeStatusName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_S_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_S_' + TokenCName\r
2a29017e 956 GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + TokenCName\r
2f5acc3b 957 \r
eece4292 958 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8
LG
959 if Info.IsLibrary:\r
960 PcdList = Info.LibraryPcdList\r
961 else:\r
962 PcdList = Info.ModulePcdList\r
72fbe88d 963 PcdExCNameTest = 0\r
f51461c8 964 for PcdModule in PcdList:\r
eece4292 965 if PcdModule.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenCName == PcdModule.TokenCName:\r
72fbe88d
CJ
966 PcdExCNameTest += 1\r
967 # get out early once we found > 1...\r
968 if PcdExCNameTest > 1:\r
969 break\r
f51461c8
LG
970 # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd.\r
971 # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build.\r
972 # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build.\r
72fbe88d 973 if PcdExCNameTest > 1:\r
f51461c8
LG
974 AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n')\r
975 AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
976 AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
38b986e3 977 AutoGenH.Append('// #define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 978 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 979 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 980 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
981 else:\r
982 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 983 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
984 else:\r
985 AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
986 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
2f5acc3b 987 AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 988 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 989 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 990 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
991 else:\r
992 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 993 AutoGenH.Append('#define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
eece4292 994 elif Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
72fbe88d
CJ
995 PcdCNameTest = 0\r
996 for PcdModule in Info.LibraryPcdList + Info.ModulePcdList:\r
eece4292 997 if PcdModule.Type in PCD_DYNAMIC_TYPE_SET and Pcd.TokenCName == PcdModule.TokenCName:\r
72fbe88d
CJ
998 PcdCNameTest += 1\r
999 # get out early once we found > 1...\r
1000 if PcdCNameTest > 1:\r
1001 break\r
1002 if PcdCNameTest > 1:\r
2a29017e 1003 EdkLogger.error("build", AUTOGEN_ERROR, "More than one Dynamic Pcds [%s] are different Guids but same CName. They need to be changed to DynamicEx type to avoid the confliction.\n" % (TokenCName), ExtraData="[%s]" % str(Info.MetaFile.Path))\r
f51461c8 1004 else:\r
38b986e3
YZ
1005 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))\r
1006 AutoGenH.Append('#define %s LibPcdGetSize(%s)\n' % (GetModeSizeName, PcdTokenName))\r
656d2539 1007 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
38b986e3
YZ
1008 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))\r
1009 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
1010 else:\r
1011 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))\r
1012 AutoGenH.Append('#define %s(Value) LibPcdSet%sS(%s, (Value))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
f51461c8 1013 else:\r
2a29017e 1014 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + TokenCName\r
f51461c8
LG
1015 Const = 'const'\r
1016 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
1017 Const = ''\r
1018 Type = ''\r
1019 Array = ''\r
1020 Value = Pcd.DefaultValue\r
1021 Unicode = False\r
1022 ValueNumber = 0\r
1023\r
1024 if Pcd.DatumType == 'BOOLEAN':\r
1025 BoolValue = Value.upper()\r
1026 if BoolValue == 'TRUE' or BoolValue == '1':\r
1027 Value = '1U'\r
1028 elif BoolValue == 'FALSE' or BoolValue == '0':\r
1029 Value = '0U'\r
1030\r
656d2539 1031 if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
f51461c8 1032 try:\r
726c501c
YZ
1033 if Value.upper().endswith('L'):\r
1034 Value = Value[:-1]\r
0944818a 1035 ValueNumber = int (Value, 0)\r
f51461c8
LG
1036 except:\r
1037 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1038 "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 1039 ExtraData="[%s]" % str(Info))\r
656d2539 1040 if Pcd.DatumType == TAB_UINT64:\r
f51461c8
LG
1041 if ValueNumber < 0:\r
1042 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1043 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1044 ExtraData="[%s]" % str(Info))\r
1045 elif ValueNumber >= 0x10000000000000000:\r
1046 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1047 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1048 ExtraData="[%s]" % str(Info))\r
1049 if not Value.endswith('ULL'):\r
1050 Value += 'ULL'\r
656d2539 1051 elif Pcd.DatumType == TAB_UINT32:\r
f51461c8
LG
1052 if ValueNumber < 0:\r
1053 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1054 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1055 ExtraData="[%s]" % str(Info))\r
1056 elif ValueNumber >= 0x100000000:\r
1057 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1058 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1059 ExtraData="[%s]" % str(Info))\r
1060 if not Value.endswith('U'):\r
1061 Value += 'U'\r
656d2539 1062 elif Pcd.DatumType == TAB_UINT16:\r
f51461c8
LG
1063 if ValueNumber < 0:\r
1064 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1065 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1066 ExtraData="[%s]" % str(Info))\r
1067 elif ValueNumber >= 0x10000:\r
1068 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1069 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1070 ExtraData="[%s]" % str(Info))\r
1071 if not Value.endswith('U'):\r
1072 Value += 'U' \r
656d2539 1073 elif Pcd.DatumType == TAB_UINT8:\r
f51461c8
LG
1074 if ValueNumber < 0:\r
1075 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1076 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1077 ExtraData="[%s]" % str(Info))\r
1078 elif ValueNumber >= 0x100:\r
1079 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1080 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1081 ExtraData="[%s]" % str(Info))\r
1082 if not Value.endswith('U'):\r
1083 Value += 'U'\r
656d2539 1084 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
4231a819 1085 if Pcd.MaxDatumSize is None or Pcd.MaxDatumSize == '':\r
f51461c8 1086 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1087 "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1088 ExtraData="[%s]" % str(Info))\r
1089\r
1090 ArraySize = int(Pcd.MaxDatumSize, 0)\r
1091 if Value[0] == '{':\r
1092 Type = '(VOID *)'\r
1093 else:\r
1094 if Value[0] == 'L':\r
1095 Unicode = True\r
1096 Value = Value.lstrip('L') #.strip('"')\r
1097 Value = eval(Value) # translate escape character\r
1098 NewValue = '{'\r
1099 for Index in range(0,len(Value)):\r
1100 if Unicode:\r
1101 NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', '\r
1102 else:\r
1103 NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', '\r
1104 if Unicode:\r
1105 ArraySize = ArraySize / 2;\r
1106\r
1107 if ArraySize < (len(Value) + 1):\r
c33081c9
YZ
1108 if Pcd.MaxSizeUserSet:\r
1109 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1110 "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 1111 ExtraData="[%s]" % str(Info))\r
c33081c9
YZ
1112 else:\r
1113 ArraySize = GetPcdSize(Pcd)\r
1114 if Unicode:\r
1115 ArraySize = ArraySize / 2\r
f51461c8
LG
1116 Value = NewValue + '0 }'\r
1117 Array = '[%d]' % ArraySize\r
1118 #\r
1119 # skip casting for fixed at build since it breaks ARM assembly.\r
1120 # Long term we need PCD macros that work in assembly\r
1121 #\r
656d2539 1122 elif Pcd.Type != TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType in TAB_PCD_NUMERIC_TYPES_VOID:\r
f51461c8
LG
1123 Value = "((%s)%s)" % (Pcd.DatumType, Value)\r
1124\r
656d2539 1125 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES_VOID:\r
ae7b6df8 1126 # handle structure PCD\r
4231a819 1127 if Pcd.MaxDatumSize is None or Pcd.MaxDatumSize == '':\r
ae7b6df8
LG
1128 EdkLogger.error("build", AUTOGEN_ERROR,\r
1129 "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
1130 ExtraData="[%s]" % str(Info))\r
1131\r
1132 ArraySize = int(Pcd.MaxDatumSize, 0)\r
1133 Array = '[%d]' % ArraySize\r
1134\r
f51461c8 1135 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
2a29017e 1136 PcdValueName = '_PCD_PATCHABLE_VALUE_' + TokenCName\r
f51461c8 1137 else:\r
2a29017e 1138 PcdValueName = '_PCD_VALUE_' + TokenCName\r
f51461c8 1139 \r
656d2539 1140 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8
LG
1141 #\r
1142 # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.\r
1143 #\r
674e2014 1144 AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName))\r
f51461c8 1145 if Unicode:\r
f51461c8
LG
1146 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
1147 AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array))\r
f51461c8 1148 else:\r
f51461c8
LG
1149 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
1150 AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array))\r
674e2014 1151 AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))\r
2f5acc3b
BF
1152 \r
1153 PcdDataSize = GetPcdSize(Pcd)\r
1154 if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD:\r
1155 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
1156 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName,FixPcdSizeTokenName))\r
1bfcf64f 1157 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED const UINTN %s = %s;\n' % (FixedPcdSizeVariableName,PcdDataSize))\r
2f5acc3b
BF
1158 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
1159 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, Pcd.MaxDatumSize))\r
1160 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
1161 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
1162 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))\r
f7b31aa5 1163 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED const UINTN %s = %s;\n' % (PatchPcdMaxSizeVariable,Pcd.MaxDatumSize))\r
f51461c8
LG
1164 elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
1165 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))\r
1166 AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))\r
1167 AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
1168 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))\r
2f5acc3b
BF
1169 \r
1170 PcdDataSize = GetPcdSize(Pcd)\r
1171 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
1172 \r
1173 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
1174 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
1175 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))\r
f51461c8 1176 else:\r
2f5acc3b
BF
1177 PcdDataSize = GetPcdSize(Pcd)\r
1178 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
1179 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName,FixPcdSizeTokenName))\r
1180 \r
f51461c8
LG
1181 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))\r
1182 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))\r
1183 AutoGenH.Append('extern %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
1184 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))\r
1185\r
1186 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
656d2539 1187 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
e70504cd
LG
1188 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &_gPcd_BinaryPatch_Size_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName))\r
1189 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &_gPcd_BinaryPatch_Size_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName))\r
f51461c8
LG
1190 else:\r
1191 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))\r
82a6a960 1192 AutoGenH.Append('#define %s(Value) ((%s = (Value)), RETURN_SUCCESS) \n' % (SetModeStatusName, PcdVariableName))\r
f51461c8
LG
1193 else:\r
1194 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)\r
1195\r
1196## Create code for library module PCDs\r
1197#\r
1198# @param Info The ModuleAutoGen object\r
1199# @param AutoGenC The TemplateString object for C code\r
1200# @param AutoGenH The TemplateString object for header file\r
1201# @param Pcd The PCD object\r
1202#\r
1203def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):\r
1204 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber\r
1205 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
1206 TokenCName = Pcd.TokenCName\r
2a29017e
YZ
1207 for PcdItem in GlobalData.MixedPcd:\r
1208 if (TokenCName, TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
1209 TokenCName = PcdItem[0]\r
1210 break\r
f51461c8 1211 PcdTokenName = '_PCD_TOKEN_' + TokenCName\r
2a29017e
YZ
1212 FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName\r
1213 PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'\r
1214 PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName\r
f7b31aa5 1215 PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' + TokenCName\r
1bfcf64f 1216 FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName\r
763e8edf 1217\r
0f228f19
B
1218 if Pcd.PcdValueFromComm:\r
1219 Pcd.DefaultValue = Pcd.PcdValueFromComm\r
f51461c8
LG
1220 #\r
1221 # Write PCDs\r
1222 #\r
eece4292 1223 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8
LG
1224 TokenNumber = int(Pcd.TokenValue, 0)\r
1225 else:\r
1226 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:\r
1227 # If one of the Source built modules listed in the DSC is not listed in FDF modules, \r
1228 # and the INF lists a PCD can only use the PcdsDynamic access method (it is only \r
1229 # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will \r
1230 # report warning message notify the PI that they are attempting to build a module \r
1231 # that must be included in a flash image in order to be functional. These Dynamic PCD \r
1232 # will not be added into the Database unless it is used by other modules that are \r
1233 # included in the FDF file. \r
1234 # In this case, just assign an invalid token number to make it pass build.\r
eece4292 1235 if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
f51461c8
LG
1236 TokenNumber = 0\r
1237 else:\r
1238 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1239 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1240 ExtraData="[%s]" % str(Info))\r
1241 else:\r
1242 TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]\r
1243\r
1244 if Pcd.Type not in gItemTypeStringDatabase:\r
1245 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1246 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 1247 ExtraData="[%s]" % str(Info))\r
f51461c8
LG
1248\r
1249 DatumType = Pcd.DatumType\r
656d2539
CJ
1250 DatumSize = gDatumSizeStringDatabase[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabase else gDatumSizeStringDatabase[TAB_VOID]\r
1251 DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabaseLib else gDatumSizeStringDatabaseLib[TAB_VOID]\r
1252 GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
1253 SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
1254 SetModeStatusName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_S_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_S_' + TokenCName\r
2a29017e 1255 GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + TokenCName\r
f51461c8
LG
1256\r
1257 Type = ''\r
1258 Array = ''\r
656d2539 1259 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
d66670f9
YZ
1260 if Pcd.DefaultValue[0]== '{':\r
1261 Type = '(VOID *)'\r
f51461c8
LG
1262 Array = '[]'\r
1263 PcdItemType = Pcd.Type\r
eece4292 1264 if PcdItemType in PCD_DYNAMIC_EX_TYPE_SET:\r
2a29017e 1265 PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + TokenCName\r
f51461c8
LG
1266 AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber))\r
1267 \r
1268 if Info.IsLibrary:\r
1269 PcdList = Info.LibraryPcdList\r
1270 else:\r
1271 PcdList = Info.ModulePcdList\r
72fbe88d 1272 PcdExCNameTest = 0\r
f51461c8 1273 for PcdModule in PcdList:\r
eece4292 1274 if PcdModule.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenCName == PcdModule.TokenCName:\r
72fbe88d
CJ
1275 PcdExCNameTest += 1\r
1276 # get out early once we found > 1...\r
1277 if PcdExCNameTest > 1:\r
1278 break\r
f51461c8
LG
1279 # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd.\r
1280 # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build.\r
1281 # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build.\r
72fbe88d 1282 if PcdExCNameTest > 1:\r
f51461c8
LG
1283 AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n')\r
1284 AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
1285 AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
d590cce5 1286 AutoGenH.Append('// #define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 1287 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 1288 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1289 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1290 else:\r
1291 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1292 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1293 else:\r
1294 AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
1295 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
2f5acc3b 1296 AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 1297 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 1298 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1299 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1300 else:\r
1301 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1302 AutoGenH.Append('#define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1303 else:\r
1304 AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber))\r
eece4292 1305 if PcdItemType in PCD_DYNAMIC_TYPE_SET:\r
38b986e3
YZ
1306 PcdList = []\r
1307 PcdCNameList = []\r
1308 PcdList.extend(Info.LibraryPcdList)\r
1309 PcdList.extend(Info.ModulePcdList)\r
1310 for PcdModule in PcdList:\r
eece4292 1311 if PcdModule.Type in PCD_DYNAMIC_TYPE_SET:\r
38b986e3
YZ
1312 PcdCNameList.append(PcdModule.TokenCName)\r
1313 if PcdCNameList.count(Pcd.TokenCName) > 1:\r
2a29017e 1314 EdkLogger.error("build", AUTOGEN_ERROR, "More than one Dynamic Pcds [%s] are different Guids but same CName.They need to be changed to DynamicEx type to avoid the confliction.\n" % (TokenCName), ExtraData="[%s]" % str(Info.MetaFile.Path))\r
f51461c8 1315 else:\r
38b986e3
YZ
1316 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))\r
1317 AutoGenH.Append('#define %s LibPcdGetSize(%s)\n' % (GetModeSizeName, PcdTokenName))\r
656d2539 1318 if DatumType not in TAB_PCD_NUMERIC_TYPES:\r
38b986e3
YZ
1319 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))\r
1320 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
1321 else:\r
1322 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))\r
1323 AutoGenH.Append('#define %s(Value) LibPcdSet%sS(%s, (Value))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
f51461c8 1324 if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:\r
f7b31aa5 1325 GetModeMaxSizeName = '_PCD_GET_MODE_MAXSIZE' + '_' + TokenCName\r
f51461c8 1326 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName\r
656d2539
CJ
1327 if DatumType not in TAB_PCD_NUMERIC_TYPES:\r
1328 if DatumType == TAB_VOID and Array == '[]':\r
1329 DatumType = [TAB_UINT8, TAB_UINT16][Pcd.DefaultValue[0] == 'L']\r
f7b31aa5 1330 else:\r
656d2539 1331 DatumType = TAB_UINT8\r
d66670f9
YZ
1332 AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array))\r
1333 else:\r
1334 AutoGenH.Append('extern volatile %s %s%s;\n' % (DatumType, PcdVariableName, Array))\r
f51461c8 1335 AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))\r
a6c31c6d 1336 PcdDataSize = GetPcdSize(Pcd)\r
656d2539 1337 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f7b31aa5
YZ
1338 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))\r
1339 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))\r
1340 AutoGenH.Append('#define %s %s\n' % (GetModeMaxSizeName, PatchPcdMaxSizeVariable))\r
1341 AutoGenH.Append('extern const UINTN %s; \n' % PatchPcdMaxSizeVariable)\r
27187d24
LG
1342 else:\r
1343 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))\r
1344 AutoGenH.Append('#define %s(Value) ((%s = (Value)), RETURN_SUCCESS)\n' % (SetModeStatusName, PcdVariableName))\r
a6c31c6d
YZ
1345 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
1346\r
2f5acc3b
BF
1347 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
1348 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
1349 \r
f51461c8
LG
1350 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG:\r
1351 key = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))\r
7256bd55 1352 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + TokenCName\r
656d2539
CJ
1353 if DatumType == TAB_VOID and Array == '[]':\r
1354 DatumType = [TAB_UINT8, TAB_UINT16][Pcd.DefaultValue[0] == 'L']\r
1355 if DatumType not in TAB_PCD_NUMERIC_TYPES_VOID:\r
1356 DatumType = TAB_UINT8\r
f51461c8
LG
1357 AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array))\r
1358 AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName))\r
1359 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)\r
1360 \r
1bfcf64f 1361 ConstFixedPcd = False\r
c9da41b2 1362 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD and (key in Info.ConstPcd or (Info.IsLibrary and not Info._ReferenceModules)):\r
1bfcf64f 1363 ConstFixedPcd = True\r
eca980c0
YZ
1364 if key in Info.ConstPcd:\r
1365 Pcd.DefaultValue = Info.ConstPcd[key]\r
656d2539 1366 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
7256bd55
YZ
1367 AutoGenH.Append('#define _PCD_VALUE_%s %s%s\n' %(TokenCName, Type, PcdVariableName))\r
1368 else:\r
1369 AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName, Pcd.DefaultValue))\r
1bfcf64f 1370 PcdDataSize = GetPcdSize(Pcd)\r
2f5acc3b 1371 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD:\r
656d2539 1372 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
1bfcf64f
YZ
1373 if ConstFixedPcd:\r
1374 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
1375 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName,FixPcdSizeTokenName))\r
1376 else:\r
1377 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName,FixedPcdSizeVariableName))\r
1378 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName,FixedPcdSizeVariableName))\r
1379 AutoGenH.Append('extern const UINTN %s; \n' % FixedPcdSizeVariableName)\r
1380 else:\r
1381 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
1382 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName,FixPcdSizeTokenName))\r
f51461c8
LG
1383\r
1384## Create code for library constructor\r
1385#\r
1386# @param Info The ModuleAutoGen object\r
1387# @param AutoGenC The TemplateString object for C code\r
1388# @param AutoGenH The TemplateString object for header file\r
1389#\r
1390def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):\r
1391 #\r
1392 # Library Constructors\r
1393 #\r
1394 ConstructorPrototypeString = TemplateString()\r
1395 ConstructorCallingString = TemplateString()\r
1396 if Info.IsLibrary:\r
1397 DependentLibraryList = [Info.Module]\r
1398 else:\r
1399 DependentLibraryList = Info.DependentLibraryList\r
1400 for Lib in DependentLibraryList:\r
1401 if len(Lib.ConstructorList) <= 0:\r
1402 continue\r
1403 Dict = {'Function':Lib.ConstructorList}\r
8bb63e37
CJ
1404 if Lib.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1405 ConstructorPrototypeString.Append(gLibraryStructorPrototype[SUP_MODULE_BASE].Replace(Dict))\r
1406 ConstructorCallingString.Append(gLibraryStructorCall[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1407 elif Lib.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8
LG
1408 ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))\r
1409 ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))\r
8bb63e37
CJ
1410 elif Lib.ModuleType in [SUP_MODULE_DXE_CORE,SUP_MODULE_DXE_DRIVER,SUP_MODULE_DXE_SMM_DRIVER,SUP_MODULE_DXE_RUNTIME_DRIVER,\r
1411 SUP_MODULE_DXE_SAL_DRIVER,SUP_MODULE_UEFI_DRIVER,SUP_MODULE_UEFI_APPLICATION,SUP_MODULE_SMM_CORE]:\r
f51461c8
LG
1412 ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))\r
1413 ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))\r
8bb63e37 1414 elif Lib.ModuleType in [SUP_MODULE_MM_STANDALONE,SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e
SV
1415 ConstructorPrototypeString.Append(gLibraryStructorPrototype['MM'].Replace(Dict))\r
1416 ConstructorCallingString.Append(gLibraryStructorCall['MM'].Replace(Dict))\r
f51461c8
LG
1417\r
1418 if str(ConstructorPrototypeString) == '':\r
1419 ConstructorPrototypeList = []\r
1420 else:\r
1421 ConstructorPrototypeList = [str(ConstructorPrototypeString)]\r
1422 if str(ConstructorCallingString) == '':\r
1423 ConstructorCallingList = []\r
1424 else:\r
1425 ConstructorCallingList = [str(ConstructorCallingString)]\r
1426\r
1427 Dict = {\r
1428 'Type' : 'Constructor',\r
1429 'FunctionPrototype' : ConstructorPrototypeList,\r
1430 'FunctionCall' : ConstructorCallingList\r
1431 }\r
1432 if Info.IsLibrary:\r
1433 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)\r
1434 else:\r
8bb63e37
CJ
1435 if Info.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1436 AutoGenC.Append(gLibraryString[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1437 elif Info.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8 1438 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))\r
8bb63e37
CJ
1439 elif Info.ModuleType in [SUP_MODULE_DXE_CORE,SUP_MODULE_DXE_DRIVER,SUP_MODULE_DXE_SMM_DRIVER,SUP_MODULE_DXE_RUNTIME_DRIVER,\r
1440 SUP_MODULE_DXE_SAL_DRIVER,SUP_MODULE_UEFI_DRIVER,SUP_MODULE_UEFI_APPLICATION,SUP_MODULE_SMM_CORE]:\r
f51461c8 1441 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))\r
8bb63e37 1442 elif Info.ModuleType in [SUP_MODULE_MM_STANDALONE,SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e 1443 AutoGenC.Append(gLibraryString['MM'].Replace(Dict))\r
f51461c8
LG
1444\r
1445## Create code for library destructor\r
1446#\r
1447# @param Info The ModuleAutoGen object\r
1448# @param AutoGenC The TemplateString object for C code\r
1449# @param AutoGenH The TemplateString object for header file\r
1450#\r
1451def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):\r
1452 #\r
1453 # Library Destructors\r
1454 #\r
1455 DestructorPrototypeString = TemplateString()\r
1456 DestructorCallingString = TemplateString()\r
1457 if Info.IsLibrary:\r
1458 DependentLibraryList = [Info.Module]\r
1459 else:\r
1460 DependentLibraryList = Info.DependentLibraryList\r
1461 for Index in range(len(DependentLibraryList)-1, -1, -1):\r
1462 Lib = DependentLibraryList[Index]\r
1463 if len(Lib.DestructorList) <= 0:\r
1464 continue\r
1465 Dict = {'Function':Lib.DestructorList}\r
8bb63e37
CJ
1466 if Lib.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1467 DestructorPrototypeString.Append(gLibraryStructorPrototype[SUP_MODULE_BASE].Replace(Dict))\r
1468 DestructorCallingString.Append(gLibraryStructorCall[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1469 elif Lib.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8
LG
1470 DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))\r
1471 DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))\r
8bb63e37
CJ
1472 elif Lib.ModuleType in [SUP_MODULE_DXE_CORE,SUP_MODULE_DXE_DRIVER,SUP_MODULE_DXE_SMM_DRIVER,SUP_MODULE_DXE_RUNTIME_DRIVER,\r
1473 SUP_MODULE_DXE_SAL_DRIVER,SUP_MODULE_UEFI_DRIVER,SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]:\r
f51461c8
LG
1474 DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))\r
1475 DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))\r
8bb63e37 1476 elif Lib.ModuleType in [SUP_MODULE_MM_STANDALONE,SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e
SV
1477 DestructorPrototypeString.Append(gLibraryStructorPrototype['MM'].Replace(Dict))\r
1478 DestructorCallingString.Append(gLibraryStructorCall['MM'].Replace(Dict))\r
f51461c8
LG
1479\r
1480 if str(DestructorPrototypeString) == '':\r
1481 DestructorPrototypeList = []\r
1482 else:\r
1483 DestructorPrototypeList = [str(DestructorPrototypeString)]\r
1484 if str(DestructorCallingString) == '':\r
1485 DestructorCallingList = []\r
1486 else:\r
1487 DestructorCallingList = [str(DestructorCallingString)]\r
1488\r
1489 Dict = {\r
1490 'Type' : 'Destructor',\r
1491 'FunctionPrototype' : DestructorPrototypeList,\r
1492 'FunctionCall' : DestructorCallingList\r
1493 }\r
1494 if Info.IsLibrary:\r
1495 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)\r
1496 else:\r
8bb63e37
CJ
1497 if Info.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1498 AutoGenC.Append(gLibraryString[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1499 elif Info.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8 1500 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))\r
8bb63e37
CJ
1501 elif Info.ModuleType in [SUP_MODULE_DXE_CORE,SUP_MODULE_DXE_DRIVER,SUP_MODULE_DXE_SMM_DRIVER,SUP_MODULE_DXE_RUNTIME_DRIVER,\r
1502 SUP_MODULE_DXE_SAL_DRIVER,SUP_MODULE_UEFI_DRIVER,SUP_MODULE_UEFI_APPLICATION,SUP_MODULE_SMM_CORE]:\r
f51461c8 1503 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))\r
8bb63e37 1504 elif Info.ModuleType in [SUP_MODULE_MM_STANDALONE,SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e 1505 AutoGenC.Append(gLibraryString['MM'].Replace(Dict))\r
f51461c8
LG
1506\r
1507\r
1508## Create code for ModuleEntryPoint\r
1509#\r
1510# @param Info The ModuleAutoGen object\r
1511# @param AutoGenC The TemplateString object for C code\r
1512# @param AutoGenH The TemplateString object for header file\r
1513#\r
1514def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1515 if Info.IsLibrary or Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_SEC]:\r
f51461c8
LG
1516 return\r
1517 #\r
1518 # Module Entry Points\r
1519 #\r
1520 NumEntryPoints = len(Info.Module.ModuleEntryPointList)\r
1521 if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification:\r
1522 PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION']\r
1523 else:\r
1524 PiSpecVersion = '0x00000000'\r
1525 if 'UEFI_SPECIFICATION_VERSION' in Info.Module.Specification:\r
1526 UefiSpecVersion = Info.Module.Specification['UEFI_SPECIFICATION_VERSION']\r
1527 else:\r
1528 UefiSpecVersion = '0x00000000'\r
1529 Dict = {\r
1530 'Function' : Info.Module.ModuleEntryPointList,\r
1531 'PiSpecVersion' : PiSpecVersion + 'U',\r
1532 'UefiSpecVersion': UefiSpecVersion + 'U'\r
1533 }\r
1534\r
8bb63e37 1535 if Info.ModuleType in [SUP_MODULE_PEI_CORE, SUP_MODULE_DXE_CORE, SUP_MODULE_SMM_CORE, SUP_MODULE_MM_CORE_STANDALONE]:\r
128d435f 1536 if Info.SourceFileList:\r
f51461c8
LG
1537 if NumEntryPoints != 1:\r
1538 EdkLogger.error(\r
1539 "build",\r
1540 AUTOGEN_ERROR,\r
1541 '%s must have exactly one entry point' % Info.ModuleType,\r
1542 File=str(Info),\r
1543 ExtraData= ", ".join(Info.Module.ModuleEntryPointList)\r
1544 )\r
8bb63e37 1545 if Info.ModuleType == SUP_MODULE_PEI_CORE:\r
f51461c8
LG
1546 AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict))\r
1547 AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict))\r
8bb63e37 1548 elif Info.ModuleType == SUP_MODULE_DXE_CORE:\r
f51461c8
LG
1549 AutoGenC.Append(gDxeCoreEntryPointString.Replace(Dict))\r
1550 AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict))\r
8bb63e37 1551 elif Info.ModuleType == SUP_MODULE_SMM_CORE:\r
f51461c8
LG
1552 AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict))\r
1553 AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict))\r
8bb63e37 1554 elif Info.ModuleType == SUP_MODULE_MM_CORE_STANDALONE:\r
5a9c3e3e
SV
1555 AutoGenC.Append(gMmCoreStandaloneEntryPointString.Replace(Dict))\r
1556 AutoGenH.Append(gMmCoreStandaloneEntryPointPrototype.Replace(Dict))\r
8bb63e37 1557 elif Info.ModuleType == SUP_MODULE_PEIM:\r
f51461c8
LG
1558 if NumEntryPoints < 2:\r
1559 AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict))\r
1560 else:\r
1561 AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict))\r
1562 AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict))\r
8bb63e37 1563 elif Info.ModuleType in [SUP_MODULE_DXE_RUNTIME_DRIVER,SUP_MODULE_DXE_DRIVER,SUP_MODULE_DXE_SAL_DRIVER,SUP_MODULE_UEFI_DRIVER]:\r
f51461c8
LG
1564 if NumEntryPoints < 2:\r
1565 AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict))\r
1566 else:\r
1567 AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict))\r
1568 AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict))\r
8bb63e37 1569 elif Info.ModuleType == SUP_MODULE_DXE_SMM_DRIVER:\r
f51461c8
LG
1570 if NumEntryPoints == 0:\r
1571 AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict))\r
1572 else:\r
1573 AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict))\r
5a9c3e3e 1574 AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict))\r
8bb63e37 1575 elif Info.ModuleType == SUP_MODULE_MM_STANDALONE:\r
5a9c3e3e
SV
1576 if NumEntryPoints < 2:\r
1577 AutoGenC.Append(gMmStandaloneEntryPointString[NumEntryPoints].Replace(Dict))\r
1578 else:\r
1579 AutoGenC.Append(gMmStandaloneEntryPointString[2].Replace(Dict))\r
1580 AutoGenH.Append(gMmStandaloneEntryPointPrototype.Replace(Dict))\r
8bb63e37 1581 elif Info.ModuleType == SUP_MODULE_UEFI_APPLICATION:\r
f51461c8
LG
1582 if NumEntryPoints < 2:\r
1583 AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict))\r
1584 else:\r
1585 AutoGenC.Append(gUefiApplicationEntryPointString[2].Replace(Dict))\r
1586 AutoGenH.Append(gUefiApplicationEntryPointPrototype.Replace(Dict))\r
1587\r
1588## Create code for ModuleUnloadImage\r
1589#\r
1590# @param Info The ModuleAutoGen object\r
1591# @param AutoGenC The TemplateString object for C code\r
1592# @param AutoGenH The TemplateString object for header file\r
1593#\r
1594def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1595 if Info.IsLibrary or Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_SEC]:\r
f51461c8
LG
1596 return\r
1597 #\r
1598 # Unload Image Handlers\r
1599 #\r
1600 NumUnloadImage = len(Info.Module.ModuleUnloadImageList)\r
1601 Dict = {'Count':str(NumUnloadImage) + 'U', 'Function':Info.Module.ModuleUnloadImageList}\r
1602 if NumUnloadImage < 2:\r
1603 AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict))\r
1604 else:\r
1605 AutoGenC.Append(gUefiUnloadImageString[2].Replace(Dict))\r
1606 AutoGenH.Append(gUefiUnloadImagePrototype.Replace(Dict))\r
1607\r
1608## Create code for GUID\r
1609#\r
1610# @param Info The ModuleAutoGen object\r
1611# @param AutoGenC The TemplateString object for C code\r
1612# @param AutoGenH The TemplateString object for header file\r
1613#\r
1614def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1615 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
f51461c8
LG
1616 GuidType = "GUID"\r
1617 else:\r
1618 GuidType = "EFI_GUID"\r
1619\r
1620 if Info.GuidList:\r
7beed8a3
YZ
1621 if not Info.IsLibrary:\r
1622 AutoGenC.Append("\n// Guids\n")\r
8262037f 1623 AutoGenH.Append("\n// Guids\n")\r
f51461c8
LG
1624 #\r
1625 # GUIDs\r
1626 #\r
1627 for Key in Info.GuidList:\r
7beed8a3
YZ
1628 if not Info.IsLibrary:\r
1629 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.GuidList[Key]))\r
8262037f 1630 AutoGenH.Append('extern %s %s;\n' % (GuidType, Key))\r
f51461c8
LG
1631\r
1632## Create code for protocol\r
1633#\r
1634# @param Info The ModuleAutoGen object\r
1635# @param AutoGenC The TemplateString object for C code\r
1636# @param AutoGenH The TemplateString object for header file\r
1637#\r
1638def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1639 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
f51461c8
LG
1640 GuidType = "GUID"\r
1641 else:\r
1642 GuidType = "EFI_GUID"\r
1643\r
1644 if Info.ProtocolList:\r
7beed8a3
YZ
1645 if not Info.IsLibrary:\r
1646 AutoGenC.Append("\n// Protocols\n")\r
8262037f 1647 AutoGenH.Append("\n// Protocols\n")\r
f51461c8
LG
1648 #\r
1649 # Protocol GUIDs\r
1650 #\r
1651 for Key in Info.ProtocolList:\r
7beed8a3
YZ
1652 if not Info.IsLibrary:\r
1653 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.ProtocolList[Key]))\r
8262037f 1654 AutoGenH.Append('extern %s %s;\n' % (GuidType, Key))\r
f51461c8
LG
1655\r
1656## Create code for PPI\r
1657#\r
1658# @param Info The ModuleAutoGen object\r
1659# @param AutoGenC The TemplateString object for C code\r
1660# @param AutoGenH The TemplateString object for header file\r
1661#\r
1662def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1663 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
f51461c8
LG
1664 GuidType = "GUID"\r
1665 else:\r
1666 GuidType = "EFI_GUID"\r
1667\r
1668 if Info.PpiList:\r
7beed8a3
YZ
1669 if not Info.IsLibrary:\r
1670 AutoGenC.Append("\n// PPIs\n")\r
8262037f 1671 AutoGenH.Append("\n// PPIs\n")\r
f51461c8
LG
1672 #\r
1673 # PPI GUIDs\r
1674 #\r
1675 for Key in Info.PpiList:\r
7beed8a3
YZ
1676 if not Info.IsLibrary:\r
1677 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.PpiList[Key]))\r
8262037f 1678 AutoGenH.Append('extern %s %s;\n' % (GuidType, Key))\r
f51461c8
LG
1679\r
1680## Create code for PCD\r
1681#\r
1682# @param Info The ModuleAutoGen object\r
1683# @param AutoGenC The TemplateString object for C code\r
1684# @param AutoGenH The TemplateString object for header file\r
1685#\r
1686def CreatePcdCode(Info, AutoGenC, AutoGenH):\r
1687\r
1688 # Collect Token Space GUIDs used by DynamicEc PCDs\r
1689 TokenSpaceList = []\r
1690 for Pcd in Info.ModulePcdList:\r
eece4292 1691 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenSpaceGuidCName not in TokenSpaceList:\r
f51461c8
LG
1692 TokenSpaceList += [Pcd.TokenSpaceGuidCName]\r
1693 \r
8518bf0b
LG
1694 SkuMgr = Info.Workspace.Platform.SkuIdMgr\r
1695 AutoGenH.Append("\n// Definition of SkuId Array\n")\r
1696 AutoGenH.Append("extern UINT64 _gPcd_SkuId_Array[];\n")\r
f51461c8 1697 # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found\r
72fbe88d 1698 if TokenSpaceList:\r
f51461c8 1699 AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n")\r
8bb63e37 1700 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
f51461c8
LG
1701 GuidType = "GUID"\r
1702 else:\r
1703 GuidType = "EFI_GUID" \r
1704 for Item in TokenSpaceList:\r
1705 AutoGenH.Append('extern %s %s;\n' % (GuidType, Item))\r
1706\r
1707 if Info.IsLibrary:\r
1708 if Info.ModulePcdList:\r
1709 AutoGenH.Append("\n// PCD definitions\n")\r
1710 for Pcd in Info.ModulePcdList:\r
1711 CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd)\r
1712 DynExPcdTokenNumberMapping (Info, AutoGenH)\r
1713 else:\r
8518bf0b
LG
1714 AutoGenC.Append("\n// Definition of SkuId Array\n")\r
1715 AutoGenC.Append("GLOBAL_REMOVE_IF_UNREFERENCED UINT64 _gPcd_SkuId_Array[] = %s;\n" % SkuMgr.DumpSkuIdArrary())\r
f51461c8
LG
1716 if Info.ModulePcdList:\r
1717 AutoGenH.Append("\n// Definition of PCDs used in this module\n")\r
1718 AutoGenC.Append("\n// Definition of PCDs used in this module\n")\r
1719 for Pcd in Info.ModulePcdList:\r
1720 CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd)\r
1721 DynExPcdTokenNumberMapping (Info, AutoGenH)\r
1722 if Info.LibraryPcdList:\r
1723 AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n")\r
1724 AutoGenC.Append("\n// Definition of PCDs used in libraries\n")\r
1725 for Pcd in Info.LibraryPcdList:\r
1726 CreateModulePcdCode(Info, AutoGenC, AutoGenC, Pcd)\r
1727 CreatePcdDatabaseCode(Info, AutoGenC, AutoGenH)\r
1728\r
1729## Create code for unicode string definition\r
1730#\r
1731# @param Info The ModuleAutoGen object\r
1732# @param AutoGenC The TemplateString object for C code\r
1733# @param AutoGenH The TemplateString object for header file\r
1734# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True\r
1735# @param UniGenBinBuffer Buffer to store uni string package data\r
1736#\r
1737def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer):\r
1738 WorkingDir = os.getcwd()\r
1739 os.chdir(Info.WorkspaceDir)\r
1740\r
1741 IncList = [Info.MetaFile.Dir]\r
1742 # Get all files under [Sources] section in inf file for EDK-II module\r
1743 EDK2Module = True\r
1744 SrcList = [F for F in Info.SourceFileList]\r
1745 if Info.AutoGenVersion < 0x00010005:\r
1746 EDK2Module = False\r
1747 # Get all files under the module directory for EDK-I module\r
1748 Cwd = os.getcwd()\r
1749 os.chdir(Info.MetaFile.Dir)\r
1750 for Root, Dirs, Files in os.walk("."):\r
1751 if 'CVS' in Dirs:\r
1752 Dirs.remove('CVS')\r
1753 if '.svn' in Dirs:\r
1754 Dirs.remove('.svn')\r
1755 for File in Files:\r
1756 File = PathClass(os.path.join(Root, File), Info.MetaFile.Dir)\r
1757 if File in SrcList:\r
1758 continue\r
1759 SrcList.append(File)\r
1760 os.chdir(Cwd)\r
1761\r
1762 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-c') > -1:\r
1763 CompatibleMode = True\r
1764 else:\r
1765 CompatibleMode = False\r
1766\r
1767 #\r
1768 # -s is a temporary option dedicated for building .UNI files with ISO 639-2 language codes of EDK Shell in EDK2\r
1769 #\r
1770 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1:\r
1771 if CompatibleMode:\r
1772 EdkLogger.error("build", AUTOGEN_ERROR,\r
1773 "-c and -s build options should be used exclusively",\r
1774 ExtraData="[%s]" % str(Info))\r
1775 ShellMode = True\r
1776 else:\r
1777 ShellMode = False\r
1778\r
1779 #RFC4646 is only for EDKII modules and ISO639-2 for EDK modules\r
1780 if EDK2Module:\r
1781 FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.RFCLanguages]\r
1782 else:\r
1783 FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.ISOLanguages]\r
1784 Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer, FilterInfo)\r
1785 if CompatibleMode or UniGenCFlag:\r
1786 AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")\r
1787 AutoGenC.Append(Code)\r
1788 AutoGenC.Append("\n")\r
1789 AutoGenH.Append("\n//\n//Unicode String ID\n//\n")\r
1790 AutoGenH.Append(Header)\r
1791 if CompatibleMode or UniGenCFlag:\r
1792 AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)\r
1793 os.chdir(WorkingDir)\r
1794\r
333ba578
YZ
1795def CreateIdfFileCode(Info, AutoGenC, StringH, IdfGenCFlag, IdfGenBinBuffer):\r
1796 if len(Info.IdfFileList) > 0:\r
1797 ImageFiles = IdfFileClassObject(sorted (Info.IdfFileList))\r
1798 if ImageFiles.ImageFilesDict:\r
1799 Index = 1\r
1800 PaletteIndex = 1\r
1801 IncList = [Info.MetaFile.Dir]\r
1802 SrcList = [F for F in Info.SourceFileList]\r
1803 SkipList = ['.jpg', '.png', '.bmp', '.inf', '.idf']\r
1804 FileList = GetFileList(SrcList, IncList, SkipList)\r
1805 ValueStartPtr = 60\r
1806 StringH.Append("\n//\n//Image ID\n//\n")\r
1807 ImageInfoOffset = 0\r
1808 PaletteInfoOffset = 0\r
1809 ImageBuffer = pack('x')\r
1810 PaletteBuffer = pack('x')\r
1811 BufferStr = ''\r
1812 PaletteStr = ''\r
6d034a2a 1813 FileDict = {}\r
333ba578
YZ
1814 for Idf in ImageFiles.ImageFilesDict:\r
1815 if ImageFiles.ImageFilesDict[Idf]:\r
1816 for FileObj in ImageFiles.ImageFilesDict[Idf]:\r
1817 for sourcefile in Info.SourceFileList:\r
1818 if FileObj.FileName == sourcefile.File:\r
1819 if not sourcefile.Ext.upper() in ['.PNG', '.BMP', '.JPG']:\r
1820 EdkLogger.error("build", AUTOGEN_ERROR, "The %s's postfix must be one of .bmp, .jpg, .png" % (FileObj.FileName), ExtraData="[%s]" % str(Info))\r
1821 FileObj.File = sourcefile\r
1822 break\r
1823 else:\r
1824 EdkLogger.error("build", AUTOGEN_ERROR, "The %s in %s is not defined in the driver's [Sources] section" % (FileObj.FileName, Idf), ExtraData="[%s]" % str(Info))\r
1825\r
1826 for FileObj in ImageFiles.ImageFilesDict[Idf]:\r
1827 ID = FileObj.ImageID\r
1828 File = FileObj.File\r
1829 if not os.path.exists(File.Path) or not os.path.isfile(File.Path):\r
1830 EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=File.Path)\r
1831 SearchImageID (FileObj, FileList)\r
1832 if FileObj.Referenced:\r
1833 if (ValueStartPtr - len(DEFINE_STR + ID)) <= 0:\r
1834 Line = DEFINE_STR + ' ' + ID + ' ' + DecToHexStr(Index, 4) + '\n'\r
1835 else:\r
1836 Line = DEFINE_STR + ' ' + ID + ' ' * (ValueStartPtr - len(DEFINE_STR + ID)) + DecToHexStr(Index, 4) + '\n'\r
1837\r
6d034a2a
YZ
1838 if File not in FileDict:\r
1839 FileDict[File] = Index\r
1840 else:\r
1841 DuplicateBlock = pack('B', EFI_HII_IIBT_DUPLICATE)\r
1842 DuplicateBlock += pack('H', FileDict[File])\r
1843 ImageBuffer += DuplicateBlock\r
1844 BufferStr = WriteLine(BufferStr, '// %s: %s: %s' % (DecToHexStr(Index, 4), ID, DecToHexStr(Index, 4)))\r
1845 TempBufferList = AscToHexList(DuplicateBlock)\r
1846 BufferStr = WriteLine(BufferStr, CreateArrayItem(TempBufferList, 16) + '\n')\r
1847 StringH.Append(Line)\r
1848 Index += 1\r
1849 continue\r
1850\r
333ba578
YZ
1851 TmpFile = open(File.Path, 'rb')\r
1852 Buffer = TmpFile.read()\r
1853 TmpFile.close()\r
1854 if File.Ext.upper() == '.PNG':\r
1855 TempBuffer = pack('B', EFI_HII_IIBT_IMAGE_PNG)\r
1856 TempBuffer += pack('I', len(Buffer))\r
1857 TempBuffer += Buffer\r
1858 elif File.Ext.upper() == '.JPG':\r
1859 ImageType, = struct.unpack('4s', Buffer[6:10])\r
1860 if ImageType != 'JFIF':\r
1861 EdkLogger.error("build", FILE_TYPE_MISMATCH, "The file %s is not a standard JPG file." % File.Path)\r
1862 TempBuffer = pack('B', EFI_HII_IIBT_IMAGE_JPEG)\r
1863 TempBuffer += pack('I', len(Buffer))\r
1864 TempBuffer += Buffer\r
1865 elif File.Ext.upper() == '.BMP':\r
1866 TempBuffer, TempPalette = BmpImageDecoder(File, Buffer, PaletteIndex, FileObj.TransParent)\r
1867 if len(TempPalette) > 1:\r
1868 PaletteIndex += 1\r
e148e6e9
YZ
1869 NewPalette = pack('H', len(TempPalette))\r
1870 NewPalette += TempPalette\r
1871 PaletteBuffer += NewPalette\r
333ba578 1872 PaletteStr = WriteLine(PaletteStr, '// %s: %s: %s' % (DecToHexStr(PaletteIndex - 1, 4), ID, DecToHexStr(PaletteIndex - 1, 4)))\r
e148e6e9 1873 TempPaletteList = AscToHexList(NewPalette)\r
333ba578
YZ
1874 PaletteStr = WriteLine(PaletteStr, CreateArrayItem(TempPaletteList, 16) + '\n')\r
1875 ImageBuffer += TempBuffer\r
1876 BufferStr = WriteLine(BufferStr, '// %s: %s: %s' % (DecToHexStr(Index, 4), ID, DecToHexStr(Index, 4)))\r
1877 TempBufferList = AscToHexList(TempBuffer)\r
1878 BufferStr = WriteLine(BufferStr, CreateArrayItem(TempBufferList, 16) + '\n')\r
1879\r
1880 StringH.Append(Line)\r
1881 Index += 1\r
1882\r
1883 BufferStr = WriteLine(BufferStr, '// End of the Image Info')\r
1884 BufferStr = WriteLine(BufferStr, CreateArrayItem(DecToHexList(EFI_HII_IIBT_END, 2)) + '\n')\r
1885 ImageEnd = pack('B', EFI_HII_IIBT_END)\r
1886 ImageBuffer += ImageEnd\r
1887\r
1888 if len(ImageBuffer) > 1:\r
1889 ImageInfoOffset = 12\r
1890 if len(PaletteBuffer) > 1:\r
1891 PaletteInfoOffset = 12 + len(ImageBuffer) - 1 # -1 is for the first empty pad byte of ImageBuffer\r
1892\r
1893 IMAGE_PACKAGE_HDR = pack('=II', ImageInfoOffset, PaletteInfoOffset)\r
1894 # PACKAGE_HEADER_Length = PACKAGE_HEADER + ImageInfoOffset + PaletteInfoOffset + ImageBuffer Length + PaletteCount + PaletteBuffer Length\r
1895 if len(PaletteBuffer) > 1:\r
1896 PACKAGE_HEADER_Length = 4 + 4 + 4 + len(ImageBuffer) - 1 + 2 + len(PaletteBuffer) - 1\r
1897 else:\r
1898 PACKAGE_HEADER_Length = 4 + 4 + 4 + len(ImageBuffer) - 1\r
1899 if PaletteIndex > 1:\r
1900 PALETTE_INFO_HEADER = pack('H', PaletteIndex - 1)\r
1901 # EFI_HII_PACKAGE_HEADER length max value is 0xFFFFFF\r
1902 Hex_Length = '%06X' % PACKAGE_HEADER_Length\r
1903 if PACKAGE_HEADER_Length > 0xFFFFFF:\r
1904 EdkLogger.error("build", AUTOGEN_ERROR, "The Length of EFI_HII_PACKAGE_HEADER exceed its maximum value", ExtraData="[%s]" % str(Info))\r
1905 PACKAGE_HEADER = pack('=HBB', int('0x' + Hex_Length[2:], 16), int('0x' + Hex_Length[0:2], 16), EFI_HII_PACKAGE_IMAGES)\r
1906\r
1907 IdfGenBinBuffer.write(PACKAGE_HEADER)\r
1908 IdfGenBinBuffer.write(IMAGE_PACKAGE_HDR)\r
1909 if len(ImageBuffer) > 1 :\r
1910 IdfGenBinBuffer.write(ImageBuffer[1:])\r
1911 if PaletteIndex > 1:\r
1912 IdfGenBinBuffer.write(PALETTE_INFO_HEADER)\r
1913 if len(PaletteBuffer) > 1:\r
1914 IdfGenBinBuffer.write(PaletteBuffer[1:])\r
1915\r
1916 if IdfGenCFlag:\r
1917 TotalLength = EFI_HII_ARRAY_SIZE_LENGTH + PACKAGE_HEADER_Length\r
1918 AutoGenC.Append("\n//\n//Image Pack Definition\n//\n")\r
1919 AllStr = WriteLine('', CHAR_ARRAY_DEFIN + ' ' + Info.Module.BaseName + 'Images' + '[] = {\n')\r
1920 AllStr = WriteLine(AllStr, '// STRGATHER_OUTPUT_HEADER')\r
1921 AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(TotalLength)) + '\n')\r
1922 AllStr = WriteLine(AllStr, '// Image PACKAGE HEADER\n')\r
1923 IMAGE_PACKAGE_HDR_List = AscToHexList(PACKAGE_HEADER)\r
1924 IMAGE_PACKAGE_HDR_List += AscToHexList(IMAGE_PACKAGE_HDR)\r
1925 AllStr = WriteLine(AllStr, CreateArrayItem(IMAGE_PACKAGE_HDR_List, 16) + '\n')\r
1926 AllStr = WriteLine(AllStr, '// Image DATA\n')\r
1927 if BufferStr:\r
1928 AllStr = WriteLine(AllStr, BufferStr)\r
1929 if PaletteStr:\r
1930 AllStr = WriteLine(AllStr, '// Palette Header\n')\r
1931 PALETTE_INFO_HEADER_List = AscToHexList(PALETTE_INFO_HEADER)\r
1932 AllStr = WriteLine(AllStr, CreateArrayItem(PALETTE_INFO_HEADER_List, 16) + '\n')\r
1933 AllStr = WriteLine(AllStr, '// Palette Data\n')\r
1934 AllStr = WriteLine(AllStr, PaletteStr)\r
1935 AllStr = WriteLine(AllStr, '};')\r
1936 AutoGenC.Append(AllStr)\r
1937 AutoGenC.Append("\n")\r
1938 StringH.Append('\nextern unsigned char ' + Info.Module.BaseName + 'Images[];\n')\r
1939 StringH.Append("\n#define IMAGE_ARRAY_NAME %sImages\n" % Info.Module.BaseName)\r
1940\r
1941# typedef struct _EFI_HII_IMAGE_PACKAGE_HDR {\r
1942# EFI_HII_PACKAGE_HEADER Header; # Standard package header, where Header.Type = EFI_HII_PACKAGE_IMAGES\r
1943# UINT32 ImageInfoOffset;\r
1944# UINT32 PaletteInfoOffset;\r
1945# } EFI_HII_IMAGE_PACKAGE_HDR;\r
1946\r
1947# typedef struct {\r
1948# UINT32 Length:24;\r
1949# UINT32 Type:8;\r
1950# UINT8 Data[];\r
1951# } EFI_HII_PACKAGE_HEADER;\r
1952\r
1953# typedef struct _EFI_HII_IMAGE_BLOCK {\r
1954# UINT8 BlockType;\r
1955# UINT8 BlockBody[];\r
1956# } EFI_HII_IMAGE_BLOCK;\r
1957\r
1958def BmpImageDecoder(File, Buffer, PaletteIndex, TransParent):\r
1959 ImageType, = struct.unpack('2s', Buffer[0:2])\r
1960 if ImageType!= 'BM': # BMP file type is 'BM'\r
1961 EdkLogger.error("build", FILE_TYPE_MISMATCH, "The file %s is not a standard BMP file." % File.Path)\r
1962 BMP_IMAGE_HEADER = collections.namedtuple('BMP_IMAGE_HEADER', ['bfSize','bfReserved1','bfReserved2','bfOffBits','biSize','biWidth','biHeight','biPlanes','biBitCount', 'biCompression', 'biSizeImage','biXPelsPerMeter','biYPelsPerMeter','biClrUsed','biClrImportant'])\r
1963 BMP_IMAGE_HEADER_STRUCT = struct.Struct('IHHIIIIHHIIIIII')\r
1964 BmpHeader = BMP_IMAGE_HEADER._make(BMP_IMAGE_HEADER_STRUCT.unpack_from(Buffer[2:]))\r
1965 #\r
1966 # Doesn't support compress.\r
1967 #\r
1968 if BmpHeader.biCompression != 0:\r
1969 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The compress BMP file %s is not support." % File.Path)\r
1970\r
1971 # The Width and Height is UINT16 type in Image Package\r
1972 if BmpHeader.biWidth > 0xFFFF:\r
1973 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The BMP file %s Width is exceed 0xFFFF." % File.Path)\r
1974 if BmpHeader.biHeight > 0xFFFF:\r
1975 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The BMP file %s Height is exceed 0xFFFF." % File.Path)\r
1976\r
1977 PaletteBuffer = pack('x')\r
1978 if BmpHeader.biBitCount == 1:\r
1979 if TransParent:\r
1980 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_1BIT_TRANS)\r
1981 else:\r
1982 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_1BIT)\r
1983 ImageBuffer += pack('B', PaletteIndex)\r
1984 Width = (BmpHeader.biWidth + 7)/8\r
1985 if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
1986 PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
1987 elif BmpHeader.biBitCount == 4:\r
1988 if TransParent:\r
1989 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_4BIT_TRANS)\r
1990 else:\r
1991 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_4BIT)\r
1992 ImageBuffer += pack('B', PaletteIndex)\r
1993 Width = (BmpHeader.biWidth + 1)/2\r
1994 if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
1995 PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
1996 elif BmpHeader.biBitCount == 8:\r
1997 if TransParent:\r
1998 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_8BIT_TRANS)\r
1999 else:\r
2000 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_8BIT)\r
2001 ImageBuffer += pack('B', PaletteIndex)\r
2002 Width = BmpHeader.biWidth\r
2003 if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
2004 PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
2005 elif BmpHeader.biBitCount == 24:\r
2006 if TransParent:\r
2007 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_24BIT_TRANS)\r
2008 else:\r
2009 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_24BIT)\r
2010 Width = BmpHeader.biWidth * 3\r
2011 else:\r
2012 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "Only support the 1 bit, 4 bit, 8bit, 24 bit BMP files.", ExtraData="[%s]" % str(File.Path))\r
2013\r
2014 ImageBuffer += pack('H', BmpHeader.biWidth)\r
2015 ImageBuffer += pack('H', BmpHeader.biHeight)\r
2016 Start = BmpHeader.bfOffBits\r
2017 End = BmpHeader.bfSize - 1\r
2018 for Height in range(0, BmpHeader.biHeight):\r
2019 if Width % 4 != 0:\r
2020 Start = End + (Width % 4) - 4 - Width\r
2021 else:\r
2022 Start = End - Width\r
2023 ImageBuffer += Buffer[Start + 1 : Start + Width + 1]\r
2024 End = Start\r
2025\r
2026 # handle the Palette info, BMP use 4 bytes for R, G, B and Reserved info while EFI_HII_RGB_PIXEL only have the R, G, B info\r
2027 if PaletteBuffer and len(PaletteBuffer) > 1:\r
2028 PaletteTemp = pack('x')\r
2029 for Index in range(0, len(PaletteBuffer)):\r
2030 if Index % 4 == 3:\r
2031 continue\r
2032 PaletteTemp += PaletteBuffer[Index]\r
2033 PaletteBuffer = PaletteTemp[1:]\r
2034 return ImageBuffer, PaletteBuffer\r
2035\r
f51461c8
LG
2036## Create common code\r
2037#\r
2038# @param Info The ModuleAutoGen object\r
2039# @param AutoGenC The TemplateString object for C code\r
2040# @param AutoGenH The TemplateString object for header file\r
2041#\r
2042def CreateHeaderCode(Info, AutoGenC, AutoGenH):\r
2043 # file header\r
2044 AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'}))\r
2045 # header file Prologue\r
2046 AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')}))\r
2047 AutoGenH.Append(gAutoGenHCppPrologueString)\r
2048 if Info.AutoGenVersion >= 0x00010005:\r
2049 # header files includes\r
2050 AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile)\r
2051 if Info.ModuleType in gModuleTypeHeaderFile \\r
2052 and gModuleTypeHeaderFile[Info.ModuleType][0] != gBasicHeaderFile:\r
2053 AutoGenH.Append("#include <%s>\n" % gModuleTypeHeaderFile[Info.ModuleType][0])\r
2054 #\r
2055 # if either PcdLib in [LibraryClasses] sections or there exist Pcd section, add PcdLib.h \r
2056 # As if modules only uses FixedPcd, then PcdLib is not needed in [LibraryClasses] section.\r
2057 #\r
2058 if 'PcdLib' in Info.Module.LibraryClasses or Info.Module.Pcds:\r
2059 AutoGenH.Append("#include <Library/PcdLib.h>\n")\r
2060\r
2061 AutoGenH.Append('\nextern GUID gEfiCallerIdGuid;')\r
2062 AutoGenH.Append('\nextern CHAR8 *gEfiCallerBaseName;\n\n')\r
2063\r
2064 if Info.IsLibrary:\r
2065 return\r
2066\r
2067 AutoGenH.Append("#define EFI_CALLER_ID_GUID \\\n %s\n" % GuidStringToGuidStructureString(Info.Guid))\r
2068\r
2069 if Info.IsLibrary:\r
2070 return\r
2071 # C file header\r
2072 AutoGenC.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.c'}))\r
2073 if Info.AutoGenVersion >= 0x00010005:\r
2074 # C file header files includes\r
2075 if Info.ModuleType in gModuleTypeHeaderFile:\r
2076 for Inc in gModuleTypeHeaderFile[Info.ModuleType]:\r
2077 AutoGenC.Append("#include <%s>\n" % Inc)\r
2078 else:\r
2079 AutoGenC.Append("#include <%s>\n" % gBasicHeaderFile)\r
2080\r
2081 #\r
2082 # Publish the CallerId Guid\r
2083 #\r
2084 AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid))\r
2085 AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *gEfiCallerBaseName = "%s";\n' % Info.Name)\r
2086\r
2087## Create common code for header file\r
2088#\r
2089# @param Info The ModuleAutoGen object\r
2090# @param AutoGenC The TemplateString object for C code\r
2091# @param AutoGenH The TemplateString object for header file\r
2092#\r
2093def CreateFooterCode(Info, AutoGenC, AutoGenH):\r
2094 AutoGenH.Append(gAutoGenHEpilogueString)\r
2095\r
2096## Create code for a module\r
2097#\r
2098# @param Info The ModuleAutoGen object\r
2099# @param AutoGenC The TemplateString object for C code\r
2100# @param AutoGenH The TemplateString object for header file\r
333ba578 2101# @param StringH The TemplateString object for header file\r
f51461c8
LG
2102# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True\r
2103# @param UniGenBinBuffer Buffer to store uni string package data\r
333ba578
YZ
2104# @param StringIdf The TemplateString object for header file\r
2105# @param IdfGenCFlag IdfString is generated into AutoGen C file when it is set to True\r
2106# @param IdfGenBinBuffer Buffer to store Idf string package data\r
f51461c8 2107#\r
333ba578 2108def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer, StringIdf, IdfGenCFlag, IdfGenBinBuffer):\r
f51461c8
LG
2109 CreateHeaderCode(Info, AutoGenC, AutoGenH)\r
2110\r
2111 if Info.AutoGenVersion >= 0x00010005:\r
2112 CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH)\r
2113 CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH)\r
2114 CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH)\r
2115 CreatePcdCode(Info, AutoGenC, AutoGenH)\r
2116 CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH)\r
2117 CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH)\r
2118 CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH)\r
2119 CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH)\r
2120\r
2121 if Info.UnicodeFileList:\r
2122 FileName = "%sStrDefs.h" % Info.Name\r
2123 StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))\r
2124 StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')}))\r
2125 CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer)\r
8200fcfe
YL
2126\r
2127 GuidMacros = []\r
2128 for Guid in Info.Module.Guids:\r
2129 if Guid in Info.Module.GetGuidsUsedByPcd():\r
2130 continue\r
2131 GuidMacros.append('#define %s %s' % (Guid, Info.Module.Guids[Guid]))\r
2132 for Guid, Value in Info.Module.Protocols.items() + Info.Module.Ppis.items():\r
2133 GuidMacros.append('#define %s %s' % (Guid, Value))\r
5b97eb4c
YZ
2134 # supports FixedAtBuild usage in VFR file\r
2135 if Info.VfrFileList and Info.ModulePcdList:\r
2136 GuidMacros.append('#define %s %s' % ('FixedPcdGetBool(TokenName)', '_PCD_VALUE_##TokenName'))\r
2137 GuidMacros.append('#define %s %s' % ('FixedPcdGet8(TokenName)', '_PCD_VALUE_##TokenName'))\r
2138 GuidMacros.append('#define %s %s' % ('FixedPcdGet16(TokenName)', '_PCD_VALUE_##TokenName'))\r
2139 GuidMacros.append('#define %s %s' % ('FixedPcdGet32(TokenName)', '_PCD_VALUE_##TokenName'))\r
2140 GuidMacros.append('#define %s %s' % ('FixedPcdGet64(TokenName)', '_PCD_VALUE_##TokenName'))\r
2141 for Pcd in Info.ModulePcdList:\r
2142 if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD:\r
2143 TokenCName = Pcd.TokenCName\r
2144 Value = Pcd.DefaultValue\r
2145 if Pcd.DatumType == 'BOOLEAN':\r
2146 BoolValue = Value.upper()\r
2147 if BoolValue == 'TRUE':\r
2148 Value = '1'\r
2149 elif BoolValue == 'FALSE':\r
2150 Value = '0'\r
2151 for PcdItem in GlobalData.MixedPcd:\r
2152 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
2153 TokenCName = PcdItem[0]\r
2154 break\r
2155 GuidMacros.append('#define %s %s' % ('_PCD_VALUE_'+TokenCName, Value))\r
2156\r
bc7d95c0
YZ
2157 if Info.IdfFileList:\r
2158 GuidMacros.append('#include "%sImgDefs.h"' % Info.Name)\r
2159\r
8200fcfe
YL
2160 if GuidMacros:\r
2161 StringH.Append('\n#ifdef VFRCOMPILE\n%s\n#endif\n' % '\n'.join(GuidMacros))\r
2162\r
f51461c8
LG
2163 StringH.Append("\n#endif\n")\r
2164 AutoGenH.Append('#include "%s"\n' % FileName)\r
2165\r
333ba578
YZ
2166 if Info.IdfFileList:\r
2167 FileName = "%sImgDefs.h" % Info.Name\r
2168 StringIdf.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))\r
2169 StringIdf.Append(gAutoGenHPrologueString.Replace({'File':'IMAGEDEFS', 'Guid':Info.Guid.replace('-','_')}))\r
2170 CreateIdfFileCode(Info, AutoGenC, StringIdf, IdfGenCFlag, IdfGenBinBuffer)\r
2171\r
2172 StringIdf.Append("\n#endif\n")\r
2173 AutoGenH.Append('#include "%s"\n' % FileName)\r
2174\r
f51461c8
LG
2175 CreateFooterCode(Info, AutoGenC, AutoGenH)\r
2176\r
2177 # no generation of AutoGen.c for Edk modules without unicode file\r
2178 if Info.AutoGenVersion < 0x00010005 and len(Info.UnicodeFileList) == 0:\r
2179 AutoGenC.String = ''\r
2180\r
2181## Create the code file\r
2182#\r
2183# @param FilePath The path of code file\r
2184# @param Content The content of code file\r
2185# @param IsBinaryFile The flag indicating if the file is binary file or not\r
2186#\r
2187# @retval True If file content is changed or file doesn't exist\r
2188# @retval False If the file exists and the content is not changed\r
2189#\r
2190def Generate(FilePath, Content, IsBinaryFile):\r
2191 return SaveFileOnChange(FilePath, Content, IsBinaryFile)\r
2192\r