4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to define class objects of INF file [Pcds] section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# It will consumed by InfParser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# under the terms and conditions of the BSD License which accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInfPcdObject
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.Misc import GetHelpStringByRemoveHashKey
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ParserValidate import IsValidCVariableName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Library.ExpressionValidate import IsValidFeatureFlagExp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Parser.InfAsBuiltProcess import GetPackageListInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Object.Parser.InfPackagesObject import InfPackageItem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate Arch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PcdTypeItem1.upper != DT.TAB_INF_FEATURE_PCD.upper():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ArchItemNew),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentItemUsage, CommentType, CommentString, CommentItemHelpText = ParseComment(CommentItem,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FFEHelpText = FFEHelpText + DT.END_OF_LINE + CommentItemHelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Count == len(CommentList) and CommentItemUsage == DT.ITEM_UNDEFINED:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Count == len(CommentList) and (BlockFlag == 1 or BlockFlag == 2):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif BlockFlag == -1 and Count == len(CommentList):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Combine two comment line if they are generic comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CommentItemUsage == PreUsage == DT.ITEM_UNDEFINED:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentItemIns.SetHelpStringItem(CommentItemHelpText)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Add previous help string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Add Current help string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentItemIns.SetHelpStringItem(CommentItemHelpText)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # ## SOMETIMES_CONSUMES ## HelpString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Help String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## InfPcdItem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This class defined Pcd item used in Module files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param CName: Input value for CName, default is ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Token: Input value for Token, default is ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param TokenSpaceGuidCName: Input value for TokenSpaceGuidCName, default
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param DatumType: Input value for DatumType, default is ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param MaxDatumSize: Input value for MaxDatumSize, default is ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param DefaultValue: Input value for DefaultValue, default is ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ItemType: Input value for ItemType, default is ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param ValidUsage: Input value for ValidUsage, default is []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SkuInfoList: Input value for SkuInfoList, default is {}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param SupModuleList: Input value for SupModuleList, default is []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def SetTokenSpaceGuidValue(self, TokenSpaceGuidValue):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def SetPcds(self, PcdContent, KeysList = None, PackageInfo = None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.SetAsBuildPcds(PcdContent, KeysList, PackageInfo)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate Arch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupArchList, SupArchDict = ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate PcdType
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR%(DT.PCD_USAGE_TYPE_LIST_OF_MODULE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj = ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Contain PcdName and Value, validate value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if IsValidPcdValue(PcdItem[1]) or PcdItem[1].strip() == "":
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Contain PcdName, value, and FeatureFlag express
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate Feature Flag Express
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate FFE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FeatureFlagRtv = IsValidFeatureFlagExp(PcdItem[2].strip())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PcdTypeItem.upper != DT.TAB_INF_FEATURE_PCD.upper():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj.SetSupportArchList(SupArchDict[PcdTypeItem])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def SetAsBuildPcds(self, PcdContent, KeysList = None, PackageInfo = None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommentString += GetHelpStringByRemoveHashKey(CommmentLine)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Set PcdTokenSpaceCName and CName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj = SetValueDatumTypeMaxSizeToken(PcdItem,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueList = GetSplitValueList(String, DT.TAB_VALUE_SPLIT, 3)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # DatumType, Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arch, PackageInfo = None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Package information not been generated currently, we need to parser INF file to get information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageInfoList = GetPackageListInfo(InfFileName, GlobalData.gWORKSPACE, -1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Open DEC file to get information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gWORKSPACE, PackageName)))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find PCD information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecPcdsDict = DecParser.GetPcdSectionObject().ValueDict
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key[0] == 'PCDSDYNAMICEX' and PcdItemObj.GetItemType() == 'PcdEx') and \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdInDec.TokenSpaceGuidCName == PcdItemObj.TokenSpaceGuidCName:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key[0] == 'PCDSPATCHABLEINMODULE' and PcdItemObj.GetItemType() == 'PatchPcd') and \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdInDec.TokenSpaceGuidCName == PcdItemObj.TokenSpaceGuidCName:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj.SetMaxDatumSize('%s'%(len(GetSplitValueList(PcdItem[1], DT.TAB_COMMA_SPLIT))))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecGuidsDict = DecParser.GetGuidSectionObject().ValueDict
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if GuidInDec.GuidCName == PcdItemObj.TokenSpaceGuidCName:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdItemObj.SetTokenSpaceGuidValue(GuidInDec.GuidString)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate Value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ValidatePcdValueOnDatumType(PcdItem[1], PcdItemObj.GetDatumType()):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_ASBUILD_PCD_VALUE_INVALID%("\"" + PcdItem[1] + "\"", "\"" +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # validate offset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID%("\"" + PcdItem[2] + "\""),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ST.ERR_ASBUILD_PCD_DECLARITION_MISS%("\"" + PcdItem[0] + "\""),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Boolean type only allow 0x00 or 0x01 as value per INF spec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Strip "{" at head and "}" at tail.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueList = GetSplitValueList(Value, DT.TAB_COMMA_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidHexByte = re.compile("^0x[0-9a-f]{1,2}$", re.IGNORECASE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif Type == 'UINT8' or Type == 'UINT16' or Type == 'UINT32' or Type == 'UINT64':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidUint8z = re.compile('^0[x|X][a-fA-F0-9]{2}$')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidUint16z = re.compile('^0[x|X][a-fA-F0-9]{4}$')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidUint32z = re.compile('^0[x|X][a-fA-F0-9]{8}$')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsValidUint64z = re.compile('^0[x|X][a-fA-F0-9]{16}$')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not ReIsValidUint8z.match(Value) and Type == 'UINT8':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif not ReIsValidUint16z.match(Value) and Type == 'UINT16':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif not ReIsValidUint32z.match(Value) and Type == 'UINT32':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif not ReIsValidUint64z.match(Value) and Type == 'UINT64':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Since we assume the DEC file always correct, should never go to here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Only PCD Name specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # <PcdName> ::= <TokenSpaceGuidCName> "." <TokenCName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdId = GetSplitValueList(PcdItem[0], DT.TAB_SPLIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Validate PcdTokenSpaceGuidCName