]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenC.py
Sync BaseTools Branch (version r2149) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenC.py
index b62a12708b75025772ac08f4b58cad9f4f259cc1..e6e884762340451ab492d01bbf2328ee4235094d 100644 (file)
@@ -1,8 +1,8 @@
 ## @file
 # Routines for generating AutoGen.h and AutoGen.c
 #
-# Copyright (c) 2007, Intel Corporation
-# All rights reserved. This program and the accompanying materials
+# Copyright (c) 2007 - 2011, 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
 # http://opensource.org/licenses/bsd-license.php
@@ -162,7 +162,7 @@ ${END}
   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_HEAD_NUMSKUS_DECL}];
+${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}
@@ -253,7 +253,7 @@ ${END}
   },
   /* LocalTokenNumberTable */
   {
-${BEGIN}    offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}) | ${TOKEN_TYPE},
+${BEGIN}    offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}${VARDEF_HEADER}) | ${TOKEN_TYPE},
 ${END}
   },
   /* GuidTable */
@@ -263,7 +263,7 @@ ${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_HEAD_NUMSKUS_DECL}] */
+${BEGIN}  /* ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}] */
   {
     ${VARIABLE_HEAD_VALUE}
   },
@@ -383,28 +383,6 @@ ${Function} (
 ${END}
 """)
 
-## SMM_CORE Entry Point Templates
-gSmmCoreEntryPointString = TemplateString("""
-const UINT32 _gUefiDriverRevision = 0;
-${BEGIN}
-EFI_STATUS
-${Function} (
-  IN EFI_HANDLE         ImageHandle,
-  IN EFI_SYSTEM_TABLE   *SystemTable
-  );
-
-EFI_STATUS
-EFIAPI
-ProcessModuleEntryPointList (
-  IN EFI_HANDLE         ImageHandle,
-  IN EFI_SYSTEM_TABLE   *SystemTable
-  )
-{
-  return ${Function} (ImageHandle, SystemTable);
-}
-${END}
-""")
-
 gPeimEntryPointString = [
 TemplateString("""
 GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion};
@@ -461,6 +439,35 @@ ${END}
 """)
 ]
 
+## SMM_CORE Entry Point Templates
+gSmmCoreEntryPointPrototype = TemplateString("""
+${BEGIN}
+EFI_STATUS
+EFIAPI
+${Function} (
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  );
+${END}
+""")
+
+gSmmCoreEntryPointString = TemplateString("""
+${BEGIN}
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
+const UINT32 _gDxeRevision = ${PiSpecVersion};
+
+EFI_STATUS
+EFIAPI
+ProcessModuleEntryPointList (
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  return ${Function} (ImageHandle, SystemTable);
+}
+${END}
+""")
+
 ## DXE SMM Entry Point Templates
 gDxeSmmEntryPointPrototype = TemplateString("""
 ${BEGIN}
@@ -475,7 +482,7 @@ ${END}
 
 gDxeSmmEntryPointString = [
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 const UINT32 _gDxeRevision = ${PiSpecVersion};
 
 EFI_STATUS
@@ -490,11 +497,11 @@ ProcessModuleEntryPointList (
 }
 """),
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 const UINT32 _gDxeRevision = ${PiSpecVersion};
 
 static BASE_LIBRARY_JUMP_BUFFER  mJumpContext;
-static EFI_STATUS  mDriverEntryPointStatus = EFI_LOAD_ERROR;
+static EFI_STATUS  mDriverEntryPointStatus;
 
 VOID
 EFIAPI
@@ -515,8 +522,9 @@ ProcessModuleEntryPointList (
   IN EFI_HANDLE        ImageHandle,
   IN EFI_SYSTEM_TABLE  *SystemTable
   )
-
 {
+  mDriverEntryPointStatus = EFI_LOAD_ERROR;
+
 ${BEGIN}
   if (SetJump (&mJumpContext) == 0) {
     ExitDriver (${Function} (ImageHandle, SystemTable));
@@ -543,7 +551,7 @@ ${END}
 
 gUefiDriverEntryPointString = [
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 const UINT32 _gDxeRevision = ${PiSpecVersion};
 
 EFI_STATUS
@@ -557,7 +565,7 @@ ProcessModuleEntryPointList (
 }
 """),
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 const UINT32 _gDxeRevision = ${PiSpecVersion};
 
 ${BEGIN}
