mirror of https://github.com/acidanthera/audk.git
BaseTool: GUID format PCD value assignment fail in Structure PCD field
If Structure PCD field is assigned as GUID format, its data type should be the fixed GUID structure. No flexible check is required. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
parent
0a57a9782b
commit
79820e32ec
|
@ -15,6 +15,7 @@ from Common.String import *
|
|||
from Common.DataType import *
|
||||
from Common.Misc import *
|
||||
from types import *
|
||||
from collections import OrderedDict
|
||||
|
||||
from Workspace.BuildClassObject import PackageBuildClassObject, StructurePcd, PcdClassObject
|
||||
|
||||
|
@ -367,7 +368,7 @@ class DecBuildData(PackageBuildClassObject):
|
|||
|
||||
|
||||
def ProcessStructurePcd(self, StructurePcdRawDataSet):
|
||||
s_pcd_set = dict()
|
||||
s_pcd_set = OrderedDict()
|
||||
for s_pcd,LineNo in StructurePcdRawDataSet:
|
||||
if s_pcd.TokenSpaceGuidCName not in s_pcd_set:
|
||||
s_pcd_set[s_pcd.TokenSpaceGuidCName] = []
|
||||
|
|
|
@ -39,6 +39,7 @@ import Common.GlobalData as GlobalData
|
|||
import subprocess
|
||||
from Common.Misc import SaveFileOnChange
|
||||
from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject
|
||||
from collections import OrderedDict
|
||||
|
||||
#
|
||||
# Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs
|
||||
|
@ -1284,7 +1285,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
|
||||
# handle pcd value override
|
||||
StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)
|
||||
S_pcd_set = {}
|
||||
S_pcd_set = OrderedDict()
|
||||
for str_pcd in StrPcdSet:
|
||||
str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)
|
||||
str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)
|
||||
|
@ -1562,61 +1563,23 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
Result = Result + '"'
|
||||
return Result
|
||||
|
||||
def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):
|
||||
OverrideValues = {DefaultStoreName:""}
|
||||
if Pcd.SkuOverrideValues:
|
||||
OverrideValues = Pcd.SkuOverrideValues[SkuName]
|
||||
for DefaultStoreName in OverrideValues.keys():
|
||||
CApp = CApp + 'void\n'
|
||||
CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
CApp = CApp + ' void\n'
|
||||
CApp = CApp + ' )\n'
|
||||
CApp = CApp + '{\n'
|
||||
CApp = CApp + ' UINT32 Size;\n'
|
||||
CApp = CApp + ' UINT32 FieldSize;\n'
|
||||
CApp = CApp + ' CHAR8 *Value;\n'
|
||||
CApp = CApp + ' UINT32 OriginalSize;\n'
|
||||
CApp = CApp + ' VOID *OriginalPcd;\n'
|
||||
CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)
|
||||
CApp = CApp + '\n'
|
||||
|
||||
if SkuName in Pcd.SkuInfoList:
|
||||
DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName,Pcd.SkuInfoList[SkuName].HiiDefaultValue) if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue
|
||||
else:
|
||||
DefaultValue = Pcd.DefaultValue
|
||||
PcdDefaultValue = StringToArray(DefaultValue.strip())
|
||||
|
||||
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)
|
||||
|
||||
#
|
||||
# Get current PCD value and size
|
||||
#
|
||||
CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
|
||||
#
|
||||
# Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
|
||||
# the correct value. For structures with a flexible array member, the flexible
|
||||
# array member is detected, and the size is based on the highest index used with
|
||||
# the flexible array member. The flexible array member must be the last field
|
||||
# in a structure. The size formula for this case is:
|
||||
# OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
|
||||
#
|
||||
CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType)
|
||||
CApp = CApp + "// Default Value in Dec \n"
|
||||
def GenerateSizeFunction(self,Pcd):
|
||||
CApp = "// Default Value in Dec \n"
|
||||
CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
for FieldList in [Pcd.DefaultValues]:
|
||||
if not FieldList:
|
||||
continue
|
||||
for FieldName in FieldList:
|
||||
FieldName = "." + FieldName
|
||||
IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])
|
||||
if IsArray:
|
||||
if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):
|
||||
try:
|
||||
Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)
|
||||
except BadExpression:
|
||||
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
|
||||
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))
|
||||
Value, ValueSize = ParseFieldValue(Value)
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
|
||||
else:
|
||||
NewFieldName = ''
|
||||
FieldName_ori = FieldName.strip('.')
|
||||
|
@ -1627,26 +1590,26 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
FieldName = NewFieldName + FieldName
|
||||
while '[' in FieldName:
|
||||
FieldName = FieldName.rsplit('[', 1)[0]
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
|
||||
for skuname in self.SkuIdMgr.GetSkuChain(SkuName):
|
||||
inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]
|
||||
storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]
|
||||
for defaultstorenameitem in storeset:
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
|
||||
for skuname in Pcd.SkuOverrideValues:
|
||||
if skuname == "COMMON":
|
||||
continue
|
||||
for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:
|
||||
CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)
|
||||
for FieldList in [inherit_OverrideValues.get(defaultstorenameitem)]:
|
||||
for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:
|
||||
if not FieldList:
|
||||
continue
|
||||
for FieldName in FieldList:
|
||||
FieldName = "." + FieldName
|
||||
IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])
|
||||
if IsArray:
|
||||
if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):
|
||||
try:
|
||||
Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)
|
||||
except BadExpression:
|
||||
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
|
||||
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))
|
||||
Value, ValueSize = ParseFieldValue(Value)
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
|
||||
else:
|
||||
NewFieldName = ''
|
||||
FieldName_ori = FieldName.strip('.')
|
||||
|
@ -1657,28 +1620,18 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
FieldName = NewFieldName + FieldName
|
||||
while '[' in FieldName:
|
||||
FieldName = FieldName.rsplit('[', 1)[0]
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
|
||||
if skuname == SkuName:
|
||||
break
|
||||
|
||||
#
|
||||
# Allocate and zero buffer for the PCD
|
||||
# Must handle cases where current value is smaller, larger, or same size
|
||||
# Always keep that larger one as the current size
|
||||
#
|
||||
CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
|
||||
CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)
|
||||
CApp = CApp + ' memset (Pcd, 0, Size);\n'
|
||||
|
||||
#
|
||||
# Copy current PCD value into allocated buffer.
|
||||
#
|
||||
CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
|
||||
|
||||
#
|
||||
# Assign field values in PCD
|
||||
#
|
||||
CApp = CApp + "// Default value in Dec \n"
|
||||
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
|
||||
CApp = CApp + "}\n"
|
||||
return CApp
|
||||
def GenerateSizeStatments(self,Pcd):
|
||||
CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)
|
||||
CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
return CApp
|
||||
def GenerateDefaultValueAssignFunction(self,Pcd):
|
||||
CApp = "// Default value in Dec \n"
|
||||
CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)
|
||||
CApp = CApp + ' UINT32 FieldSize;\n'
|
||||
CApp = CApp + ' CHAR8 *Value;\n'
|
||||
DefaultValueFromDec = Pcd.DefaultValueFromDec
|
||||
IsArray = self.IsFieldValueAnArray(Pcd.DefaultValueFromDec)
|
||||
if IsArray:
|
||||
|
@ -1720,13 +1673,129 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
#
|
||||
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
|
||||
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
|
||||
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
|
||||
else:
|
||||
if ValueSize > 4:
|
||||
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
else:
|
||||
CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % ('DEFAULT', 'STANDARD')
|
||||
inherit_OverrideValues = Pcd.SkuOverrideValues['DEFAULT']
|
||||
pcddefaultvalue = Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue
|
||||
for FieldList in [pcddefaultvalue,inherit_OverrideValues.get('STANDARD')]:
|
||||
if not FieldList:
|
||||
continue
|
||||
if pcddefaultvalue and FieldList == pcddefaultvalue:
|
||||
IsArray = self.IsFieldValueAnArray(FieldList)
|
||||
if IsArray:
|
||||
try:
|
||||
FieldList = ValueExpressionEx(FieldList, "VOID*")(True)
|
||||
except BadExpression:
|
||||
EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %
|
||||
(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))
|
||||
Value, ValueSize = ParseFieldValue (FieldList)
|
||||
if isinstance(Value, str):
|
||||
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)
|
||||
elif IsArray:
|
||||
#
|
||||
# Use memcpy() to copy value into field
|
||||
#
|
||||
CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)
|
||||
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
|
||||
continue
|
||||
for FieldName in FieldList:
|
||||
IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])
|
||||
if IsArray:
|
||||
try:
|
||||
FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)
|
||||
except BadExpression:
|
||||
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
|
||||
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))
|
||||
try:
|
||||
Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])
|
||||
except Exception:
|
||||
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))
|
||||
if isinstance(Value, str):
|
||||
CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
elif IsArray:
|
||||
#
|
||||
# Use memcpy() to copy value into field
|
||||
#
|
||||
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
|
||||
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
|
||||
else:
|
||||
if ValueSize > 4:
|
||||
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
else:
|
||||
CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
CApp = CApp + "}\n"
|
||||
return CApp
|
||||
def GenerateDefaultValueAssignStatement(self,Pcd):
|
||||
CApp = ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
return CApp
|
||||
def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):
|
||||
OverrideValues = {DefaultStoreName:""}
|
||||
if Pcd.SkuOverrideValues:
|
||||
OverrideValues = Pcd.SkuOverrideValues[SkuName]
|
||||
for DefaultStoreName in OverrideValues.keys():
|
||||
CApp = CApp + 'void\n'
|
||||
CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
CApp = CApp + ' void\n'
|
||||
CApp = CApp + ' )\n'
|
||||
CApp = CApp + '{\n'
|
||||
CApp = CApp + ' UINT32 Size;\n'
|
||||
CApp = CApp + ' UINT32 FieldSize;\n'
|
||||
CApp = CApp + ' CHAR8 *Value;\n'
|
||||
CApp = CApp + ' UINT32 OriginalSize;\n'
|
||||
CApp = CApp + ' VOID *OriginalPcd;\n'
|
||||
CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)
|
||||
CApp = CApp + '\n'
|
||||
|
||||
if SkuName in Pcd.SkuInfoList:
|
||||
DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName,Pcd.SkuInfoList[SkuName].HiiDefaultValue) if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue
|
||||
else:
|
||||
DefaultValue = Pcd.DefaultValue
|
||||
PcdDefaultValue = StringToArray(DefaultValue.strip())
|
||||
|
||||
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)
|
||||
|
||||
#
|
||||
# Get current PCD value and size
|
||||
#
|
||||
CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
|
||||
|
||||
#
|
||||
# Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
|
||||
# the correct value. For structures with a flexible array member, the flexible
|
||||
# array member is detected, and the size is based on the highest index used with
|
||||
# the flexible array member. The flexible array member must be the last field
|
||||
# in a structure. The size formula for this case is:
|
||||
# OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
|
||||
#
|
||||
CApp = CApp + self.GenerateSizeStatments(Pcd)
|
||||
|
||||
#
|
||||
# Allocate and zero buffer for the PCD
|
||||
# Must handle cases where current value is smaller, larger, or same size
|
||||
# Always keep that larger one as the current size
|
||||
#
|
||||
CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
|
||||
CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)
|
||||
CApp = CApp + ' memset (Pcd, 0, Size);\n'
|
||||
|
||||
#
|
||||
# Copy current PCD value into allocated buffer.
|
||||
#
|
||||
CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
|
||||
|
||||
#
|
||||
# Assign field values in PCD
|
||||
#
|
||||
CApp = CApp + self.GenerateDefaultValueAssignStatement(Pcd)
|
||||
for skuname in self.SkuIdMgr.GetSkuChain(SkuName):
|
||||
if skuname == "DEFAULT":
|
||||
continue
|
||||
inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]
|
||||
storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]
|
||||
for defaultstorenameitem in storeset:
|
||||
|
@ -1773,7 +1842,7 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
#
|
||||
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
|
||||
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
|
||||
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
|
||||
else:
|
||||
if ValueSize > 4:
|
||||
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
|
||||
|
@ -1814,6 +1883,8 @@ class DscBuildData(PlatformBuildClassObject):
|
|||
CApp = CApp + '\n'
|
||||
for PcdName in StructuredPcds:
|
||||
Pcd = StructuredPcds[PcdName]
|
||||
CApp = CApp + self.GenerateSizeFunction(Pcd)
|
||||
CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)
|
||||
if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:
|
||||
InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)
|
||||
|
|
Loading…
Reference in New Issue