]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/GenC.py
Check In tool source code based on Build tool project revision r1655.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenC.py
CommitLineData
30fdf114
LG
1## @file
2# Routines for generating AutoGen.h and AutoGen.c
3#
4# Copyright (c) 2007, Intel Corporation
5# All rights reserved. This program and the accompanying materials
6# are licensed and made available under the terms and conditions of the BSD License
7# which accompanies this distribution. The full text of the license may be found at
8# http://opensource.org/licenses/bsd-license.php
9#
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12#
13
14## Import Modules
15#
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
70#define PCD_TYPE_DATA (0x0 << PCD_TYPE_SHIFT)
71#define PCD_TYPE_HII (0x8 << PCD_TYPE_SHIFT)
72#define PCD_TYPE_VPD (0x4 << PCD_TYPE_SHIFT)
73#define PCD_TYPE_SKU_ENABLED (0x2 << PCD_TYPE_SHIFT)
74#define PCD_TYPE_STRING (0x1 << PCD_TYPE_SHIFT)
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
80#define PCD_DATUM_TYPE_POINTER (0x0 << PCD_DATUM_TYPE_SHIFT)
81#define PCD_DATUM_TYPE_UINT8 (0x1 << PCD_DATUM_TYPE_SHIFT)
82#define PCD_DATUM_TYPE_UINT16 (0x2 << PCD_DATUM_TYPE_SHIFT)
83#define PCD_DATUM_TYPE_UINT32 (0x4 << PCD_DATUM_TYPE_SHIFT)
84#define PCD_DATUM_TYPE_UINT64 (0x8 << PCD_DATUM_TYPE_SHIFT)
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}
165${BEGIN} VARIABLE_HEAD ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}[${VARIABLE_HEAD_NUMSKUS_DECL}];
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 {
256${BEGIN} offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}) | ${TOKEN_TYPE},
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}
266${BEGIN} /* ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}[${VARIABLE_HEAD_NUMSKUS_DECL}] */
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
313""")
314
315gAutoGenHEpilogueString = """
316#endif
317"""
318
319## PEI Core Entry Point Templates
320gPeiCoreEntryPointPrototype = TemplateString("""
321${BEGIN}
322VOID
323EFIAPI
324${Function} (
325 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
326 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
327 IN VOID *Context
328 );
329${END}
330""")
331
332gPeiCoreEntryPointString = TemplateString("""
333${BEGIN}
334VOID
335EFIAPI
336ProcessModuleEntryPointList (
337 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
338 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
339 IN VOID *Context
340 )
341
342{
343 ${Function} (SecCoreData, PpiList, Context);
344}
345${END}
346""")
347
348
349## DXE Core Entry Point Templates
350gDxeCoreEntryPointPrototype = TemplateString("""
351${BEGIN}
352VOID
353EFIAPI
354${Function} (
355 IN VOID *HobStart
356 );
357${END}
358""")
359
360gDxeCoreEntryPointString = TemplateString("""
361${BEGIN}
362VOID
363EFIAPI
364ProcessModuleEntryPointList (
365 IN VOID *HobStart
366 )
367
368{
369 ${Function} (HobStart);
370}
371${END}
372""")
373
374## PEIM Entry Point Templates
375gPeimEntryPointPrototype = TemplateString("""
376${BEGIN}
377EFI_STATUS
378EFIAPI
379${Function} (
380 IN EFI_PEI_FILE_HANDLE FileHandle,
381 IN CONST EFI_PEI_SERVICES **PeiServices
382 );
383${END}
384""")
385
386## SMM_CORE Entry Point Templates
387gSmmCoreEntryPointString = TemplateString("""
388const UINT32 _gUefiDriverRevision = 0;
389${BEGIN}
390EFI_STATUS
391${Function} (
392 IN EFI_HANDLE ImageHandle,
393 IN EFI_SYSTEM_TABLE *SystemTable
394 );
395
396EFI_STATUS
397EFIAPI
398ProcessModuleEntryPointList (
399 IN EFI_HANDLE ImageHandle,
400 IN EFI_SYSTEM_TABLE *SystemTable
401 )
402{
403 return ${Function} (ImageHandle, SystemTable);
404}
405${END}
406""")
407
408gPeimEntryPointString = [
409TemplateString("""
410GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
411
412EFI_STATUS
413EFIAPI
414ProcessModuleEntryPointList (
415 IN EFI_PEI_FILE_HANDLE FileHandle,
416 IN CONST EFI_PEI_SERVICES **PeiServices
417 )
418
419{
420 return EFI_SUCCESS;
421}
422"""),
423TemplateString("""
424GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
425${BEGIN}
426EFI_STATUS
427EFIAPI
428ProcessModuleEntryPointList (
429 IN EFI_PEI_FILE_HANDLE FileHandle,
430 IN CONST EFI_PEI_SERVICES **PeiServices
431 )
432
433{
434 return ${Function} (FileHandle, PeiServices);
435}
436${END}
437"""),
438TemplateString("""
439GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
440
441EFI_STATUS
442EFIAPI
443ProcessModuleEntryPointList (
444 IN EFI_PEI_FILE_HANDLE FileHandle,
445 IN CONST EFI_PEI_SERVICES **PeiServices
446 )
447
448{
449 EFI_STATUS Status;
450 EFI_STATUS CombinedStatus;
451
452 CombinedStatus = EFI_LOAD_ERROR;
453${BEGIN}
454 Status = ${Function} (FileHandle, PeiServices);
455 if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) {
456 CombinedStatus = Status;
457 }
458${END}
459 return CombinedStatus;
460}
461""")
462]
463
464## DXE SMM Entry Point Templates
465gDxeSmmEntryPointPrototype = TemplateString("""
466${BEGIN}
467EFI_STATUS
468EFIAPI
469${Function} (
470 IN EFI_HANDLE ImageHandle,
471 IN EFI_SYSTEM_TABLE *SystemTable
472 );
473${END}
474""")
475
476gDxeSmmEntryPointString = [
477TemplateString("""
478const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
479const UINT32 _gDxeRevision = ${PiSpecVersion};
480
481EFI_STATUS
482EFIAPI
483ProcessModuleEntryPointList (
484 IN EFI_HANDLE ImageHandle,
485 IN EFI_SYSTEM_TABLE *SystemTable
486 )
487
488{
489 return EFI_SUCCESS;
490}
491"""),
492TemplateString("""
493const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
494const UINT32 _gDxeRevision = ${PiSpecVersion};
495
496static BASE_LIBRARY_JUMP_BUFFER mJumpContext;
497static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;
498
499VOID
500EFIAPI
501ExitDriver (
502 IN EFI_STATUS Status
503 )
504{
505 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {
506 mDriverEntryPointStatus = Status;
507 }
508 LongJump (&mJumpContext, (UINTN)-1);
509 ASSERT (FALSE);
510}
511
512EFI_STATUS
513EFIAPI
514ProcessModuleEntryPointList (
515 IN EFI_HANDLE ImageHandle,
516 IN EFI_SYSTEM_TABLE *SystemTable
517 )
518
519{
520${BEGIN}
521 if (SetJump (&mJumpContext) == 0) {
522 ExitDriver (${Function} (ImageHandle, SystemTable));
523 ASSERT (FALSE);
524 }
525${END}
526
527 return mDriverEntryPointStatus;
528}
529""")
530]
531
532## UEFI Driver Entry Point Templates
533gUefiDriverEntryPointPrototype = TemplateString("""
534${BEGIN}
535EFI_STATUS
536EFIAPI
537${Function} (
538 IN EFI_HANDLE ImageHandle,
539 IN EFI_SYSTEM_TABLE *SystemTable
540 );
541${END}
542""")
543
544gUefiDriverEntryPointString = [
545TemplateString("""
546const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
547const UINT32 _gDxeRevision = ${PiSpecVersion};
548
549EFI_STATUS
550EFIAPI
551ProcessModuleEntryPointList (
552 IN EFI_HANDLE ImageHandle,
553 IN EFI_SYSTEM_TABLE *SystemTable
554 )
555{
556 return EFI_SUCCESS;
557}
558"""),
559TemplateString("""
560const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
561const UINT32 _gDxeRevision = ${PiSpecVersion};
562
563${BEGIN}
564EFI_STATUS
565EFIAPI
566ProcessModuleEntryPointList (
567 IN EFI_HANDLE ImageHandle,
568 IN EFI_SYSTEM_TABLE *SystemTable
569 )
570
571{
572 return ${Function} (ImageHandle, SystemTable);
573}
574${END}
575VOID
576EFIAPI
577ExitDriver (
578 IN EFI_STATUS Status
579 )
580{
581 if (EFI_ERROR (Status)) {
582 ProcessLibraryDestructorList (gImageHandle, gST);
583 }
584 gBS->Exit (gImageHandle, Status, 0, NULL);
585}
586"""),
587TemplateString("""
588const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
589const UINT32 _gDxeRevision = ${PiSpecVersion};
590
591EFI_STATUS
592EFIAPI
593ProcessModuleEntryPointList (
594 IN EFI_HANDLE ImageHandle,
595 IN EFI_SYSTEM_TABLE *SystemTable
596 )
597
598{
599 ${BEGIN}
600 if (SetJump (&mJumpContext) == 0) {
601 ExitDriver (${Function} (ImageHandle, SystemTable));
602 ASSERT (FALSE);
603 }
604 ${END}
605 return mDriverEntryPointStatus;
606}
607
608static BASE_LIBRARY_JUMP_BUFFER mJumpContext;
609static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;
610
611VOID
612EFIAPI
613ExitDriver (
614 IN EFI_STATUS Status
615 )
616{
617 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {
618 mDriverEntryPointStatus = Status;
619 }
620 LongJump (&mJumpContext, (UINTN)-1);
621 ASSERT (FALSE);
622}
623""")
624]
625
626
627## UEFI Application Entry Point Templates
628gUefiApplicationEntryPointPrototype = TemplateString("""
629${BEGIN}
630EFI_STATUS
631EFIAPI
632${Function} (
633 IN EFI_HANDLE ImageHandle,
634 IN EFI_SYSTEM_TABLE *SystemTable
635 );
636${END}
637""")
638
639gUefiApplicationEntryPointString = [
640TemplateString("""
641const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
642
643EFI_STATUS
644EFIAPI
645ProcessModuleEntryPointList (
646 IN EFI_HANDLE ImageHandle,
647 IN EFI_SYSTEM_TABLE *SystemTable
648 )
649{
650 return EFI_SUCCESS;
651}
652"""),
653TemplateString("""
654const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
655
656${BEGIN}
657EFI_STATUS
658EFIAPI
659ProcessModuleEntryPointList (
660 IN EFI_HANDLE ImageHandle,
661 IN EFI_SYSTEM_TABLE *SystemTable
662 )
663
664{
665 return ${Function} (ImageHandle, SystemTable);
666}
667${END}
668VOID
669EFIAPI
670ExitDriver (
671 IN EFI_STATUS Status
672 )
673{
674 if (EFI_ERROR (Status)) {
675 ProcessLibraryDestructorList (gImageHandle, gST);
676 }
677 gBS->Exit (gImageHandle, Status, 0, NULL);
678}
679"""),
680TemplateString("""
681const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
682
683EFI_STATUS
684EFIAPI
685ProcessModuleEntryPointList (
686 IN EFI_HANDLE ImageHandle,
687 IN EFI_SYSTEM_TABLE *SystemTable
688 )
689
690{
691 ${BEGIN}
692 if (SetJump (&mJumpContext) == 0) {
693 ExitDriver (${Function} (ImageHandle, SystemTable));
694 ASSERT (FALSE);
695 }
696 ${END}
697 return mDriverEntryPointStatus;
698}
699
700static BASE_LIBRARY_JUMP_BUFFER mJumpContext;
701static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR;
702
703VOID
704EFIAPI
705ExitDriver (
706 IN EFI_STATUS Status
707 )
708{
709 if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) {
710 mDriverEntryPointStatus = Status;
711 }
712 LongJump (&mJumpContext, (UINTN)-1);
713 ASSERT (FALSE);
714}
715""")
716]
717
718## UEFI Unload Image Templates
719gUefiUnloadImagePrototype = TemplateString("""
720${BEGIN}
721EFI_STATUS
722EFIAPI
723${Function} (
724 IN EFI_HANDLE ImageHandle
725 );
726${END}
727""")
728
729gUefiUnloadImageString = [
730TemplateString("""
731GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};
732
733EFI_STATUS
734EFIAPI
735ProcessModuleUnloadList (
736 IN EFI_HANDLE ImageHandle
737 )
738{
739 return EFI_SUCCESS;
740}
741"""),
742TemplateString("""
743GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};
744
745${BEGIN}
746EFI_STATUS
747EFIAPI
748ProcessModuleUnloadList (
749 IN EFI_HANDLE ImageHandle
750 )
751{
752 return ${Function} (ImageHandle);
753}
754${END}
755"""),
756TemplateString("""
757GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count};
758
759EFI_STATUS
760EFIAPI
761ProcessModuleUnloadList (
762 IN EFI_HANDLE ImageHandle
763 )
764{
765 EFI_STATUS Status;
766
767 Status = EFI_SUCCESS;
768${BEGIN}
769 if (EFI_ERROR (Status)) {
770 ${Function} (ImageHandle);
771 } else {
772 Status = ${Function} (ImageHandle);
773 }
774${END}
775 return Status;
776}
777""")
778]
779
780gLibraryStructorPrototype = {
781'BASE' : TemplateString("""${BEGIN}
782RETURN_STATUS
783EFIAPI
784${Function} (
785 VOID
786 );${END}
787"""),
788
789'PEI' : TemplateString("""${BEGIN}
790EFI_STATUS
791EFIAPI
792${Function} (
793 IN EFI_PEI_FILE_HANDLE FileHandle,
794 IN CONST EFI_PEI_SERVICES **PeiServices
795 );${END}
796"""),
797
798'DXE' : TemplateString("""${BEGIN}
799EFI_STATUS
800EFIAPI
801${Function} (
802 IN EFI_HANDLE ImageHandle,
803 IN EFI_SYSTEM_TABLE *SystemTable
804 );${END}
805"""),
806}
807
808gLibraryStructorCall = {
809'BASE' : TemplateString("""${BEGIN}
810 Status = ${Function} ();
811 ASSERT_EFI_ERROR (Status);${END}
812"""),
813
814'PEI' : TemplateString("""${BEGIN}
815 Status = ${Function} (FileHandle, PeiServices);
816 ASSERT_EFI_ERROR (Status);${END}
817"""),
818
819'DXE' : TemplateString("""${BEGIN}
820 Status = ${Function} (ImageHandle, SystemTable);
821 ASSERT_EFI_ERROR (Status);${END}
822"""),
823}
824
825## Library Constructor and Destructor Templates
826gLibraryString = {
827'BASE' : TemplateString("""
828${BEGIN}${FunctionPrototype}${END}
829
830VOID
831EFIAPI
832ProcessLibrary${Type}List (
833 VOID
834 )
835{
836${BEGIN} EFI_STATUS Status;
837${FunctionCall}${END}
838}
839"""),
840
841'PEI' : TemplateString("""
842${BEGIN}${FunctionPrototype}${END}
843
844VOID
845EFIAPI
846ProcessLibrary${Type}List (
847 IN EFI_PEI_FILE_HANDLE FileHandle,
848 IN CONST EFI_PEI_SERVICES **PeiServices
849 )
850{
851${BEGIN} EFI_STATUS Status;
852${FunctionCall}${END}
853}
854"""),
855
856'DXE' : TemplateString("""
857${BEGIN}${FunctionPrototype}${END}
858
859VOID
860EFIAPI
861ProcessLibrary${Type}List (
862 IN EFI_HANDLE ImageHandle,
863 IN EFI_SYSTEM_TABLE *SystemTable
864 )
865{
866${BEGIN} EFI_STATUS Status;
867${FunctionCall}${END}
868}
869"""),
870}
871
872gSpecificationString = TemplateString("""
873${BEGIN}
874#undef ${SpecificationName}
875#define ${SpecificationName} ${SpecificationValue}
876${END}
877""")
878
879gBasicHeaderFile = "Base.h"
880
881gModuleTypeHeaderFile = {
882 "BASE" : [gBasicHeaderFile],
883 "SEC" : ["PiPei.h", "Library/DebugLib.h"],
884 "PEI_CORE" : ["PiPei.h", "Library/DebugLib.h", "Library/PeiCoreEntryPoint.h"],
885 "PEIM" : ["PiPei.h", "Library/DebugLib.h", "Library/PeimEntryPoint.h"],
886 "DXE_CORE" : ["PiDxe.h", "Library/DebugLib.h", "Library/DxeCoreEntryPoint.h"],
887 "DXE_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
888 "DXE_SMM_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
889 "DXE_RUNTIME_DRIVER": ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
890 "DXE_SAL_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
891 "UEFI_DRIVER" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
892 "UEFI_APPLICATION" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"],
893 "SMM_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/SmmDriverEntryPoint.h"],
894 "SMM_CORE" : ["PiDxe.h", "Library/DebugLib.h"],
895 "USER_DEFINED" : [gBasicHeaderFile]
896}
897
898## Create code for module PCDs
899#
900# @param Info The ModuleAutoGen object
901# @param AutoGenC The TemplateString object for C code
902# @param AutoGenH The TemplateString object for header file
903# @param Pcd The PCD object
904#
905def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
906 TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[Pcd.TokenSpaceGuidCName]
907 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber
908 #
909 # Write PCDs
910 #
911 PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName
912 if Pcd.Type in gDynamicExPcd:
913 TokenNumber = int(Pcd.TokenValue, 0)
914 else:
915 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
916 EdkLogger.error("build", AUTOGEN_ERROR,
917 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
918 ExtraData="[%s]" % str(Info))
919 TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]
920 AutoGenH.Append('\n#define %s %d\n' % (PcdTokenName, TokenNumber))
921
922 EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + Pcd.TokenCName + "." + Pcd.TokenSpaceGuidCName)
923 if Pcd.Type not in gItemTypeStringDatabase:
924 EdkLogger.error("build", AUTOGEN_ERROR,
925 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
926 ExtraData="[%s]" % str(Info))
927 if Pcd.DatumType not in gDatumSizeStringDatabase:
928 EdkLogger.error("build", AUTOGEN_ERROR,
929 "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
930 ExtraData="[%s]" % str(Info))
931
932 DatumSize = gDatumSizeStringDatabase[Pcd.DatumType]
933 DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType]
934 GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName
935 SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName
936
937 if Pcd.Type in gDynamicExPcd:
938 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
939 if Pcd.DatumType == 'VOID*':
940 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
941 else:
942 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
943 elif Pcd.Type in gDynamicPcd:
944 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))
945 if Pcd.DatumType == 'VOID*':
946 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))
947 else:
948 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))
949 else:
950 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + Pcd.TokenCName
951 Const = 'const'
952 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
953 Const = ''
954 Type = ''
955 Array = ''
956 Value = Pcd.DefaultValue\r
957 Unicode = False
958 if Pcd.DatumType == 'UINT64':
959 if not Value.endswith('ULL'):
960 Value += 'ULL'
961 if Pcd.DatumType == 'VOID*':
962 if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '':
963 EdkLogger.error("build", AUTOGEN_ERROR,
964 "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
965 ExtraData="[%s]" % str(Info))
966
967 ArraySize = int(Pcd.MaxDatumSize, 0)
968 if Value[0] == '{':
969 Type = '(VOID *)'
970 else:\r
971 if Value[0] == 'L':
972 Unicode = True
973 Value = Value.lstrip('L') #.strip('"')
974 Value = eval(Value) # translate escape character
975 NewValue = '{'
976 for Index in range(0,len(Value)):
977 if Unicode:
978 NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', '\r
979 else:\r
980 NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', '
981 if Unicode:\r
982 ArraySize = ArraySize / 2;\r
983\r
984 if ArraySize < (len(Value) + 1):
985 ArraySize = len(Value) + 1
986 Value = NewValue + '0 }'\r
987 Array = '[%d]' % ArraySize
988 #
989 # skip casting for fixed at build since it breaks ARM assembly.
990 # Long term we need PCD macros that work in assembly
991 #
992 elif Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
993 Value = "((%s)%s)" % (Pcd.DatumType, Value)
994
995 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
996 PcdValueName = '_PCD_PATCHABLE_VALUE_' + Pcd.TokenCName
997 else:
998 PcdValueName = '_PCD_VALUE_' + Pcd.TokenCName
999
1000 if Pcd.DatumType == 'VOID*':\r
1001 #\r
1002 # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.\r
1003 #\r
1004 if Unicode:\r
1005 AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))\r
1006 AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName))\r
1007 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
1008 AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array))\r
1009 AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))\r
1010 else:
1011 AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))
1012 AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName))
1013 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))
1014 AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array))
1015 AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))
1016 elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
1017 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))
1018 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
1019 AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
1020 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))
1021 else:
1022 AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))
1023 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
1024 AutoGenH.Append('extern %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
1025 AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))
1026
1027 if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
1028 if Pcd.DatumType == 'VOID*':
1029 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtr(_gPcd_BinaryPatch_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeName, Pcd.TokenCName, Pcd.TokenCName))
1030 else:
1031 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))
1032 else:
1033 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)
1034
1035## Create code for library module PCDs
1036#
1037# @param Info The ModuleAutoGen object
1038# @param AutoGenC The TemplateString object for C code
1039# @param AutoGenH The TemplateString object for header file
1040# @param Pcd The PCD object
1041#
1042def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
1043 PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber
1044 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
1045 TokenCName = Pcd.TokenCName
1046 TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[TokenSpaceGuidCName]
1047 if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
1048 EdkLogger.error("build", AUTOGEN_ERROR,
1049 "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1050 ExtraData="[%s]" % str(Info))
1051 TokenNumber = PcdTokenNumber[TokenCName, TokenSpaceGuidCName]
1052
1053 if Pcd.Type not in gItemTypeStringDatabase:
1054 EdkLogger.error("build", AUTOGEN_ERROR,
1055 "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1056 ExtraData="[%s]" % str(Info))
1057 if Pcd.DatumType not in gDatumSizeStringDatabase:
1058 EdkLogger.error("build", AUTOGEN_ERROR,
1059 "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1060 ExtraData="[%s]" % str(Info))
1061
1062 DatumType = Pcd.DatumType
1063 DatumSize = gDatumSizeStringDatabaseH[DatumType]
1064 DatumSizeLib= gDatumSizeStringDatabaseLib[DatumType]
1065 GetModeName = '_PCD_GET_MODE_' + DatumSize + '_' + TokenCName
1066 SetModeName = '_PCD_SET_MODE_' + DatumSize + '_' + TokenCName
1067
1068 Type = ''
1069 Array = ''
1070 if Pcd.DatumType == 'VOID*':
1071 Type = '(VOID *)'
1072 Array = '[]'
1073
1074 AutoGenH.Append('#define _PCD_TOKEN_%s %d\n' % (TokenCName, TokenNumber))
1075
1076 PcdItemType = Pcd.Type
1077 #if PcdItemType in gDynamicPcd:
1078 # PcdItemType = TAB_PCDS_FIXED_AT_BUILD
1079 # if (TokenCName, TokenSpaceGuidCName) in Info.PlatformInfo.Platform.Pcds:
1080 # PcdItemType = Info.PlatformInfo.Platform.Pcds[TokenCName, TokenSpaceGuidCName].Type
1081 if PcdItemType in gDynamicExPcd:
1082 PcdTokenName = '_PCD_TOKEN_' + TokenCName
1083 AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
1084 if DatumType == 'VOID*':
1085 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName,DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
1086 else:
1087 AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
1088 if PcdItemType in gDynamicPcd:
1089 PcdTokenName = '_PCD_TOKEN_' + TokenCName
1090 AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))
1091 if DatumType == 'VOID*':
1092 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))
1093 else:
1094 AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))
1095 if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:
1096 PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName
1097 AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) )
1098 AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))
1099 AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName))
1100 if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG:
1101 AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array))
1102 #AutoGenH.Append('#define _PCD_VALUE_%s _gPcd_FixedAtBuild_%s\n' %(TokenCName, TokenCName))
1103 AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName))
1104 AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)
1105
1106## Create code for PCD database in DXE or PEI phase
1107#
1108# @param Platform The platform object
1109# @retval tuple Two TemplateString objects for C code and header file,
1110# respectively
1111#
1112def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
1113 AutoGenC = TemplateString()
1114 AutoGenH = TemplateString()
1115
1116 Dict = {
1117 'PHASE' : Phase,
1118 'GUID_TABLE_SIZE' : '1',
1119 'STRING_TABLE_SIZE' : '1',
1120 'SKUID_TABLE_SIZE' : '1',
1121 'LOCAL_TOKEN_NUMBER_TABLE_SIZE' : '1',
1122 'LOCAL_TOKEN_NUMBER' : '0',
1123 'EXMAPPING_TABLE_SIZE' : '1',
1124 'EX_TOKEN_NUMBER' : '0',
1125 'SIZE_TABLE_SIZE' : '2',
1126 'GUID_TABLE_EMPTY' : 'TRUE',
1127 'STRING_TABLE_EMPTY' : 'TRUE',
1128 'SKUID_TABLE_EMPTY' : 'TRUE',
1129 'DATABASE_EMPTY' : 'TRUE',
1130 'EXMAP_TABLE_EMPTY' : 'TRUE',
1131 'PCD_DATABASE_UNINIT_EMPTY' : ' UINT8 dummy; /* PCD_DATABASE_UNINIT is emptry */',
1132 'SYSTEM_SKU_ID' : ' SKU_ID SystemSkuId;',
1133 'SYSTEM_SKU_ID_VALUE' : '0'
1134 }
1135
1136 for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN']:
1137 Dict['VARDEF_CNAME_' + DatumType] = []
1138 Dict['VARDEF_GUID_' + DatumType] = []
1139 Dict['VARDEF_SKUID_' + DatumType] = []
1140 Dict['VARDEF_VALUE_' + DatumType] = []
1141 for Init in ['INIT','UNINIT']:
1142 Dict[Init+'_CNAME_DECL_' + DatumType] = []
1143 Dict[Init+'_GUID_DECL_' + DatumType] = []
1144 Dict[Init+'_NUMSKUS_DECL_' + DatumType] = []
1145 Dict[Init+'_VALUE_' + DatumType] = []
1146
1147 for Type in ['STRING_HEAD','VPD_HEAD','VARIABLE_HEAD']:
1148 Dict[Type + '_CNAME_DECL'] = []
1149 Dict[Type + '_GUID_DECL'] = []
1150 Dict[Type + '_NUMSKUS_DECL'] = []
1151 Dict[Type + '_VALUE'] = []
1152
1153 Dict['STRING_TABLE_INDEX'] = []
1154 Dict['STRING_TABLE_LENGTH'] = []
1155 Dict['STRING_TABLE_CNAME'] = []
1156 Dict['STRING_TABLE_GUID'] = []
1157 Dict['STRING_TABLE_VALUE'] = []
1158
1159 Dict['SIZE_TABLE_CNAME'] = []
1160 Dict['SIZE_TABLE_GUID'] = []
1161 Dict['SIZE_TABLE_CURRENT_LENGTH'] = []
1162 Dict['SIZE_TABLE_MAXIMUM_LENGTH'] = []
1163
1164 Dict['EXMAPPING_TABLE_EXTOKEN'] = []
1165 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'] = []
1166 Dict['EXMAPPING_TABLE_GUID_INDEX'] = []
1167
1168 Dict['GUID_STRUCTURE'] = []
1169
1170 Dict['SKUID_VALUE'] = []
1171
1172 if Phase == 'DXE':
1173 Dict['SYSTEM_SKU_ID'] = ''
1174 Dict['SYSTEM_SKU_ID_VALUE'] = ''
1175
1176 StringTableIndex = 0
1177 StringTableSize = 0
1178 NumberOfLocalTokens = 0
1179 NumberOfPeiLocalTokens = 0
1180 NumberOfDxeLocalTokens = 0
1181 NumberOfExTokens = 0
1182 NumberOfSizeItems = 0
1183 GuidList = []
1184
1185 for Pcd in Platform.DynamicPcdList:
1186 CName = Pcd.TokenCName
1187 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
1188
1189 EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))
1190 if Pcd.DatumType not in gDatumSizeStringDatabase:
1191 EdkLogger.error("build", AUTOGEN_ERROR,
1192 "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
1193 ExtraData="[%s]" % str(Platform))
1194
1195 if Pcd.Phase == 'PEI':
1196 NumberOfPeiLocalTokens += 1
1197 if Pcd.Phase == 'DXE':
1198 NumberOfDxeLocalTokens += 1
1199 if Pcd.Phase != Phase:
1200 continue
1201
1202 #
1203 # TODO: need GetGuidValue() definition
1204 #
1205 TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue
1206 TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure)
1207 if Pcd.Type in gDynamicExPcd:
1208 if TokenSpaceGuid not in GuidList:
1209 GuidList += [TokenSpaceGuid]
1210 Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure)
1211 NumberOfExTokens += 1
1212
1213 ValueList = []
1214 StringHeadOffsetList = []
1215 VpdHeadOffsetList = []
1216 VariableHeadValueList = []
1217 Pcd.InitString = 'UNINIT'
1218
1219 if Pcd.DatumType == 'VOID*':
1220 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_POINTER']
1221 elif Pcd.DatumType == 'BOOLEAN':
1222 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_UINT8']
1223 else:
1224 Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType]
1225
1226 if len(Pcd.SkuInfoList) > 1:
1227 Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']
1228
1229 for SkuName in Pcd.SkuInfoList:
1230 Sku = Pcd.SkuInfoList[SkuName]
1231 SkuId = Sku.SkuId
1232 if SkuId == None or SkuId == '':
1233 continue
1234
1235 if SkuId not in Dict['SKUID_VALUE']:
1236 Dict['SKUID_VALUE'].append(SkuId)
1237
1238 SkuIdIndex = Dict['SKUID_VALUE'].index(SkuId)
1239 if len(Sku.VariableName) > 0:
1240 Pcd.TokenTypeList += ['PCD_TYPE_HII']
1241 Pcd.InitString = 'INIT'
1242 VariableNameStructure = StringToArray(Sku.VariableName)
1243 if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:
1244 Dict['STRING_TABLE_CNAME'].append(CName)
1245 Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)
1246 if StringTableIndex == 0:
1247 Dict['STRING_TABLE_INDEX'].append('')
1248 else:
1249 Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)
1250
1251 Dict['STRING_TABLE_LENGTH'].append((len(Sku.VariableName) - 3 + 1) * 2)
1252 Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)
1253 StringTableIndex += 1
1254 StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2
1255
1256 VariableHeadStringIndex = 0
1257 for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):
1258 VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]
1259
1260 VariableGuidStructure = Sku.VariableGuidValue
1261 VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure)
1262 if VariableGuid not in GuidList:
1263 GuidList += [VariableGuid]
1264 Dict['GUID_STRUCTURE'].append(VariableGuidStructure)
1265 VariableHeadGuidIndex = GuidList.index(VariableGuid)
1266
1267 VariableHeadValueList.append('%d, %d, %s, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s)' %
1268 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,
1269 Phase, CName, TokenSpaceGuid, SkuIdIndex))
1270 Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName)
1271 Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid)
1272 Dict['VARDEF_SKUID_'+Pcd.DatumType].append(SkuIdIndex)
1273 Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)
1274 elif Sku.VpdOffset != '':
1275 Pcd.TokenTypeList += ['PCD_TYPE_VPD']
1276 Pcd.InitString = 'INIT'
1277 VpdHeadOffsetList.append(Sku.VpdOffset)
1278 else:
1279 if Pcd.DatumType == 'VOID*':
1280 Pcd.TokenTypeList += ['PCD_TYPE_STRING']
1281 Pcd.InitString = 'INIT'
1282 if Sku.DefaultValue != '':
1283 NumberOfSizeItems += 1
1284 Dict['STRING_TABLE_CNAME'].append(CName)
1285 Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)
1286
1287 if StringTableIndex == 0:
1288 Dict['STRING_TABLE_INDEX'].append('')
1289 else:
1290 Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)
1291 if Sku.DefaultValue[0] == 'L':
1292 Size = (len(Sku.DefaultValue) - 3 + 1) * 2
1293 Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))
1294 elif Sku.DefaultValue[0] == '"':
1295 Size = len(Sku.DefaultValue) - 2 + 1
1296 Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))
1297 elif Sku.DefaultValue[0] == '{':
1298 Size = len(Sku.DefaultValue.replace(',',' ').split())
1299 Dict['STRING_TABLE_VALUE'].append(Sku.DefaultValue)
1300
1301 StringHeadOffsetList.append(str(StringTableSize))
1302 Dict['SIZE_TABLE_CNAME'].append(CName)
1303 Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)
1304 Dict['SIZE_TABLE_CURRENT_LENGTH'].append(Size)
1305 Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(Pcd.MaxDatumSize)
1306 if Pcd.MaxDatumSize != '':
1307 MaxDatumSize = int(Pcd.MaxDatumSize, 0)
1308 if MaxDatumSize > Size:
1309 Size = MaxDatumSize
1310 Dict['STRING_TABLE_LENGTH'].append(Size)
1311 StringTableIndex += 1
1312 StringTableSize += (Size)
1313 else:
1314 Pcd.TokenTypeList += ['PCD_TYPE_DATA']
1315 if Sku.DefaultValue == 'TRUE':
1316 Pcd.InitString = 'INIT'
1317 else:
1318 try:
1319 if int(Sku.DefaultValue, 0) != 0:
1320 Pcd.InitString = 'INIT'
1321 except:
1322 pass
1323
1324 #
1325 # For UNIT64 type PCD's value, ULL should be append to avoid
1326 # warning under linux building environment.
1327 #
1328 if Pcd.DatumType == "UINT64":
1329 ValueList.append(Sku.DefaultValue + "ULL")
1330 else:
1331 ValueList.append(Sku.DefaultValue)
1332
1333 Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))
1334
1335 if 'PCD_TYPE_HII' in Pcd.TokenTypeList:
1336 Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)
1337 Dict['VARIABLE_HEAD_GUID_DECL'].append(TokenSpaceGuid)
1338 Dict['VARIABLE_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
1339 Dict['VARIABLE_HEAD_VALUE'].append('{ %s }\n' % ' },\n { '.join(VariableHeadValueList))
1340 if 'PCD_TYPE_VPD' in Pcd.TokenTypeList:
1341 Dict['VPD_HEAD_CNAME_DECL'].append(CName)
1342 Dict['VPD_HEAD_GUID_DECL'].append(TokenSpaceGuid)
1343 Dict['VPD_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
1344 Dict['VPD_HEAD_VALUE'].append('{ %s }' % ' }, { '.join(VpdHeadOffsetList))
1345 if 'PCD_TYPE_STRING' in Pcd.TokenTypeList:
1346 Dict['STRING_HEAD_CNAME_DECL'].append(CName)
1347 Dict['STRING_HEAD_GUID_DECL'].append(TokenSpaceGuid)
1348 Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
1349 Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList))
1350 if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:
1351 Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName)
1352 Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid)
1353 Dict[Pcd.InitString+'_NUMSKUS_DECL_'+Pcd.DatumType].append(len(Pcd.SkuInfoList))
1354 if Pcd.InitString == 'UNINIT':
1355 Dict['PCD_DATABASE_UNINIT_EMPTY'] = ''
1356 else:
1357 Dict[Pcd.InitString+'_VALUE_'+Pcd.DatumType].append(', '.join(ValueList))
1358
1359 if Phase == 'PEI':
1360 NumberOfLocalTokens = NumberOfPeiLocalTokens
1361 if Phase == 'DXE':
1362 NumberOfLocalTokens = NumberOfDxeLocalTokens
1363
1364 Dict['TOKEN_INIT'] = ['' for x in range(NumberOfLocalTokens)]
1365 Dict['TOKEN_CNAME'] = ['' for x in range(NumberOfLocalTokens)]
1366 Dict['TOKEN_GUID'] = ['' for x in range(NumberOfLocalTokens)]
1367 Dict['TOKEN_TYPE'] = ['' for x in range(NumberOfLocalTokens)]
1368
1369 for Pcd in Platform.DynamicPcdList:
1370 CName = Pcd.TokenCName
1371 TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
1372 if Pcd.Phase != Phase:
1373 continue
1374
1375 TokenSpaceGuid = GuidStructureStringToGuidValueName(Pcd.TokenSpaceGuidValue) #(Platform.PackageList, TokenSpaceGuidCName))
1376 GeneratedTokenNumber = Platform.PcdTokenNumber[CName, TokenSpaceGuidCName] - 1
1377 if Phase == 'DXE':
1378 GeneratedTokenNumber -= NumberOfPeiLocalTokens
1379
1380 EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))
1381 EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)
1382 EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))
1383
1384 Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Init'
1385 if Pcd.InitString == 'UNINIT':
1386 Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Uninit'
1387 Dict['TOKEN_CNAME'][GeneratedTokenNumber] = CName
1388 Dict['TOKEN_GUID'][GeneratedTokenNumber] = TokenSpaceGuid
1389 Dict['TOKEN_TYPE'][GeneratedTokenNumber] = ' | '.join(Pcd.TokenTypeList)
1390 if Pcd.Type in gDynamicExPcd:
1391 Dict['EXMAPPING_TABLE_EXTOKEN'].append(Pcd.TokenValue)
1392 if Phase == 'DXE':
1393 GeneratedTokenNumber += NumberOfPeiLocalTokens
1394 #
1395 # Per, PCD architecture specification, PCD Token Number is 1 based and 0 is defined as invalid token number.
1396 # For each EX type PCD, a PCD Token Number is assigned. When the
1397 # PCD Driver/PEIM map EX_GUID and EX_TOKEN_NUMBER to the PCD Token Number,
1398 # the non-EX Protocol/PPI interface can be called to get/set the value. This assumption is made by
1399 # Pcd Driver/PEIM in MdeModulePkg.
1400 # Therefore, 1 is added to GeneratedTokenNumber to generate a PCD Token Number before being inserted
1401 # to the EXMAPPING_TABLE.
1402 #
1403 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(GeneratedTokenNumber + 1)
1404 Dict['EXMAPPING_TABLE_GUID_INDEX'].append(GuidList.index(TokenSpaceGuid))
1405
1406 if GuidList != []:
1407 Dict['GUID_TABLE_EMPTY'] = 'FALSE'
1408 Dict['GUID_TABLE_SIZE'] = len(GuidList)
1409 else:
1410 Dict['GUID_STRUCTURE'] = [GuidStringToGuidStructureString('00000000-0000-0000-0000-000000000000')]
1411
1412 if StringTableIndex == 0:
1413 Dict['STRING_TABLE_INDEX'].append('')
1414 Dict['STRING_TABLE_LENGTH'].append(1)
1415 Dict['STRING_TABLE_CNAME'].append('')
1416 Dict['STRING_TABLE_GUID'].append('')
1417 Dict['STRING_TABLE_VALUE'].append('{ 0 }')
1418 else:
1419 Dict['STRING_TABLE_EMPTY'] = 'FALSE'
1420 Dict['STRING_TABLE_SIZE'] = StringTableSize
1421
1422 if Dict['SIZE_TABLE_CNAME'] == []:
1423 Dict['SIZE_TABLE_CNAME'].append('')
1424 Dict['SIZE_TABLE_GUID'].append('')
1425 Dict['SIZE_TABLE_CURRENT_LENGTH'].append(0)
1426 Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(0)
1427
1428 if NumberOfLocalTokens != 0:
1429 Dict['DATABASE_EMPTY'] = 'FALSE'
1430 Dict['LOCAL_TOKEN_NUMBER_TABLE_SIZE'] = NumberOfLocalTokens
1431 Dict['LOCAL_TOKEN_NUMBER'] = NumberOfLocalTokens
1432
1433 if NumberOfExTokens != 0:
1434 Dict['EXMAP_TABLE_EMPTY'] = 'FALSE'
1435 Dict['EXMAPPING_TABLE_SIZE'] = NumberOfExTokens
1436 Dict['EX_TOKEN_NUMBER'] = NumberOfExTokens
1437 else:
1438 Dict['EXMAPPING_TABLE_EXTOKEN'].append(0)
1439 Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(0)
1440 Dict['EXMAPPING_TABLE_GUID_INDEX'].append(0)
1441
1442 if NumberOfSizeItems != 0:
1443 Dict['SIZE_TABLE_SIZE'] = NumberOfSizeItems * 2
1444
1445 AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))
1446 if NumberOfLocalTokens == 0:
1447 AutoGenC.Append(gEmptyPcdDatabaseAutoGenC.Replace(Dict))
1448 else:
1449 AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict))
1450
1451 return AutoGenH, AutoGenC
1452
1453## Create code for PCD database
1454#
1455# @param Info The ModuleAutoGen object
1456# @param AutoGenC The TemplateString object for C code
1457# @param AutoGenH The TemplateString object for header file
1458#
1459def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
1460 if Info.PcdIsDriver == "":
1461 return
1462 if Info.PcdIsDriver not in gPcdPhaseMap:
1463 EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver,
1464 ExtraData="[%s]" % str(Info))
1465
1466 AutoGenH.Append(gPcdDatabaseCommonAutoGenH)
1467 AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')
1468 AutoGenH.Append(AdditionalAutoGenH.String)
1469
1470 Phase = gPcdPhaseMap[Info.PcdIsDriver]
1471 if Phase == 'PEI':
1472 AutoGenC.Append(AdditionalAutoGenC.String)
1473
1474 if Phase == 'DXE':
1475 AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)
1476 AutoGenH.Append(AdditionalAutoGenH.String)
1477 AutoGenC.Append(AdditionalAutoGenC.String)
1478 AutoGenH.Append(gPcdDatabaseEpilogueAutoGenH)
1479
1480## Create code for library constructor
1481#
1482# @param Info The ModuleAutoGen object
1483# @param AutoGenC The TemplateString object for C code
1484# @param AutoGenH The TemplateString object for header file
1485#
1486def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):
1487 #
1488 # Library Constructors
1489 #
1490 ConstructorPrototypeString = TemplateString()
1491 ConstructorCallingString = TemplateString()
1492 if Info.IsLibrary:
1493 DependentLibraryList = [Info.Module]
1494 else:
1495 DependentLibraryList = Info.DependentLibraryList
1496 for Lib in DependentLibraryList:
1497 if len(Lib.ConstructorList) <= 0:
1498 continue
1499 Dict = {'Function':Lib.ConstructorList}
1500 if Lib.ModuleType in ['BASE', 'SEC']:
1501 ConstructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict))
1502 ConstructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict))
1503 elif Lib.ModuleType in ['PEI_CORE','PEIM']:
1504 ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))
1505 ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))
1506 elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
1507 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
1508 ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))
1509 ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))
1510
1511 if str(ConstructorPrototypeString) == '':
1512 ConstructorPrototypeList = []
1513 else:
1514 ConstructorPrototypeList = [str(ConstructorPrototypeString)]
1515 if str(ConstructorCallingString) == '':
1516 ConstructorCallingList = []
1517 else:
1518 ConstructorCallingList = [str(ConstructorCallingString)]
1519
1520 Dict = {
1521 'Type' : 'Constructor',
1522 'FunctionPrototype' : ConstructorPrototypeList,
1523 'FunctionCall' : ConstructorCallingList
1524 }
1525 if Info.IsLibrary:
1526 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)
1527 else:
1528 if Info.ModuleType in ['BASE', 'SEC']:
1529 AutoGenC.Append(gLibraryString['BASE'].Replace(Dict))
1530 elif Info.ModuleType in ['PEI_CORE','PEIM']:
1531 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))
1532 elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
1533 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
1534 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))
1535
1536## Create code for library destructor
1537#
1538# @param Info The ModuleAutoGen object
1539# @param AutoGenC The TemplateString object for C code
1540# @param AutoGenH The TemplateString object for header file
1541#
1542def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):
1543 #
1544 # Library Destructors
1545 #
1546 DestructorPrototypeString = TemplateString()
1547 DestructorCallingString = TemplateString()
1548 if Info.IsLibrary:
1549 DependentLibraryList = [Info.Module]
1550 else:
1551 DependentLibraryList = Info.DependentLibraryList
1552 for Index in range(len(DependentLibraryList)-1, -1, -1):
1553 Lib = DependentLibraryList[Index]
1554 if len(Lib.DestructorList) <= 0:
1555 continue
1556 Dict = {'Function':Lib.DestructorList}
1557 if Lib.ModuleType in ['BASE', 'SEC']:
1558 DestructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict))
1559 DestructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict))
1560 elif Lib.ModuleType in ['PEI_CORE','PEIM']:
1561 DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))
1562 DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))
1563 elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
1564 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
1565 DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))
1566 DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))
1567
1568 if str(DestructorPrototypeString) == '':
1569 DestructorPrototypeList = []
1570 else:
1571 DestructorPrototypeList = [str(DestructorPrototypeString)]
1572 if str(DestructorCallingString) == '':
1573 DestructorCallingList = []
1574 else:
1575 DestructorCallingList = [str(DestructorCallingString)]
1576
1577 Dict = {
1578 'Type' : 'Destructor',
1579 'FunctionPrototype' : DestructorPrototypeList,
1580 'FunctionCall' : DestructorCallingList
1581 }
1582 if Info.IsLibrary:
1583 AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict)
1584 else:
1585 if Info.ModuleType in ['BASE', 'SEC']:
1586 AutoGenC.Append(gLibraryString['BASE'].Replace(Dict))
1587 elif Info.ModuleType in ['PEI_CORE','PEIM']:
1588 AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))
1589 elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
1590 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
1591 AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))
1592
1593
1594## Create code for ModuleEntryPoint
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#
1600def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):
1601 if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']:
1602 return
1603 #
1604 # Module Entry Points
1605 #
1606 NumEntryPoints = len(Info.Module.ModuleEntryPointList)
1607 if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification:
1608 PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION']
1609 else:
1610 PiSpecVersion = 0
1611 if 'EFI_SPECIFICATION_VERSION' in Info.Module.Specification:
1612 EfiSpecVersion = Info.Module.Specification['EFI_SPECIFICATION_VERSION']
1613 else:
1614 EfiSpecVersion = 0
1615 Dict = {
1616 'Function' : Info.Module.ModuleEntryPointList,
1617 'PiSpecVersion' : PiSpecVersion,
1618 'EfiSpecVersion': EfiSpecVersion
1619 }
1620
1621 if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE']:
1622 if NumEntryPoints != 1:
1623 EdkLogger.error(
1624 "build",
1625 AUTOGEN_ERROR,
1626 '%s must have exactly one entry point' % Info.ModuleType,
1627 File=str(Info),
1628 ExtraData= ", ".join(Info.Module.ModuleEntryPointList)
1629 )
1630 if Info.ModuleType == 'PEI_CORE':
1631 AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict))
1632 AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict))
1633 elif Info.ModuleType == 'DXE_CORE':
1634 AutoGenC.Append(gDxeCoreEntryPointString.Replace(Dict))
1635 AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict))
1636 elif Info.ModuleType == 'SMM_CORE':
1637 AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict))
1638 elif Info.ModuleType == 'PEIM':
1639 if NumEntryPoints < 2:
1640 AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict))
1641 else:
1642 AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict))
1643 AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict))
1644 elif Info.ModuleType in ['DXE_RUNTIME_DRIVER','DXE_DRIVER','DXE_SMM_DRIVER',
1645 'DXE_SAL_DRIVER','UEFI_DRIVER', 'SMM_DRIVER']:
1646 if Info.ModuleType in ['DXE_SMM_DRIVER', 'SMM_DRIVER']:
1647 if NumEntryPoints == 0:
1648 AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict))
1649 else:
1650 AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict))
1651 AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict))
1652 else:
1653 if NumEntryPoints < 2:
1654 AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict))
1655 else:
1656 AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict))
1657 AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict))
1658 elif Info.ModuleType == 'UEFI_APPLICATION':
1659 if NumEntryPoints < 2:
1660 AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict))
1661 else:
1662 AutoGenC.Append(gUefiApplicationEntryPointString[2].Replace(Dict))
1663 AutoGenH.Append(gUefiApplicationEntryPointPrototype.Replace(Dict))
1664
1665## Create code for ModuleUnloadImage
1666#
1667# @param Info The ModuleAutoGen object
1668# @param AutoGenC The TemplateString object for C code
1669# @param AutoGenH The TemplateString object for header file
1670#
1671def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH):
1672 if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']:
1673 return
1674 #
1675 # Unload Image Handlers
1676 #
1677 NumUnloadImage = len(Info.Module.ModuleUnloadImageList)
1678 Dict = {'Count':NumUnloadImage, 'Function':Info.Module.ModuleUnloadImageList}
1679 if NumUnloadImage < 2:
1680 AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict))
1681 else:
1682 AutoGenC.Append(gUefiUnloadImageString[2].Replace(Dict))
1683 AutoGenH.Append(gUefiUnloadImagePrototype.Replace(Dict))
1684
1685## Create code for GUID
1686#
1687# @param Info The ModuleAutoGen object
1688# @param AutoGenC The TemplateString object for C code
1689# @param AutoGenH The TemplateString object for header file
1690#
1691def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH):
1692 if Info.IsLibrary:
1693 return
1694
1695 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1696 GuidType = "GUID"
1697 else:
1698 GuidType = "EFI_GUID"
1699
1700 if Info.GuidList:
1701 AutoGenC.Append("\n// Guids\n")
1702 #
1703 # GUIDs
1704 #
1705 for Key in Info.GuidList:
1706 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.GuidList[Key]))
1707
1708## Create code for protocol
1709#
1710# @param Info The ModuleAutoGen object
1711# @param AutoGenC The TemplateString object for C code
1712# @param AutoGenH The TemplateString object for header file
1713#
1714def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH):
1715 if Info.IsLibrary:
1716 return
1717
1718 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1719 GuidType = "GUID"
1720 else:
1721 GuidType = "EFI_GUID"
1722
1723 if Info.ProtocolList:
1724 AutoGenC.Append("\n// Protocols\n")
1725 #
1726 # Protocol GUIDs
1727 #
1728 for Key in Info.ProtocolList:
1729 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.ProtocolList[Key]))
1730
1731## Create code for PPI
1732#
1733# @param Info The ModuleAutoGen object
1734# @param AutoGenC The TemplateString object for C code
1735# @param AutoGenH The TemplateString object for header file
1736#
1737def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH):
1738 if Info.IsLibrary:
1739 return
1740
1741 if Info.ModuleType in ["USER_DEFINED", "BASE"]:
1742 GuidType = "GUID"
1743 else:
1744 GuidType = "EFI_GUID"
1745
1746 if Info.PpiList:
1747 AutoGenC.Append("\n// PPIs\n")
1748 #
1749 # PPI GUIDs
1750 #
1751 for Key in Info.PpiList:
1752 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.PpiList[Key]))
1753
1754## Create code for PCD
1755#
1756# @param Info The ModuleAutoGen object
1757# @param AutoGenC The TemplateString object for C code
1758# @param AutoGenH The TemplateString object for header file
1759#
1760def CreatePcdCode(Info, AutoGenC, AutoGenH):
1761 if Info.IsLibrary:
1762 if Info.ModulePcdList:
1763 AutoGenH.Append("\n// PCD definitions\n")
1764 for Pcd in Info.ModulePcdList:
1765 CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd)
1766 else:
1767 if Info.ModulePcdList:
1768 AutoGenH.Append("\n// Definition of PCDs used in this module\n")
1769 AutoGenC.Append("\n// Definition of PCDs used in this module\n")
1770 for Pcd in Info.ModulePcdList:
1771 CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd)
1772
1773 if Info.LibraryPcdList:
1774 AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n")
1775 AutoGenC.Append("\n// Definition of PCDs used in libraries\n")
1776 for Pcd in Info.LibraryPcdList:
1777 CreateModulePcdCode(Info, AutoGenC, AutoGenC, Pcd)
1778 CreatePcdDatabaseCode(Info, AutoGenC, AutoGenH)
1779
1780## Create code for unicode string definition
1781#
1782# @param Info The ModuleAutoGen object
1783# @param AutoGenC The TemplateString object for C code
1784# @param AutoGenH The TemplateString object for header file
1785#
1786def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
1787 WorkingDir = os.getcwd()
1788 os.chdir(Info.WorkspaceDir)
1789
1790 IncList = [Info.MetaFile.Dir]
1791 # Get all files under [Sources] section in inf file for EDK-II module
1792 SrcList = [F for F in Info.SourceFileList]
1793 if Info.AutoGenVersion < 0x00010005:
1794 # Get all files under the module directory for EDK-I module
1795 Cwd = os.getcwd()
1796 os.chdir(Info.MetaFile.Dir)
1797 for Root, Dirs, Files in os.walk("."):
1798 if 'CVS' in Dirs:
1799 Dirs.remove('CVS')
1800 if '.svn' in Dirs:
1801 Dirs.remove('.svn')
1802 for File in Files:
1803 File = PathClass(os.path.join(Root, File), Info.MetaFile.Dir)
1804 if File in SrcList:
1805 continue
1806 SrcList.append(File)
1807 os.chdir(Cwd)
1808
1809 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-c') > -1:
1810 CompatibleMode = True
1811 else:
1812 CompatibleMode = False
1813
1814 #
1815 # -s is a temporary option dedicated for building .UNI files with ISO 639-2 lanauge codes of EDK Shell in EDK2
1816 #
1817 if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1:
1818 if CompatibleMode:
1819 EdkLogger.error("build", AUTOGEN_ERROR,
1820 "-c and -s build options should be used exclusively",
1821 ExtraData="[%s]" % str(Info))
1822 ShellMode = True
1823 else:
1824 ShellMode = False
1825
1826 Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode)
1827 AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
1828 AutoGenC.Append(Code)
1829 AutoGenC.Append("\n")
1830 AutoGenH.Append("\n//\n//Unicode String ID\n//\n")
1831 AutoGenH.Append(Header)
1832 AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)
1833 os.chdir(WorkingDir)
1834
1835## Create common code
1836#
1837# @param Info The ModuleAutoGen object
1838# @param AutoGenC The TemplateString object for C code
1839# @param AutoGenH The TemplateString object for header file
1840#
1841def CreateHeaderCode(Info, AutoGenC, AutoGenH):
1842 # file header
1843 AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'}))
1844 # header file Prologue
1845 AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')}))
1846 if Info.AutoGenVersion >= 0x00010005:
1847 # specification macros
1848 AutoGenH.Append(gSpecificationString.Replace({'SpecificationName':Info.Specification.keys(),
1849 'SpecificationValue':Info.Specification.values()}))
1850 # header files includes
1851 AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile)
1852 if Info.ModuleType in gModuleTypeHeaderFile \
1853 and gModuleTypeHeaderFile[Info.ModuleType][0] != gBasicHeaderFile:
1854 AutoGenH.Append("#include <%s>\n" % gModuleTypeHeaderFile[Info.ModuleType][0])
1855 AutoGenH.Append('\nextern GUID gEfiCallerIdGuid;\n\n')
1856
1857 if Info.IsLibrary:
1858 return
1859
1860 AutoGenH.Append("#define EFI_CALLER_ID_GUID \\\n %s\n" % GuidStringToGuidStructureString(Info.Guid))
1861
1862 if Info.IsLibrary:
1863 return
1864 # C file header
1865 AutoGenC.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.c'}))
1866 if Info.AutoGenVersion >= 0x00010005:
1867 # C file header files includes
1868 if Info.ModuleType in gModuleTypeHeaderFile:
1869 for Inc in gModuleTypeHeaderFile[Info.ModuleType]:
1870 AutoGenC.Append("#include <%s>\n" % Inc)
1871 else:
1872 AutoGenC.Append("#include <%s>\n" % gBasicHeaderFile)
1873
1874 #
1875 # Publish the CallerId Guid
1876 #
1877 AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid))
1878
1879## Create common code for header file
1880#
1881# @param Info The ModuleAutoGen object
1882# @param AutoGenC The TemplateString object for C code
1883# @param AutoGenH The TemplateString object for header file
1884#
1885def CreateFooterCode(Info, AutoGenC, AutoGenH):
1886 AutoGenH.Append(gAutoGenHEpilogueString)
1887
1888## Create code for a module
1889#
1890# @param Info The ModuleAutoGen object
1891# @param AutoGenC The TemplateString object for C code
1892# @param AutoGenH The TemplateString object for header file
1893#
1894def CreateCode(Info, AutoGenC, AutoGenH, StringH):
1895 CreateHeaderCode(Info, AutoGenC, AutoGenH)
1896
1897 if Info.AutoGenVersion >= 0x00010005:
1898 CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH)
1899 CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH)
1900 CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH)
1901 CreatePcdCode(Info, AutoGenC, AutoGenH)
1902 CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH)
1903 CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH)
1904 CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH)
1905 CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH)
1906
1907 if Info.UnicodeFileList:
1908 FileName = "%sStrDefs.h" % Info.Name
1909 StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))
1910 StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')}))
1911 CreateUnicodeStringCode(Info, AutoGenC, StringH)
1912 StringH.Append("\n#endif\n")
1913 AutoGenH.Append('#include "%s"\n' % FileName)
1914
1915 CreateFooterCode(Info, AutoGenC, AutoGenH)
1916
1917 # no generation of AutoGen.c for R8 modules without unicode file
1918 if Info.AutoGenVersion < 0x00010005 and len(Info.UnicodeFileList) == 0:
1919 AutoGenC.String = ''
1920
1921## Create the code file
1922#
1923# @param FilePath The path of code file
1924# @param Content The content of code file
1925#
1926# @retval True If file content is changed or file doesn't exist
1927# @retval False If the file exists and the content is not changed
1928#
1929def Generate(FilePath, Content):
1930 return SaveFileOnChange(FilePath, Content, False)
1931