@@ -585,17 +593,20 @@ ExitDriver (
 }
 """),
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 const UINT32 _gDxeRevision = ${PiSpecVersion};
 
+static BASE_LIBRARY_JUMP_BUFFER  mJumpContext;
+static EFI_STATUS  mDriverEntryPointStatus;
+
 EFI_STATUS
 EFIAPI
 ProcessModuleEntryPointList (
   IN EFI_HANDLE        ImageHandle,
   IN EFI_SYSTEM_TABLE  *SystemTable
   )
-
 {
+  mDriverEntryPointStatus = EFI_LOAD_ERROR;
   ${BEGIN}
   if (SetJump (&mJumpContext) == 0) {
     ExitDriver (${Function} (ImageHandle, SystemTable));
@@ -605,9 +616,6 @@ ProcessModuleEntryPointList (
   return mDriverEntryPointStatus;
 }
 
-static BASE_LIBRARY_JUMP_BUFFER  mJumpContext;
-static EFI_STATUS  mDriverEntryPointStatus = EFI_LOAD_ERROR;
-
 VOID
 EFIAPI
 ExitDriver (
@@ -638,7 +646,7 @@ ${END}
 
 gUefiApplicationEntryPointString = [
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 
 EFI_STATUS
 EFIAPI
@@ -651,7 +659,7 @@ ProcessModuleEntryPointList (
 }
 """),
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 
 ${BEGIN}
 EFI_STATUS
@@ -678,7 +686,7 @@ ExitDriver (
 }
 """),
 TemplateString("""
-const UINT32 _gUefiDriverRevision = ${EfiSpecVersion};
+const UINT32 _gUefiDriverRevision = ${UefiSpecVersion};
 
 EFI_STATUS
 EFIAPI
