import collections\r
import Common.DataType as DataType\r
\r
-var_info = collections.namedtuple("uefi_var", "pcdindex,pcdname,defaultstoragename,skuname,var_name, var_guid, var_offset,var_attribute,pcd_default_value, default_value, data_type")\r
+var_info = collections.namedtuple("uefi_var", "pcdindex,pcdname,defaultstoragename,skuname,var_name, var_guid, var_offset,var_attribute,pcd_default_value, default_value, data_type,PcdDscLine,StructurePcd")\r
NvStorageHeaderSize = 28\r
VariableHeaderSize = 32\r
\r
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
def combine_variable(self):\r
indexedvarinfo = collections.OrderedDict()\r
for item in self.VarInfo:\r
sku_var_info_offset_list = indexedvarinfo[key]\r
if len(sku_var_info_offset_list) == 1:\r
continue\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
+\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, DataType.TAB_VOID)]\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