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.115, mailfrom: zhijux.fan@intel.com) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by groups.io with SMTP; Mon, 27 May 2019 23:29:31 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 May 2019 23:29:31 -0700 X-ExtLoop1: 1 Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by FMSMGA003.fm.intel.com with ESMTP; 27 May 2019 23:29:31 -0700 Received: from fmsmsx111.amr.corp.intel.com (10.18.116.5) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 27 May 2019 23:29:31 -0700 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by fmsmsx111.amr.corp.intel.com (10.18.116.5) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 27 May 2019 23:29:30 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.18]) with mapi id 14.03.0415.000; Tue, 28 May 2019 14:29:28 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH V4] BaseTools:Make BaseTools support new rules to generate RAW FFS FILE Thread-Topic: [PATCH V4] BaseTools:Make BaseTools support new rules to generate RAW FFS FILE Thread-Index: AdUVHqhjhpM1F8rPTzqWaM7XxLDQYw== Date: Tue, 28 May 2019 06:29:27 +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: 41446 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62CA8SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62CA8SHSMSX101ccrcor_ 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 | 9 ++++++++- 4 files changed, 42 insertions(+), 4 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/Section.py b/BaseTools/Source/P= ython/GenFds/Section.py index c49a1ac84b..26c88fd538 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: @@ -115,6 +115,8 @@ class Section (SectionClassObject): Suffix =3D Section.SectionType.get(FileType) else: Suffix =3D Section.BinFileType.get(FileType) + if not Dict: + Dict =3D {} if FfsInf is None: EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exi= st!') =20 @@ -134,6 +136,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_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62CA8SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" 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 AG4AQABpAG4AdABlAGwALgBjAG8AbQAAAB8AAl0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4A QABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwDlXwEAAAAyAAAAcwBpAHAAOgB6AGgAaQBqAHUAeAAu AGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AGgwBAAAAGAAAAEYAYQBuACwAIABaAGgA aQBqAHUAWAAAAB8AHwwBAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBj AG8AbQAAAAAAHwAeDAEAAAAKAAAAUwBNAFQAUAAAAAAAAgEZDAEAAABkAAAAAAAAAIErH6S+oxAZ nW4A3QEPVAIAAACARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4 AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAB8AAV0BAAAAKgAAAHoAaABpAGoAdQB4AC4A ZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwD4PwEAAAAYAAAARgBhAG4ALAAgAFoAaABp AGoAdQBYAAAAHwAjQAEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMA bwBtAAAAAAAfACJAAQAAAAoAAABTAE0AVABQAAAAAAACAfk/AQAAAGQAAAAAAAAAgSsfpL6jEBmd bgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1AFgAAABTAE0AVABQAAAAegBoAGkAagB1AHgA LgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAHwAJXQEAAAAqAAAAegBoAGkAagB1AHgALgBm AGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAALAEA6AQAAAB8AGgABAAAAEgAAAEkAUABNAC4A TgBvAHQAZQAAAAAAAwDxPwkEAAALAEA6AQAAAAMA/T/kBAAAAgELMAEAAAAQAAAAdRx/cdfqsECZ 6iohz4Yi0wMAFwABAAAAQAA5AIC9yLIeFdUBQAAIMK8YIbMeFdUBHwAAgIYDAgAAAAAAwAAAAAAA AEYBAAAAHgAAAGEAYwBjAGUAcAB0AGwAYQBuAGcAdQBhAGcAZQAAAAAAAQAAAAwAAABlAG4ALQBV AFMAAAAfADcAAQAAAJ4AAABbAFAAQQBUAEMASAAgAFYANABdACAAQgBhAHMAZQBUAG8AbwBsAHMA OgBNAGEAawBlACAAQgBhAHMAZQBUAG8AbwBsAHMAIABzAHUAcABwAG8AcgB0ACAAbgBlAHcAIABy AHUAbABlAHMAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABSAEEAVwAgAEYARgBTACAARgBJAEwA RQAAAAAAHwA9AAEAAAACAAAAAAAAAAMANgAAAAAAAgFxAAEAAAAWAAAAAdUVHqhjhpM1F8rPTzqW aM7XxLDQYwAAHwBwAAEAAACeAAAAWwBQAEEAVABDAEgAIABWADQAXQAgAEIAYQBzAGUAVABvAG8A bABzADoATQBhAGsAZQAgAEIAYQBzAGUAVABvAG8AbABzACAAcwB1AHAAcABvAHIAdAAgAG4AZQB3 ACAAcgB1AGwAZQBzACAAdABvACAAZwBlAG4AZQByAGEAdABlACAAUgBBAFcAIABGAEYAUwAgAEYA SQBMAEUAAAAAAB8ANRABAAAAkAAAADwARgBBAEQAMABEADcARQAwAEEARQAwAEYAQQA1ADQARAA5 ADgANwBGADYARQA3ADIANAAzADUAQwBBAEYARAA1ADAAQQBGADYAMgBDAEEAOABAAFMASABTAE0A UwBYADEAMAAxAC4AYwBjAHIALgBjAG8AcgBwAC4AaQBuAHQAZQBsAC4AYwBvAG0APgAAAAMA3j+f TgAAQAAHMIb0GbMeFdUBAgELAAEAAAAQAAAAdRx/cdfqsECZ6iohz4Yi0wMAJgAAAAAAAgFHAAEA AAAzAAAAYz1VUzthPU1DSTtwPUludGVsO2w9U0hTTVNYMTAxLTE5MDUyODA2MjkyN1otMjU3NTYA AAIBEDABAAAARgAAAAAAAAAmd705O+w4SaSmFT3LpXtCBwD60Nfgrg+lTZh/bnJDXK/VAAAARBFe AACmk2g2iHZsS6dK0+tHmkxkAAAJVI+JAAAAAB8A+j8BAAAAGAAAAEYAYQBuACwAIABaAGgAaQBq AHUAWAAAAAMACVkBAAAAQAAAgAggBgAAAAAAwAAAAAAAAEYAAAAAv4UAADCa3bEeFdUBCwAAgAgg BgAAAAAAwAAAAAAAAEYAAAAAgoUAAAAAAAADAACACCAGAAAAAADAAAAAAAAARgAAAADrhQAACQQA AB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAtAHAAcgBvAGQAdQBjAHQAAAABAAAA GgAAAGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAY AAAAZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABYAAAAxADEALgAwAC4ANgAwADAALgA3AAAA AAAfAACAhgMCAAAAAADAAAAAAAAARgEAAAAaAAAAZABsAHAALQByAGUAYQBjAHQAaQBvAG4AAAAA AAEAAAAUAAAAbgBvAC0AYQBjAHQAaQBvAG4AAAADAA00/T8AAB8AAICGAwIAAAAAAMAAAAAAAABG AQAAACAAAAB4AC0AbQBzAC0AaABhAHMALQBhAHQAdABhAGMAaAAAAAEAAAACAAAAAAAAAB8AAICG AwIAAAAAAMAAAAAAAABGAQAAACIAAAB4AC0AbwByAGkAZwBpAG4AYQB0AGkAbgBnAC0AaQBwAAAA AAABAAAAIAAAAFsAMQAwAC4AMgAzADkALgAxADIANwAuADQAMABdAAAAXqU= --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62CA8SHSMSX101ccrcor_--