]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenVar.py
BaseTools: use predefined constants instead of local strings
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenVar.py
index 98e1a4cdae7b4f9f4e3732ab2d501e1f6ac74a7b..1c66a9eb050f6f150f9899afa6defa7d58dcbdd0 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -20,8 +20,9 @@ import copy
 from Common.VariableAttributes import VariableAttributes\r
 from Common.Misc import *\r
 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_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")\r
 NvStorageHeaderSize = 28\r
 VariableHeaderSize = 32\r
 \r
@@ -51,10 +52,80 @@ class VariableMgr(object):
         self.VarInfo = []\r
         self.DefaultStoreMap = DefaultStoreMap\r
         self.SkuIdMap = SkuIdMap\r
+        self.VpdRegionSize = 0\r
+        self.VpdRegionOffset = 0\r
+        self.NVHeaderBuff = None\r
+        self.VarDefaultBuff = None\r
+        self.VarDeltaBuff = None\r
 \r
     def append_variable(self,uefi_var):\r
         self.VarInfo.append(uefi_var)\r
 \r
+    def SetVpdRegionMaxSize(self,maxsize):\r
+        self.VpdRegionSize = maxsize\r
+\r
+    def SetVpdRegionOffset(self,vpdoffset):\r
+        self.VpdRegionOffset = vpdoffset\r
+\r
+    def PatchNVStoreDefaultMaxSize(self,maxsize):\r
+        if not self.NVHeaderBuff:\r
+            return ""\r
+        self.NVHeaderBuff = self.NVHeaderBuff[:8] + pack("=Q",maxsize)\r
+        default_var_bin = self.format_data(self.NVHeaderBuff + self.VarDefaultBuff + self.VarDeltaBuff)\r
+        value_str = "{"\r
+        default_var_bin_strip = [ data.strip("""'""") for data in default_var_bin]\r
+        value_str += ",".join(default_var_bin_strip)\r
+        value_str += "}"\r
+        return value_str\r
+    def combine_variable(self):\r
+        indexedvarinfo = collections.OrderedDict()\r
+        for item in self.VarInfo:\r
+            if (item.skuname,item.defaultstoragename, item.var_name,item.var_guid) not in indexedvarinfo:\r
+                indexedvarinfo[(item.skuname,item.defaultstoragename, item.var_name,item.var_guid) ] = []\r
+            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
+            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 ["BOOLEAN","UINT8","UINT16","UINT32","UINT64"]:\r
+                    if data_type == ["BOOLEAN","UINT8"]:\r
+                        data_flag = "=B"\r
+                    elif data_type == "UINT16":\r
+                        data_flag = "=H"\r
+                    elif data_type == "UINT32":\r
+                        data_flag = "=L"\r
+                    elif data_type == "UINT64":\r
+                        data_flag = "=Q"\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 += [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(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
@@ -71,7 +142,7 @@ class VariableMgr(object):
             default_data_buffer = ""\r
             others_data_buffer = ""\r
             tail = None\r
-            default_sku_default = indexedvarinfo.get(index).get(("DEFAULT","STANDARD"))\r
+            default_sku_default = indexedvarinfo.get(index).get((DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT))\r
 \r
             if default_sku_default.data_type not in ["UINT8","UINT16","UINT32","UINT64","BOOLEAN"]:\r
                 var_max_len = max([len(var_item.default_value.split(",")) for var_item in sku_var_info.values()])\r
@@ -84,13 +155,13 @@ class VariableMgr(object):
             for item in default_data_buffer:\r
                 default_data_array += unpack("B",item)\r
 \r
-            if ("DEFAULT","STANDARD") not in var_data:\r
-                var_data[("DEFAULT","STANDARD")] = collections.OrderedDict()\r
-            var_data[("DEFAULT","STANDARD")][index] = (default_data_buffer,sku_var_info[("DEFAULT","STANDARD")])\r
+            if (DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT) not in var_data:\r
+                var_data[(DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT)] = collections.OrderedDict()\r
+            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)])\r
 \r
             for (skuid,defaultstoragename) in indexedvarinfo.get(index):\r
                 tail = None\r
-                if (skuid,defaultstoragename) == ("DEFAULT","STANDARD"):\r
+                if (skuid,defaultstoragename) == (DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT):\r
                     continue\r
                 other_sku_other = indexedvarinfo.get(index).get((skuid,defaultstoragename))\r
 \r
@@ -112,10 +183,14 @@ class VariableMgr(object):
         return var_data\r
 \r
     def new_process_varinfo(self):\r
+        self.combine_variable()\r
 \r
         var_data = self.process_variable_data()\r
 \r
-        pcds_default_data = var_data.get(("DEFAULT","STANDARD"))\r
+        if not var_data:\r
+            return []\r
+\r
+        pcds_default_data = var_data.get((DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT),{})\r
         NvStoreDataBuffer = ""\r
         var_data_offset = collections.OrderedDict()\r
         offset = NvStorageHeaderSize\r
@@ -141,11 +216,11 @@ class VariableMgr(object):
 \r
         variable_storage_header_buffer = self.PACK_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28)\r
 \r
