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: liming.gao@intel.com) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by groups.io with SMTP; Tue, 25 Jun 2019 17:29:42 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jun 2019 17:29:42 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,417,1557212400"; d="scan'208";a="152470739" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga007.jf.intel.com with ESMTP; 25 Jun 2019 17:29:41 -0700 Received: from fmsmsx111.amr.corp.intel.com (10.18.116.5) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 25 Jun 2019 17:29:41 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by fmsmsx111.amr.corp.intel.com (10.18.116.5) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 25 Jun 2019 17:29:41 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.185]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.246]) with mapi id 14.03.0439.000; Wed, 26 Jun 2019 08:29:39 +0800 From: "Liming Gao" To: "Fan, ZhijuX" , "devel@edk2.groups.io" CC: "Feng, Bob C" , Ard Biesheuvel , Leif Lindholm , "Kinney, Michael D" Subject: Re: [edk2-platform patch 1/2 V2] Platform/Intel:Add GenBiosId into edk2-platforms/Platform/Intel/Tools Thread-Topic: [edk2-platform patch 1/2 V2] Platform/Intel:Add GenBiosId into edk2-platforms/Platform/Intel/Tools Thread-Index: AdUoGJn+YjvmyWetRSmruLKGzfC2cwDnaDYA Date: Wed, 26 Jun 2019 00:29:39 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E48D479@SHSMSX104.ccr.corp.intel.com> References: In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: liming.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Liming Gao >-----Original Message----- >From: Fan, ZhijuX >Sent: Friday, June 21, 2019 6:04 PM >To: devel@edk2.groups.io >Cc: Gao, Liming ; Feng, Bob C >; Ard Biesheuvel ; Leif >Lindholm ; Kinney, Michael D > >Subject: [edk2-platform patch 1/2 V2] Platform/Intel:Add GenBiosId into >edk2-platforms/Platform/Intel/Tools > >BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1855 > >GenBiosId is a tool to generate the BIOS ID binary file which uses >the data from the configuration file. >This tool can be run in both Py2 and Py3. > >This patch is going to add GenBiosId to Platform/Intel/Tools > >Cc: Liming Gao >Cc: Bob Feng >Cc: Ard Biesheuvel >Cc: Leif Lindholm >Cc: Michael D Kinney >Signed-off-by: Zhiju.Fan >--- > Platform/Intel/Tools/GenBiosId/BiosId.env | 27 +++++ > Platform/Intel/Tools/GenBiosId/GenBiosId.py | 180 >++++++++++++++++++++++++++++ > 2 files changed, 207 insertions(+) > create mode 100644 Platform/Intel/Tools/GenBiosId/BiosId.env > create mode 100644 Platform/Intel/Tools/GenBiosId/GenBiosId.py > >diff --git a/Platform/Intel/Tools/GenBiosId/BiosId.env >b/Platform/Intel/Tools/GenBiosId/BiosId.env >new file mode 100644 >index 0000000000..e1e913da76 >--- /dev/null >+++ b/Platform/Intel/Tools/GenBiosId/BiosId.env >@@ -0,0 +1,27 @@ >+## @file >+# This file is used to define the BIOS ID parameters of the build. >+# This file is processed by GenBiosId. >+# Here, it is just a template and can be customized by user. >+# >+# BIOS ID string format: >+# >$(BOARD_ID)$(BOARD_REV).$(BOARD_EXT).$(VERSION_MAJOR).$(BUILD_TY >PE)$(VERSION_MINOR).YYMMDDHHMM >+# All fields must have a fixed length. YYMMDDHHMM is UTC time. >+# Example: "EMLATOR1.000.0001.D01.1906141517" >+# >+# If DATE is specified for YYMMDD and TIME is specified for HHMM like >below, >+# GenBiosId will use the value of DATE and TIME to fill YYMMDDHHMM, >+# otherwise GenBiosId will fill YYMMDDHHMM with current UTC time of the >build machine. >+# DATE =3D 190614 >+# TIME =3D 1517 >+# >+# Copyright (c) 2019, Intel Corporation. All rights reserved.
>+# SPDX-License-Identifier: BSD-2-Clause-Patent >+# >+## >+[config] >+BOARD_ID =3D KBLRVP3 >+BOARD_REV =3D 1 >+BOARD_EXT =3D 000 >+BUILD_TYPE =3D D >+VERSION_MAJOR =3D 0001 >+VERSION_MINOR =3D 01 >diff --git a/Platform/Intel/Tools/GenBiosId/GenBiosId.py >b/Platform/Intel/Tools/GenBiosId/GenBiosId.py >new file mode 100644 >index 0000000000..20fb7592b4 >--- /dev/null >+++ b/Platform/Intel/Tools/GenBiosId/GenBiosId.py >@@ -0,0 +1,180 @@ >+## @file >+# Trim files preprocessed by compiler >+# >+# Copyright (c) 2019, Intel Corporation. All rights reserved.
>+# SPDX-License-Identifier: BSD-2-Clause-Patent >+# >+ >+## >+# Import Modules >+# >+import os >+import sys >+import time >+import logging >+import struct >+import datetime >+import argparse >+import platform >+ >+try: >+ from configparser import ConfigParser >+except: >+ from ConfigParser import ConfigParser >+ >+# Config message >+_BIOS_Signature =3D "$IBIOSI$" >+_SectionKeyName =3D '__name__' >+_SectionName =3D 'config' >+ >+_ConfigItem =3D { >+ "BOARD_ID": {'Value': '', 'Length': 7}, >+ "BOARD_REV": {'Value': '', 'Length': 1}, >+ "BOARD_EXT": {'Value': '', 'Length': 3}, >+ "BUILD_TYPE": {'Value': '', 'Length': 1}, >+ "VERSION_MAJOR": {'Value': '0000', 'Length': 4}, >+ "VERSION_MINOR": {'Value': '00', 'Length': 2}, >+} >+ >+# Version message >+__prog__ =3D 'GenBiosld' >+__description__ =3D 'Trim files preprocessed by compiler' >+__copyright__ =3D 'Copyright (c) 2019, Intel Corporation. All rights >reserved.
' >+__version__ =3D '%s Version %s' % (__prog__, '0.1 ') >+ >+# ExtraData message >+_Usage =3D "Usage: GenBiosId -i Configfile -o OutputFile [-ot OutputTextF= ile]" >+_ConfigSectionNotDefine =3D "Not support the config file format, need con= fig >section" >+_ErrorMessageTemplate =3D '\n\n%(tool)s...\n : error: %(msg)s\n\t%(extra)= s' >+_ErrorLogger =3D logging.getLogger("tool_error") >+_ErrorFormatter =3D logging.Formatter("%(message)s") >+_ConfigLenInvalid =3D "Config item %s length is invalid" >+_ConfigItemInvalid =3D "Item %s is invalid" >+ >+# Error message >+INFO =3D 20 >+ERRORCODE =3D 50 >+OPTION_MISSING =3D 'Missing option' >+FORMAT_INVALID =3D 'Invalid syntax/format' >+FILE_NOT_FOUND =3D 'File/directory not found in workspace' >+FORMAT_UNKNOWN_ERROR =3D 'Unknown error in syntax/format' >+FORMAT_NOT_SUPPORTED =3D 'Not supported syntax/format' >+ >+ >+def SetEdkLogger(): >+ _ErrorLogger.setLevel(INFO) >+ _ErrorCh =3D logging.StreamHandler(sys.stderr) >+ _ErrorCh.setFormatter(_ErrorFormatter) >+ _ErrorLogger.addHandler(_ErrorCh) >+ return _ErrorLogger >+ >+ >+# Output the error message and exit the tool >+def EdkLogger(ToolName, Message, ExtraData): >+ _ErrorLogger =3D SetEdkLogger() >+ TemplateDict =3D {"tool": ToolName, "msg": Message, "extra": ExtraDat= a} >+ LogText =3D _ErrorMessageTemplate % TemplateDict >+ _ErrorLogger.log(ERRORCODE, LogText) >+ sys.exit(1) >+ >+ >+# Open the file in the correct way >+def FileOpen(FileName, Mode, Buffer=3D-1): >+ def LongFilePath(FileName): >+ FileName =3D os.path.normpath(FileName) >+ if platform.system() =3D=3D 'Windows': >+ if FileName.startswith('\\\\?\\'): >+ return FileName >+ if FileName.startswith('\\\\'): >+ return '\\\\?\\UNC\\' + FileName[2:] >+ if os.path.isabs(FileName): >+ return '\\\\?\\' + FileName >+ return FileName >+ >+ return open(LongFilePath(FileName), Mode, Buffer) >+ >+ >+# Parse command line options >+def MyOptionParser(): >+ parser =3D argparse.ArgumentParser(prog=3D__prog__, >+ description=3D__description__ + __co= pyright__ + _Usage, >+ conflict_handler=3D'resolve') >+ parser.add_argument('-v', '--version', action=3D'version', >version=3D__version__, >+ help=3D"show program's version number and exit") >+ parser.add_argument('-i', '--int', metavar=3D'FILENAME', dest=3D'Inpu= tFile', >help=3D"Input Config file") >+ parser.add_argument('-o', '--out', metavar=3D'FILENAME', dest=3D'Outp= utFile', >help=3D"Output file") >+ parser.add_argument('-ot', '--text', metavar=3D'FILENAME', >dest=3D'OutputTextFile', help=3D"Output Text file") >+ Options =3D parser.parse_args() >+ return Options >+ >+ >+# Check the Tool for missing variables >+def CheckOptions(Options): >+ if len(sys.argv) !=3D 5 and not (len(sys.argv) =3D=3D 7 and >Options.OutputTextFile): >+ EdkLogger("GenBiosId", OPTION_MISSING, ExtraData=3D_Usage) >+ elif not Options.InputFile or not Options.OutputFile: >+ EdkLogger("GenBiosId", OPTION_MISSING, ExtraData=3D_Usage) >+ InputFile =3D Options.InputFile >+ OutputFile =3D Options.OutputFile >+ OutputTextFile =3D Options.OutputTextFile >+ if not os.path.exists(InputFile): >+ EdkLogger("GenBiosId", FILE_NOT_FOUND, ExtraData=3D"Input file no= t >found") >+ return InputFile, OutputFile, OutputTextFile >+ >+ >+# Parse the input file and extract the information >+def ParserInputFile(InputFile): >+ cf =3D ConfigParser() >+ cf.optionxform =3D str >+ cf.read(InputFile) >+ if _SectionName not in cf._sections: >+ EdkLogger("GenBiosId", FORMAT_NOT_SUPPORTED, >ExtraData=3D_ConfigSectionNotDefine) >+ for Item in cf._sections[_SectionName]: >+ if Item =3D=3D _SectionKeyName: >+ continue >+ if Item not in _ConfigItem: >+ EdkLogger("GenBiosId", FORMAT_INVALID, >ExtraData=3D_ConfigItemInvalid % Item) >+ _ConfigItem[Item]['Value'] =3D cf._sections[_SectionName][Item] >+ if len(_ConfigItem[Item]['Value']) !=3D _ConfigItem[Item]['Length= ']: >+ EdkLogger("GenBiosId", FORMAT_INVALID, >ExtraData=3D_ConfigLenInvalid % Item) >+ for Item in _ConfigItem: >+ if not _ConfigItem[Item]['Value']: >+ EdkLogger("GenBiosId", FORMAT_UNKNOWN_ERROR, >ExtraData=3D"Item %s is missing" % Item) >+ utcnow =3D datetime.datetime.utcnow() >+ TimeStamp =3D time.strftime("%y%m%d%H%M", utcnow.timetuple()) >+ >+ Id_Str =3D _ConfigItem['BOARD_ID']['Value'] + >_ConfigItem['BOARD_REV']['Value'] + '.' + _ConfigItem['BOARD_EXT'][ >+ 'Value'] + '.' + _ConfigItem['VERSION_MAJOR']['Value'] + \ >+ '.' + _ConfigItem["BUILD_TYPE"]['Value'] + >_ConfigItem['VERSION_MINOR']['Value'] + '.' + TimeStamp >+ return Id_Str >+ >+ >+# Output information to a file >+def PrintOutputFile(OutputFile, OutputTextFile, Id_Str): >+ with FileOpen(OutputFile, 'wb') as FdOut: >+ for i in _BIOS_Signature: >+ FdOut.write(struct.pack('B', ord(i))) >+ >+ for i in Id_Str: >+ FdOut.write(struct.pack('H', ord(i))) >+ >+ FdOut.write(struct.pack('H', 0x00)) >+ if OutputTextFile: >+ with FileOpen(OutputTextFile, 'w') as FdOut: >+ FdOut.write(Id_Str) >+ >+ >+# Tool entrance method >+def Main(): >+ Options =3D MyOptionParser() >+ InputFile, OutputFile, OutputTextFile =3D CheckOptions(Options) >+ Id_Str =3D ParserInputFile(InputFile) >+ PrintOutputFile(OutputFile, OutputTextFile, Id_Str) >+ return 0 >+ >+ >+if __name__ =3D=3D '__main__': >+ r =3D Main() >+ ## 0-127 is a safe return range, and 1 is a standard default error >+ if r < 0 or r > 127: r =3D 1 >+ sys.exit(r) >-- >2.14.1.windows.1