## Regular expression used to find out place holders in string template\r
gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
\r
+## regular expressions for map file processing\r
+startPatternGeneral = re.compile("^Start[' ']+Length[' ']+Name[' ']+Class")\r
+addressPatternGeneral = re.compile("^Address[' ']+Publics by Value[' ']+Rva\+Base")\r
+valuePatternGcc = re.compile('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$')\r
+pcdPatternGcc = re.compile('^([\da-fA-Fx]+) +([\da-fA-Fx]+)')\r
+secReGeneral = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
+\r
## Dictionary used to store file time stamp for quick re-access\r
gFileTimeStampCache = {} # {file path : file time stamp}\r
\r
if status == 1 and len(line) != 0:\r
for varname in varnames:\r
if varname in line:\r
+ # cannot pregenerate this RegEx since it uses varname from varnames.\r
m = re.match('^([\da-fA-FxX]+)([\s\S]*)([_]*%s)$' % varname, line)\r
if m is not None:\r
ret.append((varname, m.group(1)))\r
\r
# status handler\r
if status == 3:\r
- m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line)\r
+ m = valuePatternGcc.match(line)\r
if m is not None:\r
sections.append(m.groups(0))\r
for varname in varnames:\r
else:\r
Str = line[len(".data.%s" % varname):]\r
if Str:\r
- m = re.match('^([\da-fA-Fx]+) +([\da-fA-Fx]+)', Str.strip())\r
+ m = pcdPatternGcc.match(Str.strip())\r
if m is not None:\r
varoffset.append((varname, int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0]))\r
\r
status = 0 #0 - beginning of file; 1 - PE section definition; 2 - symbol table\r
secs = [] # key = section name\r
varoffset = []\r
- secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE)\r
\r
for line in lines:\r
line = line.strip()\r
- if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line):\r
+ if startPatternGeneral.match(line):\r
status = 1\r
continue\r
- if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line):\r
+ if addressPatternGeneral.match(line):\r
status = 2\r
continue\r
- if re.match("^entry point at", line):\r
+ if line.startswith("entry point at"):\r
status = 3\r
continue \r
if status == 1 and len(line) != 0:\r
- m = secRe.match(line)\r
+ m = secReGeneral.match(line)\r
assert m is not None, "Fail to parse the section in map file , line is %s" % line\r
sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0)\r
secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class])\r
sec_no = int(sec_no, 16)\r
sym_offset = int(sym_offset, 16)\r
vir_addr = int(vir_addr, 16)\r
+ # cannot pregenerate this RegEx since it uses varname from varnames.\r
m2 = re.match('^[_]*(%s)' % varname, sym_name)\r
if m2 is not None:\r
# fond a binary pcd entry in map file\r
if os.path.exists(File):\r
os.remove(File)\r
\r
-## callback routine for processing variable option\r
-#\r
-# This function can be used to process variable number of option values. The\r
-# typical usage of it is specify architecure list on command line.\r
-# (e.g. <tool> -a IA32 X64 IPF)\r
-#\r
-# @param Option Standard callback function parameter\r
-# @param OptionString Standard callback function parameter\r
-# @param Value Standard callback function parameter\r
-# @param Parser Standard callback function parameter\r
-#\r
-# @retval\r
-#\r
-def ProcessVariableArgument(Option, OptionString, Value, Parser):\r
- assert Value is None\r
- Value = []\r
- RawArgs = Parser.rargs\r
- while RawArgs:\r
- Arg = RawArgs[0]\r
- if (Arg[:2] == "--" and len(Arg) > 2) or \\r
- (Arg[:1] == "-" and len(Arg) > 1 and Arg[1] != "-"):\r
- break\r
- Value.append(Arg)\r
- del RawArgs[0]\r
- setattr(Parser.values, Option.dest, Value)\r
-\r
## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C structure style\r
#\r
# @param Guid The GUID string\r
os.chdir(CurrentDirectory)\r
os.rmdir(Directory)\r
\r
-## Check if given file is changed or not\r
-#\r
-# This method is used to check if a file is changed or not between two build\r
-# actions. It makes use a cache to store files timestamp.\r
-#\r
-# @param File The path of file\r
-#\r
-# @retval True If the given file is changed, doesn't exist, or can't be\r
-# found in timestamp cache\r
-# @retval False If the given file is changed\r
-#\r
-def IsChanged(File):\r
- if not os.path.exists(File):\r
- return True\r
-\r
- FileState = os.stat(File)\r
- TimeStamp = FileState[-2]\r
-\r
- if File in gFileTimeStampCache and TimeStamp == gFileTimeStampCache[File]:\r
- FileChanged = False\r
- else:\r
- FileChanged = True\r
- gFileTimeStampCache[File] = TimeStamp\r
-\r
- return FileChanged\r
-\r
## Store content in file\r
#\r
# This method is used to save file only when its content is changed. This is\r
return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath])\r
return None\r
\r
-## Get all files of a directory\r
-#\r
-# @param Root: Root dir\r
-# @param SkipList : The files need be skipped\r
-#\r
-# @retval A list of all files\r
-#\r
-def GetFiles(Root, SkipList=None, FullPath=True):\r
- OriPath = Root\r
- FileList = []\r
- for Root, Dirs, Files in os.walk(Root):\r
- if SkipList:\r
- for Item in SkipList:\r
- if Item in Dirs:\r
- Dirs.remove(Item)\r
-\r
- for File in Files:\r
- File = os.path.normpath(os.path.join(Root, File))\r
- if not FullPath:\r
- File = File[len(OriPath) + 1:]\r
- FileList.append(File)\r
-\r
- return FileList\r
-\r
-## Check if gvien file exists or not\r
-#\r
-# @param File File name or path to be checked\r
-# @param Dir The directory the file is relative to\r
-#\r
-# @retval True if file exists\r
-# @retval False if file doesn't exists\r
-#\r
-def ValidFile(File, Ext=None):\r
- if Ext is not None:\r
- Dummy, FileExt = os.path.splitext(File)\r
- if FileExt.lower() != Ext.lower():\r
- return False\r
- if not os.path.exists(File):\r
- return False\r
- return True\r
-\r
def RealPath(File, Dir='', OverrideDir=''):\r
NewFile = os.path.normpath(os.path.join(Dir, File))\r
NewFile = GlobalData.gAllFiles[NewFile]\r
\r
return None, None\r
\r
-## Check if gvien file exists or not\r
-#\r
-#\r
-def ValidFile2(AllFiles, File, Ext=None, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''):\r
- NewFile = File\r
- if Ext is not None:\r
- Dummy, FileExt = os.path.splitext(File)\r
- if FileExt.lower() != Ext.lower():\r
- return False, File\r
-\r
- # Replace the Edk macros\r
- if OverrideDir != '' and OverrideDir is not None:\r
- if OverrideDir.find('$(EFI_SOURCE)') > -1:\r
- OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource)\r
- if OverrideDir.find('$(EDK_SOURCE)') > -1:\r
- OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource)\r
-\r
- # Replace the default dir to current dir\r
- if Dir == '.':\r
- Dir = os.getcwd()\r
- Dir = Dir[len(Workspace) + 1:]\r
-\r
- # First check if File has Edk definition itself\r
- if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1:\r
- NewFile = File.replace('$(EFI_SOURCE)', EfiSource)\r
- NewFile = NewFile.replace('$(EDK_SOURCE)', EdkSource)\r
- NewFile = AllFiles[os.path.normpath(NewFile)]\r
- if NewFile is not None:\r
- return True, NewFile\r
-\r
- # Second check the path with override value\r
- if OverrideDir != '' and OverrideDir is not None:\r
- NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
- if NewFile is not None:\r
- return True, NewFile\r
-\r
- # Last check the path with normal definitions\r
- File = os.path.join(Dir, File)\r
- NewFile = AllFiles[os.path.normpath(File)]\r
- if NewFile is not None:\r
- return True, NewFile\r
-\r
- return False, File\r
-\r
-## Check if gvien file exists or not\r
-#\r
-#\r
-def ValidFile3(AllFiles, File, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''):\r
- # Replace the Edk macros\r
- if OverrideDir != '' and OverrideDir is not None:\r
- if OverrideDir.find('$(EFI_SOURCE)') > -1:\r
- OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource)\r
- if OverrideDir.find('$(EDK_SOURCE)') > -1:\r
- OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource)\r
-\r
- # Replace the default dir to current dir\r
- # Dir is current module dir related to workspace\r
- if Dir == '.':\r
- Dir = os.getcwd()\r
- Dir = Dir[len(Workspace) + 1:]\r
-\r
- NewFile = File\r
- RelaPath = AllFiles[os.path.normpath(Dir)]\r
- NewRelaPath = RelaPath\r
-\r
- while(True):\r
- # First check if File has Edk definition itself\r
- if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1:\r
- File = File.replace('$(EFI_SOURCE)', EfiSource)\r
- File = File.replace('$(EDK_SOURCE)', EdkSource)\r
- NewFile = AllFiles[os.path.normpath(File)]\r
- if NewFile is not None:\r
- NewRelaPath = os.path.dirname(NewFile)\r
- File = os.path.basename(NewFile)\r
- #NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1]\r
- break\r
-\r
- # Second check the path with override value\r
- if OverrideDir != '' and OverrideDir is not None:\r
- NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
- if NewFile is not None:\r
- #NewRelaPath = os.path.dirname(NewFile)\r
- NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1]\r
- break\r
-\r
- # Last check the path with normal definitions\r
- NewFile = AllFiles[os.path.normpath(os.path.join(Dir, File))]\r
- if NewFile is not None:\r
- break\r
-\r
- # No file found\r
- break\r
-\r
- return NewRelaPath, RelaPath, File\r
-\r
-\r
-def GetRelPath(Path1, Path2):\r
- FileName = os.path.basename(Path2)\r
- L1 = os.path.normpath(Path1).split(os.path.normpath('/'))\r
- L2 = os.path.normpath(Path2).split(os.path.normpath('/'))\r
- for Index in range(0, len(L1)):\r
- if L1[Index] != L2[Index]:\r
- FileName = '../' * (len(L1) - Index)\r
- for Index2 in range(Index, len(L2)):\r
- FileName = os.path.join(FileName, L2[Index2])\r
- break\r
- return os.path.normpath(FileName)\r
-\r
-\r
## Get GUID value from given packages\r
#\r
# @param CName The CName of the GUID\r
GuidKeys = P.Guids.keys()\r
if Inffile and P._PrivateGuids:\r
if not Inffile.startswith(P.MetaFile.Dir):\r
- GuidKeys = (dict.fromkeys(x for x in P.Guids if x not in P._PrivateGuids)).keys()\r
+ GuidKeys = [x for x in P.Guids if x not in P._PrivateGuids]\r
if CName in GuidKeys:\r
return P.Guids[CName]\r
return None\r
ProtocolKeys = P.Protocols.keys()\r
if Inffile and P._PrivateProtocols:\r
if not Inffile.startswith(P.MetaFile.Dir):\r
- ProtocolKeys = (dict.fromkeys(x for x in P.Protocols if x not in P._PrivateProtocols)).keys()\r
+ ProtocolKeys = [x for x in P.Protocols if x not in P._PrivateProtocols]\r
if CName in ProtocolKeys:\r
return P.Protocols[CName]\r
return None\r
PpiKeys = P.Ppis.keys()\r
if Inffile and P._PrivatePpis:\r
if not Inffile.startswith(P.MetaFile.Dir):\r
- PpiKeys = (dict.fromkeys(x for x in P.Ppis if x not in P._PrivatePpis)).keys()\r
+ PpiKeys = [x for x in P.Ppis if x not in P._PrivatePpis]\r
if CName in PpiKeys:\r
return P.Ppis[CName]\r
return None\r
keys |= self.data[Key].GetKeys(KeyIndex - 1)\r
return keys\r
\r
-## Boolean chain list\r
-#\r
-class Blist(UserList):\r
- def __init__(self, initlist=None):\r
- UserList.__init__(self, initlist)\r
- def __setitem__(self, i, item):\r
- if item not in [True, False]:\r
- if item == 0:\r
- item = False\r
- else:\r
- item = True\r
- self.data[i] = item\r
- def _GetResult(self):\r
- Value = True\r
- for item in self.data:\r
- Value &= item\r
- return Value\r
- Result = property(_GetResult)\r
-\r
-def ParseConsoleLog(Filename):\r
- Opr = open(os.path.normpath(Filename), 'r')\r
- Opw = open(os.path.normpath(Filename + '.New'), 'w+')\r
- for Line in Opr.readlines():\r
- if Line.find('.efi') > -1:\r
- Line = Line[Line.rfind(' ') : Line.rfind('.efi')].strip()\r
- Opw.write('%s\n' % Line)\r
-\r
- Opr.close()\r
- Opw.close()\r
-\r
def IsFieldValueAnArray (Value):\r
Value = Value.strip()\r
if Value.startswith('GUID') and Value.endswith(')'):\r
return FieldList\r
\r
def ParseDevPathValue (Value):\r
- DevPathList = [ "Path","HardwarePath","Pci","PcCard","MemoryMapped","VenHw","Ctrl","BMC","AcpiPath","Acpi","PciRoot",\r
- "PcieRoot","Floppy","Keyboard","Serial","ParallelPort","AcpiEx","AcpiExp","AcpiAdr","Msg","Ata","Scsi",\r
- "Fibre","FibreEx","I1394","USB","I2O","Infiniband","VenMsg","VenPcAnsi","VenVt100","VenVt100Plus",\r
- "VenUtf8","UartFlowCtrl","SAS","SasEx","NVMe","UFS","SD","eMMC","DebugPort","MAC","IPv4","IPv6","Uart",\r
- "UsbClass","UsbAudio","UsbCDCControl","UsbHID","UsbImage","UsbPrinter","UsbMassStorage","UsbHub",\r
- "UsbCDCData","UsbSmartCard","UsbVideo","UsbDiagnostic","UsbWireless","UsbDeviceFirmwareUpdate",\r
- "UsbIrdaBridge","UsbTestAndMeasurement","UsbWwid","Unit","iSCSI","Vlan","Uri","Bluetooth","Wi-Fi",\r
- "MediaPath","HD","CDROM","VenMedia","Media","Fv","FvFile","Offset","RamDisk","VirtualDisk","VirtualCD",\r
- "PersistentVirtualDisk","PersistentVirtualCD","BbsPath","BBS","Sata" ]\r
if '\\' in Value:\r
Value.replace('\\', '/').replace(' ', '')\r
- for Item in Value.split('/'):\r
- Key = Item.strip().split('(')[0]\r
- if Key not in DevPathList:\r
- pass\r
\r
Cmd = 'DevicePath ' + '"' + Value + '"'\r
try:\r
if type(Value) <> type(''):\r
raise BadExpression('Type %s is %s' %(Value, type(Value)))\r
Value = Value.strip()\r
- if Value.startswith('UINT8') and Value.endswith(')'):\r
+ if Value.startswith(TAB_UINT8) and Value.endswith(')'):\r
Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
if Size > 1:\r
raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
return Value, 1\r
- if Value.startswith('UINT16') and Value.endswith(')'):\r
+ if Value.startswith(TAB_UINT16) and Value.endswith(')'):\r
Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
if Size > 2:\r
raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
return Value, 2\r
- if Value.startswith('UINT32') and Value.endswith(')'):\r
+ if Value.startswith(TAB_UINT32) and Value.endswith(')'):\r
Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
if Size > 4:\r
raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
return Value, 4\r
- if Value.startswith('UINT64') and Value.endswith(')'):\r
+ if Value.startswith(TAB_UINT64) and Value.endswith(')'):\r
Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
if Size > 8:\r
raise BadExpression('Value (%s) Size larger than %d' % (Value, Size))\r
## AnalyzeDscPcd\r
#\r
# Analyze DSC PCD value, since there is no data type info in DSC\r
-# This fuction is used to match functions (AnalyzePcdData, AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from database\r
+# This fuction is used to match functions (AnalyzePcdData) used for retrieving PCD value from database\r
# 1. Feature flag: TokenSpace.PcdCName|PcdValue\r
# 2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize]\r
# 3. Dynamic default:\r
elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD):\r
VpdOffset = FieldList[0]\r
Value = Size = ''\r
- if not DataType == 'VOID*':\r
+ if not DataType == TAB_VOID:\r
if len(FieldList) > 1:\r
Value = FieldList[1]\r
else:\r
\r
return ValueList \r
\r
-## AnalyzeHiiPcdData\r
-#\r
-# Analyze the pcd Value, variable name, variable Guid and variable offset.\r
-# Used to avoid split issue while the value string contain "|" character\r
-#\r
-# @param[in] Setting: A String contain VariableName, VariableGuid, VariableOffset, DefaultValue information;\r
-# \r
-# @retval ValueList: A List contaian VariableName, VariableGuid, VariableOffset, DefaultValue. \r
-#\r
-def AnalyzeHiiPcdData(Setting):\r
- ValueList = ['', '', '', '']\r
-\r
- TokenList = GetSplitValueList(Setting)\r
- ValueList[0:len(TokenList)] = TokenList\r
-\r
- return ValueList\r
-\r
-## AnalyzeVpdPcdData\r
-#\r
-# Analyze the vpd pcd VpdOffset, MaxDatumSize and InitialValue.\r
-# Used to avoid split issue while the value string contain "|" character\r
-#\r
-# @param[in] Setting: A String contain VpdOffset/MaxDatumSize/InitialValue information;\r
-# \r
-# @retval ValueList: A List contain VpdOffset, MaxDatumSize and InitialValue. \r
-#\r
-def AnalyzeVpdPcdData(Setting):\r
- ValueList = ['', '', '']\r
-\r
- ValueRe = re.compile(r'\s*L?\".*\|.*\"\s*$')\r
- PtrValue = ValueRe.findall(Setting)\r
- \r
- ValueUpdateFlag = False\r
- \r
- if len(PtrValue) >= 1:\r
- Setting = re.sub(ValueRe, '', Setting)\r
- ValueUpdateFlag = True\r
-\r
- TokenList = Setting.split(TAB_VALUE_SPLIT)\r
- ValueList[0:len(TokenList)] = TokenList\r
- \r
- if ValueUpdateFlag:\r
- ValueList[2] = PtrValue[0]\r
- \r
- return ValueList \r
-\r
## check format of PCD value against its the datum type\r
#\r
# For PCD value setting\r
#\r
def CheckPcdDatum(Type, Value):\r
- if Type == "VOID*":\r
+ if Type == TAB_VOID:\r
ValueRe = re.compile(r'\s*L?\".*\"\s*$')\r
if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"'))\r
or (Value.startswith('{') and Value.endswith('}')) or (Value.startswith("L'") or Value.startswith("'") and Value.endswith("'"))\r
if not self.DefaultStores or "0" in self.DefaultStores:\r
return "0",TAB_DEFAULT_STORES_DEFAULT\r
else:\r
- minvalue = min([int(value_str) for value_str in self.DefaultStores.keys()])\r
+ minvalue = min([int(value_str) for value_str in self.DefaultStores])\r
return (str(minvalue), self.DefaultStores[str(minvalue)])\r
def GetMin(self,DefaultSIdList):\r
if not DefaultSIdList:\r
- return "STANDARD"\r
+ return TAB_DEFAULT_STORES_DEFAULT\r
storeidset = {storeid for storeid, storename in self.DefaultStores.values() if storename in DefaultSIdList}\r
if not storeidset:\r
return ""\r