BaseTools: Fix the bug to align VPD PCD based on value type
authorYonghong Zhu <yonghong.zhu@intel.com>
Mon, 29 Jan 2018 07:49:56 +0000 (15:49 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Wed, 31 Jan 2018 09:47:50 +0000 (17:47 +0800)
Spec required for VOID* VPD Pcd, Ascii string use byte alignment, byte
array use 8-byte alignment, unicode string use 2-byte alignment.
while when the VPD pcd offset use *, the offset generated in the .map
file not follow this rule.

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

index 9861e7da68f13c0d6b9067f8712329e193622efc..ec4da230a4b2bf25704cade0f627e7073d716112 100644 (file)
@@ -2,7 +2,7 @@
 #  This file include GenVpd class for fix the Vpd type PCD offset, and PcdEntry for describe\r
 #  and process each entry of vpd type PCD.\r
 #\r
-#  Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
@@ -35,7 +35,7 @@ _FORMAT_CHAR = {1: 'B',
 #\r
 class PcdEntry:\r
     def __init__(self, PcdCName, SkuId,PcdOffset, PcdSize, PcdValue, Lineno=None, FileName=None, PcdUnpackValue=None, \r
-                 PcdBinOffset=None, PcdBinSize=None):\r
+                 PcdBinOffset=None, PcdBinSize=None, Alignment=None):\r
         self.PcdCName       = PcdCName.strip()\r
         self.SkuId          = SkuId.strip()\r
         self.PcdOffset      = PcdOffset.strip()\r
@@ -46,6 +46,7 @@ class PcdEntry:
         self.PcdUnpackValue = PcdUnpackValue\r
         self.PcdBinOffset   = PcdBinOffset\r
         self.PcdBinSize     = PcdBinSize\r
+        self.Alignment       = Alignment\r
         \r
         if self.PcdValue == '' :\r
             EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
@@ -434,6 +435,7 @@ class GenVPD :
                 else:\r
                     Alignment = 1\r
 \r
+                PCD.Alignment = Alignment\r
                 if PCD.PcdOffset != '*':\r
                     if PCD.PcdOccupySize % Alignment != 0:\r
                         if PCD.PcdUnpackValue.startswith("{"):\r
@@ -444,6 +446,7 @@ class GenVPD :
                     if PCD.PcdOccupySize % Alignment != 0:\r
                         PCD.PcdOccupySize = (PCD.PcdOccupySize / Alignment + 1) * Alignment\r
 \r
+                PackSize = PCD.PcdOccupySize\r
                 if PCD._IsBoolean(PCD.PcdValue, PCD.PcdSize):\r
                     PCD._PackBooleanValue(PCD.PcdValue)\r
                     self.FileLinesList[count] = PCD\r
@@ -518,6 +521,8 @@ class GenVPD :
             # The offset start from 0\r
             NowOffset = 0\r
             for Pcd in self.PcdUnknownOffsetList :\r
+                if NowOffset % Pcd.Alignment != 0:\r
+                    NowOffset = (NowOffset/ Pcd.Alignment + 1) * Pcd.Alignment\r
                 Pcd.PcdBinOffset = NowOffset\r
                 Pcd.PcdOffset    = str(hex(Pcd.PcdBinOffset))\r
                 NowOffset       += Pcd.PcdOccupySize\r
@@ -580,6 +585,8 @@ class GenVPD :
                         needFixPcdSize      = eachUnfixedPcd.PcdOccupySize\r
                         # Not been fixed\r
                         if eachUnfixedPcd.PcdOffset == '*' :\r
+                            if LastOffset % eachUnfixedPcd.Alignment != 0:\r
+                                LastOffset = (LastOffset / eachUnfixedPcd.Alignment + 1) * eachUnfixedPcd.Alignment\r
                             # The offset un-fixed pcd can write into this free space\r
                             if needFixPcdSize <= (NowOffset - LastOffset) :\r
                                 # Change the offset value of un-fixed pcd\r
@@ -632,6 +639,9 @@ class GenVPD :
             NeedFixPcd = self.PcdUnknownOffsetList[0]\r
             \r
             NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdOccupySize\r
+            if NeedFixPcd.PcdBinOffset % NeedFixPcd.Alignment != 0:\r
+                NeedFixPcd.PcdBinOffset = (NeedFixPcd.PcdBinOffset / NeedFixPcd.Alignment + 1) * NeedFixPcd.Alignment\r
+\r
             NeedFixPcd.PcdOffset    = str(hex(NeedFixPcd.PcdBinOffset))\r
             \r
             # Insert this pcd into fixed offset pcd list's tail.\r