> -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > Yonghong Zhu > Sent: Monday, October 15, 2018 3:24 AM > To: edk2-devel@lists.01.org > Cc: Chen, Hesheng <hesheng.c...@intel.com> > Subject: [edk2] [PATCH] BaseTools/EOT: Change to call a program instead of > calling Python API. > > From: hchen30 <hesheng.c...@intel.com> > > Update the EOT tool to call the program itself instead of calling the Python > API when parsing FV images.
Why do we prefer to launch the separate python program instead of calling the APIs? > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Hess Chen <hesheng.c...@intel.com> > --- > BaseTools/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<unknown>] 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.<BR> > +# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR> > # 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.<BR> > +# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR> > # 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 = """ </table></td> > </tr>""" > @@ -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 = """ </table></td> > </tr>""" > 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.14.2.windows.2 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel