import OptionRom\r
import OptRomInfStatement\r
import OptRomFileStatement\r
+import string\r
\r
from GenFdsGlobalVariable import GenFdsGlobalVariable\r
from Common.BuildToolError import *\r
import Common.GlobalData as GlobalData\r
from Common.Expression import *\r
from Common import GlobalData\r
+from Common.DataType import *\r
from Common.String import ReplaceMacro\r
import uuid\r
from Common.Misc import tdict\r
from Capsule import EFI_CERT_TYPE_PKCS7_GUID\r
from Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID\r
from Common.RangeExpression import RangeExpression\r
-from Common.FdfParserLite import FileExtensionPattern\r
\r
##define T_CHAR_SPACE ' '\r
##define T_CHAR_NULL '\0'\r
RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")\r
RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*$")\r
ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")\r
+BaseAddrValuePattern = re.compile('^0[xX][0-9a-fA-F]+')\r
+FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
+TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
\r
AllIncludeFileList = []\r
\r
if GenFdsGlobalVariable.WorkSpaceDir == '':\r
GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE")\r
\r
- ## __IsWhiteSpace() method\r
- #\r
- # Whether char at current FileBufferPos is whitespace\r
- #\r
- # @param self The object pointer\r
- # @param Char The char to test\r
- # @retval True The char is a kind of white space\r
- # @retval False The char is NOT a kind of white space\r
- #\r
- def __IsWhiteSpace(self, Char):\r
- if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
- return True\r
- else:\r
- return False\r
-\r
## __SkipWhiteSpace() method\r
#\r
# Skip white spaces from current char, return number of chars skipped\r
if Item == '' or Item == 'RULE':\r
return\r
\r
- if Item == 'DEFINES':\r
- self.__CurSection = ['COMMON', 'COMMON', 'COMMON']\r
+ if Item == TAB_COMMON_DEFINES.upper():\r
+ self.__CurSection = [TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
elif Item == 'VTF' and len(ItemList) == 3:\r
UiName = ItemList[2]\r
Pos = UiName.find(',')\r
UiName = UiName[:Pos]\r
self.__CurSection = ['VTF', UiName, ItemList[1]]\r
elif len(ItemList) > 1:\r
- self.__CurSection = [ItemList[0], ItemList[1], 'COMMON']\r
+ self.__CurSection = [ItemList[0], ItemList[1], TAB_COMMON]\r
elif len(ItemList) > 0:\r
- self.__CurSection = [ItemList[0], 'DUMMY', 'COMMON']\r
+ self.__CurSection = [ItemList[0], 'DUMMY', TAB_COMMON]\r
\r
## PreprocessFile() method\r
#\r
# Preprocess done.\r
self.Rewind()\r
\r
- def __GetIfListCurrentItemStat(self, IfList):\r
+ @staticmethod\r
+ def __GetIfListCurrentItemStat(IfList):\r
if len(IfList) == 0:\r
return True\r
\r
\r
if self.__CurSection:\r
# Defines macro\r
- ScopeMacro = self.__MacroDict['COMMON', 'COMMON', 'COMMON']\r
+ ScopeMacro = self.__MacroDict[TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
if ScopeMacro:\r
MacroDict.update(ScopeMacro)\r
\r
self.__UndoToken()\r
return False\r
\r
- def __Verify(self, Name, Value, Scope):\r
- if Scope in ['UINT64', 'UINT8']:\r
+ @staticmethod\r
+ def __Verify(Name, Value, Scope):\r
+ if Scope in [TAB_UINT64, TAB_UINT8]:\r
ValueNumber = 0\r
try:\r
ValueNumber = int (Value, 0)\r
EdkLogger.error("FdfParser", FORMAT_INVALID, "The value is not valid dec or hex number for %s." % Name)\r
if ValueNumber < 0:\r
EdkLogger.error("FdfParser", FORMAT_INVALID, "The value can't be set to negative value for %s." % Name)\r
- if Scope == 'UINT64':\r
+ if Scope == TAB_UINT64:\r
if ValueNumber >= 0x10000000000000000:\r
EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
- if Scope == 'UINT8':\r
+ if Scope == TAB_UINT8:\r
if ValueNumber >= 0x100:\r
EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
return True\r
\r
self.__GetOneChar()\r
\r
- ## __HexDigit() method\r
- #\r
- # Whether char input is a Hex data bit\r
- #\r
- # @param self The object pointer\r
- # @param TempChar The char to test\r
- # @retval True The char is a Hex data bit\r
- # @retval False The char is NOT a Hex data bit\r
- #\r
- def __HexDigit(self, TempChar):\r
- if (TempChar >= 'a' and TempChar <= 'f') or (TempChar >= 'A' and TempChar <= 'F') \\r
- or (TempChar >= '0' and TempChar <= '9'):\r
- return True\r
- else:\r
- return False\r
-\r
def __IsHex(self, HexStr):\r
if not HexStr.upper().startswith("0X"):\r
return False\r
if len(self.__Token) <= 2:\r
return False\r
- charList = [c for c in HexStr[2 : ] if not self.__HexDigit( c)]\r
- if len(charList) == 0:\r
- return True\r
- else:\r
- return False\r
+ return True if all(x in string.hexdigits for x in HexStr[2:]) else False\r
+\r
## __GetNextHexNumber() method\r
#\r
# Get next HEX data before a seperator\r
self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
\r
while True:\r
- isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
+ isInf = self.__GetInfStatement(FvObj)\r
isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
if not isInf and not isFile:\r
break\r
if not self.__GetNextToken():\r
raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
\r
- IsValidBaseAddrValue = re.compile('^0[x|X][0-9a-fA-F]+')\r
-\r
- if not IsValidBaseAddrValue.match(self.__Token.upper()):\r
+ if not BaseAddrValuePattern.match(self.__Token.upper()):\r
raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
Obj.FvBaseAddress = self.__Token\r
return True \r
MacroDict.update(AprSectionObj.DefineVarDict)\r
\r
while True:\r
- IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)\r
+ IsInf = self.__GetInfStatement(AprSectionObj)\r
IsFile = self.__GetFileStatement( AprSectionObj)\r
if not IsInf and not IsFile:\r
break\r
#\r
# @param self The object pointer\r
# @param Obj for whom inf statement is got\r
- # @param MacroDict dictionary used to replace macro\r
# @retval True Successfully find inf statement\r
# @retval False Not able to find inf statement\r
#\r
- def __GetInfStatement(self, Obj, ForCapsule=False, MacroDict={}):\r
+ def __GetInfStatement(self, Obj, ForCapsule=False):\r
ffsInf = self.__ParseInfStatement()\r
if not ffsInf:\r
return False\r
#\r
# Check whether reloc strip flag can be set for a file type.\r
#\r
- # @param self The object pointer\r
# @param FileType The file type to check with\r
# @retval True This type could have relocation strip flag\r
# @retval False No way to have it\r
#\r
-\r
- def __FileCouldHaveRelocFlag (self, FileType):\r
+ @staticmethod\r
+ def __FileCouldHaveRelocFlag (FileType):\r
if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
return True\r
else:\r
#\r
# Check whether reloc strip flag can be set for a section type.\r
#\r
- # @param self The object pointer\r
# @param SectionType The section type to check with\r
# @retval True This type could have relocation strip flag\r
# @retval False No way to have it\r
#\r
-\r
- def __SectionCouldHaveRelocFlag (self, SectionType):\r
+ @staticmethod\r
+ def __SectionCouldHaveRelocFlag (SectionType):\r
if SectionType in ('TE', 'PE32'):\r
return True\r
else:\r
def __GetFileOpts(self, FfsFileObj):\r
\r
if self.__GetNextToken():\r
- Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
- if Pattern.match(self.__Token):\r
+ if TokenFindPattern.match(self.__Token):\r
FfsFileObj.KeyStringList.append(self.__Token)\r
if self.__IsToken(","):\r
while self.__GetNextToken():\r
- if not Pattern.match(self.__Token):\r
+ if not TokenFindPattern.match(self.__Token):\r
raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
FfsFileObj.KeyStringList.append(self.__Token)\r
\r
self.__GetAprioriSection(FvObj, MacroDict.copy())\r
\r
while True:\r
- IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
+ IsInf = self.__GetInfStatement(FvObj)\r
IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
if not IsInf and not IsFile:\r
break\r
raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
Value = self.__Token\r
if Name == 'IMAGE_HEADER_INIT_VERSION':\r
- if self.__Verify(Name, Value, 'UINT8'):\r
+ if FdfParser.__Verify(Name, Value, 'UINT8'):\r
FmpData.Version = Value\r
elif Name == 'IMAGE_INDEX':\r
- if self.__Verify(Name, Value, 'UINT8'):\r
+ if FdfParser.__Verify(Name, Value, 'UINT8'):\r
FmpData.ImageIndex = Value\r
elif Name == 'HARDWARE_INSTANCE':\r
- if self.__Verify(Name, Value, 'UINT8'):\r
+ if FdfParser.__Verify(Name, Value, 'UINT8'):\r
FmpData.HardwareInstance = Value\r
elif Name == 'MONOTONIC_COUNT':\r
- if self.__Verify(Name, Value, 'UINT64'):\r
+ if FdfParser.__Verify(Name, Value, 'UINT64'):\r
FmpData.MonotonicCount = Value\r
if FmpData.MonotonicCount.upper().startswith('0X'):\r
FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
if not self.__GetNextToken():\r
raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
\r
- if self.__Token.upper() not in self.Profile.FvDict.keys():\r
+ if self.__Token.upper() not in self.Profile.FvDict:\r
raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
\r
CapsuleFv = CapsuleData.CapsuleFv()\r
if not self.__GetNextToken():\r
raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
\r
- if self.__Token.upper() not in self.Profile.FdDict.keys():\r
+ if self.__Token.upper() not in self.Profile.FdDict:\r
raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
\r
CapsuleFd = CapsuleData.CapsuleFd()\r
raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
\r
Arch = self.__SkippedChars.rstrip(".")\r
- if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):\r
+ if Arch.upper() not in ARCH_LIST_FULL:\r
raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
\r
ModuleType = self.__GetModuleType()\r
\r
KeyStringList = []\r
if self.__GetNextToken():\r
- Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
- if Pattern.match(self.__Token):\r
+ if TokenFindPattern.match(self.__Token):\r
KeyStringList.append(self.__Token)\r
if self.__IsToken(","):\r
while self.__GetNextToken():\r
- if not Pattern.match(self.__Token):\r
+ if not TokenFindPattern.match(self.__Token):\r
raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
KeyStringList.append(self.__Token)\r
\r
#\r
# Get whether a section could be optional\r
#\r
- # @param self The object pointer\r
# @param SectionType The section type to check\r
# @retval True section could be optional\r
# @retval False section never optional\r
#\r
- def __RuleSectionCouldBeOptional(self, SectionType):\r
+ @staticmethod\r
+ def __RuleSectionCouldBeOptional(SectionType):\r
if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
return True\r
else:\r
#\r
# Get whether a section could have build number information\r
#\r
- # @param self The object pointer\r
# @param SectionType The section type to check\r
# @retval True section could have build number information\r
# @retval False section never have build number information\r
#\r
- def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
+ @staticmethod\r
+ def __RuleSectionCouldHaveBuildNum(SectionType):\r
if SectionType in ("VERSION"):\r
return True\r
else:\r
#\r
# Get whether a section could have string\r
#\r
- # @param self The object pointer\r
# @param SectionType The section type to check\r
# @retval True section could have string\r
# @retval False section never have string\r
#\r
- def __RuleSectionCouldHaveString(self, SectionType):\r
+ @staticmethod\r
+ def __RuleSectionCouldHaveString(SectionType):\r
if SectionType in ("UI", "VERSION"):\r
return True\r
else:\r
raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
- not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
+ not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:\r
raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
CompStatementObj.CompType = self.__Token\r
\r
def __GetCapInFd (self, FdName):\r
\r
CapList = []\r
- if FdName.upper() in self.Profile.FdDict.keys():\r
+ if FdName.upper() in self.Profile.FdDict:\r
FdObj = self.Profile.FdDict[FdName.upper()]\r
for elementRegion in FdObj.RegionList:\r
if elementRegion.RegionType == 'CAPSULE':\r
def __GetFvInFd (self, FdName):\r
\r
FvList = []\r
- if FdName.upper() in self.Profile.FdDict.keys():\r
+ if FdName.upper() in self.Profile.FdDict:\r
FdObj = self.Profile.FdDict[FdName.upper()]\r
for elementRegion in FdObj.RegionList:\r
if elementRegion.RegionType == 'FV':\r
# Check the cycle between FV and FD image\r
#\r
MaxLength = len (self.Profile.FvDict)\r
- for FvName in self.Profile.FvDict.keys():\r
+ for FvName in self.Profile.FvDict:\r
LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
RefFvStack = []\r
RefFvStack.append(FvName)\r
while RefFvStack != [] and Index < MaxLength:\r
Index = Index + 1\r
FvNameFromStack = RefFvStack.pop()\r
- if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
+ if FvNameFromStack.upper() in self.Profile.FvDict:\r
FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
else:\r
continue\r
# Check the cycle between Capsule and FD image\r
#\r
MaxLength = len (self.Profile.CapsuleDict)\r
- for CapName in self.Profile.CapsuleDict.keys():\r
+ for CapName in self.Profile.CapsuleDict:\r
#\r
# Capsule image to be checked.\r
#\r
while RefCapStack != [] and Index < MaxLength:\r
Index = Index + 1\r
CapNameFromStack = RefCapStack.pop()\r
- if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
+ if CapNameFromStack.upper() in self.Profile.CapsuleDict:\r
CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
else:\r
continue\r
if RefFvName in FvAnalyzedList:\r
continue\r
LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
- if RefFvName.upper() in self.Profile.FvDict.keys():\r
+ if RefFvName.upper() in self.Profile.FvDict:\r
FvObj = self.Profile.FvDict[RefFvName.upper()]\r
else:\r
continue\r