]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/GenC.py
BaseTools: do the list and iterator translation
[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
5a57246e 24from Common.StringUtils import StringToArray\r
0ff3b52e
GL
25from .StrGather import *\r
26from .GenPcdDb import CreatePcdDatabaseCode\r
27from .IdfClassObject import *\r
f51461c8
LG
28\r
29## PCD type string\r
30gItemTypeStringDatabase = {\r
be409b67
CJ
31 TAB_PCDS_FEATURE_FLAG : TAB_PCDS_FIXED_AT_BUILD,\r
32 TAB_PCDS_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,\r
f51461c8
LG
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
549ae85c 268 IN EFI_MM_SYSTEM_TABLE *MmSystemTable\r
5a9c3e3e
SV
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
549ae85c 281 IN EFI_MM_SYSTEM_TABLE *MmSystemTable\r
5a9c3e3e
SV
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
549ae85c 295 IN EFI_MM_SYSTEM_TABLE *MmSystemTable\r
5a9c3e3e
SV
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
549ae85c 310 IN EFI_MM_SYSTEM_TABLE *MmSystemTable\r
5a9c3e3e
SV
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
549ae85c 678 IN EFI_MM_SYSTEM_TABLE *MmSystemTable\r
5a9c3e3e
SV
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
549ae85c 758 IN EFI_MM_SYSTEM_TABLE *MmSystemTable\r
5a9c3e3e
SV
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
549ae85c
SV
782 SUP_MODULE_MM_STANDALONE : ["PiMm.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/StandaloneMmDriverEntryPoint.h"],\r
783 SUP_MODULE_MM_CORE_STANDALONE : ["PiMm.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/StandaloneMmCoreEntryPoint.h"],\r
8bb63e37 784 SUP_MODULE_USER_DEFINED : [gBasicHeaderFile]\r
f51461c8
LG
785}\r
786\r
f7496d71 787## Autogen internal worker macro to define DynamicEx PCD name includes both the TokenSpaceGuidName\r
f51461c8
LG
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
f7496d71 807 # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter.\r
f51461c8 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
f7496d71 825 AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:'\r
2a29017e 826 % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName))\r
f51461c8 827 else:\r
f7496d71 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
f7496d71 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
f7496d71 851 AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:'\r
2a29017e 852 % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName))\r
f51461c8 853 else:\r
f7496d71 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
f7496d71 858 # Autogen internal worker macro to compare GUIDs. Guid1 is a pointer to a GUID.\r
f51461c8
LG
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
LG
865\r
866## Create code for module PCDs\r
867#\r
868# @param Info The ModuleAutoGen object\r
869# @param AutoGenC The TemplateString object for C code\r
870# @param AutoGenH The TemplateString object for header file\r
871# @param Pcd The PCD object\r
872#\r
873def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):\r
874 TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[Pcd.TokenSpaceGuidCName]\r
875 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber\r
2a29017e
YZ
876 #\r
877 # Write PCDs\r
878 #\r
879 TokenCName = Pcd.TokenCName\r
880 for PcdItem in GlobalData.MixedPcd:\r
881 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
882 TokenCName = PcdItem[0]\r
883 break\r
884 PcdTokenName = '_PCD_TOKEN_' + TokenCName\r
885 PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'\r
886 PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName\r
f7b31aa5 887 PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' + TokenCName\r
2a29017e 888 FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName\r
1bfcf64f 889 FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName\r
763e8edf 890\r
0f228f19
B
891 if Pcd.PcdValueFromComm:\r
892 Pcd.DefaultValue = Pcd.PcdValueFromComm\r
543f5ac3
B
893 elif Pcd.PcdValueFromFdf:\r
894 Pcd.DefaultValue = Pcd.PcdValueFromFdf\r
f7496d71 895\r
eece4292 896 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8 897 TokenNumber = int(Pcd.TokenValue, 0)\r
f7496d71 898 # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with\r
f51461c8 899 # different Guids but same TokenCName\r
2a29017e 900 PcdExTokenName = '_PCD_TOKEN_' + Pcd.TokenSpaceGuidCName + '_' + TokenCName\r
f51461c8
LG
901 AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber))\r
902 else:\r
903 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:\r
f7496d71
LG
904 # If one of the Source built modules listed in the DSC is not listed in FDF modules,\r
905 # and the INF lists a PCD can only use the PcdsDynamic access method (it is only\r
906 # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will\r
907 # report warning message notify the PI that they are attempting to build a module\r
908 # that must be included in a flash image in order to be functional. These Dynamic PCD\r
909 # will not be added into the Database unless it is used by other modules that are\r
910 # included in the FDF file.\r
f51461c8 911 # In this case, just assign an invalid token number to make it pass build.\r
eece4292 912 if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
f51461c8
LG
913 TokenNumber = 0\r
914 else:\r
915 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 916 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
917 ExtraData="[%s]" % str(Info))\r
918 else:\r
919 TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]\r
920 AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber))\r
921\r
2a29017e 922 EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + TokenCName + "." + Pcd.TokenSpaceGuidCName)\r
f51461c8
LG
923 if Pcd.Type not in gItemTypeStringDatabase:\r
924 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 925 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 926 ExtraData="[%s]" % str(Info))\r
f51461c8 927\r
656d2539
CJ
928 DatumSize = gDatumSizeStringDatabase[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabase else gDatumSizeStringDatabase[TAB_VOID]\r
929 DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabaseLib else gDatumSizeStringDatabaseLib[TAB_VOID]\r
930 GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
931 SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
932 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 933 GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + TokenCName\r
f7496d71 934\r
eece4292 935 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8
LG
936 if Info.IsLibrary:\r
937 PcdList = Info.LibraryPcdList\r
938 else:\r
00fcce91 939 PcdList = list(Info.ModulePcdList) + list(Info.LibraryPcdList)\r
72fbe88d 940 PcdExCNameTest = 0\r
f51461c8 941 for PcdModule in PcdList:\r
eece4292 942 if PcdModule.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenCName == PcdModule.TokenCName:\r
72fbe88d
CJ
943 PcdExCNameTest += 1\r
944 # get out early once we found > 1...\r
945 if PcdExCNameTest > 1:\r
946 break\r
f51461c8
LG
947 # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd.\r
948 # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build.\r
949 # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build.\r
72fbe88d 950 if PcdExCNameTest > 1:\r
f51461c8
LG
951 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
952 AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
953 AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
ccaa7754 954 AutoGenH.Append('// #define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 955 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 956 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 957 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
958 else:\r
959 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 960 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
961 else:\r
962 AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
963 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
ccaa7754 964 AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 965 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 966 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 967 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
968 else:\r
969 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 970 AutoGenH.Append('#define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
eece4292 971 elif Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
72fbe88d 972 PcdCNameTest = 0\r
00fcce91 973 for PcdModule in list(Info.LibraryPcdList) + list(Info.ModulePcdList):\r
eece4292 974 if PcdModule.Type in PCD_DYNAMIC_TYPE_SET and Pcd.TokenCName == PcdModule.TokenCName:\r
72fbe88d
CJ
975 PcdCNameTest += 1\r
976 # get out early once we found > 1...\r
977 if PcdCNameTest > 1:\r
978 break\r
979 if PcdCNameTest > 1:\r
2a29017e 980 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 981 else:\r
38b986e3
YZ
982 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))\r
983 AutoGenH.Append('#define %s LibPcdGetSize(%s)\n' % (GetModeSizeName, PcdTokenName))\r
656d2539 984 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
38b986e3
YZ
985 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))\r
986 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
987 else:\r
988 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))\r
989 AutoGenH.Append('#define %s(Value) LibPcdSet%sS(%s, (Value))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
f51461c8 990 else:\r
2a29017e 991 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + TokenCName\r
f51461c8
LG
992 Const = 'const'\r
993 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
994 Const = ''\r
995 Type = ''\r
996 Array = ''\r
997 Value = Pcd.DefaultValue\r
998 Unicode = False\r
999 ValueNumber = 0\r
1000\r
1001 if Pcd.DatumType == 'BOOLEAN':\r
1002 BoolValue = Value.upper()\r
1003 if BoolValue == 'TRUE' or BoolValue == '1':\r
1004 Value = '1U'\r
1005 elif BoolValue == 'FALSE' or BoolValue == '0':\r
1006 Value = '0U'\r
1007\r
656d2539 1008 if Pcd.DatumType in TAB_PCD_CLEAN_NUMERIC_TYPES:\r
f51461c8 1009 try:\r
726c501c
YZ
1010 if Value.upper().endswith('L'):\r
1011 Value = Value[:-1]\r
0944818a 1012 ValueNumber = int (Value, 0)\r
f51461c8
LG
1013 except:\r
1014 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1015 "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 1016 ExtraData="[%s]" % str(Info))\r
c526dcd4 1017 if ValueNumber < 0:\r
1018 EdkLogger.error("build", AUTOGEN_ERROR,\r
1019 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
1020 ExtraData="[%s]" % str(Info))\r
1021 elif ValueNumber > MAX_VAL_TYPE[Pcd.DatumType]:\r
1022 EdkLogger.error("build", AUTOGEN_ERROR,\r
1023 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),\r
1024 ExtraData="[%s]" % str(Info))\r
1025 if Pcd.DatumType == TAB_UINT64 and not Value.endswith('ULL'):\r
1026 Value += 'ULL'\r
1027 elif Pcd.DatumType != TAB_UINT64 and not Value.endswith('U'):\r
1028 Value += 'U'\r
1029\r
656d2539 1030 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
6b285ca3 1031 if not Pcd.MaxDatumSize:\r
f51461c8 1032 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1033 "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1034 ExtraData="[%s]" % str(Info))\r
1035\r
1036 ArraySize = int(Pcd.MaxDatumSize, 0)\r
1037 if Value[0] == '{':\r
1038 Type = '(VOID *)'\r
6b285ca3 1039 ValueSize = len(Value.split(','))\r
f51461c8
LG
1040 else:\r
1041 if Value[0] == 'L':\r
1042 Unicode = True\r
1043 Value = Value.lstrip('L') #.strip('"')\r
1044 Value = eval(Value) # translate escape character\r
6b285ca3 1045 ValueSize = len(Value) + 1\r
f51461c8 1046 NewValue = '{'\r
ccaa7754 1047 for Index in range(0, len(Value)):\r
f51461c8
LG
1048 if Unicode:\r
1049 NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', '\r
1050 else:\r
1051 NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', '\r
1052 if Unicode:\r
6b285ca3 1053 ArraySize = ArraySize / 2\r
f51461c8 1054 Value = NewValue + '0 }'\r
6b285ca3
YF
1055 if ArraySize < ValueSize:\r
1056 if Pcd.MaxSizeUserSet:\r
1057 EdkLogger.error("build", AUTOGEN_ERROR,\r
1058 "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, TokenCName),\r
1059 ExtraData="[%s]" % str(Info))\r
1060 else:\r
1061 ArraySize = Pcd.GetPcdSize()\r
1062 if Unicode:\r
1063 ArraySize = ArraySize / 2\r
f51461c8
LG
1064 Array = '[%d]' % ArraySize\r
1065 #\r
1066 # skip casting for fixed at build since it breaks ARM assembly.\r
1067 # Long term we need PCD macros that work in assembly\r
1068 #\r
656d2539 1069 elif Pcd.Type != TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType in TAB_PCD_NUMERIC_TYPES_VOID:\r
f51461c8
LG
1070 Value = "((%s)%s)" % (Pcd.DatumType, Value)\r
1071\r
1072 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
2a29017e 1073 PcdValueName = '_PCD_PATCHABLE_VALUE_' + TokenCName\r
f51461c8 1074 else:\r
2a29017e 1075 PcdValueName = '_PCD_VALUE_' + TokenCName\r
f7496d71 1076\r
656d2539 1077 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8
LG
1078 #\r
1079 # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.\r
1080 #\r
674e2014 1081 AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName))\r
f51461c8 1082 if Unicode:\r
f51461c8
LG
1083 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
1084 AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array))\r
f51461c8 1085 else:\r
f51461c8
LG
1086 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
1087 AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array))\r
674e2014 1088 AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))\r
f7496d71 1089\r
5565a8c4 1090 PcdDataSize = Pcd.GetPcdSize()\r
2f5acc3b
BF
1091 if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD:\r
1092 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
ccaa7754
GL
1093 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName, FixPcdSizeTokenName))\r
1094 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED const UINTN %s = %s;\n' % (FixedPcdSizeVariableName, PcdDataSize))\r
2f5acc3b
BF
1095 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
1096 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, Pcd.MaxDatumSize))\r
ccaa7754 1097 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName, PatchPcdSizeVariableName))\r
2f5acc3b 1098 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
ccaa7754
GL
1099 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName, PcdDataSize))\r
1100 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED const UINTN %s = %s;\n' % (PatchPcdMaxSizeVariable, Pcd.MaxDatumSize))\r
f51461c8
LG
1101 elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
1102 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))\r
1103 AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))\r
1104 AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
1105 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))\r
f7496d71 1106\r
5565a8c4 1107 PcdDataSize = Pcd.GetPcdSize()\r
2f5acc3b 1108 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
f7496d71 1109\r
ccaa7754 1110 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName, PatchPcdSizeVariableName))\r
2f5acc3b 1111 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
ccaa7754 1112 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName, PcdDataSize))\r
f51461c8 1113 else:\r
5565a8c4 1114 PcdDataSize = Pcd.GetPcdSize()\r
2f5acc3b 1115 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
ccaa7754 1116 AutoGenH.Append('#define %s %s \n' % (GetModeSizeName, FixPcdSizeTokenName))\r
f7496d71 1117\r
f51461c8
LG
1118 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))\r
1119 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))\r
1120 AutoGenH.Append('extern %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
1121 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))\r
1122\r
1123 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
656d2539 1124 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
e70504cd
LG
1125 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
1126 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
1127 else:\r
1128 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))\r
82a6a960 1129 AutoGenH.Append('#define %s(Value) ((%s = (Value)), RETURN_SUCCESS) \n' % (SetModeStatusName, PcdVariableName))\r
f51461c8
LG
1130 else:\r
1131 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)\r
1132\r
1133## Create code for library module PCDs\r
1134#\r
1135# @param Info The ModuleAutoGen object\r
1136# @param AutoGenC The TemplateString object for C code\r
1137# @param AutoGenH The TemplateString object for header file\r
1138# @param Pcd The PCD object\r
1139#\r
1140def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):\r
1141 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber\r
1142 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
1143 TokenCName = Pcd.TokenCName\r
2a29017e
YZ
1144 for PcdItem in GlobalData.MixedPcd:\r
1145 if (TokenCName, TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
1146 TokenCName = PcdItem[0]\r
1147 break\r
f51461c8 1148 PcdTokenName = '_PCD_TOKEN_' + TokenCName\r
2a29017e
YZ
1149 FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName\r
1150 PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'\r
1151 PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName\r
f7b31aa5 1152 PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' + TokenCName\r
1bfcf64f 1153 FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName\r
763e8edf 1154\r
0f228f19
B
1155 if Pcd.PcdValueFromComm:\r
1156 Pcd.DefaultValue = Pcd.PcdValueFromComm\r
543f5ac3
B
1157 elif Pcd.PcdValueFromFdf:\r
1158 Pcd.DefaultValue = Pcd.PcdValueFromFdf\r
f51461c8
LG
1159 #\r
1160 # Write PCDs\r
1161 #\r
eece4292 1162 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
f51461c8
LG
1163 TokenNumber = int(Pcd.TokenValue, 0)\r
1164 else:\r
1165 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:\r
f7496d71
LG
1166 # If one of the Source built modules listed in the DSC is not listed in FDF modules,\r
1167 # and the INF lists a PCD can only use the PcdsDynamic access method (it is only\r
1168 # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will\r
1169 # report warning message notify the PI that they are attempting to build a module\r
1170 # that must be included in a flash image in order to be functional. These Dynamic PCD\r
1171 # will not be added into the Database unless it is used by other modules that are\r
1172 # included in the FDF file.\r
f51461c8 1173 # In this case, just assign an invalid token number to make it pass build.\r
eece4292 1174 if Pcd.Type in PCD_DYNAMIC_TYPE_SET:\r
f51461c8
LG
1175 TokenNumber = 0\r
1176 else:\r
1177 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1178 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8
LG
1179 ExtraData="[%s]" % str(Info))\r
1180 else:\r
1181 TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]\r
1182\r
1183 if Pcd.Type not in gItemTypeStringDatabase:\r
1184 EdkLogger.error("build", AUTOGEN_ERROR,\r
2a29017e 1185 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, TokenCName),\r
f51461c8 1186 ExtraData="[%s]" % str(Info))\r
f51461c8
LG
1187\r
1188 DatumType = Pcd.DatumType\r
656d2539
CJ
1189 DatumSize = gDatumSizeStringDatabase[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabase else gDatumSizeStringDatabase[TAB_VOID]\r
1190 DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType] if Pcd.DatumType in gDatumSizeStringDatabaseLib else gDatumSizeStringDatabaseLib[TAB_VOID]\r
1191 GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
1192 SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[TAB_VOID] + '_' + TokenCName\r
1193 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 1194 GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + TokenCName\r
f51461c8
LG
1195\r
1196 Type = ''\r
1197 Array = ''\r
656d2539 1198 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
d66670f9
YZ
1199 if Pcd.DefaultValue[0]== '{':\r
1200 Type = '(VOID *)'\r
f51461c8
LG
1201 Array = '[]'\r
1202 PcdItemType = Pcd.Type\r
eece4292 1203 if PcdItemType in PCD_DYNAMIC_EX_TYPE_SET:\r
2a29017e 1204 PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + TokenCName\r
f51461c8 1205 AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber))\r
f7496d71 1206\r
f51461c8
LG
1207 if Info.IsLibrary:\r
1208 PcdList = Info.LibraryPcdList\r
1209 else:\r
1210 PcdList = Info.ModulePcdList\r
72fbe88d 1211 PcdExCNameTest = 0\r
f51461c8 1212 for PcdModule in PcdList:\r
eece4292 1213 if PcdModule.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenCName == PcdModule.TokenCName:\r
72fbe88d
CJ
1214 PcdExCNameTest += 1\r
1215 # get out early once we found > 1...\r
1216 if PcdExCNameTest > 1:\r
1217 break\r
f51461c8
LG
1218 # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd.\r
1219 # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build.\r
1220 # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build.\r
72fbe88d 1221 if PcdExCNameTest > 1:\r
f51461c8
LG
1222 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
1223 AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
1224 AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
ccaa7754 1225 AutoGenH.Append('// #define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 1226 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 1227 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1228 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1229 else:\r
1230 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1231 AutoGenH.Append('// #define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1232 else:\r
1233 AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName))\r
1234 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
ccaa7754 1235 AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
656d2539 1236 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f51461c8 1237 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1238 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1239 else:\r
1240 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
82a6a960 1241 AutoGenH.Append('#define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
f51461c8
LG
1242 else:\r
1243 AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber))\r
eece4292 1244 if PcdItemType in PCD_DYNAMIC_TYPE_SET:\r
38b986e3
YZ
1245 PcdList = []\r
1246 PcdCNameList = []\r
1247 PcdList.extend(Info.LibraryPcdList)\r
1248 PcdList.extend(Info.ModulePcdList)\r
1249 for PcdModule in PcdList:\r
eece4292 1250 if PcdModule.Type in PCD_DYNAMIC_TYPE_SET:\r
38b986e3
YZ
1251 PcdCNameList.append(PcdModule.TokenCName)\r
1252 if PcdCNameList.count(Pcd.TokenCName) > 1:\r
2a29017e 1253 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 1254 else:\r
38b986e3
YZ
1255 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))\r
1256 AutoGenH.Append('#define %s LibPcdGetSize(%s)\n' % (GetModeSizeName, PcdTokenName))\r
656d2539 1257 if DatumType not in TAB_PCD_NUMERIC_TYPES:\r
38b986e3
YZ
1258 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))\r
1259 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
1260 else:\r
1261 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))\r
1262 AutoGenH.Append('#define %s(Value) LibPcdSet%sS(%s, (Value))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
f51461c8
LG
1263 if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:\r
1264 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName\r
656d2539
CJ
1265 if DatumType not in TAB_PCD_NUMERIC_TYPES:\r
1266 if DatumType == TAB_VOID and Array == '[]':\r
1267 DatumType = [TAB_UINT8, TAB_UINT16][Pcd.DefaultValue[0] == 'L']\r
f7b31aa5 1268 else:\r
656d2539 1269 DatumType = TAB_UINT8\r
d66670f9
YZ
1270 AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array))\r
1271 else:\r
1272 AutoGenH.Append('extern volatile %s %s%s;\n' % (DatumType, PcdVariableName, Array))\r
f51461c8 1273 AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))\r
5565a8c4 1274 PcdDataSize = Pcd.GetPcdSize()\r
656d2539 1275 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
f7b31aa5
YZ
1276 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))\r
1277 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))\r
bfa7eeb6 1278 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PatchPcdMaxSizeVariable))\r
f7b31aa5 1279 AutoGenH.Append('extern const UINTN %s; \n' % PatchPcdMaxSizeVariable)\r
27187d24
LG
1280 else:\r
1281 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))\r
1282 AutoGenH.Append('#define %s(Value) ((%s = (Value)), RETURN_SUCCESS)\n' % (SetModeStatusName, PcdVariableName))\r
a6c31c6d
YZ
1283 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
1284\r
ccaa7754 1285 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName, PatchPcdSizeVariableName))\r
2f5acc3b 1286 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
f7496d71 1287\r
f51461c8 1288 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG:\r
ccaa7754 1289 key = ".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
7256bd55 1290 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + TokenCName\r
656d2539
CJ
1291 if DatumType == TAB_VOID and Array == '[]':\r
1292 DatumType = [TAB_UINT8, TAB_UINT16][Pcd.DefaultValue[0] == 'L']\r
1293 if DatumType not in TAB_PCD_NUMERIC_TYPES_VOID:\r
1294 DatumType = TAB_UINT8\r
f51461c8
LG
1295 AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array))\r
1296 AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName))\r
1297 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)\r
f7496d71 1298\r
1bfcf64f 1299 ConstFixedPcd = False\r
b23414f6 1300 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD and (key in Info.ConstPcd or (Info.IsLibrary and not Info.ReferenceModules)):\r
1bfcf64f 1301 ConstFixedPcd = True\r
eca980c0
YZ
1302 if key in Info.ConstPcd:\r
1303 Pcd.DefaultValue = Info.ConstPcd[key]\r
656d2539 1304 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
7256bd55
YZ
1305 AutoGenH.Append('#define _PCD_VALUE_%s %s%s\n' %(TokenCName, Type, PcdVariableName))\r
1306 else:\r
1307 AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName, Pcd.DefaultValue))\r
5565a8c4 1308 PcdDataSize = Pcd.GetPcdSize()\r
2f5acc3b 1309 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD:\r
656d2539 1310 if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
1bfcf64f
YZ
1311 if ConstFixedPcd:\r
1312 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
ccaa7754 1313 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName, FixPcdSizeTokenName))\r
1bfcf64f 1314 else:\r
ccaa7754
GL
1315 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName, FixedPcdSizeVariableName))\r
1316 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, FixedPcdSizeVariableName))\r
1bfcf64f
YZ
1317 AutoGenH.Append('extern const UINTN %s; \n' % FixedPcdSizeVariableName)\r
1318 else:\r
1319 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
ccaa7754 1320 AutoGenH.Append('#define %s %s\n' % (GetModeSizeName, FixPcdSizeTokenName))\r
f51461c8
LG
1321\r
1322## Create code for library constructor\r
1323#\r
1324# @param Info The ModuleAutoGen object\r
1325# @param AutoGenC The TemplateString object for C code\r
1326# @param AutoGenH The TemplateString object for header file\r
1327#\r
1328def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):\r
1329 #\r
1330 # Library Constructors\r
1331 #\r
1332 ConstructorPrototypeString = TemplateString()\r
1333 ConstructorCallingString = TemplateString()\r
1334 if Info.IsLibrary:\r
1335 DependentLibraryList = [Info.Module]\r
1336 else:\r
1337 DependentLibraryList = Info.DependentLibraryList\r
1338 for Lib in DependentLibraryList:\r
1339 if len(Lib.ConstructorList) <= 0:\r
1340 continue\r
1341 Dict = {'Function':Lib.ConstructorList}\r
8bb63e37
CJ
1342 if Lib.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1343 ConstructorPrototypeString.Append(gLibraryStructorPrototype[SUP_MODULE_BASE].Replace(Dict))\r
1344 ConstructorCallingString.Append(gLibraryStructorCall[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1345 elif Lib.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8
LG
1346 ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))\r
1347 ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))\r
ccaa7754
GL
1348 elif Lib.ModuleType in [SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER,\r
1349 SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]:\r
f51461c8
LG
1350 ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))\r
1351 ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))\r
ccaa7754 1352 elif Lib.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e
SV
1353 ConstructorPrototypeString.Append(gLibraryStructorPrototype['MM'].Replace(Dict))\r
1354 ConstructorCallingString.Append(gLibraryStructorCall['MM'].Replace(Dict))\r
f51461c8
LG
1355\r
1356 if str(ConstructorPrototypeString) == '':\r
1357 ConstructorPrototypeList = []\r
1358 else:\r
1359 ConstructorPrototypeList = [str(ConstructorPrototypeString)]\r
1360 if str(ConstructorCallingString) == '':\r
1361 ConstructorCallingList = []\r
1362 else:\r
1363 ConstructorCallingList = [str(ConstructorCallingString)]\r
1364\r
1365 Dict = {\r
1366 'Type' : 'Constructor',\r
1367 'FunctionPrototype' : ConstructorPrototypeList,\r
1368 'FunctionCall' : ConstructorCallingList\r
1369 }\r
1370 if Info.IsLibrary:\r
1371 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)\r
1372 else:\r
8bb63e37
CJ
1373 if Info.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1374 AutoGenC.Append(gLibraryString[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1375 elif Info.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8 1376 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))\r
ccaa7754
GL
1377 elif Info.ModuleType in [SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER,\r
1378 SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]:\r
f51461c8 1379 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))\r
ccaa7754 1380 elif Info.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e 1381 AutoGenC.Append(gLibraryString['MM'].Replace(Dict))\r
f51461c8
LG
1382\r
1383## Create code for library destructor\r
1384#\r
1385# @param Info The ModuleAutoGen object\r
1386# @param AutoGenC The TemplateString object for C code\r
1387# @param AutoGenH The TemplateString object for header file\r
1388#\r
1389def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):\r
1390 #\r
1391 # Library Destructors\r
1392 #\r
1393 DestructorPrototypeString = TemplateString()\r
1394 DestructorCallingString = TemplateString()\r
1395 if Info.IsLibrary:\r
1396 DependentLibraryList = [Info.Module]\r
1397 else:\r
1398 DependentLibraryList = Info.DependentLibraryList\r
1399 for Index in range(len(DependentLibraryList)-1, -1, -1):\r
1400 Lib = DependentLibraryList[Index]\r
1401 if len(Lib.DestructorList) <= 0:\r
1402 continue\r
1403 Dict = {'Function':Lib.DestructorList}\r
8bb63e37
CJ
1404 if Lib.ModuleType in [SUP_MODULE_BASE, SUP_MODULE_SEC]:\r
1405 DestructorPrototypeString.Append(gLibraryStructorPrototype[SUP_MODULE_BASE].Replace(Dict))\r
1406 DestructorCallingString.Append(gLibraryStructorCall[SUP_MODULE_BASE].Replace(Dict))\r
88c6c1b6 1407 elif Lib.ModuleType in SUP_MODULE_SET_PEI:\r
f51461c8
LG
1408 DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))\r
1409 DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))\r
ccaa7754
GL
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 DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))\r
1413 DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))\r
ccaa7754 1414 elif Lib.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]:\r
5a9c3e3e
SV
1415 DestructorPrototypeString.Append(gLibraryStructorPrototype['MM'].Replace(Dict))\r
1416 DestructorCallingString.Append(gLibraryStructorCall['MM'].Replace(Dict))\r
f51461c8
LG
1417\r
1418 if str(DestructorPrototypeString) == '':\r
1419 DestructorPrototypeList = []\r
1420 else:\r
1421 DestructorPrototypeList = [str(DestructorPrototypeString)]\r
1422 if str(DestructorCallingString) == '':\r
1423 DestructorCallingList = []\r
1424 else:\r
1425 DestructorCallingList = [str(DestructorCallingString)]\r
1426\r
1427 Dict = {\r
1428 'Type' : 'Destructor',\r
1429 'FunctionPrototype' : DestructorPrototypeList,\r
1430 'FunctionCall' : DestructorCallingList\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
ccaa7754
GL
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
ccaa7754 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\r
1446## Create code for ModuleEntryPoint\r
1447#\r
1448# @param Info The ModuleAutoGen object\r
1449# @param AutoGenC The TemplateString object for C code\r
1450# @param AutoGenH The TemplateString object for header file\r
1451#\r
1452def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1453 if Info.IsLibrary or Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_SEC]:\r
f51461c8
LG
1454 return\r
1455 #\r
1456 # Module Entry Points\r
1457 #\r
1458 NumEntryPoints = len(Info.Module.ModuleEntryPointList)\r
1459 if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification:\r
1460 PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION']\r
1461 else:\r
1462 PiSpecVersion = '0x00000000'\r
1463 if 'UEFI_SPECIFICATION_VERSION' in Info.Module.Specification:\r
1464 UefiSpecVersion = Info.Module.Specification['UEFI_SPECIFICATION_VERSION']\r
1465 else:\r
1466 UefiSpecVersion = '0x00000000'\r
1467 Dict = {\r
1468 'Function' : Info.Module.ModuleEntryPointList,\r
1469 'PiSpecVersion' : PiSpecVersion + 'U',\r
1470 'UefiSpecVersion': UefiSpecVersion + 'U'\r
1471 }\r
1472\r
8bb63e37 1473 if Info.ModuleType in [SUP_MODULE_PEI_CORE, SUP_MODULE_DXE_CORE, SUP_MODULE_SMM_CORE, SUP_MODULE_MM_CORE_STANDALONE]:\r
128d435f 1474 if Info.SourceFileList:\r
f51461c8
LG
1475 if NumEntryPoints != 1:\r
1476 EdkLogger.error(\r
1477 "build",\r
1478 AUTOGEN_ERROR,\r
1479 '%s must have exactly one entry point' % Info.ModuleType,\r
1480 File=str(Info),\r
1481 ExtraData= ", ".join(Info.Module.ModuleEntryPointList)\r
1482 )\r
8bb63e37 1483 if Info.ModuleType == SUP_MODULE_PEI_CORE:\r
f51461c8
LG
1484 AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict))\r
1485 AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict))\r
8bb63e37 1486 elif Info.ModuleType == SUP_MODULE_DXE_CORE:\r
f51461c8
LG
1487 AutoGenC.Append(gDxeCoreEntryPointString.Replace(Dict))\r
1488 AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict))\r
8bb63e37 1489 elif Info.ModuleType == SUP_MODULE_SMM_CORE:\r
f51461c8
LG
1490 AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict))\r
1491 AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict))\r
8bb63e37 1492 elif Info.ModuleType == SUP_MODULE_MM_CORE_STANDALONE:\r
5a9c3e3e
SV
1493 AutoGenC.Append(gMmCoreStandaloneEntryPointString.Replace(Dict))\r
1494 AutoGenH.Append(gMmCoreStandaloneEntryPointPrototype.Replace(Dict))\r
8bb63e37 1495 elif Info.ModuleType == SUP_MODULE_PEIM:\r
f51461c8
LG
1496 if NumEntryPoints < 2:\r
1497 AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict))\r
1498 else:\r
1499 AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict))\r
1500 AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict))\r
ccaa7754 1501 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
1502 if NumEntryPoints < 2:\r
1503 AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict))\r
1504 else:\r
1505 AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict))\r
1506 AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict))\r
8bb63e37 1507 elif Info.ModuleType == SUP_MODULE_DXE_SMM_DRIVER:\r
f51461c8
LG
1508 if NumEntryPoints == 0:\r
1509 AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict))\r
1510 else:\r
1511 AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict))\r
5a9c3e3e 1512 AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict))\r
8bb63e37 1513 elif Info.ModuleType == SUP_MODULE_MM_STANDALONE:\r
5a9c3e3e
SV
1514 if NumEntryPoints < 2:\r
1515 AutoGenC.Append(gMmStandaloneEntryPointString[NumEntryPoints].Replace(Dict))\r
1516 else:\r
1517 AutoGenC.Append(gMmStandaloneEntryPointString[2].Replace(Dict))\r
1518 AutoGenH.Append(gMmStandaloneEntryPointPrototype.Replace(Dict))\r
8bb63e37 1519 elif Info.ModuleType == SUP_MODULE_UEFI_APPLICATION:\r
f51461c8
LG
1520 if NumEntryPoints < 2:\r
1521 AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict))\r
1522 else:\r
1523 AutoGenC.Append(gUefiApplicationEntryPointString[2].Replace(Dict))\r
1524 AutoGenH.Append(gUefiApplicationEntryPointPrototype.Replace(Dict))\r
1525\r
1526## Create code for ModuleUnloadImage\r
1527#\r
1528# @param Info The ModuleAutoGen object\r
1529# @param AutoGenC The TemplateString object for C code\r
1530# @param AutoGenH The TemplateString object for header file\r
1531#\r
1532def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1533 if Info.IsLibrary or Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_SEC]:\r
f51461c8
LG
1534 return\r
1535 #\r
1536 # Unload Image Handlers\r
1537 #\r
1538 NumUnloadImage = len(Info.Module.ModuleUnloadImageList)\r
1539 Dict = {'Count':str(NumUnloadImage) + 'U', 'Function':Info.Module.ModuleUnloadImageList}\r
1540 if NumUnloadImage < 2:\r
1541 AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict))\r
1542 else:\r
1543 AutoGenC.Append(gUefiUnloadImageString[2].Replace(Dict))\r
1544 AutoGenH.Append(gUefiUnloadImagePrototype.Replace(Dict))\r
1545\r
1546## Create code for GUID\r
1547#\r
1548# @param Info The ModuleAutoGen object\r
1549# @param AutoGenC The TemplateString object for C code\r
1550# @param AutoGenH The TemplateString object for header file\r
1551#\r
1552def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1553 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
91fa33ee 1554 GuidType = TAB_GUID\r
f51461c8
LG
1555 else:\r
1556 GuidType = "EFI_GUID"\r
1557\r
1558 if Info.GuidList:\r
7beed8a3
YZ
1559 if not Info.IsLibrary:\r
1560 AutoGenC.Append("\n// Guids\n")\r
8262037f 1561 AutoGenH.Append("\n// Guids\n")\r
f51461c8
LG
1562 #\r
1563 # GUIDs\r
1564 #\r
1565 for Key in Info.GuidList:\r
7beed8a3
YZ
1566 if not Info.IsLibrary:\r
1567 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.GuidList[Key]))\r
8262037f 1568 AutoGenH.Append('extern %s %s;\n' % (GuidType, Key))\r
f51461c8
LG
1569\r
1570## Create code for protocol\r
1571#\r
1572# @param Info The ModuleAutoGen object\r
1573# @param AutoGenC The TemplateString object for C code\r
1574# @param AutoGenH The TemplateString object for header file\r
1575#\r
1576def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1577 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
91fa33ee 1578 GuidType = TAB_GUID\r
f51461c8
LG
1579 else:\r
1580 GuidType = "EFI_GUID"\r
1581\r
1582 if Info.ProtocolList:\r
7beed8a3
YZ
1583 if not Info.IsLibrary:\r
1584 AutoGenC.Append("\n// Protocols\n")\r
8262037f 1585 AutoGenH.Append("\n// Protocols\n")\r
f51461c8
LG
1586 #\r
1587 # Protocol GUIDs\r
1588 #\r
1589 for Key in Info.ProtocolList:\r
7beed8a3
YZ
1590 if not Info.IsLibrary:\r
1591 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.ProtocolList[Key]))\r
8262037f 1592 AutoGenH.Append('extern %s %s;\n' % (GuidType, Key))\r
f51461c8
LG
1593\r
1594## Create code for PPI\r
1595#\r
1596# @param Info The ModuleAutoGen object\r
1597# @param AutoGenC The TemplateString object for C code\r
1598# @param AutoGenH The TemplateString object for header file\r
1599#\r
1600def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH):\r
8bb63e37 1601 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
91fa33ee 1602 GuidType = TAB_GUID\r
f51461c8
LG
1603 else:\r
1604 GuidType = "EFI_GUID"\r
1605\r
1606 if Info.PpiList:\r
7beed8a3
YZ
1607 if not Info.IsLibrary:\r
1608 AutoGenC.Append("\n// PPIs\n")\r
8262037f 1609 AutoGenH.Append("\n// PPIs\n")\r
f51461c8
LG
1610 #\r
1611 # PPI GUIDs\r
1612 #\r
1613 for Key in Info.PpiList:\r
7beed8a3
YZ
1614 if not Info.IsLibrary:\r
1615 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.PpiList[Key]))\r
8262037f 1616 AutoGenH.Append('extern %s %s;\n' % (GuidType, Key))\r
f51461c8
LG
1617\r
1618## Create code for PCD\r
1619#\r
1620# @param Info The ModuleAutoGen object\r
1621# @param AutoGenC The TemplateString object for C code\r
1622# @param AutoGenH The TemplateString object for header file\r
1623#\r
1624def CreatePcdCode(Info, AutoGenC, AutoGenH):\r
1625\r
1626 # Collect Token Space GUIDs used by DynamicEc PCDs\r
1627 TokenSpaceList = []\r
1628 for Pcd in Info.ModulePcdList:\r
eece4292 1629 if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET and Pcd.TokenSpaceGuidCName not in TokenSpaceList:\r
caf74495 1630 TokenSpaceList.append(Pcd.TokenSpaceGuidCName)\r
f7496d71 1631\r
8518bf0b
LG
1632 SkuMgr = Info.Workspace.Platform.SkuIdMgr\r
1633 AutoGenH.Append("\n// Definition of SkuId Array\n")\r
1634 AutoGenH.Append("extern UINT64 _gPcd_SkuId_Array[];\n")\r
f51461c8 1635 # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found\r
72fbe88d 1636 if TokenSpaceList:\r
f51461c8 1637 AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n")\r
8bb63e37 1638 if Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_BASE]:\r
91fa33ee 1639 GuidType = TAB_GUID\r
f51461c8 1640 else:\r
f7496d71 1641 GuidType = "EFI_GUID"\r
f51461c8
LG
1642 for Item in TokenSpaceList:\r
1643 AutoGenH.Append('extern %s %s;\n' % (GuidType, Item))\r
1644\r
1645 if Info.IsLibrary:\r
1646 if Info.ModulePcdList:\r
1647 AutoGenH.Append("\n// PCD definitions\n")\r
1648 for Pcd in Info.ModulePcdList:\r
1649 CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd)\r
1650 DynExPcdTokenNumberMapping (Info, AutoGenH)\r
1651 else:\r
8518bf0b
LG
1652 AutoGenC.Append("\n// Definition of SkuId Array\n")\r
1653 AutoGenC.Append("GLOBAL_REMOVE_IF_UNREFERENCED UINT64 _gPcd_SkuId_Array[] = %s;\n" % SkuMgr.DumpSkuIdArrary())\r
f51461c8
LG
1654 if Info.ModulePcdList:\r
1655 AutoGenH.Append("\n// Definition of PCDs used in this module\n")\r
1656 AutoGenC.Append("\n// Definition of PCDs used in this module\n")\r
1657 for Pcd in Info.ModulePcdList:\r
1658 CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd)\r
1659 DynExPcdTokenNumberMapping (Info, AutoGenH)\r
1660 if Info.LibraryPcdList:\r
1661 AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n")\r
1662 AutoGenC.Append("\n// Definition of PCDs used in libraries\n")\r
1663 for Pcd in Info.LibraryPcdList:\r
1664 CreateModulePcdCode(Info, AutoGenC, AutoGenC, Pcd)\r
1665 CreatePcdDatabaseCode(Info, AutoGenC, AutoGenH)\r
1666\r
1667## Create code for unicode string definition\r
1668#\r
1669# @param Info The ModuleAutoGen object\r
1670# @param AutoGenC The TemplateString object for C code\r
1671# @param AutoGenH The TemplateString object for header file\r
1672# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True\r
1673# @param UniGenBinBuffer Buffer to store uni string package data\r
1674#\r
1675def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer):\r
1676 WorkingDir = os.getcwd()\r
1677 os.chdir(Info.WorkspaceDir)\r
1678\r
1679 IncList = [Info.MetaFile.Dir]\r
1680 # Get all files under [Sources] section in inf file for EDK-II module\r
1681 EDK2Module = True\r
1682 SrcList = [F for F in Info.SourceFileList]\r
1683 if Info.AutoGenVersion < 0x00010005:\r
1684 EDK2Module = False\r
1685 # Get all files under the module directory for EDK-I module\r
1686 Cwd = os.getcwd()\r
1687 os.chdir(Info.MetaFile.Dir)\r
1688 for Root, Dirs, Files in os.walk("."):\r
1689 if 'CVS' in Dirs:\r
1690 Dirs.remove('CVS')\r
1691 if '.svn' in Dirs:\r
1692 Dirs.remove('.svn')\r
1693 for File in Files:\r
1694 File = PathClass(os.path.join(Root, File), Info.MetaFile.Dir)\r
1695 if File in SrcList:\r
1696 continue\r
1697 SrcList.append(File)\r
1698 os.chdir(Cwd)\r
1699\r
1700 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-c') > -1:\r
1701 CompatibleMode = True\r
1702 else:\r
1703 CompatibleMode = False\r
1704\r
1705 #\r
1706 # -s is a temporary option dedicated for building .UNI files with ISO 639-2 language codes of EDK Shell in EDK2\r
1707 #\r
1708 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1:\r
1709 if CompatibleMode:\r
1710 EdkLogger.error("build", AUTOGEN_ERROR,\r
1711 "-c and -s build options should be used exclusively",\r
1712 ExtraData="[%s]" % str(Info))\r
1713 ShellMode = True\r
1714 else:\r
1715 ShellMode = False\r
1716\r
1717 #RFC4646 is only for EDKII modules and ISO639-2 for EDK modules\r
1718 if EDK2Module:\r
1719 FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.RFCLanguages]\r
1720 else:\r
1721 FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.ISOLanguages]\r
1722 Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer, FilterInfo)\r
1723 if CompatibleMode or UniGenCFlag:\r
1724 AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")\r
1725 AutoGenC.Append(Code)\r
1726 AutoGenC.Append("\n")\r
1727 AutoGenH.Append("\n//\n//Unicode String ID\n//\n")\r
1728 AutoGenH.Append(Header)\r
1729 if CompatibleMode or UniGenCFlag:\r
1730 AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)\r
1731 os.chdir(WorkingDir)\r
1732\r
333ba578
YZ
1733def CreateIdfFileCode(Info, AutoGenC, StringH, IdfGenCFlag, IdfGenBinBuffer):\r
1734 if len(Info.IdfFileList) > 0:\r
1735 ImageFiles = IdfFileClassObject(sorted (Info.IdfFileList))\r
1736 if ImageFiles.ImageFilesDict:\r
1737 Index = 1\r
1738 PaletteIndex = 1\r
1739 IncList = [Info.MetaFile.Dir]\r
1740 SrcList = [F for F in Info.SourceFileList]\r
1741 SkipList = ['.jpg', '.png', '.bmp', '.inf', '.idf']\r
1742 FileList = GetFileList(SrcList, IncList, SkipList)\r
1743 ValueStartPtr = 60\r
1744 StringH.Append("\n//\n//Image ID\n//\n")\r
1745 ImageInfoOffset = 0\r
1746 PaletteInfoOffset = 0\r
1747 ImageBuffer = pack('x')\r
1748 PaletteBuffer = pack('x')\r
1749 BufferStr = ''\r
1750 PaletteStr = ''\r
6d034a2a 1751 FileDict = {}\r
333ba578
YZ
1752 for Idf in ImageFiles.ImageFilesDict:\r
1753 if ImageFiles.ImageFilesDict[Idf]:\r
1754 for FileObj in ImageFiles.ImageFilesDict[Idf]:\r
1755 for sourcefile in Info.SourceFileList:\r
1756 if FileObj.FileName == sourcefile.File:\r
1757 if not sourcefile.Ext.upper() in ['.PNG', '.BMP', '.JPG']:\r
1758 EdkLogger.error("build", AUTOGEN_ERROR, "The %s's postfix must be one of .bmp, .jpg, .png" % (FileObj.FileName), ExtraData="[%s]" % str(Info))\r
1759 FileObj.File = sourcefile\r
1760 break\r
1761 else:\r
1762 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
1763\r
1764 for FileObj in ImageFiles.ImageFilesDict[Idf]:\r
1765 ID = FileObj.ImageID\r
1766 File = FileObj.File\r
1767 if not os.path.exists(File.Path) or not os.path.isfile(File.Path):\r
1768 EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=File.Path)\r
1769 SearchImageID (FileObj, FileList)\r
1770 if FileObj.Referenced:\r
1771 if (ValueStartPtr - len(DEFINE_STR + ID)) <= 0:\r
1772 Line = DEFINE_STR + ' ' + ID + ' ' + DecToHexStr(Index, 4) + '\n'\r
1773 else:\r
1774 Line = DEFINE_STR + ' ' + ID + ' ' * (ValueStartPtr - len(DEFINE_STR + ID)) + DecToHexStr(Index, 4) + '\n'\r
1775\r
6d034a2a
YZ
1776 if File not in FileDict:\r
1777 FileDict[File] = Index\r
1778 else:\r
1779 DuplicateBlock = pack('B', EFI_HII_IIBT_DUPLICATE)\r
1780 DuplicateBlock += pack('H', FileDict[File])\r
1781 ImageBuffer += DuplicateBlock\r
1782 BufferStr = WriteLine(BufferStr, '// %s: %s: %s' % (DecToHexStr(Index, 4), ID, DecToHexStr(Index, 4)))\r
1783 TempBufferList = AscToHexList(DuplicateBlock)\r
1784 BufferStr = WriteLine(BufferStr, CreateArrayItem(TempBufferList, 16) + '\n')\r
1785 StringH.Append(Line)\r
1786 Index += 1\r
1787 continue\r
1788\r
333ba578
YZ
1789 TmpFile = open(File.Path, 'rb')\r
1790 Buffer = TmpFile.read()\r
1791 TmpFile.close()\r
1792 if File.Ext.upper() == '.PNG':\r
1793 TempBuffer = pack('B', EFI_HII_IIBT_IMAGE_PNG)\r
1794 TempBuffer += pack('I', len(Buffer))\r
1795 TempBuffer += Buffer\r
1796 elif File.Ext.upper() == '.JPG':\r
1797 ImageType, = struct.unpack('4s', Buffer[6:10])\r
86e6cf98 1798 if ImageType != b'JFIF':\r
333ba578
YZ
1799 EdkLogger.error("build", FILE_TYPE_MISMATCH, "The file %s is not a standard JPG file." % File.Path)\r
1800 TempBuffer = pack('B', EFI_HII_IIBT_IMAGE_JPEG)\r
1801 TempBuffer += pack('I', len(Buffer))\r
1802 TempBuffer += Buffer\r
1803 elif File.Ext.upper() == '.BMP':\r
1804 TempBuffer, TempPalette = BmpImageDecoder(File, Buffer, PaletteIndex, FileObj.TransParent)\r
1805 if len(TempPalette) > 1:\r
1806 PaletteIndex += 1\r
e148e6e9
YZ
1807 NewPalette = pack('H', len(TempPalette))\r
1808 NewPalette += TempPalette\r
1809 PaletteBuffer += NewPalette\r
333ba578 1810 PaletteStr = WriteLine(PaletteStr, '// %s: %s: %s' % (DecToHexStr(PaletteIndex - 1, 4), ID, DecToHexStr(PaletteIndex - 1, 4)))\r
e148e6e9 1811 TempPaletteList = AscToHexList(NewPalette)\r
333ba578
YZ
1812 PaletteStr = WriteLine(PaletteStr, CreateArrayItem(TempPaletteList, 16) + '\n')\r
1813 ImageBuffer += TempBuffer\r
1814 BufferStr = WriteLine(BufferStr, '// %s: %s: %s' % (DecToHexStr(Index, 4), ID, DecToHexStr(Index, 4)))\r
1815 TempBufferList = AscToHexList(TempBuffer)\r
1816 BufferStr = WriteLine(BufferStr, CreateArrayItem(TempBufferList, 16) + '\n')\r
1817\r
1818 StringH.Append(Line)\r
1819 Index += 1\r
1820\r
1821 BufferStr = WriteLine(BufferStr, '// End of the Image Info')\r
1822 BufferStr = WriteLine(BufferStr, CreateArrayItem(DecToHexList(EFI_HII_IIBT_END, 2)) + '\n')\r
1823 ImageEnd = pack('B', EFI_HII_IIBT_END)\r
1824 ImageBuffer += ImageEnd\r
1825\r
1826 if len(ImageBuffer) > 1:\r
1827 ImageInfoOffset = 12\r
1828 if len(PaletteBuffer) > 1:\r
1829 PaletteInfoOffset = 12 + len(ImageBuffer) - 1 # -1 is for the first empty pad byte of ImageBuffer\r
1830\r
1831 IMAGE_PACKAGE_HDR = pack('=II', ImageInfoOffset, PaletteInfoOffset)\r
1832 # PACKAGE_HEADER_Length = PACKAGE_HEADER + ImageInfoOffset + PaletteInfoOffset + ImageBuffer Length + PaletteCount + PaletteBuffer Length\r
1833 if len(PaletteBuffer) > 1:\r
1834 PACKAGE_HEADER_Length = 4 + 4 + 4 + len(ImageBuffer) - 1 + 2 + len(PaletteBuffer) - 1\r
1835 else:\r
1836 PACKAGE_HEADER_Length = 4 + 4 + 4 + len(ImageBuffer) - 1\r
1837 if PaletteIndex > 1:\r
1838 PALETTE_INFO_HEADER = pack('H', PaletteIndex - 1)\r
1839 # EFI_HII_PACKAGE_HEADER length max value is 0xFFFFFF\r
1840 Hex_Length = '%06X' % PACKAGE_HEADER_Length\r
1841 if PACKAGE_HEADER_Length > 0xFFFFFF:\r
1842 EdkLogger.error("build", AUTOGEN_ERROR, "The Length of EFI_HII_PACKAGE_HEADER exceed its maximum value", ExtraData="[%s]" % str(Info))\r
1843 PACKAGE_HEADER = pack('=HBB', int('0x' + Hex_Length[2:], 16), int('0x' + Hex_Length[0:2], 16), EFI_HII_PACKAGE_IMAGES)\r
1844\r
1845 IdfGenBinBuffer.write(PACKAGE_HEADER)\r
1846 IdfGenBinBuffer.write(IMAGE_PACKAGE_HDR)\r
1847 if len(ImageBuffer) > 1 :\r
1848 IdfGenBinBuffer.write(ImageBuffer[1:])\r
1849 if PaletteIndex > 1:\r
1850 IdfGenBinBuffer.write(PALETTE_INFO_HEADER)\r
1851 if len(PaletteBuffer) > 1:\r
1852 IdfGenBinBuffer.write(PaletteBuffer[1:])\r
1853\r
1854 if IdfGenCFlag:\r
1855 TotalLength = EFI_HII_ARRAY_SIZE_LENGTH + PACKAGE_HEADER_Length\r
1856 AutoGenC.Append("\n//\n//Image Pack Definition\n//\n")\r
1857 AllStr = WriteLine('', CHAR_ARRAY_DEFIN + ' ' + Info.Module.BaseName + 'Images' + '[] = {\n')\r
1858 AllStr = WriteLine(AllStr, '// STRGATHER_OUTPUT_HEADER')\r
1859 AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(TotalLength)) + '\n')\r
1860 AllStr = WriteLine(AllStr, '// Image PACKAGE HEADER\n')\r
1861 IMAGE_PACKAGE_HDR_List = AscToHexList(PACKAGE_HEADER)\r
1862 IMAGE_PACKAGE_HDR_List += AscToHexList(IMAGE_PACKAGE_HDR)\r
1863 AllStr = WriteLine(AllStr, CreateArrayItem(IMAGE_PACKAGE_HDR_List, 16) + '\n')\r
1864 AllStr = WriteLine(AllStr, '// Image DATA\n')\r
1865 if BufferStr:\r
1866 AllStr = WriteLine(AllStr, BufferStr)\r
1867 if PaletteStr:\r
1868 AllStr = WriteLine(AllStr, '// Palette Header\n')\r
1869 PALETTE_INFO_HEADER_List = AscToHexList(PALETTE_INFO_HEADER)\r
1870 AllStr = WriteLine(AllStr, CreateArrayItem(PALETTE_INFO_HEADER_List, 16) + '\n')\r
1871 AllStr = WriteLine(AllStr, '// Palette Data\n')\r
1872 AllStr = WriteLine(AllStr, PaletteStr)\r
1873 AllStr = WriteLine(AllStr, '};')\r
1874 AutoGenC.Append(AllStr)\r
1875 AutoGenC.Append("\n")\r
1876 StringH.Append('\nextern unsigned char ' + Info.Module.BaseName + 'Images[];\n')\r
1877 StringH.Append("\n#define IMAGE_ARRAY_NAME %sImages\n" % Info.Module.BaseName)\r
1878\r
1879# typedef struct _EFI_HII_IMAGE_PACKAGE_HDR {\r
1880# EFI_HII_PACKAGE_HEADER Header; # Standard package header, where Header.Type = EFI_HII_PACKAGE_IMAGES\r
1881# UINT32 ImageInfoOffset;\r
1882# UINT32 PaletteInfoOffset;\r
1883# } EFI_HII_IMAGE_PACKAGE_HDR;\r
1884\r
1885# typedef struct {\r
1886# UINT32 Length:24;\r
1887# UINT32 Type:8;\r
1888# UINT8 Data[];\r
1889# } EFI_HII_PACKAGE_HEADER;\r
1890\r
1891# typedef struct _EFI_HII_IMAGE_BLOCK {\r
1892# UINT8 BlockType;\r
1893# UINT8 BlockBody[];\r
1894# } EFI_HII_IMAGE_BLOCK;\r
1895\r
1896def BmpImageDecoder(File, Buffer, PaletteIndex, TransParent):\r
1897 ImageType, = struct.unpack('2s', Buffer[0:2])\r
86e6cf98 1898 if ImageType!= b'BM': # BMP file type is 'BM'\r
333ba578 1899 EdkLogger.error("build", FILE_TYPE_MISMATCH, "The file %s is not a standard BMP file." % File.Path)\r
ccaa7754 1900 BMP_IMAGE_HEADER = collections.namedtuple('BMP_IMAGE_HEADER', ['bfSize', 'bfReserved1', 'bfReserved2', 'bfOffBits', 'biSize', 'biWidth', 'biHeight', 'biPlanes', 'biBitCount', 'biCompression', 'biSizeImage', 'biXPelsPerMeter', 'biYPelsPerMeter', 'biClrUsed', 'biClrImportant'])\r
333ba578
YZ
1901 BMP_IMAGE_HEADER_STRUCT = struct.Struct('IHHIIIIHHIIIIII')\r
1902 BmpHeader = BMP_IMAGE_HEADER._make(BMP_IMAGE_HEADER_STRUCT.unpack_from(Buffer[2:]))\r
1903 #\r
1904 # Doesn't support compress.\r
1905 #\r
1906 if BmpHeader.biCompression != 0:\r
1907 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The compress BMP file %s is not support." % File.Path)\r
1908\r
1909 # The Width and Height is UINT16 type in Image Package\r
1910 if BmpHeader.biWidth > 0xFFFF:\r
1911 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The BMP file %s Width is exceed 0xFFFF." % File.Path)\r
1912 if BmpHeader.biHeight > 0xFFFF:\r
1913 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The BMP file %s Height is exceed 0xFFFF." % File.Path)\r
1914\r
1915 PaletteBuffer = pack('x')\r
1916 if BmpHeader.biBitCount == 1:\r
1917 if TransParent:\r
1918 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_1BIT_TRANS)\r
1919 else:\r
1920 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_1BIT)\r
1921 ImageBuffer += pack('B', PaletteIndex)\r
1922 Width = (BmpHeader.biWidth + 7)/8\r
1923 if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
1924 PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
1925 elif BmpHeader.biBitCount == 4:\r
1926 if TransParent:\r
1927 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_4BIT_TRANS)\r
1928 else:\r
1929 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_4BIT)\r
1930 ImageBuffer += pack('B', PaletteIndex)\r
1931 Width = (BmpHeader.biWidth + 1)/2\r
1932 if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
1933 PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
1934 elif BmpHeader.biBitCount == 8:\r
1935 if TransParent:\r
1936 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_8BIT_TRANS)\r
1937 else:\r
1938 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_8BIT)\r
1939 ImageBuffer += pack('B', PaletteIndex)\r
1940 Width = BmpHeader.biWidth\r
1941 if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
1942 PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
1943 elif BmpHeader.biBitCount == 24:\r
1944 if TransParent:\r
1945 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_24BIT_TRANS)\r
1946 else:\r
1947 ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_24BIT)\r
1948 Width = BmpHeader.biWidth * 3\r
1949 else:\r
1950 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "Only support the 1 bit, 4 bit, 8bit, 24 bit BMP files.", ExtraData="[%s]" % str(File.Path))\r
1951\r
1952 ImageBuffer += pack('H', BmpHeader.biWidth)\r
1953 ImageBuffer += pack('H', BmpHeader.biHeight)\r
1954 Start = BmpHeader.bfOffBits\r
1955 End = BmpHeader.bfSize - 1\r
1956 for Height in range(0, BmpHeader.biHeight):\r
1957 if Width % 4 != 0:\r
1958 Start = End + (Width % 4) - 4 - Width\r
1959 else:\r
1960 Start = End - Width\r
1961 ImageBuffer += Buffer[Start + 1 : Start + Width + 1]\r
1962 End = Start\r
1963\r
1964 # 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
1965 if PaletteBuffer and len(PaletteBuffer) > 1:\r
1966 PaletteTemp = pack('x')\r
1967 for Index in range(0, len(PaletteBuffer)):\r
1968 if Index % 4 == 3:\r
1969 continue\r
86e6cf98 1970 PaletteTemp += bytes([PaletteBuffer[Index]])\r
333ba578
YZ
1971 PaletteBuffer = PaletteTemp[1:]\r
1972 return ImageBuffer, PaletteBuffer\r
1973\r
f51461c8
LG
1974## Create common code\r
1975#\r
1976# @param Info The ModuleAutoGen object\r
1977# @param AutoGenC The TemplateString object for C code\r
1978# @param AutoGenH The TemplateString object for header file\r
1979#\r
1980def CreateHeaderCode(Info, AutoGenC, AutoGenH):\r
1981 # file header\r
1982 AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'}))\r
1983 # header file Prologue\r
ccaa7754 1984 AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-', '_')}))\r
f51461c8
LG
1985 AutoGenH.Append(gAutoGenHCppPrologueString)\r
1986 if Info.AutoGenVersion >= 0x00010005:\r
1987 # header files includes\r
b1aff264 1988 if Info.ModuleType in gModuleTypeHeaderFile:\r
f51461c8
LG
1989 AutoGenH.Append("#include <%s>\n" % gModuleTypeHeaderFile[Info.ModuleType][0])\r
1990 #\r
f7496d71 1991 # if either PcdLib in [LibraryClasses] sections or there exist Pcd section, add PcdLib.h\r
f51461c8
LG
1992 # As if modules only uses FixedPcd, then PcdLib is not needed in [LibraryClasses] section.\r
1993 #\r
1994 if 'PcdLib' in Info.Module.LibraryClasses or Info.Module.Pcds:\r
1995 AutoGenH.Append("#include <Library/PcdLib.h>\n")\r
1996\r
1997 AutoGenH.Append('\nextern GUID gEfiCallerIdGuid;')\r
1998 AutoGenH.Append('\nextern CHAR8 *gEfiCallerBaseName;\n\n')\r
1999\r
2000 if Info.IsLibrary:\r
2001 return\r
2002\r
2003 AutoGenH.Append("#define EFI_CALLER_ID_GUID \\\n %s\n" % GuidStringToGuidStructureString(Info.Guid))\r
2004\r
2005 if Info.IsLibrary:\r
2006 return\r
2007 # C file header\r
2008 AutoGenC.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.c'}))\r
2009 if Info.AutoGenVersion >= 0x00010005:\r
2010 # C file header files includes\r
2011 if Info.ModuleType in gModuleTypeHeaderFile:\r
2012 for Inc in gModuleTypeHeaderFile[Info.ModuleType]:\r
2013 AutoGenC.Append("#include <%s>\n" % Inc)\r
2014 else:\r
2015 AutoGenC.Append("#include <%s>\n" % gBasicHeaderFile)\r
2016\r
2017 #\r
2018 # Publish the CallerId Guid\r
2019 #\r
2020 AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid))\r
2021 AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *gEfiCallerBaseName = "%s";\n' % Info.Name)\r
2022\r
2023## Create common code for header file\r
2024#\r
2025# @param Info The ModuleAutoGen object\r
2026# @param AutoGenC The TemplateString object for C code\r
2027# @param AutoGenH The TemplateString object for header file\r
2028#\r
2029def CreateFooterCode(Info, AutoGenC, AutoGenH):\r
2030 AutoGenH.Append(gAutoGenHEpilogueString)\r
2031\r
2032## Create code for a module\r
2033#\r
2034# @param Info The ModuleAutoGen object\r
2035# @param AutoGenC The TemplateString object for C code\r
2036# @param AutoGenH The TemplateString object for header file\r
333ba578 2037# @param StringH The TemplateString object for header file\r
f51461c8
LG
2038# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True\r
2039# @param UniGenBinBuffer Buffer to store uni string package data\r
333ba578
YZ
2040# @param StringIdf The TemplateString object for header file\r
2041# @param IdfGenCFlag IdfString is generated into AutoGen C file when it is set to True\r
2042# @param IdfGenBinBuffer Buffer to store Idf string package data\r
f51461c8 2043#\r
333ba578 2044def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer, StringIdf, IdfGenCFlag, IdfGenBinBuffer):\r
f51461c8
LG
2045 CreateHeaderCode(Info, AutoGenC, AutoGenH)\r
2046\r
2047 if Info.AutoGenVersion >= 0x00010005:\r
2048 CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH)\r
2049 CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH)\r
2050 CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH)\r
2051 CreatePcdCode(Info, AutoGenC, AutoGenH)\r
2052 CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH)\r
2053 CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH)\r
2054 CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH)\r
2055 CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH)\r
2056\r
2057 if Info.UnicodeFileList:\r
2058 FileName = "%sStrDefs.h" % Info.Name\r
2059 StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))\r
ccaa7754 2060 StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-', '_')}))\r
f51461c8 2061 CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer)\r
8200fcfe
YL
2062\r
2063 GuidMacros = []\r
2064 for Guid in Info.Module.Guids:\r
2065 if Guid in Info.Module.GetGuidsUsedByPcd():\r
2066 continue\r
2067 GuidMacros.append('#define %s %s' % (Guid, Info.Module.Guids[Guid]))\r
00fcce91 2068 for Guid, Value in list(Info.Module.Protocols.items()) + list(Info.Module.Ppis.items()):\r
8200fcfe 2069 GuidMacros.append('#define %s %s' % (Guid, Value))\r
58cf30f7 2070 # supports FixedAtBuild and FeaturePcd usage in VFR file\r
5b97eb4c
YZ
2071 if Info.VfrFileList and Info.ModulePcdList:\r
2072 GuidMacros.append('#define %s %s' % ('FixedPcdGetBool(TokenName)', '_PCD_VALUE_##TokenName'))\r
2073 GuidMacros.append('#define %s %s' % ('FixedPcdGet8(TokenName)', '_PCD_VALUE_##TokenName'))\r
2074 GuidMacros.append('#define %s %s' % ('FixedPcdGet16(TokenName)', '_PCD_VALUE_##TokenName'))\r
2075 GuidMacros.append('#define %s %s' % ('FixedPcdGet32(TokenName)', '_PCD_VALUE_##TokenName'))\r
2076 GuidMacros.append('#define %s %s' % ('FixedPcdGet64(TokenName)', '_PCD_VALUE_##TokenName'))\r
58cf30f7 2077 GuidMacros.append('#define %s %s' % ('FeaturePcdGet(TokenName)', '_PCD_VALUE_##TokenName'))\r
5b97eb4c 2078 for Pcd in Info.ModulePcdList:\r
58cf30f7 2079 if Pcd.Type in [TAB_PCDS_FIXED_AT_BUILD, TAB_PCDS_FEATURE_FLAG]:\r
5b97eb4c
YZ
2080 TokenCName = Pcd.TokenCName\r
2081 Value = Pcd.DefaultValue\r
2082 if Pcd.DatumType == 'BOOLEAN':\r
2083 BoolValue = Value.upper()\r
2084 if BoolValue == 'TRUE':\r
2085 Value = '1'\r
2086 elif BoolValue == 'FALSE':\r
2087 Value = '0'\r
2088 for PcdItem in GlobalData.MixedPcd:\r
2089 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
2090 TokenCName = PcdItem[0]\r
2091 break\r
2092 GuidMacros.append('#define %s %s' % ('_PCD_VALUE_'+TokenCName, Value))\r
2093\r
bc7d95c0
YZ
2094 if Info.IdfFileList:\r
2095 GuidMacros.append('#include "%sImgDefs.h"' % Info.Name)\r
2096\r
8200fcfe
YL
2097 if GuidMacros:\r
2098 StringH.Append('\n#ifdef VFRCOMPILE\n%s\n#endif\n' % '\n'.join(GuidMacros))\r
2099\r
f51461c8
LG
2100 StringH.Append("\n#endif\n")\r
2101 AutoGenH.Append('#include "%s"\n' % FileName)\r
2102\r
333ba578
YZ
2103 if Info.IdfFileList:\r
2104 FileName = "%sImgDefs.h" % Info.Name\r
2105 StringIdf.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))\r
ccaa7754 2106 StringIdf.Append(gAutoGenHPrologueString.Replace({'File':'IMAGEDEFS', 'Guid':Info.Guid.replace('-', '_')}))\r
333ba578
YZ
2107 CreateIdfFileCode(Info, AutoGenC, StringIdf, IdfGenCFlag, IdfGenBinBuffer)\r
2108\r
2109 StringIdf.Append("\n#endif\n")\r
2110 AutoGenH.Append('#include "%s"\n' % FileName)\r
2111\r
f51461c8
LG
2112 CreateFooterCode(Info, AutoGenC, AutoGenH)\r
2113\r
2114 # no generation of AutoGen.c for Edk modules without unicode file\r
2115 if Info.AutoGenVersion < 0x00010005 and len(Info.UnicodeFileList) == 0:\r
2116 AutoGenC.String = ''\r
2117\r
2118## Create the code file\r
2119#\r
2120# @param FilePath The path of code file\r
2121# @param Content The content of code file\r
2122# @param IsBinaryFile The flag indicating if the file is binary file or not\r
2123#\r
2124# @retval True If file content is changed or file doesn't exist\r
2125# @retval False If the file exists and the content is not changed\r
2126#\r
2127def Generate(FilePath, Content, IsBinaryFile):\r
2128 return SaveFileOnChange(FilePath, Content, IsBinaryFile)\r
2129\r