X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FAutoGen%2FGenVar.py;h=1c66a9eb050f6f150f9899afa6defa7d58dcbdd0;hp=47569d489482f6249553f4b56c0ce7d413e6c7e1;hb=55c84777ee638be8735a5c421941e7eb71633bdf;hpb=47854fd598b73267d57594c5bac6a2326332b08c diff --git a/BaseTools/Source/Python/AutoGen/GenVar.py b/BaseTools/Source/Python/AutoGen/GenVar.py index 47569d4894..1c66a9eb05 100644 --- a/BaseTools/Source/Python/AutoGen/GenVar.py +++ b/BaseTools/Source/Python/AutoGen/GenVar.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -20,8 +20,9 @@ import copy from Common.VariableAttributes import VariableAttributes from Common.Misc import * import collections +import Common.DataType as DataType -var_info = collections.namedtuple("uefi_var", "pcdindex,pcdname,defaultstoragename,skuname,var_name, var_guid, var_attribute,pcd_default_value, default_value, data_type") +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") NvStorageHeaderSize = 28 VariableHeaderSize = 32 @@ -69,14 +70,62 @@ class VariableMgr(object): def PatchNVStoreDefaultMaxSize(self,maxsize): if not self.NVHeaderBuff: return "" - self.NVHeaderBuff = self.NVHeaderBuff[:8] + pack("=L",maxsize) + self.NVHeaderBuff = self.NVHeaderBuff[:8] + pack("=Q",maxsize) default_var_bin = self.format_data(self.NVHeaderBuff + self.VarDefaultBuff + self.VarDeltaBuff) value_str = "{" default_var_bin_strip = [ data.strip("""'""") for data in default_var_bin] value_str += ",".join(default_var_bin_strip) value_str += "}" return value_str - + def combine_variable(self): + indexedvarinfo = collections.OrderedDict() + for item in self.VarInfo: + if (item.skuname,item.defaultstoragename, item.var_name,item.var_guid) not in indexedvarinfo: + indexedvarinfo[(item.skuname,item.defaultstoragename, item.var_name,item.var_guid) ] = [] + indexedvarinfo[(item.skuname,item.defaultstoragename, item.var_name,item.var_guid)].append(item) + for key in indexedvarinfo: + sku_var_info_offset_list = indexedvarinfo[key] + if len(sku_var_info_offset_list) == 1: + continue + newvalue = {} + for item in sku_var_info_offset_list: + data_type = item.data_type + value_list = item.default_value.strip("{").strip("}").split(",") + if data_type in ["BOOLEAN","UINT8","UINT16","UINT32","UINT64"]: + if data_type == ["BOOLEAN","UINT8"]: + data_flag = "=B" + elif data_type == "UINT16": + data_flag = "=H" + elif data_type == "UINT32": + data_flag = "=L" + elif data_type == "UINT64": + data_flag = "=Q" + data = value_list[0] + value_list = [] + for data_byte in pack(data_flag,int(data,16) if data.upper().startswith('0X') else int(data)): + value_list += [hex(unpack("B",data_byte)[0])] + newvalue[int(item.var_offset,16) if item.var_offset.upper().startswith("0X") else int(item.var_offset)] = value_list + try: + newvaluestr = "{" + ",".join(self.assemble_variable(newvalue)) +"}" + except: + EdkLogger.error("build", AUTOGEN_ERROR, "Variable offset conflict in PCDs: %s \n" % (" and ".join([item.pcdname for item in sku_var_info_offset_list]))) + n = sku_var_info_offset_list[0] + 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*")] + self.VarInfo = [item[0] for item in indexedvarinfo.values()] + + def assemble_variable(self, valuelist): + ordered_value = [valuelist[k] for k in sorted(valuelist.keys())] + ordered_offset = sorted(valuelist.keys()) + var_value = [] + num = 0 + for offset in ordered_offset: + if offset < len(var_value): + raise + for _ in xrange(offset - len(var_value)): + var_value.append('0x00') + var_value += ordered_value[num] + num +=1 + return var_value def process_variable_data(self): var_data = dict() @@ -93,7 +142,7 @@ class VariableMgr(object): default_data_buffer = "" others_data_buffer = "" tail = None - default_sku_default = indexedvarinfo.get(index).get(("DEFAULT","STANDARD")) + default_sku_default = indexedvarinfo.get(index).get((DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT)) if default_sku_default.data_type not in ["UINT8","UINT16","UINT32","UINT64","BOOLEAN"]: var_max_len = max([len(var_item.default_value.split(",")) for var_item in sku_var_info.values()]) @@ -106,13 +155,13 @@ class VariableMgr(object): for item in default_data_buffer: default_data_array += unpack("B",item) - if ("DEFAULT","STANDARD") not in var_data: - var_data[("DEFAULT","STANDARD")] = collections.OrderedDict() - var_data[("DEFAULT","STANDARD")][index] = (default_data_buffer,sku_var_info[("DEFAULT","STANDARD")]) + if (DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT) not in var_data: + var_data[(DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT)] = collections.OrderedDict() + var_data[(DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT)][index] = (default_data_buffer,sku_var_info[(DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT)]) for (skuid,defaultstoragename) in indexedvarinfo.get(index): tail = None - if (skuid,defaultstoragename) == ("DEFAULT","STANDARD"): + if (skuid,defaultstoragename) == (DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT): continue other_sku_other = indexedvarinfo.get(index).get((skuid,defaultstoragename)) @@ -134,13 +183,14 @@ class VariableMgr(object): return var_data def new_process_varinfo(self): + self.combine_variable() var_data = self.process_variable_data() if not var_data: return [] - pcds_default_data = var_data.get(("DEFAULT","STANDARD"),{}) + pcds_default_data = var_data.get((DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT),{}) NvStoreDataBuffer = "" var_data_offset = collections.OrderedDict() offset = NvStorageHeaderSize @@ -166,11 +216,11 @@ class VariableMgr(object): variable_storage_header_buffer = self.PACK_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28) - nv_default_part = self.AlignData(self.PACK_DEFAULT_DATA(0, 0, self.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer))) + nv_default_part = self.AlignData(self.PACK_DEFAULT_DATA(0, 0, self.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer)), 8) data_delta_structure_buffer = "" for skuname,defaultstore in var_data: - if (skuname,defaultstore) == ("DEFAULT","STANDARD"): + if (skuname,defaultstore) == (DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT): continue pcds_sku_data = var_data.get((skuname,defaultstore)) delta_data_set = [] @@ -180,9 +230,9 @@ class VariableMgr(object): delta_data = [(item[0] + offset, item[1]) for item in delta_data] delta_data_set.extend(delta_data) - data_delta_structure_buffer += self.AlignData(self.PACK_DELTA_DATA(skuname,defaultstore,delta_data_set)) + data_delta_structure_buffer += self.AlignData(self.PACK_DELTA_DATA(skuname,defaultstore,delta_data_set), 8) - size = len(nv_default_part + data_delta_structure_buffer) + 12 + size = len(nv_default_part + data_delta_structure_buffer) + 16 maxsize = self.VpdRegionSize if self.VpdRegionSize else size NV_Store_Default_Header = self.PACK_NV_STORE_DEFAULT_HEADER(size,maxsize) @@ -243,7 +293,7 @@ class VariableMgr(object): Signature += pack("=B",ord('B')) SizeBuffer = pack("=L",size) - MaxSizeBuffer = pack("=L",maxsize) + MaxSizeBuffer = pack("=Q",maxsize) return Signature + SizeBuffer + MaxSizeBuffer @@ -292,9 +342,9 @@ class VariableMgr(object): def PACK_DEFAULT_DATA(self, defaultstoragename,skuid,var_value): Buffer = "" - Buffer += pack("=L",8) - Buffer += pack("=H",int(defaultstoragename)) - Buffer += pack("=H",int(skuid)) + Buffer += pack("=L",4+8+8) + Buffer += pack("=Q",int(skuid)) + Buffer += pack("=Q",int(defaultstoragename)) for item in var_value: Buffer += pack("=B",item) @@ -315,9 +365,9 @@ class VariableMgr(object): skuid = self.GetSkuId(skuname) defaultstorageid = self.GetDefaultStoreId(defaultstoragename) Buffer = "" - Buffer += pack("=L",8) - Buffer += pack("=H",int(skuid)) - Buffer += pack("=H",int(defaultstorageid)) + Buffer += pack("=L",4+8+8) + Buffer += pack("=Q",int(skuid)) + Buffer += pack("=Q",int(defaultstorageid)) for (delta_offset,value) in delta_list: Buffer += pack("=L",delta_offset) Buffer = Buffer[:-1] + pack("=B",value) @@ -328,8 +378,9 @@ class VariableMgr(object): def AlignData(self,data, align = 4): mybuffer = data - for i in range(len(data) % align): - mybuffer += pack("=B",0) + if (len(data) % align) > 0: + for i in range(align - (len(data) % align)): + mybuffer += pack("=B",0) return mybuffer