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