]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/GenC.py
Sync BaseTool trunk (version r2423) into EDKII BaseTools. The change mainly includes:
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenC.py
CommitLineData
30fdf114
LG
1## @file
2# Routines for generating AutoGen.h and AutoGen.c
3#
da92f276 4# Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
40d841f6 5# This program and the accompanying materials
30fdf114
LG
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#
16import string
17
18from Common import EdkLogger
19
20from Common.BuildToolError import *
21from Common.DataType import *
22from Common.Misc import *
23from Common.String import StringToArray
24from StrGather import *
25
26## PCD type string
27gItemTypeStringDatabase = {
28 TAB_PCDS_FEATURE_FLAG : 'FixedAtBuild',
29 TAB_PCDS_FIXED_AT_BUILD : 'FixedAtBuild',
30 TAB_PCDS_PATCHABLE_IN_MODULE: 'BinaryPatch',
31 TAB_PCDS_DYNAMIC : '',
32 TAB_PCDS_DYNAMIC_DEFAULT : '',
33 TAB_PCDS_DYNAMIC_VPD : '',
34 TAB_PCDS_DYNAMIC_HII : '',
35 TAB_PCDS_DYNAMIC_EX : '',
36 TAB_PCDS_DYNAMIC_EX_DEFAULT : '',
37 TAB_PCDS_DYNAMIC_EX_VPD : '',
38 TAB_PCDS_DYNAMIC_EX_HII : '',
39}
40
41## Dynamic PCD types
42gDynamicPcd = [TAB_PCDS_DYNAMIC, TAB_PCDS_DYNAMIC_DEFAULT, TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_HII]
43
44## Dynamic-ex PCD types
45gDynamicExPcd = [TAB_PCDS_DYNAMIC_EX, TAB_PCDS_DYNAMIC_EX_DEFAULT, TAB_PCDS_DYNAMIC_EX_VPD, TAB_PCDS_DYNAMIC_EX_HII]
46
47## Datum size
48gDatumSizeStringDatabase = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOLEAN','VOID*':'8'}
49gDatumSizeStringDatabaseH = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOL','VOID*':'PTR'}
50gDatumSizeStringDatabaseLib = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'Bool','VOID*':'Ptr'}
51
52## Mapping between PCD driver type and EFI phase
53gPcdPhaseMap = {
54 "PEI_PCD_DRIVER" : "PEI",
55 "DXE_PCD_DRIVER" : "DXE"
56}
57
58gPcdDatabaseCommonAutoGenH = """
59//
60// The following definition will be generated by build tool
61//
62
63//
64// Common definitions
65//
66typedef UINT8 SKU_ID;
67
68#define PCD_TYPE_SHIFT 28
69
b36d134f
LG
70#define PCD_TYPE_DATA (0x0U << PCD_TYPE_SHIFT)
71#define PCD_TYPE_HII (0x8U << PCD_TYPE_SHIFT)
72#define PCD_TYPE_VPD (0x4U << PCD_TYPE_SHIFT)
73#define PCD_TYPE_SKU_ENABLED (0x2U << PCD_TYPE_SHIFT)
74#define PCD_TYPE_STRING (0x1U << PCD_TYPE_SHIFT)
30fdf114
LG
75
76#define PCD_TYPE_ALL_SET (PCD_TYPE_DATA | PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED | PCD_TYPE_STRING)
77
78#define PCD_DATUM_TYPE_SHIFT 24
79
b36d134f
LG
80#define PCD_DATUM_TYPE_POINTER (0x0U << PCD_DATUM_TYPE_SHIFT)
81#define PCD_DATUM_TYPE_UINT8 (0x1U << PCD_DATUM_TYPE_SHIFT)
82#define PCD_DATUM_TYPE_UINT16 (0x2U << PCD_DATUM_TYPE_SHIFT)
83#define PCD_DATUM_TYPE_UINT32 (0x4U << PCD_DATUM_TYPE_SHIFT)
84#define PCD_DATUM_TYPE_UINT64 (0x8U << PCD_DATUM_TYPE_SHIFT)
30fdf114
LG
85
86#define PCD_DATUM_TYPE_ALL_SET (PCD_DATUM_TYPE_POINTER | \\
87 PCD_DATUM_TYPE_UINT8 | \\
88 PCD_DATUM_TYPE_UINT16 | \\
89 PCD_DATUM_TYPE_UINT32 | \\
90 PCD_DATUM_TYPE_UINT64)
91
92#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_ALL_SET | PCD_DATUM_TYPE_ALL_SET))
93
94typedef struct {
95 UINT32 ExTokenNumber;
96 UINT16 LocalTokenNumber; // PCD Number of this particular platform build
97 UINT16 ExGuidIndex; // Index of GuidTable
98} DYNAMICEX_MAPPING;
99
100typedef struct {
101 UINT32 SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler
102 UINT32 SkuIdTableOffset; //Offset from the PCD_DB
103} SKU_HEAD;
104
105typedef struct {
106 UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.
107 UINT16 StringIndex; // Offset in String Table in units of UINT16.
108 UINT16 Offset; // Offset in Variable
109 UINT16 DefaultValueOffset; // Offset of the Default Value
110} VARIABLE_HEAD;
111
112typedef struct {
113 UINT32 Offset;
114} VPD_HEAD;
115
116typedef UINT16 STRING_HEAD;
117
118typedef UINT16 SIZE_INFO;
119
120#define offsetof(s,m) (UINT32) (UINTN) &(((s *)0)->m)
121
122"""
123
124gPcdDatabaseEpilogueAutoGenH = """
125typedef struct {
126 PEI_PCD_DATABASE PeiDb;
127 DXE_PCD_DATABASE DxeDb;
128} PCD_DATABASE;
129
130#define PCD_TOTAL_TOKEN_NUMBER (PEI_LOCAL_TOKEN_NUMBER + DXE_LOCAL_TOKEN_NUMBER)
131
132"""
133
134gPcdDatabaseAutoGenH = TemplateString("""
135#define ${PHASE}_GUID_TABLE_SIZE ${GUID_TABLE_SIZE}
136#define ${PHASE}_STRING_TABLE_SIZE ${STRING_TABLE_SIZE}
137#define ${PHASE}_SKUID_TABLE_SIZE ${SKUID_TABLE_SIZE}
138#define ${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE ${LOCAL_TOKEN_NUMBER_TABLE_SIZE}
139#define ${PHASE}_LOCAL_TOKEN_NUMBER ${LOCAL_TOKEN_NUMBER}
140#define ${PHASE}_EXMAPPING_TABLE_SIZE ${EXMAPPING_TABLE_SIZE}
141#define ${PHASE}_EX_TOKEN_NUMBER ${EX_TOKEN_NUMBER}
142#define ${PHASE}_SIZE_TABLE_SIZE ${SIZE_TABLE_SIZE}
143#define ${PHASE}_GUID_TABLE_EMPTY ${GUID_TABLE_EMPTY}
144#define ${PHASE}_STRING_TABLE_EMPTY ${STRING_TABLE_EMPTY}
145#define ${PHASE}_SKUID_TABLE_EMPTY ${SKUID_TABLE_EMPTY}
146#define ${PHASE}_DATABASE_EMPTY ${DATABASE_EMPTY}
147#define ${PHASE}_EXMAP_TABLE_EMPTY ${EXMAP_TABLE_EMPTY}
148
149typedef struct {
150${BEGIN} UINT64 ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}];
151${END}
152${BEGIN} UINT64 ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64};
153${END}
154${BEGIN} UINT32 ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}];
155${END}
156${BEGIN} UINT32 ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32};
157${END}
158${BEGIN} VPD_HEAD ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}];
159${END}
160 DYNAMICEX_MAPPING ExMapTable[${PHASE}_EXMAPPING_TABLE_SIZE];
161 UINT32 LocalTokenNumberTable[${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE];
162 GUID GuidTable[${PHASE}_GUID_TABLE_SIZE];
163${BEGIN} STRING_HEAD ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}];
164${END}
52302d4d 165${BEGIN} VARIABLE_HEAD ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}];
30fdf114
LG
166${END}
167${BEGIN} UINT8 StringTable${STRING_TABLE_INDEX}[${STRING_TABLE_LENGTH}]; /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */
168${END}
169 SIZE_INFO SizeTable[${PHASE}_SIZE_TABLE_SIZE];
170${BEGIN} UINT16 ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}];
171${END}
172${BEGIN} UINT16 ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16};
173${END}
174${BEGIN} UINT8 ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}];
175${END}
176${BEGIN} UINT8 ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8};
177${END}
178${BEGIN} BOOLEAN ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}];
179${END}
180${BEGIN} BOOLEAN ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN};
181${END}
182 UINT8 SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];
183${SYSTEM_SKU_ID}
184} ${PHASE}_PCD_DATABASE_INIT;
185
186typedef struct {
187${PCD_DATABASE_UNINIT_EMPTY}
188${BEGIN} UINT64 ${UNINIT_CNAME_DECL_UINT64}_${UNINIT_GUID_DECL_UINT64}[${UNINIT_NUMSKUS_DECL_UINT64}];
189${END}
190${BEGIN} UINT32 ${UNINIT_CNAME_DECL_UINT32}_${UNINIT_GUID_DECL_UINT32}[${UNINIT_NUMSKUS_DECL_UINT32}];
191${END}
192${BEGIN} UINT16 ${UNINIT_CNAME_DECL_UINT16}_${UNINIT_GUID_DECL_UINT16}[${UNINIT_NUMSKUS_DECL_UINT16}];
193${END}
194${BEGIN} UINT8 ${UNINIT_CNAME_DECL_UINT8}_${UNINIT_GUID_DECL_UINT8}[${UNINIT_NUMSKUS_DECL_UINT8}];
195${END}
196${BEGIN} BOOLEAN ${UNINIT_CNAME_DECL_BOOLEAN}_${UNINIT_GUID_DECL_BOOLEAN}[${UNINIT_NUMSKUS_DECL_BOOLEAN}];
197${END}
198} ${PHASE}_PCD_DATABASE_UNINIT;
199
200#define PCD_${PHASE}_SERVICE_DRIVER_VERSION 2
201
202typedef struct {
203 ${PHASE}_PCD_DATABASE_INIT Init;
204 ${PHASE}_PCD_DATABASE_UNINIT Uninit;
205} ${PHASE}_PCD_DATABASE;
206
207#define ${PHASE}_NEX_TOKEN_NUMBER (${PHASE}_LOCAL_TOKEN_NUMBER - ${PHASE}_EX_TOKEN_NUMBER)
208""")
209
210gEmptyPcdDatabaseAutoGenC = TemplateString("""
211${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
212 /* ExMapTable */
213 {
214 {0, 0, 0}
215 },
216 /* LocalTokenNumberTable */
217 {
218 0
219 },
220 /* GuidTable */
221 {
222 {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
223 },
224 /* StringTable */
225 { 0 },
226 /* SizeTable */
227 {
228 0, 0
229 },
230 /* SkuIdTable */
231 { 0 },
232 ${SYSTEM_SKU_ID_VALUE}
233};
234""")
235
236gPcdDatabaseAutoGenC = TemplateString("""
237${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
238${BEGIN} { ${INIT_VALUE_UINT64} }, /* ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */
239${END}
240${BEGIN} ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */
241${END}
242${BEGIN} { ${INIT_VALUE_UINT32} }, /* ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}] */
243${END}
244${BEGIN} ${VARDEF_VALUE_UINT32}, /* ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32} */
245${END}
246 /* VPD */
247${BEGIN} { ${VPD_HEAD_VALUE} }, /* ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}] */
248${END}
249 /* ExMapTable */
250 {
251${BEGIN} { ${EXMAPPING_TABLE_EXTOKEN}, ${EXMAPPING_TABLE_LOCAL_TOKEN}, ${EXMAPPING_TABLE_GUID_INDEX} },
252${END}
253 },
254 /* LocalTokenNumberTable */
255 {
52302d4d 256${BEGIN} offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}${VARDEF_HEADER}) | ${TOKEN_TYPE},
30fdf114
LG
257${END}
258 },
259 /* GuidTable */
260 {
261${BEGIN} ${GUID_STRUCTURE},
262${END}
263 },
264${BEGIN} { ${STRING_HEAD_VALUE} }, /* ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}] */
265${END}
52302d4d 266${BEGIN} /* ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}] */
30fdf114
LG
267 {
268 ${VARIABLE_HEAD_VALUE}
269 },
270${END}
271 /* StringTable */
272${BEGIN} ${STRING_TABLE_VALUE}, /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */
273${END}
274 /* SizeTable */
275 {
276${BEGIN} ${SIZE_TABLE_MAXIMUM_LENGTH}, ${SIZE_TABLE_CURRENT_LENGTH}, /* ${SIZE_TABLE_CNAME}_${SIZE_TABLE_GUID} */
277${END}
278 },
279${BEGIN} { ${INIT_VALUE_UINT16} }, /* ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}] */
280${END}
281${BEGIN} ${VARDEF_VALUE_UINT16}, /* ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16} */
282${END}
283${BEGIN} { ${INIT_VALUE_UINT8} }, /* ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}] */
284${END}
285${BEGIN} ${VARDEF_VALUE_UINT8}, /* ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8} */
286${END}
287${BEGIN} { ${INIT_VALUE_BOOLEAN} }, /* ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}] */
288${END}
289${BEGIN} ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */
290${END}
291 /* SkuIdTable */
292 { ${BEGIN}${SKUID_VALUE}, ${END} },
293 ${SYSTEM_SKU_ID_VALUE}
294};
295""")
296
297
298## AutoGen File Header Templates
299gAutoGenHeaderString = TemplateString("""\
300/**
301 DO NOT EDIT
302 FILE auto-generated
303 Module name:
304 ${FileName}
305 Abstract: Auto-generated ${FileName} for building module or library.
306**/
307""")
308
309gAutoGenHPrologueString = TemplateString("""
310#ifndef _${File}_${Guid}
311#define _${File}_${Guid}
312
2bcc713e
LG
313""")
314
315gAutoGenHCppPrologueString = """
d40b2ee6
LG
316#ifdef __cplusplus
317extern "C" {
318#endif
319
2bcc713e 320"""
30fdf114
LG
321
322gAutoGenHEpilogueString = """
d40b2ee6
LG
323
324#ifdef __cplusplus
325}
326#endif
327
30fdf114
LG
328#endif
329"""
330
331## PEI Core Entry Point Templates
332gPeiCoreEntryPointPrototype = TemplateString("""
333${BEGIN}
334VOID
335EFIAPI
336${Function} (
337 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
338 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
339 IN VOID *Context
340 );
341${END}
342""")
343
344gPeiCoreEntryPointString = TemplateString("""
345${BEGIN}
346VOID
347EFIAPI
348ProcessModuleEntryPointList (
349 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
350 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
351 IN VOID *Context
352 )
353
354{
355 ${Function} (SecCoreData, PpiList, Context);
356}
357${END}
358""")
359
360
361## DXE Core Entry Point Templates
362gDxeCoreEntryPointPrototype = TemplateString("""
363${BEGIN}
364VOID
365EFIAPI
366${Function} (
367 IN VOID *HobStart
368 );
369${END}
370""")
371
372gDxeCoreEntryPointString = TemplateString("""
373${BEGIN}
374VOID
375EFIAPI
376ProcessModuleEntryPointList (
377 IN VOID *HobStart
378 )
379
380{
381 ${Function} (HobStart);
382}
383${END}
384""")
385
386## PEIM Entry Point Templates
387gPeimEntryPointPrototype = TemplateString("""
388${BEGIN}
389EFI_STATUS
390EFIAPI
391${Function} (
392 IN EFI_PEI_FILE_HANDLE FileHandle,
393 IN CONST EFI_PEI_SERVICES **PeiServices
394 );
395${END}
396""")
397
30fdf114
LG
398gPeimEntryPointString = [
399TemplateString("""
400GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
401
402EFI_STATUS
403EFIAPI
404ProcessModuleEntryPointList (
405 IN EFI_PEI_FILE_HANDLE FileHandle,
406 IN CONST EFI_PEI_SERVICES **PeiServices
407 )
408
409{
410 return EFI_SUCCESS;
411}
412"""),
413TemplateString("""
414GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
415${BEGIN}
416EFI_STATUS
417EFIAPI
418ProcessModuleEntryPointList (
419 IN EFI_PEI_FILE_HANDLE FileHandle,
420 IN CONST EFI_PEI_SERVICES **PeiServices
421 )
422
423{
424 return ${Function} (FileHandle, PeiServices);
425}
426${END}
427"""),
428TemplateString("""
429GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
430
431EFI_STATUS
432EFIAPI
433ProcessModuleEntryPointList (
434 IN EFI_PEI_FILE_HANDLE FileHandle,
435 IN CONST EFI_PEI_SERVICES **PeiServices
436 )
437
438{
439 EFI_STATUS Status;
440 EFI_STATUS CombinedStatus;
441
442 CombinedStatus = EFI_LOAD_ERROR;
443${BEGIN}
444 Status = ${Function} (FileHandle, PeiServices);
445 if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {
446 CombinedStatus = Status;
447 }
448${END}
449 return CombinedStatus;
450}
451""")
452]
453
b303ea72
LG
454## SMM_CORE Entry Point Templates
455gSmmCoreEntryPointPrototype = TemplateString("""
456${BEGIN}
457EFI_STATUS
458EFIAPI
459${Function} (
460 IN EFI_HANDLE ImageHandle,
461 IN EFI_SYSTEM_TABLE *SystemTable
462 );
463${END}
464""")
465
466gSmmCoreEntryPointString = TemplateString("""
467${BEGIN}
52302d4d 468const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
b303ea72
LG
469const UINT32 _gDxeRevision = ${PiSpecVersion};
470
471EFI_STATUS
472EFIAPI
473ProcessModuleEntryPointList (
474 IN EFI_HANDLE ImageHandle,
475 IN EFI_SYSTEM_TABLE *SystemTable
476 )
477{
478 return ${Function} (ImageHandle, SystemTable);
479}
480${END}
481""")
482
30fdf114
LG
483## DXE SMM Entry Point Templates
484gDxeSmmEntryPointPrototype = TemplateString("""
485${BEGIN}
486EFI_STATUS
487EFIAPI
488${Function} (
489 IN EFI_HANDLE ImageHandle,
490 IN EFI_SYSTEM_TABLE *SystemTable
491 );
492${END}
493""")
494
495gDxeSmmEntryPointString = [
496TemplateString("""
52302d4d 497const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
498const UINT32 _gDxeRevision = ${PiSpecVersion};
499
500EFI_STATUS
501EFIAPI
502ProcessModuleEntryPointList (
503 IN EFI_HANDLE ImageHandle,
504 IN EFI_SYSTEM_TABLE *SystemTable
505 )
506
507{
508 return EFI_SUCCESS;
509}
510"""),
511TemplateString("""
52302d4d 512const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
513const UINT32 _gDxeRevision = ${PiSpecVersion};
514
515static BASE_LIBRARY_JUMP_BUFFER mJumpContext;
52302d4d 516static EFI_STATUS mDriverEntryPointStatus;
30fdf114
LG
517
518VOID
519EFIAPI
520ExitDriver (
521 IN EFI_STATUS Status
522 )
523{
524 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {
525 mDriverEntryPointStatus = Status;
526 }
527 LongJump (&mJumpContext, (UINTN)-1);
528 ASSERT (FALSE);
529}
530
531EFI_STATUS
532EFIAPI
533ProcessModuleEntryPointList (
534 IN EFI_HANDLE ImageHandle,
535 IN EFI_SYSTEM_TABLE *SystemTable
536 )
30fdf114 537{
52302d4d
LG
538 mDriverEntryPointStatus = EFI_LOAD_ERROR;
539
30fdf114
LG
540${BEGIN}
541 if (SetJump (&mJumpContext) == 0) {
542 ExitDriver (${Function} (ImageHandle, SystemTable));
543 ASSERT (FALSE);
544 }
545${END}
546
547 return mDriverEntryPointStatus;
548}
549""")
550]
551
552## UEFI Driver Entry Point Templates
553gUefiDriverEntryPointPrototype = TemplateString("""
554${BEGIN}
555EFI_STATUS
556EFIAPI
557${Function} (
558 IN EFI_HANDLE ImageHandle,
559 IN EFI_SYSTEM_TABLE *SystemTable
560 );
561${END}
562""")
563
564gUefiDriverEntryPointString = [
565TemplateString("""
52302d4d 566const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
567const UINT32 _gDxeRevision = ${PiSpecVersion};
568
569EFI_STATUS
570EFIAPI
571ProcessModuleEntryPointList (
572 IN EFI_HANDLE ImageHandle,
573 IN EFI_SYSTEM_TABLE *SystemTable
574 )
575{
576 return EFI_SUCCESS;
577}
578"""),
579TemplateString("""
52302d4d 580const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
581const UINT32 _gDxeRevision = ${PiSpecVersion};
582
583${BEGIN}
584EFI_STATUS
585EFIAPI
586ProcessModuleEntryPointList (
587 IN EFI_HANDLE ImageHandle,
588 IN EFI_SYSTEM_TABLE *SystemTable
589 )
590
591{
592 return ${Function} (ImageHandle, SystemTable);
593}
594${END}
595VOID
596EFIAPI
597ExitDriver (
598 IN EFI_STATUS Status
599 )
600{
601 if (EFI_ERROR (Status)) {
602 ProcessLibraryDestructorList (gImageHandle, gST);
603 }
604 gBS->Exit (gImageHandle, Status, 0, NULL);
605}
606"""),
607TemplateString("""
52302d4d 608const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
609const UINT32 _gDxeRevision = ${PiSpecVersion};
610
52302d4d
LG
611static BASE_LIBRARY_JUMP_BUFFER mJumpContext;
612static EFI_STATUS mDriverEntryPointStatus;
613
30fdf114
LG
614EFI_STATUS
615EFIAPI
616ProcessModuleEntryPointList (
617 IN EFI_HANDLE ImageHandle,
618 IN EFI_SYSTEM_TABLE *SystemTable
619 )
30fdf114 620{
52302d4d 621 mDriverEntryPointStatus = EFI_LOAD_ERROR;
30fdf114
LG
622 ${BEGIN}
623 if (SetJump (&mJumpContext) == 0) {
624 ExitDriver (${Function} (ImageHandle, SystemTable));
625 ASSERT (FALSE);
626 }
627 ${END}
628 return mDriverEntryPointStatus;
629}
630
30fdf114
LG
631VOID
632EFIAPI
633ExitDriver (
634 IN EFI_STATUS Status
635 )
636{
637 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {
638 mDriverEntryPointStatus = Status;
639 }
640 LongJump (&mJumpContext, (UINTN)-1);
641 ASSERT (FALSE);
642}
643""")
644]
645
646
647## UEFI Application Entry Point Templates
648gUefiApplicationEntryPointPrototype = TemplateString("""
649${BEGIN}
650EFI_STATUS
651EFIAPI
652${Function} (
653 IN EFI_HANDLE ImageHandle,
654 IN EFI_SYSTEM_TABLE *SystemTable
655 );
656${END}
657""")
658
659gUefiApplicationEntryPointString = [
660TemplateString("""
52302d4d 661const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
662
663EFI_STATUS
664EFIAPI
665ProcessModuleEntryPointList (
666 IN EFI_HANDLE ImageHandle,
667 IN EFI_SYSTEM_TABLE *SystemTable
668 )
669{
670 return EFI_SUCCESS;
671}
672"""),
673TemplateString("""
52302d4d 674const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
675
676${BEGIN}
677EFI_STATUS
678EFIAPI
679ProcessModuleEntryPointList (
680 IN EFI_HANDLE ImageHandle,
681 IN EFI_SYSTEM_TABLE *SystemTable
682 )
683
684{
685 return ${Function} (ImageHandle, SystemTable);
686}
687${END}
688VOID
689EFIAPI
690ExitDriver (
691 IN EFI_STATUS Status
692 )
693{
694 if (EFI_ERROR (Status)) {
695 ProcessLibraryDestructorList (gImageHandle, gST);
696 }
697 gBS->Exit (gImageHandle, Status, 0, NULL);
698}
699"""),
700TemplateString("""
52302d4d 701const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
30fdf114
LG
702
703EFI_STATUS
704EFIAPI
705ProcessModuleEntryPointList (
706 IN EFI_HANDLE ImageHandle,
707 IN EFI_SYSTEM_TABLE *SystemTable
708 )
709
710{
711 ${BEGIN}
712 if (SetJump (&mJumpContext) == 0) {
713 ExitDriver (${Function} (ImageHandle, SystemTable));
714 ASSERT (FALSE);
715 }
716 ${END}
717 return mDriverEntryPointStatus;
718}
719
720static BASE_LIBRARY_JUMP_BUFFER mJumpContext;
721static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;
722
723VOID
724EFIAPI
725ExitDriver (
726 IN EFI_STATUS Status
727 )
728{
729 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {
730 mDriverEntryPointStatus = Status;
731 }
732 LongJump (&mJumpContext, (UINTN)-1);
733 ASSERT (FALSE);
734}
735""")
736]
737
738## UEFI Unload Image Templates
739gUefiUnloadImagePrototype = TemplateString("""
740${BEGIN}
741EFI_STATUS
742EFIAPI
743${Function} (
744 IN EFI_HANDLE ImageHandle
745 );
746${END}
747""")
748
749gUefiUnloadImageString = [
750TemplateString("""
751GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};
752
753EFI_STATUS
754EFIAPI
755ProcessModuleUnloadList (
756 IN EFI_HANDLE ImageHandle
757 )
758{
759 return EFI_SUCCESS;
760}
761"""),
762TemplateString("""
763GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};
764
765${BEGIN}
766EFI_STATUS
767EFIAPI
768ProcessModuleUnloadList (
769 IN EFI_HANDLE ImageHandle
770 )
771{
772 return ${Function} (ImageHandle);
773}
774${END}
775"""),
776TemplateString("""
777GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};
778
779EFI_STATUS
780EFIAPI
781ProcessModuleUnloadList (
782 IN EFI_HANDLE ImageHandle
783 )
784{
785 EFI_STATUS Status;
786
787 Status = EFI_SUCCESS;
788${BEGIN}
789 if (EFI_ERROR (Status)) {
790 ${Function} (ImageHandle);
791 } else {
792 Status = ${Function} (ImageHandle);
793 }
794${END}
795 return Status;
796}
797""")
798]
799
800gLibraryStructorPrototype = {
801'BASE' : TemplateString("""${BEGIN}
802RETURN_STATUS
803EFIAPI
804${Function} (
805 VOID
806 );${END}
807"""),
808
809'PEI' : TemplateString("""${BEGIN}
810EFI_STATUS
811EFIAPI
812${Function} (
813 IN EFI_PEI_FILE_HANDLE FileHandle,
814 IN CONST EFI_PEI_SERVICES **PeiServices
815 );${END}
816"""),
817
818'DXE' : TemplateString("""${BEGIN}
819EFI_STATUS
820EFIAPI
821${Function} (
822 IN EFI_HANDLE ImageHandle,
823 IN EFI_SYSTEM_TABLE *SystemTable
824 );${END}
825"""),
826}
827
828gLibraryStructorCall = {
829'BASE' : TemplateString("""${BEGIN}
830 Status = ${Function} ();
831 ASSERT_EFI_ERROR (Status);${END}
832"""),
833
834'PEI' : TemplateString("""${BEGIN}
835 Status = ${Function} (FileHandle, PeiServices);
836 ASSERT_EFI_ERROR (Status);${END}
837"""),
838
839'DXE' : TemplateString("""${BEGIN}
840 Status = ${Function} (ImageHandle, SystemTable);
841 ASSERT_EFI_ERROR (Status);${END}
842"""),
843}
844
845## Library Constructor and Destructor Templates
846gLibraryString = {
847'BASE' : TemplateString("""
848${BEGIN}${FunctionPrototype}${END}
849
850VOID
851EFIAPI
852ProcessLibrary${Type}List (
853 VOID
854 )
855{
856${BEGIN} EFI_STATUS Status;
857${FunctionCall}${END}
858}
859"""),
860
861'PEI' : TemplateString("""
862${BEGIN}${FunctionPrototype}${END}
863
864VOID
865EFIAPI
866ProcessLibrary${Type}List (
867 IN EFI_PEI_FILE_HANDLE FileHandle,
868 IN CONST EFI_PEI_SERVICES **PeiServices
869 )
870{
871${BEGIN} EFI_STATUS Status;
872${FunctionCall}${END}
873}
874"""),
875
876'DXE' : TemplateString("""
877${BEGIN}${FunctionPrototype}${END}
878
879VOID
880EFIAPI
881ProcessLibrary${Type}List (
882 IN EFI_HANDLE ImageHandle,
883 IN EFI_SYSTEM_TABLE *SystemTable
884 )
885{
886${BEGIN} EFI_STATUS Status;
887${FunctionCall}${END}
888}
889"""),
890}
891
30fdf114
LG
892gBasicHeaderFile = "Base.h"
893
894gModuleTypeHeaderFile = {
895 "BASE" : [gBasicHeaderFile],
896 "SEC" : ["PiPei.h", "Library/DebugLib.h"],
897 "PEI_CORE" : ["PiPei.h", "Library/DebugLib.h", "Library/PeiCoreEntryPoint.h"],
898 "PEIM" : ["PiPei.h", "Library/DebugLib.h", "Library/PeimEntryPoint.h"],
899 "DXE_CORE" : ["PiDxe.h", "Library/DebugLib.h", "Library/DxeCoreEntryPoint.h"],
900 "DXE_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
901 "DXE_SMM_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
902 "DXE_RUNTIME_DRIVER": ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
903 "DXE_SAL_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
904 "UEFI_DRIVER" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
905 "UEFI_APPLICATION" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"],
b303ea72 906 "SMM_CORE" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"],
30fdf114
LG
907 "USER_DEFINED" : [gBasicHeaderFile]
908}
909
910## Create code for module PCDs
911#
912# @param Info The ModuleAutoGen object
913# @param AutoGenC The TemplateString object for C code
914# @param AutoGenH The TemplateString object for header file
915# @param Pcd The PCD object
916#
917def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
918 TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[Pcd.TokenSpaceGuidCName]
919 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber
920 #
921 # Write PCDs
922 #
923 PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName
924 if Pcd.Type in gDynamicExPcd:
925 TokenNumber = int(Pcd.TokenValue, 0)
926 else:
927 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
928 EdkLogger.error("build", AUTOGEN_ERROR,
929 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
930 ExtraData="[%s]" % str(Info))
931 TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]
d40b2ee6 932 AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber))
30fdf114
LG
933
934 EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + Pcd.TokenCName + "." + Pcd.TokenSpaceGuidCName)
935 if Pcd.Type not in gItemTypeStringDatabase:
936 EdkLogger.error("build", AUTOGEN_ERROR,
937 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
938 ExtraData="[%s]" % str(Info))
939 if Pcd.DatumType not in gDatumSizeStringDatabase:
940 EdkLogger.error("build", AUTOGEN_ERROR,
941 "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
942 ExtraData="[%s]" % str(Info))
943
944 DatumSize = gDatumSizeStringDatabase[Pcd.DatumType]
945 DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType]
946 GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName
947 SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName
948
949 if Pcd.Type in gDynamicExPcd:
950 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
951 if Pcd.DatumType == 'VOID*':
952 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
953 else:
954 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
955 elif Pcd.Type in gDynamicPcd:
956 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))
957 if Pcd.DatumType == 'VOID*':
958 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))
959 else:
960 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))
961 else:
962 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + Pcd.TokenCName
963 Const = 'const'
964 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
965 Const = ''
966 Type = ''
967 Array = ''
52302d4d 968 Value = Pcd.DefaultValue
30fdf114 969 Unicode = False
52302d4d 970 ValueNumber = 0
0d2711a6
LG
971
972 if Pcd.DatumType == 'BOOLEAN':
973 BoolValue = Value.upper()
974 if BoolValue == 'TRUE':
d40b2ee6 975 Value = '1U'
0d2711a6 976 elif BoolValue == 'FALSE':
d40b2ee6 977 Value = '0U'
0d2711a6 978
52302d4d
LG
979 if Pcd.DatumType in ['UINT64', 'UINT32', 'UINT16', 'UINT8']:
980 try:
981 if Value.upper().startswith('0X'):
982 ValueNumber = int (Value, 16)
983 else:
984 ValueNumber = int (Value)
985 except:
986 EdkLogger.error("build", AUTOGEN_ERROR,
987 "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
988 ExtraData="[%s]" % str(Info))
989 if Pcd.DatumType == 'UINT64':
990 if ValueNumber < 0:
991 EdkLogger.error("build", AUTOGEN_ERROR,
992 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
993 ExtraData="[%s]" % str(Info))
994 elif ValueNumber >= 0x10000000000000000:
995 EdkLogger.error("build", AUTOGEN_ERROR,
996 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
997 ExtraData="[%s]" % str(Info))
998 if not Value.endswith('ULL'):
999 Value += 'ULL'
1000 elif Pcd.DatumType == 'UINT32':
1001 if ValueNumber < 0:
1002 EdkLogger.error("build", AUTOGEN_ERROR,
1003 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1004 ExtraData="[%s]" % str(Info))
1005 elif ValueNumber >= 0x100000000:
1006 EdkLogger.error("build", AUTOGEN_ERROR,
1007 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1008 ExtraData="[%s]" % str(Info))
d40b2ee6
LG
1009 if not Value.endswith('U'):
1010 Value += 'U'
52302d4d
LG
1011 elif Pcd.DatumType == 'UINT16':
1012 if ValueNumber < 0:
1013 EdkLogger.error("build", AUTOGEN_ERROR,
1014 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1015 ExtraData="[%s]" % str(Info))
1016 elif ValueNumber >= 0x10000:
1017 EdkLogger.error("build", AUTOGEN_ERROR,
1018 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1019 ExtraData="[%s]" % str(Info))
d40b2ee6
LG
1020 if not Value.endswith('U'):
1021 Value += 'U'
52302d4d
LG
1022 elif Pcd.DatumType == 'UINT8':
1023 if ValueNumber < 0:
1024 EdkLogger.error("build", AUTOGEN_ERROR,
1025 "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1026 ExtraData="[%s]" % str(Info))
1027 elif ValueNumber >= 0x100:
1028 EdkLogger.error("build", AUTOGEN_ERROR,
1029 "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1030 ExtraData="[%s]" % str(Info))
d40b2ee6
LG
1031 if not Value.endswith('U'):
1032 Value += 'U'
30fdf114
LG
1033 if Pcd.DatumType == 'VOID*':
1034 if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '':
1035 EdkLogger.error("build", AUTOGEN_ERROR,
1036 "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1037 ExtraData="[%s]" % str(Info))
1038
1039 ArraySize = int(Pcd.MaxDatumSize, 0)
1040 if Value[0] == '{':
1041 Type = '(VOID *)'
52302d4d 1042 else:
30fdf114
LG
1043 if Value[0] == 'L':
1044 Unicode = True
1045 Value = Value.lstrip('L') #.strip('"')
1046 Value = eval(Value) # translate escape character
1047 NewValue = '{'
1048 for Index in range(0,len(Value)):
1049 if Unicode:
52302d4d
LG
1050 NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', '
1051 else:
30fdf114 1052 NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', '
52302d4d
LG
1053 if Unicode:
1054 ArraySize = ArraySize / 2;
1055
30fdf114 1056 if ArraySize < (len(Value) + 1):
e56468c0 1057 EdkLogger.error("build", AUTOGEN_ERROR,
1058 "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1059 ExtraData="[%s]" % str(Info))
52302d4d 1060 Value = NewValue + '0 }'
30fdf114
LG
1061 Array = '[%d]' % ArraySize
1062 #
1063 # skip casting for fixed at build since it breaks ARM assembly.
1064 # Long term we need PCD macros that work in assembly
1065 #
1066 elif Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
1067 Value = "((%s)%s)" % (Pcd.DatumType, Value)
1068
1069 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
1070 PcdValueName = '_PCD_PATCHABLE_VALUE_' + Pcd.TokenCName
1071 else:
1072 PcdValueName = '_PCD_VALUE_' + Pcd.TokenCName
1073
52302d4d
LG
1074 if Pcd.DatumType == 'VOID*':
1075 #
1076 # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.
1077 #
1078 if Unicode:
1079 AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))
1080 AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName))
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 AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))
30fdf114
LG
1084 else:
1085 AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))
1086 AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName))
1087 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))
1088 AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array))
1089 AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))
1090 elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
1091 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))
52302d4d 1092 AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
30fdf114
LG
1093 AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
1094 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))
1095 else:
1096 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))
1097 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
1098 AutoGenH.Append('extern %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
1099 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))
1100
1101 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
1102 if Pcd.DatumType == 'VOID*':
1103 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtr(_gPcd_BinaryPatch_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeName, Pcd.TokenCName, Pcd.TokenCName))
1104 else:
1105 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))
1106 else:
1107 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)
1108
1109## Create code for library module PCDs
1110#
1111# @param Info The ModuleAutoGen object
1112# @param AutoGenC The TemplateString object for C code
1113# @param AutoGenH The TemplateString object for header file
1114# @param Pcd The PCD object
1115#
1116def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
1117 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber
1118 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
1119 TokenCName = Pcd.TokenCName
1120 TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[TokenSpaceGuidCName]
1121 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
1122 EdkLogger.error("build", AUTOGEN_ERROR,
1123 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1124 ExtraData="[%s]" % str(Info))
1125 TokenNumber = PcdTokenNumber[TokenCName, TokenSpaceGuidCName]
1126
da92f276
LG
1127 # If PCD is DynamicEx, then use TokenNumber declared in DEC file
1128 if Pcd.Type in gDynamicExPcd:
1129 TokenNumber = int(Pcd.TokenValue, 0)
1130
30fdf114
LG
1131 if Pcd.Type not in gItemTypeStringDatabase:
1132 EdkLogger.error("build", AUTOGEN_ERROR,
1133 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1134 ExtraData="[%s]" % str(Info))
1135 if Pcd.DatumType not in gDatumSizeStringDatabase:
1136 EdkLogger.error("build", AUTOGEN_ERROR,
1137 "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1138 ExtraData="[%s]" % str(Info))
1139
1140 DatumType = Pcd.DatumType
1141 DatumSize = gDatumSizeStringDatabaseH[DatumType]
1142 DatumSizeLib= gDatumSizeStringDatabaseLib[DatumType]
1143 GetModeName = '_PCD_GET_MODE_' + DatumSize + '_' + TokenCName
1144 SetModeName = '_PCD_SET_MODE_' + DatumSize + '_' + TokenCName
1145
1146 Type = ''
1147 Array = ''
1148 if Pcd.DatumType == 'VOID*':
1149 Type = '(VOID *)'
1150 Array = '[]'
1151
d40b2ee6 1152 AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber))
30fdf114
LG
1153
1154 PcdItemType = Pcd.Type
1155 #if PcdItemType in gDynamicPcd:
1156 # PcdItemType = TAB_PCDS_FIXED_AT_BUILD
1157 # if (TokenCName, TokenSpaceGuidCName) in Info.PlatformInfo.Platform.Pcds:
1158 # PcdItemType = Info.PlatformInfo.Platform.Pcds[TokenCName, TokenSpaceGuidCName].Type
1159 if PcdItemType in gDynamicExPcd:
1160 PcdTokenName = '_PCD_TOKEN_' + TokenCName
1161 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
1162 if DatumType == 'VOID*':
1163 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName,DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
1164 else:
1165 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
1166 if PcdItemType in gDynamicPcd:
1167 PcdTokenName = '_PCD_TOKEN_' + TokenCName
1168 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))
1169 if DatumType == 'VOID*':
1170 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))
1171 else:
1172 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))
1173 if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:
1174 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName
1175 AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) )
1176 AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))
1177 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))
1178 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG:
1179 AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array))
1180 #AutoGenH.Append('#define _PCD_VALUE_%s _gPcd_FixedAtBuild_%s\n' %(TokenCName, TokenCName))
1181 AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName))
1182 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)
1183
1184## Create code for PCD database in DXE or PEI phase
1185#
1186# @param Platform The platform object
1187# @retval tuple Two TemplateString objects for C code and header file,
1188# respectively
1189#
1190def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
1191 AutoGenC = TemplateString()
1192 AutoGenH = TemplateString()
1193
1194 Dict = {
1195 'PHASE' : Phase,
1196 'GUID_TABLE_SIZE' : '1',
1197 'STRING_TABLE_SIZE' : '1',
1198 'SKUID_TABLE_SIZE' : '1',
1199 'LOCAL_TOKEN_NUMBER_TABLE_SIZE' : '1',
1200 'LOCAL_TOKEN_NUMBER' : '0',
1201 'EXMAPPING_TABLE_SIZE' : '1',
1202 'EX_TOKEN_NUMBER' : '0',
1203 'SIZE_TABLE_SIZE' : '2',
1204 'GUID_TABLE_EMPTY' : 'TRUE',
1205 'STRING_TABLE_EMPTY' : 'TRUE',
1206 'SKUID_TABLE_EMPTY' : 'TRUE',
1207 'DATABASE_EMPTY' : 'TRUE',
1208 'EXMAP_TABLE_EMPTY' : 'TRUE',
1209 'PCD_DATABASE_UNINIT_EMPTY' : ' UINT8 dummy; /* PCD_DATABASE_UNINIT is emptry */',
1210 'SYSTEM_SKU_ID' : ' SKU_ID SystemSkuId;',
1211 'SYSTEM_SKU_ID_VALUE' : '0'
1212 }
1213
52302d4d 1214 for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN', "VOID*"]:
30fdf114
LG
1215 Dict['VARDEF_CNAME_' + DatumType] = []
1216 Dict['VARDEF_GUID_' + DatumType] = []
1217 Dict['VARDEF_SKUID_' + DatumType] = []
1218 Dict['VARDEF_VALUE_' + DatumType] = []
1219 for Init in ['INIT','UNINIT']:
1220 Dict[Init+'_CNAME_DECL_' + DatumType] = []
1221 Dict[Init+'_GUID_DECL_' + DatumType] = []
1222 Dict[Init+'_NUMSKUS_DECL_' + DatumType] = []
1223 Dict[Init+'_VALUE_' + DatumType] = []
1224
1225 for Type in ['STRING_HEAD','VPD_HEAD','VARIABLE_HEAD']:
1226 Dict[Type + '_CNAME_DECL'] = []
1227 Dict[Type + '_GUID_DECL'] = []
1228 Dict[Type + '_NUMSKUS_DECL'] = []
1229 Dict[Type + '_VALUE'] = []
1230
1231 Dict['STRING_TABLE_INDEX'] = []
1232 Dict['STRING_TABLE_LENGTH'] = []
1233 Dict['STRING_TABLE_CNAME'] = []
1234 Dict['STRING_TABLE_GUID'] = []
1235 Dict['STRING_TABLE_VALUE'] = []
1236
1237 Dict['SIZE_TABLE_CNAME'] = []
1238 Dict['SIZE_TABLE_GUID'] = []
1239 Dict['SIZE_TABLE_CURRENT_LENGTH'] = []
1240 Dict['SIZE_TABLE_MAXIMUM_LENGTH'] = []
1241
1242 Dict['EXMAPPING_TABLE_EXTOKEN'] = []
1243 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'] = []
1244 Dict['EXMAPPING_TABLE_GUID_INDEX'] = []
1245
1246 Dict['GUID_STRUCTURE'] = []
1247
1248 Dict['SKUID_VALUE'] = []
52302d4d 1249 Dict['VARDEF_HEADER'] = []
30fdf114
LG
1250 if Phase == 'DXE':
1251 Dict['SYSTEM_SKU_ID'] = ''
1252 Dict['SYSTEM_SKU_ID_VALUE'] = ''
1253
1254 StringTableIndex = 0
1255 StringTableSize = 0
1256 NumberOfLocalTokens = 0
1257 NumberOfPeiLocalTokens = 0
1258 NumberOfDxeLocalTokens = 0
1259 NumberOfExTokens = 0
1260 NumberOfSizeItems = 0
1261 GuidList = []
9053bc51 1262
30fdf114
LG
1263 for Pcd in Platform.DynamicPcdList:
1264 CName = Pcd.TokenCName
1265 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
1266
1267 EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))
1268 if Pcd.DatumType not in gDatumSizeStringDatabase:
1269 EdkLogger.error("build", AUTOGEN_ERROR,
1270 "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1271 ExtraData="[%s]" % str(Platform))
1272
1273 if Pcd.Phase == 'PEI':
1274 NumberOfPeiLocalTokens += 1
1275 if Pcd.Phase == 'DXE':
1276 NumberOfDxeLocalTokens += 1
1277 if Pcd.Phase != Phase:
1278 continue
1279
1280 #
1281 # TODO: need GetGuidValue() definition
1282 #
1283 TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue
1284 TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure)
1285 if Pcd.Type in gDynamicExPcd:
1286 if TokenSpaceGuid not in GuidList:
1287 GuidList += [TokenSpaceGuid]
1288 Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure)
1289 NumberOfExTokens += 1
1290
1291 ValueList = []
1292 StringHeadOffsetList = []
1293 VpdHeadOffsetList = []
1294 VariableHeadValueList = []
1295 Pcd.InitString = 'UNINIT'
1296
e56468c0 1297 if Pcd.DatumType == 'VOID*':
1298 if Pcd.Type not in ["DynamicVpd", "DynamicExVpd"]:
1299 Pcd.TokenTypeList = ['PCD_TYPE_STRING']
1300 else:
1301 Pcd.TokenTypeList = []
30fdf114
LG
1302 elif Pcd.DatumType == 'BOOLEAN':
1303 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_UINT8']
1304 else:
1305 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType]
1306
1307 if len(Pcd.SkuInfoList) > 1:
1308 Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']
1309
1310 for SkuName in Pcd.SkuInfoList:
1311 Sku = Pcd.SkuInfoList[SkuName]
1312 SkuId = Sku.SkuId
1313 if SkuId == None or SkuId == '':
1314 continue
1315
1316 if SkuId not in Dict['SKUID_VALUE']:
1317 Dict['SKUID_VALUE'].append(SkuId)
1318
1319 SkuIdIndex = Dict['SKUID_VALUE'].index(SkuId)
1320 if len(Sku.VariableName) > 0:
1321 Pcd.TokenTypeList += ['PCD_TYPE_HII']
1322 Pcd.InitString = 'INIT'
1323 VariableNameStructure = StringToArray(Sku.VariableName)
1324 if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:
1325 Dict['STRING_TABLE_CNAME'].append(CName)
1326 Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)
1327 if StringTableIndex == 0:
1328 Dict['STRING_TABLE_INDEX'].append('')
1329 else:
1330 Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)
1331
1332 Dict['STRING_TABLE_LENGTH'].append((len(Sku.VariableName) - 3 + 1) * 2)
1333 Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)
1334 StringTableIndex += 1
1335 StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2
1336
1337 VariableHeadStringIndex = 0
1338 for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):
1339 VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]
1340
1341 VariableGuidStructure = Sku.VariableGuidValue
1342 VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure)
1343 if VariableGuid not in GuidList:
1344 GuidList += [VariableGuid]
1345 Dict['GUID_STRUCTURE'].append(VariableGuidStructure)
1346 VariableHeadGuidIndex = GuidList.index(VariableGuid)
1347
52302d4d
LG
1348 if "PCD_TYPE_STRING" in Pcd.TokenTypeList:
1349 VariableHeadValueList.append('%d, %d, %s, offsetof(%s_PCD_DATABASE, Init.%s_%s)' %
1350 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,
1351 Phase, CName, TokenSpaceGuid))
1352 else:
1353 VariableHeadValueList.append('%d, %d, %s, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s)' %
1354 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,
1355 Phase, CName, TokenSpaceGuid, SkuIdIndex))
30fdf114
LG
1356 Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName)
1357 Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid)
1358 Dict['VARDEF_SKUID_'+Pcd.DatumType].append(SkuIdIndex)
52302d4d
LG
1359 if "PCD_TYPE_STRING" in Pcd.TokenTypeList:
1360 Dict['VARDEF_VALUE_' + Pcd.DatumType].append("%s_%s[%d]" % (Pcd.TokenCName, TokenSpaceGuid, SkuIdIndex))
1361 else:
1362 Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)
30fdf114
LG
1363 elif Sku.VpdOffset != '':
1364 Pcd.TokenTypeList += ['PCD_TYPE_VPD']
1365 Pcd.InitString = 'INIT'
1366 VpdHeadOffsetList.append(Sku.VpdOffset)
9053bc51 1367 continue
52302d4d
LG
1368
1369 if Pcd.DatumType == 'VOID*':
1370 Pcd.TokenTypeList += ['PCD_TYPE_STRING']
1371 Pcd.InitString = 'INIT'
1372 if Sku.HiiDefaultValue != '' and Sku.DefaultValue == '':
1373 Sku.DefaultValue = Sku.HiiDefaultValue
1374 if Sku.DefaultValue != '':
1375 NumberOfSizeItems += 1
1376 Dict['STRING_TABLE_CNAME'].append(CName)
1377 Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)
1378
1379 if StringTableIndex == 0:
1380 Dict['STRING_TABLE_INDEX'].append('')
1381 else:
1382 Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)
1383 if Sku.DefaultValue[0] == 'L':
1384 Size = (len(Sku.DefaultValue) - 3 + 1) * 2
1385 Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))
1386 elif Sku.DefaultValue[0] == '"':
1387 Size = len(Sku.DefaultValue) - 2 + 1
1388 Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))
1389 elif Sku.DefaultValue[0] == '{':
1390 Size = len(Sku.DefaultValue.replace(',',' ').split())
1391 Dict['STRING_TABLE_VALUE'].append(Sku.DefaultValue)
1392
1393 StringHeadOffsetList.append(str(StringTableSize))
1394 Dict['SIZE_TABLE_CNAME'].append(CName)
1395 Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)
1396 Dict['SIZE_TABLE_CURRENT_LENGTH'].append(Size)
1397 Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(Pcd.MaxDatumSize)
1398 if Pcd.MaxDatumSize != '':
1399 MaxDatumSize = int(Pcd.MaxDatumSize, 0)
e56468c0 1400 if MaxDatumSize < Size:
1401 EdkLogger.error("build", AUTOGEN_ERROR,
1402 "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1403 ExtraData="[%s]" % str(Platform))
1404 Size = MaxDatumSize
52302d4d
LG
1405 Dict['STRING_TABLE_LENGTH'].append(Size)
1406 StringTableIndex += 1
1407 StringTableSize += (Size)
30fdf114 1408 else:
52302d4d 1409 if "PCD_TYPE_HII" not in Pcd.TokenTypeList:
30fdf114
LG
1410 Pcd.TokenTypeList += ['PCD_TYPE_DATA']
1411 if Sku.DefaultValue == 'TRUE':
1412 Pcd.InitString = 'INIT'
1413 else:
1414 try:
1415 if int(Sku.DefaultValue, 0) != 0:
1416 Pcd.InitString = 'INIT'
1417 except:
1418 pass
52302d4d
LG
1419
1420 #
1421 # For UNIT64 type PCD's value, ULL should be append to avoid
1422 # warning under linux building environment.
1423 #
1424 if Pcd.DatumType == "UINT64":
1425 ValueList.append(Sku.DefaultValue + "ULL")
d40b2ee6
LG
1426 elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):
1427 ValueList.append(Sku.DefaultValue + "U")
52302d4d
LG
1428 else:
1429 ValueList.append(Sku.DefaultValue)
30fdf114
LG
1430
1431 Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))
52302d4d 1432
30fdf114
LG
1433
1434 if 'PCD_TYPE_HII' in Pcd.TokenTypeList:
1435 Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)
1436 Dict['VARIABLE_HEAD_GUID_DECL'].append(TokenSpaceGuid)
1437 Dict['VARIABLE_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
1438 Dict['VARIABLE_HEAD_VALUE'].append('{ %s }\n' % ' },\n { '.join(VariableHeadValueList))
52302d4d
LG
1439 Dict['VARDEF_HEADER'].append('_Variable_Header')
1440 else:
1441 Dict['VARDEF_HEADER'].append('')
30fdf114
LG
1442 if 'PCD_TYPE_VPD' in Pcd.TokenTypeList:
1443 Dict['VPD_HEAD_CNAME_DECL'].append(CName)
1444 Dict['VPD_HEAD_GUID_DECL'].append(TokenSpaceGuid)
1445 Dict['VPD_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
1446 Dict['VPD_HEAD_VALUE'].append('{ %s }' % ' }, { '.join(VpdHeadOffsetList))
1447 if 'PCD_TYPE_STRING' in Pcd.TokenTypeList:
1448 Dict['STRING_HEAD_CNAME_DECL'].append(CName)
1449 Dict['STRING_HEAD_GUID_DECL'].append(TokenSpaceGuid)
1450 Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
1451 Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList))
1452 if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:
1453 Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName)
1454 Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid)
1455 Dict[Pcd.InitString+'_NUMSKUS_DECL_'+Pcd.DatumType].append(len(Pcd.SkuInfoList))
1456 if Pcd.InitString == 'UNINIT':
1457 Dict['PCD_DATABASE_UNINIT_EMPTY'] = ''
1458 else:
1459 Dict[Pcd.InitString+'_VALUE_'+Pcd.DatumType].append(', '.join(ValueList))
1460
1461 if Phase == 'PEI':
1462 NumberOfLocalTokens = NumberOfPeiLocalTokens
1463 if Phase == 'DXE':
1464 NumberOfLocalTokens = NumberOfDxeLocalTokens
1465
1466 Dict['TOKEN_INIT'] = ['' for x in range(NumberOfLocalTokens)]
1467 Dict['TOKEN_CNAME'] = ['' for x in range(NumberOfLocalTokens)]
1468 Dict['TOKEN_GUID'] = ['' for x in range(NumberOfLocalTokens)]
1469 Dict['TOKEN_TYPE'] = ['' for x in range(NumberOfLocalTokens)]
52302d4d 1470
30fdf114
LG
1471 for Pcd in Platform.DynamicPcdList:
1472 CName = Pcd.TokenCName
1473 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
1474 if Pcd.Phase != Phase:
1475 continue
1476
1477 TokenSpaceGuid = GuidStructureStringToGuidValueName(Pcd.TokenSpaceGuidValue) #(Platform.PackageList, TokenSpaceGuidCName))
1478 GeneratedTokenNumber = Platform.PcdTokenNumber[CName, TokenSpaceGuidCName] - 1
1479 if Phase == 'DXE':
1480 GeneratedTokenNumber -= NumberOfPeiLocalTokens
1481
1482 EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))
1483 EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)
1484 EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))
1485
1486 Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Init'
1487 if Pcd.InitString == 'UNINIT':
1488 Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Uninit'
1489 Dict['TOKEN_CNAME'][GeneratedTokenNumber] = CName
1490 Dict['TOKEN_GUID'][GeneratedTokenNumber] = TokenSpaceGuid
1491 Dict['TOKEN_TYPE'][GeneratedTokenNumber] = ' | '.join(Pcd.TokenTypeList)
1492 if Pcd.Type in gDynamicExPcd:
1493 Dict['EXMAPPING_TABLE_EXTOKEN'].append(Pcd.TokenValue)
1494 if Phase == 'DXE':
1495 GeneratedTokenNumber += NumberOfPeiLocalTokens
1496 #
1497 # Per, PCD architecture specification, PCD Token Number is 1 based and 0 is defined as invalid token number.
1498 # For each EX type PCD, a PCD Token Number is assigned. When the
1499 # PCD Driver/PEIM map EX_GUID and EX_TOKEN_NUMBER to the PCD Token Number,
1500 # the non-EX Protocol/PPI interface can be called to get/set the value. This assumption is made by
1501 # Pcd Driver/PEIM in MdeModulePkg.
1502 # Therefore, 1 is added to GeneratedTokenNumber to generate a PCD Token Number before being inserted
1503 # to the EXMAPPING_TABLE.
1504 #
1505 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(GeneratedTokenNumber + 1)
1506 Dict['EXMAPPING_TABLE_GUID_INDEX'].append(GuidList.index(TokenSpaceGuid))
1507
1508 if GuidList != []:
1509 Dict['GUID_TABLE_EMPTY'] = 'FALSE'
1510 Dict['GUID_TABLE_SIZE'] = len(GuidList)
1511 else:
1512 Dict['GUID_STRUCTURE'] = [GuidStringToGuidStructureString('00000000-0000-0000-0000-000000000000')]
1513
1514 if StringTableIndex == 0:
1515 Dict['STRING_TABLE_INDEX'].append('')
1516 Dict['STRING_TABLE_LENGTH'].append(1)
1517 Dict['STRING_TABLE_CNAME'].append('')
1518 Dict['STRING_TABLE_GUID'].append('')
1519 Dict['STRING_TABLE_VALUE'].append('{ 0 }')
1520 else:
1521 Dict['STRING_TABLE_EMPTY'] = 'FALSE'
1522 Dict['STRING_TABLE_SIZE'] = StringTableSize
1523
1524 if Dict['SIZE_TABLE_CNAME'] == []:
1525 Dict['SIZE_TABLE_CNAME'].append('')
1526 Dict['SIZE_TABLE_GUID'].append('')
1527 Dict['SIZE_TABLE_CURRENT_LENGTH'].append(0)
1528 Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(0)
1529
1530 if NumberOfLocalTokens != 0:
1531 Dict['DATABASE_EMPTY'] = 'FALSE'
1532 Dict['LOCAL_TOKEN_NUMBER_TABLE_SIZE'] = NumberOfLocalTokens
1533 Dict['LOCAL_TOKEN_NUMBER'] = NumberOfLocalTokens
1534
1535 if NumberOfExTokens != 0:
1536 Dict['EXMAP_TABLE_EMPTY'] = 'FALSE'
1537 Dict['EXMAPPING_TABLE_SIZE'] = NumberOfExTokens
1538 Dict['EX_TOKEN_NUMBER'] = NumberOfExTokens
1539 else:
1540 Dict['EXMAPPING_TABLE_EXTOKEN'].append(0)
1541 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(0)
1542 Dict['EXMAPPING_TABLE_GUID_INDEX'].append(0)
1543
1544 if NumberOfSizeItems != 0:
1545 Dict['SIZE_TABLE_SIZE'] = NumberOfSizeItems * 2
1546
1547 AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))
1548 if NumberOfLocalTokens == 0:
1549 AutoGenC.Append(gEmptyPcdDatabaseAutoGenC.Replace(Dict))
1550 else:
1551 AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict))
1552
1553 return AutoGenH, AutoGenC
1554
1555## Create code for PCD database
1556#
1557# @param Info The ModuleAutoGen object
1558# @param AutoGenC The TemplateString object for C code
1559# @param AutoGenH The TemplateString object for header file
1560#
1561def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
1562 if Info.PcdIsDriver == "":
1563 return
1564 if Info.PcdIsDriver not in gPcdPhaseMap:
1565 EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver,
1566 ExtraData="[%s]" % str(Info))
1567
1568 AutoGenH.Append(gPcdDatabaseCommonAutoGenH)
1569 AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')
1570 AutoGenH.Append(AdditionalAutoGenH.String)
1571
1572 Phase = gPcdPhaseMap[Info.PcdIsDriver]
1573 if Phase == 'PEI':
1574 AutoGenC.Append(AdditionalAutoGenC.String)
1575
1576 if Phase == 'DXE':
1577 AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)
1578 AutoGenH.Append(AdditionalAutoGenH.String)
1579 AutoGenC.Append(AdditionalAutoGenC.String)
1580 AutoGenH.Append(gPcdDatabaseEpilogueAutoGenH)
1581
1582## Create code for library constructor
1583#
1584# @param Info The ModuleAutoGen object
1585# @param AutoGenC The TemplateString object for C code
1586# @param AutoGenH The TemplateString object for header file
1587#
1588def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):
1589 #
1590 # Library Constructors
1591 #
1592 ConstructorPrototypeString = TemplateString()
1593 ConstructorCallingString = TemplateString()
1594 if Info.IsLibrary:
1595 DependentLibraryList = [Info.Module]
1596 else:
1597 DependentLibraryList = Info.DependentLibraryList
1598 for Lib in DependentLibraryList:
1599 if len(Lib.ConstructorList) <= 0:
1600 continue
1601 Dict = {'Function':Lib.ConstructorList}
1602 if Lib.ModuleType in ['BASE', 'SEC']:
1603 ConstructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict))
1604 ConstructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict))
1605 elif Lib.ModuleType in ['PEI_CORE','PEIM']:
1606 ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))
1607 ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))
1608 elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
b303ea72 1609 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']:
30fdf114
LG
1610 ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))
1611 ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))
1612
1613 if str(ConstructorPrototypeString) == '':
1614 ConstructorPrototypeList = []
1615 else:
1616 ConstructorPrototypeList = [str(ConstructorPrototypeString)]
1617 if str(ConstructorCallingString) == '':
1618 ConstructorCallingList = []
1619 else:
1620 ConstructorCallingList = [str(ConstructorCallingString)]
1621
1622 Dict = {
1623 'Type' : 'Constructor',
1624 'FunctionPrototype' : ConstructorPrototypeList,
1625 'FunctionCall' : ConstructorCallingList
1626 }
1627 if Info.IsLibrary:
1628 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)
1629 else:
1630 if Info.ModuleType in ['BASE', 'SEC']:
1631 AutoGenC.Append(gLibraryString['BASE'].Replace(Dict))
1632 elif Info.ModuleType in ['PEI_CORE','PEIM']:
1633 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))
1634 elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
b303ea72 1635 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']:
30fdf114
LG
1636 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))
1637
1638## Create code for library destructor
1639#
1640# @param Info The ModuleAutoGen object
1641# @param AutoGenC The TemplateString object for C code
1642# @param AutoGenH The TemplateString object for header file
1643#
1644def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):
1645 #
1646 # Library Destructors
1647 #
1648 DestructorPrototypeString = TemplateString()
1649 DestructorCallingString = TemplateString()
1650 if Info.IsLibrary:
1651 DependentLibraryList = [Info.Module]
1652 else:
1653 DependentLibraryList = Info.DependentLibraryList
1654 for Index in range(len(DependentLibraryList)-1, -1, -1):
1655 Lib = DependentLibraryList[Index]
1656 if len(Lib.DestructorList) <= 0:
1657 continue
1658 Dict = {'Function':Lib.DestructorList}
1659 if Lib.ModuleType in ['BASE', 'SEC']:
1660 DestructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict))
1661 DestructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict))
1662 elif Lib.ModuleType in ['PEI_CORE','PEIM']:
1663 DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))
1664 DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))
1665 elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
b303ea72 1666 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_CORE']:
30fdf114
LG
1667 DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))
1668 DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))
1669
1670 if str(DestructorPrototypeString) == '':
1671 DestructorPrototypeList = []
1672 else:
1673 DestructorPrototypeList = [str(DestructorPrototypeString)]
1674 if str(DestructorCallingString) == '':
1675 DestructorCallingList = []
1676 else:
1677 DestructorCallingList = [str(DestructorCallingString)]
1678
1679 Dict = {
1680 'Type' : 'Destructor',
1681 'FunctionPrototype' : DestructorPrototypeList,
1682 'FunctionCall' : DestructorCallingList
1683 }
1684 if Info.IsLibrary:
1685 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)
1686 else:
1687 if Info.ModuleType in ['BASE', 'SEC']:
1688 AutoGenC.Append(gLibraryString['BASE'].Replace(Dict))
1689 elif Info.ModuleType in ['PEI_CORE','PEIM']:
1690 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))
1691 elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
b303ea72 1692 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']:
30fdf114
LG
1693 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))
1694
1695
1696## Create code for ModuleEntryPoint
1697#
1698# @param Info The ModuleAutoGen object
1699# @param AutoGenC The TemplateString object for C code
1700# @param AutoGenH The TemplateString object for header file
1701#
1702def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):
1703 if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']:
1704 return
1705 #
1706 # Module Entry Points
1707 #
1708 NumEntryPoints = len(Info.Module.ModuleEntryPointList)
1709 if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification:
1710 PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION']
1711 else:
da92f276 1712 PiSpecVersion = '0x00000000'
52302d4d
LG
1713 if 'UEFI_SPECIFICATION_VERSION' in Info.Module.Specification:
1714 UefiSpecVersion = Info.Module.Specification['UEFI_SPECIFICATION_VERSION']
30fdf114 1715 else:
da92f276 1716 UefiSpecVersion = '0x00000000'
30fdf114 1717 Dict = {
52302d4d
LG
1718 'Function' : Info.Module.ModuleEntryPointList,
1719 'PiSpecVersion' : PiSpecVersion,
1720 'UefiSpecVersion': UefiSpecVersion
30fdf114
LG
1721 }
1722
1723 if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE']:
da92f276
LG
1724 if Info.SourceFileList <> None and Info.SourceFileList <> []:
1725 if NumEntryPoints != 1:
1726 EdkLogger.error(
1727 "build",
1728 AUTOGEN_ERROR,
1729 '%s must have exactly one entry point' % Info.ModuleType,
1730 File=str(Info),
1731 ExtraData= ", ".join(Info.Module.ModuleEntryPointList)
1732 )
30fdf114
LG
1733 if Info.ModuleType == 'PEI_CORE':
1734 AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict))
1735 AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict))
1736 elif Info.ModuleType == 'DXE_CORE':
1737 AutoGenC.Append(gDxeCoreEntryPointString.Replace(Dict))
1738 AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict))
1739 elif Info.ModuleType == 'SMM_CORE':
1740 AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict))
b303ea72 1741 AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict))
30fdf114
LG
1742 elif Info.ModuleType == 'PEIM':
1743 if NumEntryPoints < 2:
1744 AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict))
1745 else:
1746 AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict))
1747 AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict))
b303ea72
LG
1748 elif Info.ModuleType in ['DXE_RUNTIME_DRIVER','DXE_DRIVER','DXE_SAL_DRIVER','UEFI_DRIVER']:
1749 if NumEntryPoints < 2:
1750 AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict))
30fdf114 1751 else:
b303ea72
LG
1752 AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict))
1753 AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict))
1754 elif Info.ModuleType == 'DXE_SMM_DRIVER':
1755 if NumEntryPoints == 0:
1756 AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict))
1757 else:
1758 AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict))
1759 AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict))
30fdf114
LG
1760 elif Info.ModuleType == 'UEFI_APPLICATION':
1761 if NumEntryPoints < 2:
1762 AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict))
1763 else:
1764 AutoGenC.Append(gUefiApplicationEntryPointString[2].Replace(Dict))
1765 AutoGenH.Append(gUefiApplicationEntryPointPrototype.Replace(Dict))
1766
1767## Create code for ModuleUnloadImage
1768#
1769# @param Info The ModuleAutoGen object
1770# @param AutoGenC The TemplateString object for C code
1771# @param AutoGenH The TemplateString object for header file
1772#
1773def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH):
1774 if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']:
1775 return
1776 #
1777 # Unload Image Handlers
1778 #
1779 NumUnloadImage = len(Info.Module.ModuleUnloadImageList)
1780 Dict = {'Count':NumUnloadImage, 'Function':Info.Module.ModuleUnloadImageList}
1781 if NumUnloadImage < 2:
1782 AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict))
1783 else:
1784 AutoGenC.Append(gUefiUnloadImageString[2].Replace(Dict))
1785 AutoGenH.Append(gUefiUnloadImagePrototype.Replace(Dict))
1786
1787## Create code for GUID
1788#
1789# @param Info The ModuleAutoGen object
1790# @param AutoGenC The TemplateString object for C code
1791# @param AutoGenH The TemplateString object for header file
1792#
1793def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH):
1794 if Info.IsLibrary:
1795 return
1796
1797 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1798 GuidType = "GUID"
1799 else:
1800 GuidType = "EFI_GUID"
1801
1802 if Info.GuidList:
1803 AutoGenC.Append("\n// Guids\n")
1804 #
1805 # GUIDs
1806 #
1807 for Key in Info.GuidList:
1808 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.GuidList[Key]))
1809
1810## Create code for protocol
1811#
1812# @param Info The ModuleAutoGen object
1813# @param AutoGenC The TemplateString object for C code
1814# @param AutoGenH The TemplateString object for header file
1815#
1816def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH):
1817 if Info.IsLibrary:
1818 return
1819
1820 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1821 GuidType = "GUID"
1822 else:
1823 GuidType = "EFI_GUID"
1824
1825 if Info.ProtocolList:
1826 AutoGenC.Append("\n// Protocols\n")
1827 #
1828 # Protocol GUIDs
1829 #
1830 for Key in Info.ProtocolList:
1831 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.ProtocolList[Key]))
1832
1833## Create code for PPI
1834#
1835# @param Info The ModuleAutoGen object
1836# @param AutoGenC The TemplateString object for C code
1837# @param AutoGenH The TemplateString object for header file
1838#
1839def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH):
1840 if Info.IsLibrary:
1841 return
1842
1843 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1844 GuidType = "GUID"
1845 else:
1846 GuidType = "EFI_GUID"
1847
1848 if Info.PpiList:
1849 AutoGenC.Append("\n// PPIs\n")
1850 #
1851 # PPI GUIDs
1852 #
1853 for Key in Info.PpiList:
1854 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.PpiList[Key]))
1855
1856## Create code for PCD
1857#
1858# @param Info The ModuleAutoGen object
1859# @param AutoGenC The TemplateString object for C code
1860# @param AutoGenH The TemplateString object for header file
1861#
1862def CreatePcdCode(Info, AutoGenC, AutoGenH):
da92f276
LG
1863
1864 # Collect Token Space GUIDs used by DynamicEc PCDs
1865 TokenSpaceList = []
1866 for Pcd in Info.ModulePcdList:
1867 if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList:
1868 TokenSpaceList += [Pcd.TokenSpaceGuidCName]
1869
1870 # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found
1871 if TokenSpaceList <> []:
1872 AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n")
1873 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1874 GuidType = "GUID"
1875 else:
1876 GuidType = "EFI_GUID"
1877 for Item in TokenSpaceList:
1878 AutoGenH.Append('extern %s %s;\n' % (GuidType, Item))
1879
30fdf114
LG
1880 if Info.IsLibrary:
1881 if Info.ModulePcdList:
1882 AutoGenH.Append("\n// PCD definitions\n")
1883 for Pcd in Info.ModulePcdList:
1884 CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd)
1885 else:
1886 if Info.ModulePcdList:
1887 AutoGenH.Append("\n// Definition of PCDs used in this module\n")
1888 AutoGenC.Append("\n// Definition of PCDs used in this module\n")
1889 for Pcd in Info.ModulePcdList:
1890 CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd)
1891
1892 if Info.LibraryPcdList:
1893 AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n")
1894 AutoGenC.Append("\n// Definition of PCDs used in libraries\n")
1895 for Pcd in Info.LibraryPcdList:
1896 CreateModulePcdCode(Info, AutoGenC, AutoGenC, Pcd)
1897 CreatePcdDatabaseCode(Info, AutoGenC, AutoGenH)
1898
1899## Create code for unicode string definition
1900#
1901# @param Info The ModuleAutoGen object
1902# @param AutoGenC The TemplateString object for C code
1903# @param AutoGenH The TemplateString object for header file
b303ea72
LG
1904# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True
1905# @param UniGenBinBuffer Buffer to store uni string package data
30fdf114 1906#
b303ea72 1907def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer):
30fdf114
LG
1908 WorkingDir = os.getcwd()
1909 os.chdir(Info.WorkspaceDir)
1910
1911 IncList = [Info.MetaFile.Dir]
1912 # Get all files under [Sources] section in inf file for EDK-II module
6780eef1 1913 EDK2Module = True
30fdf114
LG
1914 SrcList = [F for F in Info.SourceFileList]
1915 if Info.AutoGenVersion < 0x00010005:
6780eef1 1916 EDK2Module = False
30fdf114
LG
1917 # Get all files under the module directory for EDK-I module
1918 Cwd = os.getcwd()
1919 os.chdir(Info.MetaFile.Dir)
1920 for Root, Dirs, Files in os.walk("."):
1921 if 'CVS' in Dirs:
1922 Dirs.remove('CVS')
1923 if '.svn' in Dirs:
1924 Dirs.remove('.svn')
1925 for File in Files:
1926 File = PathClass(os.path.join(Root, File), Info.MetaFile.Dir)
1927 if File in SrcList:
1928 continue
1929 SrcList.append(File)
1930 os.chdir(Cwd)
1931
1932 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-c') > -1:
1933 CompatibleMode = True
1934 else:
1935 CompatibleMode = False
1936
1937 #
6780eef1 1938 # -s is a temporary option dedicated for building .UNI files with ISO 639-2 language codes of EDK Shell in EDK2
30fdf114
LG
1939 #
1940 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1:
1941 if CompatibleMode:
1942 EdkLogger.error("build", AUTOGEN_ERROR,
1943 "-c and -s build options should be used exclusively",
1944 ExtraData="[%s]" % str(Info))
1945 ShellMode = True
1946 else:
1947 ShellMode = False
1948
6780eef1
LG
1949 #RFC4646 is only for EDKII modules and ISO639-2 for EDK modules
1950 if EDK2Module:
1951 FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.RFCLanguages]
1952 else:
1953 FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.ISOLanguages]
1954 Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer, FilterInfo)
b303ea72
LG
1955 if CompatibleMode or UniGenCFlag:
1956 AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
1957 AutoGenC.Append(Code)
1958 AutoGenC.Append("\n")
30fdf114
LG
1959 AutoGenH.Append("\n//\n//Unicode String ID\n//\n")
1960 AutoGenH.Append(Header)
b303ea72
LG
1961 if CompatibleMode or UniGenCFlag:
1962 AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)
30fdf114
LG
1963 os.chdir(WorkingDir)
1964
1965## Create common code
1966#
1967# @param Info The ModuleAutoGen object
1968# @param AutoGenC The TemplateString object for C code
1969# @param AutoGenH The TemplateString object for header file
1970#
1971def CreateHeaderCode(Info, AutoGenC, AutoGenH):
1972 # file header
1973 AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'}))
1974 # header file Prologue
1975 AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')}))
2bcc713e 1976 AutoGenH.Append(gAutoGenHCppPrologueString)
30fdf114 1977 if Info.AutoGenVersion >= 0x00010005:
30fdf114
LG
1978 # header files includes
1979 AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile)
1980 if Info.ModuleType in gModuleTypeHeaderFile \
1981 and gModuleTypeHeaderFile[Info.ModuleType][0] != gBasicHeaderFile:
1982 AutoGenH.Append("#include <%s>\n" % gModuleTypeHeaderFile[Info.ModuleType][0])
b36d134f
LG
1983 #
1984 # if either PcdLib in [LibraryClasses] sections or there exist Pcd section, add PcdLib.h
1985 # As if modules only uses FixedPcd, then PcdLib is not needed in [LibraryClasses] section.
1986 #
1987 if 'PcdLib' in Info.Module.LibraryClasses or Info.Module.Pcds:
4234283c
LG
1988 AutoGenH.Append("#include <Library/PcdLib.h>\n")
1989
30fdf114
LG
1990 AutoGenH.Append('\nextern GUID gEfiCallerIdGuid;\n\n')
1991
1992 if Info.IsLibrary:
1993 return
1994
1995 AutoGenH.Append("#define EFI_CALLER_ID_GUID \\\n %s\n" % GuidStringToGuidStructureString(Info.Guid))
1996
1997 if Info.IsLibrary:
1998 return
1999 # C file header
2000 AutoGenC.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.c'}))
2001 if Info.AutoGenVersion >= 0x00010005:
2002 # C file header files includes
2003 if Info.ModuleType in gModuleTypeHeaderFile:
2004 for Inc in gModuleTypeHeaderFile[Info.ModuleType]:
2005 AutoGenC.Append("#include <%s>\n" % Inc)
2006 else:
2007 AutoGenC.Append("#include <%s>\n" % gBasicHeaderFile)
2008
2009 #
2010 # Publish the CallerId Guid
2011 #
2012 AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid))
2013
2014## Create common code for header file
2015#
2016# @param Info The ModuleAutoGen object
2017# @param AutoGenC The TemplateString object for C code
2018# @param AutoGenH The TemplateString object for header file
2019#
2020def CreateFooterCode(Info, AutoGenC, AutoGenH):
2021 AutoGenH.Append(gAutoGenHEpilogueString)
2022
2023## Create code for a module
2024#
2025# @param Info The ModuleAutoGen object
2026# @param AutoGenC The TemplateString object for C code
2027# @param AutoGenH The TemplateString object for header file
b303ea72
LG
2028# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True
2029# @param UniGenBinBuffer Buffer to store uni string package data
30fdf114 2030#
b303ea72 2031def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer):
30fdf114
LG
2032 CreateHeaderCode(Info, AutoGenC, AutoGenH)
2033
2034 if Info.AutoGenVersion >= 0x00010005:
2035 CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH)
2036 CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH)
2037 CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH)
2038 CreatePcdCode(Info, AutoGenC, AutoGenH)
2039 CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH)
2040 CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH)
2041 CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH)
2042 CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH)
2043
2044 if Info.UnicodeFileList:
2045 FileName = "%sStrDefs.h" % Info.Name
2046 StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))
2047 StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')}))
b303ea72 2048 CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer)
30fdf114
LG
2049 StringH.Append("\n#endif\n")
2050 AutoGenH.Append('#include "%s"\n' % FileName)
2051
2052 CreateFooterCode(Info, AutoGenC, AutoGenH)
2053
b36d134f 2054 # no generation of AutoGen.c for Edk modules without unicode file
30fdf114
LG
2055 if Info.AutoGenVersion < 0x00010005 and len(Info.UnicodeFileList) == 0:
2056 AutoGenC.String = ''
2057
2058## Create the code file
2059#
b303ea72
LG
2060# @param FilePath The path of code file
2061# @param Content The content of code file
2062# @param IsBinaryFile The flag indicating if the file is binary file or not
30fdf114
LG
2063#
2064# @retval True If file content is changed or file doesn't exist
2065# @retval False If the file exists and the content is not changed
2066#
b303ea72
LG
2067def Generate(FilePath, Content, IsBinaryFile):
2068 return SaveFileOnChange(FilePath, Content, IsBinaryFile)
30fdf114 2069