public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gao, Liming" <liming.gao@intel.com>
To: "Kinney, Michael D" <michael.d.kinney@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [Patch v2] BaseTools/Scripts: Add BinToPcd utility
Date: Mon, 14 Nov 2016 05:53:58 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14B4B160F@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <1479095321-43880-1-git-send-email-michael.d.kinney@intel.com>

Mike:
  There is one minor issue in help message.  -m is not only used with --type VPD. 
-m MAXSIZE, --max-size MAXSIZE
                       Maximum size of the PCD. Only used with --type VPD.

   Other are good to me. Reviewed-by: Liming Gao <liming.gao@intel.com>

Thanks
Liming
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Michael Kinney
> Sent: Monday, November 14, 2016 11:49 AM
> To: edk2-devel@lists.01.org
> Cc: Gao, Liming <liming.gao@intel.com>
> Subject: [edk2] [Patch v2] BaseTools/Scripts: Add BinToPcd utility
> 
> Add a utility that converts a binary file into a VOID* PCD value
> or a full DSC file VOID* PCD statement with support for all the
> DSC supported PCD sections.
> 
> usage: BinToPcd [-h] [--version] -i INPUTFILE [-o OUTPUTFILE] [-p PCDNAME]
>                 [-t {VPD,HII}] [-m MAXSIZE] [-f OFFSET] [-n VARIABLENAME]
>                 [-g VARIABLEGUID] [-v] [-q] [--debug [0-9]]
> 
> Convert a binary file to a VOID* PCD value or DSC file VOID* PCD statement.
> Copyright (c) 2016, Intel Corporation. All rights reserved.
> 
> optional arguments:
>   -h, --help        show this help message and exit
>   --version         show program's version number and exit
>   -i INPUTFILE, --input INPUTFILE
>                     Input binary filename
>   -o OUTPUTFILE, --output OUTPUTFILE
>                     Output filename for PCD value or PCD statement
>   -p PCDNAME, --pcd PCDNAME
>                     Name of the PCD in the form
>                     <PcdTokenSpaceGuidCName>.<PcdCName>
>   -t {VPD,HII}, --type {VPD,HII}
>                     PCD statement type (HII or VPD). Default is standard.
>   -m MAXSIZE, --max-size MAXSIZE
>                     Maximum size of the PCD. Only used with --type VPD.
>   -f OFFSET, --offset OFFSET
>                     VPD offset if --type is VPD. UEFI Variable offset if
>                     --type is HII.
>   -n VARIABLENAME, --variable-name VARIABLENAME
>                     UEFI variable name. Only used with --type HII.
>   -g VARIABLEGUID, --variable-guid VARIABLEGUID
>                     UEFI variable GUID C name. Only used with --type HII.
>   -v, --verbose     Increase output messages
>   -q, --quiet       Reduce output messages
>   --debug [0-9]     Set debug level
> 
> This utility can be used in PCD value mode to convert a binary
> file into a string that can then be copied into the PCD value field
> of a VOID* PCD.  The following is an example of PCD value mode on
> an 8 byte test.bin file.
> 
>   BinToPcd.py -i test.bin
> 
>   {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
> The DSC file VOID* PCD statement mode can be used to generate a
> complete PCD statement for the PCD section types that a DSC file
> supports:
> 
>   [PcdsFixedAtBuild]
>   [PcdsPatchableInModule]
>   [PcdsDynamicDefault]
>   [PcdsDynamicExDefault]
>   [PcdsDynamicVpd]
>   [PcdsDynamicExVpd]
>   [PcdsDynamicHii]
>   [PcdsDynamicExHii]
> 
> The PCD statement mode is useful when combined with a !include
> statement in a DSC file.  BinToPcd.py can be used to convert a
> binary file to a PCD statement in an output file, and that output
> file can be included into a DSC file in the matching PCD section
> to set the value of the PCD to the value from the binary file
> without having to copy the value into the DSC file.  Updates can be
> made to the included file without editing the DSC file.  Some
> example use cases are the setting the public key PCDs such as:
> 
>   gEfiSecurityPkgTokenSpaceGuid.PcdRsa2048Sha256PublicKeyBuffer
>   gEfiSecurityPkgTokenSpaceGuid.PcdPkcs7CertBuffer
> 
> The following example converts a public key binary file to a
> [PcdsFixedAtBuild] compatible PCD statement:
> 
>   BinToPcd.py -i PublicKey.bin -o PublicKey.pcd
>     --pcd gEfiSecurityPkgTokenSpaceGuid.PcdPkcs7CertBufferkenSpaceGuid
> 
> The PublicKey.pcd output file contains a single line:
> 
>   gEfiSecurityPkgTokenSpaceGuid.PcdPkcs7CertBuffer|{0x48, ...}
> 
> A DSC file can be updated to include the PublicKey.pcd file:
> 
>   [PcdsFixedAtBuild]
>   !include PublicKey.pcd
> 
> Value examples
> ===============
>   BinToPcd.py -i test.bin
>     {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
> Normal examples:
> =================
>   BinToPcd.py -i test.bin -p Guid.Token
>     Guid.Token|{0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
>   BinToPcd.py -i test.bin -p Guid.Token -m 20
>     Guid.Token|{0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}|VOID*|20
> 
> VPD examples:
> =============
>   BinToPcd.py -i test.bin -p Guid.Token -t VPD
>     Guid.Name|*|8|{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
>   BinToPcd.py -i test.bin -p Guid.Token -t VPD -f 20
>     Guid.Name|20|8|{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
>   BinToPcd.py -i test.bin -p Guid.Token -t VPD -m 10
>     Guid.Name|*|10|{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
>   BinToPcd.py -i test.bin -p Guid.Token -t VPD -f 20 -m 10
>     Guid.Name|20|10|{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a}
> 
> HII examples:
> =============
>   BinToPcd.py -i test.bin -p Guid.Token -t HII -g VarGuid -n VarName
>     Guid.Name|L"VarName"|VarGuid|0|{0x48, 0x65, 0x6c, 0x6c}
> 
>   BinToPcd.py -i test.bin -p Guid.Token -t HII -g VarGuid -n VarName -f 8
>     Guid.Name|L"VarName"|VarGuid|8|{0x48, 0x65, 0x6c, 0x6c}
> 
> Cc: Yonghong Zhu <yonghong.zhu@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
> ---
>  BaseTools/Scripts/BinToPcd.py | 192
> ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 192 insertions(+)
>  create mode 100644 BaseTools/Scripts/BinToPcd.py
> 
> diff --git a/BaseTools/Scripts/BinToPcd.py b/BaseTools/Scripts/BinToPcd.py
> new file mode 100644
> index 0000000..c08f73d
> --- /dev/null
> +++ b/BaseTools/Scripts/BinToPcd.py
> @@ -0,0 +1,192 @@
> +## @file
> +# Convert a binary file to a VOID* PCD value or DSC file VOID* PCD
> statement.
> +#
> +# Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the
> BSD License
> +# which accompanies this distribution.  The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +
> +'''
> +BinToPcd
> +'''
> +
> +import sys
> +import argparse
> +import re
> +
> +#
> +# Globals for help information
> +#
> +__prog__        = 'BinToPcd'
> +__version__     = '%s Version %s' % (__prog__, '0.9 ')
> +__copyright__   = 'Copyright (c) 2016, Intel Corporation. All rights reserved.'
> +__description__ = 'Convert a binary file to a VOID* PCD value or DSC file
> VOID* PCD statement.\n'
> +
> +if __name__ == '__main__':
> +  def ValidateUnsignedInteger (Argument):
> +    try:
> +      Value = int (Argument, 0)
> +    except:
> +      Message = '%s is not a valid integer value.' % (Argument)
> +      raise argparse.ArgumentTypeError(Message)
> +    if Value < 0:
> +      Message = '%s is a negative value.' % (Argument)
> +      raise argparse.ArgumentTypeError(Message)
> +    return Value
> +
> +  def ValidatePcdName (Argument):
> +    if re.split('[a-zA-Z\_][a-zA-Z0-9\_]*\.[a-zA-Z\_][a-zA-Z0-9\_]*', Argument)
> <> ['','']:
> +      Message = '%s is not in the form
> <PcdTokenSpaceGuidCName>.<PcdCName>' % (Argument)
> +      raise argparse.ArgumentTypeError(Message)
> +    return Argument
> +
> +  def ValidateGuidName (Argument):
> +    if re.split('[a-zA-Z\_][a-zA-Z0-9\_]*', Argument) <> ['','']:
> +      Message = '%s is not a valid GUID C name' % (Argument)
> +      raise argparse.ArgumentTypeError(Message)
> +    return Argument
> +
> +  def ByteArray (Buffer):
> +    #
> +    # Append byte array of values of the form '{0x01, 0x02, ...}'
> +    #
> +    return '{%s}' % (', '.join(['0x%02x' % (ord(Item)) for Item in Buffer]))
> +
> +  #
> +  # Create command line argument parser object
> +  #
> +  parser = argparse.ArgumentParser(prog = __prog__, version =
> __version__,
> +                                   description = __description__ + __copyright__,
> +                                   conflict_handler = 'resolve')
> +  parser.add_argument("-i", "--input", dest = 'InputFile', type =
> argparse.FileType('rb'),
> +                      help = "Input binary filename", required = True)
> +  parser.add_argument("-o", "--output", dest = 'OutputFile', type =
> argparse.FileType('wb'),
> +                      help = "Output filename for PCD value or PCD statement")
> +  parser.add_argument("-p", "--pcd", dest = 'PcdName', type =
> ValidatePcdName,
> +                      help = "Name of the PCD in the form
> <PcdTokenSpaceGuidCName>.<PcdCName>")
> +  parser.add_argument("-t", "--type", dest = 'PcdType', default = None,
> choices = ['VPD','HII'],
> +                      help = "PCD statement type (HII or VPD).  Default is standard.")
> +  parser.add_argument("-m", "--max-size", dest = 'MaxSize', type =
> ValidateUnsignedInteger,
> +                      help = "Maximum size of the PCD.  Only used with --type VPD.")
> +  parser.add_argument("-f", "--offset", dest = 'Offset', type =
> ValidateUnsignedInteger,
> +                      help = "VPD offset if --type is VPD.  UEFI Variable offset if --type
> is HII.")
> +  parser.add_argument("-n", "--variable-name", dest = 'VariableName',
> +                      help = "UEFI variable name.  Only used with --type HII.")
> +  parser.add_argument("-g", "--variable-guid", type = ValidateGuidName,
> dest = 'VariableGuid',
> +                      help = "UEFI variable GUID C name.  Only used with --type HII.")
> +  parser.add_argument("-v", "--verbose", dest = 'Verbose', action =
> "store_true",
> +                      help = "Increase output messages")
> +  parser.add_argument("-q", "--quiet", dest = 'Quiet', action = "store_true",
> +                      help = "Reduce output messages")
> +  parser.add_argument("--debug", dest = 'Debug', type = int, metavar = '[0-
> 9]', choices = range(0,10), default = 0,
> +                      help = "Set debug level")
> +
> +  #
> +  # Parse command line arguments
> +  #
> +  args = parser.parse_args()
> +
> +  #
> +  # Read binary input file
> +  #
> +  try:
> +    Buffer = args.InputFile.read()
> +    args.InputFile.close()
> +  except:
> +    print 'BinToPcd: error: can not read binary input file'
> +    sys.exit()
> +
> +  #
> +  # Convert binary buffer to a DSC file PCD statement
> +  #
> +  if args.PcdName is None:
> +    #
> +    # If PcdName is None, then only a PCD value is being requested.
> +    Pcd = ByteArray (Buffer)
> +    if args.Verbose:
> +      print 'PcdToBin: Convert binary file to PCD Value'
> +  elif args.PcdType is None:
> +    #
> +    # If --type is neither VPD nor HII, then use PCD statement syntax that is
> +    # compatible with [PcdsFixedAtBuild], [PcdsPatchableInModule],
> +    # [PcdsDynamicDefault], and [PcdsDynamicExDefault].
> +    #
> +    if args.MaxSize is None:
> +      #
> +      # If --max-size is not provided, then do not generate the syntax that
> +      # includes the maximum size.
> +      #
> +      Pcd = '  %s|%s' % (args.PcdName, ByteArray (Buffer))
> +    elif args.MaxSize < len(Buffer):
> +      print 'BinToPcd: error: argument --max-size is smaller than input file.'
> +      sys.exit()
> +    else:
> +      Pcd = '  %s|%s|VOID*|%d' % (args.PcdName, ByteArray (Buffer),
> args.MaxSize)
> +      args.MaxSize = len(Buffer)
> +
> +    if args.Verbose:
> +      print 'PcdToBin: Convert binary file to PCD statement compatible with
> PCD sections:'
> +      print '    [PcdsFixedAtBuild]'
> +      print '    [PcdsPatchableInModule]'
> +      print '    [PcdsDynamicDefault]'
> +      print '    [PcdsDynamicExDefault]'
> +  elif args.PcdType == 'VPD':
> +    if args.MaxSize is None:
> +      #
> +      # If --max-size is not provided, then set maximum size to the size of the
> +      # binary input file
> +      #
> +      args.MaxSize = len(Buffer)
> +    if args.MaxSize < len(Buffer):
> +      print 'BinToPcd: error: argument --max-size is smaller than input file.'
> +      sys.exit()
> +    if args.Offset is None:
> +      #
> +      # if --offset is not provided, then set offset field to '*' so build
> +      # tools will compute offset of PCD in VPD region.
> +      #
> +      Pcd = '  %s|*|%d|%s' % (args.PcdName, args.MaxSize, ByteArray
> (Buffer))
> +    else:
> +      #
> +      # Use the --offset value provided.
> +      #
> +      Pcd = '  %s|%d|%d|%s' % (args.PcdName, args.Offset, args.MaxSize,
> ByteArray (Buffer))
> +    if args.Verbose:
> +      print 'PcdToBin: Convert binary file to PCD statement compatible with
> PCD sections'
> +      print '    [PcdsDynamicVpd]'
> +      print '    [PcdsDynamicExVpd]'
> +  elif args.PcdType == 'HII':
> +    if args.VariableGuid is None:
> +      print 'BinToPcd: error: argument --variable-guid is required for --type
> HII.'
> +      sys.exit()
> +    if args.VariableName is None:
> +      print 'BinToPcd: error: argument --variable-name is required for --type
> HII.'
> +      sys.exit()
> +    if args.Offset is None:
> +      #
> +      # Use UEFI Variable offset of 0 if --offset is not provided
> +      #
> +      args.Offset = 0
> +    Pcd = '  %s|L"%s"|%s|%d|%s' % (args.PcdName, args.VariableName,
> args.VariableGuid, args.Offset, ByteArray (Buffer))
> +    if args.Verbose:
> +      print 'PcdToBin: Convert binary file to PCD statement compatible with
> PCD sections'
> +      print '    [PcdsDynamicHii]'
> +      print '    [PcdsDynamicExHii]'
> +
> +  #
> +  # Write PCD value or PCD statement to the output file
> +  #
> +  try:
> +    args.OutputFile.write (Pcd)
> +    args.OutputFile.close ()
> +  except:
> +    #
> +    # If output file is not specified or it can not be written, then write the
> +    # PCD value or PCD statement to the console
> +    #
> +    print Pcd
> --
> 2.6.3.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


  reply	other threads:[~2016-11-14  5:53 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-14  3:48 [Patch v2] BaseTools/Scripts: Add BinToPcd utility Michael Kinney
2016-11-14  5:53 ` Gao, Liming [this message]
2016-11-14  7:18 ` Zhu, Yonghong

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=4A89E2EF3DFEDB4C8BFDE51014F606A14B4B160F@shsmsx102.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