# 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 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2010 - 2016, 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
# Enhanced for support "|" character in the string.\r
#\r
- ValueList = ['', '', '', '',''] \r
+ ValueList = ['', '', '', '','']\r
\r
ValueRe = re.compile(r'\s*L?\".*\|.*\"\s*$')\r
PtrValue = ValueRe.findall(line)\r
ValueList[0:len(TokenList)] = TokenList\r
\r
if ValueUpdateFlag:\r
- ValueList[4] = PtrValue[0] \r
+ ValueList[4] = PtrValue[0]\r
self.FileLinesList[count] = ValueList\r
# Store the line number\r
self.FileLinesList[count].append(str(count + 1))\r
PCD.SkuId = PCD.SkuId.strip(' ')\r
PCD.PcdOffset = PCD.PcdOffset.strip(' ')\r
PCD.PcdSize = PCD.PcdSize.strip(' ')\r
- PCD.PcdValue = PCD.PcdValue.strip(' ') \r
+ PCD.PcdValue = PCD.PcdValue.strip(' ')\r
PCD.Lineno = PCD.Lineno.strip(' ')\r
- \r
+\r
#\r
# Store the original pcd value.\r
# This information will be useful while generate the output map file.\r
#\r
- PCD.PcdUnpackValue = str(PCD.PcdValue) \r
+ PCD.PcdUnpackValue = str(PCD.PcdValue)\r
\r
#\r
# Translate PCD size string to an integer value.\r
except:\r
EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, "Invalid PCD size value %s at file: %s line: %s" % (PCD.PcdSize, self.InputFileName, PCD.Lineno))\r
\r
+ #\r
+ # If value is Unicode string (e.g. L""), then use 2-byte alignment\r
+ # If value is byte array (e.g. {}), then use 8-byte alignment\r
+ #\r
+ PCD.PcdOccupySize = PCD.PcdBinSize\r
+ if PCD.PcdUnpackValue.startswith("{"):\r
+ Alignment = 8\r
+ elif PCD.PcdUnpackValue.startswith("L"):\r
+ Alignment = 2\r
+ else:\r
+ Alignment = 1\r
+\r
+ if PCD.PcdOffset != '*':\r
+ if PCD.PcdOccupySize % Alignment != 0:\r
+ if PCD.PcdUnpackValue.startswith("{"):\r
+ EdkLogger.warn("BPDG", "The offset value of PCD %s is not 8-byte aligned!" %(PCD.PcdCName), File=self.InputFileName)\r
+ else:\r
+ EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID, 'The offset value of PCD %s should be %s-byte aligned.' % (PCD.PcdCName, Alignment))\r
+ else:\r
+ if PCD.PcdOccupySize % Alignment != 0:\r
+ PCD.PcdOccupySize = (PCD.PcdOccupySize / Alignment + 1) * Alignment\r
+\r
if PCD._IsBoolean(PCD.PcdValue, PCD.PcdSize):\r
PCD._PackBooleanValue(PCD.PcdValue)\r
self.FileLinesList[count] = PCD\r
for Pcd in self.PcdUnknownOffsetList :\r
Pcd.PcdBinOffset = NowOffset\r
Pcd.PcdOffset = str(hex(Pcd.PcdBinOffset))\r
- NowOffset += Pcd.PcdBinSize\r
+ NowOffset += Pcd.PcdOccupySize\r
\r
self.PcdFixedOffsetSizeList = self.PcdUnknownOffsetList\r
return\r
None)\r
\r
# Overlapped \r
- if PcdNow.PcdBinOffset + PcdNow.PcdBinSize > PcdNext.PcdBinOffset :\r
+ if PcdNow.PcdBinOffset + PcdNow.PcdOccupySize > PcdNext.PcdBinOffset :\r
EdkLogger.error("BPDG", BuildToolError.ATTRIBUTE_GET_FAILURE,\r
"The offset of %s at line: %s is overlapped with %s at line: %s in file %s" % \\r
(PcdNow.PcdCName, PcdNow.Lineno, PcdNext.PcdCName, PcdNext.Lineno, PcdNext.FileName),\r
None)\r
\r
# Has free space, raise a warning message \r
- if PcdNow.PcdBinOffset + PcdNow.PcdBinSize < PcdNext.PcdBinOffset :\r
+ if PcdNow.PcdBinOffset + PcdNow.PcdOccupySize < PcdNext.PcdBinOffset :\r
EdkLogger.warn("BPDG", BuildToolError.ATTRIBUTE_GET_FAILURE,\r
"The offsets have free space of between %s at line: %s and %s at line: %s in file %s" % \\r
(PcdNow.PcdCName, PcdNow.Lineno, PcdNext.PcdCName, PcdNext.Lineno, PcdNext.FileName),\r
countOfUnfixedList = 0\r
while(countOfUnfixedList < lenOfUnfixedList) :\r
eachUnfixedPcd = self.PcdUnknownOffsetList[countOfUnfixedList]\r
- needFixPcdSize = eachUnfixedPcd.PcdBinSize\r
+ needFixPcdSize = eachUnfixedPcd.PcdOccupySize\r
# Not been fixed\r
if eachUnfixedPcd.PcdOffset == '*' :\r
# The offset un-fixed pcd can write into this free space\r
LastOffset += needFixPcdSize \r
else :\r
# It can not insert into those two pcds, need to check still has other space can store it.\r
- LastOffset = NowOffset + self.PcdFixedOffsetSizeList[FixOffsetSizeListCount].PcdBinSize\r
+ LastOffset = NowOffset + self.PcdFixedOffsetSizeList[FixOffsetSizeListCount].PcdOccupySize\r
FixOffsetSizeListCount += 1\r
break\r
\r
\r
# No free space, smoothly connect with previous pcd. \r
elif LastOffset == NowOffset :\r
- LastOffset = NowOffset + eachFixedPcd.PcdBinSize\r
+ LastOffset = NowOffset + eachFixedPcd.PcdOccupySize\r
FixOffsetSizeListCount += 1\r
# Usually it will not enter into this thunk, if so, means it overlapped. \r
else :\r
LastPcd = self.PcdFixedOffsetSizeList[lenOfList-1]\r
NeedFixPcd = self.PcdUnknownOffsetList[0]\r
\r
- NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdBinSize\r
+ NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdOccupySize\r
NeedFixPcd.PcdOffset = str(hex(NeedFixPcd.PcdBinOffset))\r
\r
# Insert this pcd into fixed offset pcd list's tail.\r