From nobody Thu Apr 25 17:49:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52970+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52970+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1578389225; cv=none; d=zohomail.com; s=zohoarc; b=JnKtEvQd8X3RqpljsExEjHeJjMfMP1f8jNiUJBAkSpZnPuPWRb9/Gm//tOAJE7EAiTrKCc0O7j00cCDWvc2QOlkVliojMxVkjFqck3JMNAh+84MV2/Wzjy2WWV42AIn0qmpfwIXvooHslzdq0rFS7eCEgEzC/T8X6QhmYTLmN78= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1578389225; h=Content-Type:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=j8GFKs0QLoIp0SBXkWaHhQlmObnhePRsQLQIctZvb9s=; b=DIHs5nG07fnsiM6pVPU/7IfjNoLefdilx09c+P2ZssBbK9eGALR04KF7LhR8mhy2TOZPfRBKIgo57o7JCw+vmqsekV7Mx4RP0K6fJgNFgzOQE3MzetsW+Zx1aPMY0n5re7pSoUcsZRAUNsu/j4VO+aayeYnIY1uc4NuVTD7kkCs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52970+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 157838922521045.94959639059175; Tue, 7 Jan 2020 01:27:05 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id moXWYY1788612x9JKUYxaj9L; Tue, 07 Jan 2020 01:27:03 -0800 X-Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mx.groups.io with SMTP id smtpd.web11.3579.1578389223154128507 for ; Tue, 07 Jan 2020 01:27:03 -0800 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False X-Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Jan 2020 01:27:02 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,405,1571727600"; d="dat'59?scan'59,208,59";a="211076480" X-Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga007.jf.intel.com with ESMTP; 07 Jan 2020 01:27:01 -0800 X-Received: from fmsmsx122.amr.corp.intel.com (10.18.125.37) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 7 Jan 2020 01:27:01 -0800 X-Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by fmsmsx122.amr.corp.intel.com (10.18.125.37) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 7 Jan 2020 01:27:01 -0800 X-Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.30]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.55]) with mapi id 14.03.0439.000; Tue, 7 Jan 2020 17:26:58 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [edk2-devel] [PATCH] BaseTools:fix Ecc tool issue for check StructPcd Thread-Topic: [PATCH] BaseTools:fix Ecc tool issue for check StructPcd Thread-Index: AdXFPJpG6QfrbQ2aRUmAc595cJqimA== Date: Tue, 7 Jan 2020 09:26:57 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,zhijux.fan@intel.com X-Gm-Message-State: Oc118ev0xJrzKqa93B1zFr6Gx1787277AA= Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B002497SHSMSX101ccrcor_" Content-Language: en-US DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1578389223; bh=QdOSEuTzDUkxmzRqL21YMWynHo1LDcHsCGWRqlFfiQ0=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=F22uAhcMd6vMVDphqxcccO9C2QOC4+eRINuoktU0uwPKidfHJ00ioBVO/l7k4l2pjCE Q3Mn+dCEvm02vtPF3UoqCR2dScmYclk/gkWn0HXqXNpEh1LGPk0gx5gAAYB/b7kKw7atW FMvRCg9pGnPr7rvag876mc0WlUhKC10HQ2U= X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: pass (identity @groups.io) --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B002497SHSMSX101ccrcor_ Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2142 gAdvancedFeaturePkgTokenSpaceGuid.PcdSmbiosType0BiosInformation| {0x0}|SMBIOS_TABLE_TYPE0|0x80010000 { IndustryStandard/SmBios.h MdePkg/MdePkg.dec AdvancedFeaturePkg/AdvancedFeaturePkg.dec } If there's a PcdStructHF or PcdStructPKGs in StructPcd, EccTool report error,IndexError: list index out of range This patch is going to fix this issue Cc: Liming Gao Cc: Bob Feng Signed-off-by: Zhiju.Fan --- .../Python/Ecc/MetaFileWorkspace/MetaFileParser.py | 362 +++++++++++++----= ---- 1 file changed, 220 insertions(+), 142 deletions(-) diff --git a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.p= y b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py index 1576565455..f7b12d8855 100644 --- a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py @@ -13,7 +13,7 @@ import Common.LongFilePathOs as os import re import time import copy - +from hashlib import md5 import Common.EdkLogger as EdkLogger import Common.GlobalData as GlobalData import Ecc.EccGlobalData as EccGlobalData @@ -1498,6 +1498,10 @@ class DecParser(MetaFileParser): self.TblFile =3D EccGlobalData.gDb.TblFile self.FileID =3D -1 =20 + self._CurrentStructurePcdName =3D "" + self._include_flag =3D False + self._package_flag =3D False + ## Parser starter def Start(self): Content =3D '' @@ -1692,6 +1696,17 @@ class DecParser(MetaFileParser): File=3Dself.MetaFile, Line=3Dself._LineIndex+1) self._ValueList[0] =3D '' =20 + def ParsePcdName(self,namelist): + if "[" in namelist[1]: + pcdname =3D namelist[1][:namelist[1].index("[")] + arrayindex =3D namelist[1][namelist[1].index("["):] + namelist[1] =3D pcdname + if len(namelist) =3D=3D 2: + namelist.append(arrayindex) + else: + namelist[2] =3D ".".join((arrayindex,namelist[2])) + return namelist + ## PCD sections parser # # [PcdsFixedAtBuild] @@ -1702,153 +1717,216 @@ class DecParser(MetaFileParser): # @ParseMacro def _PcdParser(self): - TokenList =3D GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT= , 1) - self._ValueList[0:1] =3D GetSplitValueList(TokenList[0], TAB_SPLIT) - # check PCD information - if self._ValueList[0] =3D=3D '' or self._ValueList[1] =3D=3D '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID= or PCD name specified", - ExtraData=3Dself._CurrentLine + \ - " (.|= ||)", - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - # check PCD datum information - if len(TokenList) < 2 or TokenList[1] =3D=3D '': - EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum inform= ation given", - ExtraData=3Dself._CurrentLine + \ - " (.|= ||)", - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - - - ValueRe =3D re.compile(r'^\s*L?\".*\|.*\"') - PtrValue =3D ValueRe.findall(TokenList[1]) - - # Has VOID* type string, may contain "|" character in the string. - if len(PtrValue) !=3D 0: - ptrValueList =3D re.sub(ValueRe, '', TokenList[1]) - ValueList =3D GetSplitValueList(ptrValueList) - ValueList[0] =3D PtrValue[0] - else: - ValueList =3D GetSplitValueList(TokenList[1]) - - - # check if there's enough datum information given - if len(ValueList) !=3D 3: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum i= nformation given", - ExtraData=3Dself._CurrentLine + \ - " (.|= ||)", - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - # check default value - if ValueList[0] =3D=3D '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValu= e in PCD Datum information", - ExtraData=3Dself._CurrentLine + \ - " (.|= ||)", - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - # check datum type - if ValueList[1] =3D=3D '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType i= n PCD Datum information", - ExtraData=3Dself._CurrentLine + \ - " (.|= ||)", - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - # check token of the PCD - if ValueList[2] =3D=3D '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PC= D Datum information", - ExtraData=3Dself._CurrentLine + \ - " (.|= ||)", - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - # check format of default value against the datum type - IsValid, Cause =3D CheckPcdDatum(ValueList[1], ValueList[0]) - if not IsValid: - EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=3Ds= elf._CurrentLine, - File=3Dself.MetaFile, Line=3Dself._LineIndex+1) - - if EccGlobalData.gConfig.UniCheckPCDInfo =3D=3D '1' or EccGlobalDa= ta.gConfig.UniCheckAll =3D=3D '1' or EccGlobalData.gConfig.CheckAll =3D=3D = '1': - # check Description, Prompt information - PatternDesc =3D re.compile('##\s*([\x21-\x7E\s]*)', re.S) - PatternPrompt =3D re.compile('#\s+@Prompt\s+([\x21-\x7E\s]*)',= re.S) - Description =3D None - Prompt =3D None - # check @ValidRange, @ValidList and @Expression format valid - ErrorCodeValid =3D '0x0 <=3D %s <=3D 0xFFFFFFFF' - PatternValidRangeIn =3D '(NOT)?\s*(\d+\s*-\s*\d+|0[xX][a-fA-F0= -9]+\s*-\s*0[xX][a-fA-F0-9]+|LT\s*\d+|LT\s*0[xX][a-fA-F0-9]+|GT\s*\d+|GT\s*= 0[xX][a-fA-F0-9]+|LE\s*\d+|LE\s*0[xX][a-fA-F0-9]+|GE\s*\d+|GE\s*0[xX][a-fA-= F0-9]+|XOR\s*\d+|XOR\s*0[xX][a-fA-F0-9]+|EQ\s*\d+|EQ\s*0[xX][a-fA-F0-9]+)' - PatternValidRng =3D re.compile('^' + '(NOT)?\s*' + PatternVali= dRangeIn + '$') - for Comment in self._Comments: - Comm =3D Comment[0].strip() - if not Comm: - continue - if not Description: - Description =3D PatternDesc.findall(Comm) - if not Prompt: - Prompt =3D PatternPrompt.findall(Comm) - if Comm[0] =3D=3D '#': - ValidFormt =3D Comm.lstrip('#') - ValidFormt =3D ValidFormt.lstrip() - if ValidFormt[0:11] =3D=3D '@ValidRange': - ValidFormt =3D ValidFormt[11:] + if self._CurrentStructurePcdName: + self._ValueList[0] =3D self._CurrentStructurePcdName + + if "|" not in self._CurrentLine: + if "" =3D=3D self._CurrentLine: + self._include_flag =3D True + self._package_flag =3D False + self._ValueList =3D None + return + if "" =3D=3D self._CurrentLine: + self._package_flag =3D True + self._ValueList =3D None + self._include_flag =3D False + return + + if self._include_flag: + self._ValueList[1] =3D "_" + md5(self._Cu= rrentLine.encode('utf-8')).hexdigest() + self._ValueList[2] =3D self._CurrentLine + if self._package_flag and "}" !=3D self._CurrentLine: + self._ValueList[1] =3D "_" + md5(self._Curre= ntLine.encode('utf-8')).hexdigest() + self._ValueList[2] =3D self._CurrentLine + if self._CurrentLine =3D=3D "}": + self._package_flag =3D False + self._include_flag =3D False + self._ValueList =3D None + return + else: + PcdTockens =3D self._CurrentLine.split(TAB_VALUE_SPLIT) + PcdNames =3D self.ParsePcdName(PcdTockens[0].split(TAB_SPL= IT)) + if len(PcdNames) =3D=3D 2: + if PcdNames[1].strip().endswith("]"): + PcdName =3D PcdNames[1][:PcdNames[1].index('[')] + Index =3D PcdNames[1][PcdNames[1].index('['):] + self._ValueList[0] =3D TAB_SPLIT.join((PcdNames[0]= ,PcdName)) + self._ValueList[1] =3D Index + self._ValueList[2] =3D PcdTockens[1] + else: + self._CurrentStructurePcdName =3D "" + else: + if self._CurrentStructurePcdName !=3D TAB_SPLIT.join(P= cdNames[:2]): + EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Nam= e does not match: %s and %s " % (self._CurrentStructurePcdName, TAB_SPLIT.j= oin(PcdNames[:2])), + File=3Dself.MetaFile, Line=3Dself._LineInd= ex + 1) + self._ValueList[1] =3D TAB_SPLIT.join(PcdNames[2:]) + self._ValueList[2] =3D PcdTockens[1] + if not self._CurrentStructurePcdName: + TokenList =3D GetSplitValueList(self._CurrentLine, TAB_VALUE_S= PLIT, 1) + self._ValueList[0:1] =3D GetSplitValueList(TokenList[0], TAB_S= PLIT) + ValueRe =3D re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*') + # check PCD information + if self._ValueList[0] =3D=3D '' or self._ValueList[1] =3D=3D '= ': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space = GUID or PCD name specified", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex + 1) + # check format of token space GUID CName + if not ValueRe.match(self._ValueList[0]): + EdkLogger.error('Parser', FORMAT_INVALID, + "The format of the token space GUID CName = is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex + 1) + # check format of PCD CName + if not ValueRe.match(self._ValueList[1]): + EdkLogger.error('Parser', FORMAT_INVALID, + "The format of the PCD CName is invalid. T= he correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex + 1) + # check PCD datum information + if len(TokenList) < 2 or TokenList[1] =3D=3D '': + EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum in= formation given", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex + 1) + + ValueRe =3D re.compile(r'^\s*L?\".*\|.*\"') + PtrValue =3D ValueRe.findall(TokenList[1]) + + # Has VOID* type string, may contain "|" character in the stri= ng. + if len(PtrValue) !=3D 0: + ptrValueList =3D re.sub(ValueRe, '', TokenList[1]) + ValueList =3D GetSplitValueList(ptrValueList) + ValueList[0] =3D PtrValue[0] + else: + ValueList =3D GetSplitValueList(TokenList[1]) + + + # check if there's enough datum information given + if len(ValueList) !=3D 3: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Dat= um information given", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex+1) + # check default value + if ValueList[0] =3D=3D '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing Default= Value in PCD Datum information", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex+1) + # check datum type + if ValueList[1] =3D=3D '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumTy= pe in PCD Datum information", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex+1) + # check token of the PCD + if ValueList[2] =3D=3D '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token i= n PCD Datum information", + ExtraData=3Dself._CurrentLine + \ + " (.|||)", + File=3Dself.MetaFile, Line=3Dself._LineInd= ex+1) + # check format of default value against the datum type + IsValid, Cause =3D CheckPcdDatum(ValueList[1], ValueList[0]) + if not IsValid: + EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData= =3Dself._CurrentLine, + File=3Dself.MetaFile, Line=3Dself._LineInd= ex+1) + if Cause =3D=3D "StructurePcd": + self._CurrentStructurePcdName =3D TAB_SPLIT.join(self._Val= ueList[0:2]) + self._ValueList[0] =3D self._CurrentStructurePcdName + self._ValueList[1] =3D ValueList[1].strip() + + if EccGlobalData.gConfig.UniCheckPCDInfo =3D=3D '1' or EccGlob= alData.gConfig.UniCheckAll =3D=3D '1' or EccGlobalData.gConfig.CheckAll =3D= =3D '1': + # check Description, Prompt information + PatternDesc =3D re.compile('##\s*([\x21-\x7E\s]*)', re.S) + PatternPrompt =3D re.compile('#\s+@Prompt\s+([\x21-\x7E\s]= *)', re.S) + Description =3D None + Prompt =3D None + # check @ValidRange, @ValidList and @Expression format val= id + ErrorCodeValid =3D '0x0 <=3D %s <=3D 0xFFFFFFFF' + PatternValidRangeIn =3D '(NOT)?\s*(\d+\s*-\s*\d+|0[xX][a-f= A-F0-9]+\s*-\s*0[xX][a-fA-F0-9]+|LT\s*\d+|LT\s*0[xX][a-fA-F0-9]+|GT\s*\d+|G= T\s*0[xX][a-fA-F0-9]+|LE\s*\d+|LE\s*0[xX][a-fA-F0-9]+|GE\s*\d+|GE\s*0[xX][a= -fA-F0-9]+|XOR\s*\d+|XOR\s*0[xX][a-fA-F0-9]+|EQ\s*\d+|EQ\s*0[xX][a-fA-F0-9]= +)' + PatternValidRng =3D re.compile('^' + '(NOT)?\s*' + Pattern= ValidRangeIn + '$') + for Comment in self._Comments: + Comm =3D Comment[0].strip() + if not Comm: + continue + if not Description: + Description =3D PatternDesc.findall(Comm) + if not Prompt: + Prompt =3D PatternPrompt.findall(Comm) + if Comm[0] =3D=3D '#': + ValidFormt =3D Comm.lstrip('#') ValidFormt =3D ValidFormt.lstrip() - try: - ErrorCode, Expression =3D ValidFormt.split('|'= , 1) - except ValueError: - ErrorCode =3D '0x0' - Expression =3D ValidFormt - ErrorCode, Expression =3D ErrorCode.strip(), Expre= ssion.strip() - try: - if not eval(ErrorCodeValid % ErrorCode): + if ValidFormt[0:11] =3D=3D '@ValidRange': + ValidFormt =3D ValidFormt[11:] + ValidFormt =3D ValidFormt.lstrip() + try: + ErrorCode, Expression =3D ValidFormt.split= ('|', 1) + except ValueError: + ErrorCode =3D '0x0' + Expression =3D ValidFormt + ErrorCode, Expression =3D ErrorCode.strip(), E= xpression.strip() + try: + if not eval(ErrorCodeValid % ErrorCode): + EdkLogger.warn('Parser', '@ValidRange = ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList= [0])) + except: EdkLogger.warn('Parser', '@ValidRange Erro= rCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) - except: - EdkLogger.warn('Parser', '@ValidRange ErrorCod= e(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) - if not PatternValidRng.search(Expression): - EdkLogger.warn('Parser', '@ValidRange Expressi= on(%s) of PCD %s is incorrect format.' % (Expression, TokenList[0])) - if ValidFormt[0:10] =3D=3D '@ValidList': - ValidFormt =3D ValidFormt[10:] - ValidFormt =3D ValidFormt.lstrip() - try: - ErrorCode, Expression =3D ValidFormt.split('|'= , 1) - except ValueError: - ErrorCode =3D '0x0' - Expression =3D ValidFormt - ErrorCode, Expression =3D ErrorCode.strip(), Expre= ssion.strip() - try: - if not eval(ErrorCodeValid % ErrorCode): + if not PatternValidRng.search(Expression): + EdkLogger.warn('Parser', '@ValidRange Expr= ession(%s) of PCD %s is incorrect format.' % (Expression, TokenList[0])) + if ValidFormt[0:10] =3D=3D '@ValidList': + ValidFormt =3D ValidFormt[10:] + ValidFormt =3D ValidFormt.lstrip() + try: + ErrorCode, Expression =3D ValidFormt.split= ('|', 1) + except ValueError: + ErrorCode =3D '0x0' + Expression =3D ValidFormt + ErrorCode, Expression =3D ErrorCode.strip(), E= xpression.strip() + try: + if not eval(ErrorCodeValid % ErrorCode): + EdkLogger.warn('Parser', '@ValidList E= rrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[= 0])) + except: EdkLogger.warn('Parser', '@ValidList Error= Code(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) - except: - EdkLogger.warn('Parser', '@ValidList ErrorCode= (%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) - Values =3D Expression.split(',') - for Value in Values: - Value =3D Value.strip() + Values =3D Expression.split(',') + for Value in Values: + Value =3D Value.strip() + try: + eval(Value) + except: + EdkLogger.warn('Parser', '@ValidList E= xpression of PCD %s include a invalid value(%s).' % (TokenList[0], Value)) + break + if ValidFormt[0:11] =3D=3D '@Expression': + ValidFormt =3D ValidFormt[11:] + ValidFormt =3D ValidFormt.lstrip() try: - eval(Value) + ErrorCode, Expression =3D ValidFormt.split= ('|', 1) + except ValueError: + ErrorCode =3D '0x0' + Expression =3D ValidFormt + ErrorCode, Expression =3D ErrorCode.strip(), E= xpression.strip() + try: + if not eval(ErrorCodeValid % ErrorCode): + EdkLogger.warn('Parser', '@Expression = ErrorCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList= [0])) except: - EdkLogger.warn('Parser', '@ValidList Expre= ssion of PCD %s include a invalid value(%s).' % (TokenList[0], Value)) - break - if ValidFormt[0:11] =3D=3D '@Expression': - ValidFormt =3D ValidFormt[11:] - ValidFormt =3D ValidFormt.lstrip() - try: - ErrorCode, Expression =3D ValidFormt.split('|'= , 1) - except ValueError: - ErrorCode =3D '0x0' - Expression =3D ValidFormt - ErrorCode, Expression =3D ErrorCode.strip(), Expre= ssion.strip() - try: - if not eval(ErrorCodeValid % ErrorCode): EdkLogger.warn('Parser', '@Expression Erro= rCode(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) - except: - EdkLogger.warn('Parser', '@Expression ErrorCod= e(%s) of PCD %s is not valid UINT32 value.' % (ErrorCode, TokenList[0])) - if not Expression: - EdkLogger.warn('Parser', '@Expression Expressi= on of PCD %s is incorrect format.' % TokenList[0]) - if not Description: - EdkLogger.warn('Parser', 'PCD %s Description information i= s not provided.' % TokenList[0]) - if not Prompt: - EdkLogger.warn('Parser', 'PCD %s Prompt information is not= provided.' % TokenList[0]) - # check Description, Prompt localization information - if self._UniObj: - self._UniObj.CheckPcdInfo(TokenList[0]) - - if ValueList[0] in ['True', 'true', 'TRUE']: - ValueList[0] =3D '1' - elif ValueList[0] in ['False', 'false', 'FALSE']: - ValueList[0] =3D '0' - - self._ValueList[2] =3D ValueList[0].strip() + '|' + ValueList[1].s= trip() + '|' + ValueList[2].strip() + if not Expression: + EdkLogger.warn('Parser', '@Expression Expr= ession of PCD %s is incorrect format.' % TokenList[0]) + if not Description: + EdkLogger.warn('Parser', 'PCD %s Description informati= on is not provided.' % TokenList[0]) + if not Prompt: + EdkLogger.warn('Parser', 'PCD %s Prompt information is= not provided.' % TokenList[0]) + # check Description, Prompt localization information + if self._UniObj: + self._UniObj.CheckPcdInfo(TokenList[0]) + + if ValueList[0] in ['True', 'true', 'TRUE']: + ValueList[0] =3D '1' + elif ValueList[0] in ['False', 'false', 'FALSE']: + ValueList[0] =3D '0' + + self._ValueList[2] =3D ValueList[0].strip() + '|' + ValueList[= 1].strip() + '|' + ValueList[2].strip() =20 _SectionParser =3D { MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, --=20 2.14.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52970): https://edk2.groups.io/g/devel/message/52970 Mute This Topic: https://groups.io/mt/69498813/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B002497SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+ItMYAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAADQ4NDk2NUJG NjkwQjBBNDVCMkZDMTQ1QjE1ODBDOEU5ACcHAQ2ABAACAAAAAgACAAEFgAMADgAAAOQHAQAHAAkA GgA5AAIAUQEBIIADAA4AAADkBwEABwAJABoAOQACAFEBAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABADkAAABbUEFUQ0hdIEJhc2VUb29sczpmaXggRWNjIHRvb2wgaXNzdWUg Zm9yIGNoZWNrIFN0cnVjdFBjZADoEwELgAEAIQAAADQ4NDk2NUJGNjkwQjBBNDVCMkZDMTQ1QjE1 ODBDOEU5ACcHAQOQBgDEJQAANAAAAAIBfwABAAAASAAAADxGQUQwRDdFMEFFMEZBNTREOTg3RjZF NzI0MzVDQUZENTBCMDAyNDk3QFNIU01TWDEwMS5jY3IuY29ycC5pbnRlbC5jb20+AAsAHw4BAAAA AgEJEAEAAADDGwAAvxsAAL1sAABMWkZ1PnQQTWEACmZiaWQEAABjY8BwZzEyNTIA/gND8HRleHQB 9wKkA+MCAARjaArAc2V0MCDvB20CgwBQEU0yCoAGtAKAln0KgAjIOwliMTkOwL8JwxZyCjIWcQKA FWIqCbBzCfAEkGF0BbIOUANgc6JvAYAgRXgRwW4YMF0GUnYEkBe2AhByAMB0fQhQbhoxECAFwAWg G2RkmiADUiAQIheyXHYIkOR3awuAZDUdUwTwB0ANF3AwCnEX8mJrbWsGcwGQACAgQk1fQuBFR0lO fQr8AfEL8REfsFo6aAJAcHM6wC8vYnVnegMQC2AkLnQHMG5vBaFlLgEFsGcvc2hvd19BIlEuY2dp Pw3QPagyMTQOwGwLgGUKgaElFGdBZHYAcGMJgAxGZRiACHBlUGtnaFRvawnwUwqwJkBHgnUN0C5Q Y2RTBtCiaRkQVHlwCmBCKGFMSW4a5ChgbnwlBnsEMHgBQH18U01CAElPU19UQUJMgkUrMFlQRTB8 KnB+OB6gHpEeoAMwAAAlFCDZLUE8SCaABIFGAxAHkE4+LNktQCkgZHUfYHLceVMBkB3ACxEvKDAo 4pQuaCzaUADQa2EYMK0uPU0BACbhLzLULgWBfy5bJf8joDS/M5wqoCUMSUpmHMBoBJBlJwQgYQYg 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 6589b/8GHwcvCD883zCfCy8MPw1P/w5fD28QfxGPQa8TbxR/FY//S08bLxw/GYxPn1CvUb8dX/9T nzavV39a/zFPLj8kT8jv/2BPJz/MH2N/W78rP2MvZ7//XR/Tj2rvZM8yLzM/NE9fX/9xT1l/c289 3zovOz9BL3i//0MPRB9FKE7C/y8APwFPAl//Sh94H2C/7f+FT3nvev98D/99H34vfz+ATxGvhg+D v46f/4Yfhy+IP4lPil+Lb4x/jY9/kQ9UrZhQR8Bt4W9JXqQs/ieaX58+SIFiBEfRnFWQz/+if5w2 VgSYUW/vpa+b35zv/536pY+fj6CfqV+t36OPpJ//sQ9xv6yvtD+PunXSYhOwf/+3r4//tu+635Kv k7+UyWjo70cZR/CYQGWxYUfRl1SYI/+V8ph0mYptELZUtq/EX8UZcmJIMGFrw290b00NMb9OBUYo Tw/Lr1UvUjoxUw//z6/Mz1Y/NUfP/7JPoZ/Wn/+1v87f2c9sP2jvXj9fT98f/2FvYn/iT9qPZa/h /+aP2+//ae/pv+OfbR9uL28/3i/wH/+y3/I/dI91n3avd7/3j7uv/7y/lHPsCZVvln+Xj5ifma// 01/fn5CfBD/4z/nfve++///AD8Efwi/DOAPvxS/GOQ1v/8g/yU/KXBA/0I/NnxnfGH//Fd/SHxe/ 8J8bnx7f6z/n7//dPx3vAi/gryM/J1/kHyY//yqP548vHy2/H7/sD+0f7i//LU8cvyYvNj/z//UP 9h42f/8uPwYP+o/7n/yv/b/+z//f/zVvJE8DT0cvPD89Tz5fP2//QH9Bj0KfQ69Qvzdnp+hGT/9U D0hvSX9KhghfTEQJkeFgzcYwY0zAq3FtYRrwThJXTxtTHzdYRDAgY+7RdP9S31SvVb+UgUwFXQkK IVnUJ2HTTISoAG92GcBlZNdaP1tPN0lQ4VBtRi9er39fv2DHZpRiD2MfZC9nXSPoIGNoWZBrXPov wGqV6GxvYxmhemtlaxht3wMRVFaAbGYuX1VucGlPYmpm/1RGc8ouwkNvQlBjZElrEQubP23HdJ4R hE3gADWsAlsnPFRyTeCUcjFge3RUUvBVRSdddI+nF3qG5LHeMSl/c9B6D3sSRjgQVoCFlHJmgaZG QUxTfI+/fZ9+pClogz5zxIB4Mn6y+4B6MoYg9xDdwYmhgHgSkP+JL4d67q+Nz2WPUm+Nr5IP/2iP Vm9Xf1iPWZ9335EPXI//kH+ST5NfYI9hn2ufbK+ZD/9ln2aro6+dX55vam+g36Hv/6L/bm9vf3CP cZ+s/3N/pY//dV92b3d/s+az73nfeu97//+0L4RPfum9C4AvgT+CT79f/73PhTu4j4bfh++I/4oP yh/njC8AtzoKX1OXYTBRBvQJGjFcezoOTU9ERQBMX01FVEFfRKJB0gFIRUHRoFK0mAI60VJldGFG aWxuZQb0dACbEGbGwQb0LIeDNnUAxqUyLjE01rDDp+DGwGRvd3PWsMalGcalfX3D0NjAAB8AQgAB AAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AZQABAAAAKgAAAHoAaABpAGoAdQB4AC4A ZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwBkAAEAAAAKAAAAUwBNAFQAUAAAAAAAAgFB AAEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAA UwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAB8AAl0B AAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwDlXwEA AAAyAAAAcwBpAHAAOgB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAA AB8AGgwBAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AHwwBAAAAKgAAAHoAaABpAGoA dQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAeDAEAAAAKAAAAUwBNAFQAUAAA AAAAAgEZDAEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABpAGoA dQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAA AB8AAV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAA HwD4PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwAjQAEAAAAqAAAAegBoAGkAagB1 AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfACJAAQAAAAoAAABTAE0AVABQAAAA AAACAfk/AQAAAGQAAAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1 AFgAAABTAE0AVABQAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAA HwAJXQEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAL AEA6AQAAAB8AGgABAAAAEgAAAEkAUABNAC4ATgBvAHQAZQAAAAAAAwDxPwkEAAALAEA6AQAAAAMA /T/kBAAAAgELMAEAAAAQAAAASEllv2kLCkWy/BRbFYDI6QMAFwABAAAAQAA5AIDGNZs8xdUBQAAI MHMuVZs8xdUBHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAHgAAAGEAYwBjAGUAcAB0AGwAYQBuAGcA dQBhAGcAZQAAAAAAAQAAAAwAAABlAG4ALQBVAFMAAAAfADcAAQAAAHIAAABbAFAAQQBUAEMASABd ACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBmAGkAeAAgAEUAYwBjACAAdABvAG8AbAAgAGkAcwBzAHUA ZQAgAGYAbwByACAAYwBoAGUAYwBrACAAUwB0AHIAdQBjAHQAUABjAGQAAAAAAB8APQABAAAAAgAA AAAAAAADADYAAAAAAAIBcQABAAAAFgAAAAHVxTyaRukH620NmkVJgHOfeXCaopgAAB8AcAABAAAA cgAAAFsAUABBAFQAQwBIAF0AIABCAGEAcwBlAFQAbwBvAGwAcwA6AGYAaQB4ACAARQBjAGMAIAB0 AG8AbwBsACAAaQBzAHMAdQBlACAAZgBvAHIAIABjAGgAZQBjAGsAIABTAHQAcgB1AGMAdABQAGMA ZAAAAAAAHwA1EAEAAACQAAAAPABGAEEARAAwAEQANwBFADAAQQBFADAARgBBADUANABEADkAOAA3 AEYANgBFADcAMgA0ADMANQBDAEEARgBEADUAMABCADAAMAAyADQAOQA3AEAAUwBIAFMATQBTAFgA MQAwADEALgBjAGMAcgAuAGMAbwByAHAALgBpAG4AdABlAGwALgBjAG8AbQA+AAAAAwDeP59OAABA AAcw66hLmzzF1QECAQsAAQAAABAAAABISWW/aQsKRbL8FFsVgMjpAwAmAAAAAAACAUcAAQAAADIA AABjPVVTO2E9TUNJO3A9SW50ZWw7bD1TSFNNU1gxMDEtMjAwMTA3MDkyNjU3Wi01MDk3AAAAAgEQ MAEAAABGAAAAAAAAACZ3vTk77DhJpKYVPcule0IHAPrQ1+CuD6VNmH9uckNcr9UAAABEEV4AAKaT aDaIdmxLp0rT60eaTGQAAAlUwFUAAAAAHwD6PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBY AAAAAwAJWQEAAABAAACACCAGAAAAAADAAAAAAAAARgAAAAC/hQAAYKdImjzF1QELAACACCAGAAAA AADAAAAAAAAARgAAAACChQAAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAt AHAAcgBvAGQAdQBjAHQAAAABAAAAGgAAAGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACA hgMCAAAAAADAAAAAAAAARgEAAAAYAAAAZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABIAAAAx ADEALgAyAC4AMAAuADYAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwAcAAtAHIA ZQBhAGMAdABpAG8AbgAAAAAAAQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAIBAIAIIAYAAAAA AMAAAAAAAABGAQAAADYAAABJAG4AVAByAGEAbgBzAGkAdABNAGUAcwBzAGEAZwBlAEMAbwByAHIA ZQBsAGEAdABvAHIAAAAAAAEAAAAQAAAAy6UWecQMd0OO4VrOtO1HkgMADTT9PwAAHwAAgIYDAgAA AAAAwAAAAAAAAEYBAAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEAYwBoAAAAAQAAAAIA AAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBnAGkAbgBhAHQAaQBu AGcALQBpAHAAAAAAAAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4ANAAwAF0AAACdWg== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B002497SHSMSX101ccrcor_--