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
next prev parent 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