public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Liming Gao" <liming.gao@intel.com>
To: "Fan, ZhijuX" <zhijux.fan@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Feng, Bob C" <bob.c.feng@intel.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Leif Lindholm <leif.lindholm@linaro.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [edk2-platform patch 1/2 V2] Platform/Intel:Add GenBiosId into edk2-platforms/Platform/Intel/Tools
Date: Wed, 26 Jun 2019 00:29:39 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E48D479@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <FAD0D7E0AE0FA54D987F6E72435CAFD50AF84271@SHSMSX101.ccr.corp.intel.com>

Reviewed-by: Liming Gao <liming.gao@intel.com>

>-----Original Message-----
>From: Fan, ZhijuX
>Sent: Friday, June 21, 2019 6:04 PM
>To: devel@edk2.groups.io
>Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C
><bob.c.feng@intel.com>; Ard Biesheuvel <ard.biesheuvel@linaro.org>; Leif
>Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
><michael.d.kinney@intel.com>
>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=1855
>
>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 <liming.gao@intel.com>
>Cc: Bob Feng <bob.c.feng@intel.com>
>Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>Cc: Leif Lindholm <leif.lindholm@linaro.org>
>Cc: Michael D Kinney <michael.d.kinney@intel.com>
>Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
>---
> 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          = 190614
>+#    TIME          = 1517
>+#
>+#  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
>+#  SPDX-License-Identifier: BSD-2-Clause-Patent
>+#
>+##
>+[config]
>+BOARD_ID      = KBLRVP3
>+BOARD_REV     = 1
>+BOARD_EXT     = 000
>+BUILD_TYPE    = D
>+VERSION_MAJOR = 0001
>+VERSION_MINOR = 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.<BR>
>+# 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 = "$IBIOSI$"
>+_SectionKeyName = '__name__'
>+_SectionName = 'config'
>+
>+_ConfigItem = {
>+    "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__ = 'GenBiosld'
>+__description__ = 'Trim files preprocessed by compiler'
>+__copyright__ = 'Copyright (c) 2019, Intel Corporation. All rights
>reserved.<BR> '
>+__version__ = '%s Version %s' % (__prog__, '0.1 ')
>+
>+# ExtraData message
>+_Usage = "Usage: GenBiosId -i Configfile -o OutputFile [-ot OutputTextFile]"
>+_ConfigSectionNotDefine = "Not support the config file format, need config
>section"
>+_ErrorMessageTemplate = '\n\n%(tool)s...\n : error: %(msg)s\n\t%(extra)s'
>+_ErrorLogger = logging.getLogger("tool_error")
>+_ErrorFormatter = logging.Formatter("%(message)s")
>+_ConfigLenInvalid = "Config item %s length is invalid"
>+_ConfigItemInvalid = "Item %s is invalid"
>+
>+# Error message
>+INFO = 20
>+ERRORCODE = 50
>+OPTION_MISSING = 'Missing option'
>+FORMAT_INVALID = 'Invalid syntax/format'
>+FILE_NOT_FOUND = 'File/directory not found in workspace'
>+FORMAT_UNKNOWN_ERROR = 'Unknown error in syntax/format'
>+FORMAT_NOT_SUPPORTED = 'Not supported syntax/format'
>+
>+
>+def SetEdkLogger():
>+    _ErrorLogger.setLevel(INFO)
>+    _ErrorCh = 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 = SetEdkLogger()
>+    TemplateDict = {"tool": ToolName, "msg": Message, "extra": ExtraData}
>+    LogText = _ErrorMessageTemplate % TemplateDict
>+    _ErrorLogger.log(ERRORCODE, LogText)
>+    sys.exit(1)
>+
>+
>+# Open the file in the correct way
>+def FileOpen(FileName, Mode, Buffer=-1):
>+    def LongFilePath(FileName):
>+        FileName = os.path.normpath(FileName)
>+        if platform.system() == '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 = argparse.ArgumentParser(prog=__prog__,
>+                                     description=__description__ + __copyright__ + _Usage,
>+                                     conflict_handler='resolve')
>+    parser.add_argument('-v', '--version', action='version',
>version=__version__,
>+                        help="show program's version number and exit")
>+    parser.add_argument('-i', '--int', metavar='FILENAME', dest='InputFile',
>help="Input Config file")
>+    parser.add_argument('-o', '--out', metavar='FILENAME', dest='OutputFile',
>help="Output file")
>+    parser.add_argument('-ot', '--text', metavar='FILENAME',
>dest='OutputTextFile', help="Output Text file")
>+    Options = parser.parse_args()
>+    return Options
>+
>+
>+# Check the Tool for missing variables
>+def CheckOptions(Options):
>+    if len(sys.argv) != 5 and not (len(sys.argv) == 7 and
>Options.OutputTextFile):
>+        EdkLogger("GenBiosId", OPTION_MISSING, ExtraData=_Usage)
>+    elif not Options.InputFile or not Options.OutputFile:
>+        EdkLogger("GenBiosId", OPTION_MISSING, ExtraData=_Usage)
>+    InputFile = Options.InputFile
>+    OutputFile = Options.OutputFile
>+    OutputTextFile = Options.OutputTextFile
>+    if not os.path.exists(InputFile):
>+        EdkLogger("GenBiosId", FILE_NOT_FOUND, ExtraData="Input file not
>found")
>+    return InputFile, OutputFile, OutputTextFile
>+
>+
>+# Parse the input file and extract the information
>+def ParserInputFile(InputFile):
>+    cf = ConfigParser()
>+    cf.optionxform = str
>+    cf.read(InputFile)
>+    if _SectionName not in cf._sections:
>+        EdkLogger("GenBiosId", FORMAT_NOT_SUPPORTED,
>ExtraData=_ConfigSectionNotDefine)
>+    for Item in cf._sections[_SectionName]:
>+        if Item == _SectionKeyName:
>+            continue
>+        if Item not in _ConfigItem:
>+            EdkLogger("GenBiosId", FORMAT_INVALID,
>ExtraData=_ConfigItemInvalid % Item)
>+        _ConfigItem[Item]['Value'] = cf._sections[_SectionName][Item]
>+        if len(_ConfigItem[Item]['Value']) != _ConfigItem[Item]['Length']:
>+            EdkLogger("GenBiosId", FORMAT_INVALID,
>ExtraData=_ConfigLenInvalid % Item)
>+    for Item in _ConfigItem:
>+        if not _ConfigItem[Item]['Value']:
>+            EdkLogger("GenBiosId", FORMAT_UNKNOWN_ERROR,
>ExtraData="Item %s is missing" % Item)
>+    utcnow = datetime.datetime.utcnow()
>+    TimeStamp = time.strftime("%y%m%d%H%M", utcnow.timetuple())
>+
>+    Id_Str = _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 = MyOptionParser()
>+    InputFile, OutputFile, OutputTextFile = CheckOptions(Options)
>+    Id_Str = ParserInputFile(InputFile)
>+    PrintOutputFile(OutputFile, OutputTextFile, Id_Str)
>+    return 0
>+
>+
>+if __name__ == '__main__':
>+    r = Main()
>+    ## 0-127 is a safe return range, and 1 is a standard default error
>+    if r < 0 or r > 127: r = 1
>+    sys.exit(r)
>--
>2.14.1.windows.1


      parent reply	other threads:[~2019-06-26  0:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-21 10:03 [edk2-platform patch 1/2 V2] Platform/Intel:Add GenBiosId into edk2-platforms/Platform/Intel/Tools Fan, ZhijuX
2019-06-21 10:30 ` Leif Lindholm
2019-06-26  0:29 ` Liming Gao [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E48D479@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox