]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Update Expression.py for string comparison and MACRO replace issue
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 1da4f03ab8baa1f0a0a4db3905f9488696edbf5d..75b877a5aac3b1861977dc409f773576ea5dd07c 100644 (file)
@@ -808,7 +808,7 @@ class DscBuildData(PlatformBuildClassObject):
                 PkgSet.update(ModuleData.Packages)\r
 \r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
-\r
+            self._GuidDict.update(GlobalData.gPlatformPcds)\r
 \r
         if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
             EdkLogger.error('build', PARSER_ERROR,\r
@@ -898,7 +898,8 @@ class DscBuildData(PlatformBuildClassObject):
                     if pcdobj:\r
                         pcdset.append((pcd[0],pcd[1], pcdobj.DefaultValue))\r
                     else:\r
-                        pcdset.append((pcd[0],pcd[1],pcd[3]))\r
+                        pcdvalue = pcd[3] if len(pcd) == 4 else pcd[2]\r
+                        pcdset.append((pcd[0],pcd[1],pcdvalue))\r
         GlobalData.BuildOptionPcd = pcdset\r
     def GetFieldValueFromComm(self,ValueStr,TokenSpaceGuidCName, TokenCName, FieldName):\r
         PredictedFieldType = "VOID*"\r
@@ -999,10 +1000,39 @@ class DscBuildData(PlatformBuildClassObject):
                                     try:\r
                                         pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
                                     except BadExpression, Value:\r
-                                        if Value.result > 1:\r
-                                            EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
-                                                            (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                    pcdvalue = 'H' + pcdvalue\r
+                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                    if PcdDatumType == "VOID*":\r
+                                        pcdvalue = 'H' + pcdvalue\r
+                                elif pcdvalue.startswith("L'"):\r
+                                    try:\r
+                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                    except BadExpression, Value:\r
+                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                    if pcdvalue.startswith('{'):\r
+                                        pcdvalue = 'H' + pcdvalue\r
+                                elif pcdvalue.startswith("'"):\r
+                                    try:\r
+                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                    except BadExpression, Value:\r
+                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                    if pcdvalue.startswith('{'):\r
+                                        pcdvalue = 'H' + pcdvalue\r
+                                elif pcdvalue.startswith('L'):\r
+                                    pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
+                                    try:\r
+                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                    except BadExpression, Value:\r
+                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                else:\r
+                                    try:\r
+                                        pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                    except BadExpression, Value:\r
+                                        EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                        (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
                                 NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
                                 FoundFlag = True\r
                         else:\r
@@ -1018,7 +1048,41 @@ class DscBuildData(PlatformBuildClassObject):
                                             except BadExpression, Value:\r
                                                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
                                                                 (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
-                                            pcdvalue = 'H' + pcdvalue\r
+                                            if PcdDatumType == "VOID*":\r
+                                                pcdvalue = 'H' + pcdvalue\r
+                                        elif pcdvalue.startswith("L'"):\r
+                                            try:\r
+                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
+                                                    True)\r
+                                            except BadExpression, Value:\r
+                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                            if pcdvalue.startswith('{'):\r
+                                                pcdvalue = 'H' + pcdvalue\r
+                                        elif pcdvalue.startswith("'"):\r
+                                            try:\r
+                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
+                                                    True)\r
+                                            except BadExpression, Value:\r
+                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                            if pcdvalue.startswith('{'):\r
+                                                pcdvalue = 'H' + pcdvalue\r
+                                        elif pcdvalue.startswith('L'):\r
+                                            pcdvalue = 'L"' + pcdvalue[1:] + '"'\r
+                                            try:\r
+                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(\r
+                                                    True)\r
+                                            except BadExpression, Value:\r
+                                                EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
+                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+                                        else:\r
+                                            try:\r
+                                                pcdvalue = ValueExpressionEx(pcdvalue, PcdDatumType, self._GuidDict)(True)\r
+                                            except BadExpression, Value:\r
+                                                EdkLogger.error('Parser', FORMAT_INVALID,\r
+                                                                'PCD [%s.%s] Value "%s",  %s' %\r
+                                                                (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
                                         NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
                                         FoundFlag = True\r
                                     else:\r
@@ -1221,7 +1285,10 @@ class DscBuildData(PlatformBuildClassObject):
                 str_pcd_obj_str.copy(str_pcd_dec)\r
                 if str_pcd_obj:\r
                     str_pcd_obj_str.copy(str_pcd_obj)\r
-                str_pcd_obj_str.DefaultFromDSC = str_pcd_obj_str.DefaultValue\r
+                if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                else:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                 for str_pcd_data in StrPcdSet[str_pcd]:\r
                     if str_pcd_data[3] in SkuIds:\r
                         str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), 'DEFAULT' if str_pcd_data[3] == 'COMMON' else str_pcd_data[3],'STANDARD' if str_pcd_data[4] == 'COMMON' else str_pcd_data[4], self.MetaFile.File,LineNo=str_pcd_data[5])\r
@@ -1239,8 +1306,10 @@ class DscBuildData(PlatformBuildClassObject):
                     str_pcd_obj = Pcds.get(Pcd, None)\r
                     if str_pcd_obj:\r
                         str_pcd_obj_str.copy(str_pcd_obj)\r
-                        if str_pcd_obj.DefaultValue:\r
-                            str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue\r
+                        if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                            str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                        else:\r
+                            str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
         if S_pcd_set:\r
             GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
@@ -1521,6 +1590,7 @@ class DscBuildData(PlatformBuildClassObject):
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
             CApp = CApp + '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
+            CApp = CApp + "// Default Value in Dec \n"\r
             for FieldList in [Pcd.DefaultValues]:\r
                 if not FieldList:\r
                     continue\r
@@ -1548,31 +1618,34 @@ class DscBuildData(PlatformBuildClassObject):
                             CApp = CApp + '  __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
             for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
                 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
-                for FieldList in [inherit_OverrideValues.get(DefaultStoreName)]:\r
-                    if not FieldList:\r
-                        continue\r
-                    for FieldName in FieldList:\r
-                        FieldName = "." + FieldName\r
-                        IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
-                        if IsArray:\r
-                            try:\r
-                                Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
-                            except BadExpression:\r
-                                EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
-                                                (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
-                            Value, ValueSize = ParseFieldValue(Value)\r
-                            CApp = CApp + '  __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
-                        else:\r
-                            NewFieldName = ''\r
-                            FieldName_ori = FieldName.strip('.')\r
-                            while '[' in  FieldName:\r
-                                NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                                ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
-                                FieldName = FieldName.split(']', 1)[1]\r
-                            FieldName = NewFieldName + FieldName\r
-                            while '[' in FieldName:\r
-                                FieldName = FieldName.rsplit('[', 1)[0]\r
-                                CApp = CApp + '  __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+                storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
+                for defaultstorenameitem in storeset:\r
+                    CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
+                    for FieldList in [inherit_OverrideValues.get(defaultstorenameitem)]:\r
+                        if not FieldList:\r
+                            continue\r
+                        for FieldName in FieldList:\r
+                            FieldName = "." + FieldName\r
+                            IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                            if IsArray:\r
+                                try:\r
+                                    Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
+                                except BadExpression:\r
+                                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                                    (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
+                                Value, ValueSize = ParseFieldValue(Value)\r
+                                CApp = CApp + '  __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                            else:\r
+                                NewFieldName = ''\r
+                                FieldName_ori = FieldName.strip('.')\r
+                                while '[' in  FieldName:\r
+                                    NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
+                                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                                    FieldName = FieldName.split(']', 1)[1]\r
+                                FieldName = NewFieldName + FieldName\r
+                                while '[' in FieldName:\r
+                                    FieldName = FieldName.rsplit('[', 1)[0]\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
                 if skuname == SkuName:\r
                     break\r
 \r
@@ -1593,6 +1666,7 @@ class DscBuildData(PlatformBuildClassObject):
             #\r
             # Assign field values in PCD\r
             #\r
+            CApp = CApp + "// Default value in Dec \n"\r
             for FieldList in [Pcd.DefaultValues]:\r
                 if not FieldList:\r
                     continue\r
@@ -1625,56 +1699,57 @@ class DscBuildData(PlatformBuildClassObject):
                             CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
             for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
                 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
-                for FieldList in [Pcd.DefaultFromDSC,inherit_OverrideValues.get(DefaultStoreName)]:\r
-                    if not FieldList:\r
-                        continue\r
-                    if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:\r
-                        IsArray = self.IsFieldValueAnArray(FieldList)\r
-                        if IsArray:\r
-                            try:\r
-                                FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
-                            except BadExpression:\r
-                                EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
-                                                (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
-\r
-                        Value, ValueSize = ParseFieldValue (FieldList)\r
-                        if isinstance(Value, str):\r
-                            CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)\r
-                        elif IsArray:\r
-                        #\r
-                        # Use memcpy() to copy value into field\r
-                        #\r
-                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC)\r
-                            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-                        continue\r
-\r
-                    for FieldName in FieldList:\r
-                        IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
-                        if IsArray:\r
+                storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
+                for defaultstorenameitem in storeset:\r
+                    CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
+                    pcddefaultvalue = Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
+                    for FieldList in [pcddefaultvalue,inherit_OverrideValues.get(defaultstorenameitem)]:\r
+                        if not FieldList:\r
+                            continue\r
+                        if pcddefaultvalue and FieldList == pcddefaultvalue:\r
+                            IsArray = self.IsFieldValueAnArray(FieldList)\r
+                            if IsArray:\r
+                                try:\r
+                                    FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
+                                except BadExpression:\r
+                                    EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
+                                                    (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
+                            Value, ValueSize = ParseFieldValue (FieldList)\r
+                            if isinstance(Value, str):\r
+                                CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            elif IsArray:\r
+                            #\r
+                            # Use memcpy() to copy value into field\r
+                            #\r
+                                CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                                CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+                            continue\r
+                        for FieldName in FieldList:\r
+                            IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+                            if IsArray:\r
+                                try:\r
+                                    FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+                                except BadExpression:\r
+                                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                                    (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
                             try:\r
-                                FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
-                            except BadExpression:\r
-                                EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
-                                                (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
-\r
-                        try:\r
-                            Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
-                        except Exception:\r
-                            EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                        if isinstance(Value, str):\r
-                            CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                        elif IsArray:\r
-                        #\r
-                        # Use memcpy() to copy value into field\r
-                        #\r
-                            CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
-                            CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                            CApp = CApp + '  memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
-                        else:\r
-                            if ValueSize > 4:\r
-                                CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                                Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+                            except Exception:\r
+                                EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
+                            if isinstance(Value, str):\r
+                                CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            elif IsArray:\r
+                            #\r
+                            # Use memcpy() to copy value into field\r
+                            #\r
+                                CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                                CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                                CApp = CApp + '  memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
                             else:\r
-                                CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                                if ValueSize > 4:\r
+                                    CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                                else:\r
+                                    CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                 if skuname == SkuName:\r
                     break\r
             #\r
@@ -2165,10 +2240,14 @@ class DscBuildData(PlatformBuildClassObject):
         for pcd in Pcds.values():\r
             SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
+            pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
             for sku in pcd.SkuInfoList.values():\r
                 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue == None):\r
                     sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
+                    for default_store in sku.DefaultStoreDict:\r
+                        sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
+                    pcd.DefaultValue = pcdDecObject.DefaultValue\r
             if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec,VariableAttribute=SkuInfoObj.VariableAttribute,DefaultStore={DefaultStore:valuefromDec})\r
@@ -2287,6 +2366,7 @@ class DscBuildData(PlatformBuildClassObject):
         for pcd in Pcds.values():\r
             SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
+            pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
             for sku in pcd.SkuInfoList.values():\r
                 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r