From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.151, mailfrom: zhijux.fan@intel.com) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by groups.io with SMTP; Tue, 28 May 2019 22:29:39 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 May 2019 22:29:38 -0700 X-ExtLoop1: 1 Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga004.jf.intel.com with ESMTP; 28 May 2019 22:29:38 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 28 May 2019 22:29:37 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.6]) with mapi id 14.03.0415.000; Wed, 29 May 2019 13:29:36 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH V5] BaseTools:Make BaseTools support new rules to generate RAW FFS FILE Thread-Topic: [PATCH V5] BaseTools:Make BaseTools support new rules to generate RAW FFS FILE Thread-Index: AdUV338Ca0P0rxYRQIiCRwHh/8O6mQ== Date: Wed, 29 May 2019 05:29:34 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: zhijux.fan@intel.com X-Groupsio-MsgNum: 41571 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF63160SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF63160SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1765 If RAW FFS File Rule has no section for its data.For RAW FFS File, directly call GenFfs tool to generate FFS file. Ffs Rule: [Rule.Common.USER_DEFINED.MicroCode] FILE RAW =3D $(NAMED_GUID) { $(INF_OUTPUT)/$(MODULE_NAME).bin } [Rule.Common.USER_DEFINED.LOGO] FILE RAW =3D $(NAMED_GUID) { |.bmp } As shown in the rule above,if SectionType and FileType not defined, FFS files are generated directly, and no other type of file is generated. The patch is to make the BaseTools support these two rules Cc: Bob Feng Cc: Liming Gao Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/Common/DataType.py | 1 + BaseTools/Source/Python/GenFds/EfiSection.py | 22 +++++++++++++++++++= ++- BaseTools/Source/Python/GenFds/FdfParser.py | 14 ++++++++++++-- BaseTools/Source/Python/GenFds/FfsInfStatement.py | 9 ++++++--- BaseTools/Source/Python/GenFds/Section.py | 7 ++++++- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/= Python/Common/DataType.py index 7cd67bc01a..83ec36c235 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -122,6 +122,7 @@ BINARY_FILE_TYPE_VER =3D 'VER' BINARY_FILE_TYPE_UI =3D 'UI' BINARY_FILE_TYPE_BIN =3D 'BIN' BINARY_FILE_TYPE_FV =3D 'FV' +BINARY_FILE_TYPE_RAW =3D 'RAW_BINARY' =20 PLATFORM_COMPONENT_TYPE_LIBRARY_CLASS =3D 'LIBRARY_CLASS' PLATFORM_COMPONENT_TYPE_MODULE =3D 'MODULE' diff --git a/BaseTools/Source/Python/GenFds/EfiSection.py b/BaseTools/Sourc= e/Python/GenFds/EfiSection.py index 302f244faf..74f176cfef 100644 --- a/BaseTools/Source/Python/GenFds/EfiSection.py +++ b/BaseTools/Source/Python/GenFds/EfiSection.py @@ -93,7 +93,7 @@ class EfiSection (EfiSectionClassObject): if '.depex' in SuffixMap: FileList.append(Filename) else: - FileList, IsSect =3D Section.Section.GetFileList(FfsInf, self.= FileType, self.FileExtension, Dict, IsMakefile=3DIsMakefile) + FileList, IsSect =3D Section.Section.GetFileList(FfsInf, self.= FileType, self.FileExtension, Dict, IsMakefile=3DIsMakefile, SectionType=3D= SectionType) if IsSect : return FileList, self.Alignment =20 @@ -217,6 +217,26 @@ class EfiSection (EfiSectionClassObject): Ui=3DStringData, IsMa= kefile=3DIsMakefile) OutputFileList.append(OutputFile) =20 + # + # If Section Type is BINARY_FILE_TYPE_RAW + # + elif SectionType =3D=3D BINARY_FILE_TYPE_RAW: + """If File List is empty""" + if FileList =3D=3D []: + if self.Optional =3D=3D True: + GenFdsGlobalVariable.VerboseLogger("Optional Section d= on't exist!") + return [], None + else: + EdkLogger.error("GenFds", GENFDS_ERROR, "Output file f= or %s section could not be found for %s" % (SectionType, InfFileName)) + + elif len(FileList) > 1: + EdkLogger.error("GenFds", GENFDS_ERROR, + "Files suffixed with %s are not allowed to= have more than one file in %s[Binaries] section" % ( + self.FileExtension, InfFileName)) + else: + for File in FileList: + File =3D GenFdsGlobalVariable.MacroExtend(File, Dict) + OutputFileList.append(File) =20 else: """If File List is empty""" diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source= /Python/GenFds/FdfParser.py index ea1c3eeb30..fb5fd85e0a 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -3749,8 +3749,19 @@ class FdfParser: # def _GetEfiSection(self, Obj): OldPos =3D self.GetFileBufferPos() + EfiSectionObj =3D EfiSection() if not self._GetNextWord(): - return False + CurrentLine =3D self._CurrentLine()[self.CurrentOffsetWithinLi= ne:].split()[0].strip() + if self._Token =3D=3D '{' and Obj.FvFileType =3D=3D "RAW" and = TAB_SPLIT in CurrentLine: + if self._IsToken(TAB_VALUE_SPLIT): + EfiSectionObj.FileExtension =3D self._GetFileExtension= () + elif self._GetNextToken(): + EfiSectionObj.FileName =3D self._Token + EfiSectionObj.SectionType =3D BINARY_FILE_TYPE_RAW + Obj.SectionList.append(EfiSectionObj) + return True + else: + return False SectionName =3D self._Token =20 if SectionName not in { @@ -3816,7 +3827,6 @@ class FdfParser: Obj.SectionList.append(FvImageSectionObj) return True =20 - EfiSectionObj =3D EfiSection() EfiSectionObj.SectionType =3D SectionName =20 if not self._GetNextToken(): diff --git a/BaseTools/Source/Python/GenFds/FfsInfStatement.py b/BaseTools/= Source/Python/GenFds/FfsInfStatement.py index 78dd7cd51a..cd3b0f6477 100644 --- a/BaseTools/Source/Python/GenFds/FfsInfStatement.py +++ b/BaseTools/Source/Python/GenFds/FfsInfStatement.py @@ -147,7 +147,7 @@ class FfsInfStatement(FfsInfStatementClassObject): # @param self The object pointer # @param Dict dictionary contains macro and value pair # - def __InfParse__(self, Dict =3D {}): + def __InfParse__(self, Dict =3D None, IsGenFfs=3DFalse): =20 GenFdsGlobalVariable.VerboseLogger( " Begine parsing INf file : %s= " %self.InfFileName) =20 @@ -348,7 +348,10 @@ class FfsInfStatement(FfsInfStatementClassObject): # # Set OutputPath =3D ${WorkSpace}\Build\Fv\Ffs\${ModuleGuid}+ ${Mo= duleName}\ # - + if IsGenFfs: + Rule =3D self.__GetRule__() + if GlobalData.gGuidPatternEnd.match(Rule.NameGuid): + self.ModuleGuid =3D Rule.NameGuid self.OutputPath =3D os.path.join(GenFdsGlobalVariable.FfsDir, \ self.ModuleGuid + self.BaseName) if not os.path.exists(self.OutputPath) : @@ -438,7 +441,7 @@ class FfsInfStatement(FfsInfStatementClassObject): # Parse Inf file get Module related information # =20 - self.__InfParse__(Dict) + self.__InfParse__(Dict, IsGenFfs=3DTrue) Arch =3D self.GetCurrentArch() SrcFile =3D mws.join( GenFdsGlobalVariable.WorkSpaceDir, self.InfF= ileName); DestFile =3D os.path.join( self.OutputPath, self.ModuleGuid + '.ff= s') diff --git a/BaseTools/Source/Python/GenFds/Section.py b/BaseTools/Source/P= ython/GenFds/Section.py index c49a1ac84b..b238956634 100644 --- a/BaseTools/Source/Python/GenFds/Section.py +++ b/BaseTools/Source/Python/GenFds/Section.py @@ -106,7 +106,7 @@ class Section (SectionClassObject): # @param Dict dictionary contains macro and its value # @retval tuple (File list, boolean) # - def GetFileList(FfsInf, FileType, FileExtension, Dict =3D {}, IsMakefi= le=3DFalse): + def GetFileList(FfsInf, FileType, FileExtension, Dict =3D None, IsMake= file=3DFalse, SectionType=3DNone): IsSect =3D FileType in Section.SectFileType =20 if FileExtension is not None: @@ -134,6 +134,11 @@ class Section (SectionClassObject): else: GenFdsGlobalVariable.InfLogger ("\nCurrent ARCH \'%s\'= of File %s is not in the Support Arch Scope of %s specified by INF %s in F= DF" %(FfsInf.CurrentArch, File.File, File.Arch, FfsInf.InfFileName)) =20 + elif FileType is None and SectionType =3D=3D BINARY_FILE_TYPE_RAW: + for File in FfsInf.BinFileList: + if File.Ext =3D=3D Suffix: + FileList.append(File.Path) + if (not IsMakefile and Suffix is not None and os.path.exists(FfsIn= f.EfiOutputPath)) or (IsMakefile and Suffix is not None): # # Get Makefile path and time stamp --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF63160SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" 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 AHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwD4PwEAAAAYAAAA RgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwAjQAEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBA AGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfACJAAQAAAAoAAABTAE0AVABQAAAAAAACAfk/AQAAAGQA AAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1AFgAAABTAE0AVABQ AAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAHwAJXQEAAAAqAAAA egBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAALAEA6AQAAAB8AGgAB AAAAEgAAAEkAUABNAC4ATgBvAHQAZQAAAAAAAwDxPwkEAAALAEA6AQAAAAMA/T/kBAAAAgELMAEA AAAQAAAAgNhOvLj0JUeQXtypzYVzCwMAFwABAAAAQAA5AAAzmn/fFdUBQAAIMPBtLoDfFdUBHwAA gIYDAgAAAAAAwAAAAAAAAEYBAAAAHgAAAGEAYwBjAGUAcAB0AGwAYQBuAGcAdQBhAGcAZQAAAAAA AQAAAAwAAABlAG4ALQBVAFMAAAAfADcAAQAAAJ4AAABbAFAAQQBUAEMASAAgAFYANQBdACAAQgBh AHMAZQBUAG8AbwBsAHMAOgBNAGEAawBlACAAQgBhAHMAZQBUAG8AbwBsAHMAIABzAHUAcABwAG8A cgB0ACAAbgBlAHcAIAByAHUAbABlAHMAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABSAEEAVwAg AEYARgBTACAARgBJAEwARQAAAAAAHwA9AAEAAAACAAAAAAAAAAMANgAAAAAAAgFxAAEAAAAWAAAA AdUV338Ca0P0rxYRQIiCRwHh/8O6mQAAHwBwAAEAAACeAAAAWwBQAEEAVABDAEgAIABWADUAXQAg AEIAYQBzAGUAVABvAG8AbABzADoATQBhAGsAZQAgAEIAYQBzAGUAVABvAG8AbABzACAAcwB1AHAA cABvAHIAdAAgAG4AZQB3ACAAcgB1AGwAZQBzACAAdABvACAAZwBlAG4AZQByAGEAdABlACAAUgBB AFcAIABGAEYAUwAgAEYASQBMAEUAAAAAAB8ANRABAAAAkAAAADwARgBBAEQAMABEADcARQAwAEEA RQAwAEYAQQA1ADQARAA5ADgANwBGADYARQA3ADIANAAzADUAQwBBAEYARAA1ADAAQQBGADYAMwAx ADYAMABAAFMASABTAE0AUwBYADEAMAAxAC4AYwBjAHIALgBjAG8AcgBwAC4AaQBuAHQAZQBsAC4A YwBvAG0APgAAAAMA3j+fTgAAQAAHMIK/I4DfFdUBAgELAAEAAAAQAAAAgNhOvLj0JUeQXtypzYVz CwMAJgAAAAAAAgFHAAEAAAAzAAAAYz1VUzthPU1DSTtwPUludGVsO2w9U0hTTVNYMTAxLTE5MDUy OTA1MjkzNFotMjY5MTUAAAIBEDABAAAARgAAAAAAAAAmd705O+w4SaSmFT3LpXtCBwD60Nfgrg+l TZh/bnJDXK/VAAAARBFeAACmk2g2iHZsS6dK0+tHmkxkAAAJVI+MAAAAAB8A+j8BAAAAGAAAAEYA YQBuACwAIABaAGgAaQBqAHUAWAAAAAMACVkBAAAAQAAAgAggBgAAAAAAwAAAAAAAAEYAAAAAv4UA AIAGGn/fFdUBCwAAgAggBgAAAAAAwAAAAAAAAEYAAAAAgoUAAAAAAAADAACACCAGAAAAAADAAAAA AAAARgAAAADrhQAACQQAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAtAHAAcgBv AGQAdQBjAHQAAAABAAAAGgAAAGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACAhgMCAAAA AADAAAAAAAAARgEAAAAYAAAAZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABYAAAAxADEALgAw AC4ANgAwADAALgA3AAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAaAAAAZABsAHAALQByAGUA YQBjAHQAaQBvAG4AAAAAAAEAAAAUAAAAbgBvAC0AYQBjAHQAaQBvAG4AAAADAA00/T8AAB8AAICG AwIAAAAAAMAAAAAAAABGAQAAACAAAAB4AC0AbQBzAC0AaABhAHMALQBhAHQAdABhAGMAaAAAAAEA AAACAAAAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAACIAAAB4AC0AbwByAGkAZwBpAG4AYQB0 AGkAbgBnAC0AaQBwAAAAAAABAAAAIAAAAFsAMQAwAC4AMgAzADkALgAxADIANwAuADQAMABdAAAA EJ8= --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF63160SHSMSX101ccrcor_--