BaseTools: Support Structure PCD value inherit between the different SKUs

https://bugzilla.tianocore.org/show_bug.cgi?id=543
Structure PCD field value can inherit between the different SKUIds.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Feng Bob C <bob.c.feng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Liming Gao
2017-12-22 20:46:15 +08:00
parent 34952f493c
commit 8518bf0b92
13 changed files with 536 additions and 283 deletions

View File

@ -44,7 +44,7 @@ from Common.MultipleWorkspace import MultipleWorkspace as mws
import InfSectionParser import InfSectionParser
import datetime import datetime
import hashlib import hashlib
from GenVar import Variable,var_info from GenVar import VariableMgr,var_info
## Regular expression for splitting Dependency Expression string into tokens ## Regular expression for splitting Dependency Expression string into tokens
gDepexTokenPattern = re.compile("(\(|\)|\w+| \S+\.inf)") gDepexTokenPattern = re.compile("(\(|\)|\w+| \S+\.inf)")
@ -1225,6 +1225,7 @@ class PlatformAutoGen(AutoGen):
self.AllPcdList = [] self.AllPcdList = []
# get the original module/package/platform objects # get the original module/package/platform objects
self.BuildDatabase = Workspace.BuildDatabase self.BuildDatabase = Workspace.BuildDatabase
self.DscBuildDataObj = Workspace.Platform
# flag indicating if the makefile/C-code file has been created or not # flag indicating if the makefile/C-code file has been created or not
self.IsMakeFileCreated = False self.IsMakeFileCreated = False
@ -1354,23 +1355,21 @@ class PlatformAutoGen(AutoGen):
LibAuto.ConstPcd[key] = Pcd.DefaultValue LibAuto.ConstPcd[key] = Pcd.DefaultValue
def CollectVariables(self, DynamicPcdSet): def CollectVariables(self, DynamicPcdSet):
VariableInfo = Variable() VariableInfo = VariableMgr(self.DscBuildDataObj._GetDefaultStores(),self.DscBuildDataObj._GetSkuIds())
Index = 0 Index = 0
for Pcd in DynamicPcdSet: for Pcd in DynamicPcdSet:
if not hasattr(Pcd,"DefaultStoreName"): pcdname = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))
Pcd.DefaultStoreName = ['0'] for SkuName in Pcd.SkuInfoList:
for StorageName in Pcd.DefaultStoreName: Sku = Pcd.SkuInfoList[SkuName]
pcdname = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName)) SkuId = Sku.SkuId
for SkuName in Pcd.SkuInfoList: if SkuId == None or SkuId == '':
Sku = Pcd.SkuInfoList[SkuName] continue
SkuId = Sku.SkuId if len(Sku.VariableName) > 0:
if SkuId == None or SkuId == '': VariableGuidStructure = Sku.VariableGuidValue
continue VariableGuid = GuidStructureStringToGuidString(VariableGuidStructure)
if len(Sku.VariableName) > 0: if Pcd.Phase == "DXE":
VariableGuidStructure = Sku.VariableGuidValue for StorageName in Sku.DefaultStoreDict:
VariableGuid = GuidStructureStringToGuidString(VariableGuidStructure) VariableInfo.append_variable(var_info(Index,pcdname,StorageName,SkuName, StringToArray(Sku.VariableName),VariableGuid, Sku.VariableAttribute , Pcd.DefaultValue,Sku.DefaultStoreDict[StorageName],Pcd.DatumType))
if Pcd.Phase == "DXE":
VariableInfo.append_variable(var_info(Index,pcdname,StorageName,SkuId, StringToArray(Sku.VariableName),VariableGuid, Sku.VariableAttribute , Pcd.DefaultValue,Sku.HiiDefaultValue,Pcd.DatumType))
Index += 1 Index += 1
return VariableInfo return VariableInfo
## Collect dynamic PCDs ## Collect dynamic PCDs
@ -2383,7 +2382,7 @@ class PlatformAutoGen(AutoGen):
else: else:
SkuName = 'DEFAULT' SkuName = 'DEFAULT'
ToPcd.SkuInfoList = { ToPcd.SkuInfoList = {
SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName], '', '', '', '', '', ToPcd.DefaultValue) SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName][0], '', '', '', '', '', ToPcd.DefaultValue)
} }
## Apply PCD setting defined platform to a module ## Apply PCD setting defined platform to a module

View File

@ -1677,6 +1677,9 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList: if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList:
TokenSpaceList += [Pcd.TokenSpaceGuidCName] TokenSpaceList += [Pcd.TokenSpaceGuidCName]
SkuMgr = Info.Workspace.Platform.SkuIdMgr
AutoGenH.Append("\n// Definition of SkuId Array\n")
AutoGenH.Append("extern UINT64 _gPcd_SkuId_Array[];\n")
# Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found
if TokenSpaceList <> []: if TokenSpaceList <> []:
AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n") AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n")
@ -1694,6 +1697,8 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd) CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd)
DynExPcdTokenNumberMapping (Info, AutoGenH) DynExPcdTokenNumberMapping (Info, AutoGenH)
else: else:
AutoGenC.Append("\n// Definition of SkuId Array\n")
AutoGenC.Append("GLOBAL_REMOVE_IF_UNREFERENCED UINT64 _gPcd_SkuId_Array[] = %s;\n" % SkuMgr.DumpSkuIdArrary())
if Info.ModulePcdList: if Info.ModulePcdList:
AutoGenH.Append("\n// Definition of PCDs used in this module\n") AutoGenH.Append("\n// Definition of PCDs used in this module\n")
AutoGenC.Append("\n// Definition of PCDs used in this module\n") AutoGenC.Append("\n// Definition of PCDs used in this module\n")

View File

@ -1057,7 +1057,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
SkuObj = SkuClass(Platform.Platform.AvilableSkuIds, Platform.Platform.SkuIds) SkuObj = SkuClass(Platform.Platform.AvilableSkuIds, Platform.Platform.SkuIds)
Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId] Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId][0]
Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag

View File