@@ -869,13 +877,6 @@ ${FunctionCall}${END}
 """),
 }
 
-gSpecificationString = TemplateString("""
-${BEGIN}
-#undef ${SpecificationName}
-#define ${SpecificationName} ${SpecificationValue}
-${END}
-""")
-
 gBasicHeaderFile = "Base.h"
 
 gModuleTypeHeaderFile = {
@@ -890,8 +891,7 @@ gModuleTypeHeaderFile = {
     "DXE_SAL_DRIVER"    :   ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
     "UEFI_DRIVER"       :   ["Uefi.h",  "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"],
     "UEFI_APPLICATION"  :   ["Uefi.h",  "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"],
-    "SMM_DRIVER"        :   ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/SmmDriverEntryPoint.h"],
-    "SMM_CORE"          :   ["PiDxe.h", "Library/DebugLib.h"],
+    "SMM_CORE"          :   ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"],
     "USER_DEFINED"      :   [gBasicHeaderFile]
 }
 
@@ -953,11 +953,57 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             Const = ''
         Type = ''
         Array = ''
-        Value = Pcd.DefaultValue\r
+        Value = Pcd.DefaultValue
         Unicode = False
-        if Pcd.DatumType == 'UINT64':
-            if not Value.endswith('ULL'):
-                Value += 'ULL'
+        ValueNumber = 0
+        if Pcd.DatumType in ['UINT64', 'UINT32', 'UINT16', 'UINT8']:
+            try:
+                if Value.upper().startswith('0X'):
+                    ValueNumber = int (Value, 16)
+                else:
+                    ValueNumber = int (Value)
+            except:
+                EdkLogger.error("build", AUTOGEN_ERROR,
+                                "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                ExtraData="[%s]" % str(Info))
+            if Pcd.DatumType == 'UINT64':
+                if ValueNumber < 0:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+                elif ValueNumber >= 0x10000000000000000:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+                if not Value.endswith('ULL'):
+                    Value += 'ULL'
+            elif Pcd.DatumType == 'UINT32':
+                if ValueNumber < 0:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+                elif ValueNumber >= 0x100000000:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+            elif Pcd.DatumType == 'UINT16':
+                if ValueNumber < 0:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+                elif ValueNumber >= 0x10000:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+            elif Pcd.DatumType == 'UINT8':
+                if ValueNumber < 0:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
+                elif ValueNumber >= 0x100:
+                    EdkLogger.error("build", AUTOGEN_ERROR,
+                                    "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                    ExtraData="[%s]" % str(Info))
         if Pcd.DatumType == 'VOID*':
             if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '':
                 EdkLogger.error("build", AUTOGEN_ERROR,
@@ -967,7 +1013,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             ArraySize = int(Pcd.MaxDatumSize, 0)
             if Value[0] == '{':
                 Type = '(VOID *)'
-            else:\r
+            else:
                 if Value[0] == 'L':
                     Unicode = True
                 Value = Value.lstrip('L')   #.strip('"')
@@ -975,15 +1021,17 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 NewValue = '{'
                 for Index in range(0,len(Value)):
                     if Unicode:
-                        NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', '\r
-                    else:\r
+                        NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', '
+                    else:
                         NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', '
-                if Unicode:\r
-                    ArraySize = ArraySize / 2;\r
-\r
+                if Unicode:
+                    ArraySize = ArraySize / 2;
+
                 if ArraySize < (len(Value) + 1):
-                    ArraySize = len(Value) + 1
-                Value = NewValue + '0 }'\r
+                    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(Info))
+                Value = NewValue + '0 }'
             Array = '[%d]' % ArraySize
         #
         # skip casting for fixed at build since it breaks ARM assembly.
@@ -997,16 +1045,16 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
         else:
             PcdValueName = '_PCD_VALUE_' + Pcd.TokenCName
             
-        if Pcd.DatumType == 'VOID*':\r
-            #\r
-            # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.\r
-            #\r
-            if Unicode:\r
-                AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))\r
-                AutoGenH.Append('#define %s  %s%s\n' %(PcdValueName, Type, PcdVariableName))\r
-                AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
-                AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array))\r
-                AutoGenH.Append('#define %s  %s%s\n' %(GetModeName, Type, PcdVariableName))\r
+        if Pcd.DatumType == 'VOID*':
+            #
+            # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.
+            #
+            if Unicode:
+                AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))
+                AutoGenH.Append('#define %s  %s%s\n' %(PcdValueName, Type, PcdVariableName))
+                AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))
+                AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array))
+                AutoGenH.Append('#define %s  %s%s\n' %(GetModeName, Type, PcdVariableName))
             else:
                 AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))
                 AutoGenH.Append('#define %s  %s%s\n' %(PcdValueName, Type, PcdVariableName))
@@ -1015,7 +1063,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 AutoGenH.Append('#define %s  %s%s\n' %(GetModeName, Type, PcdVariableName))
         elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
             AutoGenH.Append('#define %s  %s\n' %(PcdValueName, Value))
-            AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
+            AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
             AutoGenH.Append('extern volatile %s  %s  %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
             AutoGenH.Append('#define %s  %s%s\n' % (GetModeName, Type, PcdVariableName))
         else:
@@ -1050,6 +1098,10 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
                         ExtraData="[%s]" % str(Info))
     TokenNumber = PcdTokenNumber[TokenCName, TokenSpaceGuidCName]
 
+    # If PCD is DynamicEx, then use TokenNumber declared in DEC file
+    if Pcd.Type in gDynamicExPcd:
+        TokenNumber = int(Pcd.TokenValue, 0)
+
     if Pcd.Type not in gItemTypeStringDatabase:
         EdkLogger.error("build", AUTOGEN_ERROR,
                         "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
@@ -1133,7 +1185,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         'SYSTEM_SKU_ID_VALUE'           : '0'
     }
 
-    for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN']:
+    for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN', "VOID*"]:
         Dict['VARDEF_CNAME_' + DatumType] = []
         Dict['VARDEF_GUID_' + DatumType]  = []
         Dict['VARDEF_SKUID_' + DatumType] = []
@@ -1168,7 +1220,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     Dict['GUID_STRUCTURE'] = []
 
     Dict['SKUID_VALUE'] = []
-
+    Dict['VARDEF_HEADER'] = []
     if Phase == 'DXE':
         Dict['SYSTEM_SKU_ID'] = ''
         Dict['SYSTEM_SKU_ID_VALUE'] = ''
@@ -1181,7 +1233,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     NumberOfExTokens = 0
     NumberOfSizeItems = 0
     GuidList = []
-
+    
     for Pcd in Platform.DynamicPcdList:
         CName = Pcd.TokenCName
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
@@ -1217,7 +1269,10 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         Pcd.InitString = 'UNINIT'
 
         if Pcd.DatumType == 'VOID*':
-            Pcd.TokenTypeList = ['PCD_DATUM_TYPE_POINTER']
+            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:
@@ -1264,53 +1319,68 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     Dict['GUID_STRUCTURE'].append(VariableGuidStructure)
                 VariableHeadGuidIndex = GuidList.index(VariableGuid)
 
-                VariableHeadValueList.append('%d, %d, %s, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s)' %
-                                             (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,
-                                              Phase, CName, TokenSpaceGuid, SkuIdIndex))
+                if "PCD_TYPE_STRING" in Pcd.TokenTypeList:
+                    VariableHeadValueList.append('%d, %d, %s, offsetof(%s_PCD_DATABASE, Init.%s_%s)' %
+                                                 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,
+                                                  Phase, CName, TokenSpaceGuid))
+                else:
+                    VariableHeadValueList.append('%d, %d, %s, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s)' %
+                                                 (VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset,
+                                                  Phase, CName, TokenSpaceGuid, SkuIdIndex))
                 Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName)
                 Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid)
                 Dict['VARDEF_SKUID_'+Pcd.DatumType].append(SkuIdIndex)
-                Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)
+                if "PCD_TYPE_STRING" in  Pcd.TokenTypeList:
+                    Dict['VARDEF_VALUE_' + Pcd.DatumType].append("%s_%s[%d]" % (Pcd.TokenCName, TokenSpaceGuid, SkuIdIndex))
+                else:
+                    Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)
             elif Sku.VpdOffset != '':
                 Pcd.TokenTypeList += ['PCD_TYPE_VPD']
                 Pcd.InitString = 'INIT'
                 VpdHeadOffsetList.append(Sku.VpdOffset)
+                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))
+                    Dict['SIZE_TABLE_CNAME'].append(CName)
+                    Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)
+                    Dict['SIZE_TABLE_CURRENT_LENGTH'].append(Size)
+                    Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(Pcd.MaxDatumSize)
+                    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.DatumType == 'VOID*':
-                    Pcd.TokenTypeList += ['PCD_TYPE_STRING']
-                    Pcd.InitString = 'INIT'
-                    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))
-                        Dict['SIZE_TABLE_CNAME'].append(CName)
-                        Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)
-                        Dict['SIZE_TABLE_CURRENT_LENGTH'].append(Size)
-                        Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(Pcd.MaxDatumSize)
-                        if Pcd.MaxDatumSize != '':
-                            MaxDatumSize = int(Pcd.MaxDatumSize, 0)
-                            if MaxDatumSize > Size:
-                                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'
@@ -1320,23 +1390,27 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                                 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")
-                    else:
-                        ValueList.append(Sku.DefaultValue)
+                
+                #
+                # 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")
+                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)
@@ -1365,7 +1439,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     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
@@ -1504,7 +1578,7 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):
             ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))
             ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))
         elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
-                                'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
+                                'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']:
             ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))
             ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))
 
@@ -1530,7 +1604,7 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):
         elif Info.ModuleType in ['PEI_CORE','PEIM']:
             AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))
         elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
-                                 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
+                                 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']:
             AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))
 
 ## Create code for library destructor
@@ -1561,7 +1635,7 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):
             DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict))
             DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict))
         elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
-                                'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
+                                'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_CORE']:
             DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict))
             DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict))
 
@@ -1587,7 +1661,7 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):
         elif Info.ModuleType in ['PEI_CORE','PEIM']:
             AutoGenC.Append(gLibraryString['PEI'].Replace(Dict))
         elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER',
-                                 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_DRIVER', 'SMM_CORE']:
+                                 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']:
             AutoGenC.Append(gLibraryString['DXE'].Replace(Dict))
 
 
@@ -1607,26 +1681,27 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):
     if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification:
         PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION']
     else:
-        PiSpecVersion = 0
-    if 'EFI_SPECIFICATION_VERSION' in Info.Module.Specification:
-        EfiSpecVersion = Info.Module.Specification['EFI_SPECIFICATION_VERSION']
+        PiSpecVersion = '0x00000000'
+    if 'UEFI_SPECIFICATION_VERSION' in Info.Module.Specification:
+        UefiSpecVersion = Info.Module.Specification['UEFI_SPECIFICATION_VERSION']
     else:
-        EfiSpecVersion = 0
+        UefiSpecVersion = '0x00000000'
     Dict = {
-        'Function'      :   Info.Module.ModuleEntryPointList,
-        'PiSpecVersion' :   PiSpecVersion,
-        'EfiSpecVersion':   EfiSpecVersion
+        'Function'       :   Info.Module.ModuleEntryPointList,
+        'PiSpecVersion'  :   PiSpecVersion,
+        'UefiSpecVersion':   UefiSpecVersion
     }
 
     if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE']:
-        if NumEntryPoints != 1:
-            EdkLogger.error(
-                "build",
-                AUTOGEN_ERROR,
-                '%s must have exactly one entry point' % Info.ModuleType,
-                File=str(Info),
-                ExtraData= ", ".join(Info.Module.ModuleEntryPointList)
-                )
+        if Info.SourceFileList <> None and Info.SourceFileList <> []:
+          if NumEntryPoints != 1:
+              EdkLogger.error(
+                  "build",
+                  AUTOGEN_ERROR,
+                  '%s must have exactly one entry point' % Info.ModuleType,
+                  File=str(Info),
+                  ExtraData= ", ".join(Info.Module.ModuleEntryPointList)
+                  )
     if Info.ModuleType == 'PEI_CORE':
         AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict))
         AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict))
@@ -1635,26 +1710,25 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):
         AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict))
     elif Info.ModuleType == 'SMM_CORE':
         AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict))
+        AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict))
     elif Info.ModuleType == 'PEIM':
         if NumEntryPoints < 2:
             AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict))
         else:
             AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict))
         AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict))
-    elif Info.ModuleType in ['DXE_RUNTIME_DRIVER','DXE_DRIVER','DXE_SMM_DRIVER',
-                             'DXE_SAL_DRIVER','UEFI_DRIVER', 'SMM_DRIVER']:
-        if Info.ModuleType in ['DXE_SMM_DRIVER', 'SMM_DRIVER']:
-            if NumEntryPoints == 0:
-                AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict))
-            else:
-                AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict))
-            AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict))
+    elif Info.ModuleType in ['DXE_RUNTIME_DRIVER','DXE_DRIVER','DXE_SAL_DRIVER','UEFI_DRIVER']:
+        if NumEntryPoints < 2:
+            AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict))
         else:
-            if NumEntryPoints < 2:
-                AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict))
-            else:
-                AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict))
-            AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict))
+            AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict))
+        AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict))
+    elif Info.ModuleType == 'DXE_SMM_DRIVER':
+        if NumEntryPoints == 0:
+            AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict))
+        else:
+            AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict))
+        AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict))    
     elif Info.ModuleType == 'UEFI_APPLICATION':
         if NumEntryPoints < 2:
             AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict))
@@ -1758,6 +1832,23 @@ def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH):
 #   @param      AutoGenH    The TemplateString object for header file
 #
 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:
+            TokenSpaceList += [Pcd.TokenSpaceGuidCName]
+            
+    # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found
+    if TokenSpaceList <> []:            
+        AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n")
+        if Info.ModuleType in ["USER_DEFINED", "BASE"]:
+            GuidType = "GUID"
+        else:
+            GuidType = "EFI_GUID"              
+        for Item in TokenSpaceList:
+            AutoGenH.Append('extern %s %s;\n' % (GuidType, Item))
+
     if Info.IsLibrary:
         if Info.ModulePcdList:
             AutoGenH.Append("\n// PCD definitions\n")
@@ -1782,15 +1873,19 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
 #   @param      Info        The ModuleAutoGen object
 #   @param      AutoGenC    The TemplateString object for C code
 #   @param      AutoGenH    The TemplateString object for header file
+#   @param      UniGenCFlag     UniString is generated into AutoGen C file when it is set to True
+#   @param      UniGenBinBuffer Buffer to store uni string package data
 #
-def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
+def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer):
     WorkingDir = os.getcwd()
     os.chdir(Info.WorkspaceDir)
 
     IncList = [Info.MetaFile.Dir]
     # Get all files under [Sources] section in inf file for EDK-II module
+    EDK2Module = True
     SrcList = [F for F in Info.SourceFileList]
     if Info.AutoGenVersion < 0x00010005:
+        EDK2Module = False
         # Get all files under the module directory for EDK-I module
         Cwd = os.getcwd()
         os.chdir(Info.MetaFile.Dir)
@@ -1812,7 +1907,7 @@ def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
         CompatibleMode = False
 
     #
-    # -s is a temporary option dedicated for building .UNI files with ISO 639-2 lanauge codes of EDK Shell in EDK2
+    # -s is a temporary option dedicated for building .UNI files with ISO 639-2 language codes of EDK Shell in EDK2
     #
     if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1:
         if CompatibleMode:
@@ -1823,13 +1918,20 @@ def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
     else:
         ShellMode = False
 
-    Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode)
-    AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
-    AutoGenC.Append(Code)
-    AutoGenC.Append("\n")
+    #RFC4646 is only for EDKII modules and ISO639-2 for EDK modules
+    if EDK2Module:
+        FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.RFCLanguages]
+    else:
+        FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.ISOLanguages]
+    Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer, FilterInfo)
+    if CompatibleMode or UniGenCFlag:
+        AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
+        AutoGenC.Append(Code)
+        AutoGenC.Append("\n")
     AutoGenH.Append("\n//\n//Unicode String ID\n//\n")
     AutoGenH.Append(Header)
-    AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)
+    if CompatibleMode or UniGenCFlag:
+        AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name)
     os.chdir(WorkingDir)
 
 ## Create common code
@@ -1844,9 +1946,6 @@ def CreateHeaderCode(Info, AutoGenC, AutoGenH):
     # header file Prologue
     AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')}))
     if Info.AutoGenVersion >= 0x00010005:
-        # specification macros
-        AutoGenH.Append(gSpecificationString.Replace({'SpecificationName':Info.Specification.keys(),
-                                                      'SpecificationValue':Info.Specification.values()}))
         # header files includes
         AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile)
         if Info.ModuleType in gModuleTypeHeaderFile \
@@ -1890,8 +1989,10 @@ def CreateFooterCode(Info, AutoGenC, AutoGenH):
 #   @param      Info        The ModuleAutoGen object
 #   @param      AutoGenC    The TemplateString object for C code
 #   @param      AutoGenH    The TemplateString object for header file
+#   @param      UniGenCFlag     UniString is generated into AutoGen C file when it is set to True
+#   @param      UniGenBinBuffer Buffer to store uni string package data
 #
-def CreateCode(Info, AutoGenC, AutoGenH, StringH):
+def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer):
     CreateHeaderCode(Info, AutoGenC, AutoGenH)
 
     if Info.AutoGenVersion >= 0x00010005:
@@ -1908,7 +2009,7 @@ def CreateCode(Info, AutoGenC, AutoGenH, StringH):
         FileName = "%sStrDefs.h" % Info.Name
         StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName}))
         StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')}))
-        CreateUnicodeStringCode(Info, AutoGenC, StringH)
+        CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer)
         StringH.Append("\n#endif\n")
         AutoGenH.Append('#include "%s"\n' % FileName)
 
@@ -1920,12 +2021,13 @@ def CreateCode(Info, AutoGenC, AutoGenH, StringH):
 
 ## Create the code file
 #
-#   @param      FilePath    The path of code file
-#   @param      Content     The content of code file
+#   @param      FilePath     The path of code file
+#   @param      Content      The content of code file
+#   @param      IsBinaryFile The flag indicating if the file is binary file or not
 #
 #   @retval     True        If file content is changed or file doesn't exist
 #   @retval     False       If the file exists and the content is not changed
 #
-def Generate(FilePath, Content):
-    return SaveFileOnChange(FilePath, Content, False)
+def Generate(FilePath, Content, IsBinaryFile):
+    return SaveFileOnChange(FilePath, Content, IsBinaryFile)