]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTool: Support different PCDs that refers to the same EFI variable.
authorZhaozh1x <zhiqiangx.zhao@intel.com>
Wed, 10 Oct 2018 08:27:02 +0000 (16:27 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 22 Oct 2018 07:19:26 +0000 (15:19 +0800)
V2:
Make the code of patch both compatible for Python2 and Python3.

V1:
If different PCDs refer to the same EFI variable, then do EFI variable
combination, according to the VariableOffset of different PCDS.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: ZhiqiangX Zhao <zhiqiangx.zhao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
BaseTools/Source/Python/AutoGen/GenVar.py

index 036f00e2bbb104337b5d2642c593c2664a28183b..98f88e249729c2efee4ce4cab11cdd5fe5c9bea4 100644 (file)
@@ -56,51 +56,7 @@ class VariableMgr(object):
         value_str += ",".join(default_var_bin_strip)\r
         value_str += "}"\r
         return value_str\r
-    def Do_combine(self,sku_var_info_offset_list):\r
-        newvalue = {}\r
-        for item in sku_var_info_offset_list:\r
-            data_type = item.data_type\r
-            value_list = item.default_value.strip("{").strip("}").split(",")\r
-            if data_type in DataType.TAB_PCD_NUMERIC_TYPES:\r
-                data_flag = DataType.PACK_CODE_BY_SIZE[MAX_SIZE_TYPE[data_type]]\r
-                data = value_list[0]\r
-                value_list = []\r
-                for data_byte in pack(data_flag, int(data, 16) if data.upper().startswith('0X') else int(data)):\r
-                    value_list.append(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
-        try:\r
-            newvaluestr = "{" + ",".join(VariableMgr.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
-        return newvaluestr\r
-    def Do_Merge(self,sku_var_info_offset_list):\r
-        StructrurePcds = sorted([item for item in sku_var_info_offset_list if item.StructurePcd], key = lambda x: x.PcdDscLine, reverse =True )\r
-        Base = StructrurePcds[0]\r
-        BaseValue = Base.default_value.strip("{").strip("}").split(",")\r
-        Override = [item for item in sku_var_info_offset_list if not item.StructurePcd and item.PcdDscLine > Base.PcdDscLine]\r
-        newvalue = {}\r
-        for item in Override:\r
-            data_type = item.data_type\r
-            value_list = item.default_value.strip("{").strip("}").split(",")\r
-            if data_type in DataType.TAB_PCD_NUMERIC_TYPES:\r
-                data_flag = DataType.PACK_CODE_BY_SIZE[MAX_SIZE_TYPE[data_type]]\r
-                data = value_list[0]\r
-                value_list = []\r
-                for data_byte in pack(data_flag, int(data, 16) if data.upper().startswith('0X') else int(data)):\r
-                    value_list.append(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,item.pcdname,item.PcdDscLine)\r
-        for offset in newvalue:\r
-            value_list,itemPcdname,itemPcdDscLine = newvalue[offset]\r
-            if offset > len(BaseValue) or (offset + len(value_list) > len(BaseValue)):\r
-                EdkLogger.error("build", AUTOGEN_ERROR, "The EFI Variable referred by PCD %s in line %s exceeds variable size: %s\n" % (itemPcdname,itemPcdDscLine,hex(len(BaseValue))))\r
-            for i in xrange(len(value_list)):\r
-                BaseValue[offset + i] = value_list[i]\r
-        newvaluestr =  "{" + ",".join(BaseValue) +"}"\r
-        return newvaluestr\r
-    def NeedMerge(self,sku_var_info_offset_list):\r
-        if [item for item in sku_var_info_offset_list if item.StructurePcd]:\r
-            return True\r
-        return False\r
+\r
     def combine_variable(self):\r
         indexedvarinfo = collections.OrderedDict()\r
         for item in self.VarInfo:\r
@@ -109,30 +65,37 @@ class VariableMgr(object):
             indexedvarinfo[(item.skuname, item.defaultstoragename, item.var_name, item.var_guid)].append(item)\r
         for key in indexedvarinfo:\r
             sku_var_info_offset_list = indexedvarinfo[key]\r
-            if len(sku_var_info_offset_list) == 1:\r
-                continue\r
-\r
+            sku_var_info_offset_list.sort(key=lambda x:x.PcdDscLine)\r
+            FirstOffset = int(sku_var_info_offset_list[0].var_offset, 16) if sku_var_info_offset_list[0].var_offset.upper().startswith("0X") else int(sku_var_info_offset_list[0].var_offset)\r
+            fisrtvalue_list = sku_var_info_offset_list[0].default_value.strip("{").strip("}").split(",")\r
+            firstdata_type = sku_var_info_offset_list[0].data_type\r
+            if firstdata_type in DataType.TAB_PCD_NUMERIC_TYPES:\r
+                fisrtdata_flag = DataType.PACK_CODE_BY_SIZE[MAX_SIZE_TYPE[firstdata_type]]\r
+                fisrtdata = fisrtvalue_list[0]\r
+                fisrtvalue_list = []\r
+                for data_byte in pack(fisrtdata_flag, int(fisrtdata, 16) if fisrtdata.upper().startswith('0X') else int(fisrtdata)):\r
+                    fisrtvalue_list.append(hex(unpack("B", data_byte)[0]))\r
+            newvalue_list = ["0x00"] * FirstOffset + fisrtvalue_list\r
+\r
+            for var_item in sku_var_info_offset_list[1:]:\r
+                CurOffset = int(var_item.var_offset, 16) if var_item.var_offset.upper().startswith("0X") else int(var_item.var_offset)\r
+                CurvalueList = var_item.default_value.strip("{").strip("}").split(",")\r
+                Curdata_type = var_item.data_type\r
+                if Curdata_type in DataType.TAB_PCD_NUMERIC_TYPES:\r
+                    data_flag = DataType.PACK_CODE_BY_SIZE[MAX_SIZE_TYPE[Curdata_type]]\r
+                    data = CurvalueList[0]\r
+                    CurvalueList = []\r
+                    for data_byte in pack(data_flag, int(data, 16) if data.upper().startswith('0X') else int(data)):\r
+                        CurvalueList.append(hex(unpack("B", data_byte)[0]))\r
+                if CurOffset > len(newvalue_list):\r
+                    newvalue_list = newvalue_list + ["0x00"] * (CurOffset - len(newvalue_list)) + CurvalueList\r
+                else:\r
+                    newvalue_list[CurOffset : CurOffset + len(CurvalueList)] = CurvalueList\r
+\r
+            newvaluestr =  "{" + ",".join(newvalue_list) +"}"\r
             n = sku_var_info_offset_list[0]\r
-\r
-            if self.NeedMerge(sku_var_info_offset_list):\r
-                newvaluestr = self.Do_Merge(sku_var_info_offset_list)\r
-            else:\r
-                newvaluestr = self.Do_combine(sku_var_info_offset_list)\r
-\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, DataType.TAB_VOID,n.PcdDscLine,n.StructurePcd)]\r
-        self.VarInfo = [item[0] for item in indexedvarinfo.values()]\r
-\r
-    @staticmethod\r
-    def assemble_variable(valuedict):\r
-        ordered_valuedict_keys = sorted(valuedict.keys())\r
-        var_value = []\r
-        for current_valuedict_key in ordered_valuedict_keys:\r
-            if current_valuedict_key < len(var_value):\r
-                raise\r
-            for _ in xrange(current_valuedict_key - len(var_value)):\r
-                var_value.append('0x00')\r
-            var_value += valuedict[current_valuedict_key]\r
-        return var_value\r
+        self.VarInfo = [item[0] for item in list(indexedvarinfo.values())]\r
 \r
     def process_variable_data(self):\r
 \r