-        nv_default_part = self.AlignData(self.PACK_DEFAULT_DATA(0, 0, self.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer)))\r
+        nv_default_part = self.AlignData(self.PACK_DEFAULT_DATA(0, 0, self.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer)), 8)\r
 \r
         data_delta_structure_buffer = ""\r
         for skuname,defaultstore in var_data:\r
-            if (skuname,defaultstore) == ("DEFAULT","STANDARD"):\r
+            if (skuname,defaultstore) == (DataType.TAB_DEFAULT,DataType.TAB_DEFAULT_STORES_DEFAULT):\r
                 continue\r
             pcds_sku_data = var_data.get((skuname,defaultstore))\r
             delta_data_set = []\r
@@ -155,9 +230,16 @@ class VariableMgr(object):
                 delta_data = [(item[0] + offset, item[1]) for item in delta_data]\r
                 delta_data_set.extend(delta_data)\r
 \r
-            data_delta_structure_buffer += self.AlignData(self.PACK_DELTA_DATA(skuname,defaultstore,delta_data_set))\r
+            data_delta_structure_buffer += self.AlignData(self.PACK_DELTA_DATA(skuname,defaultstore,delta_data_set), 8)\r
+\r
+        size = len(nv_default_part + data_delta_structure_buffer) + 16\r
+        maxsize = self.VpdRegionSize if self.VpdRegionSize else size\r
+        NV_Store_Default_Header = self.PACK_NV_STORE_DEFAULT_HEADER(size,maxsize)\r
 \r
-        return self.format_data(nv_default_part + data_delta_structure_buffer)\r
+        self.NVHeaderBuff =  NV_Store_Default_Header\r
+        self.VarDefaultBuff =nv_default_part\r
+        self.VarDeltaBuff =  data_delta_structure_buffer\r
+        return self.format_data(NV_Store_Default_Header + nv_default_part + data_delta_structure_buffer)\r
 \r
 \r
     def format_data(self,data):\r
@@ -182,11 +264,13 @@ class VariableMgr(object):
     def dump(self):\r
 \r
         default_var_bin = self.new_process_varinfo()\r
-        value_str = "{"\r
-        default_var_bin_strip = [ data.strip("""'""") for data in default_var_bin]\r
-        value_str += ",".join(default_var_bin_strip)\r
-        value_str += "}"\r
-        return value_str\r
+        if default_var_bin:\r
+            value_str = "{"\r
+            default_var_bin_strip = [ data.strip("""'""") for data in default_var_bin]\r
+            value_str += ",".join(default_var_bin_strip)\r
+            value_str += "}"\r
+            return value_str\r
+        return ""\r
 \r
     def PACK_VARIABLE_STORE_HEADER(self,size):\r
         #Signature: gEfiVariableGuid\r
@@ -202,6 +286,16 @@ class VariableMgr(object):
 \r
         return GuidBuffer + SizeBuffer + FormatBuffer + StateBuffer + reservedBuffer\r
 \r
+    def PACK_NV_STORE_DEFAULT_HEADER(self,size,maxsize):\r
+        Signature = pack('=B',ord('N'))\r
+        Signature += pack("=B",ord('S'))\r
+        Signature += pack("=B",ord('D'))\r
+        Signature += pack("=B",ord('B'))\r
+\r
+        SizeBuffer = pack("=L",size)\r
+        MaxSizeBuffer = pack("=Q",maxsize)\r
+\r
+        return Signature + SizeBuffer + MaxSizeBuffer\r
 \r
     def PACK_VARIABLE_HEADER(self,attribute,namesize,datasize,vendorguid):\r
 \r
@@ -248,9 +342,9 @@ class VariableMgr(object):
 \r
     def PACK_DEFAULT_DATA(self, defaultstoragename,skuid,var_value):\r
         Buffer = ""\r
-        Buffer += pack("=L",8)\r
-        Buffer += pack("=H",int(defaultstoragename))\r
-        Buffer += pack("=H",int(skuid))\r
+        Buffer += pack("=L",4+8+8)\r
+        Buffer += pack("=Q",int(skuid))\r
+        Buffer += pack("=Q",int(defaultstoragename))\r
 \r
         for item in var_value:\r
             Buffer += pack("=B",item)\r
@@ -271,9 +365,9 @@ class VariableMgr(object):
         skuid = self.GetSkuId(skuname)\r
         defaultstorageid = self.GetDefaultStoreId(defaultstoragename)\r
         Buffer = ""\r
-        Buffer += pack("=L",8)\r
-        Buffer += pack("=H",int(skuid))\r
-        Buffer += pack("=H",int(defaultstorageid))\r
+        Buffer += pack("=L",4+8+8)\r
+        Buffer += pack("=Q",int(skuid))\r
+        Buffer += pack("=Q",int(defaultstorageid))\r
         for (delta_offset,value) in delta_list:\r
             Buffer += pack("=L",delta_offset)\r
             Buffer = Buffer[:-1] + pack("=B",value)\r
@@ -284,8 +378,9 @@ class VariableMgr(object):
 \r
     def AlignData(self,data, align = 4):\r
         mybuffer = data\r
-        for i in range(len(data) % align):\r
-            mybuffer += pack("=B",0)\r
+        if (len(data) % align) > 0:\r
+            for i in range(align - (len(data) % align)):\r
+                mybuffer += pack("=B",0)\r
 \r
         return mybuffer\r
 \r