diff options
author | Liming Gao <liming.gao@intel.com> | 2013-11-18 07:41:21 +0000 |
---|---|---|
committer | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2013-11-18 07:41:21 +0000 |
commit | e8a47801a1dfdb148b1bfcd5bdc8ebc3bf51f92d (patch) | |
tree | 04e3ec271347360a5e9da898f1dccbce3d94681f /BaseTools/Source/Python/AutoGen/GenC.py | |
parent | fddbbc661eeff8e9f94942fa2d47fb637404a040 (diff) | |
download | edk2-e8a47801a1dfdb148b1bfcd5bdc8ebc3bf51f92d.tar.gz edk2-e8a47801a1dfdb148b1bfcd5bdc8ebc3bf51f92d.tar.bz2 edk2-e8a47801a1dfdb148b1bfcd5bdc8ebc3bf51f92d.zip |
Sync BaseTool trunk (version r2610) into EDKII BaseTools.
Signed-off-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14856 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'BaseTools/Source/Python/AutoGen/GenC.py')
-rw-r--r-- | BaseTools/Source/Python/AutoGen/GenC.py | 907 |
1 files changed, 174 insertions, 733 deletions
diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 2eb920417e..63ba2b241e 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -1,7 +1,7 @@ ## @file # Routines for generating AutoGen.h and AutoGen.c # -# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR> # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -22,6 +22,7 @@ from Common.DataType import * from Common.Misc import * from Common.String import StringToArray from StrGather import * +from GenPcdDb import CreatePcdDatabaseCode ## PCD type string gItemTypeStringDatabase = { @@ -49,252 +50,6 @@ gDatumSizeStringDatabase = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64 gDatumSizeStringDatabaseH = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOL','VOID*':'PTR'} gDatumSizeStringDatabaseLib = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'Bool','VOID*':'Ptr'} -## Mapping between PCD driver type and EFI phase -gPcdPhaseMap = { - "PEI_PCD_DRIVER" : "PEI", - "DXE_PCD_DRIVER" : "DXE" -} - -gPcdDatabaseCommonAutoGenH = """ -// -// The following definition will be generated by build tool -// - -// -// Common definitions -// -typedef UINT8 SKU_ID; - -#define PCD_TYPE_SHIFT 28 - -#define PCD_TYPE_DATA (0x0U << PCD_TYPE_SHIFT) -#define PCD_TYPE_HII (0x8U << PCD_TYPE_SHIFT) -#define PCD_TYPE_VPD (0x4U << PCD_TYPE_SHIFT) -#define PCD_TYPE_SKU_ENABLED (0x2U << PCD_TYPE_SHIFT) -#define PCD_TYPE_STRING (0x1U << PCD_TYPE_SHIFT) - -#define PCD_TYPE_ALL_SET (PCD_TYPE_DATA | PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED | PCD_TYPE_STRING) - -#define PCD_DATUM_TYPE_SHIFT 24 - -#define PCD_DATUM_TYPE_POINTER (0x0U << PCD_DATUM_TYPE_SHIFT) -#define PCD_DATUM_TYPE_UINT8 (0x1U << PCD_DATUM_TYPE_SHIFT) -#define PCD_DATUM_TYPE_UINT16 (0x2U << PCD_DATUM_TYPE_SHIFT) -#define PCD_DATUM_TYPE_UINT32 (0x4U << PCD_DATUM_TYPE_SHIFT) -#define PCD_DATUM_TYPE_UINT64 (0x8U << PCD_DATUM_TYPE_SHIFT) - -#define PCD_DATUM_TYPE_ALL_SET (PCD_DATUM_TYPE_POINTER | \\ - PCD_DATUM_TYPE_UINT8 | \\ - PCD_DATUM_TYPE_UINT16 | \\ - PCD_DATUM_TYPE_UINT32 | \\ - PCD_DATUM_TYPE_UINT64) - -#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_ALL_SET | PCD_DATUM_TYPE_ALL_SET)) - -typedef struct { - UINT32 ExTokenNumber; - UINT16 LocalTokenNumber; // PCD Number of this particular platform build - UINT16 ExGuidIndex; // Index of GuidTable -} DYNAMICEX_MAPPING; - -typedef struct { - UINT32 SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler - UINT32 SkuIdTableOffset; //Offset from the PCD_DB -} SKU_HEAD; - -typedef struct { - UINT32 StringIndex; // Offset in String Table in units of UINT32. - UINT32 DefaultValueOffset; // Offset of the Default Value - UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID. - UINT16 Offset; // Offset in Variable -} VARIABLE_HEAD; - -typedef struct { - UINT32 Offset; -} VPD_HEAD; - -typedef UINT32 STRING_HEAD; - -typedef UINT16 SIZE_INFO; - -#define offsetof(s,m) (UINT32) (UINTN) &(((s *)0)->m) - -""" - -gPcdDatabaseEpilogueAutoGenH = """ -typedef struct { - PEI_PCD_DATABASE PeiDb; - DXE_PCD_DATABASE DxeDb; -} PCD_DATABASE; - -#define PCD_TOTAL_TOKEN_NUMBER (PEI_LOCAL_TOKEN_NUMBER + DXE_LOCAL_TOKEN_NUMBER) - -""" - -gPcdDatabaseAutoGenH = TemplateString(""" -#define ${PHASE}_GUID_TABLE_SIZE ${GUID_TABLE_SIZE} -#define ${PHASE}_STRING_TABLE_SIZE ${STRING_TABLE_SIZE} -#define ${PHASE}_SKUID_TABLE_SIZE ${SKUID_TABLE_SIZE} -#define ${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE ${LOCAL_TOKEN_NUMBER_TABLE_SIZE} -#define ${PHASE}_LOCAL_TOKEN_NUMBER ${LOCAL_TOKEN_NUMBER} -#define ${PHASE}_EXMAPPING_TABLE_SIZE ${EXMAPPING_TABLE_SIZE} -#define ${PHASE}_EX_TOKEN_NUMBER ${EX_TOKEN_NUMBER} -#define ${PHASE}_SIZE_TABLE_SIZE ${SIZE_TABLE_SIZE} -#define ${PHASE}_GUID_TABLE_EMPTY ${GUID_TABLE_EMPTY} -#define ${PHASE}_STRING_TABLE_EMPTY ${STRING_TABLE_EMPTY} -#define ${PHASE}_SKUID_TABLE_EMPTY ${SKUID_TABLE_EMPTY} -#define ${PHASE}_DATABASE_EMPTY ${DATABASE_EMPTY} -#define ${PHASE}_EXMAP_TABLE_EMPTY ${EXMAP_TABLE_EMPTY} - -typedef struct { -${BEGIN} UINT64 ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}]; -${END} -${BEGIN} UINT64 ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64}; -${END} -${BEGIN} UINT32 ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}]; -${END} -${BEGIN} UINT32 ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32}; -${END} -${BEGIN} VPD_HEAD ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}]; -${END} - DYNAMICEX_MAPPING ExMapTable[${PHASE}_EXMAPPING_TABLE_SIZE]; - UINT32 LocalTokenNumberTable[${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE]; - GUID GuidTable[${PHASE}_GUID_TABLE_SIZE]; -${BEGIN} STRING_HEAD ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}]; -${END} -${BEGIN} VARIABLE_HEAD ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}]; -${END} -${BEGIN} UINT8 StringTable${STRING_TABLE_INDEX}[${STRING_TABLE_LENGTH}]; /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */ -${END} - SIZE_INFO SizeTable[${PHASE}_SIZE_TABLE_SIZE]; -${BEGIN} UINT16 ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}]; -${END} -${BEGIN} UINT16 ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16}; -${END} -${BEGIN} UINT8 ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}]; -${END} -${BEGIN} UINT8 ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8}; -${END} -${BEGIN} BOOLEAN ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}]; -${END} -${BEGIN} BOOLEAN ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN}; -${END} - UINT8 SkuIdTable[${PHASE}_SKUID_TABLE_SIZE]; -${SYSTEM_SKU_ID} -} ${PHASE}_PCD_DATABASE_INIT; - -typedef struct { -${PCD_DATABASE_UNINIT_EMPTY} -${BEGIN} UINT64 ${UNINIT_CNAME_DECL_UINT64}_${UNINIT_GUID_DECL_UINT64}[${UNINIT_NUMSKUS_DECL_UINT64}]; -${END} -${BEGIN} UINT32 ${UNINIT_CNAME_DECL_UINT32}_${UNINIT_GUID_DECL_UINT32}[${UNINIT_NUMSKUS_DECL_UINT32}]; -${END} -${BEGIN} UINT16 ${UNINIT_CNAME_DECL_UINT16}_${UNINIT_GUID_DECL_UINT16}[${UNINIT_NUMSKUS_DECL_UINT16}]; -${END} -${BEGIN} UINT8 ${UNINIT_CNAME_DECL_UINT8}_${UNINIT_GUID_DECL_UINT8}[${UNINIT_NUMSKUS_DECL_UINT8}]; -${END} -${BEGIN} BOOLEAN ${UNINIT_CNAME_DECL_BOOLEAN}_${UNINIT_GUID_DECL_BOOLEAN}[${UNINIT_NUMSKUS_DECL_BOOLEAN}]; -${END} -} ${PHASE}_PCD_DATABASE_UNINIT; - -#define PCD_${PHASE}_SERVICE_DRIVER_VERSION 2 - -typedef struct { - ${PHASE}_PCD_DATABASE_INIT Init; - ${PHASE}_PCD_DATABASE_UNINIT Uninit; -} ${PHASE}_PCD_DATABASE; - -#define ${PHASE}_NEX_TOKEN_NUMBER (${PHASE}_LOCAL_TOKEN_NUMBER - ${PHASE}_EX_TOKEN_NUMBER) -""") - -gEmptyPcdDatabaseAutoGenC = TemplateString(""" -${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = { - /* ExMapTable */ - { - {0, 0, 0} - }, - /* LocalTokenNumberTable */ - { - 0 - }, - /* GuidTable */ - { - {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}} - }, - /* StringTable */ - { 0 }, - /* SizeTable */ - { - 0, 0 - }, - /* SkuIdTable */ - { 0 }, - ${SYSTEM_SKU_ID_VALUE} -}; -""") - -gPcdDatabaseAutoGenC = TemplateString(""" -${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = { -${BEGIN} { ${INIT_VALUE_UINT64} }, /* ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */ -${END} -${BEGIN} ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */ -${END} -${BEGIN} { ${INIT_VALUE_UINT32} }, /* ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}] */ -${END} -${BEGIN} ${VARDEF_VALUE_UINT32}, /* ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32} */ -${END} - /* VPD */ -${BEGIN} { ${VPD_HEAD_VALUE} }, /* ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}] */ -${END} - /* ExMapTable */ - { -${BEGIN} { ${EXMAPPING_TABLE_EXTOKEN}, ${EXMAPPING_TABLE_LOCAL_TOKEN}, ${EXMAPPING_TABLE_GUID_INDEX} }, -${END} - }, - /* LocalTokenNumberTable */ - { -${BEGIN} offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}${VARDEF_HEADER}) | ${TOKEN_TYPE}, -${END} - }, - /* GuidTable */ - { -${BEGIN} ${GUID_STRUCTURE}, -${END} - }, -${BEGIN} { ${STRING_HEAD_VALUE} }, /* ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}] */ -${END} -${BEGIN} /* ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}] */ - { - ${VARIABLE_HEAD_VALUE} - }, -${END} - /* StringTable */ -${BEGIN} ${STRING_TABLE_VALUE}, /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */ -${END} - /* SizeTable */ - { -${BEGIN} ${SIZE_TABLE_MAXIMUM_LENGTH}, ${SIZE_TABLE_CURRENT_LENGTH}, /* ${SIZE_TABLE_CNAME}_${SIZE_TABLE_GUID} */ -${END} - }, -${BEGIN} { ${INIT_VALUE_UINT16} }, /* ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}] */ -${END} -${BEGIN} ${VARDEF_VALUE_UINT16}, /* ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16} */ -${END} -${BEGIN} { ${INIT_VALUE_UINT8} }, /* ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}] */ -${END} -${BEGIN} ${VARDEF_VALUE_UINT8}, /* ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8} */ -${END} -${BEGIN} { ${INIT_VALUE_BOOLEAN} }, /* ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}] */ -${END} -${BEGIN} ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */ -${END} - /* SkuIdTable */ - { ${BEGIN}${SKUID_VALUE}, ${END} }, - ${SYSTEM_SKU_ID_VALUE} -}; -""") - - ## AutoGen File Header Templates gAutoGenHeaderString = TemplateString("""\ /** @@ -907,6 +662,76 @@ gModuleTypeHeaderFile = { "USER_DEFINED" : [gBasicHeaderFile] } +## Autogen internal worker macro to define DynamicEx PCD name includes both the TokenSpaceGuidName +# the TokenName and Guid comparison to avoid define name collisions. +# +# @param Info The ModuleAutoGen object +# @param AutoGenH The TemplateString object for header file +# +# +def DynExPcdTokenNumberMapping(Info, AutoGenH): + ExTokenCNameList = [] + PcdExList = [] + if Info.IsLibrary: + PcdList = Info.LibraryPcdList + else: + PcdList = Info.ModulePcdList + for Pcd in PcdList: + if Pcd.Type in gDynamicExPcd: + ExTokenCNameList.append(Pcd.TokenCName) + PcdExList.append(Pcd) + if len(ExTokenCNameList) == 0: + return + AutoGenH.Append('\n#define COMPAREGUID(Guid1, Guid2) (BOOLEAN)(*(CONST UINT64*)Guid1 == *(CONST UINT64*)Guid2 && *((CONST UINT64*)Guid1 + 1) == *((CONST UINT64*)Guid2 + 1))\n') + # AutoGen for each PCD listed in a [PcdEx] section of a Module/Lib INF file. + # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter. + # Use the Guid pointer to see if it matches any of the token space GUIDs. + TokenCNameList = [] + for TokenCName in ExTokenCNameList: + if TokenCName in TokenCNameList: + continue + Index = 0 + Count = ExTokenCNameList.count(TokenCName) + for Pcd in PcdExList: + if Pcd.TokenCName == TokenCName: + Index = Index + 1 + if Index == 1: + AutoGenH.Append('\n#define __PCD_%s_ADDR_CMP(GuidPtr) (' % (Pcd.TokenCName)) + AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + else: + AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + if Index == Count: + AutoGenH.Append('0 \\\n )\n') + TokenCNameList.append(TokenCName) + + TokenCNameList = [] + for TokenCName in ExTokenCNameList: + if TokenCName in TokenCNameList: + continue + Index = 0 + Count = ExTokenCNameList.count(TokenCName) + for Pcd in PcdExList: + if Pcd.Type in gDynamicExPcd and Pcd.TokenCName == TokenCName: + Index = Index + 1 + if Index == 1: + AutoGenH.Append('\n#define __PCD_%s_VAL_CMP(GuidPtr) (' % (Pcd.TokenCName)) + AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + else: + AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + if Index == Count: + AutoGenH.Append('0 \\\n )\n') + # Autogen internal worker macro to compare GUIDs. Guid1 is a pointer to a GUID. + # Guid2 is a C name for a GUID. Compare pointers first because optimizing compiler + # can do this at build time on CONST GUID pointers and optimize away call to COMPAREGUID(). + # COMPAREGUID() will only be used if the Guid passed in is local to the module. + AutoGenH.Append('#define _PCD_TOKEN_EX_%s(GuidPtr) __PCD_%s_ADDR_CMP(GuidPtr) ? __PCD_%s_ADDR_CMP(GuidPtr) : __PCD_%s_VAL_CMP(GuidPtr) \n' + % (Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName)) + TokenCNameList.append(TokenCName) + ## Create code for module PCDs # # @param Info The ModuleAutoGen object @@ -923,13 +748,29 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName if Pcd.Type in gDynamicExPcd: TokenNumber = int(Pcd.TokenValue, 0) + # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with + # different Guids but same TokenCName + PcdExTokenName = '_PCD_TOKEN_' + Pcd.TokenSpaceGuidCName + '_' + Pcd.TokenCName + AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) else: if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: - EdkLogger.error("build", AUTOGEN_ERROR, - "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] - AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber)) + # If one of the Source built modules listed in the DSC is not listed in FDF modules, + # and the INF lists a PCD can only use the PcdsDynamic access method (it is only + # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will + # report warning message notify the PI that they are attempting to build a module + # that must be included in a flash image in order to be functional. These Dynamic PCD + # will not be added into the Database unless it is used by other modules that are + # included in the FDF file. + # In this case, just assign an invalid token number to make it pass build. + if Pcd.Type in PCD_DYNAMIC_TYPE_LIST: + TokenNumber = 0 + else: + EdkLogger.error("build", AUTOGEN_ERROR, + "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + else: + TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] + AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber)) EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + Pcd.TokenCName + "." + Pcd.TokenSpaceGuidCName) if Pcd.Type not in gItemTypeStringDatabase: @@ -946,12 +787,33 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName + PcdExCNameList = [] if Pcd.Type in gDynamicExPcd: - AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Info.IsLibrary: + PcdList = Info.LibraryPcdList else: - AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + PcdList = Info.ModulePcdList + for PcdModule in PcdList: + if PcdModule.Type in gDynamicExPcd: + PcdExCNameList.append(PcdModule.TokenCName) + # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd. + # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build. + # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. + if PcdExCNameList.count(Pcd.TokenCName) > 1: + AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') + AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) elif Pcd.Type in gDynamicPcd: AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) if Pcd.DatumType == 'VOID*': @@ -1117,16 +979,30 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName TokenCName = Pcd.TokenCName - TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[TokenSpaceGuidCName] - if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: - EdkLogger.error("build", AUTOGEN_ERROR, - "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - TokenNumber = PcdTokenNumber[TokenCName, TokenSpaceGuidCName] - - # If PCD is DynamicEx, then use TokenNumber declared in DEC file + PcdTokenName = '_PCD_TOKEN_' + TokenCName + # + # Write PCDs + # if Pcd.Type in gDynamicExPcd: TokenNumber = int(Pcd.TokenValue, 0) + else: + if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: + # If one of the Source built modules listed in the DSC is not listed in FDF modules, + # and the INF lists a PCD can only use the PcdsDynamic access method (it is only + # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will + # report warning message notify the PI that they are attempting to build a module + # that must be included in a flash image in order to be functional. These Dynamic PCD + # will not be added into the Database unless it is used by other modules that are + # included in the FDF file. + # In this case, just assign an invalid token number to make it pass build. + if Pcd.Type in PCD_DYNAMIC_TYPE_LIST: + TokenNumber = 0 + else: + EdkLogger.error("build", AUTOGEN_ERROR, + "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + else: + TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] if Pcd.Type not in gItemTypeStringDatabase: EdkLogger.error("build", AUTOGEN_ERROR, @@ -1148,23 +1024,40 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): if Pcd.DatumType == 'VOID*': Type = '(VOID *)' Array = '[]' - - AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber)) - PcdItemType = Pcd.Type - #if PcdItemType in gDynamicPcd: - # PcdItemType = TAB_PCDS_FIXED_AT_BUILD - # if (TokenCName, TokenSpaceGuidCName) in Info.PlatformInfo.Platform.Pcds: - # PcdItemType = Info.PlatformInfo.Platform.Pcds[TokenCName, TokenSpaceGuidCName].Type + PcdExCNameList = [] if PcdItemType in gDynamicExPcd: - PcdTokenName = '_PCD_TOKEN_' + TokenCName - AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName)) - if DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName,DatumSizeLib, TokenSpaceGuidCName, PcdTokenName)) + PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + Pcd.TokenCName + AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) + + if Info.IsLibrary: + PcdList = Info.LibraryPcdList + else: + PcdList = Info.ModulePcdList + for PcdModule in PcdList: + if PcdModule.Type in gDynamicExPcd: + PcdExCNameList.append(PcdModule.TokenCName) + # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd. + # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build. + # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. + if PcdExCNameList.count(Pcd.TokenCName) > 1: + AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') + AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) else: - AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName)) + AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber)) if PcdItemType in gDynamicPcd: - PcdTokenName = '_PCD_TOKEN_' + TokenCName AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) if DatumType == 'VOID*': AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName)) @@ -1172,468 +1065,15 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName)) if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE: PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName - AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) ) + AutoGenH.Append('extern volatile %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) ) AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName)) AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName)) if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG: AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array)) - #AutoGenH.Append('#define _PCD_VALUE_%s _gPcd_FixedAtBuild_%s\n' %(TokenCName, TokenCName)) AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName)) AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName) -## Create code for PCD database in DXE or PEI phase -# -# @param Platform The platform object -# @retval tuple Two TemplateString objects for C code and header file, -# respectively -# -def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase): - AutoGenC = TemplateString() - AutoGenH = TemplateString() - - Dict = { - 'PHASE' : Phase, - 'GUID_TABLE_SIZE' : '1U', - 'STRING_TABLE_SIZE' : '1U', - 'SKUID_TABLE_SIZE' : '1U', - 'LOCAL_TOKEN_NUMBER_TABLE_SIZE' : '1U', - 'LOCAL_TOKEN_NUMBER' : '0U', - 'EXMAPPING_TABLE_SIZE' : '1U', - 'EX_TOKEN_NUMBER' : '0U', - 'SIZE_TABLE_SIZE' : '2U', - 'GUID_TABLE_EMPTY' : 'TRUE', - 'STRING_TABLE_EMPTY' : 'TRUE', - 'SKUID_TABLE_EMPTY' : 'TRUE', - 'DATABASE_EMPTY' : 'TRUE', - 'EXMAP_TABLE_EMPTY' : 'TRUE', - 'PCD_DATABASE_UNINIT_EMPTY' : ' UINT8 dummy; /* PCD_DATABASE_UNINIT is emptry */', - 'SYSTEM_SKU_ID' : ' SKU_ID SystemSkuId;', - 'SYSTEM_SKU_ID_VALUE' : '0U' - } - - for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN', "VOID*"]: - Dict['VARDEF_CNAME_' + DatumType] = [] - Dict['VARDEF_GUID_' + DatumType] = [] - Dict['VARDEF_SKUID_' + DatumType] = [] - Dict['VARDEF_VALUE_' + DatumType] = [] - for Init in ['INIT','UNINIT']: - Dict[Init+'_CNAME_DECL_' + DatumType] = [] - Dict[Init+'_GUID_DECL_' + DatumType] = [] - Dict[Init+'_NUMSKUS_DECL_' + DatumType] = [] - Dict[Init+'_VALUE_' + DatumType] = [] - - for Type in ['STRING_HEAD','VPD_HEAD','VARIABLE_HEAD']: - Dict[Type + '_CNAME_DECL'] = [] - Dict[Type + '_GUID_DECL'] = [] - Dict[Type + '_NUMSKUS_DECL'] = [] - Dict[Type + '_VALUE'] = [] - - Dict['STRING_TABLE_INDEX'] = [] - Dict['STRING_TABLE_LENGTH'] = [] - Dict['STRING_TABLE_CNAME'] = [] - Dict['STRING_TABLE_GUID'] = [] - Dict['STRING_TABLE_VALUE'] = [] - - Dict['SIZE_TABLE_CNAME'] = [] - Dict['SIZE_TABLE_GUID'] = [] - Dict['SIZE_TABLE_CURRENT_LENGTH'] = [] - Dict['SIZE_TABLE_MAXIMUM_LENGTH'] = [] - - Dict['EXMAPPING_TABLE_EXTOKEN'] = [] - Dict['EXMAPPING_TABLE_LOCAL_TOKEN'] = [] - Dict['EXMAPPING_TABLE_GUID_INDEX'] = [] - - Dict['GUID_STRUCTURE'] = [] - - Dict['SKUID_VALUE'] = [] - Dict['VARDEF_HEADER'] = [] - if Phase == 'DXE': - Dict['SYSTEM_SKU_ID'] = '' - Dict['SYSTEM_SKU_ID_VALUE'] = '' - - StringTableIndex = 0 - StringTableSize = 0 - NumberOfLocalTokens = 0 - NumberOfPeiLocalTokens = 0 - NumberOfDxeLocalTokens = 0 - NumberOfExTokens = 0 - NumberOfSizeItems = 0 - GuidList = [] - - for Pcd in Platform.DynamicPcdList: - CName = Pcd.TokenCName - TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName - - EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase)) - if Pcd.DatumType not in gDatumSizeStringDatabase: - EdkLogger.error("build", AUTOGEN_ERROR, - "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Platform)) - - if Pcd.Phase == 'PEI': - NumberOfPeiLocalTokens += 1 - if Pcd.Phase == 'DXE': - NumberOfDxeLocalTokens += 1 - if Pcd.Phase != Phase: - continue - - # - # TODO: need GetGuidValue() definition - # - TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue - TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure) - if Pcd.Type in gDynamicExPcd: - if TokenSpaceGuid not in GuidList: - GuidList += [TokenSpaceGuid] - Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure) - NumberOfExTokens += 1 - ValueList = [] - StringHeadOffsetList = [] - VpdHeadOffsetList = [] - VariableHeadValueList = [] - Pcd.InitString = 'UNINIT' - - if Pcd.DatumType == 'VOID*': - if Pcd.Type not in ["DynamicVpd", "DynamicExVpd"]: - Pcd.TokenTypeList = ['PCD_TYPE_STRING'] - else: - Pcd.TokenTypeList = [] - elif Pcd.DatumType == 'BOOLEAN': - Pcd.TokenTypeList = ['PCD_DATUM_TYPE_UINT8'] - else: - Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType] - - if len(Pcd.SkuInfoList) > 1: - Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED'] - - for SkuName in Pcd.SkuInfoList: - Sku = Pcd.SkuInfoList[SkuName] - SkuId = Sku.SkuId - if SkuId == None or SkuId == '': - continue - - if (SkuId + 'U') not in Dict['SKUID_VALUE']: - Dict['SKUID_VALUE'].append(SkuId + 'U') - - SkuIdIndex = Dict['SKUID_VALUE'].index(SkuId + 'U') - if len(Sku.VariableName) > 0: - Pcd.TokenTypeList += ['PCD_TYPE_HII'] - Pcd.InitString = 'INIT' - VariableNameStructure = StringToArray(Sku.VariableName) - if VariableNameStructure not in Dict['STRING_TABLE_VALUE']: - Dict['STRING_TABLE_CNAME'].append(CName) - Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid) - if StringTableIndex == 0: - Dict['STRING_TABLE_INDEX'].append('') - else: - Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex) - - Dict['STRING_TABLE_LENGTH'].append((len(Sku.VariableName) - 3 + 1) * 2) - Dict['STRING_TABLE_VALUE'].append(VariableNameStructure) - StringTableIndex += 1 - StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2 - - VariableHeadStringIndex = 0 - for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)): - VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index] - - VariableGuidStructure = Sku.VariableGuidValue - VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure) - if VariableGuid not in GuidList: - GuidList += [VariableGuid] - Dict['GUID_STRUCTURE'].append(VariableGuidStructure) - VariableHeadGuidIndex = GuidList.index(VariableGuid) - - if "PCD_TYPE_STRING" in Pcd.TokenTypeList: - VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s), %dU, %sU' % - (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, - VariableHeadGuidIndex, Sku.VariableOffset)) - else: - VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s), %dU, %sU' % - (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, SkuIdIndex, - VariableHeadGuidIndex, Sku.VariableOffset)) - Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName) - Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid) - Dict['VARDEF_SKUID_'+Pcd.DatumType].append(SkuIdIndex) - if "PCD_TYPE_STRING" in Pcd.TokenTypeList: - Dict['VARDEF_VALUE_' + Pcd.DatumType].append("%s_%s[%d]" % (Pcd.TokenCName, TokenSpaceGuid, SkuIdIndex)) - else: - # - # ULL (for UINT64) or U(other integer type) should be append to avoid - # warning under linux building environment. - # - if Pcd.DatumType == "UINT64": - Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "ULL") - elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"): - Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U") - elif Pcd.DatumType == "BOOLEAN": - if Sku.HiiDefaultValue in ["1", "0"]: - Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U") - else: - Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue) - - elif Sku.VpdOffset != '': - Pcd.TokenTypeList += ['PCD_TYPE_VPD'] - Pcd.InitString = 'INIT' - VpdHeadOffsetList.append(str(Sku.VpdOffset) + 'U') - continue - - if Pcd.DatumType == 'VOID*': - Pcd.TokenTypeList += ['PCD_TYPE_STRING'] - Pcd.InitString = 'INIT' - if Sku.HiiDefaultValue != '' and Sku.DefaultValue == '': - Sku.DefaultValue = Sku.HiiDefaultValue - if Sku.DefaultValue != '': - NumberOfSizeItems += 1 - Dict['STRING_TABLE_CNAME'].append(CName) - Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid) - - if StringTableIndex == 0: - Dict['STRING_TABLE_INDEX'].append('') - else: - Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex) - if Sku.DefaultValue[0] == 'L': - Size = (len(Sku.DefaultValue) - 3 + 1) * 2 - Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue)) - elif Sku.DefaultValue[0] == '"': - Size = len(Sku.DefaultValue) - 2 + 1 - Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue)) - elif Sku.DefaultValue[0] == '{': - Size = len(Sku.DefaultValue.replace(',',' ').split()) - Dict['STRING_TABLE_VALUE'].append(Sku.DefaultValue) - - StringHeadOffsetList.append(str(StringTableSize) + 'U') - Dict['SIZE_TABLE_CNAME'].append(CName) - Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid) - Dict['SIZE_TABLE_CURRENT_LENGTH'].append(str(Size) + 'U') - Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U') - if Pcd.MaxDatumSize != '': - MaxDatumSize = int(Pcd.MaxDatumSize, 0) - if MaxDatumSize < Size: - EdkLogger.error("build", AUTOGEN_ERROR, - "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Platform)) - Size = MaxDatumSize - Dict['STRING_TABLE_LENGTH'].append(Size) - StringTableIndex += 1 - StringTableSize += (Size) - else: - if "PCD_TYPE_HII" not in Pcd.TokenTypeList: - Pcd.TokenTypeList += ['PCD_TYPE_DATA'] - if Sku.DefaultValue == 'TRUE': - Pcd.InitString = 'INIT' - else: - try: - if int(Sku.DefaultValue, 0) != 0: - Pcd.InitString = 'INIT' - except: - pass - - # - # For UNIT64 type PCD's value, ULL should be append to avoid - # warning under linux building environment. - # - if Pcd.DatumType == "UINT64": - ValueList.append(Sku.DefaultValue + "ULL") - elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"): - ValueList.append(Sku.DefaultValue + "U") - elif Pcd.DatumType == "BOOLEAN": - if Sku.DefaultValue in ["1", "0"]: - ValueList.append(Sku.DefaultValue + "U") - else: - ValueList.append(Sku.DefaultValue) - - Pcd.TokenTypeList = list(set(Pcd.TokenTypeList)) - - - if 'PCD_TYPE_HII' in Pcd.TokenTypeList: - Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName) - Dict['VARIABLE_HEAD_GUID_DECL'].append(TokenSpaceGuid) - Dict['VARIABLE_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList)) - Dict['VARIABLE_HEAD_VALUE'].append('{ %s }\n' % ' },\n { '.join(VariableHeadValueList)) - Dict['VARDEF_HEADER'].append('_Variable_Header') - else: - Dict['VARDEF_HEADER'].append('') - if 'PCD_TYPE_VPD' in Pcd.TokenTypeList: - Dict['VPD_HEAD_CNAME_DECL'].append(CName) - Dict['VPD_HEAD_GUID_DECL'].append(TokenSpaceGuid) - Dict['VPD_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList)) - Dict['VPD_HEAD_VALUE'].append('{ %s }' % ' }, { '.join(VpdHeadOffsetList)) - if 'PCD_TYPE_STRING' in Pcd.TokenTypeList: - Dict['STRING_HEAD_CNAME_DECL'].append(CName) - Dict['STRING_HEAD_GUID_DECL'].append(TokenSpaceGuid) - Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList)) - Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList)) - if 'PCD_TYPE_DATA' in Pcd.TokenTypeList: - Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName) - Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid) - Dict[Pcd.InitString+'_NUMSKUS_DECL_'+Pcd.DatumType].append(len(Pcd.SkuInfoList)) - if Pcd.InitString == 'UNINIT': - Dict['PCD_DATABASE_UNINIT_EMPTY'] = '' - else: - Dict[Pcd.InitString+'_VALUE_'+Pcd.DatumType].append(', '.join(ValueList)) - - if Phase == 'PEI': - NumberOfLocalTokens = NumberOfPeiLocalTokens - if Phase == 'DXE': - NumberOfLocalTokens = NumberOfDxeLocalTokens - - Dict['TOKEN_INIT'] = ['' for x in range(NumberOfLocalTokens)] - Dict['TOKEN_CNAME'] = ['' for x in range(NumberOfLocalTokens)] - Dict['TOKEN_GUID'] = ['' for x in range(NumberOfLocalTokens)] - Dict['TOKEN_TYPE'] = ['' for x in range(NumberOfLocalTokens)] - - for Pcd in Platform.DynamicPcdList: - CName = Pcd.TokenCName - TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName - if Pcd.Phase != Phase: - continue - - TokenSpaceGuid = GuidStructureStringToGuidValueName(Pcd.TokenSpaceGuidValue) #(Platform.PackageList, TokenSpaceGuidCName)) - GeneratedTokenNumber = Platform.PcdTokenNumber[CName, TokenSpaceGuidCName] - 1 - if Phase == 'DXE': - GeneratedTokenNumber -= NumberOfPeiLocalTokens - - EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName)) - EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase) - EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber)) - - Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Init' - if Pcd.InitString == 'UNINIT': - Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Uninit' - Dict['TOKEN_CNAME'][GeneratedTokenNumber] = CName - Dict['TOKEN_GUID'][GeneratedTokenNumber] = TokenSpaceGuid - Dict['TOKEN_TYPE'][GeneratedTokenNumber] = ' | '.join(Pcd.TokenTypeList) - - Pcd.TokenTypeList = list(set(Pcd.TokenTypeList)) - # - # Update VARDEF_HEADER - # - if 'PCD_TYPE_HII' in Pcd.TokenTypeList: - Dict['VARDEF_HEADER'][GeneratedTokenNumber] = '_Variable_Header' - else: - Dict['VARDEF_HEADER'][GeneratedTokenNumber] = '' - - - if Pcd.Type in gDynamicExPcd: - Dict['EXMAPPING_TABLE_EXTOKEN'].append(str(Pcd.TokenValue) + 'U') - if Phase == 'DXE': - GeneratedTokenNumber += NumberOfPeiLocalTokens - # - # Per, PCD architecture specification, PCD Token Number is 1 based and 0 is defined as invalid token number. - # For each EX type PCD, a PCD Token Number is assigned. When the - # PCD Driver/PEIM map EX_GUID and EX_TOKEN_NUMBER to the PCD Token Number, - # the non-EX Protocol/PPI interface can be called to get/set the value. This assumption is made by - # Pcd Driver/PEIM in MdeModulePkg. - # Therefore, 1 is added to GeneratedTokenNumber to generate a PCD Token Number before being inserted - # to the EXMAPPING_TABLE. - # - Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(str(GeneratedTokenNumber + 1) + 'U') - Dict['EXMAPPING_TABLE_GUID_INDEX'].append(str(GuidList.index(TokenSpaceGuid)) + 'U') - - if GuidList != []: - Dict['GUID_TABLE_EMPTY'] = 'FALSE' - Dict['GUID_TABLE_SIZE'] = str(len(GuidList)) + 'U' - else: - Dict['GUID_STRUCTURE'] = [GuidStringToGuidStructureString('00000000-0000-0000-0000-000000000000')] - - if StringTableIndex == 0: - Dict['STRING_TABLE_INDEX'].append('') - Dict['STRING_TABLE_LENGTH'].append(1) - Dict['STRING_TABLE_CNAME'].append('') - Dict['STRING_TABLE_GUID'].append('') - Dict['STRING_TABLE_VALUE'].append('{ 0 }') - else: - Dict['STRING_TABLE_EMPTY'] = 'FALSE' - Dict['STRING_TABLE_SIZE'] = str(StringTableSize) + 'U' - - if Dict['SIZE_TABLE_CNAME'] == []: - Dict['SIZE_TABLE_CNAME'].append('') - Dict['SIZE_TABLE_GUID'].append('') - Dict['SIZE_TABLE_CURRENT_LENGTH'].append('0U') - Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append('0U') - - if NumberOfLocalTokens != 0: - Dict['DATABASE_EMPTY'] = 'FALSE' - Dict['LOCAL_TOKEN_NUMBER_TABLE_SIZE'] = NumberOfLocalTokens - Dict['LOCAL_TOKEN_NUMBER'] = NumberOfLocalTokens - - if NumberOfExTokens != 0: - Dict['EXMAP_TABLE_EMPTY'] = 'FALSE' - Dict['EXMAPPING_TABLE_SIZE'] = str(NumberOfExTokens) + 'U' - Dict['EX_TOKEN_NUMBER'] = str(NumberOfExTokens) + 'U' - else: - Dict['EXMAPPING_TABLE_EXTOKEN'].append('0U') - Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append('0U') - Dict['EXMAPPING_TABLE_GUID_INDEX'].append('0U') - - if NumberOfSizeItems != 0: - Dict['SIZE_TABLE_SIZE'] = str(NumberOfSizeItems * 2) + 'U' - - AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict)) - if NumberOfLocalTokens == 0: - AutoGenC.Append(gEmptyPcdDatabaseAutoGenC.Replace(Dict)) - else: - # - # Update Size Table to the right order, it should be same with LocalTokenNumberTable - # - SizeCNameTempList = [] - SizeGuidTempList = [] - SizeCurLenTempList = [] - SizeMaxLenTempList = [] - ReOrderFlag = True - - if len(Dict['SIZE_TABLE_CNAME']) == 1: - if not (Dict['SIZE_TABLE_CNAME'][0] and Dict['SIZE_TABLE_GUID'][0]): - ReOrderFlag = False - - if ReOrderFlag: - for Count in range(len(Dict['TOKEN_CNAME'])): - for Count1 in range(len(Dict['SIZE_TABLE_CNAME'])): - if Dict['TOKEN_CNAME'][Count] == Dict['SIZE_TABLE_CNAME'][Count1] and \ - Dict['TOKEN_GUID'][Count] == Dict['SIZE_TABLE_GUID'][Count1]: - SizeCNameTempList.append(Dict['SIZE_TABLE_CNAME'][Count1]) - SizeGuidTempList.append(Dict['SIZE_TABLE_GUID'][Count1]) - SizeCurLenTempList.append(Dict['SIZE_TABLE_CURRENT_LENGTH'][Count1]) - SizeMaxLenTempList.append(Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count1]) - - for Count in range(len(Dict['SIZE_TABLE_CNAME'])): - Dict['SIZE_TABLE_CNAME'][Count] = SizeCNameTempList[Count] - Dict['SIZE_TABLE_GUID'][Count] = SizeGuidTempList[Count] - Dict['SIZE_TABLE_CURRENT_LENGTH'][Count] = SizeCurLenTempList[Count] - Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count] = SizeMaxLenTempList[Count] - - AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict)) - - return AutoGenH, AutoGenC - -## Create code for PCD database -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH): - if Info.PcdIsDriver == "": - return - if Info.PcdIsDriver not in gPcdPhaseMap: - EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver, - ExtraData="[%s]" % str(Info)) - - AutoGenH.Append(gPcdDatabaseCommonAutoGenH) - AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI') - AutoGenH.Append(AdditionalAutoGenH.String) - - Phase = gPcdPhaseMap[Info.PcdIsDriver] - if Phase == 'PEI': - AutoGenC.Append(AdditionalAutoGenC.String) - - if Phase == 'DXE': - AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase) - AutoGenH.Append(AdditionalAutoGenH.String) - AutoGenC.Append(AdditionalAutoGenC.String) - AutoGenH.Append(gPcdDatabaseEpilogueAutoGenH) ## Create code for library constructor # @@ -1920,7 +1360,7 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH): # Collect Token Space GUIDs used by DynamicEc PCDs TokenSpaceList = [] for Pcd in Info.ModulePcdList: - if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList: + if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList: TokenSpaceList += [Pcd.TokenSpaceGuidCName] # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found @@ -1938,13 +1378,14 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH): AutoGenH.Append("\n// PCD definitions\n") for Pcd in Info.ModulePcdList: CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd) + DynExPcdTokenNumberMapping (Info, AutoGenH) else: if Info.ModulePcdList: AutoGenH.Append("\n// Definition of PCDs used in this module\n") AutoGenC.Append("\n// Definition of PCDs used in this module\n") for Pcd in Info.ModulePcdList: CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd) - + DynExPcdTokenNumberMapping (Info, AutoGenH) if Info.LibraryPcdList: AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n") AutoGenC.Append("\n// Definition of PCDs used in libraries\n") |