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; Mon, 17 Jun 2019 03:54:31 -0700 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Jun 2019 03:54:31 -0700 X-ExtLoop1: 1 Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga002.jf.intel.com with ESMTP; 17 Jun 2019 03:54:30 -0700 Received: from fmsmsx101.amr.corp.intel.com (10.18.124.199) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Jun 2019 03:54:30 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx101.amr.corp.intel.com (10.18.124.199) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Jun 2019 03:54:29 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.104]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.185]) with mapi id 14.03.0439.000; Mon, 17 Jun 2019 18:54:28 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" , "Zhang, Shenglei" , "Kinney, Michael D" Subject: [PATCH V2] BaseTools/GenBiosId: Add a new tool GenBiosId Thread-Topic: [PATCH V2] BaseTools/GenBiosId: Add a new tool GenBiosId Thread-Index: AdUk+vLr4sxSnH91SPaTu3pqAnspYA== Date: Mon, 17 Jun 2019 10:54: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: 42506 Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF82597SHSMSX101ccrcor_" Content-Language: en-US --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF82597SHSMSX101ccrcor_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable GenBiosId is a tool to generate the BIOS ID binary file which uses the data from the configuration file. https://bugzilla.tianocore.org/show_bug.cgi?id=3D1846 v2:v1 is a tool of C type and v2 is python type. Cc: Bob Feng Cc: Liming Gao Signed-off-by: Shenglei Zhang --- BaseTools/BinWrappers/PosixLike/GenBiosId | 14 +++ BaseTools/BinWrappers/WindowsLike/GenBiosId.bat | 3 + BaseTools/Source/Python/GenBiosId/BiosId.env | 27 ++++++ BaseTools/Source/Python/GenBiosId/GenBiosId.py | 118 ++++++++++++++++++++= ++++ 4 files changed, 162 insertions(+) create mode 100644 BaseTools/BinWrappers/PosixLike/GenBiosId create mode 100644 BaseTools/BinWrappers/WindowsLike/GenBiosId.bat create mode 100644 BaseTools/Source/Python/GenBiosId/BiosId.env create mode 100644 BaseTools/Source/Python/GenBiosId/GenBiosId.py diff --git a/BaseTools/BinWrappers/PosixLike/GenBiosId b/BaseTools/BinWrapp= ers/PosixLike/GenBiosId new file mode 100644 index 0000000000..1dd28e9662 --- /dev/null +++ b/BaseTools/BinWrappers/PosixLike/GenBiosId @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +#python `dirname $0`/RunToolFromSource.py `basename $0` $* + +# If a ${PYTHON_COMMAND} command is available, use it in preference to pyt= hon +if command -v ${PYTHON_COMMAND} >/dev/null 2>&1; then + python_exe=3D${PYTHON_COMMAND} +fi + +full_cmd=3D${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028= for a discussion of why $0 is not a good choice here +dir=3D$(dirname "$full_cmd") +exe=3D$(basename "$full_cmd") + +export PYTHONPATH=3D"$dir/../../Source/Python${PYTHONPATH:+:"$PYTHONPATH"}= " +exec "${python_exe:-python}" "$dir/../../Source/Python/$exe/$exe.py" "$@" diff --git a/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat b/BaseTools/Bi= nWrappers/WindowsLike/GenBiosId.bat new file mode 100644 index 0000000000..e1f61382c8 --- /dev/null +++ b/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat @@ -0,0 +1,3 @@ +@setlocal +@set ToolName=3D%~n0% +@%PYTHON_COMMAND% %BASE_TOOLS_PATH%\Source\Python\%ToolName%\%ToolName%.py= %* diff --git a/BaseTools/Source/Python/GenBiosId/BiosId.env b/BaseTools/Sourc= e/Python/GenBiosId/BiosId.env new file mode 100644 index 0000000000..e1e913da76 --- /dev/null +++ b/BaseTools/Source/Python/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_TYPE)$(= 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 bel= ow, +# GenBiosId will use the value of DATE and TIME to fill YYMMDDHHMM, +# otherwise GenBiosId will fill YYMMDDHHMM with current UTC time of the b= uild 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 EMLATOR +BOARD_REV =3D 1 +BOARD_EXT =3D 000 +BUILD_TYPE =3D D +VERSION_MAJOR =3D 0001 +VERSION_MINOR =3D 01 diff --git a/BaseTools/Source/Python/GenBiosId/GenBiosId.py b/BaseTools/Sou= rce/Python/GenBiosId/GenBiosId.py new file mode 100644 index 0000000000..8259b17afd --- /dev/null +++ b/BaseTools/Source/Python/GenBiosId/GenBiosId.py @@ -0,0 +1,118 @@ +## @file +# Trim files preprocessed by compiler +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +## +# Import Modules +# +import Common.LongFilePathOs as os +import sys +import struct +import time +import datetime +import argparse +try: + from configparser import ConfigParser +except: + from ConfigParser import ConfigParser +from Common.BuildToolError import * +from Common.Misc import * +from Common.DataType import * +from Common.BuildVersion import gBUILD_VERSION +import Common.EdkLogger as EdkLogger +from Common.LongFilePathSupport import OpenLongFilePath as open + +_BIOS_Signature =3D "$IBIOSI$" +_SectionKeyName =3D '__name__' +_SectionName =3D 'config' + +__prog__ =3D 'GenBiosld' +__description__ =3D 'Trim files preprocessed by compiler' +__copyright__ =3D 'Copyright (c) 2019, Intel Corporation. All rights reser= ved.
' +__version__ =3D '%s Version %s' % (__prog__, '0.1 ') + +_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}, + +} + + +_Usage =3D "Usage: GenBiosId -i Configfile -o OutputFile [-ob OutputBatchF= ile]" +_ConfigSectionNotDefine =3D "Not support the config file format, need conf= ig section" +_ConfigLenInvalid =3D "Config item %s length is invalid" +_ConfigItemInvalid =3D "Item %s is invalid" + +def Main(): + parser =3D argparse.ArgumentParser(prog=3D__prog__, + description=3D__description__ + __cop= yright__ + _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'Input= File', help=3D"Input Config file") + parser.add_argument('-o', '--out', metavar=3D'FILENAME', dest=3D'Outpu= tFile', help=3D"Output file") + parser.add_argument('-ob', '--batch', metavar=3D'FILENAME', dest=3D'Ou= tputBatchFile', help=3D"OutputBatch file") + Options =3D parser.parse_args() + try: + EdkLogger.Initialize() + if len(sys.argv) !=3D5 and not (len(sys.argv) =3D=3D 7 and Options= .OutputBatchFile): + EdkLogger.error("GenBiosId", OPTION_MISSING, ExtraData=3D_Usag= e) + elif not Options.InputFile or not Options.OutputFile: + EdkLogger.error("GenBiosId", OPTION_MISSING, ExtraData=3D_Usag= e) + except FatalError as X: + return 1 + InputFile =3D Options.InputFile + OutputFile =3D Options.OutputFile + OutputBatchFile =3D Options.OutputBatchFile + if not os.path.exists(InputFile): + EdkLogger.error("GenBiosId", FILE_NOT_FOUND, ExtraData=3D"Input fi= le not found") + cf =3D ConfigParser() + cf.optionxform =3D str + cf.read(InputFile) + if _SectionName not in cf._sections: + EdkLogger.error("GenBiosId", FORMAT_NOT_SUPPORTED, ExtraData=3D_Co= nfigSectionNotDefine) + for Item in cf._sections[_SectionName]: + if Item =3D=3D _SectionKeyName: + continue + if Item not in _ConfigItem: + EdkLogger.error("GenBiosId", FORMAT_INVALID, ExtraData=3D_Conf= igItemInvalid % Item) + _ConfigItem[Item]['Value'] =3D cf._sections[_SectionName][Item] + if len(_ConfigItem[Item]['Value']) !=3D _ConfigItem[Item]['Length'= ]: + EdkLogger.error("GenBiosId", FORMAT_INVALID, ExtraData=3D_Conf= igLenInvalid % Item) + for Item in _ConfigItem: + if not _ConfigItem[Item]['Value']: + EdkLogger.error("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['VE= RSION_MAJOR']['Value'] + \ + '.' + _ConfigItem["BUILD_TYPE"]['Value'] + _ConfigItem['VERSI= ON_MINOR']['Value'] + '.' + TimeStamp + with open(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 OutputBatchFile: + with open(OutputBatchFile, 'w') as FdOut: + if sys.platform.startswith('win'): + Id_Str =3D 'SET BIOS_ID=3D' + Id_Str + else: + Id_Str =3D 'export BIOS_ID=3D' + Id_Str + FdOut.write(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) --=20 2.14.1.windows.1 --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF82597SHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+InABAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAADBGNDdDMEJG NDdFQTYyNDA5REQ4MTVEMzFDNjlENzQzADQHAQ2ABAACAAAAAgACAAEFgAMADgAAAOMHBgARAAoA NgAbAAEAXQEBIIADAA4AAADjBwYAEQAKADYAGwABAF0BAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABADkAAABbUEFUQ0ggVjJdIEJhc2VUb29scy9HZW5CaW9zSWQ6IEFkZCBh IG5ldyB0b29sIEdlbkJpb3NJZACfEgELgAEAIQAAADBGNDdDMEJGNDdFQTYyNDA5REQ4MTVEMzFD NjlENzQzADQHAQOQBgB4GQAANAAAAAIBfwABAAAASAAAADxGQUQwRDdFMEFFMEZBNTREOTg3RjZF NzI0MzVDQUZENTBBRjgyNTk3QFNIU01TWDEwMS5jY3IuY29ycC5pbnRlbC5jb20+AAsAHw4BAAAA AgEJEAEAAAC9DwAAuQ8AAHInAABMWkZ16jlUH2EACmZiaWQEAABjY8BwZzEyNTIA/gND8HRleHQB 9wKkA+MCAARjaArAc2V0MCDvB20CgwBQEU0yCoAGtAKAln0KgAjIOwliMTkOwL8JwxZyCjIWcQKA FWIqCbBzCfAEkGF0BbIOUANgc6JvAYAgRXgRwW4YMF0GUnYEkBe2AhByAMB0fQhQbhoxECAFwAWg G2RkmiADUiAQIheyXHYIkOR3awuAZDUdUwTwB0ANF3AwCnEX8mJrbWsGcwGQACAgQk1fQuBFR0lO fQr8AfEL8aQgRwnwQmkZEEkcYGkEACBhHMBvBvAigSATGDUZ4HRoGeBCSU9RBfBJRCANwG4KwHkn HHADEBngd2gOUGgg1nUSAA4AbAuAZQqAI6J+ZBiAInAchCOxG+Ek0GdfCHAYgCHgA6Ak0i4lxWgB AkBwczovL2J1bGd6AxALYC4n4ABwbwcFoShgBbBnL3NobwR3XylxLmNnaT/BDdA9MTg0NiXFJcVg djI6djEiORkwIPJDHMB5cBngAHAcYC0A+SIycHkjoCgBLlIodiXFCENjOh+wb2IgRlEJ8GcgPAbg YitgLtpmMXFAC4AQIGwrYANwOj4weUwHcAuAMZBHYc0i8Dwl0DPiLmc0QDJvJxTAJ5AYUGQtGTBm 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 AUEAAQAAAGQAAAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkAagB1AFgA AABTAE0AVABQAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAHwAC XQEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAOVf AQAAADIAAABzAGkAcAA6AHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAA AAAAHwAaDAEAAAAYAAAARgBhAG4ALAAgAFoAaABpAGoAdQBYAAAAHwAfDAEAAAAqAAAAegBoAGkA agB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAAAAAfAB4MAQAAAAoAAABTAE0AVABQ AAAAAAACARkMAQAAAGQAAAAAAAAAgSsfpL6jEBmdbgDdAQ9UAgAAAIBGAGEAbgAsACAAWgBoAGkA agB1AFgAAABTAE0AVABQAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBt AAAAHwABXQEAAAAqAAAAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAuAGMAbwBtAAAA AAAfAPg/AQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfACNAAQAAACoAAAB6AGgAaQBq AHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AIkABAAAACgAAAFMATQBUAFAA AAAAAAIB+T8BAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwAIABaAGgAaQBq AHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0A AAAfAAldAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAA AAsAQDoBAAAAHwAaAAEAAAASAAAASQBQAE0ALgBOAG8AdABlAAAAAAADAPE/CQQAAAsAQDoBAAAA AwD9P+QEAAACAQswAQAAABAAAAAPR8C/R+piQJ3YFdMcaddDAwAXAAEAAABAADkAgDMvCPsk1QFA AAgwHWZxCPsk1QEfAACAhgMCAAAAAADAAAAAAAAARgEAAAAeAAAAYQBjAGMAZQBwAHQAbABhAG4A ZwB1AGEAZwBlAAAAAAABAAAADAAAAGUAbgAtAFUAUwAAAB8ANwABAAAAcgAAAFsAUABBAFQAQwBI ACAAVgAyAF0AIABCAGEAcwBlAFQAbwBvAGwAcwAvAEcAZQBuAEIAaQBvAHMASQBkADoAIABBAGQA ZAAgAGEAIABuAGUAdwAgAHQAbwBvAGwAIABHAGUAbgBCAGkAbwBzAEkAZAAAAAAAHwA9AAEAAAAC AAAAAAAAAAMANgAAAAAAAgFxAAEAAAAWAAAAAdUk+vLr4sxSnH91SPaTu3pqAnspYAAAHwBwAAEA AAByAAAAWwBQAEEAVABDAEgAIABWADIAXQAgAEIAYQBzAGUAVABvAG8AbABzAC8ARwBlAG4AQgBp AG8AcwBJAGQAOgAgAEEAZABkACAAYQAgAG4AZQB3ACAAdABvAG8AbAAgAEcAZQBuAEIAaQBvAHMA SQBkAAAAAAAfADUQAQAAAJAAAAA8AEYAQQBEADAARAA3AEUAMABBAEUAMABGAEEANQA0AEQAOQA4 ADcARgA2AEUANwAyADQAMwA1AEMAQQBGAEQANQAwAEEARgA4ADIANQA5ADcAQABTAEgAUwBNAFMA WAAxADAAMQAuAGMAYwByAC4AYwBvAHIAcAAuAGkAbgB0AGUAbAAuAGMAbwBtAD4AAAADAN4/n04A AEAABzCNlW0I+yTVAQIBCwABAAAAEAAAAA9HwL9H6mJAndgV0xxp10MDACYAAAAAAAIBRwABAAAA MgAAAGM9VVM7YT1NQ0k7cD1JbnRlbDtsPVNIU01TWDEwMS0xOTA2MTcxMDU0MjdaLTQ5MzAAAAAC ARAwAQAAAEYAAAAAAAAAJne9OTvsOEmkphU9y6V7QgcA+tDX4K4PpU2Yf25yQ1yv1QAAAEQRXgAA ppNoNoh2bEunStPrR5pMZAAACVSPsQAAAAAfAPo/AQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1 AFgAAAADAAlZAQAAAEAAAIAIIAYAAAAAAMAAAAAAAABGAAAAAL+FAACA5b4H+yTVAQsAAIAIIAYA AAAAAMAAAAAAAABGAAAAAIKFAAAAAAAAAwAAgAggBgAAAAAAwAAAAAAAAEYAAAAA64UAAAkEAAAf AACAhgMCAAAAAADAAAAAAAAARgEAAAAYAAAAZABsAHAALQBwAHIAbwBkAHUAYwB0AAAAAQAAABoA AABkAGwAcABlAC0AdwBpAG4AZABvAHcAcwAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGAAA AGQAbABwAC0AdgBlAHIAcwBpAG8AbgAAAAEAAAAWAAAAMQAxAC4AMAAuADYAMAAwAC4ANwAAAAAA HwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAGgAAAGQAbABwAC0AcgBlAGEAYwB0AGkAbwBuAAAAAAAB AAAAFAAAAG4AbwAtAGEAYwB0AGkAbwBuAAAAAwANNP0/AAAfAACAhgMCAAAAAADAAAAAAAAARgEA AAAgAAAAeAAtAG0AcwAtAGgAYQBzAC0AYQB0AHQAYQBjAGgAAAABAAAAAgAAAAAAAAAfAACAhgMC AAAAAADAAAAAAAAARgEAAAAiAAAAeAAtAG8AcgBpAGcAaQBuAGEAdABpAG4AZwAtAGkAcAAAAAAA AQAAACAAAABbADEAMAAuADIAMwA5AC4AMQAyADcALgA0ADAAXQAAAPxk --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50AF82597SHSMSX101ccrcor_--