From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by mx.groups.io with SMTP id smtpd.web11.56053.1595858310799100144 for ; Mon, 27 Jul 2020 06:58:31 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@nuviainc-com.20150623.gappssmtp.com header.s=20150623 header.b=IUNL38q8; spf=pass (domain: nuviainc.com, ip: 209.85.128.67, mailfrom: leif@nuviainc.com) Received: by mail-wm1-f67.google.com with SMTP id g8so3097128wmk.3 for ; Mon, 27 Jul 2020 06:58:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nuviainc-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=DZQyLFOmtMaMQJaUs4k0r3QBXwm2WSlL8m5/cZ0fsNo=; b=IUNL38q8RIlSN6b4DwIC9ALQat5OiNhFq4wUH8cw6bAAFQc+DOn4Mkeg5abYUVtxq9 1PpQzVhhPSp/HUkR18MoLrxBEyw2F03GJiq1BMcfQyfDSnPhqcoi9PxSqtOoEe/qBlYV p7RFVPui8/oNcWPhQB4Ppzl33/jggvHHK61s+uaj/woir/K9dtXAG6cnoYWraIEHi0Af VhwUewt1OgVTCHrtGsdHos52dMAnDlCJsTmuMSFUaKNDib0UjoLvrqoTDgSsFAXluyE4 9JT4S79eILqtDhpQroFl42pakeljqPxfnIpALRQKCdQc1hJ+RHfc2QiJdbfxhGfMTslO wYLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=DZQyLFOmtMaMQJaUs4k0r3QBXwm2WSlL8m5/cZ0fsNo=; b=H0AuoENWIej1/jRLD9i40hHNUd4PWnBvRstvxcOVPho0w3aqB8desrtYm0wI3dzjfX lrCcwRXTsEFUI1Lpyk8dIbqwVJh+ACT75AfA58DLIx+ZeLr7XY7ppQAHy5eY2cAEkoQD g9DojCAG8FFgwp0b+d1LmXe0Z8QztUQ24G0kHaKK6KxKVU1acR8ey4jStpaXU089YA/O OevDTWlTpJJY84eJflhcynKiYCEA5uXG+XBDo2CpVoXpGUt/KJ2TD8EbP5MMCZlfnFet tzkdZYogmq7Ddqr8Pdzwv1G1Wqb2lMs3/i/kM1vwjtGVwqZaYf/Qu5k1f7QrbK8J9BQH 1TzQ== X-Gm-Message-State: AOAM5305hpFN77uykqS4AP8jGhHdPnbEcmmK1NOPClnI5/PfxhytH392 fj28tBXJnQBBBE0IM+FiK4nmEAcFlfW05SWZc06MGgbPbv6ApiPUsd5JgVJ8oQbC7zCxW5cCo3W Zxc5N8+6R+SIz95DZ27RKrunepmBUQz03vurG50vvpELZ+dKxcx/+ivWlimdb5AeVbQ== X-Google-Smtp-Source: ABdhPJzZT1m+4dHbx09iru49fu60Ez2bIi2qS6RZpE6c00D/HJlshLC9LHTBGegzIgVSwaUOso3ElQ== X-Received: by 2002:a1c:7d81:: with SMTP id y123mr17510369wmc.87.1595858308847; Mon, 27 Jul 2020 06:58:28 -0700 (PDT) Return-Path: Received: from vanye ([2001:470:1f09:12f0:b26e:bfff:fea9:f1b8]) by smtp.gmail.com with ESMTPSA id p11sm12662638wre.32.2020.07.27.06.58.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jul 2020 06:58:28 -0700 (PDT) Date: Mon, 27 Jul 2020 14:58:25 +0100 From: "Leif Lindholm" To: devel@edk2.groups.io, pierre.gondois@arm.com, Masahisa Kojima Cc: sami.mujawar@arm.com, tomas.pilar@arm.com, bob.c.feng@intel.com, liming.gao@intel.com, Ard Biesheuvel Subject: Re: [edk2-devel] [PATCH v5 4/5] BaseTools: Compile AML bytecode arrays into .obj file Message-ID: <20200727135825.GZ1337@vanye> References: <20200701140604.5292-1-pierre.gondois@arm.com> <20200701140604.5292-5-pierre.gondois@arm.com> MIME-Version: 1.0 In-Reply-To: <20200701140604.5292-5-pierre.gondois@arm.com> User-Agent: Mutt/1.10.1 (2018-07-13) Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit Hi Pierre, (+Masahisa) This commit (0a4aa20e8d44) made for an exciting start to my week. Socionext's Developerbox failed to build for me, with the spectacular error message: /usr/lib/gcc-cross/aarch64-linux-gnu/8/../../../../aarch64-linux-gnu/bin/ld: DWARF error: could not find abbrev number 5912 /tmp/ccKt4gaM.ltrans0.ltrans.o: in function `RegisterDevices': :(.text.RegisterDevices+0xb0): undefined reference to `RegisterEmmc' GCC49 (without lto) and CLANG38 profiles give much the same result, with slightly less esoteric messages. The reason for this turned out to be that edk2-platforms Silicon/Socionext/SynQuacer/Drivers/PlatformDxe/ has both an Emmc.asl and an Emmc.c file, which after this patch both generate an Emmc.obj in the same output directory. I think the correct course of action is to fix this in the SynQuacer driver, but I am reporting it here so we get it logged in the list archives. It would of course be good if the build system could detect and warn over cases like this, rather than silently overwriting existing object files. Masahisa - since Ard is still on holiday, could you create a patch and send out for me to review? Either one of the files needs to be renamed, or we need to move the .asl files (Emmc.asl and Optee.asl) into a subdirectory. Best Regards, Leif On Wed, Jul 01, 2020 at 15:06:03 +0100, PierreGondois wrote: > From: Pierre Gondois > > The AmlToHex script and Posix/WindowsLike wrappers convert > an AML file to a .hex file, containing a C array storing > AML bytecode. This ".hex" file can then be included in a > C file, allowing to access the AML bytecode from this C > file. > > The EDK2 build system doesn't allow to a depict dependency > orders between files of different languages. For instance, > in a module containing a ".c" file and a ".asl", the ".c" > file may or may not be built prior to the ".asl" file. > This prevents any inclusion of a generated ".hex" in a > ".c" file since this later ".hex" file may or may not > have been created yet. > > This patch modifies the AmlToC script to generate a C file > instead of a ".hex" file. > It also adds the generation of an intermediate ".amli" file > when compiling an ASL file, and adds a rule to convert this > ".amli" to a C file. > > This allows to generate a C file containing the AML bytecode > from an ASL file. This C file will then be handled by the EDK2 > build system to generate an object file. > Thus, no file inclusion will be required anymore. The C file > requiring the AML bytecode as a C array, and the ASL file, > will be compiled independently. The C array must be defined > as an external symbol. The linker is resolving the > reference to the C array symbol. > > To summarize, the flow goes as: > -1. ASL file is compiled to AML; > -2. AML file is copied to a ".amli" intermediate file; > -3. EDK2 build system applies the rule relevant to ".amli" > files. This is, calling the "AmlToC" script, generating > a C file from the ".amli" file; > -4. EDK2 build system applies the rule relevant to C files. > This is creating an object file. > -5. EDK2 build system links the object file containing the > AML bytecode with the object file requiring it. > > Signed-off-by: Pierre Gondois > Suggested-by: Tomas Pilar > --- > > The changes can be seen at: https://github.com/PierreARM/edk2/commits/803_Compile_AML_bytecode_array_into_OBJ_file_v5 > > Notes: > v1: > - Add a new rule to the build_rule.template file to > generate ".obj" files from .asl files, and modify > the AmlToC script accordingly. [Pierre] > v2: > - Restrict the rule to DXE_DRIVER. This allows to build > the OvmfPkg, which was not the case in v1. [Pierre] > v3: > - Changed "Signed-off-by" to "Suggested-by". [Bob] > v4: > - No modification. Re-sending the patch with base64 > encoding to conserve the right line endings. [Bob] > v5: > - No modification. [Pierre] > > BaseTools/Conf/build_rule.template | 15 +++- > BaseTools/Source/Python/AmlToC/AmlToC.py | 82 ++++++++------------ > 2 files changed, 47 insertions(+), 50 deletions(-) > > diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template > index 0822b681fcd9f61c6508e6f93ffc31fa70fd7059..c034869915914936e28f64a6aadba08e0169da44 100755 > --- a/BaseTools/Conf/build_rule.template > +++ b/BaseTools/Conf/build_rule.template > @@ -419,6 +419,7 @@ > > > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml > + $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli > > > $(MAKE_FILE) > @@ -428,14 +429,24 @@ > "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) /I${s_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii > Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii $(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 > + $(CP) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli > > > Trim --asl-file --asl-deps -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i -i $(INC_LIST) ${src} > "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) -I${s_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii > Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii $(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 > + $(CP) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli > + > +[Acpi-Machine-Language-File-to-C.DXE_DRIVER] > + > + ?.amli > + > + > + ${s_path}(+)${s_base}.c > + > + > + -AmlToC ${src} > > [C-Code-File.AcpiTable] > > diff --git a/BaseTools/Source/Python/AmlToC/AmlToC.py b/BaseTools/Source/Python/AmlToC/AmlToC.py > index 643db2910e37acfdd80ac18d288c921320a79ce1..346de7159de702d860bbd809ddbe8175f1493cfb 100644 > --- a/BaseTools/Source/Python/AmlToC/AmlToC.py > +++ b/BaseTools/Source/Python/AmlToC/AmlToC.py > @@ -1,9 +1,9 @@ > ## @file > # > -# Convert an AML file to a .hex file containing the AML bytecode stored in a > +# Convert an AML file to a .c 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 contains > +# By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.c". > +# "Tables\Dsdt.c" will contain a C array named "dsdt_aml_code" that contains > # the AML bytecode. > # > # Copyright (c) 2020, ARM Limited. All rights reserved.
> @@ -17,31 +17,26 @@ from Common.BuildToolError import * > import sys > import os > > +__description__ = """ > +Convert an AML file to a .c file containing the AML bytecode stored in a C > +array. By default, Tables\Dsdt.aml will generate Tables\Dsdt.c. > +Tables\Dsdt.c will contain a C array named "dsdt_aml_code" that contains > +the AML bytecode. > +""" > + > ## Parse the command line arguments. > # > # @retval A argparse.NameSpace instance, containing parsed values. > # > def ParseArgs(): > # Initialize the parser. > - Parser = argparse.ArgumentParser( > - description="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 " + \ > - "contains the AML bytecode." > - ) > + Parser = argparse.ArgumentParser(description=__description__) > > # Define the possible arguments. > - Parser.add_argument( > - dest="InputFile", > - help="Path to an input AML file to generate a .hex file from." > - ) > - Parser.add_argument( > - "-o", "--out-dir", dest="OutDir", > - help="Output directory where the .hex file will be generated. " + \ > - "Default is the input file's directory." > - ) > + Parser.add_argument(dest="InputFile", > + help="Path to an input AML file to generate a .c file from.") > + Parser.add_argument("-o", "--out-dir", dest="OutDir", > + help="Output directory where the .c file will be generated. Default is the input file's directory.") > > # Parse the input arguments. > Args = Parser.parse_args() > @@ -55,9 +50,7 @@ def ParseArgs(): > with open(Args.InputFile, "rb") as fIn: > Signature = str(fIn.read(4)) > if ("DSDT" not in Signature) and ("SSDT" not in Signature): > - EdkLogger.info("Invalid file type. " + \ > - "File does not have a valid " + \ > - "DSDT or SSDT signature: %s" % Args.InputFile) > + EdkLogger.info("Invalid file type. File does not have a valid DSDT or SSDT signature: {}".format(Args.InputFile)) > return None > > # Get the basename of the input file. > @@ -66,42 +59,39 @@ def ParseArgs(): > > # If no output directory is specified, output to the input directory. > if not Args.OutDir: > - Args.OutputFile = os.path.join( > - os.path.dirname(Args.InputFile), > - BaseName + ".hex" > - ) > + Args.OutputFile = os.path.join(os.path.dirname(Args.InputFile), > + BaseName + ".c") > else: > if not os.path.exists(Args.OutDir): > os.mkdir(Args.OutDir) > - Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".hex") > + Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".c") > > Args.BaseName = BaseName > > return Args > > -## Convert an AML file to a .hex file containing the AML bytecode stored > +## Convert an AML file to a .c 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 OutputFile Path to the output .c file to generate. > # @param BaseName Base name of the input file. > -# This is also the name of the generated .hex file. > +# This is also the name of the generated .c file. > # > -def AmlToHex(InputFile, OutputFile, BaseName): > +def AmlToC(InputFile, OutputFile, BaseName): > > - MacroName = "__{}_HEX__".format(BaseName.upper()) > ArrayName = BaseName.lower() + "_aml_code" > + FileHeader =\ > +""" > +// This file has been generated from: > +// -Python script: {} > +// -Input AML file: {} > + > +""" > > 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) > - ) > + fOut.write(FileHeader.format(os.path.abspath(InputFile), os.path.abspath(__file__))) > > # Write the array and its content. > fOut.write("unsigned char {}[] = {{\n ".format(ArrayName)) > @@ -115,15 +105,12 @@ def AmlToHex(InputFile, OutputFile, BaseName): > byte = 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 > +# 3- Converts an AML file to a .c file containing the AML bytecode stored > # in a C array. > # > # @retval 0 Success. > @@ -139,10 +126,9 @@ def Main(): > if not CommandArguments: > return 1 > > - # Convert an AML file to a .hex file containing the AML bytecode stored > + # Convert an AML file to a .c file containing the AML bytecode stored > # in a C array. > - AmlToHex(CommandArguments.InputFile, CommandArguments.OutputFile, > - CommandArguments.BaseName) > + AmlToC(CommandArguments.InputFile, CommandArguments.OutputFile, CommandArguments.BaseName) > except Exception as e: > print(e) > return 1 > -- > 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' > > ÿ