]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTool: GUID format PCD value assignment fail in Structure PCD field
authorBobCF <bob.c.feng@intel.com>
Wed, 28 Feb 2018 05:59:20 +0000 (13:59 +0800)
committerLiming Gao <liming.gao@intel.com>
Wed, 28 Feb 2018 08:47:27 +0000 (16:47 +0800)
If Structure PCD field is assigned as GUID format, its data type should be
the fixed GUID structure. No flexible check is required.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/Workspace/DecBuildData.py
BaseTools/Source/Python/Workspace/DscBuildData.py

index 18101a0add6ce820e30534e350678adfec4fd9e9..ee00ec07196da24ea78e5b41c7065d799a30fd87 100644 (file)
@@ -15,6 +15,7 @@ from Common.String import *
 from Common.DataType import *\r
 from Common.Misc import *\r
 from types import *\r
 from Common.DataType import *\r
 from Common.Misc import *\r
 from types import *\r
+from collections import OrderedDict\r
 \r
 from Workspace.BuildClassObject import PackageBuildClassObject, StructurePcd, PcdClassObject\r
 \r
 \r
 from Workspace.BuildClassObject import PackageBuildClassObject, StructurePcd, PcdClassObject\r
 \r
@@ -367,7 +368,7 @@ class DecBuildData(PackageBuildClassObject):
 \r
 \r
     def ProcessStructurePcd(self, StructurePcdRawDataSet):\r
 \r
 \r
     def ProcessStructurePcd(self, StructurePcdRawDataSet):\r
-        s_pcd_set = dict()\r
+        s_pcd_set = OrderedDict()\r
         for s_pcd,LineNo in StructurePcdRawDataSet:\r
             if s_pcd.TokenSpaceGuidCName not in s_pcd_set:\r
                 s_pcd_set[s_pcd.TokenSpaceGuidCName] = []\r
         for s_pcd,LineNo in StructurePcdRawDataSet:\r
             if s_pcd.TokenSpaceGuidCName not in s_pcd_set:\r
                 s_pcd_set[s_pcd.TokenSpaceGuidCName] = []\r
index 64dac961ed300221bf632b0253046efc7f5fe501..9b7e3b75c5d9e67bc010d2866645f61198b1a25d 100644 (file)
@@ -39,6 +39,7 @@ import Common.GlobalData as GlobalData
 import subprocess\r
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
 import subprocess\r
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
+from collections import OrderedDict\r
 \r
 #\r
 # Treat CHAR16 as a synonym for UINT16.  CHAR16 support is required for VFR C structs\r
 \r
 #\r
 # Treat CHAR16 as a synonym for UINT16.  CHAR16 support is required for VFR C structs\r
@@ -1284,7 +1285,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         # handle pcd value override\r
         StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
 \r
         # handle pcd value override\r
         StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
-        S_pcd_set = {}\r
+        S_pcd_set = OrderedDict()\r
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
@@ -1562,6 +1563,177 @@ class DscBuildData(PlatformBuildClassObject):
         Result = Result + '"'\r
         return Result\r
 \r
         Result = Result + '"'\r
         return Result\r
 \r
+    def GenerateSizeFunction(self,Pcd):\r
+        CApp = "// Default Value in Dec \n"\r
+        CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+        for FieldList in [Pcd.DefaultValues]:\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 and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\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
+        for skuname in Pcd.SkuOverrideValues:\r
+            if skuname == "COMMON":\r
+                continue\r
+            for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
+                CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
+                for FieldList in [Pcd.SkuOverrideValues[skuname].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 and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\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
+        CApp = CApp + "}\n"\r
+        return CApp\r
+    def GenerateSizeStatments(self,Pcd):\r
+        CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
+        CApp = CApp + '  Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+        return CApp\r
+    def GenerateDefaultValueAssignFunction(self,Pcd):\r
+        CApp = "// Default value in Dec \n"\r
+        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
+        CApp = CApp + '  UINT32  FieldSize;\n'\r
+        CApp = CApp + '  CHAR8   *Value;\n'\r
+        DefaultValueFromDec = Pcd.DefaultValueFromDec\r
+        IsArray = self.IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
+        if IsArray:\r
+            try:\r
+                DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
+            except BadExpression:\r
+                EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
+                                (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
+        Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
+        if isinstance(Value, str):\r
+            CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
+        elif IsArray:\r
+        #\r
+        # Use memcpy() to copy value into field\r
+        #\r
+            CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+        for FieldList in [Pcd.DefaultValues]:\r
+            if not FieldList:\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
+\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, 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
+                    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
+        CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % ('DEFAULT', 'STANDARD')\r
+        inherit_OverrideValues = Pcd.SkuOverrideValues['DEFAULT']\r
+        pcddefaultvalue = Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
+        for FieldList in [pcddefaultvalue,inherit_OverrideValues.get('STANDARD')]:\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('DEFAULT',{}).get('STANDARD', 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('DEFAULT',{}).get('STANDARD', 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
+                    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, 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
+                    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
+        CApp = CApp + "}\n"\r
+        return CApp\r
+    def GenerateDefaultValueAssignStatement(self,Pcd):\r
+        CApp = '  Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+        return CApp\r
     def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):\r
         OverrideValues = {DefaultStoreName:""}\r
         if Pcd.SkuOverrideValues:\r
     def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):\r
         OverrideValues = {DefaultStoreName:""}\r
         if Pcd.SkuOverrideValues:\r
@@ -1601,65 +1773,7 @@ class DscBuildData(PlatformBuildClassObject):
             # in a structure.  The size formula for this case is:\r
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
             # in a structure.  The size formula for this case is:\r
             # 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
-                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
-            for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
-                inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\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
+            CApp = CApp + self.GenerateSizeStatments(Pcd)\r
 \r
             #\r
             # Allocate and zero buffer for the PCD\r
 \r
             #\r
             # Allocate and zero buffer for the PCD\r
@@ -1678,55 +1792,10 @@ class DscBuildData(PlatformBuildClassObject):
             #\r
             # Assign field values in PCD\r
             #\r
             #\r
             # Assign field values in PCD\r
             #\r
-            CApp = CApp + "// Default value in Dec \n"\r
-            DefaultValueFromDec = Pcd.DefaultValueFromDec\r
-            IsArray = self.IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
-            if IsArray:\r
-                try:\r
-                    DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
-                except BadExpression:\r
-                    EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
-                                    (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
-            Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
-            if isinstance(Value, str):\r
-                CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
-            elif IsArray:\r
-            #\r
-            # Use memcpy() to copy value into field\r
-            #\r
-                CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
-                CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-            for FieldList in [Pcd.DefaultValues]:\r
-                if not FieldList:\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
-\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
-                        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
+            CApp = CApp + self.GenerateDefaultValueAssignStatement(Pcd)\r
             for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
             for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
+                if skuname == "DEFAULT":\r
+                    continue\r
                 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
                 storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
                 for defaultstorenameitem in storeset:\r
                 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
                 storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
                 for defaultstorenameitem in storeset:\r
@@ -1773,7 +1842,7 @@ class DscBuildData(PlatformBuildClassObject):
                             #\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
                             #\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
+                                CApp = CApp + '  memcpy (&Pcd->%s, 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
                             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
@@ -1814,6 +1883,8 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '\n'\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
         CApp = CApp + '\n'\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
+            CApp = CApp + self.GenerateSizeFunction(Pcd)\r
+            CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
             if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)\r
             if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)\r