summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e434be3)
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>
# 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
# 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
#\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
#\r
class PcdEntry:\r
def __init__(self, PcdCName, SkuId,PcdOffset, PcdSize, PcdValue, Lineno=None, FileName=None, PcdUnpackValue=None, \r
#\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
self.PcdCName = PcdCName.strip()\r
self.SkuId = SkuId.strip()\r
self.PcdOffset = PcdOffset.strip()\r
self.PcdUnpackValue = PcdUnpackValue\r
self.PcdBinOffset = PcdBinOffset\r
self.PcdBinSize = PcdBinSize\r
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
\r
if self.PcdValue == '' :\r
EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,\r
else:\r
Alignment = 1\r
\r
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
if PCD.PcdOffset != '*':\r
if PCD.PcdOccupySize % Alignment != 0:\r
if PCD.PcdUnpackValue.startswith("{"):\r
if PCD.PcdOccupySize % Alignment != 0:\r
PCD.PcdOccupySize = (PCD.PcdOccupySize / Alignment + 1) * Alignment\r
\r
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
if PCD._IsBoolean(PCD.PcdValue, PCD.PcdSize):\r
PCD._PackBooleanValue(PCD.PcdValue)\r
self.FileLinesList[count] = PCD\r
# The offset start from 0\r
NowOffset = 0\r
for Pcd in self.PcdUnknownOffsetList :\r
# 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
Pcd.PcdBinOffset = NowOffset\r
Pcd.PcdOffset = str(hex(Pcd.PcdBinOffset))\r
NowOffset += Pcd.PcdOccupySize\r
needFixPcdSize = eachUnfixedPcd.PcdOccupySize\r
# Not been fixed\r
if eachUnfixedPcd.PcdOffset == '*' :\r
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
# 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
NeedFixPcd = self.PcdUnknownOffsetList[0]\r
\r
NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdOccupySize\r
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
NeedFixPcd.PcdOffset = str(hex(NeedFixPcd.PcdBinOffset))\r
\r
# Insert this pcd into fixed offset pcd list's tail.\r