@ -46,9 +46,11 @@ def PackGUID(Guid):
) )
return GuidBuffer return GuidBuffer
class Variable(object): class VariableMgr(object):
def __init__(self,): def __init__(self, DefaultStoreMap,SkuIdMap):
self.VarInfo = [] self.VarInfo = []
self.DefaultStoreMap = DefaultStoreMap
self.SkuIdMap = SkuIdMap
def append_variable(self,uefi_var): def append_variable(self,uefi_var):
self.VarInfo.append(uefi_var) self.VarInfo.append(uefi_var)
@ -61,7 +63,7 @@ class Variable(object):
for item in self.VarInfo: for item in self.VarInfo:
if item.pcdindex not in indexedvarinfo: if item.pcdindex not in indexedvarinfo:
indexedvarinfo[item.pcdindex] = dict() indexedvarinfo[item.pcdindex] = dict()
indexedvarinfo[item.pcdindex][(int(item.skuname),int(item.defaultstoragename))] = item indexedvarinfo[item.pcdindex][(item.skuname,item.defaultstoragename)] = item
for index in indexedvarinfo: for index in indexedvarinfo:
sku_var_info = indexedvarinfo[index] sku_var_info = indexedvarinfo[index]
@ -69,7 +71,7 @@ class Variable(object):
default_data_buffer = "" default_data_buffer = ""
others_data_buffer = "" others_data_buffer = ""
tail = None tail = None
default_sku_default = indexedvarinfo.get(index).get((0,0)) default_sku_default = indexedvarinfo.get(index).get(("DEFAULT","STANDARD"))
if default_sku_default.data_type not in ["UINT8","UINT16","UINT32","UINT64","BOOLEAN"]: if default_sku_default.data_type not in ["UINT8","UINT16","UINT32","UINT64","BOOLEAN"]:
var_max_len = max([len(var_item.default_value.split(",")) for var_item in sku_var_info.values()]) var_max_len = max([len(var_item.default_value.split(",")) for var_item in sku_var_info.values()])
@ -82,13 +84,13 @@ class Variable(object):
for item in default_data_buffer: for item in default_data_buffer:
default_data_array += unpack("B",item) default_data_array += unpack("B",item)
if (0,0) not in var_data: if ("DEFAULT","STANDARD") not in var_data:
var_data[(0,0)] = collections.OrderedDict() var_data[("DEFAULT","STANDARD")] = collections.OrderedDict()
var_data[(0,0)][index] = (default_data_buffer,sku_var_info[(0,0)]) var_data[("DEFAULT","STANDARD")][index] = (default_data_buffer,sku_var_info[("DEFAULT","STANDARD")])
for (skuid,defaultstoragename) in indexedvarinfo.get(index): for (skuid,defaultstoragename) in indexedvarinfo.get(index):
tail = None tail = None
if (skuid,defaultstoragename) == (0,0): if (skuid,defaultstoragename) == ("DEFAULT","STANDARD"):
continue continue
other_sku_other = indexedvarinfo.get(index).get((skuid,defaultstoragename)) other_sku_other = indexedvarinfo.get(index).get((skuid,defaultstoragename))
@ -113,7 +115,7 @@ class Variable(object):
var_data = self.process_variable_data() var_data = self.process_variable_data()
pcds_default_data = var_data.get((0,0)) pcds_default_data = var_data.get(("DEFAULT","STANDARD"))
NvStoreDataBuffer = "" NvStoreDataBuffer = ""
var_data_offset = collections.OrderedDict() var_data_offset = collections.OrderedDict()
offset = NvStorageHeaderSize offset = NvStorageHeaderSize
@ -127,11 +129,6 @@ class Variable(object):
else: else:
var_attr_value = 0x07 var_attr_value = 0x07
print "default var_name_buffer"
print self.format_data(var_name_buffer)
print "default var_buffer"
print self.format_data(default_data)
DataBuffer = self.AlignData(var_name_buffer + default_data) DataBuffer = self.AlignData(var_name_buffer + default_data)
data_size = len(DataBuffer) data_size = len(DataBuffer)
@ -139,20 +136,18 @@ class Variable(object):
var_data_offset[default_info.pcdindex] = offset var_data_offset[default_info.pcdindex] = offset
offset += data_size - len(default_info.var_name.split(",")) offset += data_size - len(default_info.var_name.split(","))
var_header_buffer = self.PACK_VARIABLE_HEADER(var_attr_value, len(default_info.var_name.split(",")), data_size, vendorguid) var_header_buffer = self.PACK_VARIABLE_HEADER(var_attr_value, len(default_info.var_name.split(",")), len (default_data), vendorguid)
NvStoreDataBuffer += (var_header_buffer + DataBuffer) NvStoreDataBuffer += (var_header_buffer + DataBuffer)
variable_storage_header_buffer = self.PACK_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28) variable_storage_header_buffer = self.PACK_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28)
nv_default_part = self.AlignData(self.PACK_DEFAULT_DATA(0, 0, self.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer))) nv_default_part = self.AlignData(self.PACK_DEFAULT_DATA(0, 0, self.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer)))
print "default whole data \n",self.format_data(nv_default_part)
data_delta_structure_buffer = "" data_delta_structure_buffer = ""
for skuid,defaultid in var_data: for skuname,defaultstore in var_data:
if (skuid,defaultid) == (0,0): if (skuname,defaultstore) == ("DEFAULT","STANDARD"):
continue continue
pcds_sku_data = var_data.get((skuid,defaultid)) pcds_sku_data = var_data.get((skuname,defaultstore))
delta_data_set = [] delta_data_set = []
for pcdindex in pcds_sku_data: for pcdindex in pcds_sku_data:
offset = var_data_offset[pcdindex] offset = var_data_offset[pcdindex]
@ -160,10 +155,7 @@ class Variable(object):
delta_data = [(item[0] + offset, item[1]) for item in delta_data] delta_data = [(item[0] + offset, item[1]) for item in delta_data]
delta_data_set.extend(delta_data) delta_data_set.extend(delta_data)
data_delta_structure_buffer += self.AlignData(self.PACK_DELTA_DATA(defaultid,skuid,delta_data_set)) data_delta_structure_buffer += self.AlignData(self.PACK_DELTA_DATA(skuname,defaultstore,delta_data_set))
print "delta data"
print delta_data_set
print self.format_data(self.AlignData(self.PACK_DELTA_DATA(defaultid,skuid,delta_data_set)))
return self.format_data(nv_default_part + data_delta_structure_buffer) return self.format_data(nv_default_part + data_delta_structure_buffer)
@ -179,8 +171,6 @@ class Variable(object):
return final_data return final_data
def calculate_delta(self, default, theother): def calculate_delta(self, default, theother):
print "default data \n", default
print "other data \n",theother
if len(default) - len(theother) != 0: if len(default) - len(theother) != 0:
EdkLogger.error("build", FORMAT_INVALID, 'The variable data length is not the same for the same PCD.') EdkLogger.error("build", FORMAT_INVALID, 'The variable data length is not the same for the same PCD.')
data_delta = [] data_delta = []
@ -258,7 +248,7 @@ class Variable(object):
def PACK_DEFAULT_DATA(self, defaultstoragename,skuid,var_value): def PACK_DEFAULT_DATA(self, defaultstoragename,skuid,var_value):
Buffer = "" Buffer = ""
Buffer += pack("=H",6) Buffer += pack("=L",8)
Buffer += pack("=H",int(defaultstoragename)) Buffer += pack("=H",int(defaultstoragename))
Buffer += pack("=H",int(skuid)) Buffer += pack("=H",int(skuid))
@ -269,11 +259,21 @@ class Variable(object):
return Buffer return Buffer
def PACK_DELTA_DATA(self,defaultstoragename,skuid,delta_list): def GetSkuId(self,skuname):
if skuname not in self.SkuIdMap:
return None
return self.SkuIdMap.get(skuname)[0]
def GetDefaultStoreId(self,dname):
if dname not in self.DefaultStoreMap:
return None
return self.DefaultStoreMap.get(dname)[0]
def PACK_DELTA_DATA(self,skuname,defaultstoragename,delta_list):
skuid = self.GetSkuId(skuname)
defaultstorageid = self.GetDefaultStoreId(defaultstoragename)
Buffer = "" Buffer = ""
Buffer += pack("=H",6) Buffer += pack("=L",8)
Buffer += pack("=H",int(defaultstoragename))
Buffer += pack("=H",int(skuid)) Buffer += pack("=H",int(skuid))
Buffer += pack("=H",int(defaultstorageid))
for (delta_offset,value) in delta_list: for (delta_offset,value) in delta_list:
Buffer += pack("=L",delta_offset) Buffer += pack("=L",delta_offset)
Buffer = Buffer[:-1] + pack("=B",value) Buffer = Buffer[:-1] + pack("=B",value)
@ -294,4 +294,4 @@ class Variable(object):
for name_char in var_name.strip("{").strip("}").split(","): for name_char in var_name.strip("{").strip("}").split(","):
Buffer += pack("=B",int(name_char,16)) Buffer += pack("=B",int(name_char,16))
return Buffer return Buffer

View File

@ -86,7 +86,8 @@ MIGRATION_ERROR = 0xF010
PCD_VALIDATION_INFO_ERROR = 0xF011 PCD_VALIDATION_INFO_ERROR = 0xF011
PCD_VARIABLE_ATTRIBUTES_ERROR = 0xF012 PCD_VARIABLE_ATTRIBUTES_ERROR = 0xF012
PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR = 0xF013 PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR = 0xF013
PCD_STRUCTURE_PCD_ERROR = 0xF014 PCD_STRUCTURE_PCD_INVALID_FIELD_ERROR = 0xF014
PCD_STRUCTURE_PCD_ERROR = 0xF015
ABORT_ERROR = 0xFFFE ABORT_ERROR = 0xFFFE
UNKNOWN_ERROR = 0xFFFF UNKNOWN_ERROR = 0xFFFF

View File

@ -283,6 +283,8 @@ TAB_DEPEX_EBC = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_EBC
TAB_DEPEX_AARCH64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_DEPEX_AARCH64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_AARCH64
TAB_SKUIDS = 'SkuIds' TAB_SKUIDS = 'SkuIds'
TAB_DEFAULT_STORES = 'DefaultStores'
TAB_DEFAULT_STORES_DEFAULT = 'STANDARD'
TAB_LIBRARIES = 'Libraries' TAB_LIBRARIES = 'Libraries'
TAB_LIBRARIES_COMMON = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_COMMON TAB_LIBRARIES_COMMON = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_COMMON

View File

