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