]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTool: Fixed Pcd issues.
authorFeng, Bob C <bob.c.feng@intel.com>
Wed, 7 Feb 2018 02:01:59 +0000 (10:01 +0800)
committerLiming Gao <liming.gao@intel.com>
Thu, 8 Feb 2018 03:09:42 +0000 (11:09 +0800)
1. Check variable offset when merging Hii Pcds
2. Fixed the issue of Hii value inherit with default store.
3. Error handling for incorrect structure pcd declare.

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/AutoGen/GenVar.py
BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools/Source/Python/Workspace/DecBuildData.py
BaseTools/Source/Python/Workspace/DscBuildData.py

index 1389d7ff622542725394559a0997729e6bc7c1f9..d222e6ed5e7ed608793cbc578e279a63bae2dc92 100644 (file)
@@ -104,10 +104,27 @@ class VariableMgr(object):
                     for data_byte in pack(data_flag,int(data,16) if data.upper().startswith('0X') else int(data)):\r
                         value_list += [hex(unpack("B",data_byte)[0])]\r
                 newvalue[int(item.var_offset,16) if item.var_offset.upper().startswith("0X") else int(item.var_offset)] = value_list\r
-            newvaluestr = "{" + ",".join(reduce(lambda x,y: x+y, [newvalue[k] for k in sorted(newvalue.keys())] )) +"}"\r
+            try:\r
+                newvaluestr = "{" + ",".join(self.assemble_variable(newvalue)) +"}"\r
+            except:\r
+                EdkLogger.error("build", AUTOGEN_ERROR, "Variable offset conflict in PCDs: %s \n" % (" and ".join([item.pcdname for item in sku_var_info_offset_list])))\r
             n = sku_var_info_offset_list[0]\r
             indexedvarinfo[key] =  [var_info(n.pcdindex,n.pcdname,n.defaultstoragename,n.skuname,n.var_name, n.var_guid, "0x00",n.var_attribute,newvaluestr  , newvaluestr , "VOID*")]\r
         self.VarInfo = [item[0] for item in indexedvarinfo.values()]\r
+\r
+    def assemble_variable(self, valuelist):\r
+        ordered_value = [valuelist[k] for k in sorted(valuelist.keys())]\r
+        ordered_offset = sorted(valuelist.keys())\r
+        var_value = []\r
+        num = 0\r
+        for offset in ordered_offset:\r
+            if offset < len(var_value):\r
+                raise\r
+            for _ in xrange(offset - len(var_value)):\r
+                var_value.append('0x00')\r
+            var_value += ordered_value[num]\r
+            num +=1\r
+        return var_value\r
     def process_variable_data(self):\r
 \r
         var_data = dict()\r
index 0e1161c96f647effc9d7e730ee2159548b76b611..f499cbd58becccf7209eb92234e27fe07f0320bc 100644 (file)
@@ -114,6 +114,7 @@ class StructurePcd(PcdClassObject):
         if validateranges is None: validateranges=[]\r
         if validlists is None: validlists=[]\r
         if expressions is None : expressions=[]\r
+        if Packages is None : Packages = []\r
         super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)\r
         self.StructuredPcdIncludeFile = [] if StructuredPcdIncludeFile is None else StructuredPcdIncludeFile\r
         self.PackageDecs = Packages\r
index 2266b0b7a623ccd16fd8cb869d6f8e15f3d244ed..99c3bf14f12f64d0f8cf473f5b8a1fec48bb54fa 100644 (file)
@@ -389,6 +389,8 @@ class DecBuildData(PackageBuildClassObject):
                     struct_pcd.AddDefaultValue(item.TokenCName, item.DefaultValue,self.MetaFile.File,LineNo)\r
 \r
             struct_pcd.PackageDecs = dep_pkgs\r
+            if not struct_pcd.StructuredPcdIncludeFile:\r
+                EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The structure Pcd %s.%s header file is not found in %s line %s \n" % (struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName,self.MetaFile.File,LineNo ))\r
 \r
             str_pcd_set.append(struct_pcd)\r
 \r
@@ -423,11 +425,6 @@ class DecBuildData(PackageBuildClassObject):
                 continue\r
 \r
             DefaultValue, DatumType, TokenNumber = AnalyzePcdData(Setting)\r
-            if DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
-                StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*$')\r
-                if StructPattern.match(DatumType) == None:\r
-                    EdkLogger.error('build', FORMAT_INVALID, "DatumType only support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct name.", File=self.MetaFile, Line=LineNo)\r
-\r
             validateranges, validlists, expressions = self._RawData.GetValidExpression(TokenSpaceGuid, PcdCName)\r
             PcdObj = PcdClassObject(\r
                                         PcdCName,\r
index d9165f2ac7dd346cbb68838084e140668337d313..01592e147e144fb3ee579967d9d7717b910d9244 100644 (file)
@@ -1584,6 +1584,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
@@ -1611,31 +1612,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
@@ -1656,6 +1660,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
@@ -1688,56 +1693,56 @@ 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
+                    for FieldList in [Pcd.DefaultFromDSC,inherit_OverrideValues.get(defaultstorenameitem)]:\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
+                            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
+                        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
@@ -2350,6 +2355,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