@ -2093,30 +2093,55 @@ class PeImageClass():
Value = (Value << 8) | int(ByteList[index]) Value = (Value << 8) | int(ByteList[index])
return Value return Value
class DefaultStore():
def __init__(self,DefaultStores ):
self.DefaultStores = DefaultStores
def DefaultStoreID(self,DefaultStoreName):
for key,value in self.DefaultStores.items():
if value == DefaultStoreName:
return key
return None
def GetDefaultDefault(self):
if not self.DefaultStores or "0" in self.DefaultStores:
return "0",TAB_DEFAULT_STORES_DEFAULT
else:
minvalue = min([int(value_str) for value_str in self.DefaultStores.keys()])
return (str(minvalue), self.DefaultStores[str(minvalue)])
def GetMin(self,DefaultSIdList):
if not DefaultSIdList:
return "STANDARD"
minid = min({storeid for storeid, storename in self.DefaultStores.values() if storename in DefaultSIdList} )
for sid,name in self.DefaultStores.values():
if sid == minid:
return name
class SkuClass(): class SkuClass():
DEFAULT = 0 DEFAULT = 0
SINGLE = 1 SINGLE = 1
MULTIPLE =2 MULTIPLE =2
def __init__(self,SkuIdentifier='', SkuIds={}): def __init__(self,SkuIdentifier='', SkuIds=None):
if SkuIds is None:
SkuIds = {}
self.AvailableSkuIds = sdict() self.AvailableSkuIds = sdict()
self.SkuIdSet = [] self.SkuIdSet = []
self.SkuIdNumberSet = [] self.SkuIdNumberSet = []
self.SkuData = SkuIds
self.__SkuInherit = {}
if SkuIdentifier == '' or SkuIdentifier is None: if SkuIdentifier == '' or SkuIdentifier is None:
self.SkuIdSet = ['DEFAULT'] self.SkuIdSet = ['DEFAULT']
self.SkuIdNumberSet = ['0U'] self.SkuIdNumberSet = ['0U']
elif SkuIdentifier == 'ALL': elif SkuIdentifier == 'ALL':
self.SkuIdSet = SkuIds.keys() self.SkuIdSet = SkuIds.keys()
self.SkuIdNumberSet = [num.strip() + 'U' for num in SkuIds.values()] self.SkuIdNumberSet = [num[0].strip() + 'U' for num in SkuIds.values()]
else: else:
r = SkuIdentifier.split('|') r = SkuIdentifier.split('|')
self.SkuIdSet=[r[k].strip() for k in range(len(r))] self.SkuIdSet=[(r[k].strip()).upper() for k in range(len(r))]
k = None k = None
try: try:
self.SkuIdNumberSet = [SkuIds[k].strip() + 'U' for k in self.SkuIdSet] self.SkuIdNumberSet = [SkuIds[k][0].strip() + 'U' for k in self.SkuIdSet]
except Exception: except Exception:
EdkLogger.error("build", PARAMETER_INVALID, EdkLogger.error("build", PARAMETER_INVALID,
ExtraData = "SKU-ID [%s] is not supported by the platform. [Valid SKU-ID: %s]" ExtraData = "SKU-ID [%s] is not supported by the platform. [Valid SKU-ID: %s]"
@ -2126,11 +2151,19 @@ class SkuClass():
self.SkuIdNumberSet.remove('0U') self.SkuIdNumberSet.remove('0U')
for each in self.SkuIdSet: for each in self.SkuIdSet:
if each in SkuIds: if each in SkuIds:
self.AvailableSkuIds[each] = SkuIds[each] self.AvailableSkuIds[each] = SkuIds[each][0]
else: else:
EdkLogger.error("build", PARAMETER_INVALID, EdkLogger.error("build", PARAMETER_INVALID,
ExtraData="SKU-ID [%s] is not supported by the platform. [Valid SKU-ID: %s]" ExtraData="SKU-ID [%s] is not supported by the platform. [Valid SKU-ID: %s]"
% (each, " | ".join(SkuIds.keys()))) % (each, " | ".join(SkuIds.keys())))
if self.SkuUsageType != self.SINGLE:
self.AvailableSkuIds.update({'DEFAULT':0, 'COMMON':0})
def GetNextSkuId(self, skuname):
if not self.__SkuInherit:
self.__SkuInherit = {}
for item in self.SkuData.values():
self.__SkuInherit[item[1]]=item[2] if item[2] else "DEFAULT"
return self.__SkuInherit.get(skuname,"DEFAULT")
def __SkuUsageType(self): def __SkuUsageType(self):
@ -2141,7 +2174,21 @@ class SkuClass():
return SkuClass.SINGLE return SkuClass.SINGLE
else: else:
return SkuClass.MULTIPLE return SkuClass.MULTIPLE
def DumpSkuIdArrary(self):
ArrayStrList = []
if self.SkuUsageType == SkuClass.SINGLE:
ArrayStr = "{0x0}"
else:
for skuname in self.AvailableSkuIds:
if skuname == "COMMON":
continue
while skuname != "DEFAULT":
ArrayStrList.append(hex(int(self.AvailableSkuIds[skuname])))
skuname = self.GetNextSkuId(skuname)
ArrayStrList.append("0x0")
ArrayStr = "{" + ",".join(ArrayStrList) + "}"
return ArrayStr
def __GetAvailableSkuIds(self): def __GetAvailableSkuIds(self):
return self.AvailableSkuIds return self.AvailableSkuIds

View File

@ -270,19 +270,22 @@ class PpiClass(GuidProtocolPpiCommonClass):
# #
class SkuInfoClass(object): class SkuInfoClass(object):
def __init__(self, SkuIdName = '', SkuId = '', VariableName = '', VariableGuid = '', VariableOffset = '', def __init__(self, SkuIdName = '', SkuId = '', VariableName = '', VariableGuid = '', VariableOffset = '',
HiiDefaultValue = '', VpdOffset = '', DefaultValue = '', VariableGuidValue = '', VariableAttribute = ''): HiiDefaultValue = '', VpdOffset = '', DefaultValue = '', VariableGuidValue = '', VariableAttribute = '', DefaultStore = None):
self.SkuIdName = SkuIdName self.SkuIdName = SkuIdName
self.SkuId = SkuId self.SkuId = SkuId
# #
# Used by Hii # Used by Hii
# #
if DefaultStore is None:
DefaultStore = {}
self.VariableName = VariableName self.VariableName = VariableName
self.VariableGuid = VariableGuid self.VariableGuid = VariableGuid
self.VariableGuidValue = VariableGuidValue self.VariableGuidValue = VariableGuidValue
self.VariableOffset = VariableOffset self.VariableOffset = VariableOffset
self.HiiDefaultValue = HiiDefaultValue self.HiiDefaultValue = HiiDefaultValue
self.VariableAttribute = VariableAttribute self.VariableAttribute = VariableAttribute
self.DefaultStoreDict = DefaultStore
# #
# Used by Vpd # Used by Vpd

View File

@ -64,6 +64,7 @@ MODEL_EFI_BINARY_FILE = 3008
MODEL_EFI_SKU_ID = 3009 MODEL_EFI_SKU_ID = 3009
MODEL_EFI_INCLUDE = 3010 MODEL_EFI_INCLUDE = 3010
MODEL_EFI_DEPEX = 3011 MODEL_EFI_DEPEX = 3011
MODEL_EFI_DEFAULT_STORES = 3012
MODEL_PCD = 4000 MODEL_PCD = 4000
MODEL_PCD_FIXED_AT_BUILD = 4001 MODEL_PCD_FIXED_AT_BUILD = 4001

View File

@ -16,6 +16,7 @@ import Common.LongFilePathOs as os
from Common.Misc import sdict from Common.Misc import sdict
from Common.Misc import RealPath2 from Common.Misc import RealPath2
from Common.BuildToolError import * from Common.BuildToolError import *
from Common.DataType import *
import collections import collections
## PcdClassObject ## PcdClassObject
@ -108,11 +109,11 @@ class PcdClassObject(object):
return hash((self.TokenCName, self.TokenSpaceGuidCName)) return hash((self.TokenCName, self.TokenSpaceGuidCName))
class StructurePcd(PcdClassObject): class StructurePcd(PcdClassObject):
def __init__(self, StructuredPcdIncludeFile="", Packages=None, Name=None, Guid=None, Type=None, DatumType=None, Value=None, Token=None, MaxDatumSize=None, SkuInfoList={}, IsOverrided=False, GuidValue=None, validateranges=[], validlists=[], expressions=[]): def __init__(self, StructuredPcdIncludeFile="", Packages=None, Name=None, Guid=None, Type=None, DatumType=None, Value=None, Token=None, MaxDatumSize=None, SkuInfoList={}, IsOverrided=False, GuidValue=None, validateranges=[], validlists=[], expressions=[],default_store = TAB_DEFAULT_STORES_DEFAULT):
super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions) super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)
self.StructuredPcdIncludeFile = StructuredPcdIncludeFile self.StructuredPcdIncludeFile = StructuredPcdIncludeFile
self.PackageDecs = Packages self.PackageDecs = Packages
self.DefaultStoreName = ['STANDARD'] self.DefaultStoreName = [default_store]
self.DefaultValues = collections.OrderedDict({}) self.DefaultValues = collections.OrderedDict({})
self.PcdMode = None self.PcdMode = None
self.SkuOverrideValues = collections.OrderedDict({}) self.SkuOverrideValues = collections.OrderedDict({})
@ -127,13 +128,15 @@ class StructurePcd(PcdClassObject):
self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo] self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo]
return self.DefaultValues[FieldName] return self.DefaultValues[FieldName]
def AddOverrideValue (self, FieldName, Value, SkuName, FileName="", LineNo=0): def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0):
if SkuName not in self.SkuOverrideValues: if SkuName not in self.SkuOverrideValues:
self.SkuOverrideValues[SkuName] = collections.OrderedDict({}) self.SkuOverrideValues[SkuName] = collections.OrderedDict({})
if FieldName in self.SkuOverrideValues[SkuName]: if DefaultStoreName not in self.SkuOverrideValues[SkuName]:
del self.SkuOverrideValues[SkuName][FieldName] self.SkuOverrideValues[SkuName][DefaultStoreName] = collections.OrderedDict({})
self.SkuOverrideValues[SkuName][FieldName] = [Value.strip(), FileName, LineNo] if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]:
return self.SkuOverrideValues[SkuName][FieldName] del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]
self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo]
return self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]
def SetPcdMode (self, PcdMode): def SetPcdMode (self, PcdMode):
self.PcdMode = PcdMode self.PcdMode = PcdMode

View File

