BaseTools: Update SkuId as SKU_ID type to follow current implementation
authorLiming Gao <liming.gao@intel.com>
Wed, 20 Dec 2017 09:16:28 +0000 (17:16 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 25 Dec 2017 03:05:49 +0000 (11:05 +0800)
Update PCD DB and Default setting format as nature alignment.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools/Source/Python/AutoGen/GenVar.py

index fe1a598..b60d335 100644 (file)
@@ -176,7 +176,8 @@ typedef struct {
   //GUID                  Signature;  // PcdDataBaseGuid\r
   //UINT32                BuildVersion;\r
   //UINT32                Length;\r
-  //SKU_ID                SystemSkuId;      // Current SkuId value.\r
+  //SKU_ID                SystemSkuId;       // Current SkuId value.\r
+  //UINT32                LengthForAllSkus;  // Length of all SKU PCD DB\r
   //UINT32                UninitDataBaseSize;// Total size for PCD those default value with 0.\r
   //TABLE_OFFSET          LocalTokenNumberTableOffset;\r
   //TABLE_OFFSET          ExMapTableOffset;\r
@@ -188,7 +189,7 @@ typedef struct {
   //UINT16                LocalTokenCount;  // LOCAL_TOKEN_NUMBER for all\r
   //UINT16                ExTokenCount;     // EX_TOKEN_NUMBER for DynamicEx\r
   //UINT16                GuidTableCount;   // The Number of Guid in GuidTable\r
-  //UINT8                 Pad[2];\r
+  //UINT8                 Pad[6];\r
   ${PHASE}_PCD_DATABASE_INIT    Init;\r
   ${PHASE}_PCD_DATABASE_UNINIT  Uninit;\r
 } ${PHASE}_PCD_DATABASE;\r
@@ -767,7 +768,7 @@ def BuildExDataBase(Dict):
     # VardefValueBoolean is the last table in the init table items\r
     InitTableNum = DbNameTotle.index("VardefValueBoolean") + 1\r
     # The FixedHeader length of the PCD_DATABASE_INIT, from Signature to Pad\r
-    FixedHeaderLen = 76\r
+    FixedHeaderLen = 80\r
 \r
     # Get offset of SkuId table in the database \r
     SkuIdTableOffset = FixedHeaderLen\r
@@ -924,10 +925,11 @@ def BuildExDataBase(Dict):
  \r
     Buffer += b\r
     b = pack('=B', Pad)\r
-\r
     Buffer += b\r
-    b = pack('=B', Pad)\r
\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
     Buffer += b\r
     \r
     Index = 0\r
@@ -991,9 +993,13 @@ def CreatePcdDataBase(PcdDBData):
     databasebuff = PcdDBData[("DEFAULT","0")][0]\r
 \r
     for skuname,skuid in delta:\r
-        databasebuff += pack('=H', int(skuid))\r
-        databasebuff += pack('=H', 0)\r
-        databasebuff += pack('=L', 8+4*len(delta[(skuname,skuid)]))\r
+        # 8 byte align\r
+        if len(databasebuff) % 8 > 0:\r
+            for i in range(8 - (len(databasebuff) % 8)):\r
+                databasebuff += pack("=B",0)\r
+        databasebuff += pack('=Q', int(skuid))\r
+        databasebuff += pack('=Q', 0)\r
+        databasebuff += pack('=L', 8+8+4+4*len(delta[(skuname,skuid)]))\r
         for item in delta[(skuname,skuid)]:\r
             databasebuff += pack("=L",item[0])\r
             databasebuff = databasebuff[:-1] + pack("=B",item[1])\r
index 47569d4..65d0bea 100644 (file)
@@ -69,7 +69,7 @@ class VariableMgr(object):
     def PatchNVStoreDefaultMaxSize(self,maxsize):\r
         if not self.NVHeaderBuff:\r
             return ""\r
-        self.NVHeaderBuff = self.NVHeaderBuff[:8] + pack("=L",maxsize)\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
@@ -166,7 +166,7 @@ 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
@@ -180,9 +180,9 @@ 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) + 12\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
@@ -243,7 +243,7 @@ class VariableMgr(object):
         Signature += pack("=B",ord('B'))\r
 \r
         SizeBuffer = pack("=L",size)\r
-        MaxSizeBuffer = pack("=L",maxsize)\r
+        MaxSizeBuffer = pack("=Q",maxsize)\r
 \r
         return Signature + SizeBuffer + MaxSizeBuffer\r
 \r
@@ -292,9 +292,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
@@ -315,9 +315,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
@@ -328,8 +328,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