ACK: [PATCH 1/2] ACPICA: update to version 20130927.
IvanHu
ivan.hu at canonical.com
Wed Oct 23 09:11:26 UTC 2013
On 10/03/2013 06:36 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Full list of changes in ACPICA can be found here:
> https://lists.acpica.org/pipermail/devel/2013-September/000561.html
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpica/Makefile.am | 1 +
> src/acpica/fwts_acpica.c | 22 +-
> src/acpica/source/common/acgetline.c | 512 +++++++++++++++++++++
> src/acpica/source/common/adfile.c | 12 +-
> src/acpica/source/common/adisasm.c | 4 +
> src/acpica/source/common/adwalk.c | 10 +-
> src/acpica/source/common/dmextern.c | 373 +++++++++++++--
> src/acpica/source/common/dmtable.c | 2 +-
> src/acpica/source/compiler/aslcompile.c | 25 +-
> src/acpica/source/compiler/aslcompiler.h | 5 -
> src/acpica/source/compiler/aslerror.c | 4 +-
> src/acpica/source/compiler/aslglobal.h | 1 +
> src/acpica/source/compiler/aslmain.c | 33 +-
> src/acpica/source/compiler/aslstartup.c | 173 +------
> src/acpica/source/compiler/dtcompile.c | 2 +-
> src/acpica/source/compiler/fwts_iasl_interface.c | 4 +-
> src/acpica/source/components/debugger/dbcmds.c | 8 +
> src/acpica/source/components/debugger/dbexec.c | 44 +-
> src/acpica/source/components/debugger/dbfileio.c | 11 +-
> src/acpica/source/components/debugger/dbhistry.c | 35 +-
> src/acpica/source/components/debugger/dbinput.c | 46 +-
> src/acpica/source/components/debugger/dbnames.c | 51 +-
> src/acpica/source/components/debugger/dbxface.c | 4 +
> src/acpica/source/components/events/evgpe.c | 3 +
> src/acpica/source/components/events/evgpeutil.c | 2 +-
> src/acpica/source/components/events/evmisc.c | 18 +-
> src/acpica/source/components/events/evregion.c | 26 +-
> src/acpica/source/components/events/evsci.c | 87 +++-
> src/acpica/source/components/events/evxface.c | 164 +++++++
> src/acpica/source/components/events/evxfevnt.c | 1 +
> src/acpica/source/components/events/evxfgpe.c | 1 +
> src/acpica/source/components/events/evxfregn.c | 1 +
> src/acpica/source/components/executer/exstore.c | 168 ++++---
> src/acpica/source/components/hardware/hwxface.c | 35 +-
> src/acpica/source/components/hardware/hwxfsleep.c | 2 +
> src/acpica/source/components/namespace/nsdump.c | 159 +++++++
> src/acpica/source/components/namespace/nsxfeval.c | 18 +-
> src/acpica/source/components/namespace/nsxfname.c | 1 +
> src/acpica/source/components/namespace/nsxfobj.c | 1 +
> src/acpica/source/components/resources/rsxface.c | 1 +
> src/acpica/source/components/tables/tbinstal.c | 9 +-
> src/acpica/source/components/tables/tbprint.c | 19 +-
> src/acpica/source/components/tables/tbxface.c | 5 +-
> src/acpica/source/components/tables/tbxfload.c | 3 +-
> src/acpica/source/components/tables/tbxfroot.c | 3 +-
> src/acpica/source/components/utilities/utalloc.c | 131 ++----
> src/acpica/source/components/utilities/utdebug.c | 3 +-
> src/acpica/source/components/utilities/utexcep.c | 1 +
> src/acpica/source/components/utilities/utglobal.c | 4 +-
> src/acpica/source/components/utilities/utstring.c | 75 +++
> src/acpica/source/components/utilities/uttrack.c | 29 +-
> src/acpica/source/components/utilities/utxface.c | 2 +-
> src/acpica/source/components/utilities/utxferror.c | 1 +
> src/acpica/source/components/utilities/utxfinit.c | 6 +-
> src/acpica/source/include/acconfig.h | 2 +
> src/acpica/source/include/acdebug.h | 12 +
> src/acpica/source/include/acdisasm.h | 3 +
> src/acpica/source/include/acevents.h | 10 +-
> src/acpica/source/include/acexcep.h | 8 +-
> src/acpica/source/include/acglobal.h | 18 +-
> src/acpica/source/include/aclocal.h | 16 +-
> src/acpica/source/include/acmacros.h | 26 --
> src/acpica/source/include/acnames.h | 25 +-
> src/acpica/source/include/acnamesp.h | 8 +
> src/acpica/source/include/acpiosxf.h | 122 ++++-
> src/acpica/source/include/acpixf.h | 54 ++-
> src/acpica/source/include/actypes.h | 51 +-
> src/acpica/source/include/acutils.h | 35 +-
> src/acpica/source/include/platform/acgcc.h | 2 +-
> src/acpica/source/include/platform/aclinux.h | 113 ++++-
> .../source/os_specific/service_layers/osunixxf.c | 131 +++++-
> src/acpica/source/tools/acpiexec/aehandlers.c | 84 +++-
> 72 files changed, 2457 insertions(+), 624 deletions(-)
> create mode 100644 src/acpica/source/common/acgetline.c
>
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 30f0faa..d4fc5dd 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -240,6 +240,7 @@ libfwtsacpica_la_SOURCES = \
> $(ACPICA_COMP)/utilities/utxfinit.c \
> $(ACPICA_COMP)/utilities/uterror.c \
> $(ACPICA_COMP)/utilities/utbuffer.c \
> + $(ACPICA_COMMON)/acgetline.c \
> $(ACPICA_SRC)/tools/acpiexec/aehandlers.c
>
> libfwtsacpica_la_LIBADD = \
> diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
> index ec85115..e86d251 100644
> --- a/src/acpica/fwts_acpica.c
> +++ b/src/acpica/fwts_acpica.c
> @@ -922,11 +922,6 @@ int fwts_acpica_init(fwts_framework *fw)
>
> AcpiOsRedirectOutput(stderr);
>
> - if (ACPI_FAILURE(AcpiInitializeSubsystem())) {
> - fwts_log_error(fw, "Failed to initialise ACPICA subsystem.");
> - return FWTS_ERROR;
> - }
> -
> /* Clone FADT, make sure it points to a DSDT in user space */
> if (fwts_acpi_find_table(fw, "FACP", 0, &table) != FWTS_OK)
> return FWTS_ERROR;
> @@ -1061,27 +1056,34 @@ int fwts_acpica_init(fwts_framework *fw)
> fwts_acpica_RSDP = NULL;
> }
>
> + if (ACPI_FAILURE(AcpiInitializeSubsystem())) {
> + fwts_log_error(fw, "Failed to initialise ACPICA subsystem.");
> + goto failed;
> + }
> +
> if (AcpiInitializeTables(Tables, ACPI_MAX_INIT_TABLES, TRUE) != AE_OK) {
> fwts_log_error(fw, "Failed to initialise tables.");
> - return FWTS_ERROR;
> + goto failed;
> }
> if (AcpiReallocateRootTable() != AE_OK) {
> fwts_log_error(fw, "Failed to reallocate root table.");
> - return FWTS_ERROR;
> + goto failed;
> }
> if (AcpiLoadTables() != AE_OK) {
> fwts_log_error(fw, "Failed to load tables.");
> - return FWTS_ERROR;
> + goto failed;
> }
>
> -
> (void)fwtsInstallEarlyHandlers(fw);
> AcpiEnableSubsystem(init_flags);
> AcpiInitializeObjects(init_flags);
>
> fwts_acpica_init_called = true;
> -
> return FWTS_OK;
> +
> +failed:
> + AcpiTerminate();
> + return FWTS_ERROR;
> }
>
> #define FWTS_ACPICA_FREE(x) \
> diff --git a/src/acpica/source/common/acgetline.c b/src/acpica/source/common/acgetline.c
> new file mode 100644
> index 0000000..ae68ed7
> --- /dev/null
> +++ b/src/acpica/source/common/acgetline.c
> @@ -0,0 +1,512 @@
> +/******************************************************************************
> + *
> + * Module Name: acgetline - local line editing
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2013, 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.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "amlcode.h"
> +#include "acparser.h"
> +#include "acdebug.h"
> +
> +#include <stdio.h>
> +
> +/*
> + * This is an os-independent implementation of line-editing services needed
> + * by the AcpiExec utility. It uses getchar() and putchar() and the existing
> + * history support provided by the AML debugger. It assumes that the terminal
> + * is in the correct line-editing mode such as raw and noecho. The OSL
> + * interface AcpiOsInitialize should do this. AcpiOsTerminate should put the
> + * terminal back into the original mode.
> + */
> +#define _COMPONENT ACPI_OS_SERVICES
> + ACPI_MODULE_NAME ("acgetline")
> +
> +
> +/* Local prototypes */
> +
> +static void
> +AcpiAcClearLine (
> + UINT32 EndOfLine,
> + UINT32 CursorPosition);
> +
> +/* Various ASCII constants */
> +
> +#define _ASCII_NUL 0
> +#define _ASCII_BACKSPACE 0x08
> +#define _ASCII_TAB 0x09
> +#define _ASCII_ESCAPE 0x1B
> +#define _ASCII_SPACE 0x20
> +#define _ASCII_LEFT_BRACKET 0x5B
> +#define _ASCII_DEL 0x7F
> +#define _ASCII_UP_ARROW 'A'
> +#define _ASCII_DOWN_ARROW 'B'
> +#define _ASCII_RIGHT_ARROW 'C'
> +#define _ASCII_LEFT_ARROW 'D'
> +#define _ASCII_NEWLINE '\n'
> +
> +extern UINT32 AcpiGbl_NextCmdNum;
> +
> +/* Erase a single character on the input command line */
> +
> +#define ACPI_CLEAR_CHAR() \
> + putchar (_ASCII_BACKSPACE); \
> + putchar (_ASCII_SPACE); \
> + putchar (_ASCII_BACKSPACE);
> +
> +/* Backup cursor by Count positions */
> +
> +#define ACPI_BACKUP_CURSOR(i, Count) \
> + for (i = 0; i < (Count); i++) \
> + {putchar (_ASCII_BACKSPACE);}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: AcpiAcClearLine
> + *
> + * PARAMETERS: EndOfLine - Current end-of-line index
> + * CursorPosition - Current cursor position within line
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Clear the entire command line the hard way, but probably the
> + * most portable.
> + *
> + *****************************************************************************/
> +
> +static void
> +AcpiAcClearLine (
> + UINT32 EndOfLine,
> + UINT32 CursorPosition)
> +{
> + UINT32 i;
> +
> +
> + if (CursorPosition < EndOfLine)
> + {
> + /* Clear line from current position to end of line */
> +
> + for (i = 0; i < (EndOfLine - CursorPosition); i++)
> + {
> + putchar (' ');
> + }
> + }
> +
> + /* Clear the entire line */
> +
> + for (; EndOfLine > 0; EndOfLine--)
> + {
> + ACPI_CLEAR_CHAR ();
> + }
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: AcpiOsGetLine
> + *
> + * PARAMETERS: Buffer - Where to return the command line
> + * BufferLength - Maximum length of Buffer
> + * BytesRead - Where the actual byte count is returned
> + *
> + * RETURN: Status and actual bytes read
> + *
> + * DESCRIPTION: Get the next input line from the terminal. NOTE: terminal
> + * is expected to be in a mode that supports line-editing (raw,
> + * noecho). This function is intended to be very portable. Also,
> + * it uses the history support implemented in the AML debugger.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +AcpiOsGetLine (
> + char *Buffer,
> + UINT32 BufferLength,
> + UINT32 *BytesRead)
> +{
> + char *NextCommand;
> + UINT32 MaxCommandIndex = AcpiGbl_NextCmdNum - 1;
> + UINT32 CurrentCommandIndex = MaxCommandIndex;
> + UINT32 PreviousCommandIndex = MaxCommandIndex;
> + int InputChar;
> + UINT32 CursorPosition = 0;
> + UINT32 EndOfLine = 0;
> + UINT32 i;
> +
> +
> + /* Always clear the line buffer before we read a new line */
> +
> + memset (Buffer, 0, BufferLength);
> +
> + /*
> + * This loop gets one character at a time (except for esc sequences)
> + * until a newline or error is detected.
> + *
> + * Note: Don't attempt to write terminal control ESC sequences, even
> + * though it makes certain things more difficult.
> + */
> + while (1)
> + {
> + if (EndOfLine >= (BufferLength - 1))
> + {
> + return (AE_BUFFER_OVERFLOW);
> + }
> +
> + InputChar = getchar ();
> + switch (InputChar)
> + {
> + default: /* This is the normal character case */
> +
> + /* Echo the character (at EOL) and copy it to the line buffer */
> +
> + if (EndOfLine == CursorPosition)
> + {
> + putchar (InputChar);
> + Buffer[EndOfLine] = (char) InputChar;
> +
> + EndOfLine++;
> + CursorPosition++;
> + Buffer[EndOfLine] = 0;
> + continue;
> + }
> +
> + /* Insert character into the middle of the buffer */
> +
> + memmove (&Buffer[CursorPosition + 1], &Buffer[CursorPosition],
> + (EndOfLine - CursorPosition + 1));
> +
> + Buffer [CursorPosition] = (char) InputChar;
> + Buffer [EndOfLine + 1] = 0;
> +
> + /* Display the new part of line starting at the new character */
> +
> + fprintf (stdout, "%s", &Buffer[CursorPosition]);
> +
> + /* Restore cursor */
> +
> + ACPI_BACKUP_CURSOR (i, EndOfLine - CursorPosition);
> + CursorPosition++;
> + EndOfLine++;
> + continue;
> +
> + case _ASCII_DEL: /* Backspace key */
> +
> + if (!EndOfLine) /* Any characters on the command line? */
> + {
> + continue;
> + }
> +
> + if (EndOfLine == CursorPosition) /* Erase the final character */
> + {
> + ACPI_CLEAR_CHAR ();
> + EndOfLine--;
> + CursorPosition--;
> + continue;
> + }
> +
> + if (!CursorPosition) /* Do not backup beyond start of line */
> + {
> + continue;
> + }
> +
> + /* Remove the character from the line */
> +
> + memmove (&Buffer[CursorPosition - 1], &Buffer[CursorPosition],
> + (EndOfLine - CursorPosition + 1));
> +
> + /* Display the new part of line starting at the new character */
> +
> + putchar (_ASCII_BACKSPACE);
> + fprintf (stdout, "%s ", &Buffer[CursorPosition - 1]);
> +
> + /* Restore cursor */
> +
> + ACPI_BACKUP_CURSOR (i, EndOfLine - CursorPosition + 1);
> + EndOfLine--;
> + if (CursorPosition > 0)
> + {
> + CursorPosition--;
> + }
> + continue;
> +
> + case _ASCII_NEWLINE: /* Normal exit case at end of command line */
> + case _ASCII_NUL:
> +
> + /* Return the number of bytes in the command line string */
> +
> + if (BytesRead)
> + {
> + *BytesRead = EndOfLine;
> + }
> +
> + /* Echo, terminate string buffer, and exit */
> +
> + putchar (InputChar);
> + Buffer[EndOfLine] = 0;
> + return (AE_OK);
> +
> + case _ASCII_TAB:
> +
> + /* Ignore */
> +
> + continue;
> +
> + case EOF:
> +
> + return (AE_ERROR);
> +
> + case _ASCII_ESCAPE:
> +
> + /* Check for escape sequences of the form "ESC[x" */
> +
> + InputChar = getchar ();
> + if (InputChar != _ASCII_LEFT_BRACKET)
> + {
> + continue; /* Ignore this ESC, does not have the '[' */
> + }
> +
> + /* Get the code following the ESC [ */
> +
> + InputChar = getchar (); /* Backup one character */
> + switch (InputChar)
> + {
> + case _ASCII_LEFT_ARROW:
> +
> + if (CursorPosition > 0)
> + {
> + putchar (_ASCII_BACKSPACE);
> + CursorPosition--;
> + }
> + continue;
> +
> + case _ASCII_RIGHT_ARROW:
> + /*
> + * Move one character forward. Do this without sending
> + * ESC sequence to the terminal for max portability.
> + */
> + if (CursorPosition < EndOfLine)
> + {
> + /* Backup to start of line and print the entire line */
> +
> + ACPI_BACKUP_CURSOR (i, CursorPosition);
> + fprintf (stdout, "%s", Buffer);
> +
> + /* Backup to where the cursor should be */
> +
> + CursorPosition++;
> + ACPI_BACKUP_CURSOR (i, EndOfLine - CursorPosition);
> + }
> + continue;
> +
> + case _ASCII_UP_ARROW:
> +
> + /* If no commands available or at start of history list, ignore */
> +
> + if (!CurrentCommandIndex)
> + {
> + continue;
> + }
> +
> + /* Manage our up/down progress */
> +
> + if (CurrentCommandIndex > PreviousCommandIndex)
> + {
> + CurrentCommandIndex = PreviousCommandIndex;
> + }
> +
> + /* Get the historical command from the debugger */
> +
> + NextCommand = AcpiDbGetHistoryByIndex (CurrentCommandIndex);
> + if (!NextCommand)
> + {
> + return (AE_ERROR);
> + }
> +
> + /* Make this the active command and echo it */
> +
> + AcpiAcClearLine (EndOfLine, CursorPosition);
> + strcpy (Buffer, NextCommand);
> + fprintf (stdout, "%s", Buffer);
> + EndOfLine = CursorPosition = strlen (Buffer);
> +
> + PreviousCommandIndex = CurrentCommandIndex;
> + CurrentCommandIndex--;
> + continue;
> +
> + case _ASCII_DOWN_ARROW:
> +
> + if (!MaxCommandIndex) /* Any commands available? */
> + {
> + continue;
> + }
> +
> + /* Manage our up/down progress */
> +
> + if (CurrentCommandIndex < PreviousCommandIndex)
> + {
> + CurrentCommandIndex = PreviousCommandIndex;
> + }
> +
> + /* If we are the end of the history list, output a clear new line */
> +
> + if ((CurrentCommandIndex + 1) > MaxCommandIndex)
> + {
> + AcpiAcClearLine (EndOfLine, CursorPosition);
> + EndOfLine = CursorPosition = 0;
> + PreviousCommandIndex = CurrentCommandIndex;
> + continue;
> + }
> +
> + PreviousCommandIndex = CurrentCommandIndex;
> + CurrentCommandIndex++;
> +
> + /* Get the historical command from the debugger */
> +
> + NextCommand = AcpiDbGetHistoryByIndex (CurrentCommandIndex);
> + if (!NextCommand)
> + {
> + return (AE_ERROR);
> + }
> +
> + /* Make this the active command and echo it */
> +
> + AcpiAcClearLine (EndOfLine, CursorPosition);
> + strcpy (Buffer, NextCommand);
> + fprintf (stdout, "%s", Buffer);
> + EndOfLine = CursorPosition = strlen (Buffer);
> + continue;
> +
> + case 0x31:
> + case 0x32:
> + case 0x33:
> + case 0x34:
> + case 0x35:
> + case 0x36:
> + /*
> + * Ignore the various keys like insert/delete/home/end, etc.
> + * But we must eat the final character of the ESC sequence.
> + */
> + InputChar = getchar ();
> + continue;
> +
> + default:
> +
> + /* Ignore random escape sequences that we don't care about */
> +
> + continue;
> + }
> + continue;
> + }
> + }
> +}
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index 1af4cc2..57cb580 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -360,7 +360,6 @@ FlSplitInputPathname (
>
>
> *OutDirectoryPath = NULL;
> - *OutFilename = NULL;
>
> if (!InputPath)
> {
> @@ -402,10 +401,19 @@ FlSplitInputPathname (
>
> if (!Filename)
> {
> + ACPI_FREE(DirectoryPath);
> return (AE_NO_MEMORY);
> }
>
> *OutDirectoryPath = DirectoryPath;
> - *OutFilename = Filename;
> +
> + if (OutFilename)
> + {
> + *OutFilename = Filename;
> + }
> + else
> + {
> + ACPI_FREE(Filename);
> + }
> return (AE_OK);
> }
> diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
> index ea59365..f14ae17 100644
> --- a/src/acpica/source/common/adisasm.c
> +++ b/src/acpica/source/common/adisasm.c
> @@ -413,6 +413,10 @@ AdAmlDisassemble (
> {
> AcpiDmClearExternalList ();
> }
> +
> + /* Load any externals defined in the optional external ref file */
> +
> + AcpiDmGetExternalsFromFile ();
> }
> else
> {
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index ecb3860..76ef5df 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -445,10 +445,18 @@ AcpiDmDumpDescending (
> switch (Op->Common.AmlOpcode)
> {
> case AML_BYTE_OP:
> +
> + AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
> + break;
> +
> case AML_WORD_OP:
> +
> + AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
> + break;
> +
> case AML_DWORD_OP:
>
> - AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer);
> + AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
> break;
>
> case AML_QWORD_OP:
> diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
> index 87aeddc..5b3a8b1 100644
> --- a/src/acpica/source/common/dmextern.c
> +++ b/src/acpica/source/common/dmextern.c
> @@ -118,7 +118,9 @@
> #include "amlcode.h"
> #include "acnamesp.h"
> #include "acdisasm.h"
> +#include "aslcompiler.h"
> #include <stdio.h>
> +#include <errno.h>
>
>
> /*
> @@ -159,6 +161,8 @@ static const char *AcpiGbl_DmTypeNames[] =
> /* 19 */ ", FieldUnitObj"
> };
>
> +#define METHOD_SEPARATORS " \t,()\n"
> +
>
> /* Local prototypes */
>
> @@ -171,6 +175,12 @@ AcpiDmNormalizeParentPrefix (
> ACPI_PARSE_OBJECT *Op,
> char *Path);
>
> +static void
> +AcpiDmAddToExternalListFromFile (
> + char *Path,
> + UINT8 Type,
> + UINT32 Value);
> +
>
> /*******************************************************************************
> *
> @@ -341,48 +351,41 @@ Cleanup:
>
> ACPI_STATUS
> AcpiDmAddToExternalFileList (
> - char *PathList)
> + char *Pathname)
> {
> ACPI_EXTERNAL_FILE *ExternalFile;
> - char *Path;
> - char *TmpPath;
> + char *LocalPathname;
>
>
> - if (!PathList)
> + if (!Pathname)
> {
> return (AE_OK);
> }
>
> - Path = strtok (PathList, ",");
> -
> - while (Path)
> + LocalPathname = ACPI_ALLOCATE (strlen (Pathname) + 1);
> + if (!LocalPathname)
> {
> - TmpPath = ACPI_ALLOCATE_ZEROED (ACPI_STRLEN (Path) + 1);
> - if (!TmpPath)
> - {
> - return (AE_NO_MEMORY);
> - }
> -
> - ACPI_STRCPY (TmpPath, Path);
> + return (AE_NO_MEMORY);
> + }
>
> - ExternalFile = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_FILE));
> - if (!ExternalFile)
> - {
> - ACPI_FREE (TmpPath);
> - return (AE_NO_MEMORY);
> - }
> + ExternalFile = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_FILE));
> + if (!ExternalFile)
> + {
> + ACPI_FREE (LocalPathname);
> + return (AE_NO_MEMORY);
> + }
>
> - ExternalFile->Path = TmpPath;
> + /* Take a copy of the file pathname */
>
> - if (AcpiGbl_ExternalFileList)
> - {
> - ExternalFile->Next = AcpiGbl_ExternalFileList;
> - }
> + strcpy (LocalPathname, Pathname);
> + ExternalFile->Path = LocalPathname;
>
> - AcpiGbl_ExternalFileList = ExternalFile;
> - Path = strtok (NULL, ",");
> + if (AcpiGbl_ExternalFileList)
> + {
> + ExternalFile->Next = AcpiGbl_ExternalFileList;
> }
>
> + AcpiGbl_ExternalFileList = ExternalFile;
> return (AE_OK);
> }
>
> @@ -516,7 +519,7 @@ AcpiDmAddToExternalList (
> (NextExternal->Value != Value))
> {
> ACPI_ERROR ((AE_INFO,
> - "Argument count mismatch for method %s %u %u",
> + "External method arg count mismatch %s: Current %u, attempted %u",
> NextExternal->Path, NextExternal->Value, Value));
> }
>
> @@ -608,6 +611,275 @@ AcpiDmAddToExternalList (
>
> /*******************************************************************************
> *
> + * FUNCTION: AcpiDmGetExternalsFromFile
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Process the optional external reference file.
> + *
> + * Each line in the file should be of the form:
> + * External (<Method namepath>, MethodObj, <ArgCount>)
> + *
> + * Example:
> + * External (_SB_.PCI0.XHC_.PS0X, MethodObj, 4)
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmGetExternalsFromFile (
> + void)
> +{
> + FILE *ExternalRefFile;
> + char *Token;
> + char *MethodName;
> + UINT32 ArgCount;
> + UINT32 ImportCount = 0;
> +
> +
> + if (!Gbl_ExternalRefFilename)
> + {
> + return;
> + }
> +
> + /* Open the file */
> +
> + ExternalRefFile = fopen (Gbl_ExternalRefFilename, "r");
> + if (!ExternalRefFile)
> + {
> + fprintf (stderr, "Could not open external reference file \"%s\"\n",
> + Gbl_ExternalRefFilename);
> + return;
> + }
> +
> + /* Each line defines a method */
> +
> + while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ExternalRefFile))
> + {
> + Token = strtok (StringBuffer, METHOD_SEPARATORS); /* "External" */
> + if (!Token) continue;
> + if (strcmp (Token, "External")) continue;
> +
> + MethodName = strtok (NULL, METHOD_SEPARATORS); /* Method namepath */
> + if (!MethodName) continue;
> +
> + Token = strtok (NULL, METHOD_SEPARATORS); /* "MethodObj" */
> + if (!Token) continue;
> + if (strcmp (Token, "MethodObj")) continue;
> +
> + Token = strtok (NULL, METHOD_SEPARATORS); /* Arg count */
> + if (!Token) continue;
> +
> + /* Convert arg count string to an integer */
> +
> + errno = 0;
> + ArgCount = strtoul (Token, NULL, 0);
> + if (errno)
> + {
> + fprintf (stderr, "Invalid argument count (%s)\n", Token);
> + continue;
> + }
> + if (ArgCount > 7)
> + {
> + fprintf (stderr, "Invalid argument count (%u)\n", ArgCount);
> + continue;
> + }
> +
> + /* Add this external to the global list */
> +
> + AcpiOsPrintf ("%s: Importing method external (%u arguments) %s\n",
> + Gbl_ExternalRefFilename, ArgCount, MethodName);
> +
> + AcpiDmAddToExternalListFromFile (MethodName, ACPI_TYPE_METHOD, ArgCount | 0x80);
> + ImportCount++;
> + }
> +
> + if (!ImportCount)
> + {
> + fprintf (stderr, "Did not find any external methods in reference file \"%s\"\n",
> + Gbl_ExternalRefFilename);
> + }
> + else
> + {
> + /* Add the external(s) to the namespace */
> +
> + AcpiDmAddExternalsToNamespace ();
> +
> + AcpiOsPrintf ("%s: Imported %u external method definitions\n",
> + Gbl_ExternalRefFilename, ImportCount);
> + }
> +
> + fclose (ExternalRefFile);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmAddToExternalListFromFile
> + *
> + * PARAMETERS: Path - Internal (AML) path to the object
> + * Type - ACPI object type to be added
> + * Value - Arg count if adding a Method object
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Insert a new name into the global list of Externals which
> + * will in turn be later emitted as an External() declaration
> + * in the disassembled output.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmAddToExternalListFromFile (
> + char *Path,
> + UINT8 Type,
> + UINT32 Value)
> +{
> + char *InternalPath;
> + char *ExternalPath;
> + ACPI_EXTERNAL_LIST *NewExternal;
> + ACPI_EXTERNAL_LIST *NextExternal;
> + ACPI_EXTERNAL_LIST *PrevExternal = NULL;
> + ACPI_STATUS Status;
> + BOOLEAN Resolved = FALSE;
> +
> +
> + if (!Path)
> + {
> + return;
> + }
> +
> + /* TBD: Add a flags parameter */
> +
> + if (Type == ACPI_TYPE_METHOD)
> + {
> + if (Value & 0x80)
> + {
> + Resolved = TRUE;
> + }
> + Value &= 0x07;
> + }
> +
> + /*
> + * We don't want External() statements to contain a leading '\'.
> + * This prevents duplicate external statements of the form:
> + *
> + * External (\ABCD)
> + * External (ABCD)
> + *
> + * This would cause a compile time error when the disassembled
> + * output file is recompiled.
> + */
> + if ((*Path == AML_ROOT_PREFIX) && (Path[1]))
> + {
> + Path++;
> + }
> +
> + /* Check all existing externals to ensure no duplicates */
> +
> + NextExternal = AcpiGbl_ExternalList;
> + while (NextExternal)
> + {
> + if (!ACPI_STRCMP (Path, NextExternal->Path))
> + {
> + /* Duplicate method, check that the Value (ArgCount) is the same */
> +
> + if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
> + (NextExternal->Value != Value))
> + {
> + ACPI_ERROR ((AE_INFO,
> + "(File) External method arg count mismatch %s: Current %u, override to %u",
> + NextExternal->Path, NextExternal->Value, Value));
> +
> + /* Override, since new value came from external reference file */
> +
> + NextExternal->Value = Value;
> + }
> +
> + /* Allow upgrade of type from ANY */
> +
> + else if (NextExternal->Type == ACPI_TYPE_ANY)
> + {
> + NextExternal->Type = Type;
> + NextExternal->Value = Value;
> + }
> +
> + return;
> + }
> +
> + NextExternal = NextExternal->Next;
> + }
> +
> + /* Get the internal pathname (AML format) */
> +
> + Status = AcpiNsInternalizeName (Path, &InternalPath);
> + if (ACPI_FAILURE (Status))
> + {
> + return;
> + }
> +
> + /* Allocate and init a new External() descriptor */
> +
> + NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST));
> + if (!NewExternal)
> + {
> + ACPI_FREE (InternalPath);
> + return;
> + }
> +
> + /* Must copy and normalize the input path */
> +
> + AcpiNsExternalizeName (ACPI_UINT32_MAX, InternalPath, NULL, &ExternalPath);
> +
> + NewExternal->Path = ExternalPath;
> + NewExternal->Type = Type;
> + NewExternal->Value = Value;
> + NewExternal->Resolved = Resolved;
> + NewExternal->Length = (UINT16) ACPI_STRLEN (Path);
> + NewExternal->InternalPath = InternalPath;
> +
> + /* Set flag to indicate External->InternalPath needs to be freed */
> +
> + NewExternal->Flags |= ACPI_IPATH_ALLOCATED | ACPI_FROM_REFERENCE_FILE;
> +
> + /* Link the new descriptor into the global list, alphabetically ordered */
> +
> + NextExternal = AcpiGbl_ExternalList;
> + while (NextExternal)
> + {
> + if (AcpiUtStricmp (NewExternal->Path, NextExternal->Path) < 0)
> + {
> + if (PrevExternal)
> + {
> + PrevExternal->Next = NewExternal;
> + }
> + else
> + {
> + AcpiGbl_ExternalList = NewExternal;
> + }
> +
> + NewExternal->Next = NextExternal;
> + return;
> + }
> +
> + PrevExternal = NextExternal;
> + NextExternal = NextExternal->Next;
> + }
> +
> + if (PrevExternal)
> + {
> + PrevExternal->Next = NewExternal;
> + }
> + else
> + {
> + AcpiGbl_ExternalList = NewExternal;
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiDmAddExternalsToNamespace
> *
> * PARAMETERS: None
> @@ -635,7 +907,7 @@ AcpiDmAddExternalsToNamespace (
>
> Status = AcpiNsLookup (NULL, External->InternalPath, External->Type,
> ACPI_IMODE_LOAD_PASS1,
> - ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
> + ACPI_NS_ERROR_IF_FOUND | ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
> NULL, &Node);
>
> if (ACPI_FAILURE (Status))
> @@ -803,7 +1075,8 @@ AcpiDmEmitExternals (
> NextExternal->Path,
> AcpiDmGetObjectTypeName (NextExternal->Type));
>
> - AcpiOsPrintf (") // Warning: Unresolved Method, "
> + AcpiOsPrintf (
> + ") // Warning: Unresolved Method, "
> "guessing %u arguments (may be incorrect, see warning above)\n",
> NextExternal->Value);
>
> @@ -815,9 +1088,45 @@ AcpiDmEmitExternals (
>
> AcpiOsPrintf ("\n");
>
> +
> + /* Emit externals that were imported from a file */
> +
> + if (Gbl_ExternalRefFilename)
> + {
> + AcpiOsPrintf (
> + " /*\n * External declarations that were imported from\n"
> + " * the reference file [%s]\n */\n",
> + Gbl_ExternalRefFilename);
> +
> + NextExternal = AcpiGbl_ExternalList;
> + while (NextExternal)
> + {
> + if (!NextExternal->Emitted && (NextExternal->Flags & ACPI_FROM_REFERENCE_FILE))
> + {
> + AcpiOsPrintf (" External (%s%s",
> + NextExternal->Path,
> + AcpiDmGetObjectTypeName (NextExternal->Type));
> +
> + if (NextExternal->Type == ACPI_TYPE_METHOD)
> + {
> + AcpiOsPrintf (") // %u Arguments\n",
> + NextExternal->Value);
> + }
> + else
> + {
> + AcpiOsPrintf (")\n");
> + }
> + NextExternal->Emitted = TRUE;
> + }
> +
> + NextExternal = NextExternal->Next;
> + }
> +
> + AcpiOsPrintf ("\n");
> + }
> +
> /*
> - * Walk the list of externals (unresolved references)
> - * found during the AML parsing
> + * Walk the list of externals found during the AML parsing
> */
> while (AcpiGbl_ExternalList)
> {
> diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
> index b1f2e77..fa7b300 100644
> --- a/src/acpica/source/common/dmtable.c
> +++ b/src/acpica/source/common/dmtable.c
> @@ -518,7 +518,7 @@ AcpiDmDumpDataTable (
> Length = Table->Length;
> AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
> }
> - else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
> + else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
> {
> Length = AcpiDmDumpRsdp (Table);
> }
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 3d5a1a5..b0c1ab6 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -665,10 +665,15 @@ CmDoCompile (
> AslCompilerparse();
> UtEndEvent (Event);
>
> - /* Flush out any remaining source after parse tree is complete */
> + /* Check for parse errors */
>
> - Event = UtBeginEvent ("Flush source input");
> - CmFlushSourceCode ();
> + Status = AslCheckForErrorExit ();
> + if (ACPI_FAILURE (Status))
> + {
> + fprintf (stderr, "Compiler aborting due to parser-detected syntax error(s)\n");
> + LsDumpParseTree ();
> + goto ErrorExit;
> + }
>
> /* Did the parse tree get successfully constructed? */
>
> @@ -678,16 +683,18 @@ CmDoCompile (
> * If there are no errors, then we have some sort of
> * internal problem.
> */
> - Status = AslCheckForErrorExit ();
> - if (Status == AE_OK)
> - {
> - AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
> - NULL, "- Could not resolve parse tree root node");
> - }
> + AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
> + NULL, "- Could not resolve parse tree root node");
>
> goto ErrorExit;
> }
>
> +
> + /* Flush out any remaining source after parse tree is complete */
> +
> + Event = UtBeginEvent ("Flush source input");
> + CmFlushSourceCode ();
> +
> /* Optional parse tree dump, compiler debug output only */
>
> LsDumpParseTree ();
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 19539a5..b90d20c 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -195,11 +195,6 @@ ACPI_STATUS (*ASL_PATHNAME_CALLBACK) (
> char *);
>
> ACPI_STATUS
> -AslDoOnePathname (
> - char *Pathname,
> - ASL_PATHNAME_CALLBACK Callback);
> -
> -ACPI_STATUS
> AslDoOneFile (
> char *Filename);
>
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index 8863026..6439977 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -683,7 +683,6 @@ AslCommonError (
> char *Filename,
> char *ExtraMessage)
> {
> - UINT32 MessageSize;
> char *MessageBuffer = NULL;
> ASL_ERROR_MSG *Enode;
>
> @@ -694,8 +693,7 @@ AslCommonError (
> {
> /* Allocate a buffer for the message and a new error node */
>
> - MessageSize = strlen (ExtraMessage) + 1;
> - MessageBuffer = UtLocalCalloc (MessageSize);
> + MessageBuffer = UtLocalCalloc (strlen (ExtraMessage) + 1);
>
> /* Keep a copy of the extra message */
>
> diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
> index 5468711..7fb67c9 100644
> --- a/src/acpica/source/compiler/aslglobal.h
> +++ b/src/acpica/source/compiler/aslglobal.h
> @@ -258,6 +258,7 @@ ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_IncludeFilename, NULL)
> ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_OutputFilenamePrefix, NULL);
> 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 BOOLEAN ASL_INIT_GLOBAL (Gbl_HasIncludeFiles, FALSE);
>
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index 3a0f750..bc6b658 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -123,6 +123,17 @@
> #define _COMPONENT ACPI_COMPILER
> ACPI_MODULE_NAME ("aslmain")
>
> +/*
> + * Main routine for the iASL compiler.
> + *
> + * Portability note: The compiler depends upon the host for command-line
> + * wildcard support - it is not implemented locally. For example:
> + *
> + * Linux/Unix systems: Shell expands wildcards automatically.
> + *
> + * Windows: The setargv.obj module must be linked in to automatically
> + * expand wildcards.
> + */
>
> /* Local prototypes */
>
> @@ -203,13 +214,14 @@ Usage (
> ACPI_OPTION ("-vt", "Create verbose template files (full disassembly)");
>
> printf ("\nAML Disassembler:\n");
> - ACPI_OPTION ("-d <f1,f2>", "Disassemble or decode binary ACPI tables to file (*.dsl)");
> + ACPI_OPTION ("-d <f1 f2 ...>", "Disassemble or decode binary ACPI tables to file (*.dsl)");
> ACPI_OPTION ("", " (Optional, file type is automatically detected)");
> - ACPI_OPTION ("-da <f1,f2>", "Disassemble multiple tables from single namespace");
> + ACPI_OPTION ("-da <f1 f2 ...>", "Disassemble multiple tables from single namespace");
> ACPI_OPTION ("-db", "Do not translate Buffers to Resource Templates");
> - ACPI_OPTION ("-dc <f1,f2>", "Disassemble AML and immediately compile it");
> + ACPI_OPTION ("-dc <f1 f2 ...>", "Disassemble AML and immediately compile it");
> ACPI_OPTION ("", " (Obtain DSDT from current system if no input file)");
> - ACPI_OPTION ("-e <f1,f2>", "Include ACPI table(s) for external symbol resolution");
> + ACPI_OPTION ("-e <f1 f2 ...>", "Include ACPI table(s) for external symbol resolution");
> + ACPI_OPTION ("-fe <file>", "Specify external symbol declaration file");
> ACPI_OPTION ("-g", "Get ACPI tables and write to files (*.dat)");
> ACPI_OPTION ("-in", "Ignore NoOp opcodes");
> ACPI_OPTION ("-vt", "Dump binary table data in hex format within output file");
> @@ -392,7 +404,7 @@ main (
> {
> while (argv[Index1])
> {
> - Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList);
> + Status = AcpiDmAddToExternalFileList (argv[Index1]);
> if (ACPI_FAILURE (Status))
> {
> return (-1);
> @@ -406,7 +418,16 @@ main (
>
> while (argv[Index2])
> {
> - Status = AslDoOnePathname (argv[Index2], AslDoOneFile);
> + /*
> + * If -p not specified, we will use the input filename as the
> + * output filename prefix
> + */
> + if (Gbl_UseDefaultAmlFilename)
> + {
> + Gbl_OutputFilenamePrefix = argv[Index2];
> + }
> +
> + Status = AslDoOneFile (argv[Index2]);
> if (ACPI_FAILURE (Status))
> {
> return (-1);
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index 19b4f95..73e1b8f 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -123,18 +123,8 @@
> ACPI_MODULE_NAME ("aslstartup")
>
>
> -#define ASL_MAX_FILES 256
> -static char *FileList[ASL_MAX_FILES];
> -static BOOLEAN AslToFile = TRUE;
> -
> -
> /* Local prototypes */
>
> -static char **
> -AsDoWildcard (
> - char *DirectoryPathname,
> - char *FileSpecifier);
> -
> static UINT8
> AslDetectSourceFileType (
> ASL_FILE_INFO *Info);
> @@ -144,6 +134,11 @@ AslDoDisassembly (
> void);
>
>
> +/* Globals */
> +
> +static BOOLEAN AslToFile = TRUE;
> +
> +
> /*******************************************************************************
> *
> * FUNCTION: AslInitializeGlobals
> @@ -203,82 +198,6 @@ AslInitializeGlobals (
> }
>
>
> -/******************************************************************************
> - *
> - * FUNCTION: AsDoWildcard
> - *
> - * PARAMETERS: None
> - *
> - * RETURN: None
> - *
> - * DESCRIPTION: Process files via wildcards. This function is for the Windows
> - * case only.
> - *
> - ******************************************************************************/
> -
> -static char **
> -AsDoWildcard (
> - char *DirectoryPathname,
> - char *FileSpecifier)
> -{
> -#ifdef WIN32
> - void *DirInfo;
> - char *Filename;
> - int FileCount;
> -
> -
> - FileCount = 0;
> -
> - /* Open parent directory */
> -
> - DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
> - if (!DirInfo)
> - {
> - /* Either the directory of file does not exist */
> -
> - Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
> - FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
> - AslAbort ();
> - }
> -
> - /* Process each file that matches the wildcard specification */
> -
> - while ((Filename = AcpiOsGetNextFilename (DirInfo)))
> - {
> - /* Add the filename to the file list */
> -
> - FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
> - strcpy (FileList[FileCount], Filename);
> - FileCount++;
> -
> - if (FileCount >= ASL_MAX_FILES)
> - {
> - printf ("Max files reached\n");
> - FileList[0] = NULL;
> - return (FileList);
> - }
> - }
> -
> - /* Cleanup */
> -
> - AcpiOsCloseDirectory (DirInfo);
> - FileList[FileCount] = NULL;
> - return (FileList);
> -
> -#else
> - /*
> - * Linux/Unix cases - Wildcards are expanded by the shell automatically.
> - * Just return the filename in a null terminated list
> - */
> - FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
> - strcpy (FileList[0], FileSpecifier);
> - FileList[1] = NULL;
> -
> - return (FileList);
> -#endif
> -}
> -
> -
> /*******************************************************************************
> *
> * FUNCTION: AslDetectSourceFileType
> @@ -467,6 +386,17 @@ AslDoOneFile (
> AslInitializeGlobals ();
> PrInitializeGlobals ();
>
> + /*
> + * Extract the directory path. This path is used for possible include
> + * files and the optional AML filename embedded in the input file
> + * DefinitionBlock declaration.
> + */
> + Status = FlSplitInputPathname (Filename, &Gbl_DirectoryPath, NULL);
> + if (ACPI_FAILURE (Status))
> + {
> + return (Status);
> + }
> +
> Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
>
> /*
> @@ -615,77 +545,6 @@ AslDoOneFile (
>
> /*******************************************************************************
> *
> - * FUNCTION: AslDoOnePathname
> - *
> - * PARAMETERS: Pathname - Full pathname, possibly with wildcards
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Process one pathname, possible terminated with a wildcard
> - * specification. If a wildcard, it is expanded and the multiple
> - * files are processed.
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -AslDoOnePathname (
> - char *Pathname,
> - ASL_PATHNAME_CALLBACK PathCallback)
> -{
> - ACPI_STATUS Status = AE_OK;
> - char **WildcardList;
> - char *Filename;
> - char *FullPathname;
> -
> -
> - /* Split incoming path into a directory/filename combo */
> -
> - Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
> - if (ACPI_FAILURE (Status))
> - {
> - return (Status);
> - }
> -
> - /* Expand possible wildcard into a file list (Windows/DOS only) */
> -
> - WildcardList = AsDoWildcard (Gbl_DirectoryPath, Filename);
> - while (*WildcardList)
> - {
> - FullPathname = ACPI_ALLOCATE (
> - strlen (Gbl_DirectoryPath) + strlen (*WildcardList) + 1);
> -
> - /* Construct a full path to the file */
> -
> - strcpy (FullPathname, Gbl_DirectoryPath);
> - strcat (FullPathname, *WildcardList);
> -
> - /*
> - * If -p not specified, we will use the input filename as the
> - * output filename prefix
> - */
> - if (Gbl_UseDefaultAmlFilename)
> - {
> - Gbl_OutputFilenamePrefix = FullPathname;
> - }
> -
> - /* Save status from all compiles */
> -
> - Status |= (*PathCallback) (FullPathname);
> -
> - ACPI_FREE (FullPathname);
> - ACPI_FREE (*WildcardList);
> - *WildcardList = NULL;
> - WildcardList++;
> - }
> -
> - ACPI_FREE (Gbl_DirectoryPath);
> - ACPI_FREE (Filename);
> - return (Status);
> -}
> -
> -
> -/*******************************************************************************
> - *
> * FUNCTION: AslCheckForErrorExit
> *
> * PARAMETERS: None. Examines global exception count array
> diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
> index ae33948..099018b 100644
> --- a/src/acpica/source/compiler/dtcompile.c
> +++ b/src/acpica/source/compiler/dtcompile.c
> @@ -389,7 +389,7 @@ DtCompileDataTable (
> DtSetTableLength ();
> return (Status);
> }
> - else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_RSDP))
> + else if (ACPI_VALIDATE_RSDP_SIG (Signature))
> {
> Status = DtCompileRsdp (FieldList);
> return (Status);
> diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c
> index 206e0c8..49278ec 100644
> --- a/src/acpica/source/compiler/fwts_iasl_interface.c
> +++ b/src/acpica/source/compiler/fwts_iasl_interface.c
> @@ -70,7 +70,7 @@ int fwts_iasl_disassemble_aml(const char *aml, const char *outputfile)
>
> /* Throw away noisy errors */
> if (freopen("/dev/null", "w", stderr) != NULL)
> - (void)AslDoOnePathname((char *)aml, AslDoOneFile);
> + AslDoOneFile((char *)aml);
>
> _exit(0);
> break;
> @@ -122,7 +122,7 @@ int fwts_iasl_assemble_aml(const char *source, char **output)
> Gbl_UseDefaultAmlFilename = FALSE;
> Gbl_OutputFilenamePrefix = (char*)source;
>
> - (void)AslDoOnePathname((char*)source, AslDoOneFile);
> + (void)AslDoOneFile((char *)source);
>
> /*
> * We need to flush buffered I/O on IASL stdout
> diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
> index 54ddf1a..aa3f89b 100644
> --- a/src/acpica/source/components/debugger/dbcmds.c
> +++ b/src/acpica/source/components/debugger/dbcmds.c
> @@ -1283,6 +1283,14 @@ AcpiDbGenerateGpe (
>
> (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
> }
> +
> +void
> +AcpiDbGenerateSci (
> + void)
> +{
> + AcpiEvSciDispatch ();
> +}
> +
> #endif /* !ACPI_REDUCED_HARDWARE */
>
> #endif /* ACPI_DEBUGGER */
> diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
> index cbe752b..769eb29 100644
> --- a/src/acpica/source/components/debugger/dbexec.c
> +++ b/src/acpica/source/components/debugger/dbexec.c
> @@ -134,7 +134,7 @@ AcpiDbExecuteMethod (
> ACPI_DB_METHOD_INFO *Info,
> ACPI_BUFFER *ReturnObj);
>
> -static void
> +static ACPI_STATUS
> AcpiDbExecuteSetup (
> ACPI_DB_METHOD_INFO *Info);
>
> @@ -309,10 +309,15 @@ Cleanup:
> *
> ******************************************************************************/
>
> -static void
> +static ACPI_STATUS
> AcpiDbExecuteSetup (
> ACPI_DB_METHOD_INFO *Info)
> {
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_NAME (DbExecuteSetup);
> +
>
> /* Catenate the current scope to the supplied name */
>
> @@ -320,10 +325,21 @@ AcpiDbExecuteSetup (
> if ((Info->Name[0] != '\\') &&
> (Info->Name[0] != '/'))
> {
> - ACPI_STRCAT (Info->Pathname, AcpiGbl_DbScopeBuf);
> + if (AcpiUtSafeStrcat (Info->Pathname, sizeof (Info->Pathname),
> + AcpiGbl_DbScopeBuf))
> + {
> + Status = AE_BUFFER_OVERFLOW;
> + goto ErrorExit;
> + }
> + }
> +
> + if (AcpiUtSafeStrcat (Info->Pathname, sizeof (Info->Pathname),
> + Info->Name))
> + {
> + Status = AE_BUFFER_OVERFLOW;
> + goto ErrorExit;
> }
>
> - ACPI_STRCAT (Info->Pathname, Info->Name);
> AcpiDbPrepNamestring (Info->Pathname);
>
> AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
> @@ -341,6 +357,13 @@ AcpiDbExecuteSetup (
>
> AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
> }
> +
> + return (AE_OK);
> +
> +ErrorExit:
> +
> + ACPI_EXCEPTION ((AE_INFO, Status, "During setup for method execution"));
> + return (Status);
> }
>
>
> @@ -501,7 +524,12 @@ AcpiDbExecute (
> ReturnObj.Pointer = NULL;
> ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
>
> - AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
> + Status = AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_FREE (NameString);
> + return;
> + }
>
> /* Get the NS node, determines existence also */
>
> @@ -801,7 +829,11 @@ AcpiDbCreateExecutionThreads (
>
> AcpiDbUint32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
>
> - AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
> + Status = AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
> + if (ACPI_FAILURE (Status))
> + {
> + goto CleanupAndExit;
> + }
>
> /* Get the NS node, determines existence also */
>
> diff --git a/src/acpica/source/components/debugger/dbfileio.c b/src/acpica/source/components/debugger/dbfileio.c
> index 768668a..1f0ae72 100644
> --- a/src/acpica/source/components/debugger/dbfileio.c
> +++ b/src/acpica/source/components/debugger/dbfileio.c
> @@ -214,7 +214,8 @@ AcpiDbOpenDebugFile (
> }
>
> AcpiOsPrintf ("Debug output file %s opened\n", Name);
> - ACPI_STRCPY (AcpiGbl_DbDebugFilename, Name);
> + ACPI_STRNCPY (AcpiGbl_DbDebugFilename, Name,
> + sizeof (AcpiGbl_DbDebugFilename));
> AcpiGbl_DbOutputToFile = TRUE;
>
> #endif
> @@ -346,11 +347,9 @@ AcpiDbReadTable (
>
> fseek (fp, 0, SEEK_SET);
>
> - /* The RSDT, FACS and S3PT tables do not have standard ACPI headers */
> + /* The RSDP table does not have standard ACPI header */
>
> - if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD ") ||
> - ACPI_COMPARE_NAME (TableHeader.Signature, "FACS") ||
> - ACPI_COMPARE_NAME (TableHeader.Signature, "S3PT"))
> + if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD "))
> {
> *TableLength = FileSize;
> StandardHeader = FALSE;
> @@ -565,7 +564,7 @@ AcpiDbReadTableFromFile (
> File = fopen (Filename, "rb");
> if (!File)
> {
> - AcpiOsPrintf ("Could not open input file %s\n", Filename);
> + perror ("Could not open input file");
> return (AE_ERROR);
> }
>
> diff --git a/src/acpica/source/components/debugger/dbhistry.c b/src/acpica/source/components/debugger/dbhistry.c
> index 42dab6f..8ba3c7f 100644
> --- a/src/acpica/source/components/debugger/dbhistry.c
> +++ b/src/acpica/source/components/debugger/dbhistry.c
> @@ -141,7 +141,7 @@ static HISTORY_INFO AcpiGbl_HistoryBuffer[HISTORY_SIZE];
> static UINT16 AcpiGbl_LoHistory = 0;
> static UINT16 AcpiGbl_NumHistory = 0;
> static UINT16 AcpiGbl_NextHistoryIndex = 0;
> -static UINT32 AcpiGbl_NextCmdNum = 1;
> +UINT32 AcpiGbl_NextCmdNum = 1;
>
>
> /*******************************************************************************
> @@ -166,6 +166,11 @@ AcpiDbAddToHistory (
> /* Put command into the next available slot */
>
> CmdLen = (UINT16) ACPI_STRLEN (CommandLine);
> + if (!CmdLen)
> + {
> + return;
> + }
> +
> if (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command != NULL)
> {
> BufferLen = (UINT16) ACPI_STRLEN (
> @@ -275,8 +280,6 @@ char *
> AcpiDbGetFromHistory (
> char *CommandNumArg)
> {
> - UINT32 i;
> - UINT16 HistoryIndex;
> UINT32 CmdNum;
>
>
> @@ -290,6 +293,31 @@ AcpiDbGetFromHistory (
> CmdNum = ACPI_STRTOUL (CommandNumArg, NULL, 0);
> }
>
> + return (AcpiDbGetHistoryByIndex (CmdNum));
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDbGetHistoryByIndex
> + *
> + * PARAMETERS: CmdNum - Index of the desired history entry.
> + * Values are 0...(AcpiGbl_NextCmdNum - 1)
> + *
> + * RETURN: Pointer to the retrieved command. Null on error.
> + *
> + * DESCRIPTION: Get a command from the history buffer
> + *
> + ******************************************************************************/
> +
> +char *
> +AcpiDbGetHistoryByIndex (
> + UINT32 CmdNum)
> +{
> + UINT32 i;
> + UINT16 HistoryIndex;
> +
> +
> /* Search history buffer */
>
> HistoryIndex = AcpiGbl_LoHistory;
> @@ -302,6 +330,7 @@ AcpiDbGetFromHistory (
> return (AcpiGbl_HistoryBuffer[HistoryIndex].Command);
> }
>
> + /* History buffer is circular */
>
> HistoryIndex++;
> if (HistoryIndex >= HISTORY_SIZE)
> diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
> index 2f6127f..91f4e62 100644
> --- a/src/acpica/source/components/debugger/dbinput.c
> +++ b/src/acpica/source/components/debugger/dbinput.c
> @@ -204,12 +204,14 @@ enum AcpiExDebuggerCommands
> CMD_OPEN,
> CMD_OSI,
> CMD_OWNER,
> + CMD_PATHS,
> CMD_PREDEFINED,
> CMD_PREFIX,
> CMD_QUIT,
> CMD_REFERENCES,
> CMD_RESOURCES,
> CMD_RESULTS,
> + CMD_SCI,
> CMD_SET,
> CMD_SLEEP,
> CMD_STATS,
> @@ -275,12 +277,14 @@ static const ACPI_DB_COMMAND_INFO AcpiGbl_DbCommands[] =
> {"OPEN", 1},
> {"OSI", 0},
> {"OWNER", 1},
> + {"PATHS", 0},
> {"PREDEFINED", 0},
> {"PREFIX", 0},
> {"QUIT", 0},
> {"REFERENCES", 1},
> {"RESOURCES", 0},
> {"RESULTS", 0},
> + {"SCI", 0},
> {"SET", 3},
> {"SLEEP", 0},
> {"STATS", 1},
> @@ -331,22 +335,19 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandHelp[] =
> {0, "\nNamespace Access Commands:", "\n"},
> {1, " Businfo", "Display system bus info\n"},
> {1, " Disassemble <Method>", "Disassemble a control method\n"},
> - {1, " Event <F|G> <Value>", "Generate AcpiEvent (Fixed/GPE)\n"},
> {1, " Find <AcpiName> (? is wildcard)", "Find ACPI name(s) with wildcards\n"},
> - {1, " Gpe <GpeNum> <GpeBlock>", "Simulate a GPE\n"},
> - {1, " Gpes", "Display info on all GPEs\n"},
> {1, " Integrity", "Validate namespace integrity\n"},
> {1, " Methods", "Display list of loaded control methods\n"},
> {1, " Namespace [Object] [Depth]", "Display loaded namespace tree/subtree\n"},
> {1, " Notify <Object> <Value>", "Send a notification on Object\n"},
> {1, " Objects <ObjectType>", "Display all objects of the given type\n"},
> {1, " Owner <OwnerId> [Depth]", "Display loaded namespace by object owner\n"},
> + {1, " Paths", "Display full pathnames of namespace objects\n"},
> {1, " Predefined", "Check all predefined names\n"},
> {1, " Prefix [<NamePath>]", "Set or Get current execution prefix\n"},
> {1, " References <Addr>", "Find all references to object at addr\n"},
> {1, " Resources [DeviceName]", "Display Device resources (no arg = all devices)\n"},
> {1, " Set N <NamedObject> <Value>", "Set value for named integer\n"},
> - {1, " Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},
> {1, " Template <Object>", "Format/dump a Buffer/ResourceTemplate\n"},
> {1, " Terminate", "Delete namespace and all internal objects\n"},
> {1, " Type <Object>", "Display object type\n"},
> @@ -360,7 +361,7 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandHelp[] =
> {5, " Execute <Namepath> [Arguments]", "Execute control method\n"},
> {1, " Hex Integer", "Integer method argument\n"},
> {1, " \"Ascii String\"", "String method argument\n"},
> - {1, " (Byte List)", "Buffer method argument\n"},
> + {1, " (Hex Byte List)", "Buffer method argument\n"},
> {1, " [Package Element List]", "Package method argument\n"},
> {1, " Go", "Allow method to run to completion\n"},
> {1, " Information", "Display info about the current method\n"},
> @@ -375,6 +376,13 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandHelp[] =
> {1, " Tree", "Display control method calling tree\n"},
> {1, " <Enter>", "Single step next AML opcode (over calls)\n"},
>
> + {0, "\nHardware Related Commands:", "\n"},
> + {1, " Event <F|G> <Value>", "Generate AcpiEvent (Fixed/GPE)\n"},
> + {1, " Gpe <GpeNum> <GpeBlock>", "Simulate a GPE\n"},
> + {1, " Gpes", "Display info on all GPEs\n"},
> + {1, " Sci", "Generate an SCI\n"},
> + {1, " Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},
> +
> {0, "\nFile I/O Commands:", "\n"},
> {1, " Close", "Close debug output file\n"},
> {1, " Load <Input Filename>", "Load ACPI table from a file\n"},
> @@ -699,7 +707,13 @@ AcpiDbGetLine (
> char *This;
>
>
> - ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
> + if (AcpiUtSafeStrcpy (AcpiGbl_DbParsedBuf, sizeof (AcpiGbl_DbParsedBuf),
> + InputBuffer))
> + {
> + AcpiOsPrintf ("Buffer overflow while parsing input line (max %u characters)\n",
> + sizeof (AcpiGbl_DbParsedBuf));
> + return (0);
> + }
>
> This = AcpiGbl_DbParsedBuf;
> for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
> @@ -804,6 +818,11 @@ AcpiDbCommandDispatch (
> return (AE_CTRL_TERMINATE);
> }
>
> +
> + /* Add all commands that come here to the history buffer */
> +
> + AcpiDbAddToHistory (InputBuffer);
> +
> ParamCount = AcpiDbGetLine (InputBuffer);
> CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
> Temp = 0;
> @@ -1074,6 +1093,11 @@ AcpiDbCommandDispatch (
> AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
> break;
>
> + case CMD_PATHS:
> +
> + AcpiDbDumpNamespacePaths ();
> + break;
> +
> case CMD_PREDEFINED:
>
> AcpiDbCheckPredefinedNames ();
> @@ -1099,6 +1123,11 @@ AcpiDbCommandDispatch (
> AcpiDbDisplayResults ();
> break;
>
> + case CMD_SCI:
> +
> + AcpiDbGenerateSci ();
> + break;
> +
> case CMD_SET:
>
> AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
> @@ -1189,7 +1218,7 @@ AcpiDbCommandDispatch (
> case CMD_NOT_FOUND:
> default:
>
> - AcpiOsPrintf ("Unknown Command\n");
> + AcpiOsPrintf ("%s: unknown command\n", AcpiGbl_DbArgs[0]);
> return (AE_CTRL_TRUE);
> }
>
> @@ -1198,9 +1227,6 @@ AcpiDbCommandDispatch (
> Status = AE_CTRL_TRUE;
> }
>
> - /* Add all commands that come here to the history buffer */
> -
> - AcpiDbAddToHistory (InputBuffer);
> return (Status);
> }
>
> diff --git a/src/acpica/source/components/debugger/dbnames.c b/src/acpica/source/components/debugger/dbnames.c
> index 9fbe539..d7d66a3 100644
> --- a/src/acpica/source/components/debugger/dbnames.c
> +++ b/src/acpica/source/components/debugger/dbnames.c
> @@ -243,8 +243,7 @@ AcpiDbSetScope (
> goto ErrorExit;
> }
>
> - ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name);
> - ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
> + AcpiGbl_DbScopeBuf[0] = 0;
> }
> else
> {
> @@ -256,9 +255,22 @@ AcpiDbSetScope (
> {
> goto ErrorExit;
> }
> + }
> +
> + /* Build the final pathname */
> +
> + if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
> + Name))
> + {
> + Status = AE_BUFFER_OVERFLOW;
> + goto ErrorExit;
> + }
>
> - ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name);
> - ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
> + if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
> + "\\"))
> + {
> + Status = AE_BUFFER_OVERFLOW;
> + goto ErrorExit;
> }
>
> AcpiGbl_DbScopeNode = Node;
> @@ -328,6 +340,37 @@ AcpiDbDumpNamespace (
>
> /*******************************************************************************
> *
> + * FUNCTION: AcpiDbDumpNamespacePaths
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Dump entire namespace with full object pathnames and object
> + * type information. Alternative to "namespace" command.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDbDumpNamespacePaths (
> + void)
> +{
> +
> + AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
> + AcpiOsPrintf ("ACPI Namespace (from root):\n");
> +
> + /* Display the entire namespace */
> +
> + AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
> + AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
> + ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode);
> +
> + AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiDbDumpNamespaceByOwner
> *
> * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed
> diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c
> index a0e9641..845d75f 100644
> --- a/src/acpica/source/components/debugger/dbxface.c
> +++ b/src/acpica/source/components/debugger/dbxface.c
> @@ -579,6 +579,10 @@ AcpiDbTerminate (
> AcpiOsFree (AcpiGbl_DbBuffer);
> AcpiGbl_DbBuffer = NULL;
> }
> +
> + /* Ensure that debug output is now disabled */
> +
> + AcpiGbl_DbOutputFlags = ACPI_DB_DISABLE_OUTPUT;
> }
>
>
> diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
> index 64c1167..0eceb5e 100644
> --- a/src/acpica/source/components/events/evgpe.c
> +++ b/src/acpica/source/components/events/evgpe.c
> @@ -621,6 +621,7 @@ AcpiEvAsynchExecuteGpeMethod (
> Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> if (ACPI_FAILURE (Status))
> {
> + ACPI_FREE (LocalGpeEventInfo);
> return_VOID;
> }
>
> @@ -629,6 +630,7 @@ AcpiEvAsynchExecuteGpeMethod (
> if (!AcpiEvValidGpeEvent (GpeEventInfo))
> {
> Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
> + ACPI_FREE (LocalGpeEventInfo);
> return_VOID;
> }
>
> @@ -642,6 +644,7 @@ AcpiEvAsynchExecuteGpeMethod (
> Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
> if (ACPI_FAILURE (Status))
> {
> + ACPI_FREE (LocalGpeEventInfo);
> return_VOID;
> }
>
> diff --git a/src/acpica/source/components/events/evgpeutil.c b/src/acpica/source/components/events/evgpeutil.c
> index eb008dc..fd0d717 100644
> --- a/src/acpica/source/components/events/evgpeutil.c
> +++ b/src/acpica/source/components/events/evgpeutil.c
> @@ -288,7 +288,7 @@ AcpiEvGetGpeDevice (
> *
> * FUNCTION: AcpiEvGetGpeXruptBlock
> *
> - * PARAMETERS: InterruptNumber - Interrupt for a GPE block
> + * PARAMETERS: InterruptNumber - Interrupt for a GPE block
> *
> * RETURN: A GPE interrupt block
> *
> diff --git a/src/acpica/source/components/events/evmisc.c b/src/acpica/source/components/events/evmisc.c
> index 9e871fb..b0c8983 100644
> --- a/src/acpica/source/components/events/evmisc.c
> +++ b/src/acpica/source/components/events/evmisc.c
> @@ -364,15 +364,6 @@ AcpiEvTerminate (
>
> Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock, NULL);
>
> - /* Remove SCI handler */
> -
> - Status = AcpiEvRemoveSciHandler ();
> - if (ACPI_FAILURE(Status))
> - {
> - ACPI_ERROR ((AE_INFO,
> - "Could not remove SCI handler"));
> - }
> -
> Status = AcpiEvRemoveGlobalLockHandler ();
> if (ACPI_FAILURE(Status))
> {
> @@ -383,6 +374,15 @@ AcpiEvTerminate (
> AcpiGbl_EventsInitialized = FALSE;
> }
>
> + /* Remove SCI handlers */
> +
> + Status = AcpiEvRemoveAllSciHandlers ();
> + if (ACPI_FAILURE(Status))
> + {
> + ACPI_ERROR ((AE_INFO,
> + "Could not remove SCI handler"));
> + }
> +
> /* Deallocate all handler objects installed within GPE info structs */
>
> Status = AcpiEvWalkGpeList (AcpiEvDeleteGpeHandlers, NULL);
> diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c
> index a8a24d5..efaf38b 100644
> --- a/src/acpica/source/components/events/evregion.c
> +++ b/src/acpica/source/components/events/evregion.c
> @@ -306,18 +306,12 @@ AcpiEvAddressSpaceDispatch (
> {
> RegionObj->Region.Flags |= AOPOBJ_SETUP_COMPLETE;
>
> - if (RegionObj2->Extra.RegionContext)
> - {
> - /* The handler for this region was already installed */
> -
> - ACPI_FREE (RegionContext);
> - }
> - else
> + /*
> + * Save the returned context for use in all accesses to
> + * the handler for this particular region
> + */
> + if (!(RegionObj2->Extra.RegionContext))
> {
> - /*
> - * Save the returned context for use in all accesses to
> - * this particular region
> - */
> RegionObj2->Extra.RegionContext = RegionContext;
> }
> }
> @@ -333,7 +327,6 @@ AcpiEvAddressSpaceDispatch (
> ACPI_FORMAT_NATIVE_UINT (RegionObj->Region.Address + RegionOffset),
> AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
>
> -
> /*
> * Special handling for GenericSerialBus and GeneralPurposeIo:
> * There are three extra parameters that must be passed to the
> @@ -496,6 +489,15 @@ AcpiEvDetachRegion(
> Status = RegionSetup (RegionObj, ACPI_REGION_DEACTIVATE,
> HandlerObj->AddressSpace.Context, RegionContext);
>
> + /*
> + * RegionContext should have been released by the deactivate
> + * operation. We don't need access to it anymore here.
> + */
> + if (RegionContext)
> + {
> + *RegionContext = NULL;
> + }
> +
> /* Init routine may fail, Just ignore errors */
>
> if (ACPI_FAILURE (Status))
> diff --git a/src/acpica/source/components/events/evsci.c b/src/acpica/source/components/events/evsci.c
> index 5493bff..fe5c309 100644
> --- a/src/acpica/source/components/events/evsci.c
> +++ b/src/acpica/source/components/events/evsci.c
> @@ -134,6 +134,57 @@ AcpiEvSciXruptHandler (
>
> /*******************************************************************************
> *
> + * FUNCTION: AcpiEvSciDispatch
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: Status code indicates whether interrupt was handled.
> + *
> + * DESCRIPTION: Dispatch the SCI to all host-installed SCI handlers.
> + *
> + ******************************************************************************/
> +
> +UINT32
> +AcpiEvSciDispatch (
> + void)
> +{
> + ACPI_SCI_HANDLER_INFO *SciHandler;
> + ACPI_CPU_FLAGS Flags;
> + UINT32 IntStatus = ACPI_INTERRUPT_NOT_HANDLED;
> +
> +
> + ACPI_FUNCTION_NAME (EvSciDispatch);
> +
> +
> + /* Are there any host-installed SCI handlers? */
> +
> + if (!AcpiGbl_SciHandlerList)
> + {
> + return (IntStatus);
> + }
> +
> + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
> +
> + /* Invoke all host-installed SCI handlers */
> +
> + SciHandler = AcpiGbl_SciHandlerList;
> + while (SciHandler)
> + {
> + /* Invoke the installed handler (at interrupt level) */
> +
> + IntStatus |= SciHandler->Address (
> + SciHandler->Context);
> +
> + SciHandler = SciHandler->Next;
> + }
> +
> + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> + return (IntStatus);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiEvSciXruptHandler
> *
> * PARAMETERS: Context - Calling Context
> @@ -173,6 +224,10 @@ AcpiEvSciXruptHandler (
> */
> InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
>
> + /* Invoke all host-installed SCI handlers */
> +
> + InterruptHandled |= AcpiEvSciDispatch ();
> +
> AcpiSciCount++;
> return_UINT32 (InterruptHandled);
> }
> @@ -202,14 +257,13 @@ AcpiEvGpeXruptHandler (
>
>
> /*
> - * We are guaranteed by the ACPI CA initialization/shutdown code that
> + * We are guaranteed by the ACPICA initialization/shutdown code that
> * if this interrupt handler is installed, ACPI is enabled.
> */
>
> /* GPEs: Check for and dispatch any GPEs that have occurred */
>
> InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
> -
> return_UINT32 (InterruptHandled);
> }
>
> @@ -244,15 +298,15 @@ AcpiEvInstallSciHandler (
>
> /******************************************************************************
> *
> - * FUNCTION: AcpiEvRemoveSciHandler
> + * FUNCTION: AcpiEvRemoveAllSciHandlers
> *
> * PARAMETERS: none
> *
> - * RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not
> + * RETURN: AE_OK if handler uninstalled, AE_ERROR if handler was not
> * installed to begin with
> *
> * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
> - * taken.
> + * taken. Remove all host-installed SCI handlers.
> *
> * Note: It doesn't seem important to disable all events or set the event
> * enable registers to their original values. The OS should disable
> @@ -262,13 +316,15 @@ AcpiEvInstallSciHandler (
> ******************************************************************************/
>
> ACPI_STATUS
> -AcpiEvRemoveSciHandler (
> +AcpiEvRemoveAllSciHandlers (
> void)
> {
> + ACPI_SCI_HANDLER_INFO *SciHandler;
> + ACPI_CPU_FLAGS Flags;
> ACPI_STATUS Status;
>
>
> - ACPI_FUNCTION_TRACE (EvRemoveSciHandler);
> + ACPI_FUNCTION_TRACE (EvRemoveAllSciHandlers);
>
>
> /* Just let the OS remove the handler and disable the level */
> @@ -276,6 +332,23 @@ AcpiEvRemoveSciHandler (
> Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
> AcpiEvSciXruptHandler);
>
> + if (!AcpiGbl_SciHandlerList)
> + {
> + return (Status);
> + }
> +
> + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
> +
> + /* Free all host-installed SCI handlers */
> +
> + while (AcpiGbl_SciHandlerList)
> + {
> + SciHandler = AcpiGbl_SciHandlerList;
> + AcpiGbl_SciHandlerList = SciHandler->Next;
> + ACPI_FREE (SciHandler);
> + }
> +
> + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> return_ACPI_STATUS (Status);
> }
>
> diff --git a/src/acpica/source/components/events/evxface.c b/src/acpica/source/components/events/evxface.c
> index 79039ee..91bae82 100644
> --- a/src/acpica/source/components/events/evxface.c
> +++ b/src/acpica/source/components/events/evxface.c
> @@ -115,6 +115,7 @@
>
>
> #define __EVXFACE_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> @@ -507,6 +508,169 @@ ACPI_EXPORT_SYMBOL (AcpiInstallExceptionHandler)
> #if (!ACPI_REDUCED_HARDWARE)
> /*******************************************************************************
> *
> + * FUNCTION: AcpiInstallSciHandler
> + *
> + * PARAMETERS: Address - Address of the handler
> + * Context - Value passed to the handler on each SCI
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Install a handler for a System Control Interrupt.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiInstallSciHandler (
> + ACPI_SCI_HANDLER Address,
> + void *Context)
> +{
> + ACPI_SCI_HANDLER_INFO *NewSciHandler;
> + ACPI_SCI_HANDLER_INFO *SciHandler;
> + ACPI_CPU_FLAGS Flags;
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiInstallSciHandler);
> +
> +
> + if (!Address)
> + {
> + return_ACPI_STATUS (AE_BAD_PARAMETER);
> + }
> +
> + /* Allocate and init a handler object */
> +
> + NewSciHandler = ACPI_ALLOCATE (sizeof (ACPI_SCI_HANDLER_INFO));
> + if (!NewSciHandler)
> + {
> + return_ACPI_STATUS (AE_NO_MEMORY);
> + }
> +
> + NewSciHandler->Address = Address;
> + NewSciHandler->Context = Context;
> +
> + Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> + if (ACPI_FAILURE (Status))
> + {
> + goto Exit;
> + }
> +
> + /* Lock list during installation */
> +
> + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
> + SciHandler = AcpiGbl_SciHandlerList;
> +
> + /* Ensure handler does not already exist */
> +
> + while (SciHandler)
> + {
> + if (Address == SciHandler->Address)
> + {
> + Status = AE_ALREADY_EXISTS;
> + goto UnlockAndExit;
> + }
> +
> + SciHandler = SciHandler->Next;
> + }
> +
> + /* Install the new handler into the global list (at head) */
> +
> + NewSciHandler->Next = AcpiGbl_SciHandlerList;
> + AcpiGbl_SciHandlerList = NewSciHandler;
> +
> +
> +UnlockAndExit:
> +
> + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> + (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
> +
> +Exit:
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_FREE (NewSciHandler);
> + }
> + return_ACPI_STATUS (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiRemoveSciHandler
> + *
> + * PARAMETERS: Address - Address of the handler
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Remove a handler for a System Control Interrupt.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiRemoveSciHandler (
> + ACPI_SCI_HANDLER Address)
> +{
> + ACPI_SCI_HANDLER_INFO *PrevSciHandler;
> + ACPI_SCI_HANDLER_INFO *NextSciHandler;
> + ACPI_CPU_FLAGS Flags;
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiRemoveSciHandler);
> +
> +
> + if (!Address)
> + {
> + return_ACPI_STATUS (AE_BAD_PARAMETER);
> + }
> +
> + Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /* Remove the SCI handler with lock */
> +
> + Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
> +
> + PrevSciHandler = NULL;
> + NextSciHandler = AcpiGbl_SciHandlerList;
> + while (NextSciHandler)
> + {
> + if (NextSciHandler->Address == Address)
> + {
> + /* Unlink and free the SCI handler info block */
> +
> + if (PrevSciHandler)
> + {
> + PrevSciHandler->Next = NextSciHandler->Next;
> + }
> + else
> + {
> + AcpiGbl_SciHandlerList = NextSciHandler->Next;
> + }
> +
> + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> + ACPI_FREE (NextSciHandler);
> + goto UnlockAndExit;
> + }
> +
> + PrevSciHandler = NextSciHandler;
> + NextSciHandler = NextSciHandler->Next;
> + }
> +
> + AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> + Status = AE_NOT_EXIST;
> +
> +
> +UnlockAndExit:
> + (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
> + return_ACPI_STATUS (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiInstallGlobalEventHandler
> *
> * PARAMETERS: Handler - Pointer to the global event handler function
> diff --git a/src/acpica/source/components/events/evxfevnt.c b/src/acpica/source/components/events/evxfevnt.c
> index 47273ce..10780f3 100644
> --- a/src/acpica/source/components/events/evxfevnt.c
> +++ b/src/acpica/source/components/events/evxfevnt.c
> @@ -115,6 +115,7 @@
>
>
> #define __EVXFEVNT_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
> index 4a756c9..9b4ce30 100644
> --- a/src/acpica/source/components/events/evxfgpe.c
> +++ b/src/acpica/source/components/events/evxfgpe.c
> @@ -115,6 +115,7 @@
>
>
> #define __EVXFGPE_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/events/evxfregn.c b/src/acpica/source/components/events/evxfregn.c
> index 12ec482..eefb119 100644
> --- a/src/acpica/source/components/events/evxfregn.c
> +++ b/src/acpica/source/components/events/evxfregn.c
> @@ -115,6 +115,7 @@
> *****************************************************************************/
>
> #define __EVXFREGN_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/executer/exstore.c b/src/acpica/source/components/executer/exstore.c
> index 4f50aa3..3524c5a 100644
> --- a/src/acpica/source/components/executer/exstore.c
> +++ b/src/acpica/source/components/executer/exstore.c
> @@ -134,6 +134,12 @@ AcpiExStoreObjectToIndex (
> ACPI_OPERAND_OBJECT *DestDesc,
> ACPI_WALK_STATE *WalkState);
>
> +static ACPI_STATUS
> +AcpiExStoreDirectToNode (
> + ACPI_OPERAND_OBJECT *SourceDesc,
> + ACPI_NAMESPACE_NODE *Node,
> + ACPI_WALK_STATE *WalkState);
> +
>
> /*******************************************************************************
> *
> @@ -465,7 +471,11 @@ AcpiExStoreObjectToIndex (
> * When storing into an object the data is converted to the
> * target object type then stored in the object. This means
> * that the target object type (for an initialized target) will
> - * not be changed by a store operation.
> + * not be changed by a store operation. A CopyObject can change
> + * the target type, however.
> + *
> + * The ImplicitConversion flag is set to NO/FALSE only when
> + * storing to an ArgX -- as per the rules of the ACPI spec.
> *
> * Assumes parameters are already validated.
> *
> @@ -492,7 +502,7 @@ AcpiExStoreObjectToNode (
> TargetType = AcpiNsGetType (Node);
> TargetDesc = AcpiNsGetAttachedObject (Node);
>
> - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n",
> + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n",
> SourceDesc, AcpiUtGetObjectTypeName (SourceDesc),
> Node, AcpiUtGetTypeName (TargetType)));
>
> @@ -506,49 +516,35 @@ AcpiExStoreObjectToNode (
> return_ACPI_STATUS (Status);
> }
>
> - /* If no implicit conversion, drop into the default case below */
> -
> - if ((!ImplicitConversion) ||
> - ((WalkState->Opcode == AML_COPY_OP) &&
> - (TargetType != ACPI_TYPE_LOCAL_REGION_FIELD) &&
> - (TargetType != ACPI_TYPE_LOCAL_BANK_FIELD) &&
> - (TargetType != ACPI_TYPE_LOCAL_INDEX_FIELD)))
> - {
> - /*
> - * Force execution of default (no implicit conversion). Note:
> - * CopyObject does not perform an implicit conversion, as per the ACPI
> - * spec -- except in case of region/bank/index fields -- because these
> - * objects must retain their original type permanently.
> - */
> - TargetType = ACPI_TYPE_ANY;
> - }
> -
> /* Do the actual store operation */
>
> switch (TargetType)
> {
> - case ACPI_TYPE_BUFFER_FIELD:
> - case ACPI_TYPE_LOCAL_REGION_FIELD:
> - case ACPI_TYPE_LOCAL_BANK_FIELD:
> - case ACPI_TYPE_LOCAL_INDEX_FIELD:
> -
> - /* For fields, copy the source data to the target field. */
> -
> - Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
> - &WalkState->ResultObj);
> - break;
> -
> case ACPI_TYPE_INTEGER:
> case ACPI_TYPE_STRING:
> case ACPI_TYPE_BUFFER:
> /*
> - * These target types are all of type Integer/String/Buffer, and
> - * therefore support implicit conversion before the store.
> - *
> - * Copy and/or convert the source object to a new target object
> + * The simple data types all support implicit source operand
> + * conversion before the store.
> */
> +
> + if ((WalkState->Opcode == AML_COPY_OP) ||
> + !ImplicitConversion)
> + {
> + /*
> + * However, CopyObject and Stores to ArgX do not perform
> + * an implicit conversion, as per the ACPI specification.
> + * A direct store is performed instead.
> + */
> + Status = AcpiExStoreDirectToNode (SourceDesc, Node,
> + WalkState);
> + break;
> + }
> +
> + /* Store with implicit source operand conversion support */
> +
> Status = AcpiExStoreObjectToObject (SourceDesc, TargetDesc,
> - &NewDesc, WalkState);
> + &NewDesc, WalkState);
> if (ACPI_FAILURE (Status))
> {
> return_ACPI_STATUS (Status);
> @@ -561,11 +557,12 @@ AcpiExStoreObjectToNode (
> * the Name's type to that of the value being stored in it.
> * SourceDesc reference count is incremented by AttachObject.
> *
> - * Note: This may change the type of the node if an explicit store
> - * has been performed such that the node/object type has been
> - * changed.
> + * Note: This may change the type of the node if an explicit
> + * store has been performed such that the node/object type
> + * has been changed.
> */
> - Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
> + Status = AcpiNsAttachObject (Node, NewDesc,
> + NewDesc->Common.Type);
>
> ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
> "Store %s into %s via Convert/Attach\n",
> @@ -574,33 +571,86 @@ AcpiExStoreObjectToNode (
> }
> break;
>
> - default:
> -
> - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
> - "Storing [%s] (%p) directly into node [%s] (%p)"
> - " with no implicit conversion\n",
> - AcpiUtGetObjectTypeName (SourceDesc), SourceDesc,
> - AcpiUtGetObjectTypeName (TargetDesc), Node));
> + case ACPI_TYPE_BUFFER_FIELD:
> + case ACPI_TYPE_LOCAL_REGION_FIELD:
> + case ACPI_TYPE_LOCAL_BANK_FIELD:
> + case ACPI_TYPE_LOCAL_INDEX_FIELD:
> + /*
> + * For all fields, always write the source data to the target
> + * field. Any required implicit source operand conversion is
> + * performed in the function below as necessary. Note, field
> + * objects must retain their original type permanently.
> + */
> + Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
> + &WalkState->ResultObj);
> + break;
>
> + default:
> /*
> * No conversions for all other types. Directly store a copy of
> - * the source object. NOTE: This is a departure from the ACPI
> - * spec, which states "If conversion is impossible, abort the
> - * running control method".
> + * the source object. This is the ACPI spec-defined behavior for
> + * the CopyObject operator.
> *
> - * This code implements "If conversion is impossible, treat the
> - * Store operation as a CopyObject".
> + * NOTE: For the Store operator, this is a departure from the
> + * ACPI spec, which states "If conversion is impossible, abort
> + * the running control method". Instead, this code implements
> + * "If conversion is impossible, treat the Store operation as
> + * a CopyObject".
> */
> - Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
> - if (ACPI_FAILURE (Status))
> - {
> - return_ACPI_STATUS (Status);
> - }
> -
> - Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
> - AcpiUtRemoveReference (NewDesc);
> + Status = AcpiExStoreDirectToNode (SourceDesc, Node,
> + WalkState);
> break;
> }
>
> return_ACPI_STATUS (Status);
> }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiExStoreDirectToNode
> + *
> + * PARAMETERS: SourceDesc - Value to be stored
> + * Node - Named object to receive the value
> + * WalkState - Current walk state
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: "Store" an object directly to a node. This involves a copy
> + * and an attach.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiExStoreDirectToNode (
> + ACPI_OPERAND_OBJECT *SourceDesc,
> + ACPI_NAMESPACE_NODE *Node,
> + ACPI_WALK_STATE *WalkState)
> +{
> + ACPI_STATUS Status;
> + ACPI_OPERAND_OBJECT *NewDesc;
> +
> +
> + ACPI_FUNCTION_TRACE (ExStoreDirectToNode);
> +
> +
> + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
> + "Storing [%s] (%p) directly into node [%s] (%p)"
> + " with no implicit conversion\n",
> + AcpiUtGetObjectTypeName (SourceDesc), SourceDesc,
> + AcpiUtGetTypeName (Node->Type), Node));
> +
> + /* Copy the source object to a new object */
> +
> + Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /* Attach the new object to the node */
> +
> + Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
> + AcpiUtRemoveReference (NewDesc);
> + return_ACPI_STATUS (Status);
> +}
> diff --git a/src/acpica/source/components/hardware/hwxface.c b/src/acpica/source/components/hardware/hwxface.c
> index 61a96de..36f4e5c 100644
> --- a/src/acpica/source/components/hardware/hwxface.c
> +++ b/src/acpica/source/components/hardware/hwxface.c
> @@ -113,6 +113,8 @@
> *
> *****************************************************************************/
>
> +#define EXPORT_ACPI_INTERFACES
> +
> #include "acpi.h"
> #include "accommon.h"
> #include "acnamesp.h"
> @@ -162,9 +164,15 @@ AcpiReset (
> * For I/O space, write directly to the OSL. This bypasses the port
> * validation mechanism, which may block a valid write to the reset
> * register.
> + *
> + * NOTE:
> + * The ACPI spec requires the reset register width to be 8, so we
> + * hardcode it here and ignore the FADT value. This maintains
> + * compatibility with other ACPI implementations that have allowed
> + * BIOS code with bad register width values to go unnoticed.
> */
> Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ResetReg->Address,
> - AcpiGbl_FADT.ResetValue, ResetReg->BitWidth);
> + AcpiGbl_FADT.ResetValue, ACPI_RESET_REGISTER_WIDTH);
> }
> else
> {
> @@ -203,7 +211,8 @@ AcpiRead (
> UINT64 *ReturnValue,
> ACPI_GENERIC_ADDRESS *Reg)
> {
> - UINT32 Value;
> + UINT32 ValueLo;
> + UINT32 ValueHi;
> UINT32 Width;
> UINT64 Address;
> ACPI_STATUS Status;
> @@ -225,13 +234,8 @@ AcpiRead (
> return (Status);
> }
>
> - /* Initialize entire 64-bit return value to zero */
> -
> - *ReturnValue = 0;
> - Value = 0;
> -
> /*
> - * Two address spaces supported: Memory or IO. PCI_Config is
> + * Two address spaces supported: Memory or I/O. PCI_Config is
> * not supported here because the GAS structure is insufficient
> */
> if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY)
> @@ -245,6 +249,9 @@ AcpiRead (
> }
> else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
> {
> + ValueLo = 0;
> + ValueHi = 0;
> +
> Width = Reg->BitWidth;
> if (Width == 64)
> {
> @@ -252,25 +259,27 @@ AcpiRead (
> }
>
> Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
> - Address, &Value, Width);
> + Address, &ValueLo, Width);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> }
> - *ReturnValue = Value;
>
> if (Reg->BitWidth == 64)
> {
> /* Read the top 32 bits */
>
> Status = AcpiHwReadPort ((ACPI_IO_ADDRESS)
> - (Address + 4), &Value, 32);
> + (Address + 4), &ValueHi, 32);
> if (ACPI_FAILURE (Status))
> {
> return (Status);
> }
> - *ReturnValue |= ((UINT64) Value << 32);
> }
> +
> + /* Set the return value only if status is AE_OK */
> +
> + *ReturnValue = (ValueLo | ((UINT64) ValueHi << 32));
> }
>
> ACPI_DEBUG_PRINT ((ACPI_DB_IO,
> @@ -279,7 +288,7 @@ AcpiRead (
> ACPI_FORMAT_UINT64 (Address),
> AcpiUtGetRegionName (Reg->SpaceId)));
>
> - return (Status);
> + return (AE_OK);
> }
>
> ACPI_EXPORT_SYMBOL (AcpiRead)
> diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
> index b5ae313..8369600 100644
> --- a/src/acpica/source/components/hardware/hwxfsleep.c
> +++ b/src/acpica/source/components/hardware/hwxfsleep.c
> @@ -113,6 +113,8 @@
> *
> *****************************************************************************/
>
> +#define EXPORT_ACPI_INTERFACES
> +
> #include "acpi.h"
> #include "accommon.h"
>
> diff --git a/src/acpica/source/components/namespace/nsdump.c b/src/acpica/source/components/namespace/nsdump.c
> index 233ded6..d62ca29 100644
> --- a/src/acpica/source/components/namespace/nsdump.c
> +++ b/src/acpica/source/components/namespace/nsdump.c
> @@ -142,6 +142,22 @@ AcpiNsDumpOneDevice (
>
>
> #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
> +
> +static ACPI_STATUS
> +AcpiNsDumpOneObjectPath (
> + ACPI_HANDLE ObjHandle,
> + UINT32 Level,
> + void *Context,
> + void **ReturnValue);
> +
> +static ACPI_STATUS
> +AcpiNsGetMaxDepth (
> + ACPI_HANDLE ObjHandle,
> + UINT32 Level,
> + void *Context,
> + void **ReturnValue);
> +
> +
> /*******************************************************************************
> *
> * FUNCTION: AcpiNsPrintPathname
> @@ -770,6 +786,149 @@ AcpiNsDumpObjects (
>
> /*******************************************************************************
> *
> + * FUNCTION: AcpiNsDumpOneObjectPath, AcpiNsGetMaxDepth
> + *
> + * PARAMETERS: ObjHandle - Node to be dumped
> + * Level - Nesting level of the handle
> + * Context - Passed into WalkNamespace
> + * ReturnValue - Not used
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Dump the full pathname to a namespace object. AcpNsGetMaxDepth
> + * computes the maximum nesting depth in the namespace tree, in
> + * order to simplify formatting in AcpiNsDumpOneObjectPath.
> + * These procedures are UserFunctions called by AcpiNsWalkNamespace.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiNsDumpOneObjectPath (
> + ACPI_HANDLE ObjHandle,
> + UINT32 Level,
> + void *Context,
> + void **ReturnValue)
> +{
> + UINT32 MaxLevel = *((UINT32 *) Context);
> + char *Pathname;
> + ACPI_NAMESPACE_NODE *Node;
> + int PathIndent;
> +
> +
> + if (!ObjHandle)
> + {
> + return (AE_OK);
> + }
> +
> + Node = AcpiNsValidateHandle (ObjHandle);
> + if (!Node)
> + {
> + /* Ignore bad node during namespace walk */
> +
> + return (AE_OK);
> + }
> +
> + Pathname = AcpiNsGetExternalPathname (Node);
> +
> + PathIndent = 1;
> + if (Level <= MaxLevel)
> + {
> + PathIndent = MaxLevel - Level + 1;
> + }
> +
> + AcpiOsPrintf ("%2d%*s%-12s%*s",
> + Level, Level, " ", AcpiUtGetTypeName (Node->Type),
> + PathIndent, " ");
> +
> + AcpiOsPrintf ("%s\n", &Pathname[1]);
> + ACPI_FREE (Pathname);
> + return (AE_OK);
> +}
> +
> +
> +static ACPI_STATUS
> +AcpiNsGetMaxDepth (
> + ACPI_HANDLE ObjHandle,
> + UINT32 Level,
> + void *Context,
> + void **ReturnValue)
> +{
> + UINT32 *MaxLevel = (UINT32 *) Context;
> +
> +
> + if (Level > *MaxLevel)
> + {
> + *MaxLevel = Level;
> + }
> + return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiNsDumpObjectPaths
> + *
> + * PARAMETERS: Type - Object type to be dumped
> + * DisplayType - 0 or ACPI_DISPLAY_SUMMARY
> + * MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX
> + * for an effectively unlimited depth.
> + * OwnerId - Dump only objects owned by this ID. Use
> + * ACPI_UINT32_MAX to match all owners.
> + * StartHandle - Where in namespace to start/end search
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses
> + * AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObjectPath.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiNsDumpObjectPaths (
> + ACPI_OBJECT_TYPE Type,
> + UINT8 DisplayType,
> + UINT32 MaxDepth,
> + ACPI_OWNER_ID OwnerId,
> + ACPI_HANDLE StartHandle)
> +{
> + ACPI_STATUS Status;
> + UINT32 MaxLevel = 0;
> +
> +
> + ACPI_FUNCTION_ENTRY ();
> +
> +
> + /*
> + * Just lock the entire namespace for the duration of the dump.
> + * We don't want any changes to the namespace during this time,
> + * especially the temporary nodes since we are going to display
> + * them also.
> + */
> + Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> + if (ACPI_FAILURE (Status))
> + {
> + AcpiOsPrintf ("Could not acquire namespace mutex\n");
> + return;
> + }
> +
> + /* Get the max depth of the namespace tree, for formatting later */
> +
> + (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth,
> + ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES,
> + AcpiNsGetMaxDepth, NULL, (void *) &MaxLevel, NULL);
> +
> + /* Now dump the entire namespace */
> +
> + (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth,
> + ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES,
> + AcpiNsDumpOneObjectPath, NULL, (void *) &MaxLevel, NULL);
> +
> + (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AcpiNsDumpEntry
> *
> * PARAMETERS: Handle - Node to be dumped
> diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
> index 650b774..d8b3480 100644
> --- a/src/acpica/source/components/namespace/nsxfeval.c
> +++ b/src/acpica/source/components/namespace/nsxfeval.c
> @@ -116,6 +116,7 @@
>
>
> #define __NSXFEVAL_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> @@ -220,8 +221,12 @@ AcpiEvaluateObjectTyped (
>
> if (MustFree)
> {
> - /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */
> -
> + /*
> + * Caller used ACPI_ALLOCATE_BUFFER, free the return buffer.
> + * Note: We use AcpiOsFree here because AcpiOsAllocate was used
> + * to allocate the buffer. This purposefully bypasses the internal
> + * allocation tracking mechanism (if it is enabled).
> + */
> AcpiOsFree (ReturnBuffer->Pointer);
> ReturnBuffer->Pointer = NULL;
> }
> @@ -726,10 +731,19 @@ AcpiWalkNamespace (
> goto UnlockAndExit;
> }
>
> + /* Now we can validate the starting node */
> +
> + if (!AcpiNsValidateHandle (StartObject))
> + {
> + Status = AE_BAD_PARAMETER;
> + goto UnlockAndExit2;
> + }
> +
> Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
> ACPI_NS_WALK_UNLOCK, DescendingCallback,
> AscendingCallback, Context, ReturnValue);
>
> +UnlockAndExit2:
> (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
>
> UnlockAndExit:
> diff --git a/src/acpica/source/components/namespace/nsxfname.c b/src/acpica/source/components/namespace/nsxfname.c
> index 530d94a..a4bca31 100644
> --- a/src/acpica/source/components/namespace/nsxfname.c
> +++ b/src/acpica/source/components/namespace/nsxfname.c
> @@ -115,6 +115,7 @@
> *****************************************************************************/
>
> #define __NSXFNAME_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/namespace/nsxfobj.c b/src/acpica/source/components/namespace/nsxfobj.c
> index 147d025..233ce26 100644
> --- a/src/acpica/source/components/namespace/nsxfobj.c
> +++ b/src/acpica/source/components/namespace/nsxfobj.c
> @@ -116,6 +116,7 @@
>
>
> #define __NSXFOBJ_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/resources/rsxface.c b/src/acpica/source/components/resources/rsxface.c
> index 0401b0d..1ae45b0 100644
> --- a/src/acpica/source/components/resources/rsxface.c
> +++ b/src/acpica/source/components/resources/rsxface.c
> @@ -115,6 +115,7 @@
>
>
> #define __RSXFACE_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c
> index a67e26d..429abbc 100644
> --- a/src/acpica/source/components/tables/tbinstal.c
> +++ b/src/acpica/source/components/tables/tbinstal.c
> @@ -165,14 +165,9 @@ AcpiTbVerifyTable (
> }
> }
>
> - /* FACS is the odd table, has no standard ACPI header and no checksum */
> + /* Always calculate checksum, ignore bad checksum if requested */
>
> - if (!ACPI_COMPARE_NAME (&TableDesc->Signature, ACPI_SIG_FACS))
> - {
> - /* Always calculate checksum, ignore bad checksum if requested */
> -
> - Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
> - }
> + Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
>
> return_ACPI_STATUS (Status);
> }
> diff --git a/src/acpica/source/components/tables/tbprint.c b/src/acpica/source/components/tables/tbprint.c
> index d1d4bc9..d04f161 100644
> --- a/src/acpica/source/components/tables/tbprint.c
> +++ b/src/acpica/source/components/tables/tbprint.c
> @@ -226,11 +226,11 @@ AcpiTbPrintTableHeader (
> {
> /* FACS only has signature and length fields */
>
> - ACPI_INFO ((AE_INFO, "%4.4s %p %05X",
> + ACPI_INFO ((AE_INFO, "%4.4s %p %06X",
> Header->Signature, ACPI_CAST_PTR (void, Address),
> Header->Length));
> }
> - else if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_RSDP))
> + else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature))
> {
> /* RSDP has no common fields */
>
> @@ -238,7 +238,7 @@ AcpiTbPrintTableHeader (
> ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE);
> AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE);
>
> - ACPI_INFO ((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)",
> + ACPI_INFO ((AE_INFO, "RSDP %p %06X (v%.2d %6.6s)",
> ACPI_CAST_PTR (void, Address),
> (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ?
> ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20,
> @@ -252,7 +252,7 @@ AcpiTbPrintTableHeader (
> AcpiTbCleanupTableHeader (&LocalHeader, Header);
>
> ACPI_INFO ((AE_INFO,
> - "%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)",
> + "%4.4s %p %06X (v%.2d %6.6s %8.8s %08X %4.4s %08X)",
> LocalHeader.Signature, ACPI_CAST_PTR (void, Address),
> LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId,
> LocalHeader.OemTableId, LocalHeader.OemRevision,
> @@ -283,6 +283,17 @@ AcpiTbVerifyChecksum (
> UINT8 Checksum;
>
>
> + /*
> + * FACS/S3PT:
> + * They are the odd tables, have no standard ACPI header and no checksum
> + */
> +
> + if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) ||
> + ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
> + {
> + return (AE_OK);
> + }
> +
> /* Compute the checksum on the table */
>
> Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length);
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index cbaad11..7076e4a 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -114,6 +114,7 @@
> *****************************************************************************/
>
> #define __TBXFACE_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> @@ -233,7 +234,7 @@ AcpiInitializeTables (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiInitializeTables)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeTables)
>
>
> /*******************************************************************************
> @@ -276,7 +277,7 @@ AcpiReallocateRootTable (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiReallocateRootTable)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiReallocateRootTable)
>
>
> /*******************************************************************************
> diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c
> index 734d9a6..b7a8b24 100644
> --- a/src/acpica/source/components/tables/tbxfload.c
> +++ b/src/acpica/source/components/tables/tbxfload.c
> @@ -114,6 +114,7 @@
> *****************************************************************************/
>
> #define __TBXFLOAD_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> @@ -164,7 +165,7 @@ AcpiLoadTables (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiLoadTables)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiLoadTables)
>
>
> /*******************************************************************************
> diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
> index b9db205..6ad19a5 100644
> --- a/src/acpica/source/components/tables/tbxfroot.c
> +++ b/src/acpica/source/components/tables/tbxfroot.c
> @@ -147,8 +147,7 @@ AcpiTbValidateRsdp (
> * Note: Sometimes there exists more than one RSDP in memory; the valid
> * RSDP has a valid checksum, all others have an invalid checksum.
> */
> - if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP,
> - sizeof (ACPI_SIG_RSDP)-1) != 0)
> + if (!ACPI_VALIDATE_RSDP_SIG (Rsdp->Signature))
> {
> /* Nope, BAD Signature */
>
> diff --git a/src/acpica/source/components/utilities/utalloc.c b/src/acpica/source/components/utilities/utalloc.c
> index 38feda1..5c672fd 100644
> --- a/src/acpica/source/components/utilities/utalloc.c
> +++ b/src/acpica/source/components/utilities/utalloc.c
> @@ -123,6 +123,45 @@
> ACPI_MODULE_NAME ("utalloc")
>
>
> +#if !defined (USE_NATIVE_ALLOCATE_ZEROED)
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiOsAllocateZeroed
> + *
> + * PARAMETERS: Size - Size of the allocation
> + *
> + * RETURN: Address of the allocated memory on success, NULL on failure.
> + *
> + * DESCRIPTION: Subsystem equivalent of calloc. Allocate and zero memory.
> + * This is the default implementation. Can be overridden via the
> + * USE_NATIVE_ALLOCATE_ZEROED flag.
> + *
> + ******************************************************************************/
> +
> +void *
> +AcpiOsAllocateZeroed (
> + ACPI_SIZE Size)
> +{
> + void *Allocation;
> +
> +
> + ACPI_FUNCTION_ENTRY ();
> +
> +
> + Allocation = AcpiOsAllocate (Size);
> + if (Allocation)
> + {
> + /* Clear the memory block */
> +
> + ACPI_MEMSET (Allocation, 0, Size);
> + }
> +
> + return (Allocation);
> +}
> +
> +#endif /* !USE_NATIVE_ALLOCATE_ZEROED */
> +
> +
> /*******************************************************************************
> *
> * FUNCTION: AcpiUtCreateCaches
> @@ -393,95 +432,3 @@ AcpiUtInitializeBuffer (
> ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
> return (AE_OK);
> }
> -
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: AcpiUtAllocate
> - *
> - * PARAMETERS: Size - Size of the allocation
> - * Component - Component type of caller
> - * Module - Source file name of caller
> - * Line - Line number of caller
> - *
> - * RETURN: Address of the allocated memory on success, NULL on failure.
> - *
> - * DESCRIPTION: Subsystem equivalent of malloc.
> - *
> - ******************************************************************************/
> -
> -void *
> -AcpiUtAllocate (
> - ACPI_SIZE Size,
> - UINT32 Component,
> - const char *Module,
> - UINT32 Line)
> -{
> - void *Allocation;
> -
> -
> - ACPI_FUNCTION_TRACE_U32 (UtAllocate, Size);
> -
> -
> - /* Check for an inadvertent size of zero bytes */
> -
> - if (!Size)
> - {
> - ACPI_WARNING ((Module, Line,
> - "Attempt to allocate zero bytes, allocating 1 byte"));
> - Size = 1;
> - }
> -
> - Allocation = AcpiOsAllocate (Size);
> - if (!Allocation)
> - {
> - /* Report allocation error */
> -
> - ACPI_WARNING ((Module, Line,
> - "Could not allocate size %u", (UINT32) Size));
> -
> - return_PTR (NULL);
> - }
> -
> - return_PTR (Allocation);
> -}
> -
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: AcpiUtAllocateZeroed
> - *
> - * PARAMETERS: Size - Size of the allocation
> - * Component - Component type of caller
> - * Module - Source file name of caller
> - * Line - Line number of caller
> - *
> - * RETURN: Address of the allocated memory on success, NULL on failure.
> - *
> - * DESCRIPTION: Subsystem equivalent of calloc. Allocate and zero memory.
> - *
> - ******************************************************************************/
> -
> -void *
> -AcpiUtAllocateZeroed (
> - ACPI_SIZE Size,
> - UINT32 Component,
> - const char *Module,
> - UINT32 Line)
> -{
> - void *Allocation;
> -
> -
> - ACPI_FUNCTION_ENTRY ();
> -
> -
> - Allocation = AcpiUtAllocate (Size, Component, Module, Line);
> - if (Allocation)
> - {
> - /* Clear the memory block */
> -
> - ACPI_MEMSET (Allocation, 0, Size);
> - }
> -
> - return (Allocation);
> -}
> diff --git a/src/acpica/source/components/utilities/utdebug.c b/src/acpica/source/components/utilities/utdebug.c
> index 88fa4d6..af904ac 100644
> --- a/src/acpica/source/components/utilities/utdebug.c
> +++ b/src/acpica/source/components/utilities/utdebug.c
> @@ -114,6 +114,7 @@
> *****************************************************************************/
>
> #define __UTDEBUG_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> @@ -288,7 +289,7 @@ AcpiDebugPrint (
> * Display the module name, current line number, thread ID (if requested),
> * current procedure nesting level, and the current procedure name
> */
> - AcpiOsPrintf ("%8s-%04ld ", ModuleName, LineNumber);
> + AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);
>
> if (ACPI_LV_THREADS & AcpiDbgLevel)
> {
> diff --git a/src/acpica/source/components/utilities/utexcep.c b/src/acpica/source/components/utilities/utexcep.c
> index 2d7c4e0..28ae7ac 100644
> --- a/src/acpica/source/components/utilities/utexcep.c
> +++ b/src/acpica/source/components/utilities/utexcep.c
> @@ -115,6 +115,7 @@
>
>
> #define __UTEXCEP_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #define ACPI_DEFINE_EXCEPTION_TABLE
> #include "acpi.h"
> diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
> index 1ce7610..8c5c593 100644
> --- a/src/acpica/source/components/utilities/utglobal.c
> +++ b/src/acpica/source/components/utilities/utglobal.c
> @@ -114,6 +114,7 @@
> *****************************************************************************/
>
> #define __UTGLOBAL_C__
> +#define EXPORT_ACPI_INTERFACES
> #define DEFINE_ACPI_GLOBALS
>
> #include "acpi.h"
> @@ -346,7 +347,7 @@ AcpiUtInitGlobals (
>
> #if (!ACPI_REDUCED_HARDWARE)
>
> - /* GPE support */
> + /* GPE/SCI support */
>
> AcpiGbl_AllGpesInitialized = FALSE;
> AcpiGbl_GpeXruptListHead = NULL;
> @@ -355,6 +356,7 @@ AcpiUtInitGlobals (
> AcpiCurrentGpeCount = 0;
>
> AcpiGbl_GlobalEventHandler = NULL;
> + AcpiGbl_SciHandlerList = NULL;
>
> #endif /* !ACPI_REDUCED_HARDWARE */
>
> diff --git a/src/acpica/source/components/utilities/utstring.c b/src/acpica/source/components/utilities/utstring.c
> index a8c928d..3a731d6 100644
> --- a/src/acpica/source/components/utilities/utstring.c
> +++ b/src/acpica/source/components/utilities/utstring.c
> @@ -757,3 +757,78 @@ UtConvertBackslashes (
> }
> }
> #endif
> +
> +#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat
> + *
> + * PARAMETERS: Adds a "DestSize" parameter to each of the standard string
> + * functions. This is the size of the Destination buffer.
> + *
> + * RETURN: TRUE if the operation would overflow the destination buffer.
> + *
> + * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
> + * the result of the operation will not overflow the output string
> + * buffer.
> + *
> + * NOTE: These functions are typically only helpful for processing
> + * user input and command lines. For most ACPICA code, the
> + * required buffer length is precisely calculated before buffer
> + * allocation, so the use of these functions is unnecessary.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AcpiUtSafeStrcpy (
> + char *Dest,
> + ACPI_SIZE DestSize,
> + char *Source)
> +{
> +
> + if (ACPI_STRLEN (Source) >= DestSize)
> + {
> + return (TRUE);
> + }
> +
> + ACPI_STRCPY (Dest, Source);
> + return (FALSE);
> +}
> +
> +BOOLEAN
> +AcpiUtSafeStrcat (
> + char *Dest,
> + ACPI_SIZE DestSize,
> + char *Source)
> +{
> +
> + if ((ACPI_STRLEN (Dest) + ACPI_STRLEN (Source)) >= DestSize)
> + {
> + return (TRUE);
> + }
> +
> + ACPI_STRCAT (Dest, Source);
> + return (FALSE);
> +}
> +
> +BOOLEAN
> +AcpiUtSafeStrncat (
> + char *Dest,
> + ACPI_SIZE DestSize,
> + char *Source,
> + ACPI_SIZE MaxTransferLength)
> +{
> + ACPI_SIZE ActualTransferLength;
> +
> +
> + ActualTransferLength = ACPI_MIN (MaxTransferLength, ACPI_STRLEN (Source));
> +
> + if ((ACPI_STRLEN (Dest) + ActualTransferLength) >= DestSize)
> + {
> + return (TRUE);
> + }
> +
> + ACPI_STRNCAT (Dest, Source, MaxTransferLength);
> + return (FALSE);
> +}
> +#endif
> diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
> index 26a514b..8cf189c 100644
> --- a/src/acpica/source/components/utilities/uttrack.c
> +++ b/src/acpica/source/components/utilities/uttrack.c
> @@ -223,10 +223,23 @@ AcpiUtAllocateAndTrack (
> ACPI_STATUS Status;
>
>
> - Allocation = AcpiUtAllocate (Size + sizeof (ACPI_DEBUG_MEM_HEADER),
> - Component, Module, Line);
> + /* Check for an inadvertent size of zero bytes */
> +
> + if (!Size)
> + {
> + ACPI_WARNING ((Module, Line,
> + "Attempt to allocate zero bytes, allocating 1 byte"));
> + Size = 1;
> + }
> +
> + Allocation = AcpiOsAllocate (Size + sizeof (ACPI_DEBUG_MEM_HEADER));
> if (!Allocation)
> {
> + /* Report allocation error */
> +
> + ACPI_WARNING ((Module, Line,
> + "Could not allocate size %u", (UINT32) Size));
> +
> return (NULL);
> }
>
> @@ -276,8 +289,16 @@ AcpiUtAllocateZeroedAndTrack (
> ACPI_STATUS Status;
>
>
> - Allocation = AcpiUtAllocateZeroed (Size + sizeof (ACPI_DEBUG_MEM_HEADER),
> - Component, Module, Line);
> + /* Check for an inadvertent size of zero bytes */
> +
> + if (!Size)
> + {
> + ACPI_WARNING ((Module, Line,
> + "Attempt to allocate zero bytes, allocating 1 byte"));
> + Size = 1;
> + }
> +
> + Allocation = AcpiOsAllocateZeroed (Size + sizeof (ACPI_DEBUG_MEM_HEADER));
> if (!Allocation)
> {
> /* Report allocation error */
> diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
> index c1b3c46..3b69560 100644
> --- a/src/acpica/source/components/utilities/utxface.c
> +++ b/src/acpica/source/components/utilities/utxface.c
> @@ -186,7 +186,7 @@ AcpiTerminate (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiTerminate)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiTerminate)
>
>
> #ifndef ACPI_ASL_COMPILER
> diff --git a/src/acpica/source/components/utilities/utxferror.c b/src/acpica/source/components/utilities/utxferror.c
> index 3413050..80c1ca7 100644
> --- a/src/acpica/source/components/utilities/utxferror.c
> +++ b/src/acpica/source/components/utilities/utxferror.c
> @@ -114,6 +114,7 @@
> *****************************************************************************/
>
> #define __UTXFERROR_C__
> +#define EXPORT_ACPI_INTERFACES
>
> #include "acpi.h"
> #include "accommon.h"
> diff --git a/src/acpica/source/components/utilities/utxfinit.c b/src/acpica/source/components/utilities/utxfinit.c
> index a01a1d9..d69adbc 100644
> --- a/src/acpica/source/components/utilities/utxfinit.c
> +++ b/src/acpica/source/components/utilities/utxfinit.c
> @@ -206,7 +206,7 @@ AcpiInitializeSubsystem (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiInitializeSubsystem)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeSubsystem)
>
>
> /*******************************************************************************
> @@ -328,7 +328,7 @@ AcpiEnableSubsystem (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiEnableSubsystem)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiEnableSubsystem)
>
>
> /*******************************************************************************
> @@ -427,4 +427,4 @@ AcpiInitializeObjects (
> return_ACPI_STATUS (Status);
> }
>
> -ACPI_EXPORT_SYMBOL (AcpiInitializeObjects)
> +ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeObjects)
> diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h
> index dd0799a..b9bdab6 100644
> --- a/src/acpica/source/include/acconfig.h
> +++ b/src/acpica/source/include/acconfig.h
> @@ -173,7 +173,9 @@
> * ACPI PM timer
> * FACS table (Waking vectors and Global Lock)
> */
> +#ifndef ACPI_REDUCED_HARDWARE
> #define ACPI_REDUCED_HARDWARE FALSE
> +#endif
>
>
> /******************************************************************************
> diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h
> index e41495f..a0f720f 100644
> --- a/src/acpica/source/include/acdebug.h
> +++ b/src/acpica/source/include/acdebug.h
> @@ -231,6 +231,10 @@ AcpiDbGenerateGpe (
> char *GpeArg,
> char *BlockArg))
>
> +ACPI_HW_DEPENDENT_RETURN_VOID (
> +void
> +AcpiDbGenerateSci (
> + void))
>
> /*
> * dbconvert - miscellaneous conversion routines
> @@ -306,6 +310,10 @@ AcpiDbDumpNamespace (
> char *DepthArg);
>
> void
> +AcpiDbDumpNamespacePaths (
> + void);
> +
> +void
> AcpiDbDumpNamespaceByOwner (
> char *OwnerArg,
> char *DepthArg);
> @@ -457,6 +465,10 @@ char *
> AcpiDbGetFromHistory (
> char *CommandNumArg);
>
> +char *
> +AcpiDbGetHistoryByIndex (
> + UINT32 CommanddNum);
> +
>
> /*
> * dbinput - user front-end to the AML debugger
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index d328c2b..571efce 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -766,6 +766,9 @@ void
> AcpiDmUnresolvedWarning (
> UINT8 Type);
>
> +void
> +AcpiDmGetExternalsFromFile (
> + void);
>
> /*
> * dmresrc
> diff --git a/src/acpica/source/include/acevents.h b/src/acpica/source/include/acevents.h
> index 7ffdcc2..3205113 100644
> --- a/src/acpica/source/include/acevents.h
> +++ b/src/acpica/source/include/acevents.h
> @@ -411,17 +411,17 @@ AcpiEvGpeXruptHandler (
> void *Context);
>
> UINT32
> +AcpiEvSciDispatch (
> + void);
> +
> +UINT32
> AcpiEvInstallSciHandler (
> void);
>
> ACPI_STATUS
> -AcpiEvRemoveSciHandler (
> +AcpiEvRemoveAllSciHandlers (
> void);
>
> -UINT32
> -AcpiEvInitializeSCI (
> - UINT32 ProgramSCI);
> -
> ACPI_HW_DEPENDENT_RETURN_VOID (
> void
> AcpiEvTerminate (
> diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index 754df74..69feb53 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/source/include/acexcep.h
> @@ -199,8 +199,9 @@ typedef struct acpi_exception_info
> #define AE_NO_HANDLER EXCEP_ENV (0x001A)
> #define AE_OWNER_ID_LIMIT EXCEP_ENV (0x001B)
> #define AE_NOT_CONFIGURED EXCEP_ENV (0x001C)
> +#define AE_ACCESS EXCEP_ENV (0x001D)
>
> -#define AE_CODE_ENV_MAX 0x001C
> +#define AE_CODE_ENV_MAX 0x001D
>
>
> /*
> @@ -307,7 +308,7 @@ static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Env[] =
> EXCEP_TXT ("AE_NO_ACPI_TABLES", "ACPI tables could not be found"),
> EXCEP_TXT ("AE_NO_NAMESPACE", "A namespace has not been loaded"),
> EXCEP_TXT ("AE_NO_MEMORY", "Insufficient dynamic memory"),
> - EXCEP_TXT ("AE_NOT_FOUND", "The name was not found in the namespace"),
> + EXCEP_TXT ("AE_NOT_FOUND", "A requested entity is not found"),
> EXCEP_TXT ("AE_NOT_EXIST", "A required entity does not exist"),
> EXCEP_TXT ("AE_ALREADY_EXISTS", "An entity already exists"),
> EXCEP_TXT ("AE_TYPE", "The object type is incorrect"),
> @@ -330,7 +331,8 @@ static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Env[] =
> EXCEP_TXT ("AE_SAME_HANDLER", "Attempt was made to install the same handler that is already installed"),
> 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_NOT_CONFIGURED", "The interface is not part of the current subsystem configuration"),
> + EXCEP_TXT ("AE_ACCESS", "Permission denied for the requested operation")
> };
>
> 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 9056b6d..b9ebec5 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -346,6 +346,7 @@ ACPI_EXTERN ACPI_TABLE_HANDLER AcpiGbl_TableHandler;
> ACPI_EXTERN void *AcpiGbl_TableHandlerContext;
> ACPI_EXTERN ACPI_WALK_STATE *AcpiGbl_BreakpointWalk;
> ACPI_EXTERN ACPI_INTERFACE_HANDLER AcpiGbl_InterfaceHandler;
> +ACPI_EXTERN ACPI_SCI_HANDLER_INFO *AcpiGbl_SciHandlerList;
>
> /* Owner ID support */
>
> @@ -525,13 +526,6 @@ ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_tables;
> ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_stats;
> ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_ini_methods;
> ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_NoRegionSupport;
> -
> -ACPI_EXTERN char *AcpiGbl_DbArgs[ACPI_DEBUGGER_MAX_ARGS];
> -ACPI_EXTERN ACPI_OBJECT_TYPE AcpiGbl_DbArgTypes[ACPI_DEBUGGER_MAX_ARGS];
> -ACPI_EXTERN char AcpiGbl_DbLineBuf[ACPI_DB_LINE_BUFFER_SIZE];
> -ACPI_EXTERN char AcpiGbl_DbParsedBuf[ACPI_DB_LINE_BUFFER_SIZE];
> -ACPI_EXTERN char AcpiGbl_DbScopeBuf[80];
> -ACPI_EXTERN char AcpiGbl_DbDebugFilename[80];
> ACPI_EXTERN BOOLEAN AcpiGbl_DbOutputToFile;
> ACPI_EXTERN char *AcpiGbl_DbBuffer;
> ACPI_EXTERN char *AcpiGbl_DbFilename;
> @@ -539,6 +533,16 @@ ACPI_EXTERN UINT32 AcpiGbl_DbDebugLevel;
> ACPI_EXTERN UINT32 AcpiGbl_DbConsoleDebugLevel;
> ACPI_EXTERN ACPI_NAMESPACE_NODE *AcpiGbl_DbScopeNode;
>
> +ACPI_EXTERN char *AcpiGbl_DbArgs[ACPI_DEBUGGER_MAX_ARGS];
> +ACPI_EXTERN ACPI_OBJECT_TYPE AcpiGbl_DbArgTypes[ACPI_DEBUGGER_MAX_ARGS];
> +
> +/* These buffers should all be the same size */
> +
> +ACPI_EXTERN char AcpiGbl_DbLineBuf[ACPI_DB_LINE_BUFFER_SIZE];
> +ACPI_EXTERN char AcpiGbl_DbParsedBuf[ACPI_DB_LINE_BUFFER_SIZE];
> +ACPI_EXTERN char AcpiGbl_DbScopeBuf[ACPI_DB_LINE_BUFFER_SIZE];
> +ACPI_EXTERN char AcpiGbl_DbDebugFilename[ACPI_DB_LINE_BUFFER_SIZE];
> +
> /*
> * Statistic globals
> */
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index e45b9f5..37c46b2 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -525,6 +525,16 @@ typedef struct acpi_simple_repair_info
> *
> ****************************************************************************/
>
> +/* Dispatch info for each host-installed SCI handler */
> +
> +typedef struct acpi_sci_handler_info
> +{
> + struct acpi_sci_handler_info *Next;
> + ACPI_SCI_HANDLER Address; /* Address of handler */
> + void *Context; /* Context to be passed to handler */
> +
> +} ACPI_SCI_HANDLER_INFO;
> +
> /* Dispatch info for each GPE -- either a method or handler, cannot be both */
>
> typedef struct acpi_gpe_handler_info
> @@ -1289,7 +1299,8 @@ typedef struct acpi_external_list
>
> /* Values for Flags field above */
>
> -#define ACPI_IPATH_ALLOCATED 0x01
> +#define ACPI_IPATH_ALLOCATED 0x01
> +#define ACPI_FROM_REFERENCE_FILE 0x02
>
>
> typedef struct acpi_external_file
> @@ -1320,7 +1331,7 @@ typedef struct acpi_db_method_info
> char *Name;
> UINT32 Flags;
> UINT32 NumLoops;
> - char Pathname[128];
> + char Pathname[ACPI_DB_LINE_BUFFER_SIZE];
> char **Args;
> ACPI_OBJECT_TYPE *Types;
>
> @@ -1347,6 +1358,7 @@ typedef struct acpi_integrity_info
> } ACPI_INTEGRITY_INFO;
>
>
> +#define ACPI_DB_DISABLE_OUTPUT 0x00
> #define ACPI_DB_REDIRECTABLE_OUTPUT 0x01
> #define ACPI_DB_CONSOLE_OUTPUT 0x02
> #define ACPI_DB_DUPLICATE_OUTPUT 0x03
> diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
> index f53c317..67fd89c 100644
> --- a/src/acpica/source/include/acmacros.h
> +++ b/src/acpica/source/include/acmacros.h
> @@ -487,32 +487,6 @@
>
>
> /*
> - * Memory allocation tracking (DEBUG ONLY)
> - */
> -#define ACPI_MEM_PARAMETERS _COMPONENT, _AcpiModuleName, __LINE__
> -
> -#ifndef ACPI_DBG_TRACK_ALLOCATIONS
> -
> -/* Memory allocation */
> -
> -#define ACPI_ALLOCATE(a) AcpiUtAllocate((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS)
> -#define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroed((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS)
> -#define ACPI_FREE(a) AcpiOsFree(a)
> -#define ACPI_MEM_TRACKING(a)
> -
> -#else
> -
> -/* Memory allocation */
> -
> -#define ACPI_ALLOCATE(a) AcpiUtAllocateAndTrack((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS)
> -#define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroedAndTrack((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS)
> -#define ACPI_FREE(a) AcpiUtFreeAndTrack(a, ACPI_MEM_PARAMETERS)
> -#define ACPI_MEM_TRACKING(a) a
> -
> -#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
> -
> -
> -/*
> * Macros used for ACPICA utilities only
> */
>
> diff --git a/src/acpica/source/include/acnames.h b/src/acpica/source/include/acnames.h
> index f9e651b..99eb36a 100644
> --- a/src/acpica/source/include/acnames.h
> +++ b/src/acpica/source/include/acnames.h
> @@ -118,24 +118,25 @@
>
> /* Method names - these methods can appear anywhere in the namespace */
>
> -#define METHOD_NAME__SB_ "_SB_"
> -#define METHOD_NAME__HID "_HID"
> -#define METHOD_NAME__CID "_CID"
> -#define METHOD_NAME__UID "_UID"
> -#define METHOD_NAME__SUB "_SUB"
> #define METHOD_NAME__ADR "_ADR"
> -#define METHOD_NAME__INI "_INI"
> -#define METHOD_NAME__STA "_STA"
> -#define METHOD_NAME__REG "_REG"
> -#define METHOD_NAME__SEG "_SEG"
> +#define METHOD_NAME__AEI "_AEI"
> #define METHOD_NAME__BBN "_BBN"
> -#define METHOD_NAME__PRT "_PRT"
> +#define METHOD_NAME__CBA "_CBA"
> +#define METHOD_NAME__CID "_CID"
> #define METHOD_NAME__CRS "_CRS"
> +#define METHOD_NAME__HID "_HID"
> +#define METHOD_NAME__INI "_INI"
> +#define METHOD_NAME__PLD "_PLD"
> #define METHOD_NAME__PRS "_PRS"
> -#define METHOD_NAME__AEI "_AEI"
> +#define METHOD_NAME__PRT "_PRT"
> #define METHOD_NAME__PRW "_PRW"
> +#define METHOD_NAME__REG "_REG"
> +#define METHOD_NAME__SB_ "_SB_"
> +#define METHOD_NAME__SEG "_SEG"
> #define METHOD_NAME__SRS "_SRS"
> -#define METHOD_NAME__PLD "_PLD"
> +#define METHOD_NAME__STA "_STA"
> +#define METHOD_NAME__SUB "_SUB"
> +#define METHOD_NAME__UID "_UID"
>
> /* Method names - these methods must appear at the namespace root */
>
> diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
> index 74575ba..7489e59 100644
> --- a/src/acpica/source/include/acnamesp.h
> +++ b/src/acpica/source/include/acnamesp.h
> @@ -344,6 +344,14 @@ AcpiNsDumpObjects (
> ACPI_OWNER_ID OwnerId,
> ACPI_HANDLE StartHandle);
>
> +void
> +AcpiNsDumpObjectPaths (
> + ACPI_OBJECT_TYPE Type,
> + UINT8 DisplayType,
> + UINT32 MaxDepth,
> + ACPI_OWNER_ID OwnerId,
> + ACPI_HANDLE StartHandle);
> +
>
> /*
> * nseval - Namespace evaluation functions
> diff --git a/src/acpica/source/include/acpiosxf.h b/src/acpica/source/include/acpiosxf.h
> index 32578fe..627c59e 100644
> --- a/src/acpica/source/include/acpiosxf.h
> +++ b/src/acpica/source/include/acpiosxf.h
> @@ -6,7 +6,6 @@
> *
> *****************************************************************************/
>
> -
> /******************************************************************************
> *
> * 1. Copyright Notice
> @@ -32,8 +31,7 @@
> * 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 exer
> - se the above copyright
> + * 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;
> @@ -158,85 +156,111 @@ typedef struct acpi_signal_fatal_info
> /*
> * OSL Initialization and shutdown primitives
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInitialize
> ACPI_STATUS
> AcpiOsInitialize (
> void);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTerminate
> ACPI_STATUS
> AcpiOsTerminate (
> void);
> +#endif
>
>
> /*
> * ACPI Table interfaces
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetRootPointer
> ACPI_PHYSICAL_ADDRESS
> AcpiOsGetRootPointer (
> void);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsPredefinedOverride
> ACPI_STATUS
> AcpiOsPredefinedOverride (
> const ACPI_PREDEFINED_NAMES *InitVal,
> ACPI_STRING *NewVal);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTableOverride
> ACPI_STATUS
> AcpiOsTableOverride (
> ACPI_TABLE_HEADER *ExistingTable,
> ACPI_TABLE_HEADER **NewTable);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsPhysicalTableOverride
> ACPI_STATUS
> AcpiOsPhysicalTableOverride (
> ACPI_TABLE_HEADER *ExistingTable,
> ACPI_PHYSICAL_ADDRESS *NewAddress,
> UINT32 *NewTableLength);
> +#endif
>
>
> /*
> * Spinlock primitives
> */
> -#ifndef AcpiOsCreateLock
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateLock
> ACPI_STATUS
> AcpiOsCreateLock (
> ACPI_SPINLOCK *OutHandle);
> #endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsDeleteLock
> void
> AcpiOsDeleteLock (
> ACPI_SPINLOCK Handle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireLock
> ACPI_CPU_FLAGS
> AcpiOsAcquireLock (
> ACPI_SPINLOCK Handle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReleaseLock
> void
> AcpiOsReleaseLock (
> ACPI_SPINLOCK Handle,
> ACPI_CPU_FLAGS Flags);
> +#endif
>
>
> /*
> * Semaphore primitives
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateSemaphore
> ACPI_STATUS
> AcpiOsCreateSemaphore (
> UINT32 MaxUnits,
> UINT32 InitialUnits,
> ACPI_SEMAPHORE *OutHandle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsDeleteSemaphore
> ACPI_STATUS
> AcpiOsDeleteSemaphore (
> ACPI_SEMAPHORE Handle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWaitSemaphore
> ACPI_STATUS
> AcpiOsWaitSemaphore (
> ACPI_SEMAPHORE Handle,
> UINT32 Units,
> UINT16 Timeout);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsSignalSemaphore
> ACPI_STATUS
> AcpiOsSignalSemaphore (
> ACPI_SEMAPHORE Handle,
> UINT32 Units);
> +#endif
>
>
> /*
> @@ -245,151 +269,208 @@ AcpiOsSignalSemaphore (
> */
> #if (ACPI_MUTEX_TYPE != ACPI_BINARY_SEMAPHORE)
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateMutex
> ACPI_STATUS
> AcpiOsCreateMutex (
> ACPI_MUTEX *OutHandle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsDeleteMutex
> void
> AcpiOsDeleteMutex (
> ACPI_MUTEX Handle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireMutex
> ACPI_STATUS
> AcpiOsAcquireMutex (
> ACPI_MUTEX Handle,
> UINT16 Timeout);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReleaseMutex
> void
> AcpiOsReleaseMutex (
> ACPI_MUTEX Handle);
> #endif
>
> +#endif
> +
>
> /*
> * Memory allocation and mapping
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocate
> void *
> AcpiOsAllocate (
> ACPI_SIZE Size);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocateZeroed
> +void *
> +AcpiOsAllocateZeroed (
> + ACPI_SIZE Size);
> +#endif
> +
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsFree
> void
> AcpiOsFree (
> void * Memory);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsMapMemory
> void *
> AcpiOsMapMemory (
> ACPI_PHYSICAL_ADDRESS Where,
> ACPI_SIZE Length);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsUnmapMemory
> void
> AcpiOsUnmapMemory (
> void *LogicalAddress,
> ACPI_SIZE Size);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetPhysicalAddress
> ACPI_STATUS
> AcpiOsGetPhysicalAddress (
> void *LogicalAddress,
> ACPI_PHYSICAL_ADDRESS *PhysicalAddress);
> +#endif
>
>
> /*
> * Memory/Object Cache
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateCache
> ACPI_STATUS
> AcpiOsCreateCache (
> char *CacheName,
> UINT16 ObjectSize,
> UINT16 MaxDepth,
> ACPI_CACHE_T **ReturnCache);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsDeleteCache
> ACPI_STATUS
> AcpiOsDeleteCache (
> ACPI_CACHE_T *Cache);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsPurgeCache
> ACPI_STATUS
> AcpiOsPurgeCache (
> ACPI_CACHE_T *Cache);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireObject
> void *
> AcpiOsAcquireObject (
> ACPI_CACHE_T *Cache);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReleaseObject
> ACPI_STATUS
> AcpiOsReleaseObject (
> ACPI_CACHE_T *Cache,
> void *Object);
> +#endif
>
>
> /*
> * Interrupt handlers
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInstallInterruptHandler
> ACPI_STATUS
> AcpiOsInstallInterruptHandler (
> UINT32 InterruptNumber,
> ACPI_OSD_HANDLER ServiceRoutine,
> void *Context);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRemoveInterruptHandler
> ACPI_STATUS
> AcpiOsRemoveInterruptHandler (
> UINT32 InterruptNumber,
> ACPI_OSD_HANDLER ServiceRoutine);
> +#endif
>
>
> /*
> * Threads and Scheduling
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetThreadId
> ACPI_THREAD_ID
> AcpiOsGetThreadId (
> void);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsExecute
> ACPI_STATUS
> AcpiOsExecute (
> ACPI_EXECUTE_TYPE Type,
> ACPI_OSD_EXEC_CALLBACK Function,
> void *Context);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWaitEventsComplete
> void
> AcpiOsWaitEventsComplete (
> void);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsSleep
> void
> AcpiOsSleep (
> UINT64 Milliseconds);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsStall
> void
> AcpiOsStall (
> UINT32 Microseconds);
> +#endif
>
>
> /*
> * Platform and hardware-independent I/O interfaces
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadPort
> ACPI_STATUS
> AcpiOsReadPort (
> ACPI_IO_ADDRESS Address,
> UINT32 *Value,
> UINT32 Width);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritePort
> ACPI_STATUS
> AcpiOsWritePort (
> ACPI_IO_ADDRESS Address,
> UINT32 Value,
> UINT32 Width);
> +#endif
>
>
> /*
> * Platform and hardware-independent physical memory interfaces
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadMemory
> ACPI_STATUS
> AcpiOsReadMemory (
> ACPI_PHYSICAL_ADDRESS Address,
> UINT64 *Value,
> UINT32 Width);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWriteMemory
> ACPI_STATUS
> AcpiOsWriteMemory (
> ACPI_PHYSICAL_ADDRESS Address,
> UINT64 Value,
> UINT32 Width);
> +#endif
>
>
> /*
> @@ -397,102 +478,131 @@ AcpiOsWriteMemory (
> * Note: Can't use "Register" as a parameter, changed to "Reg" --
> * certain compilers complain.
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadPciConfiguration
> ACPI_STATUS
> AcpiOsReadPciConfiguration (
> ACPI_PCI_ID *PciId,
> UINT32 Reg,
> UINT64 *Value,
> UINT32 Width);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritePciConfiguration
> ACPI_STATUS
> AcpiOsWritePciConfiguration (
> ACPI_PCI_ID *PciId,
> UINT32 Reg,
> UINT64 Value,
> UINT32 Width);
> +#endif
>
>
> /*
> * Miscellaneous
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadable
> BOOLEAN
> AcpiOsReadable (
> void *Pointer,
> ACPI_SIZE Length);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritable
> BOOLEAN
> AcpiOsWritable (
> void *Pointer,
> ACPI_SIZE Length);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTimer
> UINT64
> AcpiOsGetTimer (
> void);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsSignal
> ACPI_STATUS
> AcpiOsSignal (
> UINT32 Function,
> void *Info);
> +#endif
>
>
> /*
> * Debug print routines
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsPrintf
> void ACPI_INTERNAL_VAR_XFACE
> AcpiOsPrintf (
> const char *Format,
> ...);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsVprintf
> void
> AcpiOsVprintf (
> const char *Format,
> va_list Args);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
> void
> AcpiOsRedirectOutput (
> void *Destination);
> +#endif
>
>
> /*
> * Debug input
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
> ACPI_STATUS
> AcpiOsGetLine (
> char *Buffer,
> UINT32 BufferLength,
> UINT32 *BytesRead);
> +#endif
>
>
> /*
> * Obtain ACPI table(s)
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
> ACPI_STATUS
> AcpiOsGetTableByName (
> char *Signature,
> UINT32 Instance,
> ACPI_TABLE_HEADER **Table,
> ACPI_PHYSICAL_ADDRESS *Address);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
> ACPI_STATUS
> AcpiOsGetTableByIndex (
> UINT32 Index,
> ACPI_TABLE_HEADER **Table,
> + UINT32 *Instance,
> ACPI_PHYSICAL_ADDRESS *Address);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress
> ACPI_STATUS
> AcpiOsGetTableByAddress (
> ACPI_PHYSICAL_ADDRESS Address,
> ACPI_TABLE_HEADER **Table);
> +#endif
>
>
> /*
> * Directory manipulation
> */
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenDirectory
> void *
> AcpiOsOpenDirectory (
> char *Pathname,
> char *WildcardSpec,
> char RequestedFileType);
> +#endif
>
> /* RequesteFileType values */
>
> @@ -500,13 +610,17 @@ AcpiOsOpenDirectory (
> #define REQUEST_DIR_ONLY 1
>
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetNextFilename
> char *
> AcpiOsGetNextFilename (
> void *DirHandle);
> +#endif
>
> +#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseDirectory
> void
> AcpiOsCloseDirectory (
> void *DirHandle);
> +#endif
>
>
> #endif /* __ACPIOSXF_H__ */
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 3971f57..cbcf400 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -119,7 +119,7 @@
>
> /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION 0x20130725
> +#define ACPI_CA_VERSION 0x20130927
>
> #include "acconfig.h"
> #include "actypes.h"
> @@ -178,7 +178,7 @@ extern UINT8 AcpiGbl_DisableSsdtTableLoad;
> static ACPI_INLINE Prototype {return(AE_OK);}
>
> #define ACPI_HW_DEPENDENT_RETURN_VOID(Prototype) \
> - static ACPI_INLINE Prototype {}
> + static ACPI_INLINE Prototype {return;}
>
> #endif /* !ACPI_REDUCED_HARDWARE */
>
> @@ -267,21 +267,6 @@ AcpiDecodePldBuffer (
> ACPI_SIZE Length,
> ACPI_PLD_INFO **ReturnBuffer);
>
> -/*
> - * ACPI Memory management
> - */
> -void *
> -AcpiAllocate (
> - UINT32 Size);
> -
> -void *
> -AcpiCallocate (
> - UINT32 Size);
> -
> -void
> -AcpiFree (
> - void *Address);
> -
>
> /*
> * ACPI table load/unload interfaces
> @@ -449,6 +434,17 @@ AcpiInstallInitializationHandler (
>
> ACPI_HW_DEPENDENT_RETURN_STATUS (
> ACPI_STATUS
> +AcpiInstallSciHandler (
> + ACPI_SCI_HANDLER Address,
> + void *Context))
> +
> +ACPI_HW_DEPENDENT_RETURN_STATUS (
> +ACPI_STATUS
> +AcpiRemoveSciHandler (
> + ACPI_SCI_HANDLER Address))
> +
> +ACPI_HW_DEPENDENT_RETURN_STATUS (
> +ACPI_STATUS
> AcpiInstallGlobalEventHandler (
> ACPI_GBL_EVENT_HANDLER Handler,
> void *Context))
> @@ -827,48 +823,54 @@ AcpiGetTimerDuration (
> /*
> * Error/Warning output
> */
> +ACPI_PRINTF_LIKE(3)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiError (
> const char *ModuleName,
> UINT32 LineNumber,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(3);
> + ...);
>
> +ACPI_PRINTF_LIKE(4)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiException (
> const char *ModuleName,
> UINT32 LineNumber,
> ACPI_STATUS Status,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(4);
> + ...);
>
> +ACPI_PRINTF_LIKE(3)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiWarning (
> const char *ModuleName,
> UINT32 LineNumber,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(3);
> + ...);
>
> +ACPI_PRINTF_LIKE(3)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiInfo (
> const char *ModuleName,
> UINT32 LineNumber,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(3);
> + ...);
>
> +ACPI_PRINTF_LIKE(3)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiBiosError (
> const char *ModuleName,
> UINT32 LineNumber,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(3);
> + ...);
>
> +ACPI_PRINTF_LIKE(3)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiBiosWarning (
> const char *ModuleName,
> UINT32 LineNumber,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(3);
> + ...);
>
>
> /*
> @@ -876,6 +878,7 @@ AcpiBiosWarning (
> */
> #ifdef ACPI_DEBUG_OUTPUT
>
> +ACPI_PRINTF_LIKE(6)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiDebugPrint (
> UINT32 RequestedDebugLevel,
> @@ -884,8 +887,9 @@ AcpiDebugPrint (
> const char *ModuleName,
> UINT32 ComponentId,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(6);
> + ...);
>
> +ACPI_PRINTF_LIKE(6)
> void ACPI_INTERNAL_VAR_XFACE
> AcpiDebugPrintRaw (
> UINT32 RequestedDebugLevel,
> @@ -894,7 +898,7 @@ AcpiDebugPrintRaw (
> const char *ModuleName,
> UINT32 ComponentId,
> const char *Format,
> - ...) ACPI_PRINTF_LIKE(6);
> + ...);
> #endif
>
> #endif /* __ACXFACE_H__ */
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index efe1e91..072b946 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -375,9 +375,18 @@ typedef UINT32 ACPI_PHYSICAL_ADDRESS;
> #endif
>
> /*
> - * All ACPICA functions that are available to the rest of the kernel are
> - * tagged with this macro which can be defined as appropriate for the host.
> + * All ACPICA external functions that are available to the rest of the kernel
> + * are tagged with thes macros which can be defined as appropriate for the host.
> + *
> + * Notes:
> + * ACPI_EXPORT_SYMBOL_INIT is used for initialization and termination
> + * interfaces that may need special processing.
> + * ACPI_EXPORT_SYMBOL is used for all other public external functions.
> */
> +#ifndef ACPI_EXPORT_SYMBOL_INIT
> +#define ACPI_EXPORT_SYMBOL_INIT(Symbol)
> +#endif
> +
> #ifndef ACPI_EXPORT_SYMBOL
> #define ACPI_EXPORT_SYMBOL(Symbol)
> #endif
> @@ -391,6 +400,34 @@ typedef UINT32 ACPI_PHYSICAL_ADDRESS;
> #endif
>
>
> +/*******************************************************************************
> + *
> + * Configuration
> + *
> + ******************************************************************************/
> +
> +#ifdef ACPI_DBG_TRACK_ALLOCATIONS
> +/*
> + * Memory allocation tracking (used by AcpiExec to detect memory leaks)
> + */
> +#define ACPI_MEM_PARAMETERS _COMPONENT, _AcpiModuleName, __LINE__
> +#define ACPI_ALLOCATE(a) AcpiUtAllocateAndTrack ((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS)
> +#define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroedAndTrack ((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS)
> +#define ACPI_FREE(a) AcpiUtFreeAndTrack (a, ACPI_MEM_PARAMETERS)
> +#define ACPI_MEM_TRACKING(a) a
> +
> +#else
> +/*
> + * Normal memory allocation directly via the OS services layer
> + */
> +#define ACPI_ALLOCATE(a) AcpiOsAllocate ((ACPI_SIZE) (a))
> +#define ACPI_ALLOCATE_ZEROED(a) AcpiOsAllocateZeroed ((ACPI_SIZE) (a))
> +#define ACPI_FREE(a) AcpiOsFree (a)
> +#define ACPI_MEM_TRACKING(a)
> +
> +#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
> +
> +
> /******************************************************************************
> *
> * ACPI Specification constants (Do not change unless the specification changes)
> @@ -407,6 +444,7 @@ typedef UINT32 ACPI_PHYSICAL_ADDRESS;
> #define ACPI_PM1_REGISTER_WIDTH 16
> #define ACPI_PM2_REGISTER_WIDTH 8
> #define ACPI_PM_TIMER_WIDTH 32
> +#define ACPI_RESET_REGISTER_WIDTH 8
>
> /* Names within the namespace are 4 bytes long */
>
> @@ -560,6 +598,11 @@ typedef UINT64 ACPI_INTEGER;
> #define ACPI_MOVE_NAME(dest,src) (ACPI_STRNCPY (ACPI_CAST_PTR (char, (dest)), ACPI_CAST_PTR (char, (src)), ACPI_NAME_SIZE))
> #endif
>
> +/* Support for the special RSDP signature (8 characters) */
> +
> +#define ACPI_VALIDATE_RSDP_SIG(a) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
> +#define ACPI_MAKE_RSDP_SIG(dest) (ACPI_MEMCPY (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
> +
>
> /*******************************************************************************
> *
> @@ -1078,6 +1121,10 @@ typedef void
> * Various handlers and callback procedures
> */
> typedef
> +UINT32 (*ACPI_SCI_HANDLER) (
> + void *Context);
> +
> +typedef
> void (*ACPI_GBL_EVENT_HANDLER) (
> UINT32 EventType,
> ACPI_HANDLE Device,
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index e6ae828..442600d 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -998,6 +998,27 @@ void
> AcpiUtRepairName (
> char *Name);
>
> +#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
> +BOOLEAN
> +AcpiUtSafeStrcpy (
> + char *Dest,
> + ACPI_SIZE DestSize,
> + char *Source);
> +
> +BOOLEAN
> +AcpiUtSafeStrcat (
> + char *Dest,
> + ACPI_SIZE DestSize,
> + char *Source);
> +
> +BOOLEAN
> +AcpiUtSafeStrncat (
> + char *Dest,
> + ACPI_SIZE DestSize,
> + char *Source,
> + ACPI_SIZE MaxTransferLength);
> +#endif
> +
>
> /*
> * utmutex - mutex support
> @@ -1039,20 +1060,6 @@ AcpiUtInitializeBuffer (
> ACPI_BUFFER *Buffer,
> ACPI_SIZE RequiredLength);
>
> -void *
> -AcpiUtAllocate (
> - ACPI_SIZE Size,
> - UINT32 Component,
> - const char *Module,
> - UINT32 Line);
> -
> -void *
> -AcpiUtAllocateZeroed (
> - ACPI_SIZE Size,
> - UINT32 Component,
> - const char *Module,
> - UINT32 Line);
> -
> #ifdef ACPI_DBG_TRACK_ALLOCATIONS
> void *
> AcpiUtAllocateAndTrack (
> diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
> index 6ff7743..2c7bd0b 100644
> --- a/src/acpica/source/include/platform/acgcc.h
> +++ b/src/acpica/source/include/platform/acgcc.h
> @@ -120,7 +120,7 @@
>
> /* Function name is used for debug output. Non-ANSI, compiler-dependent */
>
> -#define ACPI_GET_FUNCTION_NAME __FUNCTION__
> +#define ACPI_GET_FUNCTION_NAME __func__
>
> /*
> * This macro is used to tag functions as "printf-like" because
> diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
> index 1177c84..15c1748 100644
> --- a/src/acpica/source/include/platform/aclinux.h
> +++ b/src/acpica/source/include/platform/aclinux.h
> @@ -183,13 +183,22 @@
>
> #ifdef __KERNEL__
> #include <acpi/actypes.h>
> +
> +ACPI_STATUS __init AcpiOsInitialize (
> + void);
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsInitialize
> +
> +ACPI_STATUS __exit AcpiOsTerminate (
> + void);
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsTerminate
> +
> /*
> - * Overrides for in-kernel ACPICA
> + * Memory allocation/deallocation
> */
> -static inline acpi_thread_id acpi_os_get_thread_id(void)
> -{
> - return (ACPI_THREAD_ID) (unsigned long) current;
> -}
> +
> +/* Use native linux version of acpi_os_allocate_zeroed */
> +
> +#define USE_NATIVE_ALLOCATE_ZEROED
>
> /*
> * The irqs_disabled() check is for resume from RAM.
> @@ -197,25 +206,49 @@ static inline acpi_thread_id acpi_os_get_thread_id(void)
> * However, boot has (system_state != SYSTEM_RUNNING)
> * to quiet __might_sleep() in kmalloc() and resume does not.
> */
> -static inline void *acpi_os_allocate(acpi_size size)
> +static inline void *
> +AcpiOsAllocate (
> + ACPI_SIZE Size)
> {
> - return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
> + return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
> }
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocate
>
> -static inline void *acpi_os_allocate_zeroed(acpi_size size)
> +static inline void *
> +AcpiOsAllocateZeroed (
> + ACPI_SIZE Size)
> {
> - return kzalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
> + return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
> }
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsAllocateZeroed
>
> -static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
> +static inline void
> +AcpiOsFree (
> + void *Memory)
> {
> - return kmem_cache_zalloc(cache,
> - irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
> + kfree (Memory);
> }
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsFree
>
> -#define ACPI_ALLOCATE(a) acpi_os_allocate(a)
> -#define ACPI_ALLOCATE_ZEROED(a) acpi_os_allocate_zeroed(a)
> -#define ACPI_FREE(a) kfree(a)
> +static inline void *
> +AcpiOsAcquireObject (
> + ACPI_CACHE_T *Cache)
> +{
> + return kmem_cache_zalloc (Cache,
> + irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
> +}
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsAcquireObject
> +
> +/*
> + * Overrides for in-kernel ACPICA
> + */
> +static inline ACPI_THREAD_ID
> +AcpiOsGetThreadId (
> + void)
> +{
> + return (ACPI_THREAD_ID) (unsigned long) current;
> +}
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetThreadId
>
> #ifndef CONFIG_PREEMPT
> /*
> @@ -236,16 +269,48 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
> * all locks to the name of the argument of acpi_os_create_lock(), which
> * prevents lockdep from reporting false positives for ACPICA locks.
> */
> -#define AcpiOsCreateLock(__handle) \
> -({ \
> - spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \
> - \
> - if (lock) { \
> - *(__handle) = lock; \
> - spin_lock_init(*(__handle)); \
> - } \
> - lock ? AE_OK : AE_NO_MEMORY; \
> +#define AcpiOsCreateLock(__Handle) \
> +({ \
> + spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
> + if (Lock) { \
> + *(__Handle) = Lock; \
> + spin_lock_init(*(__Handle)); \
> + } \
> + Lock ? AE_OK : AE_NO_MEMORY; \
> })
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsCreateLock
> +
> +void __iomem *
> +AcpiOsMapMemory (
> + ACPI_PHYSICAL_ADDRESS Where,
> + ACPI_SIZE Length);
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsMapMemory
> +
> +void
> +AcpiOsUnmapMemory (
> + void __iomem *LogicalAddress,
> + ACPI_SIZE Size);
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsUnmapMemory
> +
> +/* OSL interfaces used by debugger/disassembler */
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsReadable
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsWritable
> +
> +/* OSL interfaces used by utilities */
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsRedirectOutput
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetLine
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByName
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByIndex
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetTableByAddress
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsOpenDirectory
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsGetNextFilename
> +#define ACPI_USE_NATIVE_DECLARED_AcpiOsCloseDirectory
> +
> +/* OSL interfaces added by Linux */
> +
> +#ifdef EXPORT_ACPI_INTERFACES
> +#include <linux/export.h>
> +#endif
>
> #endif /* __KERNEL__ */
>
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index 4be7b9b..7aa4168 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -139,6 +139,7 @@
>
> extern FILE *AcpiGbl_DebugFile;
> FILE *AcpiGbl_OutputFile;
> +BOOLEAN AcpiGbl_DebugTimeout = FALSE;
>
>
> /* Upcalls to AcpiExec */
> @@ -156,7 +157,101 @@ typedef void* (*PTHREAD_CALLBACK) (void *);
>
> /* Buffer used by AcpiOsVprintf */
>
> -#define ACPI_VPRINTF_BUFFER_SIZE 512
> +#define ACPI_VPRINTF_BUFFER_SIZE 512
> +#define _ASCII_NEWLINE '\n'
> +
> +/* Terminal support for AcpiExec only */
> +
> +#ifdef ACPI_EXEC_APP
> +#include <termio.h>
> +
> +struct termios OriginalTermAttributes;
> +
> +ACPI_STATUS
> +AcpiUtReadLine (
> + char *Buffer,
> + UINT32 BufferLength,
> + UINT32 *BytesRead);
> +
> +static void
> +OsEnterLineEditMode (
> + void);
> +
> +static void
> +OsExitLineEditMode (
> + void);
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: OsEnterLineEditMode, OsExitLineEditMode
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Enter/Exit the raw character input mode for the terminal.
> + *
> + * Interactive line-editing support for the AML debugger. Used with the
> + * common/acgetline module.
> + *
> + * readline() is not used because of non-portability. It is not available
> + * on all systems, and if it is, often the package must be manually installed.
> + *
> + * Therefore, we use the POSIX tcgetattr/tcsetattr and do the minimal line
> + * editing that we need in AcpiOsGetLine.
> + *
> + * If the POSIX tcgetattr/tcsetattr interfaces are unavailable, these
> + * calls will also work:
> + * For OsEnterLineEditMode: system ("stty cbreak -echo")
> + * For OsExitLineEditMode: system ("stty cooked echo")
> + *
> + *****************************************************************************/
> +
> +static void
> +OsEnterLineEditMode (
> + void)
> +{
> + struct termios LocalTermAttributes;
> +
> +
> + /* Get and keep the original attributes */
> +
> + if (tcgetattr (STDIN_FILENO, &OriginalTermAttributes))
> + {
> + fprintf (stderr, "Could not get/set terminal attributes!\n");
> + return;
> + }
> +
> + /* Set the new attributes to enable raw character input */
> +
> + memcpy (&LocalTermAttributes, &OriginalTermAttributes,
> + sizeof (struct termios));
> +
> + LocalTermAttributes.c_lflag &= ~(ICANON | ECHO);
> + LocalTermAttributes.c_cc[VMIN] = 1;
> + LocalTermAttributes.c_cc[VTIME] = 0;
> +
> + tcsetattr (STDIN_FILENO, TCSANOW, &LocalTermAttributes);
> +}
> +
> +static void
> +OsExitLineEditMode (
> + void)
> +{
> + /* Set terminal attributes back to the original values */
> +
> + tcsetattr (STDIN_FILENO, TCSANOW, &OriginalTermAttributes);
> +}
> +
> +
> +#else
> +
> +/* These functions are not needed for other ACPICA utilities */
> +
> +#define OsEnterLineEditMode()
> +#define OsExitLineEditMode()
> +#endif
>
>
> /******************************************************************************
> @@ -167,7 +262,7 @@ typedef void* (*PTHREAD_CALLBACK) (void *);
> *
> * RETURN: Status
> *
> - * DESCRIPTION: Init and terminate. Nothing to do.
> + * DESCRIPTION: Initialize and terminate this module.
> *
> *****************************************************************************/
>
> @@ -177,15 +272,17 @@ AcpiOsInitialize (
> {
>
> AcpiGbl_OutputFile = stdout;
> +
> + OsEnterLineEditMode ();
> return (AE_OK);
> }
>
> -
> ACPI_STATUS
> AcpiOsTerminate (
> void)
> {
>
> + OsExitLineEditMode ();
> return (AE_OK);
> }
>
> @@ -442,6 +539,7 @@ AcpiOsVprintf (
> }
>
>
> +#ifndef ACPI_EXEC_APP
> /******************************************************************************
> *
> * FUNCTION: AcpiOsGetLine
> @@ -452,7 +550,9 @@ AcpiOsVprintf (
> *
> * RETURN: Status and actual bytes read
> *
> - * DESCRIPTION: Formatted input with argument list pointer
> + * DESCRIPTION: Get the next input line from the terminal. NOTE: For the
> + * AcpiExec utility, we use the acgetline module instead to
> + * provide line-editing and history support.
> *
> *****************************************************************************/
>
> @@ -462,42 +562,46 @@ AcpiOsGetLine (
> UINT32 BufferLength,
> UINT32 *BytesRead)
> {
> - int Temp;
> - UINT32 i;
> + int InputChar;
> + UINT32 EndOfLine;
>
>
> - for (i = 0; ; i++)
> + /* Standard AcpiOsGetLine for all utilities except AcpiExec */
> +
> + for (EndOfLine = 0; ; EndOfLine++)
> {
> - if (i >= BufferLength)
> + if (EndOfLine >= BufferLength)
> {
> return (AE_BUFFER_OVERFLOW);
> }
>
> - if ((Temp = getchar ()) == EOF)
> + if ((InputChar = getchar ()) == EOF)
> {
> return (AE_ERROR);
> }
>
> - if (!Temp || Temp == '\n')
> + if (!InputChar || InputChar == _ASCII_NEWLINE)
> {
> break;
> }
>
> - Buffer [i] = (char) Temp;
> + Buffer[EndOfLine] = (char) InputChar;
> }
>
> /* Null terminate the buffer */
>
> - Buffer [i] = 0;
> + Buffer[EndOfLine] = 0;
>
> /* Return the number of bytes in the string */
>
> if (BytesRead)
> {
> - *BytesRead = i;
> + *BytesRead = EndOfLine;
> }
> +
> return (AE_OK);
> }
> +#endif
>
>
> /******************************************************************************
> @@ -1095,6 +1199,7 @@ AcpiOsReadPciConfiguration (
> UINT32 Width)
> {
>
> + *Value = 0;
> return (AE_OK);
> }
>
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index c5024b5..f0cc8ba 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -198,6 +198,10 @@ static UINT32
> AeEventHandler (
> void *Context);
>
> +static UINT32
> +AeSciHandler (
> + void *Context);
> +
> static char *TableEvents[] =
> {
> "LOAD",
> @@ -282,6 +286,7 @@ AeCtrlCHandler (
> }
> }
>
> + (void) AcpiOsTerminate ();
> exit (0);
> }
>
> @@ -704,9 +709,9 @@ AeInterfaceHandler (
> #if (!ACPI_REDUCED_HARDWARE)
> /******************************************************************************
> *
> - * FUNCTION: AeEventHandler
> + * FUNCTION: AeEventHandler, AeSciHandler
> *
> - * DESCRIPTION: Handler for Fixed Events
> + * DESCRIPTION: Handler for Fixed Events and SCIs
> *
> *****************************************************************************/
>
> @@ -716,6 +721,16 @@ AeEventHandler (
> {
> return (0);
> }
> +
> +static UINT32
> +AeSciHandler (
> + void *Context)
> +{
> +
> + AcpiOsPrintf ("[AcpiExec] Received an SCI at handler\n");
> + return (0);
> +}
> +
> #endif /* !ACPI_REDUCED_HARDWARE */
>
>
> @@ -738,10 +753,15 @@ AeRegionInit (
> void *HandlerContext,
> void **RegionContext)
> {
> - /*
> - * Real simple, set the RegionContext to the RegionHandle
> - */
> - *RegionContext = RegionHandle;
> +
> + if (Function == ACPI_REGION_DEACTIVATE)
> + {
> + *RegionContext = NULL;
> + }
> + else
> + {
> + *RegionContext = RegionHandle;
> + }
>
> return (AE_OK);
> }
> @@ -749,6 +769,51 @@ AeRegionInit (
>
> /*******************************************************************************
> *
> + * FUNCTION: AeInstallSciHandler
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Install handler for SCIs. Exercise the code by doing an
> + * install/remove/install.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AeInstallSciHandler (
> + void)
> +{
> + ACPI_STATUS Status;
> +
> +
> + Status = AcpiInstallSciHandler (AeSciHandler, &AeMyContext);
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_EXCEPTION ((AE_INFO, Status,
> + "Could not install an SCI handler (1)"));
> + }
> +
> + Status = AcpiRemoveSciHandler (AeSciHandler);
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_EXCEPTION ((AE_INFO, Status,
> + "Could not remove an SCI handler"));
> + }
> +
> + Status = AcpiInstallSciHandler (AeSciHandler, &AeMyContext);
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_EXCEPTION ((AE_INFO, Status,
> + "Could not install an SCI handler (2)"));
> + }
> +
> + return (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> * FUNCTION: AeInstallDeviceHandlers, AeInstallEcHandler,
> * AeInstallPciHandler
> *
> @@ -757,7 +822,7 @@ AeRegionInit (
> * RETURN: Status
> *
> * DESCRIPTION: Walk entire namespace, install a handler for every EC
> - * device found.
> + * and PCI device found.
> *
> ******************************************************************************/
>
> @@ -857,6 +922,11 @@ AeInstallLateHandlers (
> #if (!ACPI_REDUCED_HARDWARE)
> if (!AcpiGbl_ReducedHardware)
> {
> + /* Install a user SCI handler */
> +
> + Status = AeInstallSciHandler ();
> + AE_CHECK_OK (AeInstallSciHandler, Status);
> +
> /* Install some fixed event handlers */
>
> Status = AcpiInstallFixedEventHandler (ACPI_EVENT_GLOBAL, AeEventHandler, NULL);
>
Acked-by: Ivan Hu <ivan.hu at canonical.com>
More information about the fwts-devel
mailing list