From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.20, mailfrom: zhijux.fan@intel.com) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by groups.io with SMTP; Fri, 24 May 2019 02:21:51 -0700 X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 May 2019 02:21:50 -0700 X-ExtLoop1: 1 Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga006.jf.intel.com with ESMTP; 24 May 2019 02:21:49 -0700 Received: from FMSMSX110.amr.corp.intel.com (10.18.116.10) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 24 May 2019 02:21:49 -0700 Received: from shsmsx108.ccr.corp.intel.com (10.239.4.97) by fmsmsx110.amr.corp.intel.com (10.18.116.10) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 24 May 2019 02:21:49 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX108.ccr.corp.intel.com ([169.254.8.126]) with mapi id 14.03.0415.000; Fri, 24 May 2019 17:21:47 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH V3] BaseTools:Make BaseTools support new rules to generate RAW FFS FILE Thread-Topic: [PATCH V3] BaseTools:Make BaseTools support new rules to generate RAW FFS FILE Thread-Index: AdUSEf9gN73GXzeYQlmBb5NJP7pfCQ== Date: Fri, 24 May 2019 09:21:46 +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: 41324 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF626FDSHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF626FDSHSMSX101ccrcor_ 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/Section.py | 7 ++++++- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/= Python/Common/DataType.py index 7cd67bc01a..19c8fa9e56 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..48b3954f4c 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..4595dea733 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/Section.py b/BaseTools/Source/P= ython/GenFds/Section.py index c49a1ac84b..ccf28dc70c 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 {}, IsMakefi= le=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_FAD0D7E0AE0FA54D987F6E72435CAFD50AF626FDSHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" 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 AHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAaDAEAAAAYAAAA RgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwAfDAEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBA AGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAB4MAQAAAAoAAABTAE0AVABQAAAAAAACARkMAQAAAGQA AAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1AFgAAABTAE0AVABQ AAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAHwABXQEAAAAqAAAA egBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAPg/AQAAABgAAABG AGEAbgAsACAAWgBoAGkAagB1AFgAAAAfACNAAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAA aQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AIkABAAAACgAAAFMATQBUAFAAAAAAAAIB+T8BAAAAZAAA AAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAFMATQBUAFAA AAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAfAAldAQAAACoAAAB6 AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAAsAQDoBAAAAHwAaAAEA AAASAAAASQBQAE0ALgBOAG8AdABlAAAAAAADAPE/CQQAAAsAQDoBAAAAAwD9P+QEAAACAQswAQAA ABAAAAD7t04oG4SXRIdbH/X/zaehAwAXAAEAAABAADkAAPGnGxIS1QFAAAgwb58aHBIS1QEfAACA hgMCAAAAAADAAAAAAAAARgEAAAAeAAAAYQBjAGMAZQBwAHQAbABhAG4AZwB1AGEAZwBlAAAAAAAB AAAADAAAAGUAbgAtAFUAUwAAAB8ANwABAAAAngAAAFsAUABBAFQAQwBIACAAVgAzAF0AIABCAGEA cwBlAFQAbwBvAGwAcwA6AE0AYQBrAGUAIABCAGEAcwBlAFQAbwBvAGwAcwAgAHMAdQBwAHAAbwBy AHQAIABuAGUAdwAgAHIAdQBsAGUAcwAgAHQAbwAgAGcAZQBuAGUAcgBhAHQAZQAgAFIAQQBXACAA RgBGAFMAIABGAEkATABFAAAAAAAfAD0AAQAAAAIAAAAAAAAAAwA2AAAAAAACAXEAAQAAABYAAAAB 1RIR/2A3vcZfN5hCWYFvk0k/ul8JAAAfAHAAAQAAAJ4AAABbAFAAQQBUAEMASAAgAFYAMwBdACAA QgBhAHMAZQBUAG8AbwBsAHMAOgBNAGEAawBlACAAQgBhAHMAZQBUAG8AbwBsAHMAIABzAHUAcABw AG8AcgB0ACAAbgBlAHcAIAByAHUAbABlAHMAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABSAEEA VwAgAEYARgBTACAARgBJAEwARQAAAAAAHwA1EAEAAACQAAAAPABGAEEARAAwAEQANwBFADAAQQBF ADAARgBBADUANABEADkAOAA3AEYANgBFADcAMgA0ADMANQBDAEEARgBEADUAMABBAEYANgAyADYA RgBEAEAAUwBIAFMATQBTAFgAMQAwADEALgBjAGMAcgAuAGMAbwByAHAALgBpAG4AdABlAGwALgBj AG8AbQA+AAAAAwDeP59OAABAAAcwqdwVHBIS1QECAQsAAQAAABAAAAD7t04oG4SXRIdbH/X/zaeh AwAmAAAAAAACAUcAAQAAADMAAABjPVVTO2E9TUNJO3A9SW50ZWw7bD1TSFNNU1gxMDEtMTkwNTI0 MDkyMTQ2Wi0yMzEyNgAAAgEQMAEAAABGAAAAAAAAACZ3vTk77DhJpKYVPcule0IHAPrQ1+CuD6VN mH9uckNcr9UAAABEEV4AAKaTaDaIdmxLp0rT60eaTGQAAAlUj4cAAAAAHwD6PwEAAAAYAAAARgBh AG4ALAAgAFoAaABpAGoAdQBYAAAAAwAJWQEAAABAAACACCAGAAAAAADAAAAAAAAARgAAAAC/hQAA EIOxGhIS1QELAACACCAGAAAAAADAAAAAAAAARgAAAACChQAAAAAAAAMAAIAIIAYAAAAAAMAAAAAA AABGAAAAAOuFAAAJBAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABwAC0AcAByAG8A ZAB1AGMAdAAAAAEAAAAaAAAAZABsAHAAZQAtAHcAaQBuAGQAbwB3AHMAAAAAAB8AAICGAwIAAAAA AMAAAAAAAABGAQAAABgAAABkAGwAcAAtAHYAZQByAHMAaQBvAG4AAAABAAAAFgAAADEAMQAuADAA LgA2ADAAMAAuADcAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwAcAAtAHIAZQBh AGMAdABpAG8AbgAAAAAAAQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAMADTT9PwAAHwAAgIYD AgAAAAAAwAAAAAAAAEYBAAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEAYwBoAAAAAQAA AAIAAAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBnAGkAbgBhAHQA aQBuAGcALQBpAHAAAAAAAAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4ANAAwAF0AAAC5 Zw== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF626FDSHSMSX101ccrcor_--