mirror of https://github.com/acidanthera/audk.git
BaseTools: Fix the bug to align VPD PCD based on value type
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 commit is contained in:
parent
e434be3c9c
commit
86737681af
|
@ -2,7 +2,7 @@
|
||||||
# This file include GenVpd class for fix the Vpd type PCD offset, and PcdEntry for describe
|
# This file include GenVpd class for fix the Vpd type PCD offset, and PcdEntry for describe
|
||||||
# and process each entry of vpd type PCD.
|
# and process each entry of vpd type PCD.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -35,7 +35,7 @@ _FORMAT_CHAR = {1: 'B',
|
||||||
#
|
#
|
||||||
class PcdEntry:
|
class PcdEntry:
|
||||||
def __init__(self, PcdCName, SkuId,PcdOffset, PcdSize, PcdValue, Lineno=None, FileName=None, PcdUnpackValue=None,
|
def __init__(self, PcdCName, SkuId,PcdOffset, PcdSize, PcdValue, Lineno=None, FileName=None, PcdUnpackValue=None,
|
||||||
PcdBinOffset=None, PcdBinSize=None):
|
PcdBinOffset=None, PcdBinSize=None, Alignment=None):
|
||||||
self.PcdCName = PcdCName.strip()
|
self.PcdCName = PcdCName.strip()
|
||||||
self.SkuId = SkuId.strip()
|
self.SkuId = SkuId.strip()
|
||||||
self.PcdOffset = PcdOffset.strip()
|
self.PcdOffset = PcdOffset.strip()
|
||||||
|
@ -46,6 +46,7 @@ class PcdEntry:
|
||||||
self.PcdUnpackValue = PcdUnpackValue
|
self.PcdUnpackValue = PcdUnpackValue
|
||||||
self.PcdBinOffset = PcdBinOffset
|
self.PcdBinOffset = PcdBinOffset
|
||||||
self.PcdBinSize = PcdBinSize
|
self.PcdBinSize = PcdBinSize
|
||||||
|
self.Alignment = Alignment
|
||||||
|
|
||||||
if self.PcdValue == '' :
|
if self.PcdValue == '' :
|
||||||
EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,
|
EdkLogger.error("BPDG", BuildToolError.FORMAT_INVALID,
|
||||||
|
@ -434,6 +435,7 @@ class GenVPD :
|
||||||
else:
|
else:
|
||||||
Alignment = 1
|
Alignment = 1
|
||||||
|
|
||||||
|
PCD.Alignment = Alignment
|
||||||
if PCD.PcdOffset != '*':
|
if PCD.PcdOffset != '*':
|
||||||
if PCD.PcdOccupySize % Alignment != 0:
|
if PCD.PcdOccupySize % Alignment != 0:
|
||||||
if PCD.PcdUnpackValue.startswith("{"):
|
if PCD.PcdUnpackValue.startswith("{"):
|
||||||
|
@ -444,6 +446,7 @@ class GenVPD :
|
||||||
if PCD.PcdOccupySize % Alignment != 0:
|
if PCD.PcdOccupySize % Alignment != 0:
|
||||||
PCD.PcdOccupySize = (PCD.PcdOccupySize / Alignment + 1) * Alignment
|
PCD.PcdOccupySize = (PCD.PcdOccupySize / Alignment + 1) * Alignment
|
||||||
|
|
||||||
|
PackSize = PCD.PcdOccupySize
|
||||||
if PCD._IsBoolean(PCD.PcdValue, PCD.PcdSize):
|
if PCD._IsBoolean(PCD.PcdValue, PCD.PcdSize):
|
||||||
PCD._PackBooleanValue(PCD.PcdValue)
|
PCD._PackBooleanValue(PCD.PcdValue)
|
||||||
self.FileLinesList[count] = PCD
|
self.FileLinesList[count] = PCD
|
||||||
|
@ -518,6 +521,8 @@ class GenVPD :
|
||||||
# The offset start from 0
|
# The offset start from 0
|
||||||
NowOffset = 0
|
NowOffset = 0
|
||||||
for Pcd in self.PcdUnknownOffsetList :
|
for Pcd in self.PcdUnknownOffsetList :
|
||||||
|
if NowOffset % Pcd.Alignment != 0:
|
||||||
|
NowOffset = (NowOffset/ Pcd.Alignment + 1) * Pcd.Alignment
|
||||||
Pcd.PcdBinOffset = NowOffset
|
Pcd.PcdBinOffset = NowOffset
|
||||||
Pcd.PcdOffset = str(hex(Pcd.PcdBinOffset))
|
Pcd.PcdOffset = str(hex(Pcd.PcdBinOffset))
|
||||||
NowOffset += Pcd.PcdOccupySize
|
NowOffset += Pcd.PcdOccupySize
|
||||||
|
@ -580,6 +585,8 @@ class GenVPD :
|
||||||
needFixPcdSize = eachUnfixedPcd.PcdOccupySize
|
needFixPcdSize = eachUnfixedPcd.PcdOccupySize
|
||||||
# Not been fixed
|
# Not been fixed
|
||||||
if eachUnfixedPcd.PcdOffset == '*' :
|
if eachUnfixedPcd.PcdOffset == '*' :
|
||||||
|
if LastOffset % eachUnfixedPcd.Alignment != 0:
|
||||||
|
LastOffset = (LastOffset / eachUnfixedPcd.Alignment + 1) * eachUnfixedPcd.Alignment
|
||||||
# The offset un-fixed pcd can write into this free space
|
# The offset un-fixed pcd can write into this free space
|
||||||
if needFixPcdSize <= (NowOffset - LastOffset) :
|
if needFixPcdSize <= (NowOffset - LastOffset) :
|
||||||
# Change the offset value of un-fixed pcd
|
# Change the offset value of un-fixed pcd
|
||||||
|
@ -632,6 +639,9 @@ class GenVPD :
|
||||||
NeedFixPcd = self.PcdUnknownOffsetList[0]
|
NeedFixPcd = self.PcdUnknownOffsetList[0]
|
||||||
|
|
||||||
NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdOccupySize
|
NeedFixPcd.PcdBinOffset = LastPcd.PcdBinOffset + LastPcd.PcdOccupySize
|
||||||
|
if NeedFixPcd.PcdBinOffset % NeedFixPcd.Alignment != 0:
|
||||||
|
NeedFixPcd.PcdBinOffset = (NeedFixPcd.PcdBinOffset / NeedFixPcd.Alignment + 1) * NeedFixPcd.Alignment
|
||||||
|
|
||||||
NeedFixPcd.PcdOffset = str(hex(NeedFixPcd.PcdBinOffset))
|
NeedFixPcd.PcdOffset = str(hex(NeedFixPcd.PcdBinOffset))
|
||||||
|
|
||||||
# Insert this pcd into fixed offset pcd list's tail.
|
# Insert this pcd into fixed offset pcd list's tail.
|
||||||
|
|
Loading…
Reference in New Issue