From 47f15da16053f031bcf7c50f6960bd0f6c83d2db Mon Sep 17 00:00:00 2001 From: Hess Chen Date: Mon, 15 Oct 2018 16:29:09 +0800 Subject: [PATCH] BaseTools/EOT: Change to call a program instead of calling Python API. Update the EOT tool to call the program itself instead of calling the Python API when parsing FV images. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hess Chen Reviewed-by: Yonghong Zhu Acked-by: Jaben Carsey --- .../Source/Python/Eot/{Eot.py => EotMain.py} | 465 ++---------------- BaseTools/Source/Python/Eot/InfParserLite.py | 26 +- BaseTools/Source/Python/Eot/Parser.py | 28 +- BaseTools/Source/Python/Eot/Report.py | 6 +- BaseTools/Source/Python/build/BuildReport.py | 2 +- 5 files changed, 84 insertions(+), 443 deletions(-) rename BaseTools/Source/Python/Eot/{Eot.py => EotMain.py} (75%) diff --git a/BaseTools/Source/Python/Eot/Eot.py b/BaseTools/Source/Python/Eot/EotMain.py similarity index 75% rename from BaseTools/Source/Python/Eot/Eot.py rename to BaseTools/Source/Python/Eot/EotMain.py index ce83da1495..49a1494126 100644 --- a/BaseTools/Source/Python/Eot/Eot.py +++ b/BaseTools/Source/Python/Eot/EotMain.py @@ -17,18 +17,20 @@ from __future__ import absolute_import import Common.LongFilePathOs as os, time, glob import Common.EdkLogger as EdkLogger -from . import EotGlobalData +import Eot.EotGlobalData as EotGlobalData from optparse import OptionParser from Common.StringUtils import NormPath from Common import BuildToolError from Common.Misc import GuidStructureStringToGuidString, sdict -from .InfParserLite import * -from . import c -from . import Database +from Eot.Parser import * +from Eot.InfParserLite import EdkInfParser +from Common.StringUtils import GetSplitValueList +from Eot import c +from Eot import Database from array import array -from .Report import Report +from Eot.Report import Report from Common.BuildVersion import gBUILD_VERSION -from .Parser import ConvertGuid +from Eot.Parser import ConvertGuid from Common.LongFilePathSupport import OpenLongFilePath as open import struct import uuid @@ -58,14 +60,14 @@ class Image(array): self._SubImages = sdict() # {offset: Image()} - array.__init__(self, 'B') + array.__init__(self) def __repr__(self): return self._ID_ def __len__(self): Len = array.__len__(self) - for Offset in self._SubImages: + for Offset in self._SubImages.keys(): Len += len(self._SubImages[Offset]) return Len @@ -154,19 +156,11 @@ class CompressedImage(Image): def _GetSections(self): try: - from . import EfiCompressor - TmpData = EfiCompressor.FrameworkDecompress( - self[self._HEADER_SIZE_:], - len(self) - self._HEADER_SIZE_ - ) + TmpData = DeCompress('Efi', self[self._HEADER_SIZE_:]) DecData = array('B') DecData.fromstring(TmpData) except: - from . import EfiCompressor - TmpData = EfiCompressor.UefiDecompress( - self[self._HEADER_SIZE_:], - len(self) - self._HEADER_SIZE_ - ) + TmpData = DeCompress('Framework', self[self._HEADER_SIZE_:]) DecData = array('B') DecData.fromstring(TmpData) @@ -297,7 +291,7 @@ class Depex(Image): Expression = property(_GetExpression) -## FirmwareVolume() class +# # FirmwareVolume() class # # A class for Firmware Volume # @@ -308,12 +302,12 @@ class FirmwareVolume(Image): _FfsGuid = "8C8CE578-8A3D-4F1C-9935-896185C32DD3" - _GUID_ = struct.Struct("16x 1I2H8B") - _LENGTH_ = struct.Struct("16x 16x 1Q") - _SIG_ = struct.Struct("16x 16x 8x 1I") - _ATTR_ = struct.Struct("16x 16x 8x 4x 1I") - _HLEN_ = struct.Struct("16x 16x 8x 4x 4x 1H") - _CHECKSUM_ = struct.Struct("16x 16x 8x 4x 4x 2x 1H") + _GUID_ = struct.Struct("16x 1I2H8B") + _LENGTH_ = struct.Struct("16x 16x 1Q") + _SIG_ = struct.Struct("16x 16x 8x 1I") + _ATTR_ = struct.Struct("16x 16x 8x 4x 1I") + _HLEN_ = struct.Struct("16x 16x 8x 4x 4x 1H") + _CHECKSUM_ = struct.Struct("16x 16x 8x 4x 4x 2x 1H") def __init__(self, Name=''): Image.__init__(self) @@ -387,7 +381,7 @@ class FirmwareVolume(Image): DepexString = DepexList[0].strip() return (CouldBeLoaded, DepexString, FileDepex) - def Dispatch(self, Db = None): + def Dispatch(self, Db=None): if Db is None: return False self.UnDispatchedFfsDict = copy.copy(self.FfsDict) @@ -397,7 +391,7 @@ class FirmwareVolume(Image): FfsDxeCoreGuid = None FfsPeiPrioriGuid = None FfsDxePrioriGuid = None - for FfsID in self.UnDispatchedFfsDict: + for FfsID in self.UnDispatchedFfsDict.keys(): Ffs = self.UnDispatchedFfsDict[FfsID] if Ffs.Type == 0x03: FfsSecCoreGuid = FfsID @@ -439,6 +433,7 @@ class FirmwareVolume(Image): if GuidString in self.UnDispatchedFfsDict: self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) self.LoadPpi(Db, GuidString) + self.DisPatchPei(Db) # Parse DXE then @@ -460,6 +455,7 @@ class FirmwareVolume(Image): if GuidString in self.UnDispatchedFfsDict: self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) self.LoadProtocol(Db, GuidString) + self.DisPatchDxe(Db) def LoadProtocol(self, Db, ModuleGuid): @@ -501,7 +497,7 @@ class FirmwareVolume(Image): def DisPatchDxe(self, Db): IsInstalled = False ScheduleList = sdict() - for FfsID in self.UnDispatchedFfsDict: + for FfsID in self.UnDispatchedFfsDict.keys(): CouldBeLoaded = False DepexString = '' FileDepex = None @@ -548,7 +544,7 @@ class FirmwareVolume(Image): else: self.UnDispatchedFfsDict[FfsID].Depex = DepexString - for FfsID in ScheduleList: + for FfsID in ScheduleList.keys(): NewFfs = ScheduleList.pop(FfsID) FfsName = 'UnKnown' self.OrderedFfsDict[FfsID] = NewFfs @@ -560,12 +556,13 @@ class FirmwareVolume(Image): RecordSet = Db.TblReport.Exec(SqlCommand) if RecordSet != []: FfsName = RecordSet[0][0] + if IsInstalled: self.DisPatchDxe(Db) def DisPatchPei(self, Db): IsInstalled = False - for FfsID in self.UnDispatchedFfsDict: + for FfsID in self.UnDispatchedFfsDict.keys(): CouldBeLoaded = True DepexString = '' FileDepex = None @@ -576,7 +573,6 @@ class FirmwareVolume(Image): if Section.Type == 0x1B: CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Ppi') break - if Section.Type == 0x01: CompressSections = Section._SubImages[4] for CompressSection in CompressSections.Sections: @@ -603,11 +599,12 @@ class FirmwareVolume(Image): if IsInstalled: self.DisPatchPei(Db) + def __str__(self): global gIndention gIndention += 4 FvInfo = '\n' + ' ' * gIndention - FvInfo += "[FV:%s] file_system=%s size=%x checksum=%s\n" % (self.Name, self.FileSystemGuid, self.Size, self.Checksum) + FvInfo += "[FV:%s] file_system=%s size=%x checksum=%s\n" % (self.Name, self.FileSystemGuid, self.Size, self.Checksum) FfsInfo = "\n".join([str(self.FfsDict[FfsId]) for FfsId in self.FfsDict]) gIndention -= 4 return FvInfo + FfsInfo @@ -615,7 +612,7 @@ class FirmwareVolume(Image): def _Unpack(self): Size = self._LENGTH_.unpack_from(self._BUF_, self._OFF_)[0] self.empty() - self.extend(self._BUF_[self._OFF_:self._OFF_+Size]) + self.extend(self._BUF_[self._OFF_:self._OFF_ + Size]) # traverse the FFS EndOfFv = Size @@ -743,10 +740,9 @@ class GuidDefinedImage(Image): SectionList.append(Sec) elif Guid == self.TIANO_COMPRESS_GUID: try: - from . import EfiCompressor # skip the header Offset = self.DataOffset - 4 - TmpData = EfiCompressor.FrameworkDecompress(self[Offset:], len(self)-Offset) + TmpData = DeCompress('Framework', self[self.Offset:]) DecData = array('B') DecData.fromstring(TmpData) Offset = 0 @@ -764,10 +760,10 @@ class GuidDefinedImage(Image): pass elif Guid == self.LZMA_COMPRESS_GUID: try: - from . import LzmaCompressor # skip the header Offset = self.DataOffset - 4 - TmpData = LzmaCompressor.LzmaDecompress(self[Offset:], len(self)-Offset) + + TmpData = DeCompress('Lzma', self[self.Offset:]) DecData = array('B') DecData.fromstring(TmpData) Offset = 0 @@ -848,7 +844,7 @@ class Section(Image): SectionInfo += "[SECTION:%s] offset=%x size=%x" % (self._TypeName[self.Type], self._OFF_, self.Size) else: SectionInfo += "[SECTION:%x] offset=%x size=%x " % (self.Type, self._OFF_, self.Size) - for Offset in self._SubImages: + for Offset in self._SubImages.keys(): SectionInfo += ", " + str(self._SubImages[Offset]) gIndention -= 4 return SectionInfo @@ -982,7 +978,7 @@ class Ffs(Image): FfsInfo = Indention FfsInfo += "[FFS:%s] offset=%x size=%x guid=%s free_space=%x alignment=%s\n" % \ (Ffs._TypeName[self.Type], self._OFF_, self.Size, self.Guid, self.FreeSpace, self.Alignment) - SectionInfo = '\n'.join([str(self.Sections[Offset]) for Offset in self.Sections]) + SectionInfo = '\n'.join([str(self.Sections[Offset]) for Offset in self.Sections.keys()]) gIndention -= 4 return FfsInfo + SectionInfo + "\n" @@ -1087,379 +1083,6 @@ class Ffs(Image): Alignment = property(_GetAlignment) State = property(_GetState, _SetState) -## FirmwareVolume() class -# -# A class for Firmware Volume -# -class FirmwareVolume(Image): - # Read FvLength, Attributes, HeaderLength, Checksum - _HEADER_ = struct.Struct("16x 1I2H8B 1Q 4x 1I 1H 1H") - _HEADER_SIZE_ = _HEADER_.size - - _FfsGuid = "8C8CE578-8A3D-4F1C-9935-896185C32DD3" - - _GUID_ = struct.Struct("16x 1I2H8B") - _LENGTH_ = struct.Struct("16x 16x 1Q") - _SIG_ = struct.Struct("16x 16x 8x 1I") - _ATTR_ = struct.Struct("16x 16x 8x 4x 1I") - _HLEN_ = struct.Struct("16x 16x 8x 4x 4x 1H") - _CHECKSUM_ = struct.Struct("16x 16x 8x 4x 4x 2x 1H") - - def __init__(self, Name=''): - Image.__init__(self) - self.Name = Name - self.FfsDict = sdict() - self.OrderedFfsDict = sdict() - self.UnDispatchedFfsDict = sdict() - self.ProtocolList = sdict() - - def CheckArchProtocol(self): - for Item in EotGlobalData.gArchProtocolGuids: - if Item.lower() not in EotGlobalData.gProtocolList: - return False - return True - - def ParseDepex(self, Depex, Type): - List = None - if Type == 'Ppi': - List = EotGlobalData.gPpiList - if Type == 'Protocol': - List = EotGlobalData.gProtocolList - DepexStack = [] - DepexList = [] - DepexString = '' - FileDepex = None - CouldBeLoaded = True - for Index in range(0, len(Depex.Expression)): - Item = Depex.Expression[Index] - if Item == 0x00: - Index = Index + 1 - Guid = gGuidStringFormat % Depex.Expression[Index] - if Guid in self.OrderedFfsDict and Depex.Expression[Index + 1] == 0x08: - return (True, 'BEFORE %s' % Guid, [Guid, 'BEFORE']) - elif Item == 0x01: - Index = Index + 1 - Guid = gGuidStringFormat % Depex.Expression[Index] - if Guid in self.OrderedFfsDict and Depex.Expression[Index + 1] == 0x08: - return (True, 'AFTER %s' % Guid, [Guid, 'AFTER']) - elif Item == 0x02: - Index = Index + 1 - Guid = gGuidStringFormat % Depex.Expression[Index] - if Guid.lower() in List: - DepexStack.append(True) - DepexList.append(Guid) - else: - DepexStack.append(False) - DepexList.append(Guid) - continue - elif Item == 0x03 or Item == 0x04: - DepexStack.append(eval(str(DepexStack.pop()) + ' ' + Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexStack.pop()))) - DepexList.append(str(DepexList.pop()) + ' ' + Depex._OPCODE_STRING_[Item].upper() + ' ' + str(DepexList.pop())) - elif Item == 0x05: - DepexStack.append(eval(Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexStack.pop()))) - DepexList.append(Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexList.pop())) - elif Item == 0x06: - DepexStack.append(True) - DepexList.append('TRUE') - DepexString = DepexString + 'TRUE' + ' ' - elif Item == 0x07: - DepexStack.append(False) - DepexList.append('False') - DepexString = DepexString + 'FALSE' + ' ' - elif Item == 0x08: - if Index != len(Depex.Expression) - 1: - CouldBeLoaded = False - else: - CouldBeLoaded = DepexStack.pop() - else: - CouldBeLoaded = False - if DepexList != []: - DepexString = DepexList[0].strip() - return (CouldBeLoaded, DepexString, FileDepex) - - def Dispatch(self, Db = None): - if Db is None: - return False - self.UnDispatchedFfsDict = copy.copy(self.FfsDict) - # Find PeiCore, DexCore, PeiPriori, DxePriori first - FfsSecCoreGuid = None - FfsPeiCoreGuid = None - FfsDxeCoreGuid = None - FfsPeiPrioriGuid = None - FfsDxePrioriGuid = None - for FfsID in self.UnDispatchedFfsDict: - Ffs = self.UnDispatchedFfsDict[FfsID] - if Ffs.Type == 0x03: - FfsSecCoreGuid = FfsID - continue - if Ffs.Type == 0x04: - FfsPeiCoreGuid = FfsID - continue - if Ffs.Type == 0x05: - FfsDxeCoreGuid = FfsID - continue - if Ffs.Guid.lower() == gPeiAprioriFileNameGuid: - FfsPeiPrioriGuid = FfsID - continue - if Ffs.Guid.lower() == gAprioriGuid: - FfsDxePrioriGuid = FfsID - continue - - # Parse SEC_CORE first - if FfsSecCoreGuid is not None: - self.OrderedFfsDict[FfsSecCoreGuid] = self.UnDispatchedFfsDict.pop(FfsSecCoreGuid) - self.LoadPpi(Db, FfsSecCoreGuid) - - # Parse PEI first - if FfsPeiCoreGuid is not None: - self.OrderedFfsDict[FfsPeiCoreGuid] = self.UnDispatchedFfsDict.pop(FfsPeiCoreGuid) - self.LoadPpi(Db, FfsPeiCoreGuid) - if FfsPeiPrioriGuid is not None: - # Load PEIM described in priori file - FfsPeiPriori = self.UnDispatchedFfsDict.pop(FfsPeiPrioriGuid) - if len(FfsPeiPriori.Sections) == 1: - Section = FfsPeiPriori.Sections.popitem()[1] - if Section.Type == 0x19: - GuidStruct = struct.Struct('1I2H8B') - Start = 4 - while len(Section) > Start: - Guid = GuidStruct.unpack_from(Section[Start : Start + 16]) - GuidString = gGuidStringFormat % Guid - Start = Start + 16 - if GuidString in self.UnDispatchedFfsDict: - self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) - self.LoadPpi(Db, GuidString) - - self.DisPatchPei(Db) - - # Parse DXE then - if FfsDxeCoreGuid is not None: - self.OrderedFfsDict[FfsDxeCoreGuid] = self.UnDispatchedFfsDict.pop(FfsDxeCoreGuid) - self.LoadProtocol(Db, FfsDxeCoreGuid) - if FfsDxePrioriGuid is not None: - # Load PEIM described in priori file - FfsDxePriori = self.UnDispatchedFfsDict.pop(FfsDxePrioriGuid) - if len(FfsDxePriori.Sections) == 1: - Section = FfsDxePriori.Sections.popitem()[1] - if Section.Type == 0x19: - GuidStruct = struct.Struct('1I2H8B') - Start = 4 - while len(Section) > Start: - Guid = GuidStruct.unpack_from(Section[Start : Start + 16]) - GuidString = gGuidStringFormat % Guid - Start = Start + 16 - if GuidString in self.UnDispatchedFfsDict: - self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) - self.LoadProtocol(Db, GuidString) - - self.DisPatchDxe(Db) - - def LoadProtocol(self, Db, ModuleGuid): - SqlCommand = """select GuidValue from Report - where SourceFileFullPath in - (select Value1 from Inf where BelongsToFile = - (select BelongsToFile from Inf - where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s) - and Model = %s) - and ItemType = 'Protocol' and ItemMode = 'Produced'""" \ - % (ModuleGuid, 5001, 3007) - RecordSet = Db.TblReport.Exec(SqlCommand) - for Record in RecordSet: - SqlCommand = """select Value2 from Inf where BelongsToFile = - (select DISTINCT BelongsToFile from Inf - where Value1 = - (select SourceFileFullPath from Report - where GuidValue like '%s' and ItemMode = 'Callback')) - and Value1 = 'FILE_GUID'""" % Record[0] - CallBackSet = Db.TblReport.Exec(SqlCommand) - if CallBackSet != []: - EotGlobalData.gProtocolList[Record[0].lower()] = ModuleGuid - else: - EotGlobalData.gProtocolList[Record[0].lower()] = ModuleGuid - - def LoadPpi(self, Db, ModuleGuid): - SqlCommand = """select GuidValue from Report - where SourceFileFullPath in - (select Value1 from Inf where BelongsToFile = - (select BelongsToFile from Inf - where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s) - and Model = %s) - and ItemType = 'Ppi' and ItemMode = 'Produced'""" \ - % (ModuleGuid, 5001, 3007) - RecordSet = Db.TblReport.Exec(SqlCommand) - for Record in RecordSet: - EotGlobalData.gPpiList[Record[0].lower()] = ModuleGuid - - def DisPatchDxe(self, Db): - IsInstalled = False - ScheduleList = sdict() - for FfsID in self.UnDispatchedFfsDict: - CouldBeLoaded = False - DepexString = '' - FileDepex = None - Ffs = self.UnDispatchedFfsDict[FfsID] - if Ffs.Type == 0x07: - # Get Depex - IsFoundDepex = False - for Section in Ffs.Sections.values(): - # Find Depex - if Section.Type == 0x13: - IsFoundDepex = True - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Protocol') - break - if Section.Type == 0x01: - CompressSections = Section._SubImages[4] - for CompressSection in CompressSections.Sections: - if CompressSection.Type == 0x13: - IsFoundDepex = True - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(CompressSection._SubImages[4], 'Protocol') - break - if CompressSection.Type == 0x02: - NewSections = CompressSection._SubImages[4] - for NewSection in NewSections.Sections: - if NewSection.Type == 0x13: - IsFoundDepex = True - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(NewSection._SubImages[4], 'Protocol') - break - - # Not find Depex - if not IsFoundDepex: - CouldBeLoaded = self.CheckArchProtocol() - DepexString = '' - FileDepex = None - - # Append New Ffs - if CouldBeLoaded: - IsInstalled = True - NewFfs = self.UnDispatchedFfsDict.pop(FfsID) - NewFfs.Depex = DepexString - if FileDepex is not None: - ScheduleList.insert(FileDepex[1], FfsID, NewFfs, FileDepex[0]) - else: - ScheduleList[FfsID] = NewFfs - else: - self.UnDispatchedFfsDict[FfsID].Depex = DepexString - - for FfsID in ScheduleList: - NewFfs = ScheduleList.pop(FfsID) - FfsName = 'UnKnown' - self.OrderedFfsDict[FfsID] = NewFfs - self.LoadProtocol(Db, FfsID) - - SqlCommand = """select Value2 from Inf - where BelongsToFile = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s) - and Model = %s and Value1='BASE_NAME'""" % (FfsID, 5001, 5001) - RecordSet = Db.TblReport.Exec(SqlCommand) - if RecordSet != []: - FfsName = RecordSet[0][0] - - if IsInstalled: - self.DisPatchDxe(Db) - - def DisPatchPei(self, Db): - IsInstalled = False - for FfsID in self.UnDispatchedFfsDict: - CouldBeLoaded = True - DepexString = '' - FileDepex = None - Ffs = self.UnDispatchedFfsDict[FfsID] - if Ffs.Type == 0x06 or Ffs.Type == 0x08: - # Get Depex - for Section in Ffs.Sections.values(): - if Section.Type == 0x1B: - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Ppi') - break - if Section.Type == 0x01: - CompressSections = Section._SubImages[4] - for CompressSection in CompressSections.Sections: - if CompressSection.Type == 0x1B: - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(CompressSection._SubImages[4], 'Ppi') - break - if CompressSection.Type == 0x02: - NewSections = CompressSection._SubImages[4] - for NewSection in NewSections.Sections: - if NewSection.Type == 0x1B: - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(NewSection._SubImages[4], 'Ppi') - break - - # Append New Ffs - if CouldBeLoaded: - IsInstalled = True - NewFfs = self.UnDispatchedFfsDict.pop(FfsID) - NewFfs.Depex = DepexString - self.OrderedFfsDict[FfsID] = NewFfs - self.LoadPpi(Db, FfsID) - else: - self.UnDispatchedFfsDict[FfsID].Depex = DepexString - - if IsInstalled: - self.DisPatchPei(Db) - - - def __str__(self): - global gIndention - gIndention += 4 - FvInfo = '\n' + ' ' * gIndention - FvInfo += "[FV:%s] file_system=%s size=%x checksum=%s\n" % (self.Name, self.FileSystemGuid, self.Size, self.Checksum) - FfsInfo = "\n".join([str(self.FfsDict[FfsId]) for FfsId in self.FfsDict]) - gIndention -= 4 - return FvInfo + FfsInfo - - def _Unpack(self): - Size = self._LENGTH_.unpack_from(self._BUF_, self._OFF_)[0] - self.empty() - self.extend(self._BUF_[self._OFF_:self._OFF_+Size]) - - # traverse the FFS - EndOfFv = Size - FfsStartAddress = self.HeaderSize - LastFfsObj = None - while FfsStartAddress < EndOfFv: - FfsObj = Ffs() - FfsObj.frombuffer(self, FfsStartAddress) - FfsId = repr(FfsObj) - if ((self.Attributes & 0x00000800) != 0 and len(FfsObj) == 0xFFFFFF) \ - or ((self.Attributes & 0x00000800) == 0 and len(FfsObj) == 0): - if LastFfsObj is not None: - LastFfsObj.FreeSpace = EndOfFv - LastFfsObj._OFF_ - len(LastFfsObj) - else: - if FfsId in self.FfsDict: - EdkLogger.error("FV", 0, "Duplicate GUID in FFS", - ExtraData="\t%s @ %s\n\t%s @ %s" \ - % (FfsObj.Guid, FfsObj.Offset, - self.FfsDict[FfsId].Guid, self.FfsDict[FfsId].Offset)) - self.FfsDict[FfsId] = FfsObj - if LastFfsObj is not None: - LastFfsObj.FreeSpace = FfsStartAddress - LastFfsObj._OFF_ - len(LastFfsObj) - - FfsStartAddress += len(FfsObj) - # - # align to next 8-byte aligned address: A = (A + 8 - 1) & (~(8 - 1)) - # The next FFS must be at the latest next 8-byte aligned address - # - FfsStartAddress = (FfsStartAddress + 7) & (~7) - LastFfsObj = FfsObj - - def _GetAttributes(self): - return self.GetField(self._ATTR_, 0)[0] - - def _GetSize(self): - return self.GetField(self._LENGTH_, 0)[0] - - def _GetChecksum(self): - return self.GetField(self._CHECKSUM_, 0)[0] - - def _GetHeaderLength(self): - return self.GetField(self._HLEN_, 0)[0] - - def _GetFileSystemGuid(self): - return gGuidStringFormat % self.GetField(self._GUID_, 0) - - Attributes = property(_GetAttributes) - Size = property(_GetSize) - Checksum = property(_GetChecksum) - HeaderSize = property(_GetHeaderLength) - FileSystemGuid = property(_GetFileSystemGuid) ## MultipleFv() class # @@ -1470,8 +1093,10 @@ class MultipleFv(FirmwareVolume): FirmwareVolume.__init__(self) self.BasicInfo = [] for FvPath in FvList: + Fd = None FvName = os.path.splitext(os.path.split(FvPath)[1])[0] - Fd = open(FvPath, 'rb') + if FvPath.strip(): + Fd = open(FvPath, 'rb') Buf = array('B') try: Buf.fromfile(Fd, os.path.getsize(FvPath)) @@ -1632,8 +1257,9 @@ class Eot(object): Path = os.path.join(EotGlobalData.gWORKSPACE, GuidList) if os.path.isfile(Path): for Line in open(Path): - (GuidName, GuidValue) = Line.split() - EotGlobalData.gGuidDict[GuidName] = GuidValue + if Line.strip(): + (GuidName, GuidValue) = Line.split() + EotGlobalData.gGuidDict[GuidName] = GuidValue ## ConvertLogFile() method # @@ -1694,7 +1320,7 @@ class Eot(object): mCurrentSourceFileList = [] if SourceFileList: - sfl = open(SourceFileList, 'rb') + sfl = open(SourceFileList, 'r') for line in sfl: line = os.path.normpath(os.path.join(EotGlobalData.gWORKSPACE, line.strip())) if line[-2:].upper() == '.C' or line[-2:].upper() == '.H': @@ -1970,6 +1596,8 @@ class Eot(object): def BuildMetaDataFileDatabase(self, Inf_Files): EdkLogger.quiet("Building database for meta data files ...") for InfFile in Inf_Files: + if not InfFile: + continue EdkLogger.quiet("Parsing %s ..." % str(InfFile)) EdkInfParser(InfFile, EotGlobalData.gDb, Inf_Files[InfFile], '') @@ -2083,7 +1711,10 @@ if __name__ == '__main__': EdkLogger.quiet(time.strftime("%H:%M:%S, %b.%d %Y ", time.localtime()) + "[00:00]" + "\n") StartTime = time.clock() - Eot = Eot() + Eot = Eot(CommandLineOption=False, + SourceFileList=r'C:\TestEot\Source.txt', + GuidList=r'C:\TestEot\Guid.txt', + FvFileList=r'C:\TestEot\FVRECOVERY.Fv') FinishTime = time.clock() BuildDuration = time.strftime("%M:%S", time.gmtime(int(round(FinishTime - StartTime)))) diff --git a/BaseTools/Source/Python/Eot/InfParserLite.py b/BaseTools/Source/Python/Eot/InfParserLite.py index 88d7e7d58e..c910c129a7 100644 --- a/BaseTools/Source/Python/Eot/InfParserLite.py +++ b/BaseTools/Source/Python/Eot/InfParserLite.py @@ -1,7 +1,7 @@ ## @file # This file is used to parse INF file of EDK project # -# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -22,8 +22,9 @@ from Common.DataType import * from CommonDataClass.DataClass import * from Common.Identification import * from Common.StringUtils import * -from .Parser import * -from . import Database +from Eot.Parser import * +from Eot import Database +from Eot import EotGlobalData ## EdkInfParser() class # @@ -153,21 +154,4 @@ class EdkInfParser(object): self.ParserSource(CurrentSection, SectionItemList, ArchList, ThirdList) #End of For -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - EdkLogger.Initialize() - EdkLogger.SetLevel(EdkLogger.QUIET) - - Db = Database.Database('Inf.db') - Db.InitDatabase() - P = EdkInfParser(os.path.normpath("C:\Framework\Edk\Sample\Platform\Nt32\Dxe\PlatformBds\PlatformBds.inf"), Db, '', '') - for Inf in P.Sources: - print(Inf) - for Item in P.Macros: - print(Item, P.Macros[Item]) - - Db.Close() + diff --git a/BaseTools/Source/Python/Eot/Parser.py b/BaseTools/Source/Python/Eot/Parser.py index e01a9770be..673088d41d 100644 --- a/BaseTools/Source/Python/Eot/Parser.py +++ b/BaseTools/Source/Python/Eot/Parser.py @@ -2,7 +2,7 @@ # This file is used to define common parsing related functions used in parsing # Inf/Dsc/Makefile process # -# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -25,6 +25,32 @@ from . import EotGlobalData from Common.StringUtils import GetSplitList from Common.LongFilePathSupport import OpenLongFilePath as open +import subprocess + +## DeCompress +# +# Call external decompress tool to decompress the fv section +# +def DeCompress(Method, Input): + # Write the input to a temp file + open('_Temp.bin', 'wb').write(Input) + cmd = '' + if Method == 'Lzma': + cmd = r'LzmaCompress -o _New.bin -d _Temp.bin' + if Method == 'Efi': + cmd = r'TianoCompress -d --uefi -o _New.bin _Temp.bin' + if Method == 'Framework': + cmd = r'TianoCompress -d -o _New.bin _Temp.bin' + + # Call tool to create the decompressed output file + Process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + Process.communicate()[0] + + # Return the beffer of New.bin + if os.path.exists('_New.bin'): + return open('_New.bin', 'rb').read() + + ## PreProcess() method # # Pre process a file diff --git a/BaseTools/Source/Python/Eot/Report.py b/BaseTools/Source/Python/Eot/Report.py index 4ddddb1034..01ad86ad3e 100644 --- a/BaseTools/Source/Python/Eot/Report.py +++ b/BaseTools/Source/Python/Eot/Report.py @@ -77,7 +77,7 @@ class Report(object): def GenerateUnDispatchedList(self): FvObj = self.FvObj EotGlobalData.gOP_UN_DISPATCHED.write('%s\n' % FvObj.Name) - for Item in FvObj.UnDispatchedFfsDict: + for Item in FvObj.UnDispatchedFfsDict.keys(): EotGlobalData.gOP_UN_DISPATCHED.write('%s\n' % FvObj.UnDispatchedFfsDict[Item]) ## GenerateFv() method @@ -112,7 +112,7 @@ class Report(object): self.WriteLn(Content) EotGlobalData.gOP_DISPATCH_ORDER.write('Dispatched:\n') - for FfsId in FvObj.OrderedFfsDict: + for FfsId in FvObj.OrderedFfsDict.keys(): self.GenerateFfs(FvObj.OrderedFfsDict[FfsId]) Content = """ """ @@ -125,7 +125,7 @@ class Report(object): self.WriteLn(Content) EotGlobalData.gOP_DISPATCH_ORDER.write('\nUnDispatched:\n') - for FfsId in FvObj.UnDispatchedFfsDict: + for FfsId in FvObj.UnDispatchedFfsDict.keys(): self.GenerateFfs(FvObj.UnDispatchedFfsDict[FfsId]) Content = """ """ diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index 50db503780..14143b3396 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -1626,7 +1626,7 @@ class PredictionReport(object): TempFile.close() try: - from Eot.Eot import Eot + from Eot.EotMain import Eot # # Invoke EOT tool and echo its runtime performance -- 2.39.2