From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web10.3996.1579145977560189937 for ; Wed, 15 Jan 2020 19:39:37 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.43, mailfrom: liming.gao@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Jan 2020 19:39:37 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,324,1574150400"; d="scan'208";a="398132212" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga005.jf.intel.com with ESMTP; 15 Jan 2020 19:39:36 -0800 Received: from shsmsx605.ccr.corp.intel.com (10.109.6.215) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 15 Jan 2020 19:39:20 -0800 Received: from shsmsx606.ccr.corp.intel.com (10.109.6.216) by SHSMSX605.ccr.corp.intel.com (10.109.6.215) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 16 Jan 2020 11:39:18 +0800 Received: from shsmsx606.ccr.corp.intel.com ([10.109.6.216]) by SHSMSX606.ccr.corp.intel.com ([10.109.6.216]) with mapi id 15.01.1713.004; Thu, 16 Jan 2020 11:39:18 +0800 From: "Liming Gao" To: PierreGondois , "devel@edk2.groups.io" CC: "ard.biesheuvel@linaro.org" , "Feng, Bob C" , "sami.mujawar@arm.com" , "nd@arm.com" Subject: Re: [PATCH v1 1/1] BaseTools: Script for converting AML to .hex Thread-Topic: [PATCH v1 1/1] BaseTools: Script for converting AML to .hex Thread-Index: AQHVywiMvmrJVYY+uECV39YJmMQ6Jafr5Xkg Date: Thu, 16 Jan 2020 03:39:18 +0000 Message-ID: <1ae336085da4471bb28cfcb2d055779d@intel.com> References: <20200114182848.48424-1-pierre.gondois@arm.com> In-Reply-To: <20200114182848.48424-1-pierre.gondois@arm.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.2.0.6 dlp-product: dlpe-windows dlp-reaction: no-action x-originating-ip: [10.239.127.36] MIME-Version: 1.0 Return-Path: liming.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I add my comments. Thanks Liming > -----Original Message----- > From: PierreGondois > Sent: Wednesday, January 15, 2020 2:29 AM > To: devel@edk2.groups.io > Cc: Pierre Gondois ; ard.biesheuvel@linaro.org; F= eng, Bob C ; Gao, Liming > ; sami.mujawar@arm.com; nd@arm.com > Subject: [PATCH v1 1/1] BaseTools: Script for converting AML to .hex >=20 > From: Pierre Gondois >=20 > The "-tc" option of the iasl compiler allows to generate a > .hex file containing a C array storing AML bytecode. >=20 > An online discussion suggested that this "-tc" option > was specific to the iasl compiler and it shouldn't be relied > on. This conversation is available at: > https://edk2.groups.io/g/devel/topic/39786201#49659 >=20 > A way to address this issue is to implement a compiler > independent script that takes an AML file as input, and > generates a .hex file. >=20 > This patch implements a Python script that converts an AML > file to a .hex file, containing a C array storing AML bytecode. > This scipt has been tested with the AML output from the > following compilers supported by the EDKII implementation: > * Intel ASL compiler > * Microsoft ASL compiler >=20 > Signed-off-by: Pierre Gondois > --- >=20 > The changes can be seen at https://github.com/PierreARM/edk2/commits/718_= asl_to_hex_script_converter_1 >=20 > Notes: > v1: > Script converting AML to .hex file [Pierre] >=20 > BaseTools/BinWrappers/PosixLike/AmlToHex | 14 ++ > BaseTools/BinWrappers/WindowsLike/AmlToHex.BAT | 3 + Here, BAT should bat to align other bat file. > BaseTools/Conf/build_rule.template | 3 + > BaseTools/Source/Python/AmlToHex/AmlToHex.py | 155 +++++++++++++++++++= + > 4 files changed, 175 insertions(+) >=20 > diff --git a/BaseTools/BinWrappers/PosixLike/AmlToHex b/BaseTools/BinWrap= pers/PosixLike/AmlToHex > new file mode 100755 > index 0000000000000000000000000000000000000000..1dd28e966288f6ea4fc52d42e= 2dc7b1f74226c23 > --- /dev/null > +++ b/BaseTools/BinWrappers/PosixLike/AmlToHex > @@ -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 p= ython > +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/0= 28 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/AmlToHex.BAT b/BaseTools/B= inWrappers/WindowsLike/AmlToHex.BAT > new file mode 100644 > index 0000000000000000000000000000000000000000..9616cd893bec9902451e6d859= 1f537cc408bd5e5 > --- /dev/null > +++ b/BaseTools/BinWrappers/WindowsLike/AmlToHex.BAT > @@ -0,0 +1,3 @@ > +@setlocal > +@set ToolName=3D%~n0% > +@%PYTHON_COMMAND% %BASE_TOOLS_PATH%\Source\Python\%ToolName%\%ToolName%.= py %* > diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_ru= le.template > index 51748bc0655a5c656258a3007b4db6b2dc941ea0..765cbb3881c59715a1bac539a= 27846e16abcbb49 100755 > --- a/BaseTools/Conf/build_rule.template > +++ b/BaseTools/Conf/build_rule.template > @@ -1,6 +1,7 @@ > # > # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved. > # Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved. > +# Copyright (c) 2020, ARM Ltd. All rights reserved.
> # SPDX-License-Identifier: BSD-2-Clause-Patent > # >=20 > @@ -427,12 +428,14 @@ > "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) /I${s_path} $(OUT= PUT_DIR)(+)${s_dir}(+)${s_base}.i > > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii > Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.ii= ii $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii > "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_= dir}(+)${s_base}.iiii > + AmlToHex $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml This step is optional. We should ignore its return value. So, its style sho= uld be prefix with '-' like: -$(OBJCOPY) $(OBJCOPY_ADDDEBUGFLAG) ${src} Thanks Liming >=20 > > Trim --asl-file --asl-deps -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_bas= e}.i -i $(INC_LIST) ${src} > "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) -I${s_path} $(OUT= PUT_DIR)(+)${s_dir}(+)${s_base}.i > > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii > Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.ii= ii $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii > "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_= dir}(+)${s_base}.iiii > + AmlToHex $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml >=20 > [C-Code-File.AcpiTable] > > diff --git a/BaseTools/Source/Python/AmlToHex/AmlToHex.py b/BaseTools/Sou= rce/Python/AmlToHex/AmlToHex.py > new file mode 100644 > index 0000000000000000000000000000000000000000..e8e7ace3a68532bc625afb1e7= 4404c4e4b0205dd > --- /dev/null > +++ b/BaseTools/Source/Python/AmlToHex/AmlToHex.py > @@ -0,0 +1,155 @@ > +## @file > +# > +# Convert an AML file to a .hex file containing the AML bytecode stored = in a > +# C array. > +# By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.hex". > +# "Tables\Dsdt.hex" will contain a C array named "dsdt_aml_code" that co= ntains > +# the AML bytecode. > +# > +# Copyright (c) 2020, ARM Limited. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > +import argparse > +import Common.EdkLogger as EdkLogger > +from Common.BuildToolError import * > +import sys > +import os > + > +## Parse the command line arguments. > +# > +# @retval A argparse.NameSpace instance, containing parsed values. > +# > +def ParseArgs(): > + # Initialize the parser. > + Parser =3D argparse.ArgumentParser( > + description=3D"Convert an AML file to a .hex file containing the A= ML " + \ > + "bytecode stored in a C array. By default, " + \ > + "\"Tables\\Dsdt.aml\" will generate" + \ > + "\"Tables\\Dsdt.hex\". \"Tables\\Dsdt.hex\" will " + \ > + "contain a C array named \"dsdt_aml_code\" that " + \ > + "contains the AML bytecode." > + ) > + > + # Define the possible arguments. > + Parser.add_argument( > + dest=3D"InputFile", > + help=3D"Path to an input AML file to generate a .hex file from." > + ) > + Parser.add_argument( > + "-o", "--out-dir", dest=3D"OutDir", > + help=3D"Output directory where the .hex file will be generated. " = + \ > + "Default is the input file's directory." > + ) > + > + # Parse the input arguments. > + Args =3D Parser.parse_args() > + SplitInputName =3D "" > + > + if not os.path.exists(Args.InputFile): > + EdkLogger.error(__file__, FILE_OPEN_FAILURE, > + ExtraData=3DArgs.InputFile) > + return > + else: > + with open(Args.InputFile, "rb") as fIn: > + Signature =3D str(fIn.read(4)) > + if ("DSDT" not in Signature) and ("SSDT" not in Signature): > + EdkLogger.error(__file__, PARAMETER_INVALID, > + ExtraData=3DArgs.InputFile, > + Message=3D"Error: Invalid file type. " += \ > + "File does not have a valid " + = \ > + "DSDT or SSDT signature.") > + > + # Get the basename of the input file. > + SplitInputName =3D os.path.splitext(Args.InputFile) > + BaseName =3D os.path.basename(SplitInputName[0]) > + > + # If no output directory is specified, output to the input directory= . > + if not Args.OutDir: > + Args.OutputFile =3D os.path.join( > + os.path.dirname(Args.InputFile), > + BaseName + ".hex" > + ) > + else: > + if not os.path.exists(Args.OutDir): > + os.mkdir(Args.OutDir) > + Args.OutputFile =3D os.path.join(Args.OutDir, BaseName + ".hex") > + > + Args.BaseName =3D BaseName > + > + return Args > + > +## Convert an AML file to a .hex file containing the AML bytecode stored > +# in a C array. > +# > +# @param InputFile Path to the input AML file. > +# @param OutputFile Path to the output .hex file to generate. > +# @param BaseName Base name of the input file. > +# This is also the name of the generated .hex file= . > +# > +def AmlToHex(InputFile, OutputFile, BaseName): > + > + MacroName =3D "__{}_HEX__".format(BaseName.upper()) > + ArrayName =3D BaseName.lower() + "_aml_code" > + > + with open(InputFile, "rb") as fIn, open(OutputFile, "w") as fOut: > + # Write header. > + fOut.write("// This file has been generated from:\n" + \ > + "// \tPython script: " + \ > + os.path.abspath(__file__) + "\n" + \ > + "// \tInput AML file: " + \ > + os.path.abspath(InputFile) + "\n\n" + \ > + "#ifndef {}\n".format(MacroName) + \ > + "#define {}\n\n".format(MacroName) > + ) > + > + # Write the array and its content. > + fOut.write("unsigned char {}[] =3D {{\n ".format(ArrayName)) > + cnt =3D 0 > + byte =3D fIn.read(1) > + while len(byte) !=3D 0: > + fOut.write("0x{0:02X}, ".format(ord(byte))) > + cnt +=3D 1 > + if (cnt % 8) =3D=3D 0: > + fOut.write("\n") > + byte =3D fIn.read(1) > + fOut.write("\n};\n") > + > + # Write footer. > + fOut.write("#endif // {}\n".format(MacroName)) > + > +## Main method > +# > +# This method: > +# 1- Initialize an EdkLogger instance. > +# 2- Parses the input arguments. > +# 3- Converts an AML file to a .hex file containing the AML bytecode = stored > +# in a C array. > +# > +# @retval 0 Success. > +# @retval 1 Error. > +# > +def Main(): > + # Initialize an EdkLogger instance. > + EdkLogger.Initialize() > + > + try: > + # Parse the input arguments. > + CommandArguments =3D ParseArgs() > + > + # Convert an AML file to a .hex file containing the AML bytecode= stored > + # in a C array. > + AmlToHex(CommandArguments.InputFile, CommandArguments.OutputFile= , > + CommandArguments.BaseName) > + except Exception as e: > + print(e) > + return 1 > + > + 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) > -- > 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' >=20