@ -158,6 +158,9 @@ class DscBuildData(PlatformBuildClassObject):
self.OutputPath = os.path.join(os.getenv("WORKSPACE"), 'Build', PcdValueInitName) self.OutputPath = os.path.join(os.getenv("WORKSPACE"), 'Build', PcdValueInitName)
else: else:
self.OutputPath = os.path.dirname(self.DscFile) self.OutputPath = os.path.dirname(self.DscFile)
self.DefaultStores = None
self.SkuIdMgr = SkuClass(self.SkuIdentifier, self.SkuIds)
arraystr = self.SkuIdMgr.DumpSkuIdArrary()
## XXX[key] = value ## XXX[key] = value
def __setitem__(self, key, value): def __setitem__(self, key, value):
@ -206,6 +209,7 @@ class DscBuildData(PlatformBuildClassObject):
self._ISOLanguages = None self._ISOLanguages = None
self._VpdToolGuid = None self._VpdToolGuid = None
self.__Macros = None self.__Macros = None
self.DefaultStores = None
## handle Override Path of Module ## handle Override Path of Module
@ -214,8 +218,8 @@ class DscBuildData(PlatformBuildClassObject):
Macros = self._Macros Macros = self._Macros
Macros["EDK_SOURCE"] = GlobalData.gEcpSource Macros["EDK_SOURCE"] = GlobalData.gEcpSource
for Record in RecordList: for Record in RecordList:
ModuleId = Record[5] ModuleId = Record[6]
LineNo = Record[6] LineNo = Record[7]
ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch) ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch)
RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId] RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId]
if RecordList != []: if RecordList != []:
@ -587,12 +591,36 @@ class DscBuildData(PlatformBuildClassObject):
if Record[1] in [None, '']: if Record[1] in [None, '']:
EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name', EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',
File=self.MetaFile, Line=Record[-1]) File=self.MetaFile, Line=Record[-1])
self._SkuIds[Record[1]] = Record[0] Pattern = re.compile('^[1-9]\d*|0$')
if Pattern.match(Record[0]) == None:
EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. The correct format is '{(0-9)} {(1-9)(0-9)+}'",
File=self.MetaFile, Line=Record[-1])
if not IsValidWord(Record[1]):
EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",
File=self.MetaFile, Line=Record[-1])
self._SkuIds[Record[1]] = (Record[0],Record[1],Record[2])
if 'DEFAULT' not in self._SkuIds: if 'DEFAULT' not in self._SkuIds:
self._SkuIds['DEFAULT'] = '0' self._SkuIds['DEFAULT'] = ("0","DEFAULT","DEFAULT")
if 'COMMON' not in self._SkuIds: if 'COMMON' not in self._SkuIds:
self._SkuIds['COMMON'] = '0' self._SkuIds['COMMON'] = ("0","DEFAULT","DEFAULT")
return self._SkuIds return self._SkuIds
def ToInt(self,intstr):
return int(intstr,16) if intstr.upper().startswith("0X") else int(intstr)
def _GetDefaultStores(self):
if self.DefaultStores == None:
self.DefaultStores = sdict()
RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]
for Record in RecordList:
if Record[0] in [None, '']:
EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',
File=self.MetaFile, Line=Record[-1])
if Record[1] in [None, '']:
EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',
File=self.MetaFile, Line=Record[-1])
self.DefaultStores[Record[1]] = (self.ToInt(Record[0]),Record[1])
if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,TAB_DEFAULT_STORES_DEFAULT)
return self.DefaultStores
## Retrieve [Components] section information ## Retrieve [Components] section information
def _GetModules(self): def _GetModules(self):
@ -607,8 +635,8 @@ class DscBuildData(PlatformBuildClassObject):
DuplicatedFile = False DuplicatedFile = False
ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch) ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)
ModuleId = Record[5] ModuleId = Record[6]
LineNo = Record[6] LineNo = Record[7]
# check the file validation # check the file validation
ErrorCode, ErrorInfo = ModuleFile.Validate('.inf') ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')
@ -648,7 +676,7 @@ class DscBuildData(PlatformBuildClassObject):
for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \ for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \
MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]: MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:
RecordList = self._RawData[Type, self._Arch, None, ModuleId] RecordList = self._RawData[Type, self._Arch, None, ModuleId]
for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:
TokenList = GetSplitValueList(Setting) TokenList = GetSplitValueList(Setting)
DefaultValue = TokenList[0] DefaultValue = TokenList[0]
if len(TokenList) > 1: if len(TokenList) > 1:
@ -672,7 +700,7 @@ class DscBuildData(PlatformBuildClassObject):
# get module private build options # get module private build options
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId] RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]
for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:
if (ToolChainFamily, ToolChain) not in Module.BuildOptions: if (ToolChainFamily, ToolChain) not in Module.BuildOptions:
Module.BuildOptions[ToolChainFamily, ToolChain] = Option Module.BuildOptions[ToolChainFamily, ToolChain] = Option
else: else:
@ -712,7 +740,7 @@ class DscBuildData(PlatformBuildClassObject):
RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1] RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]
Macros = self._Macros Macros = self._Macros
for Record in RecordList: for Record in RecordList:
LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy, LineNo = Record LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy,Dummy, LineNo = Record
if LibraryClass == '' or LibraryClass == 'NULL': if LibraryClass == '' or LibraryClass == 'NULL':
self._NullLibraryNumber += 1 self._NullLibraryNumber += 1
LibraryClass = 'NULL%d' % self._NullLibraryNumber LibraryClass = 'NULL%d' % self._NullLibraryNumber
@ -821,6 +849,18 @@ class DscBuildData(PlatformBuildClassObject):
ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName)) ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))
return ValueList return ValueList
def _FilterPcdBySkuUsage(self,Pcds):
available_sku = self.SkuIdMgr.AvailableSkuIdSet
sku_usage = self.SkuIdMgr.SkuUsageType
if sku_usage == SkuClass.SINGLE:
for pcdname in Pcds:
pcd = Pcds[pcdname]
Pcds[pcdname].SkuInfoList = {"DEFAULT":pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}
else:
for pcdname in Pcds:
pcd = Pcds[pcdname]
Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}
return Pcds
## Retrieve all PCD settings in platform ## Retrieve all PCD settings in platform
def _GetPcds(self): def _GetPcds(self):
if self._Pcds == None: if self._Pcds == None:
@ -835,9 +875,22 @@ class DscBuildData(PlatformBuildClassObject):
self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII)) self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))
self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD)) self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))
self._Pcds = self.CompletePcdValues(self._Pcds)
self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds) self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)
self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)
return self._Pcds return self._Pcds
def _dumpPcdInfo(self,Pcds):
for pcd in Pcds:
pcdobj = Pcds[pcd]
if not pcdobj.TokenCName.startswith("Test"):
continue
for skuid in pcdobj.SkuInfoList:
if pcdobj.Type in (self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]):
for storename in pcdobj.SkuInfoList[skuid].DefaultStoreDict:
print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,storename,str(pcdobj.SkuInfoList[skuid].DefaultStoreDict[storename]))
else:
print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,str(pcdobj.SkuInfoList[skuid].DefaultValue))
## Retrieve [BuildOptions] ## Retrieve [BuildOptions]
def _GetBuildOptions(self): def _GetBuildOptions(self):
if self._BuildOptions == None: if self._BuildOptions == None:
@ -847,7 +900,7 @@ class DscBuildData(PlatformBuildClassObject):
# #
for CodeBase in (EDKII_NAME, EDK_NAME): for CodeBase in (EDKII_NAME, EDK_NAME):
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase] RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]
for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList: for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:
CurKey = (ToolChainFamily, ToolChain, CodeBase) CurKey = (ToolChainFamily, ToolChain, CodeBase)
# #
# Only flags can be appended # Only flags can be appended
@ -867,7 +920,7 @@ class DscBuildData(PlatformBuildClassObject):
DriverType = '%s.%s' % (Edk, ModuleType) DriverType = '%s.%s' % (Edk, ModuleType)
CommonDriverType = '%s.%s' % ('COMMON', ModuleType) CommonDriverType = '%s.%s' % ('COMMON', ModuleType)
RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType] RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType]
for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4 in RecordList: for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4,Dummy5 in RecordList:
if Type == DriverType or Type == CommonDriverType: if Type == DriverType or Type == CommonDriverType:
Key = (ToolChainFamily, ToolChain, Edk) Key = (ToolChainFamily, ToolChain, Edk)
if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='): if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):
@ -879,15 +932,39 @@ class DscBuildData(PlatformBuildClassObject):
def GetStructurePcdInfo(self, PcdSet): def GetStructurePcdInfo(self, PcdSet):
structure_pcd_data = {} structure_pcd_data = {}
for item in PcdSet: for item in PcdSet:
if item[1] not in structure_pcd_data: if (item[0],item[1]) not in structure_pcd_data:
structure_pcd_data[item[1]] = [] structure_pcd_data[(item[0],item[1])] = []
structure_pcd_data[item[1]].append(item) structure_pcd_data[(item[0],item[1])].append(item)
return structure_pcd_data return structure_pcd_data
def CompleteStructurePcdValue(self,pcdset):
skuset = set([item[3] for item in pcdset])
pcddatamap = {(item[0],item[1],item[2],item[3]):item for item in pcdset}
FieldSet = {}
for item in pcdset:
if (item[0],item[1]) not in FieldSet:
FieldSet[(item[0],item[1])] = set()
FieldSet[(item[0],item[1])].add(item[2])
completeset = []
for tockenspacename,pcdname, in FieldSet:
for field in FieldSet[(tockenspacename,pcdname)]:
for skuid in skuset:
nextskuid = skuid
while (tockenspacename,pcdname,field,nextskuid) not in pcddatamap:
nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
if nextskuid == "DEFAULT":
break
if (tockenspacename,pcdname,field,nextskuid) not in pcddatamap:
continue
item = pcddatamap[tockenspacename,pcdname,field,nextskuid]
completeset.append((tockenspacename,pcdname,field,skuid, item[4],item[5], item[6]))
return completeset
def UpdateStructuredPcds(self, TypeList, AllPcds): def UpdateStructuredPcds(self, TypeList, AllPcds):
Pcds = AllPcds Pcds = AllPcds
SkuObj = SkuClass(self.SkuIdentifier, self.SkuIds) DefaultStoreMgr = DefaultStore(self.DefaultStores)
SkuIds = set([skuid for pcdobj in AllPcds.values() for skuid in pcdobj.SkuInfoList.keys()])
DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])
S_PcdSet = [] S_PcdSet = []
# Find out all possible PCD candidates for self._Arch # Find out all possible PCD candidates for self._Arch
@ -895,17 +972,20 @@ class DscBuildData(PlatformBuildClassObject):
for Type in TypeList: for Type in TypeList:
RecordList.extend(self._RawData[Type, self._Arch]) RecordList.extend(self._RawData[Type, self._Arch])
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4,Dummy5 in RecordList:
if SkuName not in SkuIds:
continue
SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName
if SkuName in SkuObj.SkuIdSet and "." in TokenSpaceGuid: if SkuName in SkuIds and "." in TokenSpaceGuid:
S_PcdSet.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4, AnalyzePcdExpression(Setting)[0])) S_PcdSet.append(( TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]))
S_PcdSet = self.CompleteStructurePcdValue(S_PcdSet)
# handle pcd value override # handle pcd value override
StrPcdSet = self.GetStructurePcdInfo(S_PcdSet) StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)
S_pcd_set = {} S_pcd_set = {}
for str_pcd in StrPcdSet: for str_pcd in StrPcdSet:
str_pcd_obj = Pcds.get((str_pcd.split(".")[1], str_pcd.split(".")[0]), None) str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)
str_pcd_dec = self._DecPcds.get((str_pcd.split(".")[1], str_pcd.split(".")[0]), None) str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)
if str_pcd_dec: if str_pcd_dec:
str_pcd_obj_str = StructurePcd() str_pcd_obj_str = StructurePcd()
str_pcd_obj_str.copy(str_pcd_dec) str_pcd_obj_str.copy(str_pcd_dec)
@ -914,9 +994,9 @@ class DscBuildData(PlatformBuildClassObject):
if str_pcd_obj.DefaultValue: if str_pcd_obj.DefaultValue:
str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue
for str_pcd_data in StrPcdSet[str_pcd]: for str_pcd_data in StrPcdSet[str_pcd]:
if str_pcd_data[2] in SkuObj.SkuIdSet: if str_pcd_data[3] in SkuIds:
str_pcd_obj_str.AddOverrideValue(str_pcd_data[0], str(str_pcd_data[4]), 'DEFAULT' if str_pcd_data[2] == 'COMMON' else str_pcd_data[2],self.MetaFile.File,LineNo=str_pcd_data[3]) str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), 'DEFAULT' if str_pcd_data[3] == 'COMMON' else str_pcd_data[3],'STANDARD' if str_pcd_data[4] == 'COMMON' else str_pcd_data[4], self.MetaFile.File,LineNo=str_pcd_data[5])
S_pcd_set[str_pcd.split(".")[1], str_pcd.split(".")[0]] = str_pcd_obj_str S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str
# Add the Structure PCD that only defined in DEC, don't have override in DSC file # Add the Structure PCD that only defined in DEC, don't have override in DSC file
for Pcd in self._DecPcds: for Pcd in self._DecPcds:
if type (self._DecPcds[Pcd]) is StructurePcd: if type (self._DecPcds[Pcd]) is StructurePcd:
@ -931,29 +1011,67 @@ class DscBuildData(PlatformBuildClassObject):
S_pcd_set[Pcd] = str_pcd_obj_str S_pcd_set[Pcd] = str_pcd_obj_str
if S_pcd_set: if S_pcd_set:
GlobalData.gStructurePcd[self.Arch] = S_pcd_set GlobalData.gStructurePcd[self.Arch] = S_pcd_set
for stru_pcd in S_pcd_set.values():
if stru_pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:
continue
if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
for skuid in SkuIds:
nextskuid = skuid
if skuid not in stru_pcd.SkuOverrideValues:
while nextskuid not in stru_pcd.SkuOverrideValues:
nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
stru_pcd.SkuOverrideValues[skuid] = {}
PcdDefaultStoreSet = set([defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[skuid]])
mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)
for defaultstoreid in DefaultStores:
if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:
stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename]
for skuid in SkuIds:
if skuid in stru_pcd.SkuOverrideValues:
continue
nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)
while nextskuid not in stru_pcd.SkuOverrideValues:
nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
stru_pcd.SkuOverrideValues[skuid] = stru_pcd.SkuOverrideValues[nextskuid]
Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)
if Str_Pcd_Values: if Str_Pcd_Values:
for item in Str_Pcd_Values: for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Values:
str_pcd_obj = S_pcd_set.get((item[2], item[1])) str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))
if str_pcd_obj is None: if str_pcd_obj is None:
raise raise
if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]: self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
if item[0] not in str_pcd_obj.SkuInfoList: if skuname not in str_pcd_obj.SkuInfoList:
str_pcd_obj.SkuInfoList[item[0]] = SkuInfoClass(SkuIdName=item[0], SkuId=self.SkuIds[item[0]], HiiDefaultValue=item[3]) str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})
else: else:
str_pcd_obj.SkuInfoList[item[0]].HiiDefaultValue = item[3] str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue
str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})
elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]: self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:
if item[0] in (SkuObj.SystemSkuId, 'DEFAULT', 'COMMON'): if skuname in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):
str_pcd_obj.DefaultValue = item[3] str_pcd_obj.DefaultValue = PcdValue
else: else:
if item[0] not in str_pcd_obj.SkuInfoList: if skuname not in str_pcd_obj.SkuInfoList:
str_pcd_obj.SkuInfoList[item[0]] = SkuInfoClass(SkuIdName=item[0], SkuId=self.SkuIds[item[0]], DefaultValue=item[3]) str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], DefaultValue=PcdValue)
else: else:
str_pcd_obj.SkuInfoList[item[0]].DefaultValue = item[3] str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue
for str_pcd_obj in S_pcd_set.values():
if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
continue
PcdDefaultStoreSet = set([defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict])
DefaultStoreObj = DefaultStore(self._GetDefaultStores())
mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)
str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]
for str_pcd_obj in S_pcd_set.values(): for str_pcd_obj in S_pcd_set.values():
if not str_pcd_obj.OverrideValues:
continue
str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj) str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj
@ -972,31 +1090,17 @@ class DscBuildData(PlatformBuildClassObject):
# PCD settings for certain ARCH # PCD settings for certain ARCH
# #
SkuObj = SkuClass(self.SkuIdentifier, self.SkuIds)
PcdDict = tdict(True, 3) PcdDict = tdict(True, 3)
PcdSet = set() PcdSet = set()
# Find out all possible PCD candidates for self._Arch # Find out all possible PCD candidates for self._Arch
RecordList = self._RawData[Type, self._Arch] RecordList = self._RawData[Type, self._Arch]
AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy()
AvailableSkuIdSet.update({'DEFAULT':0, 'COMMON':0})
PcdValueDict = sdict() PcdValueDict = sdict()
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:
if SkuName not in AvailableSkuIdSet: if SkuName in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):
EdkLogger.error('Build', OPTION_VALUE_INVALID, "The SKUID name %s is not supported by the platform." % SkuName) if "." not in TokenSpaceGuid:
if "." not in TokenSpaceGuid: PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting
else:
TokenSpaceGuid, PcdCName = TokenSpaceGuid.split('.')
Flag = True
for PcdItem in RecordList:
if (TokenSpaceGuid, PcdCName) == (PcdItem[0], PcdItem[1]):
Flag = False
break
if Flag:
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, 0))
PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = ''
for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet: for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:
Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName] Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]
@ -1019,8 +1123,8 @@ class DscBuildData(PlatformBuildClassObject):
PcdValue, DatumType, MaxDatumSize = PcdSetting['COMMON'] PcdValue, DatumType, MaxDatumSize = PcdSetting['COMMON']
if 'DEFAULT' in PcdSetting: if 'DEFAULT' in PcdSetting:
PcdValue, DatumType, MaxDatumSize = PcdSetting['DEFAULT'] PcdValue, DatumType, MaxDatumSize = PcdSetting['DEFAULT']
if SkuObj.SystemSkuId in PcdSetting: if self.SkuIdMgr.SystemSkuId in PcdSetting:
PcdValue, DatumType, MaxDatumSize = PcdSetting[SkuObj.SystemSkuId] PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(
PcdCName, PcdCName,
@ -1038,6 +1142,26 @@ class DscBuildData(PlatformBuildClassObject):
return Pcds return Pcds
def __UNICODE2OCTList(self,Value):
Value = Value.strip()
Value = Value[2:-1]
List = []
for Item in Value:
Temp = '%04X' % ord(Item)
List.append('0x' + Temp[2:4])
List.append('0x' + Temp[0:2])
List.append('0x00')
List.append('0x00')
return List
def __STRING2OCTList(self,Value):
OCTList = []
Value = Value.strip('"')
for char in Value:
Temp = '%02X' % ord(char)
OCTList.append('0x' + Temp)
OCTList.append('0x00')
return OCTList
def GetStructurePcdMaxSize(self, str_pcd): def GetStructurePcdMaxSize(self, str_pcd):
pcd_default_value = str_pcd.DefaultValue pcd_default_value = str_pcd.DefaultValue
sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()] sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]
@ -1100,120 +1224,130 @@ class DscBuildData(PlatformBuildClassObject):
return Result return Result
def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp): def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):
OverrideValues = None OverrideValues = {DefaultStoreName:""}
if Pcd.SkuOverrideValues: if Pcd.SkuOverrideValues:
OverrideValues = Pcd.SkuOverrideValues[SkuName] OverrideValues = Pcd.SkuOverrideValues[SkuName]
CApp = CApp + 'void\n' for DefaultStoreName in OverrideValues.keys():
CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + 'void\n'
CApp = CApp + ' void\n' CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
CApp = CApp + ' )\n' CApp = CApp + ' void\n'
CApp = CApp + '{\n' CApp = CApp + ' )\n'
CApp = CApp + ' UINT32 Size;\n' CApp = CApp + '{\n'
CApp = CApp + ' UINT32 FieldSize;\n' CApp = CApp + ' UINT32 Size;\n'
CApp = CApp + ' UINT8 *Value;\n' CApp = CApp + ' UINT32 FieldSize;\n'
CApp = CApp + ' UINT32 OriginalSize;\n' CApp = CApp + ' UINT8 *Value;\n'
CApp = CApp + ' VOID *OriginalPcd;\n' CApp = CApp + ' UINT32 OriginalSize;\n'
CApp = CApp + ' %s *Pcd;\n' % (Pcd.DatumType) CApp = CApp + ' VOID *OriginalPcd;\n'
CApp = CApp + '\n' CApp = CApp + ' %s *Pcd;\n' % (Pcd.DatumType)
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, Pcd.DefaultValue) CApp = CApp + '\n'
Pcd.DefaultValue = Pcd.DefaultValue.strip()
if Pcd.DefaultValue.startswith('L"') and Pcd.DefaultValue.endswith('"'):
PcdDefaultValue = "{" + ",".join(self.__UNICODE2OCTList(Pcd.DefaultValue)) + "}"
elif Pcd.DefaultValue.startswith('"') and Pcd.DefaultValue.endswith('"'):
PcdDefaultValue = "{" + ",".join(self.__STRING2OCTList(Pcd.DefaultValue)) + "}"
else:
PcdDefaultValue = Pcd.DefaultValue
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)
# #
# Get current PCD value and size # Get current PCD value and size
# #
CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) 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 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
# the correct value. For structures with a flexible array member, the flexible # 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 # 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 # the flexible array member. The flexible array member must be the last field
# in a structure. The size formula for this case is: # in a structure. The size formula for this case is:
# OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1) # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
# #
CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType) CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType)
for FieldList in [Pcd.DefaultValues, OverrideValues]: for FieldList in [Pcd.DefaultValues, OverrideValues.get(DefaultStoreName)]:
if not FieldList: if not FieldList:
continue continue
for FieldName in FieldList: for FieldName in FieldList:
FieldName = "." + FieldName FieldName = "." + FieldName
IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0]) IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])
if IsArray: if IsArray:
Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0]) Value, ValueSize = ParseFieldValue (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));\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip(".")) CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s));\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."));
else:
NewFieldName = ''
while '[' in FieldName:
NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
FieldName = FieldName.split(']', 1)[1]
FieldName = NewFieldName + FieldName
while '[' in FieldName:
FieldName = FieldName.rsplit('[', 1)[0]
CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1)
#
# 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'
CApp = CApp + ' free (OriginalPcd);\n'
#
# Assign field values in PCD
#
for FieldList in [Pcd.DefaultValues, Pcd.DefaultFromDSC, OverrideValues]:
if not FieldList:
continue
if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:
IsArray = self.IsFieldValueAnArray(FieldList)
Value, ValueSize = ParseFieldValue (FieldList)
if isinstance(Value, str):
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)
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)
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
continue
for FieldName in FieldList:
IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])
Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])
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[0], 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: else:
CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) NewFieldName = ''
while '[' in FieldName:
NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
FieldName = FieldName.split(']', 1)[1]
FieldName = NewFieldName + FieldName
while '[' in FieldName:
FieldName = FieldName.rsplit('[', 1)[0]
CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1)
# #
# Set new PCD value and size # Allocate and zero buffer for the PCD
# # Must handle cases where current value is smaller, larger, or same size
CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) # 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'
# #
# Free PCD # Copy current PCD value into allocated buffer.
# #
CApp = CApp + ' free (Pcd);\n' CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
CApp = CApp + '}\n'
CApp = CApp + '\n' #
# Assign field values in PCD
#
for FieldList in [Pcd.DefaultValues, Pcd.DefaultFromDSC,OverrideValues.get(DefaultStoreName)]:
if not FieldList:
continue
if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:
IsArray = self.IsFieldValueAnArray(FieldList)
Value, ValueSize = ParseFieldValue (FieldList)
if isinstance(Value, str):
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)
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)
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
continue
for FieldName in FieldList:
IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])
try:
Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])
except Exception:
print FieldList[FieldName][0]
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[0], 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])
#
# Set new PCD value and size
#
CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
#
# Free PCD
#
CApp = CApp + ' free (Pcd);\n'
CApp = CApp + '}\n'
CApp = CApp + '\n'
return InitByteValue, CApp return InitByteValue, CApp
def GenerateByteArrayValue (self, StructuredPcds): def GenerateByteArrayValue (self, StructuredPcds):
@ -1238,7 +1372,7 @@ class DscBuildData(PlatformBuildClassObject):
for PcdName in StructuredPcds: for PcdName in StructuredPcds:
Pcd = StructuredPcds[PcdName] Pcd = StructuredPcds[PcdName]
if not Pcd.SkuOverrideValues: if not Pcd.SkuOverrideValues:
InitByteValue, CApp = self.GenerateInitializeFunc('DEFAULT', 'STANDARD', Pcd, InitByteValue, CApp) InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)
else: else:
for SkuName in Pcd.SkuOverrideValues: for SkuName in Pcd.SkuOverrideValues:
for DefaultStoreName in Pcd.DefaultStoreName: for DefaultStoreName in Pcd.DefaultStoreName:
@ -1252,10 +1386,10 @@ class DscBuildData(PlatformBuildClassObject):
CApp = CApp + '{\n' CApp = CApp + '{\n'
for Pcd in StructuredPcds.values(): for Pcd in StructuredPcds.values():
if not Pcd.SkuOverrideValues: if not Pcd.SkuOverrideValues:
CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % ('DEFAULT', 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
else: else:
for SkuName in Pcd.SkuOverrideValues: for SkuName in Pcd.SkuOverrideValues:
for DefaultStoreName in Pcd.DefaultStoreName: for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:
CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
CApp = CApp + '}\n' CApp = CApp + '}\n'
@ -1357,7 +1491,7 @@ class DscBuildData(PlatformBuildClassObject):
for Pcd in FileBuffer: for Pcd in FileBuffer:
PcdValue = Pcd.split ('|') PcdValue = Pcd.split ('|')
PcdInfo = PcdValue[0].split ('.') PcdInfo = PcdValue[0].split ('.')
StructurePcdSet.append((PcdInfo[0], PcdInfo[2], PcdInfo[3], PcdValue[2].strip())) StructurePcdSet.append((PcdInfo[0],PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))
return StructurePcdSet return StructurePcdSet
## Retrieve dynamic PCD settings ## Retrieve dynamic PCD settings
@ -1368,7 +1502,6 @@ class DscBuildData(PlatformBuildClassObject):
# #
def _GetDynamicPcd(self, Type): def _GetDynamicPcd(self, Type):
SkuObj = SkuClass(self.SkuIdentifier, self.SkuIds)
Pcds = sdict() Pcds = sdict()
# #
@ -1379,13 +1512,12 @@ class DscBuildData(PlatformBuildClassObject):
PcdList = [] PcdList = []
# Find out all possible PCD candidates for self._Arch # Find out all possible PCD candidates for self._Arch
RecordList = self._RawData[Type, self._Arch] RecordList = self._RawData[Type, self._Arch]
AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy() AvailableSkuIdSet = copy.copy(self.SkuIds)
AvailableSkuIdSet.update({'DEFAULT':0, 'COMMON':0})
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:
if SkuName not in AvailableSkuIdSet: if SkuName not in AvailableSkuIdSet:
EdkLogger.error('Build', OPTION_VALUE_INVALID, "The SKUID name %s is not supported by the platform." % SkuName) continue
if "." not in TokenSpaceGuid: if "." not in TokenSpaceGuid:
PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4)) PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting
@ -1398,7 +1530,7 @@ class DscBuildData(PlatformBuildClassObject):
continue continue
PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], '', '', '', '', '', PcdValue) SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)
if (PcdCName, TokenSpaceGuid) in Pcds.keys(): if (PcdCName, TokenSpaceGuid) in Pcds.keys():
pcdObject = Pcds[PcdCName, TokenSpaceGuid] pcdObject = Pcds[PcdCName, TokenSpaceGuid]
pcdObject.SkuInfoList[SkuName] = SkuInfo pcdObject.SkuInfoList[SkuName] = SkuInfo
@ -1437,9 +1569,9 @@ class DscBuildData(PlatformBuildClassObject):
del(pcd.SkuInfoList['COMMON']) del(pcd.SkuInfoList['COMMON'])
elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
del(pcd.SkuInfoList['COMMON']) del(pcd.SkuInfoList['COMMON'])
if SkuObj.SkuUsageType == SkuObj.SINGLE: if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:
if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys(): if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys():
pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT']
del(pcd.SkuInfoList['DEFAULT']) del(pcd.SkuInfoList['DEFAULT'])
return Pcds return Pcds
@ -1455,6 +1587,40 @@ class DscBuildData(PlatformBuildClassObject):
return True return True
else: else:
return False return False
def CompletePcdValues(self,PcdSet):
Pcds = {}
DefaultStoreObj = DefaultStore(self._GetDefaultStores())
SkuIds = set([skuid for pcdobj in PcdSet.values() for skuid in pcdobj.SkuInfoList.keys()])
DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])
for PcdCName, TokenSpaceGuid in PcdSet:
PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]
if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:
Pcds[PcdCName, TokenSpaceGuid]= PcdObj
continue
PcdType = PcdObj.Type
if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
for skuid in PcdObj.SkuInfoList:
skuobj = PcdObj.SkuInfoList[skuid]
mindefaultstorename = DefaultStoreObj.GetMin(set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict]))
for defaultstorename in DefaultStores:
if defaultstorename not in skuobj.DefaultStoreDict:
skuobj.DefaultStoreDict[defaultstorename] = skuobj.DefaultStoreDict[mindefaultstorename]
skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]
for skuid in SkuIds:
if skuid not in PcdObj.SkuInfoList:
nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)
while nextskuid not in PcdObj.SkuInfoList:
nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
PcdObj.SkuInfoList[skuid] = PcdObj.SkuInfoList[nextskuid]
if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList["DEFAULT"].HiiDefaultValue
Pcds[PcdCName, TokenSpaceGuid]= PcdObj
return Pcds
## Retrieve dynamic HII PCD settings ## Retrieve dynamic HII PCD settings
# #
# @param Type PCD type # @param Type PCD type
@ -1463,7 +1629,6 @@ class DscBuildData(PlatformBuildClassObject):
# #
def _GetDynamicHiiPcd(self, Type): def _GetDynamicHiiPcd(self, Type):
SkuObj = SkuClass(self.SkuIdentifier, self.SkuIds)
VariableAttrs = {} VariableAttrs = {}
Pcds = sdict() Pcds = sdict()
@ -1471,25 +1636,26 @@ class DscBuildData(PlatformBuildClassObject):
# tdict is a special dict kind of type, used for selecting correct # tdict is a special dict kind of type, used for selecting correct
# PCD settings for certain ARCH and SKU # PCD settings for certain ARCH and SKU
# #
PcdDict = tdict(True, 4) PcdDict = tdict(True, 5)
PcdSet = set() PcdSet = set()
RecordList = self._RawData[Type, self._Arch] RecordList = self._RawData[Type, self._Arch]
# Find out all possible PCD candidates for self._Arch # Find out all possible PCD candidates for self._Arch
AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy() AvailableSkuIdSet = copy.copy(self.SkuIds)
AvailableSkuIdSet.update({'DEFAULT':0, 'COMMON':0}) for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4,Dummy5 in RecordList:
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList: if DefaultStore == "COMMON":
DefaultStore = "STANDARD"
if SkuName not in AvailableSkuIdSet: if SkuName not in AvailableSkuIdSet:
EdkLogger.error('Build', OPTION_VALUE_INVALID, "The SKUID name %s is not supported by the platform." % SkuName) continue
if "." not in TokenSpaceGuid: if "." not in TokenSpaceGuid:
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy4)) PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4))
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore] = Setting
# Remove redundant PCD candidates, per the ARCH and SKU # Remove redundant PCD candidates, per the ARCH and SKU
for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet: for PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4 in PcdSet:
Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid] Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore]
if Setting == None: if Setting == None:
continue continue
VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
@ -1526,12 +1692,17 @@ class DscBuildData(PlatformBuildClassObject):
if not self.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute): if not self.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):
EdkLogger.error('Build', PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR, "The variable %s.%s for DynamicHii PCDs has conflicting attributes [%s] and [%s] " % (VariableGuid, VariableName, VarAttribute, VariableAttrs[(VariableName, VariableGuid)])) EdkLogger.error('Build', PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR, "The variable %s.%s for DynamicHii PCDs has conflicting attributes [%s] and [%s] " % (VariableGuid, VariableName, VarAttribute, VariableAttrs[(VariableName, VariableGuid)]))
SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute)
pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid] pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]
if (PcdCName, TokenSpaceGuid) in Pcds.keys(): if (PcdCName, TokenSpaceGuid) in Pcds.keys():
pcdObject = Pcds[PcdCName, TokenSpaceGuid] pcdObject = Pcds[PcdCName, TokenSpaceGuid]
pcdObject.SkuInfoList[SkuName] = SkuInfo if SkuName in pcdObject.SkuInfoList:
Skuitem = pcdObject.SkuInfoList[SkuName]
Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})
else:
SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})
pcdObject.SkuInfoList[SkuName] = SkuInfo
else: else:
SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject( Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(
PcdCName, PcdCName,
TokenSpaceGuid, TokenSpaceGuid,
@ -1566,9 +1737,9 @@ class DscBuildData(PlatformBuildClassObject):
elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
del(pcd.SkuInfoList['COMMON']) del(pcd.SkuInfoList['COMMON'])
if SkuObj.SkuUsageType == SkuObj.SINGLE: if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:
if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys(): if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys():
pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT']
del(pcd.SkuInfoList['DEFAULT']) del(pcd.SkuInfoList['DEFAULT'])
if pcd.MaxDatumSize.strip(): if pcd.MaxDatumSize.strip():
@ -1598,7 +1769,6 @@ class DscBuildData(PlatformBuildClassObject):
# #
def _GetDynamicVpdPcd(self, Type): def _GetDynamicVpdPcd(self, Type):
SkuObj = SkuClass(self.SkuIdentifier, self.SkuIds)
Pcds = sdict() Pcds = sdict()
# #
@ -1610,12 +1780,11 @@ class DscBuildData(PlatformBuildClassObject):
# Find out all possible PCD candidates for self._Arch # Find out all possible PCD candidates for self._Arch
RecordList = self._RawData[Type, self._Arch] RecordList = self._RawData[Type, self._Arch]
AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy() AvailableSkuIdSet = copy.copy(self.SkuIds)
AvailableSkuIdSet.update({'DEFAULT':0, 'COMMON':0}) for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:
if SkuName not in AvailableSkuIdSet: if SkuName not in AvailableSkuIdSet:
EdkLogger.error('Build', OPTION_VALUE_INVALID, "The SKUID name %s is not supported by the platform." % SkuName) continue
if "." not in TokenSpaceGuid: if "." not in TokenSpaceGuid:
PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4)) PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting
@ -1632,7 +1801,7 @@ class DscBuildData(PlatformBuildClassObject):
# until the DEC parser has been called. # until the DEC parser has been called.
# #
VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4) VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], '', '', '', '', VpdOffset, InitialValue) SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)
if (PcdCName, TokenSpaceGuid) in Pcds.keys(): if (PcdCName, TokenSpaceGuid) in Pcds.keys():
pcdObject = Pcds[PcdCName, TokenSpaceGuid] pcdObject = Pcds[PcdCName, TokenSpaceGuid]
pcdObject.SkuInfoList[SkuName] = SkuInfo pcdObject.SkuInfoList[SkuName] = SkuInfo
@ -1671,9 +1840,9 @@ class DscBuildData(PlatformBuildClassObject):
del(pcd.SkuInfoList['COMMON']) del(pcd.SkuInfoList['COMMON'])
elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys(): elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
del(pcd.SkuInfoList['COMMON']) del(pcd.SkuInfoList['COMMON'])
if SkuObj.SkuUsageType == SkuObj.SINGLE: if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:
if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys(): if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys():
pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT'] pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT']
del(pcd.SkuInfoList['DEFAULT']) del(pcd.SkuInfoList['DEFAULT'])
return Pcds return Pcds

