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