+ 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