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.136, mailfrom: zhijux.fan@intel.com) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by groups.io with SMTP; Wed, 22 May 2019 22:56:51 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 May 2019 22:56:52 -0700 X-ExtLoop1: 1 Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga001.jf.intel.com with ESMTP; 22 May 2019 22:56:50 -0700 Received: from FMSMSX110.amr.corp.intel.com (10.18.116.10) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 22 May 2019 22:56:50 -0700 Received: from shsmsx153.ccr.corp.intel.com (10.239.6.53) by fmsmsx110.amr.corp.intel.com (10.18.116.10) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 22 May 2019 22:56:49 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.129]) by SHSMSX153.ccr.corp.intel.com ([169.254.12.150]) with mapi id 14.03.0415.000; Thu, 23 May 2019 13:56:48 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [PATCH V2] BaseTools:Make BaseTools support the correct RAW FFS FILE generation Thread-Topic: [PATCH V2] BaseTools:Make BaseTools support the correct RAW FFS FILE generation Thread-Index: AdURLEOLANfw3UflQ4yzV9rvXi+QKg== Date: Thu, 23 May 2019 05:56:47 +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: 41268 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62414SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62414SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1765 RAW FFS File 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) { SectionType FileType $(INF_OUTPUT)/$(MODULE_NAME).bin } 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. Cc: Bob Feng Cc: Liming Gao Signed-off-by: Zhiju.Fan --- BaseTools/Source/Python/Common/DataType.py | 1 + BaseTools/Source/Python/GenFds/EfiSection.py | 10 ++++++++-- BaseTools/Source/Python/GenFds/FdfParser.py | 14 ++++++++++++-- BaseTools/Source/Python/GenFds/Section.py | 7 ++++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/= Python/Common/DataType.py index 780711bf8e..1879aea665 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -121,6 +121,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_FFS =3D 'FFS' =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..5346a0569f 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 @@ -227,14 +227,20 @@ class EfiSection (EfiSectionClassObject): else: EdkLogger.error("GenFds", GENFDS_ERROR, "Output file f= or %s section could not be found for %s" % (SectionType, InfFileName)) =20 + elif len(FileList) > 1 and SectionType =3D=3D BINARY_FILE_TYPE= _FFS: + EdkLogger.error("GenFds", GENFDS_ERROR,"Files suffixed wit= h %s are not allowed to have more than one file in %s[Binaries] section" % = (self.FileExtension, InfFileName)) + else: """Convert the File to Section file one by one """ for File in FileList: """ Copy Map file to FFS output path """ Index =3D Index + 1 Num =3D '%s.%d' %(SecNum, Index) - OutputFile =3D os.path.join( OutputPath, ModuleName + = SUP_MODULE_SEC + Num + SectionSuffix.get(SectionType)) File =3D GenFdsGlobalVariable.MacroExtend(File, Dict) + if SectionType =3D=3D BINARY_FILE_TYPE_FFS: + OutputFileList.append(File) + return OutputFileList, Align + OutputFile =3D os.path.join( OutputPath, ModuleName + = SUP_MODULE_SEC + Num + SectionSuffix.get(SectionType)) =20 #Get PE Section alignment when align is set to AUTO if self.Alignment =3D=3D 'Auto' and (SectionType =3D= =3D BINARY_FILE_TYPE_PE32 or SectionType =3D=3D BINARY_FILE_TYPE_TE): diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source= /Python/GenFds/FdfParser.py index ea1c3eeb30..8446e3be4c 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_FFS + 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..ae03828fef 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_FFS: + 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_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62414SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" 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 AGwALgBjAG8AbQAAAAAAHwDlXwEAAAAyAAAAcwBpAHAAOgB6AGgAaQBqAHUAeAAuAGYAYQBuAEAA aQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AGgwBAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAA AB8AHwwBAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAA HwAeDAEAAAAKAAAAUwBNAFQAUAAAAAAAAgEZDAEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIA AACARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4A QABpAG4AdABlAGwALgBjAG8AbQAAAB8AAV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABp AG4AdABlAGwALgBjAG8AbQAAAAAAHwD4PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAA HwAjQAEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAf ACJAAQAAAAoAAABTAE0AVABQAAAAAAACAfk/AQAAAGQAAAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAA AIBGAGEAbgAsACAAWgBoAGkAagB1AFgAAABTAE0AVABQAAAAegBoAGkAagB1AHgALgBmAGEAbgBA AGkAbgB0AGUAbAAuAGMAbwBtAAAAHwAJXQEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkA bgB0AGUAbAAuAGMAbwBtAAAAAAALAEA6AQAAAB8AGgABAAAAEgAAAEkAUABNAC4ATgBvAHQAZQAA AAAAAwDxPwkEAAALAEA6AQAAAAMA/T/kBAAAAgELMAEAAAAQAAAAkpKyBrmbfEGhIdS5EODVnAMA FwABAAAAQAA5AIC5d04sEdUBQAAIMOmJn04sEdUBHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAHgAA AGEAYwBjAGUAcAB0AGwAYQBuAGcAdQBhAGcAZQAAAAAAAQAAAAwAAABlAG4ALQBVAFMAAAAfADcA AQAAAKIAAABbAFAAQQBUAEMASAAgAFYAMgBdACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBNAGEAawBl ACAAQgBhAHMAZQBUAG8AbwBsAHMAIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABjAG8AcgByAGUA YwB0ACAAUgBBAFcAIABGAEYAUwAgAEYASQBMAEUAIAAgAGcAZQBuAGUAcgBhAHQAaQBvAG4AAAAA AB8APQABAAAAAgAAAAAAAAADADYAAAAAAAIBcQABAAAAFgAAAAHVESxDiwDX8N1H5UOMs1fa714v kCoAAB8AcAABAAAAogAAAFsAUABBAFQAQwBIACAAVgAyAF0AIABCAGEAcwBlAFQAbwBvAGwAcwA6 AE0AYQBrAGUAIABCAGEAcwBlAFQAbwBvAGwAcwAgAHMAdQBwAHAAbwByAHQAIAB0AGgAZQAgAGMA bwByAHIAZQBjAHQAIABSAEEAVwAgAEYARgBTACAARgBJAEwARQAgACAAZwBlAG4AZQByAGEAdABp AG8AbgAAAAAAHwA1EAEAAACQAAAAPABGAEEARAAwAEQANwBFADAAQQBFADAARgBBADUANABEADkA OAA3AEYANgBFADcAMgA0ADMANQBDAEEARgBEADUAMABBAEYANgAyADQAMQA0AEAAUwBIAFMATQBT AFgAMQAwADEALgBjAGMAcgAuAGMAbwByAHAALgBpAG4AdABlAGwALgBjAG8AbQA+AAAAAwDeP59O AABAAAcwI8eaTiwR1QECAQsAAQAAABAAAACSkrIGuZt8QaEh1LkQ4NWcAwAmAAAAAAACAUcAAQAA ADMAAABjPVVTO2E9TUNJO3A9SW50ZWw7bD1TSFNNU1gxMDEtMTkwNTIzMDU1NjQ3Wi0yMTU1MQAA AgEQMAEAAABGAAAAAAAAACZ3vTk77DhJpKYVPcule0IHAPrQ1+CuD6VNmH9uckNcr9UAAABEEV4A AKaTaDaIdmxLp0rT60eaTGQAAAlUj4IAAAAAHwD6PwEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoA dQBYAAAAAwAJWQEAAABAAACACCAGAAAAAADAAAAAAAAARgAAAAC/hQAAYGMrTSwR1QELAACACCAG AAAAAADAAAAAAAAARgAAAACChQAAAAAAAAMAAIAIIAYAAAAAAMAAAAAAAABGAAAAAOuFAAAJBAAA HwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAAAGQAbABwAC0AcAByAG8AZAB1AGMAdAAAAAEAAAAa AAAAZABsAHAAZQAtAHcAaQBuAGQAbwB3AHMAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgA AABkAGwAcAAtAHYAZQByAHMAaQBvAG4AAAABAAAAFgAAADEAMQAuADAALgA2ADAAMAAuADcAAAAA AB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwAcAAtAHIAZQBhAGMAdABpAG8AbgAAAAAA AQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAMADTT9PwAAHwAAgIYDAgAAAAAAwAAAAAAAAEYB AAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEAYwBoAAAAAQAAAAIAAAAAAAAAHwAAgIYD AgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBnAGkAbgBhAHQAaQBuAGcALQBpAHAAAAAA AAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4ANAAwAF0AAABSaQ== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF62414SHSMSX101ccrcor_--