ACK: [PATCH 1/2] ACPICA: Update to version 20151218 (LP: #1527733)
ivanhu
ivan.hu at canonical.com
Tue Dec 22 07:57:36 UTC 2015
On 2015年12月19日 04:07, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
>
> https://lists.acpica.org/pipermail/devel/2015-December/000865.html
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpica/fwts_acpica.c | 2 +
> src/acpica/source/common/acfileio.c | 226 +++++++++++--
> src/acpica/source/common/adisasm.c | 13 +-
> src/acpica/source/common/getopt.c | 348 +++++++++++++++++++++
> src/acpica/source/compiler/Makefile.am | 1 +
> src/acpica/source/compiler/aslascii.c | 88 +-----
> src/acpica/source/compiler/aslcompiler.h | 16 +-
> src/acpica/source/compiler/aslcompiler.y | 10 +-
> src/acpica/source/compiler/asldefine.h | 8 +-
> src/acpica/source/compiler/aslfiles.c | 4 +-
> src/acpica/source/compiler/aslglobal.h | 2 +-
> src/acpica/source/compiler/asllisting.c | 30 +-
> src/acpica/source/compiler/aslmain.c | 3 +-
> src/acpica/source/compiler/aslmap.c | 2 +-
> src/acpica/source/compiler/aslopcodes.c | 1 -
> src/acpica/source/compiler/aslrules.y | 10 +-
> src/acpica/source/compiler/aslstartup.c | 81 ++---
> src/acpica/source/compiler/aslsupport.l | 6 +-
> src/acpica/source/compiler/asltree.c | 22 +-
> src/acpica/source/compiler/aslutils.c | 44 ++-
> src/acpica/source/compiler/aslwalks.c | 15 +-
> src/acpica/source/compiler/dttemplate.c | 293 +++++++++++++----
> src/acpica/source/compiler/dttemplate.h | 30 --
> src/acpica/source/components/debugger/dbdisply.c | 28 +-
> src/acpica/source/components/debugger/dbinput.c | 2 +-
> .../source/components/disassembler/dmopcode.c | 124 ++++++++
> src/acpica/source/components/disassembler/dmwalk.c | 49 +--
> src/acpica/source/components/dispatcher/dsinit.c | 2 +-
> src/acpica/source/components/events/evhandler.c | 169 +++++-----
> src/acpica/source/components/events/evregion.c | 124 ++++++--
> src/acpica/source/components/events/evrgnini.c | 101 ++----
> src/acpica/source/components/events/evxfregn.c | 41 +--
> src/acpica/source/components/executer/excreate.c | 7 +-
> src/acpica/source/components/executer/exdebug.c | 76 +++--
> src/acpica/source/components/executer/exdump.c | 6 +-
> src/acpica/source/components/executer/exmisc.c | 45 ++-
> src/acpica/source/components/executer/exoparg1.c | 2 +-
> src/acpica/source/components/namespace/nsconvert.c | 86 ++++-
> src/acpica/source/components/namespace/nseval.c | 66 +---
> src/acpica/source/components/namespace/nsload.c | 18 ++
> src/acpica/source/components/namespace/nsrepair.c | 11 +-
> src/acpica/source/components/parser/psargs.c | 19 +-
> src/acpica/source/components/parser/psloop.c | 4 +-
> src/acpica/source/components/parser/psopcode.c | 2 +-
> src/acpica/source/components/tables/tbutils.c | 9 +-
> src/acpica/source/components/utilities/utinit.c | 1 -
> src/acpica/source/components/utilities/utstring.c | 9 +
> src/acpica/source/components/utilities/utxfinit.c | 75 +++--
> src/acpica/source/include/acapps.h | 14 +-
> src/acpica/source/include/acevents.h | 18 +-
> src/acpica/source/include/acexcep.h | 6 +-
> src/acpica/source/include/acglobal.h | 5 +-
> src/acpica/source/include/aclocal.h | 3 +
> src/acpica/source/include/acnamesp.h | 9 +
> src/acpica/source/include/acobject.h | 7 +-
> src/acpica/source/include/acopcode.h | 10 +-
> src/acpica/source/include/acparser.h | 7 +-
> src/acpica/source/include/acpixf.h | 11 +-
> src/acpica/source/include/amlcode.h | 5 +-
> src/acpica/source/tools/acpiexec/aecommon.h | 4 +
> src/acpica/source/tools/acpiexec/aehandlers.c | 63 ++--
> src/acpica/source/tools/acpiexec/aeregion.c | 58 +++-
> src/utilities/kernelscan.c | 3 +
> 63 files changed, 1827 insertions(+), 727 deletions(-)
> create mode 100644 src/acpica/source/common/getopt.c
>
> diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
> index 77a96ca..88f83a6 100644
> --- a/src/acpica/fwts_acpica.c
> +++ b/src/acpica/fwts_acpica.c
> @@ -1099,6 +1099,8 @@ int fwts_acpica_init(fwts_framework *fw)
> fwts_acpica_RSDP = NULL;
> }
>
> + AcpiGbl_OverrideDefaultRegionHandlers = TRUE;
> +
> if (ACPI_FAILURE(AcpiInitializeSubsystem())) {
> fwts_log_error(fw, "Failed to initialise ACPICA subsystem.");
> goto failed;
> diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
> index 7d6cc23..d260120 100644
> --- a/src/acpica/source/common/acfileio.c
> +++ b/src/acpica/source/common/acfileio.c
> @@ -127,20 +127,20 @@
> /* Local prototypes */
>
> static ACPI_STATUS
> -AcpiAcGetOneTableFromFile (
> +AcGetOneTableFromFile (
> char *Filename,
> FILE *File,
> UINT8 GetOnlyAmlTables,
> ACPI_TABLE_HEADER **Table);
>
> static ACPI_STATUS
> -AcpiAcCheckTextModeCorruption (
> +AcCheckTextModeCorruption (
> ACPI_TABLE_HEADER *Table);
>
>
> /*******************************************************************************
> *
> - * FUNCTION: AcpiAcGetAllTablesFromFile
> + * FUNCTION: AcGetAllTablesFromFile
> *
> * PARAMETERS: Filename - Table filename
> * GetOnlyAmlTables - TRUE if the tables must be AML tables
> @@ -153,7 +153,7 @@ AcpiAcCheckTextModeCorruption (
> ******************************************************************************/
>
> ACPI_STATUS
> -AcpiAcGetAllTablesFromFile (
> +AcGetAllTablesFromFile (
> char *Filename,
> UINT8 GetOnlyAmlTables,
> ACPI_NEW_TABLE_DESC **ReturnListHead)
> @@ -187,19 +187,36 @@ AcpiAcGetAllTablesFromFile (
> return (AE_ERROR);
> }
>
> - if (FileSize < 4)
> + fprintf (stderr,
> + "Input file %s, Length 0x%X (%u) bytes\n",
> + Filename, FileSize, FileSize);
> +
> + /* We must have at least one ACPI table header */
> +
> + if (FileSize < sizeof (ACPI_TABLE_HEADER))
> {
> return (AE_BAD_HEADER);
> }
>
> + /* Check for an non-binary file */
> +
> + if (!AcIsFileBinary (File))
> + {
> + fprintf (stderr,
> + " %s: File does not appear to contain a valid AML table\n",
> + Filename);
> + return (AE_TYPE);
> + }
> +
> /* Read all tables within the file */
>
> while (ACPI_SUCCESS (Status))
> {
> /* Get one entire ACPI table */
>
> - Status = AcpiAcGetOneTableFromFile (
> + Status = AcGetOneTableFromFile (
> Filename, File, GetOnlyAmlTables, &Table);
> +
> if (Status == AE_CTRL_TERMINATE)
> {
> Status = AE_OK;
> @@ -207,13 +224,20 @@ AcpiAcGetAllTablesFromFile (
> }
> else if (Status == AE_TYPE)
> {
> - continue;
> + return (AE_OK);
> }
> else if (ACPI_FAILURE (Status))
> {
> return (Status);
> }
>
> + /* Print table header for iASL/disassembler only */
> +
> +#ifdef ACPI_ASL_COMPILER
> +
> + AcpiTbPrintTableHeader (0, Table);
> +#endif
> +
> /* Allocate and link a table descriptor */
>
> TableDesc = AcpiOsAllocate (sizeof (ACPI_NEW_TABLE_DESC));
> @@ -258,7 +282,7 @@ AcpiAcGetAllTablesFromFile (
>
> /*******************************************************************************
> *
> - * FUNCTION: AcpiAcGetOneTableFromFile
> + * FUNCTION: AcGetOneTableFromFile
> *
> * PARAMETERS: Filename - File where table is located
> * File - Open FILE pointer to Filename
> @@ -276,7 +300,7 @@ AcpiAcGetAllTablesFromFile (
> ******************************************************************************/
>
> static ACPI_STATUS
> -AcpiAcGetOneTableFromFile (
> +AcGetOneTableFromFile (
> char *Filename,
> FILE *File,
> UINT8 GetOnlyAmlTables,
> @@ -286,21 +310,28 @@ AcpiAcGetOneTableFromFile (
> ACPI_TABLE_HEADER TableHeader;
> ACPI_TABLE_HEADER *Table;
> INT32 Count;
> - long Position;
> + long TableOffset;
>
>
> *ReturnTable = NULL;
>
> + /* Get the table header to examine signature and length */
>
> - /* Get just the table header to get signature and length */
> -
> - Position = ftell (File);
> + TableOffset = ftell (File);
> Count = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File);
> if (Count != sizeof (ACPI_TABLE_HEADER))
> {
> return (AE_CTRL_TERMINATE);
> }
>
> + /* Validate the table signature/header (limited ASCII chars) */
> +
> + Status = AcValidateTableHeader (File, TableOffset);
> + if (ACPI_FAILURE (Status))
> + {
> + return (Status);
> + }
> +
> if (GetOnlyAmlTables)
> {
> /* Table must be an AML table (DSDT/SSDT) or FADT */
> @@ -309,7 +340,7 @@ AcpiAcGetOneTableFromFile (
> !AcpiUtIsAmlTable (&TableHeader))
> {
> fprintf (stderr,
> - " %s: [%4.4s] is not an AML table - ignoring\n",
> + " %s: Table [%4.4s] is not an AML table - ignoring\n",
> Filename, TableHeader.Signature);
>
> return (AE_TYPE);
> @@ -324,9 +355,9 @@ AcpiAcGetOneTableFromFile (
> return (AE_NO_MEMORY);
> }
>
> - /* Now read the entire table */
> + /* Read the entire ACPI table, including header */
>
> - fseek (File, Position, SEEK_SET);
> + fseek (File, TableOffset, SEEK_SET);
>
> Count = fread (Table, 1, TableHeader.Length, File);
> if (Count != (INT32) TableHeader.Length)
> @@ -340,18 +371,13 @@ AcpiAcGetOneTableFromFile (
> Status = AcpiTbVerifyChecksum (Table, TableHeader.Length);
> if (ACPI_FAILURE (Status))
> {
> - Status = AcpiAcCheckTextModeCorruption (Table);
> + Status = AcCheckTextModeCorruption (Table);
> if (ACPI_FAILURE (Status))
> {
> goto ErrorExit;
> }
> }
>
> - fprintf (stderr,
> - "Loading ACPI table [%4.4s] from file %12s - Length 0x%06X (%u)\n",
> - TableHeader.Signature, Filename,
> - TableHeader.Length, TableHeader.Length);
> -
> *ReturnTable = Table;
> return (AE_OK);
>
> @@ -364,7 +390,159 @@ ErrorExit:
>
> /*******************************************************************************
> *
> - * FUNCTION: AcpiAcCheckTextModeCorruption
> + * FUNCTION: AcIsFileBinary
> + *
> + * PARAMETERS: File - Open input file
> + *
> + * RETURN: TRUE if file appears to be binary
> + *
> + * DESCRIPTION: Scan a file for any non-ASCII bytes.
> + *
> + * Note: Maintains current file position.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AcIsFileBinary (
> + FILE *File)
> +{
> + UINT8 Byte;
> + BOOLEAN IsBinary = FALSE;
> + long FileOffset;
> +
> +
> + /* Scan entire file for any non-ASCII bytes */
> +
> + FileOffset = ftell (File);
> + while (fread (&Byte, 1, 1, File) == 1)
> + {
> + if (!isprint (Byte) && !isspace (Byte))
> + {
> + IsBinary = TRUE;
> + goto Exit;
> + }
> + }
> +
> +Exit:
> + fseek (File, FileOffset, SEEK_SET);
> + return (IsBinary);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcValidateTableHeader
> + *
> + * PARAMETERS: File - Open input file
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Determine if a file seems to contain one or more binary ACPI
> + * tables, via the
> + * following checks on what would be the table header:
> + * 1) File must be at least as long as an ACPI_TABLE_HEADER
> + * 2) There must be enough room in the file to hold entire table
> + * 3) Signature, OemId, OemTableId, AslCompilerId must be ASCII
> + *
> + * Note: There can be multiple definition blocks per file, so we cannot
> + * expect/compare the file size to be equal to the table length. 12/2015.
> + *
> + * Note: Maintains current file position.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcValidateTableHeader (
> + FILE *File,
> + long TableOffset)
> +{
> + ACPI_TABLE_HEADER TableHeader;
> + size_t Actual;
> + long OriginalOffset;
> + UINT32 FileSize;
> + UINT32 i;
> +
> +
> + ACPI_FUNCTION_TRACE ("AcValidateTableHeader");
> +
> +
> + /* Read a potential table header */
> +
> + OriginalOffset = ftell (File);
> + fseek (File, TableOffset, SEEK_SET);
> +
> + Actual = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File);
> + fseek (File, OriginalOffset, SEEK_SET);
> +
> + if (Actual < sizeof (ACPI_TABLE_HEADER))
> + {
> + return (AE_ERROR);
> + }
> +
> + /* Validate the signature (limited ASCII chars) */
> +
> + if (!AcpiIsValidSignature (TableHeader.Signature))
> + {
> + fprintf (stderr, "Invalid table signature: 0x%8.8X\n",
> + *ACPI_CAST_PTR (UINT32, TableHeader.Signature));
> + return (AE_BAD_SIGNATURE);
> + }
> +
> + /* Validate table length against bytes remaining in the file */
> +
> + FileSize = CmGetFileSize (File);
> + if (TableHeader.Length > (UINT32) (FileSize - TableOffset))
> + {
> + fprintf (stderr, "Table [%4.4s] is too long for file - "
> + "needs: 0x%.2X, remaining in file: 0x%.2X\n",
> + TableHeader.Signature, TableHeader.Length,
> + (UINT32) (FileSize - TableOffset));
> + return (AE_BAD_HEADER);
> + }
> +
> + /*
> + * These fields must be ASCII: OemId, OemTableId, AslCompilerId.
> + * We allow a NULL terminator in OemId and OemTableId.
> + */
> + for (i = 0; i < ACPI_NAME_SIZE; i++)
> + {
> + if (!ACPI_IS_ASCII ((UINT8) TableHeader.AslCompilerId[i]))
> + {
> + goto BadCharacters;
> + }
> + }
> +
> + for (i = 0; (i < ACPI_OEM_ID_SIZE) && (TableHeader.OemId[i]); i++)
> + {
> + if (!ACPI_IS_ASCII ((UINT8) TableHeader.OemId[i]))
> + {
> + goto BadCharacters;
> + }
> + }
> +
> + for (i = 0; (i < ACPI_OEM_TABLE_ID_SIZE) && (TableHeader.OemTableId[i]); i++)
> + {
> + if (!ACPI_IS_ASCII ((UINT8) TableHeader.OemTableId[i]))
> + {
> + goto BadCharacters;
> + }
> + }
> +
> + return (AE_OK);
> +
> +
> +BadCharacters:
> +
> + ACPI_WARNING ((AE_INFO,
> + "Table header for [%4.4s] has invalid ASCII character(s)",
> + TableHeader.Signature));
> + return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcCheckTextModeCorruption
> *
> * PARAMETERS: Table - Table buffer starting with table header
> *
> @@ -377,7 +555,7 @@ ErrorExit:
> ******************************************************************************/
>
> static ACPI_STATUS
> -AcpiAcCheckTextModeCorruption (
> +AcCheckTextModeCorruption (
> ACPI_TABLE_HEADER *Table)
> {
> UINT32 i;
> diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
> index 071649a..3b0b2c0 100644
> --- a/src/acpica/source/common/adisasm.c
> +++ b/src/acpica/source/common/adisasm.c
> @@ -264,10 +264,12 @@ AdAmlDisassemble (
> {
> /* Get the list of all AML tables in the file */
>
> - Status = AcpiAcGetAllTablesFromFile (Filename,
> + Status = AcGetAllTablesFromFile (Filename,
> ACPI_GET_ALL_TABLES, &ListHead);
> if (ACPI_FAILURE (Status))
> {
> + AcpiOsPrintf ("Could not get ACPI tables from %s, %s\n",
> + Filename, AcpiFormatException (Status));
> return (Status);
> }
>
> @@ -353,13 +355,12 @@ AdAmlDisassemble (
>
> Cleanup:
>
> -// check!
> -#if 0
> - if (Table && !AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
> + if (Table &&
> + !AcpiGbl_ForceAmlDisassembly &&
> + !AcpiUtIsAmlTable (Table))
> {
> ACPI_FREE (Table);
> }
> -#endif
>
> if (File)
> {
> @@ -664,7 +665,7 @@ AdDoExternalFileList (
> AcpiOsPrintf ("External object resolution file %16s\n",
> ExternalFilename);
>
> - Status = AcpiAcGetAllTablesFromFile (
> + Status = AcGetAllTablesFromFile (
> ExternalFilename, ACPI_GET_ONLY_AML_TABLES, &ExternalListHead);
> if (ACPI_FAILURE (Status))
> {
> diff --git a/src/acpica/source/common/getopt.c b/src/acpica/source/common/getopt.c
> new file mode 100644
> index 0000000..23c4495
> --- /dev/null
> +++ b/src/acpica/source/common/getopt.c
> @@ -0,0 +1,348 @@
> +/******************************************************************************
> + *
> + * Module Name: getopt
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2015, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +/*
> + * ACPICA getopt() implementation
> + *
> + * Option strings:
> + * "f" - Option has no arguments
> + * "f:" - Option requires an argument
> + * "f+" - Option has an optional argument
> + * "f^" - Option has optional single-char sub-options
> + * "f|" - Option has required single-char sub-options
> + */
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acapps.h"
> +
> +#define ACPI_OPTION_ERROR(msg, badchar) \
> + if (AcpiGbl_Opterr) {AcpiLogError ("%s%c\n", msg, badchar);}
> +
> +
> +int AcpiGbl_Opterr = 1;
> +int AcpiGbl_Optind = 1;
> +int AcpiGbl_SubOptChar = 0;
> +char *AcpiGbl_Optarg;
> +
> +static int CurrentCharPtr = 1;
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiGetoptArgument
> + *
> + * PARAMETERS: argc, argv - from main
> + *
> + * RETURN: 0 if an argument was found, -1 otherwise. Sets AcpiGbl_Optarg
> + * to point to the next argument.
> + *
> + * DESCRIPTION: Get the next argument. Used to obtain arguments for the
> + * two-character options after the original call to AcpiGetopt.
> + * Note: Either the argument starts at the next character after
> + * the option, or it is pointed to by the next argv entry.
> + * (After call to AcpiGetopt, we need to backup to the previous
> + * argv entry).
> + *
> + ******************************************************************************/
> +
> +int
> +AcpiGetoptArgument (
> + int argc,
> + char **argv)
> +{
> +
> + AcpiGbl_Optind--;
> + CurrentCharPtr++;
> +
> + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
> + {
> + AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
> + }
> + else if (++AcpiGbl_Optind >= argc)
> + {
> + ACPI_OPTION_ERROR ("Option requires an argument: -", 'v');
> +
> + CurrentCharPtr = 1;
> + return (-1);
> + }
> + else
> + {
> + AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
> + }
> +
> + CurrentCharPtr = 1;
> + return (0);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiGetopt
> + *
> + * PARAMETERS: argc, argv - from main
> + * opts - options info list
> + *
> + * RETURN: Option character or ACPI_OPT_END
> + *
> + * DESCRIPTION: Get the next option
> + *
> + ******************************************************************************/
> +
> +int
> +AcpiGetopt(
> + int argc,
> + char **argv,
> + char *opts)
> +{
> + int CurrentChar;
> + char *OptsPtr;
> +
> +
> + if (CurrentCharPtr == 1)
> + {
> + if (AcpiGbl_Optind >= argc ||
> + argv[AcpiGbl_Optind][0] != '-' ||
> + argv[AcpiGbl_Optind][1] == '\0')
> + {
> + return (ACPI_OPT_END);
> + }
> + else if (strcmp (argv[AcpiGbl_Optind], "--") == 0)
> + {
> + AcpiGbl_Optind++;
> + return (ACPI_OPT_END);
> + }
> + }
> +
> + /* Get the option */
> +
> + CurrentChar = argv[AcpiGbl_Optind][CurrentCharPtr];
> +
> + /* Make sure that the option is legal */
> +
> + if (CurrentChar == ':' ||
> + (OptsPtr = strchr (opts, CurrentChar)) == NULL)
> + {
> + ACPI_OPTION_ERROR ("Illegal option: -", CurrentChar);
> +
> + if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
> + {
> + AcpiGbl_Optind++;
> + CurrentCharPtr = 1;
> + }
> +
> + return ('?');
> + }
> +
> + /* Option requires an argument? */
> +
> + if (*++OptsPtr == ':')
> + {
> + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
> + {
> + AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
> + }
> + else if (++AcpiGbl_Optind >= argc)
> + {
> + ACPI_OPTION_ERROR (
> + "Option requires an argument: -", CurrentChar);
> +
> + CurrentCharPtr = 1;
> + return ('?');
> + }
> + else
> + {
> + AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
> + }
> +
> + CurrentCharPtr = 1;
> + }
> +
> + /* Option has an optional argument? */
> +
> + else if (*OptsPtr == '+')
> + {
> + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
> + {
> + AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
> + }
> + else if (++AcpiGbl_Optind >= argc)
> + {
> + AcpiGbl_Optarg = NULL;
> + }
> + else
> + {
> + AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
> + }
> +
> + CurrentCharPtr = 1;
> + }
> +
> + /* Option has optional single-char arguments? */
> +
> + else if (*OptsPtr == '^')
> + {
> + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
> + {
> + AcpiGbl_Optarg = &argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)];
> + }
> + else
> + {
> + AcpiGbl_Optarg = "^";
> + }
> +
> + AcpiGbl_SubOptChar = AcpiGbl_Optarg[0];
> + AcpiGbl_Optind++;
> + CurrentCharPtr = 1;
> + }
> +
> + /* Option has a required single-char argument? */
> +
> + else if (*OptsPtr == '|')
> + {
> + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
> + {
> + AcpiGbl_Optarg = &argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)];
> + }
> + else
> + {
> + ACPI_OPTION_ERROR (
> + "Option requires a single-character suboption: -",
> + CurrentChar);
> +
> + CurrentCharPtr = 1;
> + return ('?');
> + }
> +
> + AcpiGbl_SubOptChar = AcpiGbl_Optarg[0];
> + AcpiGbl_Optind++;
> + CurrentCharPtr = 1;
> + }
> +
> + /* Option with no arguments */
> +
> + else
> + {
> + if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
> + {
> + CurrentCharPtr = 1;
> + AcpiGbl_Optind++;
> + }
> +
> + AcpiGbl_Optarg = NULL;
> + }
> +
> + return (CurrentChar);
> +}
> diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
> index d71068c..26968d2 100644
> --- a/src/acpica/source/compiler/Makefile.am
> +++ b/src/acpica/source/compiler/Makefile.am
> @@ -212,6 +212,7 @@ libfwtsiasl_la_SOURCES = \
> ../common/dmtables.c \
> ../common/dmtbinfo.c \
> ../common/dmtbdump.c \
> + ../common/getopt.c \
> ../components/debugger/dbfileio.c \
> ../components/disassembler/dmbuffer.c \
> ../components/disassembler/dmcstyle.c \
> diff --git a/src/acpica/source/compiler/aslascii.c b/src/acpica/source/compiler/aslascii.c
> index 0037077..b3cf8aa 100644
> --- a/src/acpica/source/compiler/aslascii.c
> +++ b/src/acpica/source/compiler/aslascii.c
> @@ -114,6 +114,7 @@
> *****************************************************************************/
>
> #include "aslcompiler.h"
> +#include <actables.h>
> #include <acapps.h>
>
> #define _COMPONENT ACPI_COMPILER
> @@ -135,90 +136,7 @@ FlConsumeNewComment (
>
> /*******************************************************************************
> *
> - * FUNCTION: FlCheckForAcpiTable
> - *
> - * PARAMETERS: Handle - Open input file
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Determine if a file seems to be a binary ACPI table, via the
> - * following checks on what would be the table header:
> - * 0) File must be at least as long as an ACPI_TABLE_HEADER
> - * 1) The header length field must match the file size
> - * 2) Signature, OemId, OemTableId, AslCompilerId must be ASCII
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -FlCheckForAcpiTable (
> - FILE *Handle)
> -{
> - ACPI_TABLE_HEADER Table;
> - UINT32 FileSize;
> - size_t Actual;
> - UINT32 i;
> -
> -
> - /* Read a potential table header */
> -
> - Actual = fread (&Table, 1, sizeof (ACPI_TABLE_HEADER), Handle);
> - fseek (Handle, 0, SEEK_SET);
> -
> - if (Actual < sizeof (ACPI_TABLE_HEADER))
> - {
> - return (AE_ERROR);
> - }
> -
> - /* Header length field must match the file size */
> -
> - FileSize = CmGetFileSize (Handle);
> - if (Table.Length != FileSize)
> - {
> - return (AE_ERROR);
> - }
> -
> - /*
> - * These fields must be ASCII:
> - * Signature, OemId, OemTableId, AslCompilerId.
> - * We allow a NULL terminator in OemId and OemTableId.
> - */
> - for (i = 0; i < ACPI_NAME_SIZE; i++)
> - {
> - if (!ACPI_IS_ASCII ((UINT8) Table.Signature[i]))
> - {
> - return (AE_ERROR);
> - }
> -
> - if (!ACPI_IS_ASCII ((UINT8) Table.AslCompilerId[i]))
> - {
> - return (AE_ERROR);
> - }
> - }
> -
> - for (i = 0; (i < ACPI_OEM_ID_SIZE) && (Table.OemId[i]); i++)
> - {
> - if (!ACPI_IS_ASCII ((UINT8) Table.OemId[i]))
> - {
> - return (AE_ERROR);
> - }
> - }
> -
> - for (i = 0; (i < ACPI_OEM_TABLE_ID_SIZE) && (Table.OemTableId[i]); i++)
> - {
> - if (!ACPI_IS_ASCII ((UINT8) Table.OemTableId[i]))
> - {
> - return (AE_ERROR);
> - }
> - }
> -
> - printf ("Binary file appears to be a valid ACPI table, disassembling\n");
> - return (AE_OK);
> -}
> -
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: FlCheckForAscii
> + * FUNCTION: FlIsFileAsciiSource
> *
> * PARAMETERS: Filename - Full input filename
> * DisplayErrors - TRUE if error messages desired
> @@ -235,7 +153,7 @@ FlCheckForAcpiTable (
> ******************************************************************************/
>
> ACPI_STATUS
> -FlCheckForAscii (
> +FlIsFileAsciiSource (
> char *Filename,
> BOOLEAN DisplayErrors)
> {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 86a28ad..6c1dcea 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -239,11 +239,7 @@ CmDeleteCaches (
> * aslascii - ascii support
> */
> ACPI_STATUS
> -FlCheckForAcpiTable (
> - FILE *Handle);
> -
> -ACPI_STATUS
> -FlCheckForAscii (
> +FlIsFileAsciiSource (
> char *Filename,
> BOOLEAN DisplayErrors);
>
> @@ -813,6 +809,10 @@ TrSetEndLineNumber (
> ACPI_PARSE_OBJECT *Op);
>
> void
> +TrSetCurrentFilename (
> + ACPI_PARSE_OBJECT *Op);
> +
> +void
> TrWalkTree (
> void);
>
> @@ -995,6 +995,10 @@ DbgPrint (
> #define ASL_PARSE_OUTPUT 1
> #define ASL_TREE_OUTPUT 2
>
> +BOOLEAN
> +UtQueryForOverwrite (
> + char *Pathname);
> +
> void
> UtDisplaySupportedTables (
> void);
> @@ -1353,6 +1357,6 @@ DtDoCompile(
>
> ACPI_STATUS
> DtCreateTemplates (
> - char *Signature);
> + char **argv);
>
> #endif /* __ASLCOMPILER_H */
> diff --git a/src/acpica/source/compiler/aslcompiler.y b/src/acpica/source/compiler/aslcompiler.y
> index 3a2b191..fd98308 100644
> --- a/src/acpica/source/compiler/aslcompiler.y
> +++ b/src/acpica/source/compiler/aslcompiler.y
> @@ -1362,6 +1362,7 @@ String
>
> CompilerDirective
> : IncludeTerm {}
> + | IncludeEndTerm {}
> | ExternalTerm {}
> ;
>
> @@ -1968,14 +1969,13 @@ IfTerm
> ;
>
> IncludeTerm
> - : PARSEOP_INCLUDE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INCLUDE);}
> - String ')' {TrLinkChildren ($<n>3,1,$4);FlOpenIncludeFile ($4);}
> - TermList
> - IncludeEndTerm {$$ = TrLinkPeerNodes (3,$<n>3,$7,$8);}
> + : PARSEOP_INCLUDE '('
> + String ')' {$$ = TrUpdateNode (PARSEOP_INCLUDE, $3);
> + FlOpenIncludeFile ($3);}
> ;
>
> IncludeEndTerm
> - : PARSEOP_INCLUDE_END {$$ = TrCreateLeafNode (PARSEOP_INCLUDE_END);}
> + : PARSEOP_INCLUDE_END {$<n>$ = TrCreateLeafNode (PARSEOP_INCLUDE_END); TrSetCurrentFilename ($$);}
> ;
>
> IncTerm
> diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h
> index 87e4d35..f22d9bf 100644
> --- a/src/acpica/source/compiler/asldefine.h
> +++ b/src/acpica/source/compiler/asldefine.h
> @@ -178,10 +178,10 @@
>
> /* Types for input files */
>
> -#define ASL_INPUT_TYPE_BINARY 0
> -#define ASL_INPUT_TYPE_ACPI_TABLE 1
> -#define ASL_INPUT_TYPE_ASCII_ASL 2
> -#define ASL_INPUT_TYPE_ASCII_DATA 3
> +#define ASL_INPUT_TYPE_BINARY 0
> +#define ASL_INPUT_TYPE_BINARY_ACPI_TABLE 1
> +#define ASL_INPUT_TYPE_ASCII_ASL 2
> +#define ASL_INPUT_TYPE_ASCII_DATA 3
>
>
> /* Misc */
> diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c
> index 1c1b1d8..56a6117 100644
> --- a/src/acpica/source/compiler/aslfiles.c
> +++ b/src/acpica/source/compiler/aslfiles.c
> @@ -408,6 +408,7 @@ FlOpenIncludeWithPrefix (
> */
> Gbl_CurrentLineNumber--;
> OriginalLineNumber = Gbl_CurrentLineNumber;
> +
> while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF)
> {
> if (Gbl_CurrentLineBuffer[0] == '#')
> @@ -416,6 +417,7 @@ FlOpenIncludeWithPrefix (
> Op, "use #include instead");
> }
> }
> +
> Gbl_CurrentLineNumber = OriginalLineNumber;
>
> /* Must seek back to the start of the file */
> @@ -642,7 +644,7 @@ FlOpenMiscOutputFiles (
>
> /* All done for disassembler */
>
> - if (Gbl_FileType == ASL_INPUT_TYPE_ACPI_TABLE)
> + if (Gbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE)
> {
> return (AE_OK);
> }
> diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
> index 9a9aba4..feb4d45 100644
> --- a/src/acpica/source/compiler/aslglobal.h
> +++ b/src/acpica/source/compiler/aslglobal.h
> @@ -269,6 +269,7 @@ ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_OutputFilenamePrefix,
> ASL_EXTERN ASL_INCLUDE_DIR ASL_INIT_GLOBAL (*Gbl_IncludeDirList, NULL);
> ASL_EXTERN char *Gbl_CurrentInputFilename;
> ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_ExternalRefFilename, NULL);
> +ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_PreviousIncludeFilename, NULL);
>
> ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_HasIncludeFiles, FALSE);
>
> @@ -318,7 +319,6 @@ ASL_EXTERN ASL_LISTING_NODE ASL_INIT_GLOBAL (*Gbl_ListingNode, NULL);
> ASL_EXTERN ACPI_PARSE_OBJECT *Gbl_FirstLevelInsertionNode;
> ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_FileType, 0);
> ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_Signature, NULL);
> -ASL_EXTERN char *Gbl_TemplateSignature;
>
> ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentHexColumn, 0);
> ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentAmlOffset, 0);
> diff --git a/src/acpica/source/compiler/asllisting.c b/src/acpica/source/compiler/asllisting.c
> index 6f76133..d30a0bd 100644
> --- a/src/acpica/source/compiler/asllisting.c
> +++ b/src/acpica/source/compiler/asllisting.c
> @@ -349,6 +349,34 @@ LsTreeWriteWalk (
>
> UtPrintFormattedName (Op->Asl.ParseOpcode, Level);
>
> + if (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)
> + {
> + DbgPrint (ASL_TREE_OUTPUT,
> + "%10.4s ", Op->Asl.Value.Name);
> + }
> + else if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
> + (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
> + {
> + DbgPrint (ASL_TREE_OUTPUT,
> + "%10.32s ", Op->Asl.Value.String);
> + }
> + else if (Op->Asl.ParseOpcode == PARSEOP_INCLUDE)
> + {
> + DbgPrint (ASL_TREE_OUTPUT,
> + "Open: %s\n", Op->Asl.Value.String);
> + return (AE_OK);
> + }
> + else if (Op->Asl.ParseOpcode == PARSEOP_INCLUDE_END)
> + {
> + DbgPrint (ASL_TREE_OUTPUT,
> + "Close: %s\n", Op->Asl.Filename);
> + return (AE_OK);
> + }
> + else
> + {
> + DbgPrint (ASL_TREE_OUTPUT, " ");
> + }
> +
> DbgPrint (ASL_TREE_OUTPUT, " (%.4X) Flags %8.8X",
> Op->Asl.ParseOpcode, Op->Asl.CompileFlags);
> TrPrintNodeCompileFlags (Op->Asl.CompileFlags);
> @@ -500,7 +528,7 @@ LsWriteNodeToListing (
>
> /* Create a new listing node and push it */
>
> - LsPushNode (Op->Asl.Child->Asl.Value.String);
> + LsPushNode (Op->Asl.Value.String);
> return;
>
>
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index 0f90b1f..d1fb045 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -199,7 +199,8 @@ Usage (
> printf ("\nGeneral:\n");
> ACPI_OPTION ("-@ <file>", "Specify command file");
> ACPI_OPTION ("-I <dir>", "Specify additional include directory");
> - ACPI_OPTION ("-T <sig>|ALL|*", "Create table template file for ACPI <Sig>");
> + ACPI_OPTION ("-T <sig list>|ALL", "Create ACPI table template/example files");
> + ACPI_OPTION ("-T <count>", "Emit DSDT and <count> SSDTs to same file");
> ACPI_OPTION ("-p <prefix>", "Specify path/filename prefix for all output files");
> ACPI_OPTION ("-v", "Display compiler version");
> ACPI_OPTION ("-vo", "Enable optimization comments");
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index 50b84d1..aa1378f 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -385,7 +385,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
> /* NOR */ OP_TABLE_ENTRY (AML_BIT_NOR_OP, 0, 0, ACPI_BTYPE_INTEGER),
> /* NOT */ OP_TABLE_ENTRY (AML_BIT_NOT_OP, 0, 0, ACPI_BTYPE_INTEGER),
> /* NOTIFY */ OP_TABLE_ENTRY (AML_NOTIFY_OP, 0, 0, 0),
> -/* OBJECTTYPE */ OP_TABLE_ENTRY (AML_TYPE_OP, 0, 0, ACPI_BTYPE_INTEGER),
> +/* OBJECTTYPE */ OP_TABLE_ENTRY (AML_OBJECT_TYPE_OP, 0, 0, ACPI_BTYPE_INTEGER),
> /* OBJECTTYPE_BFF */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_BUFFER_FIELD, 0, 0),
> /* OBJECTTYPE_BUF */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_BUFFER, 0, 0),
> /* OBJECTTYPE_DDB */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_DDB_HANDLE, 0, 0),
> diff --git a/src/acpica/source/compiler/aslopcodes.c b/src/acpica/source/compiler/aslopcodes.c
> index 08dc4a4..a028979 100644
> --- a/src/acpica/source/compiler/aslopcodes.c
> +++ b/src/acpica/source/compiler/aslopcodes.c
> @@ -1582,7 +1582,6 @@ OpcGenerateAmlOpcode (
>
> case PARSEOP_INCLUDE:
>
> - Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> Gbl_HasIncludeFiles = TRUE;
> break;
>
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index 4608f8d..fb6ccc8 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -499,6 +499,7 @@ String
>
> CompilerDirective
> : IncludeTerm {}
> + | IncludeEndTerm {}
> | ExternalTerm {}
> ;
>
> @@ -1105,14 +1106,13 @@ IfTerm
> ;
>
> IncludeTerm
> - : PARSEOP_INCLUDE '(' {$<n>$ = TrCreateLeafNode (PARSEOP_INCLUDE);}
> - String ')' {TrLinkChildren ($<n>3,1,$4);FlOpenIncludeFile ($4);}
> - TermList
> - IncludeEndTerm {$$ = TrLinkPeerNodes (3,$<n>3,$7,$8);}
> + : PARSEOP_INCLUDE '('
> + String ')' {$$ = TrUpdateNode (PARSEOP_INCLUDE, $3);
> + FlOpenIncludeFile ($3);}
> ;
>
> IncludeEndTerm
> - : PARSEOP_INCLUDE_END {$$ = TrCreateLeafNode (PARSEOP_INCLUDE_END);}
> + : PARSEOP_INCLUDE_END {$<n>$ = TrCreateLeafNode (PARSEOP_INCLUDE_END); TrSetCurrentFilename ($$);}
> ;
>
> IncTerm
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index 684a3fc..c05b842 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -216,62 +216,63 @@ AslDetectSourceFileType (
> ASL_FILE_INFO *Info)
> {
> char *FileChar;
> - UINT8 Type;
> + UINT8 Type = ASL_INPUT_TYPE_ASCII_DATA; /* default */
> ACPI_STATUS Status;
>
>
> - /* Check for a valid binary ACPI table */
> + /* Check for 100% ASCII source file (comments are ignored) */
>
> - Status = FlCheckForAcpiTable (Info->Handle);
> + Status = FlIsFileAsciiSource (Info->Filename, FALSE);
> if (ACPI_SUCCESS (Status))
> {
> - Type = ASL_INPUT_TYPE_ACPI_TABLE;
> - goto Cleanup;
> - }
> + /*
> + * File contains ASCII source code. Determine if this is an ASL
> + * file or an ACPI data table file.
> + */
> + while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
> + {
> + /* Uppercase the buffer for caseless compare */
>
> - /* Check for 100% ASCII source file (comments are ignored) */
> + FileChar = Gbl_CurrentLineBuffer;
> + while (*FileChar)
> + {
> + *FileChar = (char) toupper ((int) *FileChar);
> + FileChar++;
> + }
>
> - Status = FlCheckForAscii (Info->Filename, TRUE);
> - if (ACPI_FAILURE (Status))
> - {
> - printf ("Invalid characters in input file - %s\n", Info->Filename);
> + /* Presence of "DefinitionBlock" indicates actual ASL code */
>
> - if (!Gbl_IgnoreErrors)
> - {
> - Type = ASL_INPUT_TYPE_BINARY;
> - goto Cleanup;
> + if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
> + {
> + /* Appears to be an ASL file */
> +
> + Type = ASL_INPUT_TYPE_ASCII_ASL;
> + goto Cleanup;
> + }
> }
> - }
>
> - /*
> - * File is ASCII. Determine if this is an ASL file or an ACPI data
> - * table file.
> - */
> - while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
> - {
> - /* Uppercase the buffer for caseless compare */
> + /* Appears to be an ASCII data table source file */
>
> - FileChar = Gbl_CurrentLineBuffer;
> - while (*FileChar)
> - {
> - *FileChar = (char) toupper ((int) *FileChar);
> - FileChar++;
> - }
> + Type = ASL_INPUT_TYPE_ASCII_DATA;
> + goto Cleanup;
> + }
>
> - /* Presence of "DefinitionBlock" indicates actual ASL code */
> + /* We have some sort of binary table, check for valid ACPI table */
>
> - if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
> - {
> - /* Appears to be an ASL file */
> + fseek (Info->Handle, 0, SEEK_SET);
>
> - Type = ASL_INPUT_TYPE_ASCII_ASL;
> - goto Cleanup;
> - }
> + Status = AcValidateTableHeader (Info->Handle, 0);
> + if (ACPI_SUCCESS (Status))
> + {
> + fprintf (stderr,
> + "Binary file appears to be a valid ACPI table, disassembling\n");
> +
> + Type = ASL_INPUT_TYPE_BINARY_ACPI_TABLE;
> + goto Cleanup;
> }
>
> - /* Not an ASL source file, default to a data table source file */
> + Type = ASL_INPUT_TYPE_BINARY;
>
> - Type = ASL_INPUT_TYPE_ASCII_DATA;
>
> Cleanup:
>
> @@ -320,7 +321,7 @@ AslDoDisassembly (
>
> /* Handle additional output files for disassembler */
>
> - Gbl_FileType = ASL_INPUT_TYPE_ACPI_TABLE;
> + Gbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE;
> Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
>
> /* This is where the disassembly happens */
> @@ -526,7 +527,7 @@ AslDoOneFile (
> /*
> * Binary ACPI table was auto-detected, disassemble it
> */
> - case ASL_INPUT_TYPE_ACPI_TABLE:
> + case ASL_INPUT_TYPE_BINARY_ACPI_TABLE:
>
> /* We have what appears to be an ACPI table, disassemble it */
>
> diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
> index f1a7c59..fdfcdb6 100644
> --- a/src/acpica/source/compiler/aslsupport.l
> +++ b/src/acpica/source/compiler/aslsupport.l
> @@ -268,9 +268,13 @@ AslPopInputFileStack (
> ASL_FILE_NODE *Fnode;
>
>
> + Gbl_PreviousIncludeFilename = Gbl_Files[ASL_FILE_INPUT].Filename;
> Fnode = Gbl_IncludeFileStack;
> DbgPrint (ASL_PARSE_OUTPUT,
> - "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
> + "\nPop InputFile Stack, Fnode %p\n", Fnode);
> +
> + DbgPrint (ASL_PARSE_OUTPUT,
> + "Include: Closing \"%s\"\n\n", Gbl_Files[ASL_FILE_INPUT].Filename);
>
> if (!Fnode)
> {
> diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c
> index 6948b5d..0690a17 100644
> --- a/src/acpica/source/compiler/asltree.c
> +++ b/src/acpica/source/compiler/asltree.c
> @@ -229,10 +229,30 @@ TrReleaseNode (
>
> /*******************************************************************************
> *
> + * FUNCTION: TrSetCurrentFilename
> + *
> + * PARAMETERS: Op - An existing parse node
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Save the include file filename. Used for debug output only.
> + *
> + ******************************************************************************/
> +
> +void
> +TrSetCurrentFilename (
> + ACPI_PARSE_OBJECT *Op)
> +{
> + Op->Asl.Filename = Gbl_PreviousIncludeFilename;
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: TrUpdateNode
> *
> * PARAMETERS: ParseOpcode - New opcode to be assigned to the node
> - * Op - An existing parse node
> + * Op - An existing parse node
> *
> * RETURN: The updated node
> *
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 374fe50..bff011f 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -118,7 +118,9 @@
> #include "acdisasm.h"
> #include "acnamesp.h"
> #include "amlcode.h"
> -#include <acapps.h>
> +#include "acapps.h"
> +#include <sys/stat.h>
> +
>
> #define _COMPONENT ACPI_COMPILER
> ACPI_MODULE_NAME ("aslutils")
> @@ -137,6 +139,40 @@ UtAttachNameseg (
> char *Name);
>
>
> +/******************************************************************************
> + *
> + * FUNCTION: UtQueryForOverwrite
> + *
> + * PARAMETERS: Pathname - Output filename
> + *
> + * RETURN: TRUE if file does not exist or overwrite is authorized
> + *
> + * DESCRIPTION: Query for file overwrite if it already exists.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +UtQueryForOverwrite (
> + char *Pathname)
> +{
> + struct stat StatInfo;
> +
> +
> + if (!stat (Pathname, &StatInfo))
> + {
> + fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
> + Pathname);
> +
> + if (getchar () != 'y')
> + {
> + return (FALSE);
> + }
> + }
> +
> + return (TRUE);
> +}
> +
> +
> /*******************************************************************************
> *
> * FUNCTION: UtDisplaySupportedTables
> @@ -521,9 +557,11 @@ UtDisplaySummary (
> if (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
> {
> FlPrintFile (FileId,
> - "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n",
> + "%-14s %s - %u bytes, %u named objects, "
> + "%u executable opcodes\n",
> "AML Output:",
> - Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
> + Gbl_Files[ASL_FILE_AML_OUTPUT].Filename,
> + FlGetFileSize (ASL_FILE_AML_OUTPUT),
> TotalNamedObjects, TotalExecutableOpcodes);
> }
> }
> diff --git a/src/acpica/source/compiler/aslwalks.c b/src/acpica/source/compiler/aslwalks.c
> index 1675cad..4947c7e 100644
> --- a/src/acpica/source/compiler/aslwalks.c
> +++ b/src/acpica/source/compiler/aslwalks.c
> @@ -931,21 +931,8 @@ AnAnalyzeStoreOperator (
> case PARSEOP_DEREFOF:
> case PARSEOP_REFOF:
> case PARSEOP_INDEX:
> -
> - return;
> -
> case PARSEOP_METHODCALL:
> - /*
> - * A target is not allowed to be a method call.
> - * It is technically allowed to be a method call, but this only
> - * makes sense in one case: if the method returns a reference object,
> - * which will then allow the Store to complete successfully.
> - * However, this is not supported by the ACPICA interpreter,
> - * and not supported by the MS ASL compiler
> - * at this time. (09/2015)
> - */
> - AslError (ASL_ERROR, ASL_MSG_UNSUPPORTED,
> - TargetOperandOp, "Method invocation cannot be a target");
> +
> return;
>
> default:
> diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
> index 6e4c9f9..d1c4a5d 100644
> --- a/src/acpica/source/compiler/dttemplate.c
> +++ b/src/acpica/source/compiler/dttemplate.c
> @@ -129,14 +129,27 @@ AcpiUtIsSpecialTable (
> char *Signature);
>
> static ACPI_STATUS
> +DtCreateOneTemplateFile (
> + char *Signature,
> + UINT32 TableCount);
> +
> +static ACPI_STATUS
> DtCreateOneTemplate (
> char *Signature,
> + UINT32 TableCount,
> const ACPI_DMTABLE_DATA *TableData);
>
> static ACPI_STATUS
> DtCreateAllTemplates (
> void);
>
> +static int
> +DtEmitDefinitionBlock (
> + FILE *File,
> + char *Filename,
> + char *Signature,
> + UINT32 Instance);
> +
>
> /*******************************************************************************
> *
> @@ -173,7 +186,7 @@ AcpiUtIsSpecialTable (
> *
> * FUNCTION: DtCreateTemplates
> *
> - * PARAMETERS: Signature - ACPI table signature
> + * PARAMETERS: argv - Standard command line arguments
> *
> * RETURN: Status
> *
> @@ -183,32 +196,115 @@ AcpiUtIsSpecialTable (
>
> ACPI_STATUS
> DtCreateTemplates (
> - char *Signature)
> + char **argv)
> {
> - const ACPI_DMTABLE_DATA *TableData;
> - ACPI_STATUS Status;
> + char *Signature;
> + char *End;
> + unsigned long TableCount;
> + ACPI_STATUS Status = AE_OK;
>
>
> AslInitializeGlobals ();
>
> - /* Default (no signature) is DSDT */
> + Status = AdInitialize ();
> + if (ACPI_FAILURE (Status))
> + {
> + return (Status);
> + }
> +
> + /*
> + * Special cases for DSDT, ALL, and '*'
> + */
> +
> + /* Default (no signature option) is DSDT */
>
> - if (!Signature)
> + if (AcpiGbl_Optind < 3)
> {
> - Signature = "DSDT";
> - goto GetTemplate;
> + Status = DtCreateOneTemplateFile (ACPI_SIG_DSDT, 0);
> + goto Exit;
> }
>
> + AcpiGbl_Optind--;
> + Signature = argv[AcpiGbl_Optind];
> AcpiUtStrupr (Signature);
> - if (!strcmp (Signature, "ALL") ||
> - !strcmp (Signature, "*"))
> +
> + /*
> + * Multiple SSDT support (-T <ssdt count>)
> + */
> + TableCount = strtoul (Signature, &End, 0);
> + if (Signature != End)
> + {
> + /* The count is used for table ID and method name - max is 254(+1) */
> +
> + if (TableCount > 254)
> + {
> + fprintf (stderr, "%u SSDTs requested, maximum is 254\n",
> + (unsigned int) TableCount);
> +
> + Status = AE_LIMIT;
> + goto Exit;
> + }
> +
> + Status = DtCreateOneTemplateFile (ACPI_SIG_DSDT, TableCount);
> + goto Exit;
> + }
> +
> + if (!strcmp (Signature, "ALL"))
> {
> /* Create all available/known templates */
>
> Status = DtCreateAllTemplates ();
> - return (Status);
> + goto Exit;
> + }
> +
> + /*
> + * Normal case: Create template for each signature
> + */
> + while (argv[AcpiGbl_Optind])
> + {
> + Signature = argv[AcpiGbl_Optind];
> + AcpiUtStrupr (Signature);
> +
> + Status = DtCreateOneTemplateFile (Signature, 0);
> + if (ACPI_FAILURE (Status))
> + {
> + goto Exit;
> + }
> +
> + AcpiGbl_Optind++;
> }
>
> +
> +Exit:
> + /* Shutdown ACPICA subsystem */
> +
> + (void) AcpiTerminate ();
> + CmDeleteCaches ();
> + return (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: DtCreateOneTemplateFile
> + *
> + * PARAMETERS: Signature - ACPI table signature
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Create one template file of the requested signature.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +DtCreateOneTemplateFile (
> + char *Signature,
> + UINT32 TableCount)
> +{
> + const ACPI_DMTABLE_DATA *TableData;
> + ACPI_STATUS Status;
> +
> +
> /*
> * Validate signature and get the template data:
> * 1) Signature must be 4 characters
> @@ -218,8 +314,8 @@ DtCreateTemplates (
> if (strlen (Signature) != ACPI_NAME_SIZE)
> {
> fprintf (stderr,
> - "%s: Invalid ACPI table signature (length must be 4 characters)\n",
> - Signature);
> + "%s: Invalid ACPI table signature "
> + "(length must be 4 characters)\n", Signature);
> return (AE_ERROR);
> }
>
> @@ -236,7 +332,8 @@ DtCreateTemplates (
> Signature = "FACP";
> }
>
> -GetTemplate:
> + /* TableData will point to the template */
> +
> TableData = AcpiDmGetTableData (Signature);
> if (TableData)
> {
> @@ -253,18 +350,7 @@ GetTemplate:
> return (AE_ERROR);
> }
>
> - Status = AdInitialize ();
> - if (ACPI_FAILURE (Status))
> - {
> - return (Status);
> - }
> -
> - Status = DtCreateOneTemplate (Signature, TableData);
> -
> - /* Shutdown ACPICA subsystem */
> -
> - (void) AcpiTerminate ();
> - CmDeleteCaches ();
> + Status = DtCreateOneTemplate (Signature, TableCount, TableData);
> return (Status);
> }
>
> @@ -289,12 +375,6 @@ DtCreateAllTemplates (
> ACPI_STATUS Status;
>
>
> - Status = AdInitialize ();
> - if (ACPI_FAILURE (Status))
> - {
> - return (Status);
> - }
> -
> fprintf (stderr, "Creating all supported Template files\n");
>
> /* Walk entire ACPI table data structure */
> @@ -306,7 +386,7 @@ DtCreateAllTemplates (
> if (TableData->Template)
> {
> Status = DtCreateOneTemplate (TableData->Signature,
> - TableData);
> + 0, TableData);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> @@ -319,25 +399,31 @@ DtCreateAllTemplates (
> * 1) DSDT/SSDT are AML tables, not data tables
> * 2) FACS and RSDP have non-standard headers
> */
> - Status = DtCreateOneTemplate (ACPI_SIG_DSDT, NULL);
> + Status = DtCreateOneTemplate (ACPI_SIG_DSDT, 0, NULL);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> }
>
> - Status = DtCreateOneTemplate (ACPI_SIG_SSDT, NULL);
> + Status = DtCreateOneTemplate (ACPI_SIG_SSDT, 0, NULL);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> }
>
> - Status = DtCreateOneTemplate (ACPI_SIG_FACS, NULL);
> + Status = DtCreateOneTemplate (ACPI_SIG_OSDT, 0, NULL);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> }
>
> - Status = DtCreateOneTemplate (ACPI_RSDP_NAME, NULL);
> + Status = DtCreateOneTemplate (ACPI_SIG_FACS, 0, NULL);
> + if (ACPI_FAILURE (Status))
> + {
> + return (Status);
> + }
> +
> + Status = DtCreateOneTemplate (ACPI_RSDP_NAME, 0, NULL);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> @@ -352,6 +438,7 @@ DtCreateAllTemplates (
> * FUNCTION: DtCreateOneTemplate
> *
> * PARAMETERS: Signature - ACPI signature, NULL terminated.
> + * TableCount - Used for SSDTs in same file as DSDT
> * TableData - Entry in ACPI table data structure.
> * NULL if a special ACPI table.
> *
> @@ -364,12 +451,14 @@ DtCreateAllTemplates (
> static ACPI_STATUS
> DtCreateOneTemplate (
> char *Signature,
> + UINT32 TableCount,
> const ACPI_DMTABLE_DATA *TableData)
> {
> char *DisasmFilename;
> FILE *File;
> ACPI_STATUS Status = AE_OK;
> - ACPI_SIZE Actual;
> + int Actual;
> + UINT32 i;
>
>
> /* New file will have a .asl suffix */
> @@ -382,13 +471,17 @@ DtCreateOneTemplate (
> return (AE_ERROR);
> }
>
> - /* Probably should prompt to overwrite the file */
> -
> AcpiUtStrlwr (DisasmFilename);
> + if (!UtQueryForOverwrite (DisasmFilename))
> + {
> + return (AE_ERROR);
> + }
> +
> File = fopen (DisasmFilename, "w+");
> if (!File)
> {
> - fprintf (stderr, "Could not open output file %s\n", DisasmFilename);
> + fprintf (stderr, "Could not open output file %s\n",
> + DisasmFilename);
> return (AE_ERROR);
> }
>
> @@ -399,8 +492,16 @@ DtCreateOneTemplate (
> AcpiOsPrintf ("/*\n");
> AcpiOsPrintf (ACPI_COMMON_HEADER ("iASL Compiler/Disassembler", " * "));
>
> - AcpiOsPrintf (" * Template for [%4.4s] ACPI Table",
> - Signature);
> + if (TableCount == 0)
> + {
> + AcpiOsPrintf (" * Template for [%4.4s] ACPI Table",
> + Signature);
> + }
> + else
> + {
> + AcpiOsPrintf (" * Template for [%4.4s] and %u [SSDT] ACPI Tables",
> + Signature, TableCount);
> + }
>
> /* Dump the actual ACPI table */
>
> @@ -426,45 +527,55 @@ DtCreateOneTemplate (
> }
> else
> {
> - /* Special ACPI tables - DSDT, SSDT, OSDT, FADT, RSDP */
> + /* Special ACPI tables - DSDT, SSDT, OSDT, FACS, RSDP */
>
> AcpiOsPrintf (" (AML byte code table)\n");
> -
> AcpiOsPrintf (" */\n");
> +
> if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT))
> {
> - Actual = fwrite (TemplateDsdt, 1, sizeof (TemplateDsdt) -1, File);
> - if (Actual != sizeof (TemplateDsdt) -1)
> + Actual = DtEmitDefinitionBlock (
> + File, DisasmFilename, ACPI_SIG_DSDT, 1);
> + if (Actual < 0)
> {
> - fprintf (stderr,
> - "Could not write to output file %s\n", DisasmFilename);
> Status = AE_ERROR;
> goto Cleanup;
> }
> +
> + /* Emit any requested SSDTs into the same file */
> +
> + for (i = 1; i <= TableCount; i++)
> + {
> + Actual = DtEmitDefinitionBlock (
> + File, DisasmFilename, ACPI_SIG_SSDT, i + 1);
> + if (Actual < 0)
> + {
> + Status = AE_ERROR;
> + goto Cleanup;
> + }
> + }
> }
> else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT))
> {
> - Actual = fwrite (TemplateSsdt, 1, sizeof (TemplateSsdt) -1, File);
> - if (Actual != sizeof (TemplateSsdt) -1)
> + Actual = DtEmitDefinitionBlock (
> + File, DisasmFilename, ACPI_SIG_SSDT, 1);
> + if (Actual < 0)
> {
> - fprintf (stderr,
> - "Could not write to output file %s\n", DisasmFilename);
> Status = AE_ERROR;
> goto Cleanup;
> }
> }
> else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT))
> {
> - Actual = fwrite (TemplateOsdt, 1, sizeof (TemplateOsdt) -1, File);
> - if (Actual != sizeof (TemplateOsdt) -1)
> + Actual = DtEmitDefinitionBlock (
> + File, DisasmFilename, ACPI_SIG_OSDT, 1);
> + if (Actual < 0)
> {
> - fprintf (stderr,
> - "Could not write to output file %s\n", DisasmFilename);
> Status = AE_ERROR;
> goto Cleanup;
> }
> }
> - else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) /* FADT */
> + else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
> {
> AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER,
> TemplateFacs));
> @@ -483,12 +594,72 @@ DtCreateOneTemplate (
> }
> }
>
> - fprintf (stderr,
> - "Created ACPI table template for [%4.4s], written to \"%s\"\n",
> - Signature, DisasmFilename);
> + if (TableCount == 0)
> + {
> + fprintf (stderr,
> + "Created ACPI table template for [%4.4s], "
> + "written to \"%s\"\n",
> + Signature, DisasmFilename);
> + }
> + else
> + {
> + fprintf (stderr,
> + "Created ACPI table templates for [%4.4s] "
> + "and %u [SSDT], written to \"%s\"\n",
> + Signature, TableCount, DisasmFilename);
> + }
>
> Cleanup:
> fclose (File);
> AcpiOsRedirectOutput (stdout);
> return (Status);
> }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: DtEmitDefinitionBlock
> + *
> + * PARAMETERS: File - An open file for the block
> + * Filename - Filename for same, for error msg(s)
> + * Signature - ACPI signature for the block
> + * Instance - Used for multiple SSDTs in the same file
> + *
> + * RETURN: Status from fprintf
> + *
> + * DESCRIPTION: Emit the raw ASL for a complete Definition Block (DSDT or SSDT)
> + *
> + * Note: The AMLFileName parameter for DefinitionBlock is left as a NULL
> + * string. This allows the compiler to create the output AML filename from
> + * the input filename.
> + *
> + ******************************************************************************/
> +
> +static int
> +DtEmitDefinitionBlock (
> + FILE *File,
> + char *Filename,
> + char *Signature,
> + UINT32 Instance)
> +{
> + int Status;
> +
> +
> + Status = fprintf (File,
> + "DefinitionBlock (\"\", \"%4.4s\", 2, \"Intel\", \"_%4.4s_%.2X\", 0x00000001)\n"
> + "{\n"
> + " Method (%2.2s%.2X)\n"
> + " {\n"
> + " }\n"
> + "}\n\n",
> + Signature, Signature, Instance, Signature, Instance);
> +
> + if (Status < 0)
> + {
> + fprintf (stderr,
> + "Could not write %4.4s to output file %s\n",
> + Signature, Filename);
> + }
> +
> + return (Status);
> +}
> diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
> index 4f158b9..dc73493 100644
> --- a/src/acpica/source/compiler/dttemplate.h
> +++ b/src/acpica/source/compiler/dttemplate.h
> @@ -117,36 +117,6 @@
> #define __DTTEMPLATE_H
>
>
> -/* Special templates for the ASL/AML tables: DSDT, SSDT, and OSDT */
> -
> -const char TemplateDsdt[] =
> - "DefinitionBlock (\"dsdt.aml\", \"DSDT\", 2, \"Intel\", \"Template\", 0x00000001)\n"
> - "{\n"
> - " Method (MAIN, 0, NotSerialized)\n"
> - " {\n"
> - " Return (Zero)\n"
> - " }\n"
> - "}\n\n";
> -
> -const char TemplateSsdt[] =
> - "DefinitionBlock (\"ssdt.aml\", \"SSDT\", 2, \"Intel\", \"Template\", 0x00000001)\n"
> - "{\n"
> - " Method (MAIN, 0, NotSerialized)\n"
> - " {\n"
> - " Return (Zero)\n"
> - " }\n"
> - "}\n\n";
> -
> -const char TemplateOsdt[] =
> - "DefinitionBlock (\"osdt.aml\", \"OSDT\", 2, \"Intel\", \"Template\", 0x00000001)\n"
> - "{\n"
> - " Method (MAIN, 0, NotSerialized)\n"
> - " {\n"
> - " Return (Zero)\n"
> - " }\n"
> - "}\n\n";
> -
> -
> /* Templates for ACPI data tables */
>
> const unsigned char TemplateAsf[] =
> diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
> index 1fa02a1..a923b6e 100644
> --- a/src/acpica/source/components/debugger/dbdisply.c
> +++ b/src/acpica/source/components/debugger/dbdisply.c
> @@ -120,6 +120,7 @@
> #include "acnamesp.h"
> #include "acparser.h"
> #include "acinterp.h"
> +#include "acevents.h"
> #include "acdebug.h"
>
>
> @@ -1106,26 +1107,21 @@ AcpiDbDisplayHandlers (
> for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_SpaceIdList); i++)
> {
> SpaceId = AcpiGbl_SpaceIdList[i];
> - HandlerObj = ObjDesc->Device.Handler;
>
> AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
> AcpiUtGetRegionName ((UINT8) SpaceId), SpaceId);
>
> - while (HandlerObj)
> + HandlerObj = AcpiEvFindRegionHandler (
> + SpaceId, ObjDesc->CommonNotify.Handler);
> + if (HandlerObj)
> {
> - if (AcpiGbl_SpaceIdList[i] ==
> - HandlerObj->AddressSpace.SpaceId)
> - {
> - AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING,
> - (HandlerObj->AddressSpace.HandlerFlags &
> - ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ?
> - "Default" : "User",
> - HandlerObj->AddressSpace.Handler);
> -
> - goto FoundHandler;
> - }
> + AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING,
> + (HandlerObj->AddressSpace.HandlerFlags &
> + ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ?
> + "Default" : "User",
> + HandlerObj->AddressSpace.Handler);
>
> - HandlerObj = HandlerObj->AddressSpace.Next;
> + goto FoundHandler;
> }
>
> /* There is no handler for this SpaceId */
> @@ -1137,7 +1133,7 @@ AcpiDbDisplayHandlers (
>
> /* Find all handlers for user-defined SpaceIDs */
>
> - HandlerObj = ObjDesc->Device.Handler;
> + HandlerObj = ObjDesc->CommonNotify.Handler;
> while (HandlerObj)
> {
> if (HandlerObj->AddressSpace.SpaceId >= ACPI_USER_REGION_BEGIN)
> @@ -1248,7 +1244,7 @@ AcpiDbDisplayNonRootHandlers (
>
> /* Display all handlers associated with this device */
>
> - HandlerObj = ObjDesc->Device.Handler;
> + HandlerObj = ObjDesc->CommonNotify.Handler;
> while (HandlerObj)
> {
> AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
> diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
> index a051e78..0f1421e 100644
> --- a/src/acpica/source/components/debugger/dbinput.c
> +++ b/src/acpica/source/components/debugger/dbinput.c
> @@ -1194,7 +1194,7 @@ AcpiDbCommandDispatch (
> {
> ACPI_NEW_TABLE_DESC *ListHead = NULL;
>
> - Status = AcpiAcGetAllTablesFromFile (AcpiGbl_DbArgs[1],
> + Status = AcGetAllTablesFromFile (AcpiGbl_DbArgs[1],
> ACPI_GET_ALL_TABLES, &ListHead);
> if (ACPI_SUCCESS (Status))
> {
> diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
> index 68dda89..272d787 100644
> --- a/src/acpica/source/components/disassembler/dmopcode.c
> +++ b/src/acpica/source/components/disassembler/dmopcode.c
> @@ -132,6 +132,10 @@ static void
> AcpiDmMatchKeyword (
> ACPI_PARSE_OBJECT *Op);
>
> +static void
> +AcpiDmConvertToElseIf (
> + ACPI_PARSE_OBJECT *Op);
> +
>
> /*******************************************************************************
> *
> @@ -755,6 +759,11 @@ AcpiDmDisassembleOneOp (
> return;
> }
>
> + if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
> + {
> + return; /* ElseIf macro was already emitted */
> + }
> +
> switch (Op->Common.DisasmOpcode)
> {
> case ACPI_DASM_MATCHOP:
> @@ -1027,6 +1036,11 @@ AcpiDmDisassembleOneOp (
> AcpiDmNamestring (Op->Common.Value.Name);
> break;
>
> + case AML_ELSE_OP:
> +
> + AcpiDmConvertToElseIf (Op);
> + break;
> +
> default:
>
> /* Just get the opcode name and print it */
> @@ -1051,3 +1065,113 @@ AcpiDmDisassembleOneOp (
> break;
> }
> }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmConvertToElseIf
> + *
> + * PARAMETERS: OriginalElseOp - ELSE Object to be examined
> + *
> + * RETURN: None. Emits either an "Else" or an "ElseIf" ASL operator.
> + *
> + * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
> + *
> + * EXAMPLE:
> + *
> + * This If..Else..If nested sequence:
> + *
> + * If (Arg0 == 1)
> + * {
> + * Local0 = 4
> + * }
> + * Else
> + * {
> + * If (Arg0 == 2)
> + * {
> + * Local0 = 5
> + * }
> + * }
> + *
> + * Is converted to this simpler If..ElseIf sequence:
> + *
> + * If (Arg0 == 1)
> + * {
> + * Local0 = 4
> + * }
> + * ElseIf (Arg0 == 2)
> + * {
> + * Local0 = 5
> + * }
> + *
> + * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
> + * macro that emits an Else opcode followed by an If opcode. This function
> + * reverses these AML sequences back to an ElseIf macro where possible. This
> + * can make the disassembled ASL code simpler and more like the original code.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmConvertToElseIf (
> + ACPI_PARSE_OBJECT *OriginalElseOp)
> +{
> + ACPI_PARSE_OBJECT *IfOp;
> + ACPI_PARSE_OBJECT *ElseOp;
> +
> +
> + /* Examine the first child of the Else */
> +
> + IfOp = OriginalElseOp->Common.Value.Arg;
> + if (!IfOp || (IfOp->Common.AmlOpcode != AML_IF_OP))
> + {
> + /* Not an Else..If sequence, cannot convert to ElseIf */
> +
> + AcpiOsPrintf ("%s", "Else");
> + return;
> + }
> +
> + /* Emit ElseIf, mark the IF as now an ELSEIF */
> +
> + AcpiOsPrintf ("%s", "ElseIf");
> + IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
> +
> + /* The IF parent will now be the same as the original ELSE parent */
> +
> + IfOp->Common.Parent = OriginalElseOp->Common.Parent;
> +
> + /*
> + * Update the NEXT pointers to restructure the parse tree, essentially
> + * promoting an If..Else block up to the same level as the original
> + * Else.
> + *
> + * Check if the IF has a corresponding ELSE peer
> + */
> + ElseOp = IfOp->Common.Next;
> + if (ElseOp &&
> + (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
> + {
> + /* If an ELSE matches the IF, promote it also */
> +
> + ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
> + ElseOp->Common.Next = OriginalElseOp->Common.Next;
> + }
> + else
> + {
> + /* Otherwise, set the IF NEXT to the original ELSE NEXT */
> +
> + IfOp->Common.Next = OriginalElseOp->Common.Next;
> + }
> +
> + /* Detach the child IF block from the original ELSE */
> +
> + OriginalElseOp->Common.Value.Arg = NULL;
> +
> + /* Ignore the original ELSE from now on */
> +
> + OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> + OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
> +
> + /* Insert IF (now ELSEIF) as next peer of the original ELSE */
> +
> + OriginalElseOp->Common.Next = IfOp;
> +}
> diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
> index ccc1200..bcb5fad 100644
> --- a/src/acpica/source/components/disassembler/dmwalk.c
> +++ b/src/acpica/source/components/disassembler/dmwalk.c
> @@ -560,39 +560,40 @@ AcpiDmDescendingOp (
> }
> else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
> (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
> + (!(Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)) &&
> (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
> {
> + /*
> + * This is a first-level element of a term list,
> + * indent a new line
> + */
> + switch (Op->Common.AmlOpcode)
> + {
> + case AML_NOOP_OP:
> /*
> - * This is a first-level element of a term list,
> - * indent a new line
> + * Optionally just ignore this opcode. Some tables use
> + * NoOp opcodes for "padding" out packages that the BIOS
> + * changes dynamically. This can leave hundreds or
> + * thousands of NoOp opcodes that if disassembled,
> + * cannot be compiled because they are syntactically
> + * incorrect.
> */
> - switch (Op->Common.AmlOpcode)
> + if (AcpiGbl_IgnoreNoopOperator)
> {
> - case AML_NOOP_OP:
> - /*
> - * Optionally just ignore this opcode. Some tables use
> - * NoOp opcodes for "padding" out packages that the BIOS
> - * changes dynamically. This can leave hundreds or
> - * thousands of NoOp opcodes that if disassembled,
> - * cannot be compiled because they are syntactically
> - * incorrect.
> - */
> - if (AcpiGbl_IgnoreNoopOperator)
> - {
> - Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> - return (AE_OK);
> - }
> + Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> + return (AE_OK);
> + }
>
> - /* Fallthrough */
> + /* Fallthrough */
>
> - default:
> + default:
>
> - AcpiDmIndent (Level);
> - break;
> - }
> + AcpiDmIndent (Level);
> + break;
> + }
>
> - Info->LastLevel = Level;
> - Info->Count = 0;
> + Info->LastLevel = Level;
> + Info->Count = 0;
> }
>
> /*
> diff --git a/src/acpica/source/components/dispatcher/dsinit.c b/src/acpica/source/components/dispatcher/dsinit.c
> index 4d30879..e153717 100644
> --- a/src/acpica/source/components/dispatcher/dsinit.c
> +++ b/src/acpica/source/components/dispatcher/dsinit.c
> @@ -338,7 +338,7 @@ AcpiDsInitializeObjects (
> /* Summary of objects initialized */
>
> ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
> - "Table [%4.4s:%8.8s] (id %.2X) - %4u Objects with %3u Devices, "
> + "Table [%4.4s: %-8.8s] (id %.2X) - %4u Objects with %3u Devices, "
> "%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n",
> Table->Signature, Table->OemTableId, OwnerId, Info.ObjectCount,
> Info.DeviceCount,Info.OpRegionCount, Info.MethodCount,
> diff --git a/src/acpica/source/components/events/evhandler.c b/src/acpica/source/components/events/evhandler.c
> index 4375e7c..f7dff8d 100644
> --- a/src/acpica/source/components/events/evhandler.c
> +++ b/src/acpica/source/components/events/evhandler.c
> @@ -132,6 +132,7 @@ AcpiEvInstallHandler (
> void *Context,
> void **ReturnValue);
>
> +
> /* These are the address spaces that will get default handlers */
>
> UINT8 AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] =
> @@ -247,7 +248,7 @@ AcpiEvHasDefaultHandler (
> ObjDesc = AcpiNsGetAttachedObject (Node);
> if (ObjDesc)
> {
> - HandlerObj = ObjDesc->Device.Handler;
> + HandlerObj = ObjDesc->CommonNotify.Handler;
>
> /* Walk the linked list of handlers for this object */
>
> @@ -348,33 +349,25 @@ AcpiEvInstallHandler (
> {
> /* Check if this Device already has a handler for this address space */
>
> - NextHandlerObj = ObjDesc->Device.Handler;
> - while (NextHandlerObj)
> + NextHandlerObj = AcpiEvFindRegionHandler (
> + HandlerObj->AddressSpace.SpaceId, ObjDesc->CommonNotify.Handler);
> + if (NextHandlerObj)
> {
> /* Found a handler, is it for the same address space? */
>
> - if (NextHandlerObj->AddressSpace.SpaceId ==
> - HandlerObj->AddressSpace.SpaceId)
> - {
> - ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> - "Found handler for region [%s] in device %p(%p) "
> - "handler %p\n",
> - AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId),
> - ObjDesc, NextHandlerObj, HandlerObj));
> -
> - /*
> - * Since the object we found it on was a device, then it
> - * means that someone has already installed a handler for
> - * the branch of the namespace from this device on. Just
> - * bail out telling the walk routine to not traverse this
> - * branch. This preserves the scoping rule for handlers.
> - */
> - return (AE_CTRL_DEPTH);
> - }
> -
> - /* Walk the linked list of handlers attached to this device */
> -
> - NextHandlerObj = NextHandlerObj->AddressSpace.Next;
> + ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> + "Found handler for region [%s] in device %p(%p) handler %p\n",
> + AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId),
> + ObjDesc, NextHandlerObj, HandlerObj));
> +
> + /*
> + * Since the object we found it on was a device, then it means
> + * that someone has already installed a handler for the branch
> + * of the namespace from this device on. Just bail out telling
> + * the walk routine to not traverse this branch. This preserves
> + * the scoping rule for handlers.
> + */
> + return (AE_CTRL_DEPTH);
> }
>
> /*
> @@ -409,6 +402,46 @@ AcpiEvInstallHandler (
>
> /*******************************************************************************
> *
> + * FUNCTION: AcpiEvFindRegionHandler
> + *
> + * PARAMETERS: SpaceId - The address space ID
> + * HandlerObj - Head of the handler object list
> + *
> + * RETURN: Matching handler object. NULL if space ID not matched
> + *
> + * DESCRIPTION: Search a handler object list for a match on the address
> + * space ID.
> + *
> + ******************************************************************************/
> +
> +ACPI_OPERAND_OBJECT *
> +AcpiEvFindRegionHandler (
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + ACPI_OPERAND_OBJECT *HandlerObj)
> +{
> +
> + /* Walk the handler list for this device */
> +
> + while (HandlerObj)
> + {
> + /* Same SpaceId indicates a handler is installed */
> +
> + if (HandlerObj->AddressSpace.SpaceId == SpaceId)
> + {
> + return (HandlerObj);
> + }
> +
> + /* Next handler object */
> +
> + HandlerObj = HandlerObj->AddressSpace.Next;
> + }
> +
> + return (NULL);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiEvInstallSpaceHandler
> *
> * PARAMETERS: Node - Namespace node for the device
> @@ -434,17 +467,16 @@ AcpiEvInstallSpaceHandler (
> {
> ACPI_OPERAND_OBJECT *ObjDesc;
> ACPI_OPERAND_OBJECT *HandlerObj;
> - ACPI_STATUS Status;
> + ACPI_STATUS Status = AE_OK;
> ACPI_OBJECT_TYPE Type;
> - UINT8 Flags = 0;
> + UINT8 Flags = 0;
>
>
> ACPI_FUNCTION_TRACE (EvInstallSpaceHandler);
>
> -
> /*
> - * This registration is valid for only the types below and the root. This
> - * is where the default handlers get placed.
> + * This registration is valid for only the types below and the root.
> + * The root node is where the default handlers get installed.
> */
> if ((Node->Type != ACPI_TYPE_DEVICE) &&
> (Node->Type != ACPI_TYPE_PROCESSOR) &&
> @@ -517,47 +549,39 @@ AcpiEvInstallSpaceHandler (
> if (ObjDesc)
> {
> /*
> - * The attached device object already exists. Make sure the handler
> - * is not already installed.
> + * The attached device object already exists. Now make sure
> + * the handler is not already installed.
> */
> - HandlerObj = ObjDesc->Device.Handler;
> + HandlerObj = AcpiEvFindRegionHandler (SpaceId,
> + ObjDesc->CommonNotify.Handler);
>
> - /* Walk the handler list for this device */
> -
> - while (HandlerObj)
> + if (HandlerObj)
> {
> - /* Same SpaceId indicates a handler already installed */
> -
> - if (HandlerObj->AddressSpace.SpaceId == SpaceId)
> + if (HandlerObj->AddressSpace.Handler == Handler)
> {
> - if (HandlerObj->AddressSpace.Handler == Handler)
> - {
> - /*
> - * It is (relatively) OK to attempt to install the SAME
> - * handler twice. This can easily happen with the
> - * PCI_Config space.
> - */
> - Status = AE_SAME_HANDLER;
> - goto UnlockAndExit;
> - }
> - else
> - {
> - /* A handler is already installed */
> -
> - Status = AE_ALREADY_EXISTS;
> - }
> + /*
> + * It is (relatively) OK to attempt to install the SAME
> + * handler twice. This can easily happen with the
> + * PCI_Config space.
> + */
> + Status = AE_SAME_HANDLER;
> goto UnlockAndExit;
> }
> + else
> + {
> + /* A handler is already installed */
>
> - /* Walk the linked list of handlers */
> + Status = AE_ALREADY_EXISTS;
> + }
>
> - HandlerObj = HandlerObj->AddressSpace.Next;
> + goto UnlockAndExit;
> }
> }
> else
> {
> ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> - "Creating object on Device %p while installing handler\n", Node));
> + "Creating object on Device %p while installing handler\n",
> + Node));
>
> /* ObjDesc does not exist, create one */
>
> @@ -596,7 +620,8 @@ AcpiEvInstallSpaceHandler (
> }
>
> ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> - "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
> + "Installing address handler for region %s(%X) "
> + "on Device %4.4s %p(%p)\n",
> AcpiUtGetRegionName (SpaceId), SpaceId,
> AcpiUtGetNodeName (Node), Node, ObjDesc));
>
> @@ -621,33 +646,31 @@ AcpiEvInstallSpaceHandler (
> HandlerObj->AddressSpace.Node = Node;
> HandlerObj->AddressSpace.Handler = Handler;
> HandlerObj->AddressSpace.Context = Context;
> - HandlerObj->AddressSpace.Setup = Setup;
> + HandlerObj->AddressSpace.Setup = Setup;
>
> /* Install at head of Device.AddressSpace list */
>
> - HandlerObj->AddressSpace.Next = ObjDesc->Device.Handler;
> + HandlerObj->AddressSpace.Next = ObjDesc->CommonNotify.Handler;
>
> /*
> * The Device object is the first reference on the HandlerObj.
> * Each region that uses the handler adds a reference.
> */
> - ObjDesc->Device.Handler = HandlerObj;
> + ObjDesc->CommonNotify.Handler = HandlerObj;
>
> /*
> - * Walk the namespace finding all of the regions this
> - * handler will manage.
> + * Walk the namespace finding all of the regions this handler will
> + * manage.
> *
> - * Start at the device and search the branch toward
> - * the leaf nodes until either the leaf is encountered or
> - * a device is detected that has an address handler of the
> - * same type.
> + * Start at the device and search the branch toward the leaf nodes
> + * until either the leaf is encountered or a device is detected that
> + * has an address handler of the same type.
> *
> - * In either case, back up and search down the remainder
> - * of the branch
> + * In either case, back up and search down the remainder of the branch
> */
> - Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
> - ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler, NULL,
> - HandlerObj, NULL);
> + Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node,
> + ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
> + AcpiEvInstallHandler, NULL, HandlerObj, NULL);
>
> UnlockAndExit:
> return_ACPI_STATUS (Status);
> diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c
> index 2b00616..c251b9b 100644
> --- a/src/acpica/source/components/events/evregion.c
> +++ b/src/acpica/source/components/events/evregion.c
> @@ -171,6 +171,7 @@ AcpiEvInitializeOpRegions (
>
> /* Run the _REG methods for OpRegions in each default address space */
>
> + AcpiGbl_RegMethodsEnabled = TRUE;
> for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++)
> {
> /*
> @@ -181,13 +182,11 @@ AcpiEvInitializeOpRegions (
> if (AcpiEvHasDefaultHandler (AcpiGbl_RootNode,
> AcpiGbl_DefaultAddressSpaces[i]))
> {
> - Status = AcpiEvExecuteRegMethods (AcpiGbl_RootNode,
> - AcpiGbl_DefaultAddressSpaces[i]);
> + AcpiEvExecuteRegMethods (AcpiGbl_RootNode,
> + AcpiGbl_DefaultAddressSpaces[i], ACPI_REG_CONNECT);
> }
> }
>
> - AcpiGbl_RegMethodsExecuted = TRUE;
> -
> (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> return_ACPI_STATUS (Status);
> }
> @@ -210,6 +209,12 @@ AcpiEvInitializeOpRegions (
> * DESCRIPTION: Dispatch an address space or operation region access to
> * a previously installed handler.
> *
> + * NOTE: During early initialization, we always install the default region
> + * handlers for Memory, I/O and PCI_Config. This ensures that these operation
> + * region address spaces are always available as per the ACPI specification.
> + * This is especially needed in order to support the execution of
> + * module-level AML code during loading of the ACPI tables.
> + *
> ******************************************************************************/
>
> ACPI_STATUS
> @@ -392,7 +397,7 @@ AcpiEvAddressSpaceDispatch (
> * We just returned from a non-default handler, we must re-enter the
> * interpreter
> */
> - AcpiExEnterInterpreter ();
> + AcpiExEnterInterpreter ();
> }
>
> return_ACPI_STATUS (Status);
> @@ -414,7 +419,7 @@ AcpiEvAddressSpaceDispatch (
> ******************************************************************************/
>
> void
> -AcpiEvDetachRegion(
> +AcpiEvDetachRegion (
> ACPI_OPERAND_OBJECT *RegionObj,
> BOOLEAN AcpiNsIsLocked)
> {
> @@ -593,6 +598,13 @@ AcpiEvAttachRegion (
> ACPI_FUNCTION_TRACE (EvAttachRegion);
>
>
> + /* Install the region's handler */
> +
> + if (RegionObj->Region.Handler)
> + {
> + return_ACPI_STATUS (AE_ALREADY_EXISTS);
> + }
> +
> ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> "Adding Region [%4.4s] %p to address handler %p [%s]\n",
> AcpiUtGetNodeName (RegionObj->Region.Node),
> @@ -603,18 +615,62 @@ AcpiEvAttachRegion (
>
> RegionObj->Region.Next = HandlerObj->AddressSpace.RegionList;
> HandlerObj->AddressSpace.RegionList = RegionObj;
> + RegionObj->Region.Handler = HandlerObj;
> + AcpiUtAddReference (HandlerObj);
>
> - /* Install the region's handler */
> + return_ACPI_STATUS (AE_OK);
> +}
>
> - if (RegionObj->Region.Handler)
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiEvAssociateRegMethod
> + *
> + * PARAMETERS: RegionObj - Region object
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Find and associate _REG method to a region
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiEvAssociateRegMethod (
> + ACPI_OPERAND_OBJECT *RegionObj)
> +{
> + ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
> + ACPI_NAMESPACE_NODE *MethodNode;
> + ACPI_NAMESPACE_NODE *Node;
> + ACPI_OPERAND_OBJECT *RegionObj2;
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (EvAssociateRegMethod);
> +
> +
> + RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
> + if (!RegionObj2)
> {
> - return_ACPI_STATUS (AE_ALREADY_EXISTS);
> + return_VOID;
> }
>
> - RegionObj->Region.Handler = HandlerObj;
> - AcpiUtAddReference (HandlerObj);
> + Node = RegionObj->Region.Node->Parent;
>
> - return_ACPI_STATUS (AE_OK);
> + /* Find any "_REG" method associated with this region definition */
> +
> + Status = AcpiNsSearchOneScope (
> + *RegNamePtr, Node, ACPI_TYPE_METHOD, &MethodNode);
> + if (ACPI_SUCCESS (Status))
> + {
> + /*
> + * The _REG method is optional and there can be only one per region
> + * definition. This will be executed when the handler is attached
> + * or removed
> + */
> + RegionObj2->Extra.Method_REG = MethodNode;
> + }
> +
> + return_VOID;
> }
>
>
> @@ -651,7 +707,19 @@ AcpiEvExecuteRegMethod (
> return_ACPI_STATUS (AE_NOT_EXIST);
> }
>
> - if (RegionObj2->Extra.Method_REG == NULL)
> + if (RegionObj2->Extra.Method_REG == NULL ||
> + RegionObj->Region.Handler == NULL ||
> + !AcpiGbl_RegMethodsEnabled)
> + {
> + return_ACPI_STATUS (AE_OK);
> + }
> +
> + /* _REG(DISCONNECT) should be paired with _REG(CONNECT) */
> +
> + if ((Function == ACPI_REG_CONNECT &&
> + RegionObj->Common.Flags & AOPOBJ_REG_CONNECTED) ||
> + (Function == ACPI_REG_DISCONNECT &&
> + !(RegionObj->Common.Flags & AOPOBJ_REG_CONNECTED)))
> {
> return_ACPI_STATUS (AE_OK);
> }
> @@ -703,6 +771,20 @@ AcpiEvExecuteRegMethod (
> Status = AcpiNsEvaluate (Info);
> AcpiUtRemoveReference (Args[1]);
>
> + if (ACPI_FAILURE (Status))
> + {
> + goto Cleanup2;
> + }
> +
> + if (Function == ACPI_REG_CONNECT)
> + {
> + RegionObj->Common.Flags |= AOPOBJ_REG_CONNECTED;
> + }
> + else
> + {
> + RegionObj->Common.Flags &= ~AOPOBJ_REG_CONNECTED;
> + }
> +
> Cleanup2:
> AcpiUtRemoveReference (Args[0]);
>
> @@ -718,26 +800,28 @@ Cleanup1:
> *
> * PARAMETERS: Node - Namespace node for the device
> * SpaceId - The address space ID
> + * Function - Passed to _REG: On (1) or Off (0)
> *
> - * RETURN: Status
> + * RETURN: None
> *
> * DESCRIPTION: Run all _REG methods for the input Space ID;
> * Note: assumes namespace is locked, or system init time.
> *
> ******************************************************************************/
>
> -ACPI_STATUS
> +void
> AcpiEvExecuteRegMethods (
> ACPI_NAMESPACE_NODE *Node,
> - ACPI_ADR_SPACE_TYPE SpaceId)
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + UINT32 Function)
> {
> - ACPI_STATUS Status;
> ACPI_REG_WALK_INFO Info;
>
>
> ACPI_FUNCTION_TRACE (EvExecuteRegMethods);
>
> Info.SpaceId = SpaceId;
> + Info.Function = Function;
> Info.RegRunCount = 0;
>
> ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES,
> @@ -750,7 +834,7 @@ AcpiEvExecuteRegMethods (
> * regions and _REG methods. (i.e. handlers must be installed for all
> * regions of this Space ID before we can run any _REG methods)
> */
> - Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
> + (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
> ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, NULL, &Info, NULL);
>
> /* Special case for EC: handle "orphan" _REG methods with no region */
> @@ -764,7 +848,7 @@ AcpiEvExecuteRegMethods (
> " Executed %u _REG methods for SpaceId %s\n",
> Info.RegRunCount, AcpiUtGetRegionName (Info.SpaceId)));
>
> - return_ACPI_STATUS (Status);
> + return_VOID;
> }
>
>
> @@ -831,7 +915,7 @@ AcpiEvRegRun (
> }
>
> Info->RegRunCount++;
> - Status = AcpiEvExecuteRegMethod (ObjDesc, ACPI_REG_CONNECT);
> + Status = AcpiEvExecuteRegMethod (ObjDesc, Info->Function);
> return (Status);
> }
>
> diff --git a/src/acpica/source/components/events/evrgnini.c b/src/acpica/source/components/events/evrgnini.c
> index ebc3b59..448e57e 100644
> --- a/src/acpica/source/components/events/evrgnini.c
> +++ b/src/acpica/source/components/events/evrgnini.c
> @@ -639,9 +639,6 @@ AcpiEvInitializeRegion (
> ACPI_ADR_SPACE_TYPE SpaceId;
> ACPI_NAMESPACE_NODE *Node;
> ACPI_STATUS Status;
> - ACPI_NAMESPACE_NODE *MethodNode;
> - ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
> - ACPI_OPERAND_OBJECT *RegionObj2;
>
>
> ACPI_FUNCTION_TRACE_U32 (EvInitializeRegion, AcpiNsLocked);
> @@ -657,39 +654,15 @@ AcpiEvInitializeRegion (
> return_ACPI_STATUS (AE_OK);
> }
>
> - RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
> - if (!RegionObj2)
> - {
> - return_ACPI_STATUS (AE_NOT_EXIST);
> - }
> + AcpiEvAssociateRegMethod (RegionObj);
> + RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED;
>
> Node = RegionObj->Region.Node->Parent;
> SpaceId = RegionObj->Region.SpaceId;
>
> - /* Setup defaults */
> -
> - RegionObj->Region.Handler = NULL;
> - RegionObj2->Extra.Method_REG = NULL;
> - RegionObj->Common.Flags &= ~(AOPOBJ_SETUP_COMPLETE);
> - RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED;
> -
> - /* Find any "_REG" method associated with this region definition */
> -
> - Status = AcpiNsSearchOneScope (
> - *RegNamePtr, Node, ACPI_TYPE_METHOD, &MethodNode);
> - if (ACPI_SUCCESS (Status))
> - {
> - /*
> - * The _REG method is optional and there can be only one per region
> - * definition. This will be executed when the handler is attached
> - * or removed
> - */
> - RegionObj2->Extra.Method_REG = MethodNode;
> - }
> -
> /*
> * The following loop depends upon the root Node having no parent
> - * ie: AcpiGbl_RootNode->ParentEntry being set to NULL
> + * ie: AcpiGbl_RootNode->Parent being set to NULL
> */
> while (Node)
> {
> @@ -704,18 +677,10 @@ AcpiEvInitializeRegion (
> switch (Node->Type)
> {
> case ACPI_TYPE_DEVICE:
> -
> - HandlerObj = ObjDesc->Device.Handler;
> - break;
> -
> case ACPI_TYPE_PROCESSOR:
> -
> - HandlerObj = ObjDesc->Processor.Handler;
> - break;
> -
> case ACPI_TYPE_THERMAL:
>
> - HandlerObj = ObjDesc->ThermalZone.Handler;
> + HandlerObj = ObjDesc->CommonNotify.Handler;
> break;
>
> case ACPI_TYPE_METHOD:
> @@ -739,51 +704,43 @@ AcpiEvInitializeRegion (
> break;
> }
>
> - while (HandlerObj)
> + HandlerObj = AcpiEvFindRegionHandler (SpaceId, HandlerObj);
> + if (HandlerObj)
> {
> - /* Is this handler of the correct type? */
> -
> - if (HandlerObj->AddressSpace.SpaceId == SpaceId)
> - {
> - /* Found correct handler */
> + /* Found correct handler */
>
> - ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> - "Found handler %p for region %p in obj %p\n",
> - HandlerObj, RegionObj, ObjDesc));
> + ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
> + "Found handler %p for region %p in obj %p\n",
> + HandlerObj, RegionObj, ObjDesc));
>
> - Status = AcpiEvAttachRegion (HandlerObj, RegionObj,
> - AcpiNsLocked);
> + Status = AcpiEvAttachRegion (HandlerObj, RegionObj,
> + AcpiNsLocked);
>
> - /*
> - * Tell all users that this region is usable by
> - * running the _REG method
> - */
> - if (AcpiNsLocked)
> + /*
> + * Tell all users that this region is usable by
> + * running the _REG method
> + */
> + if (AcpiNsLocked)
> + {
> + Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> + if (ACPI_FAILURE (Status))
> {
> - Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> - if (ACPI_FAILURE (Status))
> - {
> - return_ACPI_STATUS (Status);
> - }
> + return_ACPI_STATUS (Status);
> }
> + }
>
> - Status = AcpiEvExecuteRegMethod (RegionObj, ACPI_REG_CONNECT);
> + Status = AcpiEvExecuteRegMethod (RegionObj, ACPI_REG_CONNECT);
>
> - if (AcpiNsLocked)
> + if (AcpiNsLocked)
> + {
> + Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> + if (ACPI_FAILURE (Status))
> {
> - Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> - if (ACPI_FAILURE (Status))
> - {
> - return_ACPI_STATUS (Status);
> - }
> + return_ACPI_STATUS (Status);
> }
> -
> - return_ACPI_STATUS (AE_OK);
> }
>
> - /* Try next handler in the list */
> -
> - HandlerObj = HandlerObj->AddressSpace.Next;
> + return_ACPI_STATUS (AE_OK);
> }
> }
>
> diff --git a/src/acpica/source/components/events/evxfregn.c b/src/acpica/source/components/events/evxfregn.c
> index 4b70d09..27e4649 100644
> --- a/src/acpica/source/components/events/evxfregn.c
> +++ b/src/acpica/source/components/events/evxfregn.c
> @@ -161,7 +161,6 @@ AcpiInstallAddressSpaceHandler (
>
> ACPI_FUNCTION_TRACE (AcpiInstallAddressSpaceHandler);
>
> -
> /* Parameter validation */
>
> if (!Device)
> @@ -193,43 +192,9 @@ AcpiInstallAddressSpaceHandler (
> goto UnlockAndExit;
> }
>
> - /*
> - * For the default SpaceIDs, (the IDs for which there are default region handlers
> - * installed) Only execute the _REG methods if the global initialization _REG
> - * methods have already been run (via AcpiInitializeObjects). In other words,
> - * we will defer the execution of the _REG methods for these SpaceIDs until
> - * execution of AcpiInitializeObjects. This is done because we need the handlers
> - * for the default spaces (mem/io/pci/table) to be installed before we can run
> - * any control methods (or _REG methods). There is known BIOS code that depends
> - * on this.
> - *
> - * For all other SpaceIDs, we can safely execute the _REG methods immediately.
> - * This means that for IDs like EmbeddedController, this function should be called
> - * only after AcpiEnableSubsystem has been called.
> - */
> - switch (SpaceId)
> - {
> - case ACPI_ADR_SPACE_SYSTEM_MEMORY:
> - case ACPI_ADR_SPACE_SYSTEM_IO:
> - case ACPI_ADR_SPACE_PCI_CONFIG:
> - case ACPI_ADR_SPACE_DATA_TABLE:
> -
> - if (!AcpiGbl_RegMethodsExecuted)
> - {
> - /* We will defer execution of the _REG methods for this space */
> -
> - goto UnlockAndExit;
> - }
> - break;
> -
> - default:
> -
> - break;
> - }
> -
> /* Run all _REG methods for this address space */
>
> - Status = AcpiEvExecuteRegMethods (Node, SpaceId);
> + AcpiEvExecuteRegMethods (Node, SpaceId, ACPI_REG_CONNECT);
>
>
> UnlockAndExit:
> @@ -308,8 +273,8 @@ AcpiRemoveAddressSpaceHandler (
>
> /* Find the address handler the user requested */
>
> - HandlerObj = ObjDesc->Device.Handler;
> - LastObjPtr = &ObjDesc->Device.Handler;
> + HandlerObj = ObjDesc->CommonNotify.Handler;
> + LastObjPtr = &ObjDesc->CommonNotify.Handler;
> while (HandlerObj)
> {
> /* We have a handler, see if user requested this one */
> diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c
> index fc36956..f3c2004 100644
> --- a/src/acpica/source/components/executer/excreate.c
> +++ b/src/acpica/source/components/executer/excreate.c
> @@ -423,9 +423,10 @@ AcpiExCreateRegion (
> * Remember location in AML stream of address & length
> * operands since they need to be evaluated at run time.
> */
> - RegionObj2 = ObjDesc->Common.NextObject;
> + RegionObj2 = AcpiNsGetSecondaryObject (ObjDesc);
> RegionObj2->Extra.AmlStart = AmlStart;
> RegionObj2->Extra.AmlLength = AmlLength;
> + RegionObj2->Extra.Method_REG = NULL;
> if (WalkState->ScopeInfo)
> {
> RegionObj2->Extra.ScopeNode = WalkState->ScopeInfo->Scope.Node;
> @@ -441,6 +442,10 @@ AcpiExCreateRegion (
> ObjDesc->Region.Address = 0;
> ObjDesc->Region.Length = 0;
> ObjDesc->Region.Node = Node;
> + ObjDesc->Region.Handler = NULL;
> + ObjDesc->Common.Flags &=
> + ~(AOPOBJ_SETUP_COMPLETE | AOPOBJ_REG_CONNECTED |
> + AOPOBJ_OBJECT_INITIALIZED);
>
> /* Install the new region object in the parent Node */
>
> diff --git a/src/acpica/source/components/executer/exdebug.c b/src/acpica/source/components/executer/exdebug.c
> index 67bd8fc..9c2c107 100644
> --- a/src/acpica/source/components/executer/exdebug.c
> +++ b/src/acpica/source/components/executer/exdebug.c
> @@ -168,13 +168,20 @@ AcpiExDoDebugObject (
> return_VOID;
> }
>
> - /*
> - * We will emit the current timer value (in microseconds) with each
> - * debug output. Only need the lower 26 bits. This allows for 67
> - * million microseconds or 67 seconds before rollover.
> - */
> - Timer = ((UINT32) AcpiOsGetTimer () / 10); /* (100 nanoseconds to microseconds) */
> - Timer &= 0x03FFFFFF;
> + /* Null string or newline -- don't emit the line header */
> +
> + if (SourceDesc &&
> + (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND) &&
> + (SourceDesc->Common.Type == ACPI_TYPE_STRING))
> + {
> + if ((SourceDesc->String.Length == 0) ||
> + ((SourceDesc->String.Length == 1) &&
> + (*SourceDesc->String.Pointer == '\n')))
> + {
> + AcpiOsPrintf ("\n");
> + return_VOID;
> + }
> + }
>
> /*
> * Print line header as long as we are not in the middle of an
> @@ -182,14 +189,31 @@ AcpiExDoDebugObject (
> */
> if (!((Level > 0) && Index == 0))
> {
> - AcpiOsPrintf ("[ACPI Debug %.8u] %*s", Timer, Level, " ");
> + if (AcpiGbl_DisplayDebugTimer)
> + {
> + /*
> + * We will emit the current timer value (in microseconds) with each
> + * debug output. Only need the lower 26 bits. This allows for 67
> + * million microseconds or 67 seconds before rollover.
> + *
> + * Convert 100 nanosecond units to microseconds
> + */
> + Timer = ((UINT32) AcpiOsGetTimer () / 10);
> + Timer &= 0x03FFFFFF;
> +
> + AcpiOsPrintf ("[ACPI Debug T=0x%8.8X] %*s", Timer, Level, " ");
> + }
> + else
> + {
> + AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
> + }
> }
>
> /* Display the index for package output only */
>
> if (Index > 0)
> {
> - AcpiOsPrintf ("(%.2u) ", Index-1);
> + AcpiOsPrintf ("(%.2u) ", Index - 1);
> }
>
> if (!SourceDesc)
> @@ -200,7 +224,13 @@ AcpiExDoDebugObject (
>
> if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
> {
> - AcpiOsPrintf ("%s ", AcpiUtGetObjectTypeName (SourceDesc));
> + /* No object type prefix needed for integers and strings */
> +
> + if ((SourceDesc->Common.Type != ACPI_TYPE_INTEGER) &&
> + (SourceDesc->Common.Type != ACPI_TYPE_STRING))
> + {
> + AcpiOsPrintf ("%s ", AcpiUtGetObjectTypeName (SourceDesc));
> + }
>
> if (!AcpiUtValidInternalObject (SourceDesc))
> {
> @@ -210,7 +240,7 @@ AcpiExDoDebugObject (
> }
> else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
> {
> - AcpiOsPrintf ("%s: %p\n",
> + AcpiOsPrintf ("%s (Node %p)\n",
> AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
> SourceDesc);
> return_VOID;
> @@ -250,13 +280,12 @@ AcpiExDoDebugObject (
>
> case ACPI_TYPE_STRING:
>
> - AcpiOsPrintf ("[0x%.2X] \"%s\"\n",
> - SourceDesc->String.Length, SourceDesc->String.Pointer);
> + AcpiOsPrintf ("\"%s\"\n", SourceDesc->String.Pointer);
> break;
>
> case ACPI_TYPE_PACKAGE:
>
> - AcpiOsPrintf ("[Contains 0x%.2X Elements]\n",
> + AcpiOsPrintf ("(Contains 0x%.2X Elements):\n",
> SourceDesc->Package.Count);
>
> /* Output the entire contents of the package */
> @@ -335,8 +364,10 @@ AcpiExDoDebugObject (
> if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
> ACPI_DESC_TYPE_NAMED)
> {
> - AcpiExDoDebugObject (((ACPI_NAMESPACE_NODE *)
> - SourceDesc->Reference.Object)->Object,
> + /* Reference object is a namespace node */
> +
> + AcpiExDoDebugObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT,
> + SourceDesc->Reference.Object),
> Level + 4, 0);
> }
> else
> @@ -362,8 +393,15 @@ AcpiExDoDebugObject (
> case ACPI_TYPE_PACKAGE:
>
> AcpiOsPrintf ("Package[%u] = ", Value);
> - AcpiExDoDebugObject (*SourceDesc->Reference.Where,
> - Level+4, 0);
> + if (!(*SourceDesc->Reference.Where))
> + {
> + AcpiOsPrintf ("[Uninitialized Package Element]\n");
> + }
> + else
> + {
> + AcpiExDoDebugObject (*SourceDesc->Reference.Where,
> + Level+4, 0);
> + }
> break;
>
> default:
> @@ -378,7 +416,7 @@ AcpiExDoDebugObject (
>
> default:
>
> - AcpiOsPrintf ("%p\n", SourceDesc);
> + AcpiOsPrintf ("(Descriptor %p)\n", SourceDesc);
> break;
> }
>
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 73acfd4..2f2836e 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -594,7 +594,8 @@ AcpiExDumpObject (
> if (Next)
> {
> AcpiOsPrintf ("(%s %2.2X)",
> - AcpiUtGetObjectTypeName (Next), Next->Common.Type);
> + AcpiUtGetObjectTypeName (Next),
> + Next->AddressSpace.SpaceId);
>
> while (Next->AddressSpace.Next)
> {
> @@ -606,7 +607,8 @@ AcpiExDumpObject (
>
> Next = Next->AddressSpace.Next;
> AcpiOsPrintf ("->%p(%s %2.2X)", Next,
> - AcpiUtGetObjectTypeName (Next), Next->Common.Type);
> + AcpiUtGetObjectTypeName (Next),
> + Next->AddressSpace.SpaceId);
>
> if ((Next == Start) || (Next == Data))
> {
> diff --git a/src/acpica/source/components/executer/exmisc.c b/src/acpica/source/components/executer/exmisc.c
> index c2e04bb..cde2279 100644
> --- a/src/acpica/source/components/executer/exmisc.c
> +++ b/src/acpica/source/components/executer/exmisc.c
> @@ -180,9 +180,9 @@ AcpiExGetObjectReference (
>
> default:
>
> - ACPI_ERROR ((AE_INFO, "Unknown Reference Class 0x%2.2X",
> + ACPI_ERROR ((AE_INFO, "Invalid Reference Class 0x%2.2X",
> ObjDesc->Reference.Class));
> - return_ACPI_STATUS (AE_AML_INTERNAL);
> + return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
> }
> break;
>
> @@ -338,6 +338,7 @@ AcpiExDoConcatenate (
> ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1;
> ACPI_OPERAND_OBJECT *ReturnDesc;
> char *NewBuf;
> + const char *TypeString;
> ACPI_STATUS Status;
>
>
> @@ -359,9 +360,42 @@ AcpiExDoConcatenate (
> break;
>
> case ACPI_TYPE_STRING:
> + /*
> + * Per the ACPI spec, Concatenate only supports int/str/buf.
> + * However, we support all objects here as an extension.
> + * This improves the usefulness of the Printf() macro.
> + * 12/2015.
> + */
> + switch (Operand1->Common.Type)
> + {
> + case ACPI_TYPE_INTEGER:
> + case ACPI_TYPE_STRING:
> + case ACPI_TYPE_BUFFER:
>
> - Status = AcpiExConvertToString (
> - Operand1, &LocalOperand1, ACPI_IMPLICIT_CONVERT_HEX);
> + Status = AcpiExConvertToString (
> + Operand1, &LocalOperand1, ACPI_IMPLICIT_CONVERT_HEX);
> + break;
> +
> + default:
> + /*
> + * Just emit a string containing the object type.
> + */
> + TypeString = AcpiUtGetTypeName (Operand1->Common.Type);
> +
> + LocalOperand1 = AcpiUtCreateStringObject (
> + ((ACPI_SIZE) strlen (TypeString) + 9)); /* 9 For "[Object]" */
> + if (!LocalOperand1)
> + {
> + Status = AE_NO_MEMORY;
> + goto Cleanup;
> + }
> +
> + strcpy (LocalOperand1->String.Pointer, "[");
> + strcat (LocalOperand1->String.Pointer, TypeString);
> + strcat (LocalOperand1->String.Pointer, " Object]");
> + Status = AE_OK;
> + break;
> + }
> break;
>
> case ACPI_TYPE_BUFFER:
> @@ -440,8 +474,7 @@ AcpiExDoConcatenate (
> /* Concatenate the strings */
>
> strcpy (NewBuf, Operand0->String.Pointer);
> - strcpy (NewBuf + Operand0->String.Length,
> - LocalOperand1->String.Pointer);
> + strcat (NewBuf, LocalOperand1->String.Pointer);
> break;
>
> case ACPI_TYPE_BUFFER:
> diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
> index 466c886..965de2d 100644
> --- a/src/acpica/source/components/executer/exoparg1.c
> +++ b/src/acpica/source/components/executer/exoparg1.c
> @@ -796,7 +796,7 @@ AcpiExOpcode_1A_0T_1R (
> Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);
> break;
>
> - case AML_TYPE_OP: /* ObjectType (SourceObject) */
> + case AML_OBJECT_TYPE_OP: /* ObjectType (SourceObject) */
> /*
> * Note: The operand is not resolved at this point because we want to
> * get the associated object, not its value. For example, we don't
> diff --git a/src/acpica/source/components/namespace/nsconvert.c b/src/acpica/source/components/namespace/nsconvert.c
> index ee361ea..af5b255 100644
> --- a/src/acpica/source/components/namespace/nsconvert.c
> +++ b/src/acpica/source/components/namespace/nsconvert.c
> @@ -404,7 +404,8 @@ AcpiNsConvertToBuffer (
> *
> * FUNCTION: AcpiNsConvertToUnicode
> *
> - * PARAMETERS: OriginalObject - ASCII String Object to be converted
> + * PARAMETERS: Scope - Namespace node for the method/object
> + * OriginalObject - ASCII String Object to be converted
> * ReturnObject - Where the new converted object is returned
> *
> * RETURN: Status. AE_OK if conversion was successful.
> @@ -415,6 +416,7 @@ AcpiNsConvertToBuffer (
>
> ACPI_STATUS
> AcpiNsConvertToUnicode (
> + ACPI_NAMESPACE_NODE *Scope,
> ACPI_OPERAND_OBJECT *OriginalObject,
> ACPI_OPERAND_OBJECT **ReturnObject)
> {
> @@ -476,7 +478,8 @@ AcpiNsConvertToUnicode (
> *
> * FUNCTION: AcpiNsConvertToResource
> *
> - * PARAMETERS: OriginalObject - Object to be converted
> + * PARAMETERS: Scope - Namespace node for the method/object
> + * OriginalObject - Object to be converted
> * ReturnObject - Where the new converted object is returned
> *
> * RETURN: Status. AE_OK if conversion was successful
> @@ -488,6 +491,7 @@ AcpiNsConvertToUnicode (
>
> ACPI_STATUS
> AcpiNsConvertToResource (
> + ACPI_NAMESPACE_NODE *Scope,
> ACPI_OPERAND_OBJECT *OriginalObject,
> ACPI_OPERAND_OBJECT **ReturnObject)
> {
> @@ -554,3 +558,81 @@ AcpiNsConvertToResource (
> *ReturnObject = NewObject;
> return (AE_OK);
> }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiNsConvertToReference
> + *
> + * PARAMETERS: Scope - Namespace node for the method/object
> + * OriginalObject - Object to be converted
> + * ReturnObject - Where the new converted object is returned
> + *
> + * RETURN: Status. AE_OK if conversion was successful
> + *
> + * DESCRIPTION: Attempt to convert a Integer object to a ObjectReference.
> + * Buffer.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiNsConvertToReference (
> + ACPI_NAMESPACE_NODE *Scope,
> + ACPI_OPERAND_OBJECT *OriginalObject,
> + ACPI_OPERAND_OBJECT **ReturnObject)
> +{
> + ACPI_OPERAND_OBJECT *NewObject = NULL;
> + ACPI_STATUS Status;
> + ACPI_NAMESPACE_NODE *Node;
> + ACPI_GENERIC_STATE ScopeInfo;
> + char *Name;
> +
> +
> + ACPI_FUNCTION_NAME (NsConvertToReference);
> +
> +
> + /* Convert path into internal presentation */
> +
> + Status = AcpiNsInternalizeName (OriginalObject->String.Pointer, &Name);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /* Find the namespace node */
> +
> + ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Scope);
> + Status = AcpiNsLookup (&ScopeInfo, Name,
> + ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> + ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
> + if (ACPI_FAILURE (Status))
> + {
> + /* Check if we are resolving a named reference within a package */
> +
> + ACPI_ERROR_NAMESPACE (OriginalObject->String.Pointer, Status);
> + goto ErrorExit;
> + }
> +
> + /* Create and init a new internal ACPI object */
> +
> + NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
> + if (!NewObject)
> + {
> + Status = AE_NO_MEMORY;
> + goto ErrorExit;
> + }
> + NewObject->Reference.Node = Node;
> + NewObject->Reference.Object = Node->Object;
> + NewObject->Reference.Class = ACPI_REFCLASS_NAME;
> +
> + /*
> + * Increase reference of the object if needed (the object is likely a
> + * null for device nodes).
> + */
> + AcpiUtAddReference (Node->Object);
> +
> +ErrorExit:
> + ACPI_FREE (Name);
> + *ReturnObject = NewObject;
> + return (AE_OK);
> +}
> diff --git a/src/acpica/source/components/namespace/nseval.c b/src/acpica/source/components/namespace/nseval.c
> index 9847e93..a62269f 100644
> --- a/src/acpica/source/components/namespace/nseval.c
> +++ b/src/acpica/source/components/namespace/nseval.c
> @@ -491,7 +491,7 @@ AcpiNsExecModuleCodeList (
> *
> * DESCRIPTION: Execute a control method containing a block of module-level
> * executable AML code. The control method is temporarily
> - * installed to the root node, then evaluated.
> + * installed to a local copy of the root node, then evaluated.
> *
> ******************************************************************************/
>
> @@ -500,10 +500,9 @@ AcpiNsExecModuleCode (
> ACPI_OPERAND_OBJECT *MethodObj,
> ACPI_EVALUATE_INFO *Info)
> {
> - ACPI_OPERAND_OBJECT *ParentObj;
> - ACPI_NAMESPACE_NODE *ParentNode;
> - ACPI_OBJECT_TYPE Type;
> ACPI_STATUS Status;
> + ACPI_NAMESPACE_NODE *TempNode;
> + ACPI_NAMESPACE_NODE *ParentNode;
>
>
> ACPI_FUNCTION_TRACE (NsExecModuleCode);
> @@ -515,21 +514,18 @@ AcpiNsExecModuleCode (
> */
> ParentNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> MethodObj->Method.NextObject);
> - Type = AcpiNsGetType (ParentNode);
>
> - /*
> - * Get the region handler and save it in the method object. We may need
> - * this if an operation region declaration causes a _REG method to be run.
> - *
> - * We can't do this in AcpiPsLinkModuleCode because
> - * AcpiGbl_RootNode->Object is NULL at PASS1.
> - */
> - if ((Type == ACPI_TYPE_DEVICE) && ParentNode->Object)
> + /* Take a copy of the parent node to act as parent of this method */
> +
> + TempNode = ACPI_ALLOCATE (sizeof (ACPI_NAMESPACE_NODE));
> + if (!TempNode)
> {
> - MethodObj->Method.Dispatch.Handler =
> - ParentNode->Object->Device.Handler;
> + return_VOID;
> }
>
> + memcpy (TempNode, ParentNode, sizeof (ACPI_NAMESPACE_NODE));
> + TempNode->Object = NULL; /* Clear the subobject */
> +
> /* Must clear NextObject (AcpiNsAttachObject needs the field) */
>
> MethodObj->Method.NextObject = NULL;
> @@ -537,26 +533,14 @@ AcpiNsExecModuleCode (
> /* Initialize the evaluation information block */
>
> memset (Info, 0, sizeof (ACPI_EVALUATE_INFO));
> - Info->PrefixNode = ParentNode;
> -
> - /*
> - * Get the currently attached parent object. Add a reference, because the
> - * ref count will be decreased when the method object is installed to
> - * the parent node.
> - */
> - ParentObj = AcpiNsGetAttachedObject (ParentNode);
> - if (ParentObj)
> - {
> - AcpiUtAddReference (ParentObj);
> - }
> + Info->PrefixNode = TempNode;
>
> /* Install the method (module-level code) in the parent node */
>
> - Status = AcpiNsAttachObject (ParentNode, MethodObj,
> - ACPI_TYPE_METHOD);
> + Status = AcpiNsAttachObject (TempNode, MethodObj, ACPI_TYPE_METHOD);
> if (ACPI_FAILURE (Status))
> {
> - goto Exit;
> + goto Cleanup;
> }
>
> /* Execute the parent node as a control method */
> @@ -574,25 +558,7 @@ AcpiNsExecModuleCode (
> AcpiUtRemoveReference (Info->ReturnObject);
> }
>
> - /* Detach the temporary method object */
> -
> - AcpiNsDetachObject (ParentNode);
> -
> - /* Restore the original parent object */
> -
> - if (ParentObj)
> - {
> - Status = AcpiNsAttachObject (ParentNode, ParentObj, Type);
> - }
> - else
> - {
> - ParentNode->Type = (UINT8) Type;
> - }
> -
> -Exit:
> - if (ParentObj)
> - {
> - AcpiUtRemoveReference (ParentObj);
> - }
> +Cleanup:
> + ACPI_FREE (TempNode);
> return_VOID;
> }
> diff --git a/src/acpica/source/components/namespace/nsload.c b/src/acpica/source/components/namespace/nsload.c
> index cae1616..738f897 100644
> --- a/src/acpica/source/components/namespace/nsload.c
> +++ b/src/acpica/source/components/namespace/nsload.c
> @@ -239,6 +239,24 @@ Unlock:
> ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> "**** Completed Table Object Initialization\n"));
>
> + /*
> + * Execute any module-level code that was detected during the table load
> + * phase. Although illegal since ACPI 2.0, there are many machines that
> + * contain this type of code. Each block of detected executable AML code
> + * outside of any control method is wrapped with a temporary control
> + * method object and placed on a global list. The methods on this list
> + * are executed below.
> + *
> + * This case executes the module-level code for each table immediately
> + * after the table has been loaded. This provides compatibility with
> + * other ACPI implementations. Optionally, the execution can be deferred
> + * until later, see AcpiInitializeObjects.
> + */
> + if (!AcpiGbl_GroupModuleLevelCode)
> + {
> + AcpiNsExecModuleCodeList ();
> + }
> +
> return_ACPI_STATUS (Status);
> }
>
> diff --git a/src/acpica/source/components/namespace/nsrepair.c b/src/acpica/source/components/namespace/nsrepair.c
> index 98265bc..556af7c 100644
> --- a/src/acpica/source/components/namespace/nsrepair.c
> +++ b/src/acpica/source/components/namespace/nsrepair.c
> @@ -186,6 +186,11 @@ static const ACPI_SIMPLE_REPAIR_INFO AcpiObjectRepairInfo[] =
> ACPI_NOT_PACKAGE_ELEMENT,
> AcpiNsConvertToResource },
>
> + /* Object reference conversions */
> +
> + { "_DEP", ACPI_RTYPE_STRING, ACPI_ALL_PACKAGE_ELEMENTS,
> + AcpiNsConvertToReference },
> +
> /* Unicode conversions */
>
> { "_MLS", ACPI_RTYPE_STRING, 1,
> @@ -246,7 +251,8 @@ AcpiNsSimpleRepair (
> ACPI_WARN_ALWAYS, "Missing expected return value"));
> }
>
> - Status = Predefined->ObjectConverter (ReturnObject, &NewObject);
> + Status = Predefined->ObjectConverter (Info->Node, ReturnObject,
> + &NewObject);
> if (ACPI_FAILURE (Status))
> {
> /* A fatal error occurred during a conversion */
> @@ -445,7 +451,8 @@ AcpiNsMatchSimpleRepair (
> /* Check if we can actually repair this name/type combination */
>
> if ((ReturnBtype & ThisName->UnexpectedBtypes) &&
> - (PackageIndex == ThisName->PackageIndex))
> + (ThisName->PackageIndex == ACPI_ALL_PACKAGE_ELEMENTS ||
> + PackageIndex == ThisName->PackageIndex))
> {
> return (ThisName);
> }
> diff --git a/src/acpica/source/components/parser/psargs.c b/src/acpica/source/components/parser/psargs.c
> index 4ee5f0a..d6654a1 100644
> --- a/src/acpica/source/components/parser/psargs.c
> +++ b/src/acpica/source/components/parser/psargs.c
> @@ -370,7 +370,7 @@ AcpiPsGetNextNamepath (
> PossibleMethodCall &&
> (Node->Type == ACPI_TYPE_METHOD))
> {
> - if (WalkState->Opcode == AML_UNLOAD_OP)
> + if (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) == ARGP_SUPERNAME)
> {
> /*
> * AcpiPsGetNextNamestring has increased the AML pointer,
> @@ -816,7 +816,7 @@ AcpiPsGetNextField (
> *
> * PARAMETERS: WalkState - Current state
> * ParserState - Current parser state object
> - * ArgType - The argument type (AML_*_ARG)
> + * ArgType - The parser argument type (ARGP_*)
> * ReturnArg - Where the next arg is returned
> *
> * RETURN: Status, and an op object containing the next argument.
> @@ -929,6 +929,7 @@ AcpiPsGetNextArg (
> case ARGP_TARGET:
> case ARGP_SUPERNAME:
> case ARGP_SIMPLENAME:
> + case ARGP_NAME_OR_REF:
>
> Subop = AcpiPsPeekOpcode (ParserState);
> if (Subop == 0 ||
> @@ -944,15 +945,16 @@ AcpiPsGetNextArg (
> return_ACPI_STATUS (AE_NO_MEMORY);
> }
>
> - /* To support SuperName arg of Unload */
> + /* SuperName allows argument to be a method call */
>
> - if (WalkState->Opcode == AML_UNLOAD_OP)
> + if (ArgType == ARGP_SUPERNAME)
> {
> - Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 1);
> + Status = AcpiPsGetNextNamepath (WalkState, ParserState,
> + Arg, ACPI_POSSIBLE_METHOD_CALL);
>
> /*
> - * If the SuperName arg of Unload is a method call,
> - * we have restored the AML pointer, just free this Arg
> + * If the SuperName argument is a method call, we have
> + * already restored the AML pointer, just free this Arg
> */
> if (Arg->Common.AmlOpcode == AML_INT_METHODCALL_OP)
> {
> @@ -962,7 +964,8 @@ AcpiPsGetNextArg (
> }
> else
> {
> - Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 0);
> + Status = AcpiPsGetNextNamepath (WalkState, ParserState,
> + Arg, ACPI_NOT_METHOD_CALL);
> }
> }
> else
> diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c
> index 2fa4e72..524a6bd 100644
> --- a/src/acpica/source/components/parser/psloop.c
> +++ b/src/acpica/source/components/parser/psloop.c
> @@ -192,8 +192,8 @@ AcpiPsGetArguments (
>
> case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */
>
> - Status = AcpiPsGetNextNamepath (
> - WalkState, &(WalkState->ParserState), Op, 1);
> + Status = AcpiPsGetNextNamepath (WalkState,
> + &(WalkState->ParserState), Op, ACPI_POSSIBLE_METHOD_CALL);
> if (ACPI_FAILURE (Status))
> {
> return_ACPI_STATUS (Status);
> diff --git a/src/acpica/source/components/parser/psopcode.c b/src/acpica/source/components/parser/psopcode.c
> index 41181c6..4590815 100644
> --- a/src/acpica/source/components/parser/psopcode.c
> +++ b/src/acpica/source/components/parser/psopcode.c
> @@ -317,7 +317,7 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
> /* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
> /* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
> /* 36 */ ACPI_OP ("CreateBitField", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE),
> -/* 37 */ ACPI_OP ("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
> +/* 37 */ ACPI_OP ("ObjectType", ARGP_OBJECT_TYPE_OP, ARGI_OBJECT_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
> /* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT),
> /* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC | AML_CONSTANT),
> /* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
> diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
> index bb74c0a..0f25fda 100644
> --- a/src/acpica/source/components/tables/tbutils.c
> +++ b/src/acpica/source/components/tables/tbutils.c
> @@ -491,7 +491,7 @@ NextTable:
> *
> * PARAMETERS: Signature - Sig string to be validated
> *
> - * RETURN: TRUE if signature is correct length and has valid characters
> + * RETURN: TRUE if signature is has 4 valid ACPI characters
> *
> * DESCRIPTION: Validate an ACPI table signature.
> *
> @@ -504,13 +504,6 @@ AcpiIsValidSignature (
> UINT32 i;
>
>
> - /* Validate the signature length */
> -
> - if (strlen (Signature) != ACPI_NAME_SIZE)
> - {
> - return (FALSE);
> - }
> -
> /* Validate each character in the signature */
>
> for (i = 0; i < ACPI_NAME_SIZE; i++)
> diff --git a/src/acpica/source/components/utilities/utinit.c b/src/acpica/source/components/utilities/utinit.c
> index ee14368..c29f288 100644
> --- a/src/acpica/source/components/utilities/utinit.c
> +++ b/src/acpica/source/components/utilities/utinit.c
> @@ -298,7 +298,6 @@ AcpiUtInitGlobals (
> AcpiGbl_NextOwnerIdOffset = 0;
> AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING;
> AcpiGbl_OsiMutex = NULL;
> - AcpiGbl_RegMethodsExecuted = FALSE;
> AcpiGbl_MaxLoopIterations = 0xFFFF;
>
> /* Hardware oriented */
> diff --git a/src/acpica/source/components/utilities/utstring.c b/src/acpica/source/components/utilities/utstring.c
> index 529b39f..05178cf 100644
> --- a/src/acpica/source/components/utilities/utstring.c
> +++ b/src/acpica/source/components/utilities/utstring.c
> @@ -343,6 +343,15 @@ AcpiUtRepairName (
> ACPI_FUNCTION_NAME (UtRepairName);
>
>
> + /*
> + * Special case for the root node. This can happen if we get an
> + * error during the execution of module-level code.
> + */
> + if (ACPI_COMPARE_NAME (Name, "\\___"))
> + {
> + return;
> + }
> +
> ACPI_MOVE_NAME (&OriginalName, Name);
>
> /* Check each character in the name */
> diff --git a/src/acpica/source/components/utilities/utxfinit.c b/src/acpica/source/components/utilities/utxfinit.c
> index 4703dc1..841aaa4 100644
> --- a/src/acpica/source/components/utilities/utxfinit.c
> +++ b/src/acpica/source/components/utilities/utxfinit.c
> @@ -204,6 +204,25 @@ AcpiInitializeSubsystem (
> return_ACPI_STATUS (Status);
> }
>
> + if (!AcpiGbl_OverrideDefaultRegionHandlers)
> + {
> + /*
> + * Install the default operation region handlers. These are the
> + * handlers that are defined by the ACPI specification to be
> + * "always accessible" -- namely, SystemMemory, SystemIO, and
> + * PCI_Config. This also means that no _REG methods need to be
> + * run for these address spaces. We need to have these handlers
> + * installed before any AML code can be executed, especially any
> + * module-level code (11/2015).
> + */
> + Status = AcpiEvInstallRegionHandlers ();
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_EXCEPTION ((AE_INFO, Status, "During Region initialization"));
> + return_ACPI_STATUS (Status);
> + }
> + }
> +
> return_ACPI_STATUS (AE_OK);
> }
>
> @@ -233,6 +252,33 @@ AcpiEnableSubsystem (
> ACPI_FUNCTION_TRACE (AcpiEnableSubsystem);
>
>
> + /*
> + * The early initialization phase is complete. The namespace is loaded,
> + * and we can now support address spaces other than Memory, I/O, and
> + * PCI_Config.
> + */
> + AcpiGbl_EarlyInitialization = FALSE;
> +
> + if (AcpiGbl_OverrideDefaultRegionHandlers)
> + {
> + /*
> + * Install the default operation region handlers. These are the
> + * handlers that are defined by the ACPI specification to be
> + * "always accessible" -- namely, SystemMemory, SystemIO, and
> + * PCI_Config. This also means that no _REG methods need to be
> + * run for these address spaces. We need to have these handlers
> + * installed before any AML code can be executed, especially any
> + * module-level code (11/2015).
> + */
> + Status = AcpiEvInstallRegionHandlers ();
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_EXCEPTION ((AE_INFO, Status, "During Region initialization"));
> + return_ACPI_STATUS (Status);
> + }
> + }
> +
> +
> #if (!ACPI_REDUCED_HARDWARE)
>
> /* Enable ACPI mode */
> @@ -265,26 +311,6 @@ AcpiEnableSubsystem (
> }
> }
>
> -#endif /* !ACPI_REDUCED_HARDWARE */
> -
> - /*
> - * Install the default OpRegion handlers. These are installed unless
> - * other handlers have already been installed via the
> - * InstallAddressSpaceHandler interface.
> - */
> - if (!(Flags & ACPI_NO_ADDRESS_SPACE_INIT))
> - {
> - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
> - "[Init] Installing default address space handlers\n"));
> -
> - Status = AcpiEvInstallRegionHandlers ();
> - if (ACPI_FAILURE (Status))
> - {
> - return_ACPI_STATUS (Status);
> - }
> - }
> -
> -#if (!ACPI_REDUCED_HARDWARE)
> /*
> * Initialize ACPI Event handling (Fixed and General Purpose)
> *
> @@ -392,8 +418,15 @@ AcpiInitializeObjects (
> * outside of any control method is wrapped with a temporary control
> * method object and placed on a global list. The methods on this list
> * are executed below.
> + *
> + * This case executes the module-level code for all tables only after
> + * all of the tables have been loaded. It is a legacy option and is
> + * not compatible with other ACPI implementations. See AcpiNsLoadTable.
> */
> - AcpiNsExecModuleCodeList ();
> + if (AcpiGbl_GroupModuleLevelCode)
> + {
> + AcpiNsExecModuleCodeList ();
> + }
>
> /*
> * Initialize the objects that remain uninitialized. This runs the
> diff --git a/src/acpica/source/include/acapps.h b/src/acpica/source/include/acapps.h
> index 4fbebbf..ed206b2 100644
> --- a/src/acpica/source/include/acapps.h
> +++ b/src/acpica/source/include/acapps.h
> @@ -163,7 +163,7 @@
> AcpiOsPrintf (Description);
>
> #define ACPI_OPTION(Name, Description) \
> - AcpiOsPrintf (" %-18s%s\n", Name, Description);
> + AcpiOsPrintf (" %-20s%s\n", Name, Description);
>
>
> /* Check for unexpected exceptions */
> @@ -187,11 +187,21 @@
> /* acfileio */
>
> ACPI_STATUS
> -AcpiAcGetAllTablesFromFile (
> +AcGetAllTablesFromFile (
> char *Filename,
> UINT8 GetOnlyAmlTables,
> ACPI_NEW_TABLE_DESC **ReturnListHead);
>
> +BOOLEAN
> +AcIsFileBinary (
> + FILE *File);
> +
> +ACPI_STATUS
> +AcValidateTableHeader (
> + FILE *File,
> + long TableOffset);
> +
> +
> /* Values for GetOnlyAmlTables */
>
> #define ACPI_GET_ONLY_AML_TABLES TRUE
> diff --git a/src/acpica/source/include/acevents.h b/src/acpica/source/include/acevents.h
> index 467e14f..e1b1d9b 100644
> --- a/src/acpica/source/include/acevents.h
> +++ b/src/acpica/source/include/acevents.h
> @@ -294,6 +294,11 @@ AcpiEvDeleteGpeHandlers (
> /*
> * evhandler - Address space handling
> */
> +ACPI_OPERAND_OBJECT *
> +AcpiEvFindRegionHandler (
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + ACPI_OPERAND_OBJECT *HandlerObj);
> +
> BOOLEAN
> AcpiEvHasDefaultHandler (
> ACPI_NAMESPACE_NODE *Node,
> @@ -336,17 +341,22 @@ AcpiEvAttachRegion (
>
> void
> AcpiEvDetachRegion (
> - ACPI_OPERAND_OBJECT *RegionObj,
> + ACPI_OPERAND_OBJECT *RegionObj,
> BOOLEAN AcpiNsIsLocked);
>
> -ACPI_STATUS
> +void
> +AcpiEvAssociateRegMethod (
> + ACPI_OPERAND_OBJECT *RegionObj);
> +
> +void
> AcpiEvExecuteRegMethods (
> ACPI_NAMESPACE_NODE *Node,
> - ACPI_ADR_SPACE_TYPE SpaceId);
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + UINT32 Function);
>
> ACPI_STATUS
> AcpiEvExecuteRegMethod (
> - ACPI_OPERAND_OBJECT *RegionObj,
> + ACPI_OPERAND_OBJECT *RegionObj,
> UINT32 Function);
>
>
> diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index ca09e6b..6029213 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/source/include/acexcep.h
> @@ -200,8 +200,9 @@ typedef struct acpi_exception_info
> #define AE_OWNER_ID_LIMIT EXCEP_ENV (0x001B)
> #define AE_NOT_CONFIGURED EXCEP_ENV (0x001C)
> #define AE_ACCESS EXCEP_ENV (0x001D)
> +#define AE_IO_ERROR EXCEP_ENV (0x001E)
>
> -#define AE_CODE_ENV_MAX 0x001D
> +#define AE_CODE_ENV_MAX 0x001E
>
>
> /*
> @@ -334,7 +335,8 @@ static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Env[] =
> EXCEP_TXT ("AE_NO_HANDLER", "A handler for the operation is not installed"),
> EXCEP_TXT ("AE_OWNER_ID_LIMIT", "There are no more Owner IDs available for ACPI tables or control methods"),
> EXCEP_TXT ("AE_NOT_CONFIGURED", "The interface is not part of the current subsystem configuration"),
> - EXCEP_TXT ("AE_ACCESS", "Permission denied for the requested operation")
> + EXCEP_TXT ("AE_ACCESS", "Permission denied for the requested operation"),
> + EXCEP_TXT ("AE_IO_ERROR", "An I/O error occurred")
> };
>
> static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Pgm[] =
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index 2fb8062..c0286cc 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -158,6 +158,8 @@ ACPI_GLOBAL (UINT8, AcpiGbl_IntegerBitWidth);
> ACPI_GLOBAL (UINT8, AcpiGbl_IntegerByteWidth);
> ACPI_GLOBAL (UINT8, AcpiGbl_IntegerNybbleWidth);
>
> +ACPI_INIT_GLOBAL (UINT8, AcpiGbl_GroupModuleLevelCode, FALSE);
> +
>
> /*****************************************************************************
> *
> @@ -220,6 +222,7 @@ ACPI_GLOBAL (ACPI_CACHE_T *, AcpiGbl_OperandCache);
>
> ACPI_INIT_GLOBAL (UINT32, AcpiGbl_StartupFlags, 0);
> ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_Shutdown, TRUE);
> +ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_EarlyInitialization, TRUE);
>
> /* Global handlers */
>
> @@ -239,7 +242,7 @@ ACPI_GLOBAL (UINT8, AcpiGbl_NextOwnerIdOffset);
>
> /* Initialization sequencing */
>
> -ACPI_GLOBAL (BOOLEAN, AcpiGbl_RegMethodsExecuted);
> +ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_RegMethodsEnabled, FALSE);
>
> /* Misc */
>
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index 8d1e37b..b6974fc 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -525,6 +525,7 @@ typedef union acpi_predefined_info
> /* Return object auto-repair info */
>
> typedef ACPI_STATUS (*ACPI_OBJECT_CONVERTER) (
> + struct acpi_namespace_node *Scope,
> union acpi_operand_object *OriginalObject,
> union acpi_operand_object **ConvertedObject);
>
> @@ -560,6 +561,7 @@ typedef struct acpi_simple_repair_info
> typedef struct acpi_reg_walk_info
> {
> ACPI_ADR_SPACE_TYPE SpaceId;
> + UINT32 Function;
> UINT32 RegRunCount;
>
> } ACPI_REG_WALK_INFO;
> @@ -1112,6 +1114,7 @@ typedef struct acpi_parse_state
> #define ACPI_PARSEOP_CLOSING_PAREN 0x10
> #define ACPI_PARSEOP_COMPOUND 0x20
> #define ACPI_PARSEOP_ASSIGNMENT 0x40
> +#define ACPI_PARSEOP_ELSEIF 0x80
>
>
> /*****************************************************************************
> diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
> index db7f114..fc109f4 100644
> --- a/src/acpica/source/include/acnamesp.h
> +++ b/src/acpica/source/include/acnamesp.h
> @@ -150,6 +150,7 @@
> /* Object is not a package element */
>
> #define ACPI_NOT_PACKAGE_ELEMENT ACPI_UINT32_MAX
> +#define ACPI_ALL_PACKAGE_ELEMENTS (ACPI_UINT32_MAX-1)
>
> /* Always emit warning message, not dependent on node flags */
>
> @@ -296,11 +297,19 @@ AcpiNsConvertToBuffer (
>
> ACPI_STATUS
> AcpiNsConvertToUnicode (
> + ACPI_NAMESPACE_NODE *Scope,
> ACPI_OPERAND_OBJECT *OriginalObject,
> ACPI_OPERAND_OBJECT **ReturnObject);
>
> ACPI_STATUS
> AcpiNsConvertToResource (
> + ACPI_NAMESPACE_NODE *Scope,
> + ACPI_OPERAND_OBJECT *OriginalObject,
> + ACPI_OPERAND_OBJECT **ReturnObject);
> +
> +ACPI_STATUS
> +AcpiNsConvertToReference (
> + ACPI_NAMESPACE_NODE *Scope,
> ACPI_OPERAND_OBJECT *OriginalObject,
> ACPI_OPERAND_OBJECT **ReturnObject);
>
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index feaa9d1..0d4a333 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -166,9 +166,10 @@
> #define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */
> #define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */
> #define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */
> -#define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */
> -#define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */
> -#define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */
> +#define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized */
> +#define AOPOBJ_REG_CONNECTED 0x10 /* _REG was run */
> +#define AOPOBJ_SETUP_COMPLETE 0x20 /* Region setup is complete */
> +#define AOPOBJ_INVALID 0x40 /* Host OS won't allow a Region address */
>
>
> /******************************************************************************
> diff --git a/src/acpica/source/include/acopcode.h b/src/acpica/source/include/acopcode.h
> index 50bac80..c6b88c1 100644
> --- a/src/acpica/source/include/acopcode.h
> +++ b/src/acpica/source/include/acopcode.h
> @@ -165,7 +165,7 @@
> #define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING)
> #define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
> #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
> -#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME)
> +#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_NAME_OR_REF,ARGP_TARGET)
> #define ARGP_CONNECTFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
> #define ARGP_CONTINUE_OP ARG_NONE
> #define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME)
> @@ -225,13 +225,14 @@
> #define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING)
> #define ARGP_NOOP_OP ARG_NONE
> #define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
> +#define ARGP_OBJECT_TYPE_OP ARGP_LIST1 (ARGP_NAME_OR_REF)
> #define ARGP_ONE_OP ARG_NONE
> #define ARGP_ONES_OP ARG_NONE
> #define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST)
> #define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST)
> #define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST)
> #define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA)
> -#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME)
> +#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_NAME_OR_REF)
> #define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG)
> #define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME)
> #define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
> @@ -258,7 +259,6 @@
> #define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
> #define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
> #define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
> -#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME)
> #define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME)
> #define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST)
> #define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
> @@ -297,7 +297,7 @@
> #define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER)
> #define ARGI_BYTE_OP ARGI_INVALID_OPCODE
> #define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE
> -#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF)
> +#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_ANYTYPE, ARGI_ANYTYPE, ARGI_TARGETREF)
> #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF)
> #define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF)
> #define ARGI_CONNECTFIELD_OP ARGI_INVALID_OPCODE
> @@ -359,6 +359,7 @@
> #define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE
> #define ARGI_NOOP_OP ARG_NONE
> #define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER)
> +#define ARGI_OBJECT_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
> #define ARGI_ONE_OP ARG_NONE
> #define ARGI_ONES_OP ARG_NONE
> #define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
> @@ -392,7 +393,6 @@
> #define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
> #define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
> #define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET)
> -#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
> #define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE)
> #define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
> #define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER)
> diff --git a/src/acpica/source/include/acparser.h b/src/acpica/source/include/acparser.h
> index c525dd3..5876383 100644
> --- a/src/acpica/source/include/acparser.h
> +++ b/src/acpica/source/include/acparser.h
> @@ -178,7 +178,12 @@ AcpiPsGetNextNamepath (
> ACPI_WALK_STATE *WalkState,
> ACPI_PARSE_STATE *ParserState,
> ACPI_PARSE_OBJECT *Arg,
> - BOOLEAN MethodCall);
> + BOOLEAN PossibleMethodCall);
> +
> +/* Values for BOOLEAN above */
> +
> +#define ACPI_NOT_METHOD_CALL FALSE
> +#define ACPI_POSSIBLE_METHOD_CALL TRUE
>
> ACPI_STATUS
> AcpiPsGetNextArg (
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 1bb43ea..096c527 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -118,7 +118,7 @@
>
> /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION 0x20151124
> +#define ACPI_CA_VERSION 0x20151218
>
> #include "acconfig.h"
> #include "actypes.h"
> @@ -264,6 +264,11 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_CopyDsdtLocally, FALSE);
> ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DoNotUseXsdt, FALSE);
>
> /*
> + * Optionally allow default region handlers to be overridden.
> + */
> +ACPI_INIT_GLOBAL (UINT8, AcpiGbl_OverrideDefaultRegionHandlers, FALSE);
> +
> +/*
> * Optionally use 32-bit FADT addresses if and when there is a conflict
> * (address mismatch) between the 32-bit and 64-bit versions of the
> * address. Although ACPICA adheres to the ACPI specification which
> @@ -341,6 +346,10 @@ ACPI_INIT_GLOBAL (UINT32, AcpiDbgLevel, ACPI_NORMAL_DEFAULT);
> #endif
> ACPI_INIT_GLOBAL (UINT32, AcpiDbgLayer, ACPI_COMPONENT_DEFAULT);
>
> +/* Optionally enable timer output with Debug Object output */
> +
> +ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DisplayDebugTimer, FALSE);
> +
> /*
> * Other miscellaneous globals
> */
> diff --git a/src/acpica/source/include/amlcode.h b/src/acpica/source/include/amlcode.h
> index 6940b7a..8a0ddcc 100644
> --- a/src/acpica/source/include/amlcode.h
> +++ b/src/acpica/source/include/amlcode.h
> @@ -192,7 +192,7 @@
> #define AML_CREATE_WORD_FIELD_OP (UINT16) 0x8b
> #define AML_CREATE_BYTE_FIELD_OP (UINT16) 0x8c
> #define AML_CREATE_BIT_FIELD_OP (UINT16) 0x8d
> -#define AML_TYPE_OP (UINT16) 0x8e
> +#define AML_OBJECT_TYPE_OP (UINT16) 0x8e
> #define AML_CREATE_QWORD_FIELD_OP (UINT16) 0x8f /* ACPI 2.0 */
> #define AML_LAND_OP (UINT16) 0x90
> #define AML_LOR_OP (UINT16) 0x91
> @@ -313,7 +313,8 @@
> #define ARGP_TERMLIST 0x0F
> #define ARGP_WORDDATA 0x10
> #define ARGP_QWORDDATA 0x11
> -#define ARGP_SIMPLENAME 0x12
> +#define ARGP_SIMPLENAME 0x12 /* NameString | LocalTerm | ArgTerm */
> +#define ARGP_NAME_OR_REF 0x13 /* For ObjectType only */
>
> /*
> * Resolved argument types for the AML Interpreter
> diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
> index 1aac52b..5ac8d6c 100644
> --- a/src/acpica/source/tools/acpiexec/aecommon.h
> +++ b/src/acpica/source/tools/acpiexec/aecommon.h
> @@ -185,6 +185,10 @@ ACPI_STATUS
> AeInstallTables (
> void);
>
> +ACPI_STATUS
> +AeLoadTables (
> + void);
> +
> void
> AeDumpNamespace (
> void);
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index 9a3f913..f56cc2b 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -765,7 +765,39 @@ AeInstallLateHandlers (
> void)
> {
> ACPI_STATUS Status;
> + ACPI_HANDLE Handle;
> +
> +
> + Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
> + if (ACPI_SUCCESS (Status))
> + {
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> + Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1);
> + Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler2);
>
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> + }
> +
> + Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
> + if (ACPI_SUCCESS (Status))
> + {
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> + AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> + Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> + AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> + }
>
> #if (!ACPI_REDUCED_HARDWARE)
> if (!AcpiGbl_ReducedHardware)
> @@ -951,37 +983,6 @@ AeInstallEarlyHandlers (
> printf ("No _SB_ found, %s\n", AcpiFormatException (Status));
> }
>
> - Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
> - if (ACPI_SUCCESS (Status))
> - {
> - Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> -
> - Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> -
> - Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler1);
> - Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler2);
> -
> - Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> -
> - Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> - }
> -
> - Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
> - if (ACPI_SUCCESS (Status))
> - {
> - Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> - AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> -
> - Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> - AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> - }
> -
> /*
> * Install handlers that will override the default handlers for some of
> * the space IDs.
> diff --git a/src/acpica/source/tools/acpiexec/aeregion.c b/src/acpica/source/tools/acpiexec/aeregion.c
> index 46ddcb8..718e68e 100644
> --- a/src/acpica/source/tools/acpiexec/aeregion.c
> +++ b/src/acpica/source/tools/acpiexec/aeregion.c
> @@ -221,59 +221,87 @@ AeRegionInit (
> }
>
>
> +/******************************************************************************
> + *
> + * FUNCTION: AeOverrideRegionHandlers
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Override the default region handlers for memory, i/o, and
> + * pci_config. Also install a handler for EC. This is part of
> + * the "install early handlers" functionality.
> + *
> + *****************************************************************************/
> +
> void
> -AeInstallRegionHandlers (
> +AeOverrideRegionHandlers (
> void)
> {
> UINT32 i;
> ACPI_STATUS Status;
>
> /*
> - * Install handlers for some of the "device driver" address spaces
> - * such as SMBus, etc.
> + * Install handlers that will override the default handlers for some of
> + * the space IDs.
> */
> - for (i = 0; i < ACPI_ARRAY_LENGTH (SpaceIdList); i++)
> + for (i = 0; i < ACPI_ARRAY_LENGTH (DefaultSpaceIdList); i++)
> {
> /* Install handler at the root object */
>
> Status = AcpiInstallAddressSpaceHandler (ACPI_ROOT_OBJECT,
> - SpaceIdList[i], AeRegionHandler,
> + DefaultSpaceIdList[i], AeRegionHandler,
> AeRegionInit, &AeMyContext);
> +
> if (ACPI_FAILURE (Status))
> {
> ACPI_EXCEPTION ((AE_INFO, Status,
> "Could not install an OpRegion handler for %s space(%u)",
> - AcpiUtGetRegionName((UINT8) SpaceIdList[i]), SpaceIdList[i]));
> - return;
> + AcpiUtGetRegionName ((UINT8) DefaultSpaceIdList[i]),
> + DefaultSpaceIdList[i]));
> }
> }
> }
>
>
> +/******************************************************************************
> + *
> + * FUNCTION: AeInstallRegionHandlers
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Install handlers for the address spaces other than memory,
> + * i/o, and pci_config.
> + *
> + *****************************************************************************/
> +
> void
> -AeOverrideRegionHandlers (
> +AeInstallRegionHandlers (
> void)
> {
> UINT32 i;
> ACPI_STATUS Status;
>
> /*
> - * Install handlers that will override the default handlers for some of
> - * the space IDs.
> + * Install handlers for some of the "device driver" address spaces
> + * such as SMBus, etc.
> */
> - for (i = 0; i < ACPI_ARRAY_LENGTH (DefaultSpaceIdList); i++)
> + for (i = 0; i < ACPI_ARRAY_LENGTH (SpaceIdList); i++)
> {
> /* Install handler at the root object */
>
> Status = AcpiInstallAddressSpaceHandler (ACPI_ROOT_OBJECT,
> - DefaultSpaceIdList[i], AeRegionHandler,
> + SpaceIdList[i], AeRegionHandler,
> AeRegionInit, &AeMyContext);
> +
> if (ACPI_FAILURE (Status))
> {
> ACPI_EXCEPTION ((AE_INFO, Status,
> - "Could not install a default OpRegion handler for %s space(%u)",
> - AcpiUtGetRegionName ((UINT8) DefaultSpaceIdList[i]),
> - DefaultSpaceIdList[i]));
> + "Could not install an OpRegion handler for %s space(%u)",
> + AcpiUtGetRegionName((UINT8) SpaceIdList[i]), SpaceIdList[i]));
> return;
> }
> }
> diff --git a/src/utilities/kernelscan.c b/src/utilities/kernelscan.c
> index 8674e40..33cf2d3 100644
> --- a/src/utilities/kernelscan.c
> +++ b/src/utilities/kernelscan.c
> @@ -29,6 +29,9 @@
>
> #include "config.h"
>
> +#undef DATAROOTDIR
> +#define DATAROOTDIR "/usr/share/"
> +
> #define PARSER_OK 0
> #define PARSER_COMMENT_FOUND 1
>
Acked-by: Ivan Hu <ivan.hu at canonical.com>
More information about the fwts-devel
mailing list