View File

@ -296,7 +296,7 @@ class MetaFileParser(object):
for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT):
if Item == '': if Item == '':
continue continue
ItemList = GetSplitValueList(Item, TAB_SPLIT,2) ItemList = GetSplitValueList(Item, TAB_SPLIT,3)
# different section should not mix in one section # different section should not mix in one section
if self._SectionName != '' and self._SectionName != ItemList[0].upper(): if self._SectionName != '' and self._SectionName != ItemList[0].upper():
EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section", EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section",
@ -329,7 +329,11 @@ class MetaFileParser(object):
S2 = ItemList[2].upper() S2 = ItemList[2].upper()
else: else:
S2 = 'COMMON' S2 = 'COMMON'
self._Scope.append([S1, S2]) if len(ItemList) > 3:
S3 = ItemList[3]
else:
S3 = "COMMON"
self._Scope.append([S1, S2, S3])
# 'COMMON' must not be used with specific ARCHs at the same section # 'COMMON' must not be used with specific ARCHs at the same section
if 'COMMON' in ArchList and len(ArchList) > 1: if 'COMMON' in ArchList and len(ArchList) > 1:
@ -410,7 +414,7 @@ class MetaFileParser(object):
## Construct section Macro dict ## Construct section Macro dict
def _ConstructSectionMacroDict(self, Name, Value): def _ConstructSectionMacroDict(self, Name, Value):
ScopeKey = [(Scope[0], Scope[1]) for Scope in self._Scope] ScopeKey = [(Scope[0], Scope[1],Scope[2]) for Scope in self._Scope]
ScopeKey = tuple(ScopeKey) ScopeKey = tuple(ScopeKey)
SectionDictKey = self._SectionType, ScopeKey SectionDictKey = self._SectionType, ScopeKey
# #
@ -442,20 +446,20 @@ class MetaFileParser(object):
continue continue
for ActiveScope in self._Scope: for ActiveScope in self._Scope:
Scope0, Scope1 = ActiveScope[0], ActiveScope[1] Scope0, Scope1 ,Scope2= ActiveScope[0], ActiveScope[1],ActiveScope[2]
if(Scope0, Scope1) not in Scope: if(Scope0, Scope1,Scope2) not in Scope:
break break
else: else:
SpeSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) SpeSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)])
for ActiveScope in self._Scope: for ActiveScope in self._Scope:
Scope0, Scope1 = ActiveScope[0], ActiveScope[1] Scope0, Scope1,Scope2 = ActiveScope[0], ActiveScope[1],ActiveScope[2]
if(Scope0, Scope1) not in Scope and (Scope0, "COMMON") not in Scope and ("COMMON", Scope1) not in Scope: if(Scope0, Scope1,Scope2) not in Scope and (Scope0, "COMMON","COMMON") not in Scope and ("COMMON", Scope1,"COMMON") not in Scope:
break break
else: else:
ComSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) ComSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)])
if ("COMMON", "COMMON") in Scope: if ("COMMON", "COMMON","COMMON") in Scope:
ComComMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) ComComMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)])
Macros.update(ComComMacroDict) Macros.update(ComComMacroDict)
@ -627,7 +631,7 @@ class InfParser(MetaFileParser):
# Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1, # Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1,
# LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1
# #
for Arch, Platform in self._Scope: for Arch, Platform,_ in self._Scope:
LastItem = self._Store(self._SectionType, LastItem = self._Store(self._SectionType,
self._ValueList[0], self._ValueList[0],
self._ValueList[1], self._ValueList[1],
@ -804,6 +808,7 @@ class DscParser(MetaFileParser):
# DSC file supported data types (one type per section) # DSC file supported data types (one type per section)
DataType = { DataType = {
TAB_SKUIDS.upper() : MODEL_EFI_SKU_ID, TAB_SKUIDS.upper() : MODEL_EFI_SKU_ID,
TAB_DEFAULT_STORES.upper() : MODEL_EFI_DEFAULT_STORES,
TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE,
TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,
TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION,
@ -952,7 +957,7 @@ class DscParser(MetaFileParser):
# Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1,
# LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1
# #
for Arch, ModuleType in self._Scope: for Arch, ModuleType, DefaultStore in self._Scope:
Owner = self._Owner[-1] Owner = self._Owner[-1]
if self._SubsectionType != MODEL_UNKNOWN: if self._SubsectionType != MODEL_UNKNOWN:
Owner = OwnerId[Arch] Owner = OwnerId[Arch]
@ -963,6 +968,7 @@ class DscParser(MetaFileParser):
self._ValueList[2], self._ValueList[2],
Arch, Arch,
ModuleType, ModuleType,
DefaultStore,
Owner, Owner,
self._From, self._From,
self._LineIndex + 1, self._LineIndex + 1,
@ -1015,7 +1021,7 @@ class DscParser(MetaFileParser):
ExtraData=self._CurrentLine) ExtraData=self._CurrentLine)
ItemType = self.DataType[DirectiveName] ItemType = self.DataType[DirectiveName]
Scope = [['COMMON', 'COMMON']] Scope = [['COMMON', 'COMMON','COMMON']]
if ItemType == MODEL_META_DATA_INCLUDE: if ItemType == MODEL_META_DATA_INCLUDE:
Scope = self._Scope Scope = self._Scope
if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF:
@ -1045,7 +1051,7 @@ class DscParser(MetaFileParser):
# Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1,
# LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1
# #
for Arch, ModuleType in Scope: for Arch, ModuleType, DefaultStore in Scope:
self._LastItem = self._Store( self._LastItem = self._Store(
ItemType, ItemType,
self._ValueList[0], self._ValueList[0],
@ -1053,6 +1059,7 @@ class DscParser(MetaFileParser):
self._ValueList[2], self._ValueList[2],
Arch, Arch,
ModuleType, ModuleType,
DefaultStore,
self._Owner[-1], self._Owner[-1],
self._From, self._From,
self._LineIndex + 1, self._LineIndex + 1,
@ -1088,6 +1095,13 @@ class DscParser(MetaFileParser):
@ParseMacro @ParseMacro
def _SkuIdParser(self): def _SkuIdParser(self):
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)
if len(TokenList) not in (2,3):
EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>[|<UiName>]'",
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)
self._ValueList[0:len(TokenList)] = TokenList
@ParseMacro
def _DefaultStoresParser(self):
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)
if len(TokenList) != 2: if len(TokenList) != 2:
EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>'", EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>'",
@ -1243,6 +1257,7 @@ class DscParser(MetaFileParser):
MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF : self.__ProcessDirective, MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF : self.__ProcessDirective,
MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF : self.__ProcessDirective, MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF : self.__ProcessDirective,
MODEL_EFI_SKU_ID : self.__ProcessSkuId, MODEL_EFI_SKU_ID : self.__ProcessSkuId,
MODEL_EFI_DEFAULT_STORES : self.__ProcessDefaultStores,
MODEL_EFI_LIBRARY_INSTANCE : self.__ProcessLibraryInstance, MODEL_EFI_LIBRARY_INSTANCE : self.__ProcessLibraryInstance,
MODEL_EFI_LIBRARY_CLASS : self.__ProcessLibraryClass, MODEL_EFI_LIBRARY_CLASS : self.__ProcessLibraryClass,
MODEL_PCD_FIXED_AT_BUILD : self.__ProcessPcd, MODEL_PCD_FIXED_AT_BUILD : self.__ProcessPcd,
@ -1276,7 +1291,7 @@ class DscParser(MetaFileParser):
self._ContentIndex = 0 self._ContentIndex = 0
self._InSubsection = False self._InSubsection = False
while self._ContentIndex < len(self._Content) : while self._ContentIndex < len(self._Content) :
Id, self._ItemType, V1, V2, V3, S1, S2, Owner, self._From, \ Id, self._ItemType, V1, V2, V3, S1, S2, S3,Owner, self._From, \
LineStart, ColStart, LineEnd, ColEnd, Enabled = self._Content[self._ContentIndex] LineStart, ColStart, LineEnd, ColEnd, Enabled = self._Content[self._ContentIndex]
if self._From < 0: if self._From < 0:
@ -1284,7 +1299,7 @@ class DscParser(MetaFileParser):
self._ContentIndex += 1 self._ContentIndex += 1
self._Scope = [[S1, S2]] self._Scope = [[S1, S2, S3]]
# #
# For !include directive, handle it specially, # For !include directive, handle it specially,
# merge arch and module type in case of duplicate items # merge arch and module type in case of duplicate items
@ -1293,9 +1308,9 @@ class DscParser(MetaFileParser):
if self._ContentIndex >= len(self._Content): if self._ContentIndex >= len(self._Content):
break break
Record = self._Content[self._ContentIndex] Record = self._Content[self._ContentIndex]
if LineStart == Record[9] and LineEnd == Record[11]: if LineStart == Record[10] and LineEnd == Record[12]:
if [Record[5], Record[6]] not in self._Scope: if [Record[5], Record[6],Record[7]] not in self._Scope:
self._Scope.append([Record[5], Record[6]]) self._Scope.append([Record[5], Record[6],Record[7]])
self._ContentIndex += 1 self._ContentIndex += 1
else: else:
break break
@ -1348,6 +1363,7 @@ class DscParser(MetaFileParser):
self._ValueList[2], self._ValueList[2],
S1, S1,
S2, S2,
S3,
NewOwner, NewOwner,
self._From, self._From,
self._LineIndex + 1, self._LineIndex + 1,
@ -1383,7 +1399,7 @@ class DscParser(MetaFileParser):
MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII, MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII,
MODEL_PCD_DYNAMIC_EX_VPD): MODEL_PCD_DYNAMIC_EX_VPD):
Records = self._RawTable.Query(PcdType, BelongsToItem= -1.0) Records = self._RawTable.Query(PcdType, BelongsToItem= -1.0)
for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, Dummy4,ID, Line in Records:
Name = TokenSpaceGuid + '.' + PcdName Name = TokenSpaceGuid + '.' + PcdName
if Name not in GlobalData.gPlatformOtherPcds: if Name not in GlobalData.gPlatformOtherPcds:
PcdLine = Line PcdLine = Line
@ -1549,6 +1565,9 @@ class DscParser(MetaFileParser):
def __ProcessSkuId(self): def __ProcessSkuId(self):
self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True) self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
for Value in self._ValueList] for Value in self._ValueList]
def __ProcessDefaultStores(self):
self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
for Value in self._ValueList]
def __ProcessLibraryInstance(self): def __ProcessLibraryInstance(self):
self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList]
@ -1598,6 +1617,7 @@ class DscParser(MetaFileParser):
_SectionParser = { _SectionParser = {
MODEL_META_DATA_HEADER : _DefineParser, MODEL_META_DATA_HEADER : _DefineParser,
MODEL_EFI_SKU_ID : _SkuIdParser, MODEL_EFI_SKU_ID : _SkuIdParser,
MODEL_EFI_DEFAULT_STORES : _DefaultStoresParser,
MODEL_EFI_LIBRARY_INSTANCE : _LibraryInstanceParser, MODEL_EFI_LIBRARY_INSTANCE : _LibraryInstanceParser,
MODEL_EFI_LIBRARY_CLASS : _LibraryClassParser, MODEL_EFI_LIBRARY_CLASS : _LibraryClassParser,
MODEL_PCD_FIXED_AT_BUILD : _PcdParser, MODEL_PCD_FIXED_AT_BUILD : _PcdParser,

View File

@ -23,6 +23,7 @@ from MetaDataTable import Table, TableFile
from MetaDataTable import ConvertToSqlString from MetaDataTable import ConvertToSqlString
from CommonDataClass.DataClass import MODEL_FILE_DSC, MODEL_FILE_DEC, MODEL_FILE_INF, \ from CommonDataClass.DataClass import MODEL_FILE_DSC, MODEL_FILE_DEC, MODEL_FILE_INF, \
MODEL_FILE_OTHERS MODEL_FILE_OTHERS
from Common.DataType import *
class MetaFileTable(Table): class MetaFileTable(Table):
# TRICK: use file ID as the part before '.' # TRICK: use file ID as the part before '.'
@ -271,6 +272,7 @@ class PlatformTable(MetaFileTable):
Value3 TEXT, Value3 TEXT,
Scope1 TEXT, Scope1 TEXT,
Scope2 TEXT, Scope2 TEXT,
Scope3 TEXT,
BelongsToItem REAL NOT NULL, BelongsToItem REAL NOT NULL,
FromItem REAL NOT NULL, FromItem REAL NOT NULL,
StartLine INTEGER NOT NULL, StartLine INTEGER NOT NULL,
@ -280,7 +282,7 @@ class PlatformTable(MetaFileTable):
Enabled INTEGER DEFAULT 0 Enabled INTEGER DEFAULT 0
''' '''
# used as table end flag, in case the changes to database is not committed to db file # used as table end flag, in case the changes to database is not committed to db file
_DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1, -1" _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====','====', -1, -1, -1, -1, -1, -1, -1"
## Constructor ## Constructor
def __init__(self, Cursor, MetaFile, Temporary): def __init__(self, Cursor, MetaFile, Temporary):
@ -304,9 +306,9 @@ class PlatformTable(MetaFileTable):
# @param EndColumn: EndColumn of a Dsc item # @param EndColumn: EndColumn of a Dsc item
# @param Enabled: If this item enabled # @param Enabled: If this item enabled
# #
def Insert(self, Model, Value1, Value2, Value3, Scope1='COMMON', Scope2='COMMON', BelongsToItem=-1, def Insert(self, Model, Value1, Value2, Value3, Scope1='COMMON', Scope2='COMMON', Scope3=TAB_DEFAULT_STORES_DEFAULT,BelongsToItem=-1,
FromItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=1): FromItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=1):
(Value1, Value2, Value3, Scope1, Scope2) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2)) (Value1, Value2, Value3, Scope1, Scope2,Scope3) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2,Scope3))
return Table.Insert( return Table.Insert(
self, self,
Model, Model,
@ -315,6 +317,7 @@ class PlatformTable(MetaFileTable):
Value3, Value3,
Scope1, Scope1,
Scope2, Scope2,
Scope3,
BelongsToItem, BelongsToItem,
FromItem, FromItem,
StartLine, StartLine,
@ -336,7 +339,7 @@ class PlatformTable(MetaFileTable):
# #
def Query(self, Model, Scope1=None, Scope2=None, BelongsToItem=None, FromItem=None): def Query(self, Model, Scope1=None, Scope2=None, BelongsToItem=None, FromItem=None):
ConditionString = "Model=%s AND Enabled>0" % Model ConditionString = "Model=%s AND Enabled>0" % Model
ValueString = "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine" ValueString = "Value1,Value2,Value3,Scope1,Scope2,Scope3,ID,StartLine"
if Scope1 != None and Scope1 != 'COMMON': if Scope1 != None and Scope1 != 'COMMON':
ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Scope1 ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Scope1