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