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