From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id F1B9D81E07 for ; Sun, 13 Nov 2016 23:18:37 -0800 (PST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP; 13 Nov 2016 23:18:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,637,1473145200"; d="scan'208";a="1068089508" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga001.fm.intel.com with ESMTP; 13 Nov 2016 23:18:42 -0800 Received: from fmsmsx153.amr.corp.intel.com (10.18.125.6) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 13 Nov 2016 23:18:41 -0800 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by FMSMSX153.amr.corp.intel.com (10.18.125.6) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 13 Nov 2016 23:18:41 -0800 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.96]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.138]) with mapi id 14.03.0248.002; Mon, 14 Nov 2016 15:18:39 +0800 From: "Zhu, Yonghong" To: "Kinney, Michael D" , "edk2-devel@lists.01.org" CC: "Gao, Liming" , "Zhu, Yonghong" Thread-Topic: [Patch v2] BaseTools/Scripts: Add BinToPcd utility Thread-Index: AQHSPioIU/sUgD0wLEaw0NMr9d3A6KDYETJA Date: Mon, 14 Nov 2016 07:18:38 +0000 Message-ID: References: <1479095321-43880-1-git-send-email-michael.d.kinney@intel.com> In-Reply-To: <1479095321-43880-1-git-send-email-michael.d.kinney@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMzAxNWJjNzYtM2FkNi00MzY4LWFjMGEtZWQyMDFiZmYxZjhhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IjloMSt2YnpManh3TVErVmtxV2lVSlIzZFBDbmZFNGFHU0JEZ1RiVHRVQlE9In0= x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch v2] BaseTools/Scripts: Add BinToPcd utility X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Nov 2016 07:18:38 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Yonghong Zhu =20 Best Regards, Zhu Yonghong -----Original Message----- From: Kinney, Michael D=20 Sent: Monday, November 14, 2016 11:49 AM To: edk2-devel@lists.01.org Cc: Zhu, Yonghong ; Gao, Liming Subject: [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 sec= tions. 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 . -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. Th= e 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 PC= D 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 sta= tement in an output file, and that output file can be included into a DSC f= ile in the matching PCD section to set the value of the PCD to the value fr= om the binary file without having to copy the value into the DSC file. Upd= ates can be made to the included file without editing the DSC file. Some e= xample 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 [PcdsFixedAtBu= ild] 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D BinToPcd.py -i test.bin {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x0d, 0x0a} Normal examples: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney --- 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 stateme= nt. +# +# Copyright (c) 2016, Intel Corporation. All rights reserved.
#=20 +This program and the accompanying materials # are licensed and made=20 +available under the terms and conditions of the BSD License # which=20 +accompanies this distribution. The full text of the license may be=20 +found at # http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,=20 +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. +# + +''' +BinToPcd +''' + +import sys +import argparse +import re + +# +# Globals for help information +# +__prog__ =3D 'BinToPcd' +__version__ =3D '%s Version %s' % (__prog__, '0.9 ') +__copyright__ =3D 'Copyright (c) 2016, Intel Corporation. All rights res= erved.' +__description__ =3D 'Convert a binary file to a VOID* PCD value or DSC fil= e VOID* PCD statement.\n' + +if __name__ =3D=3D '__main__': + def ValidateUnsignedInteger (Argument): + try: + Value =3D int (Argument, 0) + except: + Message =3D '%s is not a valid integer value.' % (Argument) + raise argparse.ArgumentTypeError(Message) + if Value < 0: + Message =3D '%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\_]*', Argu= ment) <> ['','']: + Message =3D '%s is not in the form .' % (Argument) + raise argparse.ArgumentTypeError(Message) + return Argument + + def ValidateGuidName (Argument): + if re.split('[a-zA-Z\_][a-zA-Z0-9\_]*', Argument) <> ['','']: + Message =3D '%s is not a valid GUID C name' % (Argument) + raise argparse.ArgumentTypeError(Message) + return Argument + =20 + def ByteArray (Buffer): + # + # Append byte array of values of the form '{0x01, 0x02, ...}' + # + return '{%s}' % (', '.join(['0x%02x' % (ord(Item)) for Item in=20 + Buffer])) + =20 + # + # Create command line argument parser object # parser =3D=20 + argparse.ArgumentParser(prog =3D __prog__, version =3D __version__, + description =3D __description__ + __cop= yright__, + conflict_handler =3D 'resolve') =20 + parser.add_argument("-i", "--input", dest =3D 'InputFile', type =3D argpa= rse.FileType('rb'), + help =3D "Input binary filename", required =3D True)= =20 + parser.add_argument("-o", "--output", dest =3D 'OutputFile', type =3D arg= parse.FileType('wb'), + help =3D "Output filename for PCD value or PCD=20 + statement") parser.add_argument("-p", "--pcd", dest =3D 'PcdName', type = =3D ValidatePcdName, + help =3D "Name of the PCD in the form=20 + .") + parser.add_argument("-t", "--type", dest =3D 'PcdType', default =3D None= , choices =3D ['VPD','HII'], + help =3D "PCD statement type (HII or VPD). Default= =20 + is standard.") parser.add_argument("-m", "--max-size", dest =3D 'MaxSize= ', type =3D ValidateUnsignedInteger, + help =3D "Maximum size of the PCD. Only used with=20 + --type VPD.") parser.add_argument("-f", "--offset", dest =3D 'Offset', t= ype =3D ValidateUnsignedInteger, + help =3D "VPD offset if --type is VPD. UEFI=20 + Variable offset if --type is HII.") parser.add_argument("-n", "--variabl= e-name", dest =3D 'VariableName', + help =3D "UEFI variable name. Only used with=20 + --type HII.") parser.add_argument("-g", "--variable-guid", type =3D Vali= dateGuidName, dest =3D 'VariableGuid', + help =3D "UEFI variable GUID C name. Only used=20 + with --type HII.") parser.add_argument("-v", "--verbose", dest =3D 'Verb= ose', action =3D "store_true", + help =3D "Increase output messages") =20 + parser.add_argument("-q", "--quiet", dest =3D 'Quiet', action =3D "store_= true", + help =3D "Reduce output messages") =20 + parser.add_argument("--debug", dest =3D 'Debug', type =3D int, metavar = =3D '[0-9]', choices =3D range(0,10), default =3D 0, + help =3D "Set debug level") + + # + # Parse command line arguments + # + args =3D parser.parse_args() + + # + # Read binary input file + # + try: + Buffer =3D 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=20 + args.PcdName is None: + # + # If PcdName is None, then only a PCD value is being requested. + Pcd =3D 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 tha= t + # includes the maximum size. + # + Pcd =3D ' %s|%s' % (args.PcdName, ByteArray (Buffer)) + elif args.MaxSize < len(Buffer): + print 'BinToPcd: error: argument --max-size is smaller than input fi= le.' + sys.exit() + else: + Pcd =3D ' %s|%s|VOID*|%d' % (args.PcdName, ByteArray (Buffer), args= .MaxSize) + args.MaxSize =3D len(Buffer) + =20 + if args.Verbose: + print 'PcdToBin: Convert binary file to PCD statement compatible wit= h PCD sections:' + print ' [PcdsFixedAtBuild]' + print ' [PcdsPatchableInModule]' + print ' [PcdsDynamicDefault]' + print ' [PcdsDynamicExDefault]' + elif args.PcdType =3D=3D 'VPD': + if args.MaxSize is None: + # + # If --max-size is not provided, then set maximum size to the size o= f the + # binary input file + # + args.MaxSize =3D len(Buffer) + if args.MaxSize < len(Buffer): + print 'BinToPcd: error: argument --max-size is smaller than input fi= le.' + 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 =3D ' %s|*|%d|%s' % (args.PcdName, args.MaxSize, ByteArray (Buf= fer)) + else: + # + # Use the --offset value provided. + # + Pcd =3D ' %s|%d|%d|%s' % (args.PcdName, args.Offset, args.MaxSize, = ByteArray (Buffer)) + if args.Verbose: + print 'PcdToBin: Convert binary file to PCD statement compatible wit= h PCD sections' + print ' [PcdsDynamicVpd]' + print ' [PcdsDynamicExVpd]' + elif args.PcdType =3D=3D 'HII': + if args.VariableGuid is None: + print 'BinToPcd: error: argument --variable-guid is required for --t= ype HII.' + sys.exit() + if args.VariableName is None: + print 'BinToPcd: error: argument --variable-name is required for --t= ype HII.' + sys.exit() + if args.Offset is None: + # + # Use UEFI Variable offset of 0 if --offset is not provided + # + args.Offset =3D 0 + Pcd =3D ' %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 wit= h 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