diff mbox

ACPICA: Update to version 20170728

Message ID 20170806102323.6326-1-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King Aug. 6, 2017, 10:23 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Changes in this release of ACPICA are detailed at the following
link on the ACPICA developer mailing list:

https://lists.acpica.org/pipermail/devel/2017-July/001402.html

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/Makefile.am                             |   1 +
 src/acpica/source/common/ahtable.c                 |   1 +
 src/acpica/source/common/dmtable.c                 |   1 +
 src/acpica/source/common/dmtbinfo.c                |  11 +
 src/acpica/source/compiler/aslcompile.c            |   1 +
 src/acpica/source/compiler/aslcompiler.h           |  10 +-
 src/acpica/source/compiler/aslcompiler.l           |   2 +-
 src/acpica/source/compiler/aslerror.c              | 165 +++++-
 src/acpica/source/compiler/aslglobal.h             |   3 +
 src/acpica/source/compiler/aslmessages.c           |   3 +-
 src/acpica/source/compiler/aslmessages.h           |   1 +
 src/acpica/source/compiler/aslparseop.c            |  16 +-
 src/acpica/source/compiler/aslrules.y              |   1 +
 src/acpica/source/compiler/asltokens.y             |   1 +
 src/acpica/source/compiler/asltransform.c          |  31 +
 src/acpica/source/compiler/asltypes.h              |   9 +
 src/acpica/source/compiler/aslutils.c              |  67 ++-
 src/acpica/source/compiler/dtcompile.c             |  21 +-
 src/acpica/source/compiler/dtcompiler.h            |   1 +
 src/acpica/source/compiler/dttemplate.h            |   9 +
 src/acpica/source/compiler/dtutils.c               |   2 +-
 src/acpica/source/compiler/prmacros.c              |   2 +-
 src/acpica/source/components/debugger/dbdisply.c   |  33 +-
 src/acpica/source/components/dispatcher/dsfield.c  |   4 +
 src/acpica/source/components/dispatcher/dsobject.c | 392 +++----------
 src/acpica/source/components/dispatcher/dsopcode.c |  10 +
 .../source/components/dispatcher/dspkginit.c       | 635 +++++++++++++++++++++
 src/acpica/source/components/executer/excreate.c   |  55 +-
 src/acpica/source/components/executer/exdump.c     |  41 +-
 src/acpica/source/components/executer/exmisc.c     |   9 +
 src/acpica/source/components/executer/exoparg2.c   |   2 +
 src/acpica/source/components/hardware/hwregs.c     |   2 +-
 src/acpica/source/components/namespace/nsaccess.c  |  19 +-
 .../source/components/namespace/nsarguments.c      |  22 +-
 src/acpica/source/components/namespace/nsinit.c    |  14 +
 src/acpica/source/components/namespace/nsnames.c   |   9 +-
 src/acpica/source/components/namespace/nsprepkg.c  |   2 +
 src/acpica/source/components/parser/psloop.c       |  10 +
 src/acpica/source/components/resources/rsxface.c   |   7 +-
 src/acpica/source/components/tables/tbdata.c       |   2 +
 src/acpica/source/components/tables/tbxface.c      |   4 +-
 src/acpica/source/components/utilities/uthex.c     |   4 +-
 src/acpica/source/components/utilities/utmath.c    | 261 ++++++++-
 src/acpica/source/components/utilities/utmisc.c    |  13 +-
 src/acpica/source/components/utilities/utobject.c  |   4 +
 src/acpica/source/components/utilities/utresrc.c   |  11 +-
 src/acpica/source/components/utilities/utstate.c   |   2 +-
 .../source/components/utilities/utstrtoul64.c      |   8 +-
 src/acpica/source/components/utilities/uttrack.c   |  10 +-
 src/acpica/source/include/acdisasm.h               |   2 +
 src/acpica/source/include/acdispat.h               |  17 +
 src/acpica/source/include/aclocal.h                |   2 +-
 src/acpica/source/include/acnames.h                |   1 +
 src/acpica/source/include/acobject.h               |   4 +-
 src/acpica/source/include/acpi.h                   |   4 +-
 src/acpica/source/include/acpixf.h                 |   2 +-
 src/acpica/source/include/actbl2.h                 |  16 +
 src/acpica/source/include/actypes.h                |   8 +
 src/acpica/source/include/acutils.h                |  20 +-
 src/acpica/source/include/platform/acgcc.h         |   4 +
 src/acpica/source/include/platform/aclinux.h       |   2 +
 61 files changed, 1543 insertions(+), 483 deletions(-)
 create mode 100644 src/acpica/source/components/dispatcher/dspkginit.c

Comments

Alex Hung Aug. 9, 2017, 5:24 p.m. UTC | #1
On 2017-08-06 03:23 AM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/pipermail/devel/2017-July/001402.html
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/Makefile.am                             |   1 +
>   src/acpica/source/common/ahtable.c                 |   1 +
>   src/acpica/source/common/dmtable.c                 |   1 +
>   src/acpica/source/common/dmtbinfo.c                |  11 +
>   src/acpica/source/compiler/aslcompile.c            |   1 +
>   src/acpica/source/compiler/aslcompiler.h           |  10 +-
>   src/acpica/source/compiler/aslcompiler.l           |   2 +-
>   src/acpica/source/compiler/aslerror.c              | 165 +++++-
>   src/acpica/source/compiler/aslglobal.h             |   3 +
>   src/acpica/source/compiler/aslmessages.c           |   3 +-
>   src/acpica/source/compiler/aslmessages.h           |   1 +
>   src/acpica/source/compiler/aslparseop.c            |  16 +-
>   src/acpica/source/compiler/aslrules.y              |   1 +
>   src/acpica/source/compiler/asltokens.y             |   1 +
>   src/acpica/source/compiler/asltransform.c          |  31 +
>   src/acpica/source/compiler/asltypes.h              |   9 +
>   src/acpica/source/compiler/aslutils.c              |  67 ++-
>   src/acpica/source/compiler/dtcompile.c             |  21 +-
>   src/acpica/source/compiler/dtcompiler.h            |   1 +
>   src/acpica/source/compiler/dttemplate.h            |   9 +
>   src/acpica/source/compiler/dtutils.c               |   2 +-
>   src/acpica/source/compiler/prmacros.c              |   2 +-
>   src/acpica/source/components/debugger/dbdisply.c   |  33 +-
>   src/acpica/source/components/dispatcher/dsfield.c  |   4 +
>   src/acpica/source/components/dispatcher/dsobject.c | 392 +++----------
>   src/acpica/source/components/dispatcher/dsopcode.c |  10 +
>   .../source/components/dispatcher/dspkginit.c       | 635 +++++++++++++++++++++
>   src/acpica/source/components/executer/excreate.c   |  55 +-
>   src/acpica/source/components/executer/exdump.c     |  41 +-
>   src/acpica/source/components/executer/exmisc.c     |   9 +
>   src/acpica/source/components/executer/exoparg2.c   |   2 +
>   src/acpica/source/components/hardware/hwregs.c     |   2 +-
>   src/acpica/source/components/namespace/nsaccess.c  |  19 +-
>   .../source/components/namespace/nsarguments.c      |  22 +-
>   src/acpica/source/components/namespace/nsinit.c    |  14 +
>   src/acpica/source/components/namespace/nsnames.c   |   9 +-
>   src/acpica/source/components/namespace/nsprepkg.c  |   2 +
>   src/acpica/source/components/parser/psloop.c       |  10 +
>   src/acpica/source/components/resources/rsxface.c   |   7 +-
>   src/acpica/source/components/tables/tbdata.c       |   2 +
>   src/acpica/source/components/tables/tbxface.c      |   4 +-
>   src/acpica/source/components/utilities/uthex.c     |   4 +-
>   src/acpica/source/components/utilities/utmath.c    | 261 ++++++++-
>   src/acpica/source/components/utilities/utmisc.c    |  13 +-
>   src/acpica/source/components/utilities/utobject.c  |   4 +
>   src/acpica/source/components/utilities/utresrc.c   |  11 +-
>   src/acpica/source/components/utilities/utstate.c   |   2 +-
>   .../source/components/utilities/utstrtoul64.c      |   8 +-
>   src/acpica/source/components/utilities/uttrack.c   |  10 +-
>   src/acpica/source/include/acdisasm.h               |   2 +
>   src/acpica/source/include/acdispat.h               |  17 +
>   src/acpica/source/include/aclocal.h                |   2 +-
>   src/acpica/source/include/acnames.h                |   1 +
>   src/acpica/source/include/acobject.h               |   4 +-
>   src/acpica/source/include/acpi.h                   |   4 +-
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/actbl2.h                 |  16 +
>   src/acpica/source/include/actypes.h                |   8 +
>   src/acpica/source/include/acutils.h                |  20 +-
>   src/acpica/source/include/platform/acgcc.h         |   4 +
>   src/acpica/source/include/platform/aclinux.h       |   2 +
>   61 files changed, 1543 insertions(+), 483 deletions(-)
>   create mode 100644 src/acpica/source/components/dispatcher/dspkginit.c
> 
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 4b7ef1da..58b07494 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -116,6 +116,7 @@ libfwtsacpica_la_SOURCES =				\
>   	source/components/dispatcher/dsmethod.c		\
>   	source/components/dispatcher/dsmthdat.c		\
>   	source/components/dispatcher/dsobject.c		\
> +	source/components/dispatcher/dspkginit.c	\
>   	source/components/dispatcher/dsutils.c		\
>   	source/components/dispatcher/dswexec.c		\
>   	source/components/dispatcher/dswload.c		\
> diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
> index 38c1ea20..7aee3c66 100644
> --- a/src/acpica/source/common/ahtable.c
> +++ b/src/acpica/source/common/ahtable.c
> @@ -239,6 +239,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
>       {ACPI_SIG_RSDT, "Root System Description Table"},
>       {ACPI_SIG_S3PT, "S3 Performance Table"},
>       {ACPI_SIG_SBST, "Smart Battery Specification Table"},
> +    {ACPI_SIG_SDEI, "Software Delegated Exception Interface Table"},
>       {ACPI_SIG_SLIC, "Software Licensing Description Table"},
>       {ACPI_SIG_SLIT, "System Locality Information Table"},
>       {ACPI_SIG_SPCR, "Serial Port Console Redirection table"},
> diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
> index b85bb0c3..38248c2c 100644
> --- a/src/acpica/source/common/dmtable.c
> +++ b/src/acpica/source/common/dmtable.c
> @@ -493,6 +493,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>       {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
>       {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
>       {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
> +    {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
>       {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
>       {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
>       {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
> diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
> index 56dd5539..4b902b96 100644
> --- a/src/acpica/source/common/dmtbinfo.c
> +++ b/src/acpica/source/common/dmtbinfo.c
> @@ -218,6 +218,7 @@
>   #define ACPI_RASF_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_RASF,f)
>   #define ACPI_S3PT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_S3PT,f)
>   #define ACPI_SBST_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SBST,f)
> +#define ACPI_SDEI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEI,f)
>   #define ACPI_SLIT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIT,f)
>   #define ACPI_SPCR_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPCR,f)
>   #define ACPI_SPMI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
> @@ -2767,6 +2768,16 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
>       ACPI_DMT_TERMINATOR
>   };
>   
> +/*******************************************************************************
> + *
> + * SDEI - Software Delegated Execption Interface Descriptor Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdei[] =
> +{
> +    ACPI_DMT_TERMINATOR
> +};
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 181fc364..38568440 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -815,6 +815,7 @@ CmCleanupAndExit (
>       BOOLEAN                 DeleteAmlFile = FALSE;
>   
>   
> +    AslCheckExpectedExceptions ();
>       AePrintErrorLog (ASL_FILE_STDERR);
>       if (Gbl_DebugFlag)
>       {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index c3794246..fdf4dbf7 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -413,12 +413,20 @@ AslError (
>       ACPI_PARSE_OBJECT       *Op,
>       char                    *ExtraMessage);
>   
> +void
> +AslCheckExpectedExceptions (
> +    void);
> +
> +ACPI_STATUS
> +AslExpectException (
> +    char                    *MessageIdString);
> +
>   ACPI_STATUS
>   AslDisableException (
>       char                    *MessageIdString);
>   
>   BOOLEAN
> -AslIsExceptionDisabled (
> +AslIsExceptionIgnored (
>       UINT8                   Level,
>       UINT16                  MessageId);
>   
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index 4b36058b..b49233be 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -809,7 +809,7 @@ NamePathTail                [.]{NameSeg}
>   "__FILE__"                  { count (0); return (PARSEOP___FILE__); }
>   "__LINE__"                  { count (0); return (PARSEOP___LINE__); }
>   "__PATH__"                  { count (0); return (PARSEOP___PATH__); }
> -
> +"__METHOD__"                { count (0); return (PARSEOP___METHOD__); }
>   
>   {NameSeg}                   { char *s;
>                                   count (0);
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index b6f7ee7d..ec91ca3e 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -160,6 +160,16 @@ static void
>   AeAddToErrorLog (
>       ASL_ERROR_MSG           *Enode);
>   
> +static BOOLEAN
> +AslIsExceptionExpected (
> +    UINT8                   Level,
> +    UINT16                  MessageId);
> +
> +static BOOLEAN
> +AslIsExceptionDisabled (
> +    UINT8                   Level,
> +    UINT16                  MessageId);
> +
>   
>   /*******************************************************************************
>    *
> @@ -806,6 +816,115 @@ AslCommonError (
>       return;
>   }
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslIsExceptionIgnored
> + *
> + * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
> + *              MessageId           - Index into global message buffer
> + *
> + * RETURN:      BOOLEAN
> + *
> + * DESCRIPTION: Check if a particular exception is ignored. In this case it
> + *              means that the exception is (expected or disabled.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AslIsExceptionIgnored (
> +    UINT8                   Level,
> +    UINT16                  MessageId)
> +{
> +    BOOLEAN ExceptionIgnored;
> +
> +
> +    /* Note: this allows exception to be disabled and expected */
> +
> +    ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
> +    ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
> +
> +    return (Gbl_AllExceptionsDisabled || ExceptionIgnored);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslCheckExpectException
> + *
> + * PARAMETERS:  none
> + *
> + * RETURN:      none
> + *
> + * DESCRIPTION: Check the global expected messages table and raise an error
> + *              for each message that has not been received.
> + *
> + ******************************************************************************/
> +
> +void
> +AslCheckExpectedExceptions (
> +    void)
> +{
> +    UINT8 i;
> +
> +    for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
> +    {
> +        if (!Gbl_ExpectedMessages[i].MessageReceived)
> +        {
> +            AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
> +                Gbl_ExpectedMessages[i].MessageIdStr);
> +        }
> +    }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslExpectException
> + *
> + * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Enter a message ID into the global expected messages table
> + *              If these messages are not raised during the compilation, throw
> + *              an error.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AslExpectException (
> +    char                    *MessageIdString)
> +{
> +    UINT32                  MessageId;
> +
> +
> +    /* Convert argument to an integer and validate it */
> +
> +    MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
> +
> +    if (MessageId > 6999)
> +    {
> +        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
> +            MessageIdString);
> +        return (AE_BAD_PARAMETER);
> +    }
> +
> +    /* Insert value into the global expected message array */
> +
> +    if (Gbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
> +    {
> +        printf ("Too many messages have been registered as expected (max %u)\n",
> +            ASL_MAX_DISABLED_MESSAGES);
> +        return (AE_LIMIT);
> +    }
> +
> +    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageId = MessageId;
> +    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
> +    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageReceived = FALSE;
> +    Gbl_ExpectedMessagesIndex++;
> +    return (AE_OK);
> +}
> +
>   
>   /*******************************************************************************
>    *
> @@ -866,7 +985,48 @@ AslDisableException (
>    *
>    ******************************************************************************/
>   
> -BOOLEAN
> +static BOOLEAN
> +AslIsExceptionExpected (
> +    UINT8                   Level,
> +    UINT16                  MessageId)
> +{
> +    UINT32                  EncodedMessageId;
> +    UINT32                  i;
> +
> +
> +    /*
> +     * Mark this exception as received
> +     */
> +    EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
> +    for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
> +    {
> +        /* Simple implementation via fixed array */
> +
> +        if (EncodedMessageId == Gbl_ExpectedMessages[i].MessageId)
> +        {
> +            return (Gbl_ExpectedMessages[i].MessageReceived = TRUE);
> +        }
> +    }
> +
> +    return (FALSE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslIsExceptionDisabled
> + *
> + * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
> + *              MessageId           - Index into global message buffer
> + *
> + * RETURN:      TRUE if exception/message should be ignored
> + *
> + * DESCRIPTION: Check if the user has specified options such that this
> + *              exception should be ignored
> + *
> + ******************************************************************************/
> +
> +static BOOLEAN
>   AslIsExceptionDisabled (
>       UINT8                   Level,
>       UINT16                  MessageId)
> @@ -940,8 +1100,7 @@ AslError (
>   
>       /* Check if user wants to ignore this exception */
>   
> -    if (Gbl_AllExceptionsDisabled ||
> -        AslIsExceptionDisabled (Level, MessageId))
> +    if (AslIsExceptionIgnored (Level, MessageId))
>       {
>           return;
>       }
> diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
> index 0c58041f..169b25e7 100644
> --- a/src/acpica/source/compiler/aslglobal.h
> +++ b/src/acpica/source/compiler/aslglobal.h
> @@ -252,6 +252,7 @@ extern int                  AslCompilerdebug;
>   #define ASL_DEFAULT_LINE_BUFFER_SIZE    (1024 * 32) /* 32K */
>   #define ASL_MSG_BUFFER_SIZE             (1024 * 32) /* 32k */
>   #define ASL_MAX_DISABLED_MESSAGES       32
> +#define ASL_MAX_EXPECTED_MESSAGES       32
>   #define HEX_TABLE_LINE_SIZE             8
>   #define HEX_LISTING_LINE_SIZE           8
>   
> @@ -396,6 +397,7 @@ ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentHexColumn, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentAmlOffset, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentLine, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_DisabledMessagesIndex, 0);
> +ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_ExpectedMessagesIndex, 0);
>   ASL_EXTERN UINT8                    ASL_INIT_GLOBAL (Gbl_HexBytesWereWritten, FALSE);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_NumNamespaceObjects, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_ReservedMethods, 0);
> @@ -438,6 +440,7 @@ ASL_EXTERN char                     MsgBuffer[ASL_MSG_BUFFER_SIZE];
>   ASL_EXTERN char                     StringBuffer[ASL_MSG_BUFFER_SIZE];
>   ASL_EXTERN char                     StringBuffer2[ASL_MSG_BUFFER_SIZE];
>   ASL_EXTERN UINT32                   Gbl_DisabledMessages[ASL_MAX_DISABLED_MESSAGES];
> +ASL_EXTERN ASL_EXPECTED_MESSAGE     Gbl_ExpectedMessages[ASL_MAX_EXPECTED_MESSAGES];
>   
>   
>   #endif /* __ASLGLOBAL_H */
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index eb3d23dd..b87d5499 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -348,7 +348,8 @@ const char                      *AslCompilerMsgs [] =
>   /*    ASL_MSG_ARG_AS_LOCAL_NOT_USED */      "Method Argument (as a local) is set but never used",
>   /*    ASL_MSG_ARG_NOT_USED */               "Method Argument is never used",
>   /*    ASL_MSG_CONSTANT_REQUIRED */          "Non-reducible expression",
> -/*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT"
> +/*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT",
> +/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:"
>   };
>   
>   /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 86fb1631..68216e5c 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -351,6 +351,7 @@ typedef enum
>       ASL_MSG_ARG_NOT_USED,
>       ASL_MSG_CONSTANT_REQUIRED,
>       ASL_MSG_CROSS_TABLE_SCOPE,
> +    ASL_MSG_EXCEPTION_NOT_RECEIVED,
>   
>       /* These messages are used by the Data Table compiler only */
>   
> diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c
> index 4e6e5a16..41badcee 100644
> --- a/src/acpica/source/compiler/aslparseop.c
> +++ b/src/acpica/source/compiler/aslparseop.c
> @@ -685,10 +685,10 @@ TrCreateNullTargetOp (
>    * DESCRIPTION: Create a leaf op (no children or peers) for one of the
>    *              special constants - __LINE__, __FILE__, and __DATE__.
>    *
> - * Note: An implemenation of __FUNC__ cannot happen here because we don't
> - * have a full parse tree at this time and cannot find the parent control
> - * method. If it is ever needed, __FUNC__ must be implemented later, after
> - * the parse tree has been fully constructed.
> + * Note: The fullimplemenation of __METHOD__ cannot happen here because we
> + * don't have a full parse tree at this time and cannot find the parent
> + * control method. __METHOD__ must be implemented later, after the parse
> + * tree has been fully constructed.
>    *
>    ******************************************************************************/
>   
> @@ -711,6 +711,14 @@ TrCreateConstantLeafOp (
>           Op->Asl.Value.Integer = Op->Asl.LineNumber;
>           break;
>   
> +    case PARSEOP___METHOD__:
> +
> +        /* Will become a string literal later */
> +
> +        Op = TrAllocateOp (PARSEOP___METHOD__);
> +        Op->Asl.Value.String = NULL;
> +        break;
> +
>       case PARSEOP___PATH__:
>   
>           Op = TrAllocateOp (PARSEOP_STRING_LITERAL);
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index eb785069..f26ea874 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -592,6 +592,7 @@ ConstExprTerm
>       | PARSEOP___FILE__              {$$ = TrCreateConstantLeafOp (PARSEOP___FILE__);}
>       | PARSEOP___LINE__              {$$ = TrCreateConstantLeafOp (PARSEOP___LINE__);}
>       | PARSEOP___PATH__              {$$ = TrCreateConstantLeafOp (PARSEOP___PATH__);}
> +    | PARSEOP___METHOD__            {$$ = TrCreateConstantLeafOp (PARSEOP___METHOD__);}
>       ;
>   
>   Integer
> diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
> index e6e9006d..38c55c18 100644
> --- a/src/acpica/source/compiler/asltokens.y
> +++ b/src/acpica/source/compiler/asltokens.y
> @@ -637,3 +637,4 @@ NoEcho('
>   %token <i> PARSEOP___FILE__
>   %token <i> PARSEOP___LINE__
>   %token <i> PARSEOP___PATH__
> +%token <i> PARSEOP___METHOD__
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index d3ed53a1..daaca947 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -430,6 +430,8 @@ static void
>   TrTransformSubtree (
>       ACPI_PARSE_OBJECT           *Op)
>   {
> +    ACPI_PARSE_OBJECT           *MethodOp;
> +
>   
>       if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
>       {
> @@ -465,6 +467,35 @@ TrTransformSubtree (
>   
>           break;
>   
> +    case PARSEOP___METHOD__:
> +
> +        /* Transform to a string op containing the parent method name */
> +
> +        Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
> +        UtSetParseOpName (Op);
> +
> +        /* Find the parent control method op */
> +
> +        MethodOp = Op;
> +        while (MethodOp)
> +        {
> +            if (MethodOp->Asl.ParseOpcode == PARSEOP_METHOD)
> +            {
> +                /* First child contains the method name */
> +
> +                MethodOp = MethodOp->Asl.Child;
> +                Op->Asl.Value.String = MethodOp->Asl.Value.String;
> +                return;
> +            }
> +
> +            MethodOp = MethodOp->Asl.Parent;
> +        }
> +
> +        /* At the root, invocation not within a control method */
> +
> +        Op->Asl.Value.String = "\\";
> +        break;
> +
>       default:
>   
>           /* Nothing to do here for other opcodes */
> diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h
> index 4c2a2772..e4250871 100644
> --- a/src/acpica/source/compiler/asltypes.h
> +++ b/src/acpica/source/compiler/asltypes.h
> @@ -355,6 +355,15 @@ typedef struct asl_error_msg
>   
>   } ASL_ERROR_MSG;
>   
> +/* An entry in the expected messages array */
> +typedef struct asl_expected_message
> +{
> +    UINT32                       MessageId;
> +    char                         *MessageIdStr;
> +    BOOLEAN                      MessageReceived;
> +
> +} ASL_EXPECTED_MESSAGE;
> +
>   
>   /* An entry in the listing file stack (for include files) */
>   
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index fd91baeb..c5ff42c0 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -174,6 +174,12 @@ UtAttachNameseg (
>       ACPI_PARSE_OBJECT       *Op,
>       char                    *Name);
>   
> +static void
> +UtReallocLineBuffers (
> +    char                    **Buffer,
> +    UINT32                  OldSize,
> +    UINT32                  NewSize);
> +
>   
>   /*******************************************************************************
>    *
> @@ -733,43 +739,48 @@ UtExpandLineBuffers (
>               Gbl_LineBufferSize, NewSize);
>       }
>   
> -    Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
> +    UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize);
> +    UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize);
> +    UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize);
> +    UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize);
> +
>       Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> -    if (!Gbl_CurrentLineBuffer)
> -    {
> -        goto ErrorExit;
> -    }
> +    Gbl_LineBufferSize = NewSize;
> +}
>   
> -    Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
> -    if (!Gbl_MainTokenBuffer)
> -    {
> -        goto ErrorExit;
> -    }
>   
> -    Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
> -    if (!Gbl_MacroTokenBuffer)
> -    {
> -        goto ErrorExit;
> -    }
> +/******************************************************************************
> + *
> + * FUNCTION:    UtReallocLineBuffers
> + *
> + * PARAMETERS:  Buffer              - Buffer to realloc
> + *              OldSize             - Old size of Buffer
> + *              NewSize             - New size of Buffer
> + *
> + * RETURN:      none
> + *
> + * DESCRIPTION: Reallocate and initialize Buffer
> + *
> + *****************************************************************************/
> +
> +static void
> +UtReallocLineBuffers (
> +    char                    **Buffer,
> +    UINT32                  OldSize,
> +    UINT32                  NewSize)
> +{
>   
> -    Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
> -    if (!Gbl_ExpressionTokenBuffer)
> +    *Buffer = realloc (*Buffer, NewSize);
> +    if (*Buffer)
>       {
> -        goto ErrorExit;
> +        memset (*Buffer + OldSize, 0, NewSize - OldSize);
> +        return;
>       }
>   
> -    Gbl_LineBufferSize = NewSize;
> -    return;
> -
> -
> -    /* On error above, simply issue error messages and abort, cannot continue */
> -
> -ErrorExit:
>       printf ("Could not increase line buffer size from %u to %u\n",
> -        Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
> +        OldSize, NewSize);
>   
> -    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
> -        NULL, NULL);
> +    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL);
>       AslAbort ();
>   }
>   
> diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
> index 45274168..e74fed51 100644
> --- a/src/acpica/source/compiler/dtcompile.c
> +++ b/src/acpica/source/compiler/dtcompile.c
> @@ -486,18 +486,21 @@ DtCompileDataTable (
>       }
>       else if (TableData->TableInfo)
>       {
> -        /* Simple table, just walk the info table */
> +        /* Simple table, just walk the info table, unless its empty */
>   
> -        Subtable = NULL;
> -        Status = DtCompileTable (FieldList, TableData->TableInfo,
> -            &Subtable, TRUE);
> -        if (ACPI_FAILURE (Status))
> +        if (FieldList && *FieldList)
>           {
> -            return (Status);
> -        }
> +            Subtable = NULL;
> +            Status = DtCompileTable (FieldList, TableData->TableInfo,
> +                &Subtable, TRUE);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
>   
> -        DtInsertSubtable (Gbl_RootTable, Subtable);
> -        DtPopSubtable ();
> +            DtInsertSubtable (Gbl_RootTable, Subtable);
> +            DtPopSubtable ();
> +        }
>       }
>       else
>       {
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 61b40b4a..1e81c580 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -726,6 +726,7 @@ extern const unsigned char  TemplateRasf[];
>   extern const unsigned char  TemplateRsdt[];
>   extern const unsigned char  TemplateS3pt[];
>   extern const unsigned char  TemplateSbst[];
> +extern const unsigned char  TemplateSdei[];
>   extern const unsigned char  TemplateSlic[];
>   extern const unsigned char  TemplateSlit[];
>   extern const unsigned char  TemplateSpcr[];
> diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
> index bb4dded4..8d27359d 100644
> --- a/src/acpica/source/compiler/dttemplate.h
> +++ b/src/acpica/source/compiler/dttemplate.h
> @@ -1178,6 +1178,15 @@ const unsigned char TemplateSbst[] =
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000028    "........" */
>   };
>   
> +const unsigned char TemplateSdei[] =
> +{
> +    0x53,0x44,0x45,0x49,0x3e,0x00,0x00,0x00,  /* 00000000    "SDEI>..." */
> +    0x01,0x59,0x41,0x52,0x4d,0x20,0x20,0x20,  /* 00000008    ".mARM  " */
> +    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x30,0x09,0x16,0x20                       /* 00000028    "0.. " */
> +};
> +
>   const unsigned char TemplateSlic[] =
>   {
>       0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00,  /* 00000000    "SLICv..." */
> diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
> index 88072175..6edcf637 100644
> --- a/src/acpica/source/compiler/dtutils.c
> +++ b/src/acpica/source/compiler/dtutils.c
> @@ -190,7 +190,7 @@ DtError (
>   
>       /* Check if user wants to ignore this exception */
>   
> -    if (AslIsExceptionDisabled (Level, MessageId))
> +    if (AslIsExceptionIgnored (Level, MessageId))
>       {
>           return;
>       }
> diff --git a/src/acpica/source/compiler/prmacros.c b/src/acpica/source/compiler/prmacros.c
> index 55aab466..675d4522 100644
> --- a/src/acpica/source/compiler/prmacros.c
> +++ b/src/acpica/source/compiler/prmacros.c
> @@ -483,7 +483,7 @@ PrAddMacro (
>       {
>           /* Search the macro arg list for matching arg */
>   
> -        for (i = 0; Args[i].Name && (i < PR_MAX_MACRO_ARGS); i++)
> +        for (i = 0; ((i < PR_MAX_MACRO_ARGS) && Args[i].Name); i++)
>           {
>               /*
>                * Save argument offset within macro body. This is the mechanism
> diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
> index 2c5ef74a..75198951 100644
> --- a/src/acpica/source/components/debugger/dbdisply.c
> +++ b/src/acpica/source/components/debugger/dbdisply.c
> @@ -451,7 +451,7 @@ DumpNode:
>   
>       else
>       {
> -        AcpiOsPrintf ("Object (%p) Pathname:  %s\n",
> +        AcpiOsPrintf ("Object %p: Namespace Node - Pathname: %s\n",
>               Node, (char *) RetBuf.Pointer);
>       }
>   
> @@ -468,7 +468,7 @@ DumpNode:
>       ObjDesc = AcpiNsGetAttachedObject (Node);
>       if (ObjDesc)
>       {
> -        AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc);
> +        AcpiOsPrintf ("\nAttached Object %p:", ObjDesc);
>           if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
>           {
>               AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
> @@ -476,8 +476,33 @@ DumpNode:
>               return;
>           }
>   
> -        AcpiUtDebugDumpBuffer ((void *) ObjDesc,
> -            sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
> +        if (ACPI_GET_DESCRIPTOR_TYPE (
> +            ((ACPI_NAMESPACE_NODE *) ObjDesc)) == ACPI_DESC_TYPE_NAMED)
> +        {
> +            AcpiOsPrintf (" Namespace Node - ");
> +            Status = AcpiGetName ((ACPI_NAMESPACE_NODE *) ObjDesc,
> +                ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                AcpiOsPrintf ("Could not convert name to pathname\n");
> +            }
> +            else
> +            {
> +                AcpiOsPrintf ("Pathname: %s",
> +                    (char *) RetBuf.Pointer);
> +            }
> +
> +            AcpiOsPrintf ("\n");
> +            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
> +                sizeof (ACPI_NAMESPACE_NODE), Display, ACPI_UINT32_MAX);
> +        }
> +        else
> +        {
> +            AcpiOsPrintf ("\n");
> +            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
> +                sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
> +        }
> +
>           AcpiExDumpObjectDescriptor (ObjDesc, 1);
>       }
>   }
> diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index bfa45b3e..fe9d0605 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/source/components/dispatcher/dsfield.c
> @@ -313,6 +313,8 @@ AcpiDsCreateBufferField (
>   
>           if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
>           {
> +            ACPI_ERROR ((AE_INFO,
> +                "Parse execute mode is not set"));
>               return_ACPI_STATUS (AE_AML_INTERNAL);
>           }
>   
> @@ -701,6 +703,8 @@ AcpiDsInitFieldObjects (
>               return_ACPI_STATUS (AE_OK);
>           }
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Parse deferred mode is not set"));
>           return_ACPI_STATUS (AE_AML_INTERNAL);
>       }
>   
> diff --git a/src/acpica/source/components/dispatcher/dsobject.c b/src/acpica/source/components/dispatcher/dsobject.c
> index 5be9c8fd..4cbd8f78 100644
> --- a/src/acpica/source/components/dispatcher/dsobject.c
> +++ b/src/acpica/source/components/dispatcher/dsobject.c
> @@ -160,14 +160,6 @@
>   #define _COMPONENT          ACPI_DISPATCHER
>           ACPI_MODULE_NAME    ("dsobject")
>   
> -/* Local prototypes */
> -
> -static ACPI_STATUS
> -AcpiDsBuildInternalObject (
> -    ACPI_WALK_STATE         *WalkState,
> -    ACPI_PARSE_OBJECT       *Op,
> -    ACPI_OPERAND_OBJECT     **ObjDescPtr);
> -
>   
>   #ifndef ACPI_NO_METHOD_EXECUTION
>   /*******************************************************************************
> @@ -185,7 +177,7 @@ AcpiDsBuildInternalObject (
>    *
>    ******************************************************************************/
>   
> -static ACPI_STATUS
> +ACPI_STATUS
>   AcpiDsBuildInternalObject (
>       ACPI_WALK_STATE         *WalkState,
>       ACPI_PARSE_OBJECT       *Op,
> @@ -193,7 +185,6 @@ AcpiDsBuildInternalObject (
>   {
>       ACPI_OPERAND_OBJECT     *ObjDesc;
>       ACPI_STATUS             Status;
> -    ACPI_OBJECT_TYPE        Type;
>   
>   
>       ACPI_FUNCTION_TRACE (DsBuildInternalObject);
> @@ -204,129 +195,43 @@ AcpiDsBuildInternalObject (
>       {
>           /*
>            * This is a named object reference. If this name was
> -         * previously looked up in the namespace, it was stored in this op.
> -         * Otherwise, go ahead and look it up now
> +         * previously looked up in the namespace, it was stored in
> +         * this op. Otherwise, go ahead and look it up now
>            */
>           if (!Op->Common.Node)
>           {
> -            Status = AcpiNsLookup (WalkState->ScopeInfo,
> -                Op->Common.Value.String,
> -                ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> -                ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
> -                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
> -            if (ACPI_FAILURE (Status))
> -            {
> -                /* Check if we are resolving a named reference within a package */
> -
> -                if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
> -
> -                    ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> -                     (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP)))
> -                {
> -                    /*
> -                     * We didn't find the target and we are populating elements
> -                     * of a package - ignore if slack enabled. Some ASL code
> -                     * contains dangling invalid references in packages and
> -                     * expects that no exception will be issued. Leave the
> -                     * element as a null element. It cannot be used, but it
> -                     * can be overwritten by subsequent ASL code - this is
> -                     * typically the case.
> -                     */
> -                    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -                        "Ignoring unresolved reference in package [%4.4s]\n",
> -                        WalkState->ScopeInfo->Scope.Node->Name.Ascii));
> -
> -                    return_ACPI_STATUS (AE_OK);
> -                }
> -                else
> -                {
> -                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
> -                }
> -
> -                return_ACPI_STATUS (Status);
> -            }
> -        }
> -
> -        /* Special object resolution for elements of a package */
> -
> -        if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> -            (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> -        {
> -            /*
> -             * Attempt to resolve the node to a value before we insert it into
> -             * the package. If this is a reference to a common data type,
> -             * resolve it immediately. According to the ACPI spec, package
> -             * elements can only be "data objects" or method references.
> -             * Attempt to resolve to an Integer, Buffer, String or Package.
> -             * If cannot, return the named reference (for things like Devices,
> -             * Methods, etc.) Buffer Fields and Fields will resolve to simple
> -             * objects (int/buf/str/pkg).
> -             *
> -             * NOTE: References to things like Devices, Methods, Mutexes, etc.
> -             * will remain as named references. This behavior is not described
> -             * in the ACPI spec, but it appears to be an oversight.
> -             */
> -            ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Op->Common.Node);
> -
> -            Status = AcpiExResolveNodeToValue (
> -                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc),
> -                WalkState);
> -            if (ACPI_FAILURE (Status))
> -            {
> -                return_ACPI_STATUS (Status);
> -            }
> +            /* Check if we are resolving a named reference within a package */
>   
> -            /*
> -             * Special handling for Alias objects. We need to setup the type
> -             * and the Op->Common.Node to point to the Alias target. Note,
> -             * Alias has at most one level of indirection internally.
> -             */
> -            Type = Op->Common.Node->Type;
> -            if (Type == ACPI_TYPE_LOCAL_ALIAS)
> +            if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> +                (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
>               {
> -                Type = ObjDesc->Common.Type;
> -                Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> -                    Op->Common.Node->Object);
> -            }
> -
> -            switch (Type)
> -            {
> -            /*
> -             * For these types, we need the actual node, not the subobject.
> -             * However, the subobject did not get an extra reference count above.
> -             *
> -             * TBD: should ExResolveNodeToValue be changed to fix this?
> -             */
> -            case ACPI_TYPE_DEVICE:
> -            case ACPI_TYPE_THERMAL:
> -
> -                AcpiUtAddReference (Op->Common.Node->Object);
> -
> -                /*lint -fallthrough */
> -            /*
> -             * For these types, we need the actual node, not the subobject.
> -             * The subobject got an extra reference count in ExResolveNodeToValue.
> -             */
> -            case ACPI_TYPE_MUTEX:
> -            case ACPI_TYPE_METHOD:
> -            case ACPI_TYPE_POWER:
> -            case ACPI_TYPE_PROCESSOR:
> -            case ACPI_TYPE_EVENT:
> -            case ACPI_TYPE_REGION:
> -
> -                /* We will create a reference object for these types below */
> -                break;
> -
> -            default:
>                   /*
> -                 * All other types - the node was resolved to an actual
> -                 * object, we are done.
> +                 * We won't resolve package elements here, we will do this
> +                 * after all ACPI tables are loaded into the namespace. This
> +                 * behavior supports both forward references to named objects
> +                 * and external references to objects in other tables.
>                    */
> -                goto Exit;
> +                goto CreateNewObject;
> +            }
> +            else
> +            {
> +                Status = AcpiNsLookup (WalkState->ScopeInfo,
> +                    Op->Common.Value.String,
> +                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> +                    ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
> +                    ACPI_CAST_INDIRECT_PTR (
> +                        ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
> +                    return_ACPI_STATUS (Status);
> +                }
>               }
>           }
>       }
>   
> +CreateNewObject:
> +
>       /* Create and init a new internal ACPI object */
>   
>       ObjDesc = AcpiUtCreateInternalObject (
> @@ -344,7 +249,28 @@ AcpiDsBuildInternalObject (
>           return_ACPI_STATUS (Status);
>       }
>   
> -Exit:
> +    /*
> +     * Handling for unresolved package reference elements.
> +     * These are elements that are namepaths.
> +     */
> +    if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> +        (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> +    {
> +        ObjDesc->Reference.Resolved = TRUE;
> +
> +        if ((Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
> +            !ObjDesc->Reference.Node)
> +        {
> +            /*
> +             * Name was unresolved above.
> +             * Get the prefix node for later lookup
> +             */
> +            ObjDesc->Reference.Node = WalkState->ScopeInfo->Scope.Node;
> +            ObjDesc->Reference.Aml = Op->Common.Aml;
> +            ObjDesc->Reference.Resolved = FALSE;
> +        }
> +    }
> +
>       *ObjDescPtr = ObjDesc;
>       return_ACPI_STATUS (Status);
>   }
> @@ -466,209 +392,6 @@ AcpiDsBuildInternalBufferObj (
>       return_ACPI_STATUS (AE_OK);
>   }
>   
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiDsBuildInternalPackageObj
> - *
> - * PARAMETERS:  WalkState       - Current walk state
> - *              Op              - Parser object to be translated
> - *              ElementCount    - Number of elements in the package - this is
> - *                                the NumElements argument to Package()
> - *              ObjDescPtr      - Where the ACPI internal object is returned
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: Translate a parser Op package object to the equivalent
> - *              namespace object
> - *
> - * NOTE: The number of elements in the package will be always be the NumElements
> - * count, regardless of the number of elements in the package list. If
> - * NumElements is smaller, only that many package list elements are used.
> - * if NumElements is larger, the Package object is padded out with
> - * objects of type Uninitialized (as per ACPI spec.)
> - *
> - * Even though the ASL compilers do not allow NumElements to be smaller
> - * than the Package list length (for the fixed length package opcode), some
> - * BIOS code modifies the AML on the fly to adjust the NumElements, and
> - * this code compensates for that. This also provides compatibility with
> - * other AML interpreters.
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -AcpiDsBuildInternalPackageObj (
> -    ACPI_WALK_STATE         *WalkState,
> -    ACPI_PARSE_OBJECT       *Op,
> -    UINT32                  ElementCount,
> -    ACPI_OPERAND_OBJECT     **ObjDescPtr)
> -{
> -    ACPI_PARSE_OBJECT       *Arg;
> -    ACPI_PARSE_OBJECT       *Parent;
> -    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
> -    ACPI_STATUS             Status = AE_OK;
> -    UINT32                  i;
> -    UINT16                  Index;
> -    UINT16                  ReferenceCount;
> -
> -
> -    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
> -
> -
> -    /* Find the parent of a possibly nested package */
> -
> -    Parent = Op->Common.Parent;
> -    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> -           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> -    {
> -        Parent = Parent->Common.Parent;
> -    }
> -
> -    /*
> -     * If we are evaluating a Named package object "Name (xxxx, Package)",
> -     * the package object already exists, otherwise it must be created.
> -     */
> -    ObjDesc = *ObjDescPtr;
> -    if (!ObjDesc)
> -    {
> -        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
> -        *ObjDescPtr = ObjDesc;
> -        if (!ObjDesc)
> -        {
> -            return_ACPI_STATUS (AE_NO_MEMORY);
> -        }
> -
> -        ObjDesc->Package.Node = Parent->Common.Node;
> -    }
> -
> -    /*
> -     * Allocate the element array (array of pointers to the individual
> -     * objects) based on the NumElements parameter. Add an extra pointer slot
> -     * so that the list is always null terminated.
> -     */
> -    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
> -        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
> -
> -    if (!ObjDesc->Package.Elements)
> -    {
> -        AcpiUtDeleteObjectDesc (ObjDesc);
> -        return_ACPI_STATUS (AE_NO_MEMORY);
> -    }
> -
> -    ObjDesc->Package.Count = ElementCount;
> -
> -    /*
> -     * Initialize the elements of the package, up to the NumElements count.
> -     * Package is automatically padded with uninitialized (NULL) elements
> -     * if NumElements is greater than the package list length. Likewise,
> -     * Package is truncated if NumElements is less than the list length.
> -     */
> -    Arg = Op->Common.Value.Arg;
> -    Arg = Arg->Common.Next;
> -    for (i = 0; Arg && (i < ElementCount); i++)
> -    {
> -        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
> -        {
> -            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
> -            {
> -                /*
> -                 * A method reference "looks" to the parser to be a method
> -                 * invocation, so we special case it here
> -                 */
> -                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> -                Status = AcpiDsBuildInternalObject (
> -                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
> -            }
> -            else
> -            {
> -                /* This package element is already built, just get it */
> -
> -                ObjDesc->Package.Elements[i] =
> -                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
> -            }
> -        }
> -        else
> -        {
> -            Status = AcpiDsBuildInternalObject (
> -                WalkState, Arg, &ObjDesc->Package.Elements[i]);
> -        }
> -
> -        if (*ObjDescPtr)
> -        {
> -            /* Existing package, get existing reference count */
> -
> -            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
> -            if (ReferenceCount > 1)
> -            {
> -                /* Make new element ref count match original ref count */
> -
> -                for (Index = 0; Index < (ReferenceCount - 1); Index++)
> -                {
> -                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
> -                }
> -            }
> -        }
> -
> -        Arg = Arg->Common.Next;
> -    }
> -
> -    /* Check for match between NumElements and actual length of PackageList */
> -
> -    if (Arg)
> -    {
> -        /*
> -         * NumElements was exhausted, but there are remaining elements in the
> -         * PackageList. Truncate the package to NumElements.
> -         *
> -         * Note: technically, this is an error, from ACPI spec: "It is an error
> -         * for NumElements to be less than the number of elements in the
> -         * PackageList". However, we just print a message and
> -         * no exception is returned. This provides Windows compatibility. Some
> -         * BIOSs will alter the NumElements on the fly, creating this type
> -         * of ill-formed package object.
> -         */
> -        while (Arg)
> -        {
> -            /*
> -             * We must delete any package elements that were created earlier
> -             * and are not going to be used because of the package truncation.
> -             */
> -            if (Arg->Common.Node)
> -            {
> -                AcpiUtRemoveReference (
> -                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
> -                Arg->Common.Node = NULL;
> -            }
> -
> -            /* Find out how many elements there really are */
> -
> -            i++;
> -            Arg = Arg->Common.Next;
> -        }
> -
> -        ACPI_INFO ((
> -            "Actual Package length (%u) is larger than "
> -            "NumElements field (%u), truncated",
> -            i, ElementCount));
> -    }
> -    else if (i < ElementCount)
> -    {
> -        /*
> -         * Arg list (elements) was exhausted, but we did not reach NumElements count.
> -         * Note: this is not an error, the package is padded out with NULLs.
> -         */
> -        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -            "Package List length (%u) smaller than NumElements "
> -            "count (%u), padded with null elements\n",
> -            i, ElementCount));
> -    }
> -
> -    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
> -    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
> -    return_ACPI_STATUS (Status);
> -}
> -
> -
>   /*******************************************************************************
>    *
>    * FUNCTION:    AcpiDsCreateNode
> @@ -796,10 +519,20 @@ AcpiDsInitObjectFromOp (
>   
>       case ACPI_TYPE_PACKAGE:
>           /*
> -         * Defer evaluation of Package TermArg operand
> +         * Defer evaluation of Package TermArg operand and all
> +         * package elements. (01/2017): We defer the element
> +         * resolution to allow forward references from the package
> +         * in order to provide compatibility with other ACPI
> +         * implementations.
>            */
>           ObjDesc->Package.Node = ACPI_CAST_PTR (
>               ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
> +
> +        if (!Op->Named.Data)
> +        {
> +            return_ACPI_STATUS (AE_OK);
> +        }
> +
>           ObjDesc->Package.AmlStart = Op->Named.Data;
>           ObjDesc->Package.AmlLength = Op->Named.Length;
>           break;
> @@ -940,8 +673,11 @@ AcpiDsInitObjectFromOp (
>                   /* Node was saved in Op */
>   
>                   ObjDesc->Reference.Node = Op->Common.Node;
> -                ObjDesc->Reference.Object = Op->Common.Node->Object;
>                   ObjDesc->Reference.Class = ACPI_REFCLASS_NAME;
> +                if (Op->Common.Node)
> +                {
> +                    ObjDesc->Reference.Object = Op->Common.Node->Object;
> +                }
>                   break;
>   
>               case AML_DEBUG_OP:
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index 3ceec94b..5ba414d3 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -747,6 +747,16 @@ AcpiDsEvalDataObjectOperands (
>        */
>       WalkState->OperandIndex = WalkState->NumOperands;
>   
> +    /* Ignore if child is not valid */
> +
> +    if (!Op->Common.Value.Arg)
> +    {
> +        ACPI_ERROR ((AE_INFO,
> +            "Dispatch: Missing child while executing TermArg for %X",
> +            Op->Common.AmlOpcode));
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
>       Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
>       if (ACPI_FAILURE (Status))
>       {
> diff --git a/src/acpica/source/components/dispatcher/dspkginit.c b/src/acpica/source/components/dispatcher/dspkginit.c
> new file mode 100644
> index 00000000..14e34b09
> --- /dev/null
> +++ b/src/acpica/source/components/dispatcher/dspkginit.c
> @@ -0,0 +1,635 @@
> +/******************************************************************************
> + *
> + * Module Name: dspkginit - Completion of deferred package initialization
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2017, 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.
> + *
> + *****************************************************************************
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * following license:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acnamesp.h"
> +#include "amlcode.h"
> +#include "acdispat.h"
> +#include "acinterp.h"
> +
> +
> +#define _COMPONENT          ACPI_NAMESPACE
> +        ACPI_MODULE_NAME    ("dspkginit")
> +
> +
> +/* Local prototypes */
> +
> +static void
> +AcpiDsResolvePackageElement (
> +    ACPI_OPERAND_OBJECT     **Element);
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsBuildInternalPackageObj
> + *
> + * PARAMETERS:  WalkState       - Current walk state
> + *              Op              - Parser object to be translated
> + *              ElementCount    - Number of elements in the package - this is
> + *                                the NumElements argument to Package()
> + *              ObjDescPtr      - Where the ACPI internal object is returned
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Translate a parser Op package object to the equivalent
> + *              namespace object
> + *
> + * NOTE: The number of elements in the package will be always be the NumElements
> + * count, regardless of the number of elements in the package list. If
> + * NumElements is smaller, only that many package list elements are used.
> + * if NumElements is larger, the Package object is padded out with
> + * objects of type Uninitialized (as per ACPI spec.)
> + *
> + * Even though the ASL compilers do not allow NumElements to be smaller
> + * than the Package list length (for the fixed length package opcode), some
> + * BIOS code modifies the AML on the fly to adjust the NumElements, and
> + * this code compensates for that. This also provides compatibility with
> + * other AML interpreters.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiDsBuildInternalPackageObj (
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_PARSE_OBJECT       *Op,
> +    UINT32                  ElementCount,
> +    ACPI_OPERAND_OBJECT     **ObjDescPtr)
> +{
> +    ACPI_PARSE_OBJECT       *Arg;
> +    ACPI_PARSE_OBJECT       *Parent;
> +    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
> +    ACPI_STATUS             Status = AE_OK;
> +    UINT16                  ReferenceCount;
> +    UINT32                  Index;
> +    UINT32                  i;
> +
> +
> +    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
> +
> +
> +    /* Find the parent of a possibly nested package */
> +
> +    Parent = Op->Common.Parent;
> +    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> +           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> +    {
> +        Parent = Parent->Common.Parent;
> +    }
> +
> +    /*
> +     * If we are evaluating a Named package object of the form:
> +     *      Name (xxxx, Package)
> +     * the package object already exists, otherwise it must be created.
> +     */
> +    ObjDesc = *ObjDescPtr;
> +    if (!ObjDesc)
> +    {
> +        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
> +        *ObjDescPtr = ObjDesc;
> +        if (!ObjDesc)
> +        {
> +            return_ACPI_STATUS (AE_NO_MEMORY);
> +        }
> +
> +        ObjDesc->Package.Node = Parent->Common.Node;
> +    }
> +
> +    if (ObjDesc->Package.Flags & AOPOBJ_DATA_VALID) /* Just in case */
> +    {
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
> +    /*
> +     * Allocate the element array (array of pointers to the individual
> +     * objects) based on the NumElements parameter. Add an extra pointer slot
> +     * so that the list is always null terminated.
> +     */
> +    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
> +        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
> +
> +    if (!ObjDesc->Package.Elements)
> +    {
> +        AcpiUtDeleteObjectDesc (ObjDesc);
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
> +    ObjDesc->Package.Count = ElementCount;
> +    Arg = Op->Common.Value.Arg;
> +    Arg = Arg->Common.Next;
> +
> +    if (Arg)
> +    {
> +        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
> +    }
> +
> +    /*
> +     * Initialize the elements of the package, up to the NumElements count.
> +     * Package is automatically padded with uninitialized (NULL) elements
> +     * if NumElements is greater than the package list length. Likewise,
> +     * Package is truncated if NumElements is less than the list length.
> +     */
> +    for (i = 0; Arg && (i < ElementCount); i++)
> +    {
> +        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
> +        {
> +            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
> +            {
> +                /*
> +                 * A method reference "looks" to the parser to be a method
> +                 * invocation, so we special case it here
> +                 */
> +                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> +                Status = AcpiDsBuildInternalObject (
> +                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
> +            }
> +            else
> +            {
> +                /* This package element is already built, just get it */
> +
> +                ObjDesc->Package.Elements[i] =
> +                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
> +            }
> +        }
> +        else
> +        {
> +            Status = AcpiDsBuildInternalObject (
> +                WalkState, Arg, &ObjDesc->Package.Elements[i]);
> +            if (Status == AE_NOT_FOUND)
> +            {
> +                ACPI_ERROR ((AE_INFO, "%-48s", "****DS namepath not found"));
> +            }
> +
> +            /*
> +             * Initialize this package element. This function handles the
> +             * resolution of named references within the package.
> +             */
> +            AcpiDsInitPackageElement (0, ObjDesc->Package.Elements[i],
> +                NULL, &ObjDesc->Package.Elements[i]);
> +        }
> +
> +        if (*ObjDescPtr)
> +        {
> +            /* Existing package, get existing reference count */
> +
> +            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
> +            if (ReferenceCount > 1)
> +            {
> +                /* Make new element ref count match original ref count */
> +                /* TBD: Probably need an AcpiUtAddReferences function */
> +
> +                for (Index = 0; Index < ((UINT32) ReferenceCount - 1); Index++)
> +                {
> +                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
> +                }
> +            }
> +        }
> +
> +        Arg = Arg->Common.Next;
> +    }
> +
> +    /* Check for match between NumElements and actual length of PackageList */
> +
> +    if (Arg)
> +    {
> +        /*
> +         * NumElements was exhausted, but there are remaining elements in
> +         * the PackageList. Truncate the package to NumElements.
> +         *
> +         * Note: technically, this is an error, from ACPI spec: "It is an
> +         * error for NumElements to be less than the number of elements in
> +         * the PackageList". However, we just print a message and no
> +         * exception is returned. This provides compatibility with other
> +         * ACPI implementations. Some firmware implementations will alter
> +         * the NumElements on the fly, possibly creating this type of
> +         * ill-formed package object.
> +         */
> +        while (Arg)
> +        {
> +            /*
> +             * We must delete any package elements that were created earlier
> +             * and are not going to be used because of the package truncation.
> +             */
> +            if (Arg->Common.Node)
> +            {
> +                AcpiUtRemoveReference (
> +                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
> +                Arg->Common.Node = NULL;
> +            }
> +
> +            /* Find out how many elements there really are */
> +
> +            i++;
> +            Arg = Arg->Common.Next;
> +        }
> +
> +        ACPI_INFO ((
> +            "Actual Package length (%u) is larger than "
> +            "NumElements field (%u), truncated",
> +            i, ElementCount));
> +    }
> +    else if (i < ElementCount)
> +    {
> +        /*
> +         * Arg list (elements) was exhausted, but we did not reach
> +         * NumElements count.
> +         *
> +         * Note: this is not an error, the package is padded out
> +         * with NULLs.
> +         */
> +        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +            "Package List length (%u) smaller than NumElements "
> +            "count (%u), padded with null elements\n",
> +            i, ElementCount));
> +    }
> +
> +    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
> +    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
> +    return_ACPI_STATUS (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsInitPackageElement
> + *
> + * PARAMETERS:  ACPI_PKG_CALLBACK
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Resolve a named reference element within a package object
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiDsInitPackageElement (
> +    UINT8                   ObjectType,
> +    ACPI_OPERAND_OBJECT     *SourceObject,
> +    ACPI_GENERIC_STATE      *State,
> +    void                    *Context)
> +{
> +    ACPI_OPERAND_OBJECT     **ElementPtr;
> +
> +
> +    if (!SourceObject)
> +    {
> +        return (AE_OK);
> +    }
> +
> +    /*
> +     * The following code is a bit of a hack to workaround a (current)
> +     * limitation of the ACPI_PKG_CALLBACK interface. We need a pointer
> +     * to the location within the element array because a new object
> +     * may be created and stored there.
> +     */
> +    if (Context)
> +    {
> +        /* A direct call was made to this function */
> +
> +        ElementPtr = (ACPI_OPERAND_OBJECT **) Context;
> +    }
> +    else
> +    {
> +        /* Call came from AcpiUtWalkPackageTree */
> +
> +        ElementPtr = State->Pkg.ThisTargetObj;
> +    }
> +
> +    /* We are only interested in reference objects/elements */
> +
> +    if (SourceObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
> +    {
> +        /* Attempt to resolve the (named) reference to a namespace node */
> +
> +        AcpiDsResolvePackageElement (ElementPtr);
> +    }
> +    else if (SourceObject->Common.Type == ACPI_TYPE_PACKAGE)
> +    {
> +        SourceObject->Package.Flags |= AOPOBJ_DATA_VALID;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsResolvePackageElement
> + *
> + * PARAMETERS:  ElementPtr          - Pointer to a reference object
> + *
> + * RETURN:      Possible new element is stored to the indirect ElementPtr
> + *
> + * DESCRIPTION: Resolve a package element that is a reference to a named
> + *              object.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDsResolvePackageElement (
> +    ACPI_OPERAND_OBJECT     **ElementPtr)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_GENERIC_STATE      ScopeInfo;
> +    ACPI_OPERAND_OBJECT     *Element = *ElementPtr;
> +    ACPI_NAMESPACE_NODE     *ResolvedNode;
> +    char                    *ExternalPath = NULL;
> +    ACPI_OBJECT_TYPE        Type;
> +
> +
> +    ACPI_FUNCTION_TRACE (DsResolvePackageElement);
> +
> +
> +    /* Check if reference element is already resolved */
> +
> +    if (Element->Reference.Resolved)
> +    {
> +        return_VOID;
> +    }
> +
> +    /* Element must be a reference object of correct type */
> +
> +    ScopeInfo.Scope.Node = Element->Reference.Node; /* Prefix node */
> +
> +    Status = AcpiNsLookup (&ScopeInfo,
> +        (char *) Element->Reference.Aml,            /* Pointer to AML path */
> +        ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> +        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
> +        NULL, &ResolvedNode);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
> +            (char *) Element->Reference.Aml,
> +            NULL, &ExternalPath);
> +
> +        ACPI_EXCEPTION ((AE_INFO, Status,
> +            "Could not find/resolve named package element: %s", ExternalPath));
> +
> +        ACPI_FREE (ExternalPath);
> +        *ElementPtr = NULL;
> +        return_VOID;
> +    }
> +    else if (ResolvedNode->Type == ACPI_TYPE_ANY)
> +    {
> +        /* Named reference not resolved, return a NULL package element */
> +
> +        ACPI_ERROR ((AE_INFO,
> +            "Could not resolve named package element [%4.4s] in [%4.4s]",
> +            ResolvedNode->Name.Ascii, ScopeInfo.Scope.Node->Name.Ascii));
> +        *ElementPtr = NULL;
> +        return_VOID;
> +    }
> +#if 0
> +    else if (ResolvedNode->Flags & ANOBJ_TEMPORARY)
> +    {
> +        /*
> +         * A temporary node found here indicates that the reference is
> +         * to a node that was created within this method. We are not
> +         * going to allow it (especially if the package is returned
> +         * from the method) -- the temporary node will be deleted out
> +         * from under the method. (05/2017).
> +         */
> +        ACPI_ERROR ((AE_INFO,
> +            "Package element refers to a temporary name [%4.4s], "
> +            "inserting a NULL element",
> +            ResolvedNode->Name.Ascii));
> +        *ElementPtr = NULL;
> +        return_VOID;
> +    }
> +#endif
> +
> +    /*
> +     * Special handling for Alias objects. We need ResolvedNode to point
> +     * to the Alias target. This effectively "resolves" the alias.
> +     */
> +    if (ResolvedNode->Type == ACPI_TYPE_LOCAL_ALIAS)
> +    {
> +        ResolvedNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> +            ResolvedNode->Object);
> +    }
> +
> +    /* Update the reference object */
> +
> +    Element->Reference.Resolved = TRUE;
> +    Element->Reference.Node = ResolvedNode;
> +    Type = Element->Reference.Node->Type;
> +
> +    /*
> +     * Attempt to resolve the node to a value before we insert it into
> +     * the package. If this is a reference to a common data type,
> +     * resolve it immediately. According to the ACPI spec, package
> +     * elements can only be "data objects" or method references.
> +     * Attempt to resolve to an Integer, Buffer, String or Package.
> +     * If cannot, return the named reference (for things like Devices,
> +     * Methods, etc.) Buffer Fields and Fields will resolve to simple
> +     * objects (int/buf/str/pkg).
> +     *
> +     * NOTE: References to things like Devices, Methods, Mutexes, etc.
> +     * will remain as named references. This behavior is not described
> +     * in the ACPI spec, but it appears to be an oversight.
> +     */
> +    Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return_VOID;
> +    }
> +
> +#if 0
> +/* TBD - alias support */
> +    /*
> +     * Special handling for Alias objects. We need to setup the type
> +     * and the Op->Common.Node to point to the Alias target. Note,
> +     * Alias has at most one level of indirection internally.
> +     */
> +    Type = Op->Common.Node->Type;
> +    if (Type == ACPI_TYPE_LOCAL_ALIAS)
> +    {
> +        Type = ObjDesc->Common.Type;
> +        Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> +            Op->Common.Node->Object);
> +    }
> +#endif
> +
> +    switch (Type)
> +    {
> +    /*
> +     * These object types are a result of named references, so we will
> +     * leave them as reference objects. In other words, these types
> +     * have no intrinsic "value".
> +     */
> +    case ACPI_TYPE_DEVICE:
> +    case ACPI_TYPE_THERMAL:
> +
> +        /* TBD: This may not be necesssary */
> +
> +        AcpiUtAddReference (ResolvedNode->Object);
> +        break;
> +
> +    case ACPI_TYPE_MUTEX:
> +    case ACPI_TYPE_METHOD:
> +    case ACPI_TYPE_POWER:
> +    case ACPI_TYPE_PROCESSOR:
> +    case ACPI_TYPE_EVENT:
> +    case ACPI_TYPE_REGION:
> +
> +        break;
> +
> +    default:
> +        /*
> +         * For all other types - the node was resolved to an actual
> +         * operand object with a value, return the object
> +         */
> +        *ElementPtr = (ACPI_OPERAND_OBJECT *) ResolvedNode;
> +        break;
> +    }
> +
> +    return_VOID;
> +}
> diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c
> index 15b38574..a2cce00a 100644
> --- a/src/acpica/source/components/executer/excreate.c
> +++ b/src/acpica/source/components/executer/excreate.c
> @@ -204,70 +204,39 @@ AcpiExCreateAlias (
>       }
>   
>       /* Ensure that the target node is valid */
> +
>       if (!TargetNode)
>       {
>           return_ACPI_STATUS (AE_NULL_OBJECT);
>       }
>   
> -    /*
> -     * For objects that can never change (i.e., the NS node will
> -     * permanently point to the same object), we can simply attach
> -     * the object to the new NS node. For other objects (such as
> -     * Integers, buffers, etc.), we have to point the Alias node
> -     * to the original Node.
> -     */
> +    /* Construct the alias object (a namespace node) */
> +
>       switch (TargetNode->Type)
>       {
> -
> -    /* For these types, the sub-object can change dynamically via a Store */
> -
> -    case ACPI_TYPE_INTEGER:
> -    case ACPI_TYPE_STRING:
> -    case ACPI_TYPE_BUFFER:
> -    case ACPI_TYPE_PACKAGE:
> -    case ACPI_TYPE_BUFFER_FIELD:
> -    /*
> -     * These types open a new scope, so we need the NS node in order to access
> -     * any children.
> -     */
> -    case ACPI_TYPE_DEVICE:
> -    case ACPI_TYPE_POWER:
> -    case ACPI_TYPE_PROCESSOR:
> -    case ACPI_TYPE_THERMAL:
> -    case ACPI_TYPE_LOCAL_SCOPE:
> -        /*
> -         * The new alias has the type ALIAS and points to the original
> -         * NS node, not the object itself.
> -         */
> -        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
> -        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
> -        break;
> -
>       case ACPI_TYPE_METHOD:
>           /*
> -         * Control method aliases need to be differentiated
> +         * Control method aliases need to be differentiated with
> +         * a special type
>            */
>           AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
> -        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
>           break;
>   
>       default:
> -
> -        /* Attach the original source object to the new Alias Node */
> -
>           /*
> -         * The new alias assumes the type of the target, and it points
> -         * to the same object. The reference count of the object has an
> -         * additional reference to prevent deletion out from under either the
> -         * target node or the alias Node
> +         * All other object types.
> +         *
> +         * The new alias has the type ALIAS and points to the original
> +         * NS node, not the object itself.
>            */
> -        Status = AcpiNsAttachObject (AliasNode,
> -            AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
> +        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
> +        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
>           break;
>       }
>   
>       /* Since both operands are Nodes, we don't need to delete them */
>   
> +    AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
>       return_ACPI_STATUS (Status);
>   }
>   
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 2b23881f..c1069b2c 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -229,7 +229,7 @@ static ACPI_EXDUMP_INFO     AcpiExDumpPackage[6] =
>       {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
>       {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Package.Node),                 "Parent Node"},
>       {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
> -    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Elements"},
> +    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Element Count"},
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
>       {ACPI_EXD_PACKAGE,  0,                                              NULL}
>   };
> @@ -510,6 +510,11 @@ AcpiExDumpObject (
>   
>       while (Count)
>       {
> +        if (!ObjDesc)
> +        {
> +            return;
> +        }
> +
>           Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
>           Name = Info->Name;
>   
> @@ -522,7 +527,8 @@ AcpiExDumpObject (
>           case ACPI_EXD_TYPE:
>   
>               AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
> -                ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
> +                ObjDesc->Common.Type,
> +                AcpiUtGetObjectTypeName (ObjDesc));
>               break;
>   
>           case ACPI_EXD_UINT8:
> @@ -588,10 +594,10 @@ AcpiExDumpObject (
>               Start = *ACPI_CAST_PTR (void *, Target);
>               Next = Start;
>   
> -            AcpiOsPrintf ("%20s : %p", Name, Next);
> +            AcpiOsPrintf ("%20s : %p ", Name, Next);
>               if (Next)
>               {
> -                AcpiOsPrintf ("(%s %2.2X)",
> +                AcpiOsPrintf ("%s (Type %2.2X)",
>                       AcpiUtGetObjectTypeName (Next), Next->Common.Type);
>   
>                   while (Next->Common.NextObject)
> @@ -614,6 +620,10 @@ AcpiExDumpObject (
>                       }
>                   }
>               }
> +            else
> +            {
> +                AcpiOsPrintf ("- No attached objects");
> +            }
>   
>               AcpiOsPrintf ("\n");
>               break;
> @@ -1294,7 +1304,8 @@ AcpiExDumpPackageObj (
>   
>       default:
>   
> -        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
> +        AcpiOsPrintf ("[%s] Type: %2.2X\n",
> +            AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
>           break;
>       }
>   }
> @@ -1338,10 +1349,19 @@ AcpiExDumpObjectDescriptor (
>       {
>           AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
>   
> -        AcpiOsPrintf ("\nAttached Object (%p):\n",
> -            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
> -
>           ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
> +        if (!ObjDesc)
> +        {
> +            return_VOID;
> +        }
> +
> +        AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
> +        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
> +        {
> +            AcpiOsPrintf (" - Namespace Node");
> +        }
> +
> +        AcpiOsPrintf (":\n");
>           goto DumpObject;
>       }
>   
> @@ -1365,6 +1385,11 @@ AcpiExDumpObjectDescriptor (
>   
>   DumpObject:
>   
> +    if (!ObjDesc)
> +    {
> +        return_VOID;
> +    }
> +
>       /* Common Fields */
>   
>       AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
> diff --git a/src/acpica/source/components/executer/exmisc.c b/src/acpica/source/components/executer/exmisc.c
> index b1fc02d2..dfa4421a 100644
> --- a/src/acpica/source/components/executer/exmisc.c
> +++ b/src/acpica/source/components/executer/exmisc.c
> @@ -401,6 +401,8 @@ AcpiExDoLogicalNumericOp (
>   
>       default:
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Invalid numeric logical opcode: %X", Opcode));
>           Status = AE_AML_INTERNAL;
>           break;
>       }
> @@ -486,6 +488,9 @@ AcpiExDoLogicalOp (
>   
>       default:
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Invalid object type for logical operator: %X",
> +            Operand0->Common.Type));
>           Status = AE_AML_INTERNAL;
>           break;
>       }
> @@ -535,6 +540,8 @@ AcpiExDoLogicalOp (
>   
>           default:
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Invalid comparison opcode: %X", Opcode));
>               Status = AE_AML_INTERNAL;
>               break;
>           }
> @@ -613,6 +620,8 @@ AcpiExDoLogicalOp (
>   
>           default:
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Invalid comparison opcode: %X", Opcode));
>               Status = AE_AML_INTERNAL;
>               break;
>           }
> diff --git a/src/acpica/source/components/executer/exoparg2.c b/src/acpica/source/components/executer/exoparg2.c
> index 3ce965a6..f4bf9c17 100644
> --- a/src/acpica/source/components/executer/exoparg2.c
> +++ b/src/acpica/source/components/executer/exoparg2.c
> @@ -556,6 +556,8 @@ AcpiExOpcode_2A_1T_1R (
>   
>           default:
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Invalid object type: %X", (Operand[0])->Common.Type));
>               Status = AE_AML_INTERNAL;
>               goto Cleanup;
>           }
> diff --git a/src/acpica/source/components/hardware/hwregs.c b/src/acpica/source/components/hardware/hwregs.c
> index e90fd148..b5b23831 100644
> --- a/src/acpica/source/components/hardware/hwregs.c
> +++ b/src/acpica/source/components/hardware/hwregs.c
> @@ -228,7 +228,7 @@ AcpiHwGetAccessBitWidth (
>       }
>       else if (Reg->AccessWidth)
>       {
> -        AccessBitWidth = (1 << (Reg->AccessWidth + 2));
> +        AccessBitWidth = ACPI_ACCESS_BIT_WIDTH (Reg->AccessWidth);
>       }
>       else
>       {
> diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
> index 89d766b4..0ae1fbdd 100644
> --- a/src/acpica/source/components/namespace/nsaccess.c
> +++ b/src/acpica/source/components/namespace/nsaccess.c
> @@ -410,6 +410,7 @@ AcpiNsLookup (
>   {
>       ACPI_STATUS             Status;
>       char                    *Path = Pathname;
> +    char                    *ExternalPath;
>       ACPI_NAMESPACE_NODE     *PrefixNode;
>       ACPI_NAMESPACE_NODE     *CurrentNode = NULL;
>       ACPI_NAMESPACE_NODE     *ThisNode = NULL;
> @@ -556,11 +557,21 @@ AcpiNsLookup (
>                   ThisNode = ThisNode->Parent;
>                   if (!ThisNode)
>                   {
> -                    /* Current scope has no parent scope */
> +                    /*
> +                     * Current scope has no parent scope. Externalize
> +                     * the internal path for error message.
> +                     */
> +                    Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Pathname,
> +                        NULL, &ExternalPath);
> +                    if (ACPI_SUCCESS (Status))
> +                    {
> +                        ACPI_ERROR ((AE_INFO,
> +                            "%s: Path has too many parent prefixes (^)",
> +                            ExternalPath));
> +
> +                        ACPI_FREE (ExternalPath);
> +                    }
>   
> -                    ACPI_ERROR ((AE_INFO,
> -                        "%s: Path has too many parent prefixes (^) "
> -                        "- reached beyond root node", Pathname));
>                       return_ACPI_STATUS (AE_NOT_FOUND);
>                   }
>               }
> diff --git a/src/acpica/source/components/namespace/nsarguments.c b/src/acpica/source/components/namespace/nsarguments.c
> index 0412672a..0a7fa3d9 100644
> --- a/src/acpica/source/components/namespace/nsarguments.c
> +++ b/src/acpica/source/components/namespace/nsarguments.c
> @@ -183,9 +183,14 @@ AcpiNsCheckArgumentTypes (
>       UINT32                      i;
>   
>   
> -    /* If not a predefined name, cannot typecheck args */
> -
> -    if (!Info->Predefined)
> +    /*
> +     * If not a predefined name, cannot typecheck args, because
> +     * we have no idea what argument types are expected.
> +     * Also, ignore typecheck if warnings/errors if this method
> +     * has already been evaluated at least once -- in order
> +     * to suppress repetitive messages.
> +     */
> +    if (!Info->Predefined || (Info->Node->Flags & ANOBJ_EVALUATED))
>       {
>           return;
>       }
> @@ -207,6 +212,10 @@ AcpiNsCheckArgumentTypes (
>                   "Found [%s], ACPI requires [%s]", (i + 1),
>                   AcpiUtGetTypeName (UserArgType),
>                   AcpiUtGetTypeName (ArgType)));
> +
> +            /* Prevent any additional typechecking for this method */
> +
> +            Info->Node->Flags |= ANOBJ_EVALUATED;
>           }
>       }
>   }
> @@ -238,7 +247,7 @@ AcpiNsCheckAcpiCompliance (
>       UINT32                      RequiredParamCount;
>   
>   
> -    if (!Predefined)
> +    if (!Predefined || (Node->Flags & ANOBJ_EVALUATED))
>       {
>           return;
>       }
> @@ -332,6 +341,11 @@ AcpiNsCheckArgumentCount (
>       UINT32                      RequiredParamCount;
>   
>   
> +    if (Node->Flags & ANOBJ_EVALUATED)
> +    {
> +        return;
> +    }
> +
>       if (!Predefined)
>       {
>           /*
> diff --git a/src/acpica/source/components/namespace/nsinit.c b/src/acpica/source/components/namespace/nsinit.c
> index d4286bf8..2786e24c 100644
> --- a/src/acpica/source/components/namespace/nsinit.c
> +++ b/src/acpica/source/components/namespace/nsinit.c
> @@ -535,6 +535,20 @@ AcpiNsInitOneObject (
>   
>           Info->PackageInit++;
>           Status = AcpiDsGetPackageArguments (ObjDesc);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            break;
> +        }
> +
> +        /*
> +         * Resolve all named references in package objects (and all
> +         * sub-packages). This action has been deferred until the entire
> +         * namespace has been loaded, in order to support external and
> +         * forward references from individual package elements (05/2017).
> +         */
> +        Status = AcpiUtWalkPackageTree (ObjDesc, NULL,
> +            AcpiDsInitPackageElement, NULL);
> +        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
>           break;
>   
>       default:
> diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
> index f68fbc1e..fb74c44c 100644
> --- a/src/acpica/source/components/namespace/nsnames.c
> +++ b/src/acpica/source/components/namespace/nsnames.c
> @@ -208,8 +208,15 @@ AcpiNsGetPathnameLength (
>       ACPI_SIZE               Size;
>   
>   
> -    ACPI_FUNCTION_ENTRY ();
> +    /* Validate the Node */
>   
> +    if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
> +    {
> +        ACPI_ERROR ((AE_INFO,
> +            "Invalid/cached reference target node: %p, descriptor type %d",
> +            Node, ACPI_GET_DESCRIPTOR_TYPE (Node)));
> +        return (0);
> +    }
>   
>       Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE);
>       return (Size);
> diff --git a/src/acpica/source/components/namespace/nsprepkg.c b/src/acpica/source/components/namespace/nsprepkg.c
> index 84856817..6ad53d61 100644
> --- a/src/acpica/source/components/namespace/nsprepkg.c
> +++ b/src/acpica/source/components/namespace/nsprepkg.c
> @@ -722,6 +722,8 @@ AcpiNsCheckPackageList (
>   
>           default: /* Should not get here, type was validated by caller */
>   
> +            ACPI_ERROR ((AE_INFO, "Invalid Package type: %X",
> +                Package->RetInfo.Type));
>               return (AE_AML_INTERNAL);
>           }
>   
> diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c
> index 649f0276..fe7fe6d0 100644
> --- a/src/acpica/source/components/parser/psloop.c
> +++ b/src/acpica/source/components/parser/psloop.c
> @@ -282,6 +282,9 @@ AcpiPsGetArguments (
>               INCREMENT_ARG_LIST (WalkState->ArgTypes);
>           }
>   
> +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
> +            "Final argument count: %u pass %u\n",
> +            WalkState->ArgCount, WalkState->PassNumber));
>   
>           /*
>            * Handle executable code at "module-level". This refers to
> @@ -380,6 +383,10 @@ AcpiPsGetArguments (
>                   (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
>                   (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
>               {
> +                ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
> +                    "Setup Package/Buffer: Pass %u, AML Ptr: %p\n",
> +                    WalkState->PassNumber, AmlOpStart));
> +
>                   /*
>                    * Skip parsing of Buffers and Packages because we don't have
>                    * enough info in the first pass to parse them correctly.
> @@ -689,6 +696,9 @@ AcpiPsParseLoop (
>   
>           /* Check for arguments that need to be processed */
>   
> +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
> +            "Parseloop: argument count: %u\n", WalkState->ArgCount));
> +
>           if (WalkState->ArgCount)
>           {
>               /*
> diff --git a/src/acpica/source/components/resources/rsxface.c b/src/acpica/source/components/resources/rsxface.c
> index 5e3f7352..2c27eaf5 100644
> --- a/src/acpica/source/components/resources/rsxface.c
> +++ b/src/acpica/source/components/resources/rsxface.c
> @@ -796,7 +796,7 @@ ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer)
>    *                                device we are querying
>    *              Name            - Method name of the resources we want.
>    *                                (METHOD_NAME__CRS, METHOD_NAME__PRS, or
> - *                                METHOD_NAME__AEI)
> + *                                METHOD_NAME__AEI or METHOD_NAME__DMA)
>    *              UserFunction    - Called for each resource
>    *              Context         - Passed to UserFunction
>    *
> @@ -827,12 +827,13 @@ AcpiWalkResources (
>       if (!DeviceHandle || !UserFunction || !Name ||
>           (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
>            !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) &&
> -         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI)))
> +         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI) &&
> +         !ACPI_COMPARE_NAME (Name, METHOD_NAME__DMA)))
>       {
>           return_ACPI_STATUS (AE_BAD_PARAMETER);
>       }
>   
> -    /* Get the _CRS/_PRS/_AEI resource list */
> +    /* Get the _CRS/_PRS/_AEI/_DMA resource list */
>   
>       Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
>       Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
> diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c
> index 47096186..18e58f9d 100644
> --- a/src/acpica/source/components/tables/tbdata.c
> +++ b/src/acpica/source/components/tables/tbdata.c
> @@ -648,6 +648,8 @@ AcpiTbCheckDuplication (
>    *
>    * DESCRIPTION: This function is called to validate and verify the table, the
>    *              returned table descriptor is in "VALIDATED" state.
> + *              Note that 'TableIndex' is required to be set to !NULL to
> + *              enable duplication check.
>    *
>    *****************************************************************************/
>   
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 5fd178f5..d8cb6b18 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -293,7 +293,7 @@ AcpiReallocateRootTable (
>   {
>       ACPI_STATUS             Status;
>       ACPI_TABLE_DESC         *TableDesc;
> -    UINT32                  i;
> +    UINT32                  i, j;
>   
>   
>       ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
> @@ -339,7 +339,7 @@ AcpiReallocateRootTable (
>               TableDesc = &AcpiGbl_RootTableList.Tables[i];
>               if (!(TableDesc->Flags & ACPI_TABLE_IS_VERIFIED))
>               {
> -                Status = AcpiTbVerifyTempTable (TableDesc, NULL, NULL);
> +                Status = AcpiTbVerifyTempTable (TableDesc, NULL, &j);
>                   if (ACPI_FAILURE (Status))
>                   {
>                       AcpiTbUninstallTable (TableDesc);
> diff --git a/src/acpica/source/components/utilities/uthex.c b/src/acpica/source/components/utilities/uthex.c
> index 7f507697..8c7bcccc 100644
> --- a/src/acpica/source/components/utilities/uthex.c
> +++ b/src/acpica/source/components/utilities/uthex.c
> @@ -183,8 +183,10 @@ AcpiUtHexToAsciiChar (
>       UINT64                  Integer,
>       UINT32                  Position)
>   {
> +    UINT64                  Index;
>   
> -    return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
> +    AcpiUtShortShiftRight (Integer, Position, &Index);
> +    return (AcpiGbl_HexToAscii[Index & 0xF]);
>   }
>   
>   
> diff --git a/src/acpica/source/components/utilities/utmath.c b/src/acpica/source/components/utilities/utmath.c
> index 1da5f9ad..4aa94025 100644
> --- a/src/acpica/source/components/utilities/utmath.c
> +++ b/src/acpica/source/components/utilities/utmath.c
> @@ -156,16 +156,6 @@
>   #define _COMPONENT          ACPI_UTILITIES
>           ACPI_MODULE_NAME    ("utmath")
>   
> -/*
> - * Optional support for 64-bit double-precision integer divide. This code
> - * is configurable and is implemented in order to support 32-bit kernel
> - * environments where a 64-bit double-precision math library is not available.
> - *
> - * Support for a more normal 64-bit divide/modulo (with check for a divide-
> - * by-zero) appears after this optional section of code.
> - */
> -#ifndef ACPI_USE_NATIVE_DIVIDE
> -
>   /* Structures used only for 64-bit divide */
>   
>   typedef struct uint64_struct
> @@ -182,6 +172,257 @@ typedef union uint64_overlay
>   
>   } UINT64_OVERLAY;
>   
> +/*
> + * Optional support for 64-bit double-precision integer multiply and shift.
> + * This code is configurable and is implemented in order to support 32-bit
> + * kernel environments where a 64-bit double-precision math library is not
> + * available.
> + */
> +#ifndef ACPI_USE_NATIVE_MATH64
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortMultiply
> + *
> + * PARAMETERS:  Multiplicand        - 64-bit multiplicand
> + *              Multiplier          - 32-bit multiplier
> + *              OutProduct          - Pointer to where the product is returned
> + *
> + * DESCRIPTION: Perform a short multiply.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortMultiply (
> +    UINT64                  Multiplicand,
> +    UINT32                  Multiplier,
> +    UINT64                  *OutProduct)
> +{
> +    UINT64_OVERLAY          MultiplicandOvl;
> +    UINT64_OVERLAY          Product;
> +    UINT32                  Carry32;
> +
> +
> +    ACPI_FUNCTION_TRACE (UtShortMultiply);
> +
> +
> +    MultiplicandOvl.Full = Multiplicand;
> +
> +    /*
> +     * The Product is 64 bits, the carry is always 32 bits,
> +     * and is generated by the second multiply.
> +     */
> +    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Hi, Multiplier,
> +        Product.Part.Hi, Carry32);
> +
> +    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Lo, Multiplier,
> +        Product.Part.Lo, Carry32);
> +
> +    Product.Part.Hi += Carry32;
> +
> +    /* Return only what was requested */
> +
> +    if (OutProduct)
> +    {
> +        *OutProduct = Product.Full;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftLeft
> + *
> + * PARAMETERS:  Operand             - 64-bit shift operand
> + *              Count               - 32-bit shift count
> + *              OutResult           - Pointer to where the result is returned
> + *
> + * DESCRIPTION: Perform a short left shift.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftLeft (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +    UINT64_OVERLAY          OperandOvl;
> +
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
> +
> +
> +    OperandOvl.Full = Operand;
> +
> +    if ((Count & 63) >= 32)
> +    {
> +        OperandOvl.Part.Hi = OperandOvl.Part.Lo;
> +        OperandOvl.Part.Lo ^= OperandOvl.Part.Lo;
> +        Count = (Count & 63) - 32;
> +    }
> +    ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
> +        OperandOvl.Part.Lo, Count);
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = OperandOvl.Full;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftRight
> + *
> + * PARAMETERS:  Operand             - 64-bit shift operand
> + *              Count               - 32-bit shift count
> + *              OutResult           - Pointer to where the result is returned
> + *
> + * DESCRIPTION: Perform a short right shift.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftRight (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +    UINT64_OVERLAY          OperandOvl;
> +
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftRight);
> +
> +
> +    OperandOvl.Full = Operand;
> +
> +    if ((Count & 63) >= 32)
> +    {
> +        OperandOvl.Part.Lo = OperandOvl.Part.Hi;
> +        OperandOvl.Part.Hi ^= OperandOvl.Part.Hi;
> +        Count = (Count & 63) - 32;
> +    }
> +    ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
> +        OperandOvl.Part.Lo, Count);
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = OperandOvl.Full;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +#else
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortMultiply
> + *
> + * PARAMETERS:  See function headers above
> + *
> + * DESCRIPTION: Native version of the UtShortMultiply function.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortMultiply (
> +    UINT64                  Multiplicand,
> +    UINT32                  Multiplier,
> +    UINT64                  *OutProduct)
> +{
> +
> +    ACPI_FUNCTION_TRACE (UtShortMultiply);
> +
> +
> +    /* Return only what was requested */
> +
> +    if (OutProduct)
> +    {
> +        *OutProduct = Multiplicand * Multiplier;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftLeft
> + *
> + * PARAMETERS:  See function headers above
> + *
> + * DESCRIPTION: Native version of the UtShortShiftLeft function.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftLeft (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
> +
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = Operand << Count;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftRight
> + *
> + * PARAMETERS:  See function headers above
> + *
> + * DESCRIPTION: Native version of the UtShortShiftRight function.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftRight (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftRight);
> +
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = Operand >> Count;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +#endif
> +
> +/*
> + * Optional support for 64-bit double-precision integer divide. This code
> + * is configurable and is implemented in order to support 32-bit kernel
> + * environments where a 64-bit double-precision math library is not available.
> + *
> + * Support for a more normal 64-bit divide/modulo (with check for a divide-
> + * by-zero) appears after this optional section of code.
> + */
> +#ifndef ACPI_USE_NATIVE_DIVIDE
> +
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
> index 33e51f5c..7280bca7 100644
> --- a/src/acpica/source/components/utilities/utmisc.c
> +++ b/src/acpica/source/components/utilities/utmisc.c
> @@ -363,7 +363,7 @@ AcpiUtCreateUpdateStateAndPush (
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Walk through a package
> + * DESCRIPTION: Walk through a package, including subpackages
>    *
>    ******************************************************************************/
>   
> @@ -377,8 +377,8 @@ AcpiUtWalkPackageTree (
>       ACPI_STATUS             Status = AE_OK;
>       ACPI_GENERIC_STATE      *StateList = NULL;
>       ACPI_GENERIC_STATE      *State;
> -    UINT32                  ThisIndex;
>       ACPI_OPERAND_OBJECT     *ThisSourceObj;
> +    UINT32                  ThisIndex;
>   
>   
>       ACPI_FUNCTION_TRACE (UtWalkPackageTree);
> @@ -395,8 +395,10 @@ AcpiUtWalkPackageTree (
>           /* Get one element of the package */
>   
>           ThisIndex = State->Pkg.Index;
> -        ThisSourceObj = (ACPI_OPERAND_OBJECT *)
> +        ThisSourceObj =
>               State->Pkg.SourceObject->Package.Elements[ThisIndex];
> +        State->Pkg.ThisTargetObj =
> +            &State->Pkg.SourceObject->Package.Elements[ThisIndex];
>   
>           /*
>            * Check for:
> @@ -412,7 +414,7 @@ AcpiUtWalkPackageTree (
>               (ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
>           {
>               Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
> -                                    State, Context);
> +                State, Context);
>               if (ACPI_FAILURE (Status))
>               {
>                   return_ACPI_STATUS (Status);
> @@ -485,6 +487,9 @@ AcpiUtWalkPackageTree (
>   
>       /* We should never get here */
>   
> +    ACPI_ERROR ((AE_INFO,
> +        "State list did not terminate correctly"));
> +
>       return_ACPI_STATUS (AE_AML_INTERNAL);
>   }
>   
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index a94c882e..65aae85f 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -651,6 +651,10 @@ AcpiUtGetSimpleObjectSize (
>       {
>           /* A namespace node should never get here */
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Received a namespace node [%4.4s] "
> +            "where an operand object is required",
> +            ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, InternalObject)->Name.Ascii));
>           return_ACPI_STATUS (AE_AML_INTERNAL);
>       }
>   
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index e34662c8..da4fdc43 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -360,14 +360,11 @@ AcpiUtWalkAmlResources (
>               }
>   
>               /*
> -             * The EndTag opcode must be followed by a zero byte.
> -             * Although this byte is technically defined to be a checksum,
> -             * in practice, all ASL compilers set this byte to zero.
> +             * Don't attempt to perform any validation on the 2nd byte.
> +             * Although all known ASL compilers insert a zero for the 2nd
> +             * byte, it can also be a checksum (as per the ACPI spec),
> +             * and this is occasionally seen in the field. July 2017.
>                */
> -            if (*(Aml + 1) != 0)
> -            {
> -                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
> -            }
>   
>               /* Return the pointer to the EndTag if requested */
>   
> diff --git a/src/acpica/source/components/utilities/utstate.c b/src/acpica/source/components/utilities/utstate.c
> index 2d75c894..8effe5ba 100644
> --- a/src/acpica/source/components/utilities/utstate.c
> +++ b/src/acpica/source/components/utilities/utstate.c
> @@ -363,7 +363,7 @@ ACPI_GENERIC_STATE *
>   AcpiUtCreatePkgState (
>       void                    *InternalObject,
>       void                    *ExternalObject,
> -    UINT16                  Index)
> +    UINT32                  Index)
>   {
>       ACPI_GENERIC_STATE      *State;
>   
> diff --git a/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
> index a3c52b9e..d91e9084 100644
> --- a/src/acpica/source/components/utilities/utstrtoul64.c
> +++ b/src/acpica/source/components/utilities/utstrtoul64.c
> @@ -419,8 +419,8 @@ AcpiUtStrtoulBase10 (
>   
>           /* Convert and insert (add) the decimal digit */
>   
> -        NextValue =
> -            (ReturnValue * 10) + (AsciiDigit - ACPI_ASCII_ZERO);
> +        AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
> +        NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
>   
>           /* Check for overflow (32 or 64 bit) - return current converted value */
>   
> @@ -486,8 +486,8 @@ AcpiUtStrtoulBase16 (
>   
>           /* Convert and insert the hex digit */
>   
> -        ReturnValue =
> -            (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit);
> +        AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
> +        ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
>   
>           String++;
>           ValidDigits++;
> diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
> index 3ac6a381..a88a4a3d 100644
> --- a/src/acpica/source/components/utilities/uttrack.c
> +++ b/src/acpica/source/components/utilities/uttrack.c
> @@ -776,6 +776,11 @@ AcpiUtDumpAllocations (
>           return_VOID;
>       }
>   
> +    if (!AcpiGbl_GlobalList)
> +    {
> +        goto Exit;
> +    }
> +
>       Element = AcpiGbl_GlobalList->ListHead;
>       while (Element)
>       {
> @@ -787,7 +792,7 @@ AcpiUtDumpAllocations (
>   
>               if (Element->Size < sizeof (ACPI_COMMON_DESCRIPTOR))
>               {
> -                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u "
> +                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u "
>                       "[Not a Descriptor - too small]\n",
>                       Descriptor, Element->Size, Element->Module,
>                       Element->Line);
> @@ -799,7 +804,7 @@ AcpiUtDumpAllocations (
>                   if (ACPI_GET_DESCRIPTOR_TYPE (Descriptor) !=
>                       ACPI_DESC_TYPE_CACHED)
>                   {
> -                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u [%s] ",
> +                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u [%s] ",
>                           Descriptor, Element->Size, Element->Module,
>                           Element->Line, AcpiUtGetDescriptorName (Descriptor));
>   
> @@ -875,6 +880,7 @@ AcpiUtDumpAllocations (
>           Element = Element->Next;
>       }
>   
> +Exit:
>       (void) AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
>   
>       /* Print summary */
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 5beec2d4..26d4f47b 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -271,6 +271,7 @@ typedef enum
>       ACPI_DMT_PCCT,
>       ACPI_DMT_PMTT,
>       ACPI_DMT_PPTT,
> +    ACPI_DMT_SDEI,
>       ACPI_DMT_SLIC,
>       ACPI_DMT_SRAT,
>   
> @@ -527,6 +528,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3ptHdr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt0[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt1[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSbst[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdei[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlic[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlit[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSpcr[];
> diff --git a/src/acpica/source/include/acdispat.h b/src/acpica/source/include/acdispat.h
> index 1c294c3a..bae3d794 100644
> --- a/src/acpica/source/include/acdispat.h
> +++ b/src/acpica/source/include/acdispat.h
> @@ -409,6 +409,12 @@ AcpiDsInitializeObjects (
>    * dsobject - Parser/Interpreter interface - object initialization and conversion
>    */
>   ACPI_STATUS
> +AcpiDsBuildInternalObject (
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_PARSE_OBJECT       *Op,
> +    ACPI_OPERAND_OBJECT     **ObjDescPtr);
> +
> +ACPI_STATUS
>   AcpiDsBuildInternalBufferObj (
>       ACPI_WALK_STATE         *WalkState,
>       ACPI_PARSE_OBJECT       *Op,
> @@ -437,6 +443,17 @@ AcpiDsCreateNode (
>   
>   
>   /*
> + * dspkginit - Package object initialization
> + */
> +ACPI_STATUS
> +AcpiDsInitPackageElement (
> +    UINT8                   ObjectType,
> +    ACPI_OPERAND_OBJECT     *SourceObject,
> +    ACPI_GENERIC_STATE      *State,
> +    void                    *Context);
> +
> +
> +/*
>    * dsutils - Parser/Interpreter interface utility routines
>    */
>   void
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index 399e4c06..00be20ed 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -813,7 +813,7 @@ typedef struct acpi_update_state
>   typedef struct acpi_pkg_state
>   {
>       ACPI_STATE_COMMON
> -    UINT16                          Index;
> +    UINT32                          Index;
>       union acpi_operand_object       *SourceObject;
>       union acpi_operand_object       *DestObject;
>       struct acpi_walk_state          *WalkState;
> diff --git a/src/acpica/source/include/acnames.h b/src/acpica/source/include/acnames.h
> index 27b0b970..69f88844 100644
> --- a/src/acpica/source/include/acnames.h
> +++ b/src/acpica/source/include/acnames.h
> @@ -162,6 +162,7 @@
>   #define METHOD_NAME__CLS        "_CLS"
>   #define METHOD_NAME__CRS        "_CRS"
>   #define METHOD_NAME__DDN        "_DDN"
> +#define METHOD_NAME__DMA        "_DMA"
>   #define METHOD_NAME__HID        "_HID"
>   #define METHOD_NAME__INI        "_INI"
>   #define METHOD_NAME__PLD        "_PLD"
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index f0376097..7dce4cee 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -546,11 +546,12 @@ typedef struct acpi_object_reference
>       ACPI_OBJECT_COMMON_HEADER
>       UINT8                           Class;              /* Reference Class */
>       UINT8                           TargetType;         /* Used for Index Op */
> -    UINT8                           Reserved;
> +    UINT8                           Resolved;           /* Reference has been resolved to a value */
>       void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
>       ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
>       union acpi_operand_object       **Where;            /* Target of Index */
>       UINT8                           *IndexPointer;      /* Used for Buffers and Strings */
> +    UINT8                           *Aml;               /* Used for deferred resolution of the ref */
>       UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
>   
>   } ACPI_OBJECT_REFERENCE;
> @@ -571,7 +572,6 @@ typedef enum
>   
>   } ACPI_REFERENCE_CLASSES;
>   
> -
>   /*
>    * Extra object is used as additional storage for types that
>    * have AML code in their declarations (TermArgs) that must be
> diff --git a/src/acpica/source/include/acpi.h b/src/acpica/source/include/acpi.h
> index 46d75eb7..8c4152b8 100644
> --- a/src/acpica/source/include/acpi.h
> +++ b/src/acpica/source/include/acpi.h
> @@ -162,14 +162,14 @@
>    * Note: The order of these include files is important.
>    */
>   #include "platform/acenv.h"     /* Environment-specific items */
> -#include "acnames.h"            /* Common ACPI names and strings */
>   #include "actypes.h"            /* ACPICA data types and structures */
> +#include "platform/acenvex.h"   /* Extra environment-specific items */
> +#include "acnames.h"            /* Common ACPI names and strings */
>   #include "acexcep.h"            /* ACPICA exceptions */
>   #include "actbl.h"              /* ACPI table definitions */
>   #include "acoutput.h"           /* Error output and Debug macros */
>   #include "acrestyp.h"           /* Resource Descriptor structs */
>   #include "acpiosxf.h"           /* OSL interfaces (ACPICA-to-OS) */
>   #include "acpixf.h"             /* ACPI core subsystem external interfaces */
> -#include "platform/acenvex.h"   /* Extra environment-specific items */
>   
>   #endif /* __ACPI_H__ */
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 7aad8386..7a24391d 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -154,7 +154,7 @@
>   
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>   
> -#define ACPI_CA_VERSION                 0x20170629
> +#define ACPI_CA_VERSION                 0x20170728
>   
>   #include "acconfig.h"
>   #include "actypes.h"
> diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
> index 1e91ffc5..18cfdd46 100644
> --- a/src/acpica/source/include/actbl2.h
> +++ b/src/acpica/source/include/actbl2.h
> @@ -186,6 +186,7 @@
>   #define ACPI_SIG_MCHI           "MCHI"      /* Management Controller Host Interface table */
>   #define ACPI_SIG_MSDM           "MSDM"      /* Microsoft Data Management Table */
>   #define ACPI_SIG_MTMR           "MTMR"      /* MID Timer table */
> +#define ACPI_SIG_SDEI           "SDEI"      /* Software Delegated Exception Interface Table */
>   #define ACPI_SIG_SLIC           "SLIC"      /* Software Licensing Description Table */
>   #define ACPI_SIG_SPCR           "SPCR"      /* Serial Port Console Redirection table */
>   #define ACPI_SIG_SPMI           "SPMI"      /* Server Platform Management Interface table */
> @@ -1422,6 +1423,21 @@ typedef struct acpi_mtmr_entry
>   
>   } ACPI_MTMR_ENTRY;
>   
> +/*******************************************************************************
> + *
> + * SDEI - Software Delegated Exception Interface Descriptor Table
> + *
> + * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
> + * May 8th, 2017. Copyright 2017 ARM Ltd.
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_sdei
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_SDEI;
> +
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index 843adec7..1839f936 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -276,6 +276,7 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
>   #define ACPI_MAX_PTR                    ACPI_UINT64_MAX
>   #define ACPI_SIZE_MAX                   ACPI_UINT64_MAX
>   #define ACPI_USE_NATIVE_DIVIDE          /* Has native 64-bit integer support */
> +#define ACPI_USE_NATIVE_MATH64          /* Has native 64-bit integer support */
>   
>   /*
>    * In the case of the Itanium Processor Family (IPF), the hardware does not
> @@ -675,6 +676,13 @@ typedef UINT64                          ACPI_INTEGER;
>   #define ACPI_VALIDATE_RSDP_SIG(a)       (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
>   #define ACPI_MAKE_RSDP_SIG(dest)        (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
>   
> +/*
> + * Algorithm to obtain access bit width.
> + * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
> + * ACPI_RESOURCE_GENERIC_REGISTER.
> + */
> +#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
> +
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 46588a40..bca4a94c 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -845,7 +845,7 @@ ACPI_GENERIC_STATE *
>   AcpiUtCreatePkgState (
>       void                    *InternalObject,
>       void                    *ExternalObject,
> -    UINT16                  Index);
> +    UINT32                  Index);
>   
>   ACPI_STATUS
>   AcpiUtCreateUpdateStateAndPush (
> @@ -879,6 +879,24 @@ AcpiUtShortDivide (
>       UINT64                  *OutQuotient,
>       UINT32                  *OutRemainder);
>   
> +ACPI_STATUS
> +AcpiUtShortMultiply (
> +    UINT64                  InMultiplicand,
> +    UINT32                  Multiplier,
> +    UINT64                  *Outproduct);
> +
> +ACPI_STATUS
> +AcpiUtShortShiftLeft (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult);
> +
> +ACPI_STATUS
> +AcpiUtShortShiftRight (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult);
> +
>   
>   /*
>    * utmisc
> diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
> index da719a7d..74c7108b 100644
> --- a/src/acpica/source/include/platform/acgcc.h
> +++ b/src/acpica/source/include/platform/acgcc.h
> @@ -192,4 +192,8 @@ typedef __builtin_va_list       va_list;
>   
>   #define COMPILER_VA_MACRO               1
>   
> +/* GCC supports native multiply/shift on 32-bit platforms */
> +
> +#define ACPI_USE_NATIVE_MATH64
> +
>   #endif /* __ACGCC_H__ */
> diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
> index b287e4d9..75b1d827 100644
> --- a/src/acpica/source/include/platform/aclinux.h
> +++ b/src/acpica/source/include/platform/aclinux.h
> @@ -237,6 +237,7 @@
>   /* Host-dependent types and defines for in-kernel ACPICA */
>   
>   #define ACPI_MACHINE_WIDTH          BITS_PER_LONG
> +#define ACPI_USE_NATIVE_MATH64
>   #define ACPI_EXPORT_SYMBOL(symbol)  EXPORT_SYMBOL(symbol);
>   #define strtoul                     simple_strtoul
>   
> @@ -325,6 +326,7 @@
>   #define COMPILER_DEPENDENT_INT64    long long
>   #define COMPILER_DEPENDENT_UINT64   unsigned long long
>   #define ACPI_USE_NATIVE_DIVIDE
> +#define ACPI_USE_NATIVE_MATH64
>   #endif
>   
>   #ifndef __cdecl
> 

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu Aug. 10, 2017, 8:09 a.m. UTC | #2
On 08/06/2017 06:23 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/pipermail/devel/2017-July/001402.html
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/Makefile.am                             |   1 +
>   src/acpica/source/common/ahtable.c                 |   1 +
>   src/acpica/source/common/dmtable.c                 |   1 +
>   src/acpica/source/common/dmtbinfo.c                |  11 +
>   src/acpica/source/compiler/aslcompile.c            |   1 +
>   src/acpica/source/compiler/aslcompiler.h           |  10 +-
>   src/acpica/source/compiler/aslcompiler.l           |   2 +-
>   src/acpica/source/compiler/aslerror.c              | 165 +++++-
>   src/acpica/source/compiler/aslglobal.h             |   3 +
>   src/acpica/source/compiler/aslmessages.c           |   3 +-
>   src/acpica/source/compiler/aslmessages.h           |   1 +
>   src/acpica/source/compiler/aslparseop.c            |  16 +-
>   src/acpica/source/compiler/aslrules.y              |   1 +
>   src/acpica/source/compiler/asltokens.y             |   1 +
>   src/acpica/source/compiler/asltransform.c          |  31 +
>   src/acpica/source/compiler/asltypes.h              |   9 +
>   src/acpica/source/compiler/aslutils.c              |  67 ++-
>   src/acpica/source/compiler/dtcompile.c             |  21 +-
>   src/acpica/source/compiler/dtcompiler.h            |   1 +
>   src/acpica/source/compiler/dttemplate.h            |   9 +
>   src/acpica/source/compiler/dtutils.c               |   2 +-
>   src/acpica/source/compiler/prmacros.c              |   2 +-
>   src/acpica/source/components/debugger/dbdisply.c   |  33 +-
>   src/acpica/source/components/dispatcher/dsfield.c  |   4 +
>   src/acpica/source/components/dispatcher/dsobject.c | 392 +++----------
>   src/acpica/source/components/dispatcher/dsopcode.c |  10 +
>   .../source/components/dispatcher/dspkginit.c       | 635 +++++++++++++++++++++
>   src/acpica/source/components/executer/excreate.c   |  55 +-
>   src/acpica/source/components/executer/exdump.c     |  41 +-
>   src/acpica/source/components/executer/exmisc.c     |   9 +
>   src/acpica/source/components/executer/exoparg2.c   |   2 +
>   src/acpica/source/components/hardware/hwregs.c     |   2 +-
>   src/acpica/source/components/namespace/nsaccess.c  |  19 +-
>   .../source/components/namespace/nsarguments.c      |  22 +-
>   src/acpica/source/components/namespace/nsinit.c    |  14 +
>   src/acpica/source/components/namespace/nsnames.c   |   9 +-
>   src/acpica/source/components/namespace/nsprepkg.c  |   2 +
>   src/acpica/source/components/parser/psloop.c       |  10 +
>   src/acpica/source/components/resources/rsxface.c   |   7 +-
>   src/acpica/source/components/tables/tbdata.c       |   2 +
>   src/acpica/source/components/tables/tbxface.c      |   4 +-
>   src/acpica/source/components/utilities/uthex.c     |   4 +-
>   src/acpica/source/components/utilities/utmath.c    | 261 ++++++++-
>   src/acpica/source/components/utilities/utmisc.c    |  13 +-
>   src/acpica/source/components/utilities/utobject.c  |   4 +
>   src/acpica/source/components/utilities/utresrc.c   |  11 +-
>   src/acpica/source/components/utilities/utstate.c   |   2 +-
>   .../source/components/utilities/utstrtoul64.c      |   8 +-
>   src/acpica/source/components/utilities/uttrack.c   |  10 +-
>   src/acpica/source/include/acdisasm.h               |   2 +
>   src/acpica/source/include/acdispat.h               |  17 +
>   src/acpica/source/include/aclocal.h                |   2 +-
>   src/acpica/source/include/acnames.h                |   1 +
>   src/acpica/source/include/acobject.h               |   4 +-
>   src/acpica/source/include/acpi.h                   |   4 +-
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/actbl2.h                 |  16 +
>   src/acpica/source/include/actypes.h                |   8 +
>   src/acpica/source/include/acutils.h                |  20 +-
>   src/acpica/source/include/platform/acgcc.h         |   4 +
>   src/acpica/source/include/platform/aclinux.h       |   2 +
>   61 files changed, 1543 insertions(+), 483 deletions(-)
>   create mode 100644 src/acpica/source/components/dispatcher/dspkginit.c
> 
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 4b7ef1da..58b07494 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -116,6 +116,7 @@ libfwtsacpica_la_SOURCES =				\
>   	source/components/dispatcher/dsmethod.c		\
>   	source/components/dispatcher/dsmthdat.c		\
>   	source/components/dispatcher/dsobject.c		\
> +	source/components/dispatcher/dspkginit.c	\
>   	source/components/dispatcher/dsutils.c		\
>   	source/components/dispatcher/dswexec.c		\
>   	source/components/dispatcher/dswload.c		\
> diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
> index 38c1ea20..7aee3c66 100644
> --- a/src/acpica/source/common/ahtable.c
> +++ b/src/acpica/source/common/ahtable.c
> @@ -239,6 +239,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
>       {ACPI_SIG_RSDT, "Root System Description Table"},
>       {ACPI_SIG_S3PT, "S3 Performance Table"},
>       {ACPI_SIG_SBST, "Smart Battery Specification Table"},
> +    {ACPI_SIG_SDEI, "Software Delegated Exception Interface Table"},
>       {ACPI_SIG_SLIC, "Software Licensing Description Table"},
>       {ACPI_SIG_SLIT, "System Locality Information Table"},
>       {ACPI_SIG_SPCR, "Serial Port Console Redirection table"},
> diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
> index b85bb0c3..38248c2c 100644
> --- a/src/acpica/source/common/dmtable.c
> +++ b/src/acpica/source/common/dmtable.c
> @@ -493,6 +493,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>       {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
>       {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
>       {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
> +    {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
>       {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
>       {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
>       {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
> diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
> index 56dd5539..4b902b96 100644
> --- a/src/acpica/source/common/dmtbinfo.c
> +++ b/src/acpica/source/common/dmtbinfo.c
> @@ -218,6 +218,7 @@
>   #define ACPI_RASF_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_RASF,f)
>   #define ACPI_S3PT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_S3PT,f)
>   #define ACPI_SBST_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SBST,f)
> +#define ACPI_SDEI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEI,f)
>   #define ACPI_SLIT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIT,f)
>   #define ACPI_SPCR_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPCR,f)
>   #define ACPI_SPMI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
> @@ -2767,6 +2768,16 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
>       ACPI_DMT_TERMINATOR
>   };
>   
> +/*******************************************************************************
> + *
> + * SDEI - Software Delegated Execption Interface Descriptor Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSdei[] =
> +{
> +    ACPI_DMT_TERMINATOR
> +};
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 181fc364..38568440 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -815,6 +815,7 @@ CmCleanupAndExit (
>       BOOLEAN                 DeleteAmlFile = FALSE;
>   
>   
> +    AslCheckExpectedExceptions ();
>       AePrintErrorLog (ASL_FILE_STDERR);
>       if (Gbl_DebugFlag)
>       {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index c3794246..fdf4dbf7 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -413,12 +413,20 @@ AslError (
>       ACPI_PARSE_OBJECT       *Op,
>       char                    *ExtraMessage);
>   
> +void
> +AslCheckExpectedExceptions (
> +    void);
> +
> +ACPI_STATUS
> +AslExpectException (
> +    char                    *MessageIdString);
> +
>   ACPI_STATUS
>   AslDisableException (
>       char                    *MessageIdString);
>   
>   BOOLEAN
> -AslIsExceptionDisabled (
> +AslIsExceptionIgnored (
>       UINT8                   Level,
>       UINT16                  MessageId);
>   
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index 4b36058b..b49233be 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -809,7 +809,7 @@ NamePathTail                [.]{NameSeg}
>   "__FILE__"                  { count (0); return (PARSEOP___FILE__); }
>   "__LINE__"                  { count (0); return (PARSEOP___LINE__); }
>   "__PATH__"                  { count (0); return (PARSEOP___PATH__); }
> -
> +"__METHOD__"                { count (0); return (PARSEOP___METHOD__); }
>   
>   {NameSeg}                   { char *s;
>                                   count (0);
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index b6f7ee7d..ec91ca3e 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -160,6 +160,16 @@ static void
>   AeAddToErrorLog (
>       ASL_ERROR_MSG           *Enode);
>   
> +static BOOLEAN
> +AslIsExceptionExpected (
> +    UINT8                   Level,
> +    UINT16                  MessageId);
> +
> +static BOOLEAN
> +AslIsExceptionDisabled (
> +    UINT8                   Level,
> +    UINT16                  MessageId);
> +
>   
>   /*******************************************************************************
>    *
> @@ -806,6 +816,115 @@ AslCommonError (
>       return;
>   }
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslIsExceptionIgnored
> + *
> + * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
> + *              MessageId           - Index into global message buffer
> + *
> + * RETURN:      BOOLEAN
> + *
> + * DESCRIPTION: Check if a particular exception is ignored. In this case it
> + *              means that the exception is (expected or disabled.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AslIsExceptionIgnored (
> +    UINT8                   Level,
> +    UINT16                  MessageId)
> +{
> +    BOOLEAN ExceptionIgnored;
> +
> +
> +    /* Note: this allows exception to be disabled and expected */
> +
> +    ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
> +    ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
> +
> +    return (Gbl_AllExceptionsDisabled || ExceptionIgnored);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslCheckExpectException
> + *
> + * PARAMETERS:  none
> + *
> + * RETURN:      none
> + *
> + * DESCRIPTION: Check the global expected messages table and raise an error
> + *              for each message that has not been received.
> + *
> + ******************************************************************************/
> +
> +void
> +AslCheckExpectedExceptions (
> +    void)
> +{
> +    UINT8 i;
> +
> +    for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
> +    {
> +        if (!Gbl_ExpectedMessages[i].MessageReceived)
> +        {
> +            AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
> +                Gbl_ExpectedMessages[i].MessageIdStr);
> +        }
> +    }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslExpectException
> + *
> + * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Enter a message ID into the global expected messages table
> + *              If these messages are not raised during the compilation, throw
> + *              an error.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AslExpectException (
> +    char                    *MessageIdString)
> +{
> +    UINT32                  MessageId;
> +
> +
> +    /* Convert argument to an integer and validate it */
> +
> +    MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
> +
> +    if (MessageId > 6999)
> +    {
> +        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
> +            MessageIdString);
> +        return (AE_BAD_PARAMETER);
> +    }
> +
> +    /* Insert value into the global expected message array */
> +
> +    if (Gbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
> +    {
> +        printf ("Too many messages have been registered as expected (max %u)\n",
> +            ASL_MAX_DISABLED_MESSAGES);
> +        return (AE_LIMIT);
> +    }
> +
> +    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageId = MessageId;
> +    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
> +    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageReceived = FALSE;
> +    Gbl_ExpectedMessagesIndex++;
> +    return (AE_OK);
> +}
> +
>   
>   /*******************************************************************************
>    *
> @@ -866,7 +985,48 @@ AslDisableException (
>    *
>    ******************************************************************************/
>   
> -BOOLEAN
> +static BOOLEAN
> +AslIsExceptionExpected (
> +    UINT8                   Level,
> +    UINT16                  MessageId)
> +{
> +    UINT32                  EncodedMessageId;
> +    UINT32                  i;
> +
> +
> +    /*
> +     * Mark this exception as received
> +     */
> +    EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
> +    for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
> +    {
> +        /* Simple implementation via fixed array */
> +
> +        if (EncodedMessageId == Gbl_ExpectedMessages[i].MessageId)
> +        {
> +            return (Gbl_ExpectedMessages[i].MessageReceived = TRUE);
> +        }
> +    }
> +
> +    return (FALSE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AslIsExceptionDisabled
> + *
> + * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
> + *              MessageId           - Index into global message buffer
> + *
> + * RETURN:      TRUE if exception/message should be ignored
> + *
> + * DESCRIPTION: Check if the user has specified options such that this
> + *              exception should be ignored
> + *
> + ******************************************************************************/
> +
> +static BOOLEAN
>   AslIsExceptionDisabled (
>       UINT8                   Level,
>       UINT16                  MessageId)
> @@ -940,8 +1100,7 @@ AslError (
>   
>       /* Check if user wants to ignore this exception */
>   
> -    if (Gbl_AllExceptionsDisabled ||
> -        AslIsExceptionDisabled (Level, MessageId))
> +    if (AslIsExceptionIgnored (Level, MessageId))
>       {
>           return;
>       }
> diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
> index 0c58041f..169b25e7 100644
> --- a/src/acpica/source/compiler/aslglobal.h
> +++ b/src/acpica/source/compiler/aslglobal.h
> @@ -252,6 +252,7 @@ extern int                  AslCompilerdebug;
>   #define ASL_DEFAULT_LINE_BUFFER_SIZE    (1024 * 32) /* 32K */
>   #define ASL_MSG_BUFFER_SIZE             (1024 * 32) /* 32k */
>   #define ASL_MAX_DISABLED_MESSAGES       32
> +#define ASL_MAX_EXPECTED_MESSAGES       32
>   #define HEX_TABLE_LINE_SIZE             8
>   #define HEX_LISTING_LINE_SIZE           8
>   
> @@ -396,6 +397,7 @@ ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentHexColumn, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentAmlOffset, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentLine, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_DisabledMessagesIndex, 0);
> +ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_ExpectedMessagesIndex, 0);
>   ASL_EXTERN UINT8                    ASL_INIT_GLOBAL (Gbl_HexBytesWereWritten, FALSE);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_NumNamespaceObjects, 0);
>   ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_ReservedMethods, 0);
> @@ -438,6 +440,7 @@ ASL_EXTERN char                     MsgBuffer[ASL_MSG_BUFFER_SIZE];
>   ASL_EXTERN char                     StringBuffer[ASL_MSG_BUFFER_SIZE];
>   ASL_EXTERN char                     StringBuffer2[ASL_MSG_BUFFER_SIZE];
>   ASL_EXTERN UINT32                   Gbl_DisabledMessages[ASL_MAX_DISABLED_MESSAGES];
> +ASL_EXTERN ASL_EXPECTED_MESSAGE     Gbl_ExpectedMessages[ASL_MAX_EXPECTED_MESSAGES];
>   
>   
>   #endif /* __ASLGLOBAL_H */
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index eb3d23dd..b87d5499 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -348,7 +348,8 @@ const char                      *AslCompilerMsgs [] =
>   /*    ASL_MSG_ARG_AS_LOCAL_NOT_USED */      "Method Argument (as a local) is set but never used",
>   /*    ASL_MSG_ARG_NOT_USED */               "Method Argument is never used",
>   /*    ASL_MSG_CONSTANT_REQUIRED */          "Non-reducible expression",
> -/*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT"
> +/*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT",
> +/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:"
>   };
>   
>   /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 86fb1631..68216e5c 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -351,6 +351,7 @@ typedef enum
>       ASL_MSG_ARG_NOT_USED,
>       ASL_MSG_CONSTANT_REQUIRED,
>       ASL_MSG_CROSS_TABLE_SCOPE,
> +    ASL_MSG_EXCEPTION_NOT_RECEIVED,
>   
>       /* These messages are used by the Data Table compiler only */
>   
> diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c
> index 4e6e5a16..41badcee 100644
> --- a/src/acpica/source/compiler/aslparseop.c
> +++ b/src/acpica/source/compiler/aslparseop.c
> @@ -685,10 +685,10 @@ TrCreateNullTargetOp (
>    * DESCRIPTION: Create a leaf op (no children or peers) for one of the
>    *              special constants - __LINE__, __FILE__, and __DATE__.
>    *
> - * Note: An implemenation of __FUNC__ cannot happen here because we don't
> - * have a full parse tree at this time and cannot find the parent control
> - * method. If it is ever needed, __FUNC__ must be implemented later, after
> - * the parse tree has been fully constructed.
> + * Note: The fullimplemenation of __METHOD__ cannot happen here because we
> + * don't have a full parse tree at this time and cannot find the parent
> + * control method. __METHOD__ must be implemented later, after the parse
> + * tree has been fully constructed.
>    *
>    ******************************************************************************/
>   
> @@ -711,6 +711,14 @@ TrCreateConstantLeafOp (
>           Op->Asl.Value.Integer = Op->Asl.LineNumber;
>           break;
>   
> +    case PARSEOP___METHOD__:
> +
> +        /* Will become a string literal later */
> +
> +        Op = TrAllocateOp (PARSEOP___METHOD__);
> +        Op->Asl.Value.String = NULL;
> +        break;
> +
>       case PARSEOP___PATH__:
>   
>           Op = TrAllocateOp (PARSEOP_STRING_LITERAL);
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index eb785069..f26ea874 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -592,6 +592,7 @@ ConstExprTerm
>       | PARSEOP___FILE__              {$$ = TrCreateConstantLeafOp (PARSEOP___FILE__);}
>       | PARSEOP___LINE__              {$$ = TrCreateConstantLeafOp (PARSEOP___LINE__);}
>       | PARSEOP___PATH__              {$$ = TrCreateConstantLeafOp (PARSEOP___PATH__);}
> +    | PARSEOP___METHOD__            {$$ = TrCreateConstantLeafOp (PARSEOP___METHOD__);}
>       ;
>   
>   Integer
> diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
> index e6e9006d..38c55c18 100644
> --- a/src/acpica/source/compiler/asltokens.y
> +++ b/src/acpica/source/compiler/asltokens.y
> @@ -637,3 +637,4 @@ NoEcho('
>   %token <i> PARSEOP___FILE__
>   %token <i> PARSEOP___LINE__
>   %token <i> PARSEOP___PATH__
> +%token <i> PARSEOP___METHOD__
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index d3ed53a1..daaca947 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -430,6 +430,8 @@ static void
>   TrTransformSubtree (
>       ACPI_PARSE_OBJECT           *Op)
>   {
> +    ACPI_PARSE_OBJECT           *MethodOp;
> +
>   
>       if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
>       {
> @@ -465,6 +467,35 @@ TrTransformSubtree (
>   
>           break;
>   
> +    case PARSEOP___METHOD__:
> +
> +        /* Transform to a string op containing the parent method name */
> +
> +        Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
> +        UtSetParseOpName (Op);
> +
> +        /* Find the parent control method op */
> +
> +        MethodOp = Op;
> +        while (MethodOp)
> +        {
> +            if (MethodOp->Asl.ParseOpcode == PARSEOP_METHOD)
> +            {
> +                /* First child contains the method name */
> +
> +                MethodOp = MethodOp->Asl.Child;
> +                Op->Asl.Value.String = MethodOp->Asl.Value.String;
> +                return;
> +            }
> +
> +            MethodOp = MethodOp->Asl.Parent;
> +        }
> +
> +        /* At the root, invocation not within a control method */
> +
> +        Op->Asl.Value.String = "\\";
> +        break;
> +
>       default:
>   
>           /* Nothing to do here for other opcodes */
> diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h
> index 4c2a2772..e4250871 100644
> --- a/src/acpica/source/compiler/asltypes.h
> +++ b/src/acpica/source/compiler/asltypes.h
> @@ -355,6 +355,15 @@ typedef struct asl_error_msg
>   
>   } ASL_ERROR_MSG;
>   
> +/* An entry in the expected messages array */
> +typedef struct asl_expected_message
> +{
> +    UINT32                       MessageId;
> +    char                         *MessageIdStr;
> +    BOOLEAN                      MessageReceived;
> +
> +} ASL_EXPECTED_MESSAGE;
> +
>   
>   /* An entry in the listing file stack (for include files) */
>   
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index fd91baeb..c5ff42c0 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -174,6 +174,12 @@ UtAttachNameseg (
>       ACPI_PARSE_OBJECT       *Op,
>       char                    *Name);
>   
> +static void
> +UtReallocLineBuffers (
> +    char                    **Buffer,
> +    UINT32                  OldSize,
> +    UINT32                  NewSize);
> +
>   
>   /*******************************************************************************
>    *
> @@ -733,43 +739,48 @@ UtExpandLineBuffers (
>               Gbl_LineBufferSize, NewSize);
>       }
>   
> -    Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
> +    UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize);
> +    UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize);
> +    UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize);
> +    UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize);
> +
>       Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> -    if (!Gbl_CurrentLineBuffer)
> -    {
> -        goto ErrorExit;
> -    }
> +    Gbl_LineBufferSize = NewSize;
> +}
>   
> -    Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
> -    if (!Gbl_MainTokenBuffer)
> -    {
> -        goto ErrorExit;
> -    }
>   
> -    Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
> -    if (!Gbl_MacroTokenBuffer)
> -    {
> -        goto ErrorExit;
> -    }
> +/******************************************************************************
> + *
> + * FUNCTION:    UtReallocLineBuffers
> + *
> + * PARAMETERS:  Buffer              - Buffer to realloc
> + *              OldSize             - Old size of Buffer
> + *              NewSize             - New size of Buffer
> + *
> + * RETURN:      none
> + *
> + * DESCRIPTION: Reallocate and initialize Buffer
> + *
> + *****************************************************************************/
> +
> +static void
> +UtReallocLineBuffers (
> +    char                    **Buffer,
> +    UINT32                  OldSize,
> +    UINT32                  NewSize)
> +{
>   
> -    Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
> -    if (!Gbl_ExpressionTokenBuffer)
> +    *Buffer = realloc (*Buffer, NewSize);
> +    if (*Buffer)
>       {
> -        goto ErrorExit;
> +        memset (*Buffer + OldSize, 0, NewSize - OldSize);
> +        return;
>       }
>   
> -    Gbl_LineBufferSize = NewSize;
> -    return;
> -
> -
> -    /* On error above, simply issue error messages and abort, cannot continue */
> -
> -ErrorExit:
>       printf ("Could not increase line buffer size from %u to %u\n",
> -        Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
> +        OldSize, NewSize);
>   
> -    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
> -        NULL, NULL);
> +    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL);
>       AslAbort ();
>   }
>   
> diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
> index 45274168..e74fed51 100644
> --- a/src/acpica/source/compiler/dtcompile.c
> +++ b/src/acpica/source/compiler/dtcompile.c
> @@ -486,18 +486,21 @@ DtCompileDataTable (
>       }
>       else if (TableData->TableInfo)
>       {
> -        /* Simple table, just walk the info table */
> +        /* Simple table, just walk the info table, unless its empty */
>   
> -        Subtable = NULL;
> -        Status = DtCompileTable (FieldList, TableData->TableInfo,
> -            &Subtable, TRUE);
> -        if (ACPI_FAILURE (Status))
> +        if (FieldList && *FieldList)
>           {
> -            return (Status);
> -        }
> +            Subtable = NULL;
> +            Status = DtCompileTable (FieldList, TableData->TableInfo,
> +                &Subtable, TRUE);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
>   
> -        DtInsertSubtable (Gbl_RootTable, Subtable);
> -        DtPopSubtable ();
> +            DtInsertSubtable (Gbl_RootTable, Subtable);
> +            DtPopSubtable ();
> +        }
>       }
>       else
>       {
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 61b40b4a..1e81c580 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -726,6 +726,7 @@ extern const unsigned char  TemplateRasf[];
>   extern const unsigned char  TemplateRsdt[];
>   extern const unsigned char  TemplateS3pt[];
>   extern const unsigned char  TemplateSbst[];
> +extern const unsigned char  TemplateSdei[];
>   extern const unsigned char  TemplateSlic[];
>   extern const unsigned char  TemplateSlit[];
>   extern const unsigned char  TemplateSpcr[];
> diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
> index bb4dded4..8d27359d 100644
> --- a/src/acpica/source/compiler/dttemplate.h
> +++ b/src/acpica/source/compiler/dttemplate.h
> @@ -1178,6 +1178,15 @@ const unsigned char TemplateSbst[] =
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000028    "........" */
>   };
>   
> +const unsigned char TemplateSdei[] =
> +{
> +    0x53,0x44,0x45,0x49,0x3e,0x00,0x00,0x00,  /* 00000000    "SDEI>..." */
> +    0x01,0x59,0x41,0x52,0x4d,0x20,0x20,0x20,  /* 00000008    ".mARM  " */
> +    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x30,0x09,0x16,0x20                       /* 00000028    "0.. " */
> +};
> +
>   const unsigned char TemplateSlic[] =
>   {
>       0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00,  /* 00000000    "SLICv..." */
> diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
> index 88072175..6edcf637 100644
> --- a/src/acpica/source/compiler/dtutils.c
> +++ b/src/acpica/source/compiler/dtutils.c
> @@ -190,7 +190,7 @@ DtError (
>   
>       /* Check if user wants to ignore this exception */
>   
> -    if (AslIsExceptionDisabled (Level, MessageId))
> +    if (AslIsExceptionIgnored (Level, MessageId))
>       {
>           return;
>       }
> diff --git a/src/acpica/source/compiler/prmacros.c b/src/acpica/source/compiler/prmacros.c
> index 55aab466..675d4522 100644
> --- a/src/acpica/source/compiler/prmacros.c
> +++ b/src/acpica/source/compiler/prmacros.c
> @@ -483,7 +483,7 @@ PrAddMacro (
>       {
>           /* Search the macro arg list for matching arg */
>   
> -        for (i = 0; Args[i].Name && (i < PR_MAX_MACRO_ARGS); i++)
> +        for (i = 0; ((i < PR_MAX_MACRO_ARGS) && Args[i].Name); i++)
>           {
>               /*
>                * Save argument offset within macro body. This is the mechanism
> diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
> index 2c5ef74a..75198951 100644
> --- a/src/acpica/source/components/debugger/dbdisply.c
> +++ b/src/acpica/source/components/debugger/dbdisply.c
> @@ -451,7 +451,7 @@ DumpNode:
>   
>       else
>       {
> -        AcpiOsPrintf ("Object (%p) Pathname:  %s\n",
> +        AcpiOsPrintf ("Object %p: Namespace Node - Pathname: %s\n",
>               Node, (char *) RetBuf.Pointer);
>       }
>   
> @@ -468,7 +468,7 @@ DumpNode:
>       ObjDesc = AcpiNsGetAttachedObject (Node);
>       if (ObjDesc)
>       {
> -        AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc);
> +        AcpiOsPrintf ("\nAttached Object %p:", ObjDesc);
>           if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
>           {
>               AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
> @@ -476,8 +476,33 @@ DumpNode:
>               return;
>           }
>   
> -        AcpiUtDebugDumpBuffer ((void *) ObjDesc,
> -            sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
> +        if (ACPI_GET_DESCRIPTOR_TYPE (
> +            ((ACPI_NAMESPACE_NODE *) ObjDesc)) == ACPI_DESC_TYPE_NAMED)
> +        {
> +            AcpiOsPrintf (" Namespace Node - ");
> +            Status = AcpiGetName ((ACPI_NAMESPACE_NODE *) ObjDesc,
> +                ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                AcpiOsPrintf ("Could not convert name to pathname\n");
> +            }
> +            else
> +            {
> +                AcpiOsPrintf ("Pathname: %s",
> +                    (char *) RetBuf.Pointer);
> +            }
> +
> +            AcpiOsPrintf ("\n");
> +            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
> +                sizeof (ACPI_NAMESPACE_NODE), Display, ACPI_UINT32_MAX);
> +        }
> +        else
> +        {
> +            AcpiOsPrintf ("\n");
> +            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
> +                sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
> +        }
> +
>           AcpiExDumpObjectDescriptor (ObjDesc, 1);
>       }
>   }
> diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index bfa45b3e..fe9d0605 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/source/components/dispatcher/dsfield.c
> @@ -313,6 +313,8 @@ AcpiDsCreateBufferField (
>   
>           if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
>           {
> +            ACPI_ERROR ((AE_INFO,
> +                "Parse execute mode is not set"));
>               return_ACPI_STATUS (AE_AML_INTERNAL);
>           }
>   
> @@ -701,6 +703,8 @@ AcpiDsInitFieldObjects (
>               return_ACPI_STATUS (AE_OK);
>           }
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Parse deferred mode is not set"));
>           return_ACPI_STATUS (AE_AML_INTERNAL);
>       }
>   
> diff --git a/src/acpica/source/components/dispatcher/dsobject.c b/src/acpica/source/components/dispatcher/dsobject.c
> index 5be9c8fd..4cbd8f78 100644
> --- a/src/acpica/source/components/dispatcher/dsobject.c
> +++ b/src/acpica/source/components/dispatcher/dsobject.c
> @@ -160,14 +160,6 @@
>   #define _COMPONENT          ACPI_DISPATCHER
>           ACPI_MODULE_NAME    ("dsobject")
>   
> -/* Local prototypes */
> -
> -static ACPI_STATUS
> -AcpiDsBuildInternalObject (
> -    ACPI_WALK_STATE         *WalkState,
> -    ACPI_PARSE_OBJECT       *Op,
> -    ACPI_OPERAND_OBJECT     **ObjDescPtr);
> -
>   
>   #ifndef ACPI_NO_METHOD_EXECUTION
>   /*******************************************************************************
> @@ -185,7 +177,7 @@ AcpiDsBuildInternalObject (
>    *
>    ******************************************************************************/
>   
> -static ACPI_STATUS
> +ACPI_STATUS
>   AcpiDsBuildInternalObject (
>       ACPI_WALK_STATE         *WalkState,
>       ACPI_PARSE_OBJECT       *Op,
> @@ -193,7 +185,6 @@ AcpiDsBuildInternalObject (
>   {
>       ACPI_OPERAND_OBJECT     *ObjDesc;
>       ACPI_STATUS             Status;
> -    ACPI_OBJECT_TYPE        Type;
>   
>   
>       ACPI_FUNCTION_TRACE (DsBuildInternalObject);
> @@ -204,129 +195,43 @@ AcpiDsBuildInternalObject (
>       {
>           /*
>            * This is a named object reference. If this name was
> -         * previously looked up in the namespace, it was stored in this op.
> -         * Otherwise, go ahead and look it up now
> +         * previously looked up in the namespace, it was stored in
> +         * this op. Otherwise, go ahead and look it up now
>            */
>           if (!Op->Common.Node)
>           {
> -            Status = AcpiNsLookup (WalkState->ScopeInfo,
> -                Op->Common.Value.String,
> -                ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> -                ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
> -                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
> -            if (ACPI_FAILURE (Status))
> -            {
> -                /* Check if we are resolving a named reference within a package */
> -
> -                if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
> -
> -                    ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> -                     (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP)))
> -                {
> -                    /*
> -                     * We didn't find the target and we are populating elements
> -                     * of a package - ignore if slack enabled. Some ASL code
> -                     * contains dangling invalid references in packages and
> -                     * expects that no exception will be issued. Leave the
> -                     * element as a null element. It cannot be used, but it
> -                     * can be overwritten by subsequent ASL code - this is
> -                     * typically the case.
> -                     */
> -                    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -                        "Ignoring unresolved reference in package [%4.4s]\n",
> -                        WalkState->ScopeInfo->Scope.Node->Name.Ascii));
> -
> -                    return_ACPI_STATUS (AE_OK);
> -                }
> -                else
> -                {
> -                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
> -                }
> -
> -                return_ACPI_STATUS (Status);
> -            }
> -        }
> -
> -        /* Special object resolution for elements of a package */
> -
> -        if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> -            (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> -        {
> -            /*
> -             * Attempt to resolve the node to a value before we insert it into
> -             * the package. If this is a reference to a common data type,
> -             * resolve it immediately. According to the ACPI spec, package
> -             * elements can only be "data objects" or method references.
> -             * Attempt to resolve to an Integer, Buffer, String or Package.
> -             * If cannot, return the named reference (for things like Devices,
> -             * Methods, etc.) Buffer Fields and Fields will resolve to simple
> -             * objects (int/buf/str/pkg).
> -             *
> -             * NOTE: References to things like Devices, Methods, Mutexes, etc.
> -             * will remain as named references. This behavior is not described
> -             * in the ACPI spec, but it appears to be an oversight.
> -             */
> -            ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Op->Common.Node);
> -
> -            Status = AcpiExResolveNodeToValue (
> -                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc),
> -                WalkState);
> -            if (ACPI_FAILURE (Status))
> -            {
> -                return_ACPI_STATUS (Status);
> -            }
> +            /* Check if we are resolving a named reference within a package */
>   
> -            /*
> -             * Special handling for Alias objects. We need to setup the type
> -             * and the Op->Common.Node to point to the Alias target. Note,
> -             * Alias has at most one level of indirection internally.
> -             */
> -            Type = Op->Common.Node->Type;
> -            if (Type == ACPI_TYPE_LOCAL_ALIAS)
> +            if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> +                (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
>               {
> -                Type = ObjDesc->Common.Type;
> -                Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> -                    Op->Common.Node->Object);
> -            }
> -
> -            switch (Type)
> -            {
> -            /*
> -             * For these types, we need the actual node, not the subobject.
> -             * However, the subobject did not get an extra reference count above.
> -             *
> -             * TBD: should ExResolveNodeToValue be changed to fix this?
> -             */
> -            case ACPI_TYPE_DEVICE:
> -            case ACPI_TYPE_THERMAL:
> -
> -                AcpiUtAddReference (Op->Common.Node->Object);
> -
> -                /*lint -fallthrough */
> -            /*
> -             * For these types, we need the actual node, not the subobject.
> -             * The subobject got an extra reference count in ExResolveNodeToValue.
> -             */
> -            case ACPI_TYPE_MUTEX:
> -            case ACPI_TYPE_METHOD:
> -            case ACPI_TYPE_POWER:
> -            case ACPI_TYPE_PROCESSOR:
> -            case ACPI_TYPE_EVENT:
> -            case ACPI_TYPE_REGION:
> -
> -                /* We will create a reference object for these types below */
> -                break;
> -
> -            default:
>                   /*
> -                 * All other types - the node was resolved to an actual
> -                 * object, we are done.
> +                 * We won't resolve package elements here, we will do this
> +                 * after all ACPI tables are loaded into the namespace. This
> +                 * behavior supports both forward references to named objects
> +                 * and external references to objects in other tables.
>                    */
> -                goto Exit;
> +                goto CreateNewObject;
> +            }
> +            else
> +            {
> +                Status = AcpiNsLookup (WalkState->ScopeInfo,
> +                    Op->Common.Value.String,
> +                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> +                    ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
> +                    ACPI_CAST_INDIRECT_PTR (
> +                        ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
> +                    return_ACPI_STATUS (Status);
> +                }
>               }
>           }
>       }
>   
> +CreateNewObject:
> +
>       /* Create and init a new internal ACPI object */
>   
>       ObjDesc = AcpiUtCreateInternalObject (
> @@ -344,7 +249,28 @@ AcpiDsBuildInternalObject (
>           return_ACPI_STATUS (Status);
>       }
>   
> -Exit:
> +    /*
> +     * Handling for unresolved package reference elements.
> +     * These are elements that are namepaths.
> +     */
> +    if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> +        (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> +    {
> +        ObjDesc->Reference.Resolved = TRUE;
> +
> +        if ((Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
> +            !ObjDesc->Reference.Node)
> +        {
> +            /*
> +             * Name was unresolved above.
> +             * Get the prefix node for later lookup
> +             */
> +            ObjDesc->Reference.Node = WalkState->ScopeInfo->Scope.Node;
> +            ObjDesc->Reference.Aml = Op->Common.Aml;
> +            ObjDesc->Reference.Resolved = FALSE;
> +        }
> +    }
> +
>       *ObjDescPtr = ObjDesc;
>       return_ACPI_STATUS (Status);
>   }
> @@ -466,209 +392,6 @@ AcpiDsBuildInternalBufferObj (
>       return_ACPI_STATUS (AE_OK);
>   }
>   
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiDsBuildInternalPackageObj
> - *
> - * PARAMETERS:  WalkState       - Current walk state
> - *              Op              - Parser object to be translated
> - *              ElementCount    - Number of elements in the package - this is
> - *                                the NumElements argument to Package()
> - *              ObjDescPtr      - Where the ACPI internal object is returned
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: Translate a parser Op package object to the equivalent
> - *              namespace object
> - *
> - * NOTE: The number of elements in the package will be always be the NumElements
> - * count, regardless of the number of elements in the package list. If
> - * NumElements is smaller, only that many package list elements are used.
> - * if NumElements is larger, the Package object is padded out with
> - * objects of type Uninitialized (as per ACPI spec.)
> - *
> - * Even though the ASL compilers do not allow NumElements to be smaller
> - * than the Package list length (for the fixed length package opcode), some
> - * BIOS code modifies the AML on the fly to adjust the NumElements, and
> - * this code compensates for that. This also provides compatibility with
> - * other AML interpreters.
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -AcpiDsBuildInternalPackageObj (
> -    ACPI_WALK_STATE         *WalkState,
> -    ACPI_PARSE_OBJECT       *Op,
> -    UINT32                  ElementCount,
> -    ACPI_OPERAND_OBJECT     **ObjDescPtr)
> -{
> -    ACPI_PARSE_OBJECT       *Arg;
> -    ACPI_PARSE_OBJECT       *Parent;
> -    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
> -    ACPI_STATUS             Status = AE_OK;
> -    UINT32                  i;
> -    UINT16                  Index;
> -    UINT16                  ReferenceCount;
> -
> -
> -    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
> -
> -
> -    /* Find the parent of a possibly nested package */
> -
> -    Parent = Op->Common.Parent;
> -    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> -           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> -    {
> -        Parent = Parent->Common.Parent;
> -    }
> -
> -    /*
> -     * If we are evaluating a Named package object "Name (xxxx, Package)",
> -     * the package object already exists, otherwise it must be created.
> -     */
> -    ObjDesc = *ObjDescPtr;
> -    if (!ObjDesc)
> -    {
> -        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
> -        *ObjDescPtr = ObjDesc;
> -        if (!ObjDesc)
> -        {
> -            return_ACPI_STATUS (AE_NO_MEMORY);
> -        }
> -
> -        ObjDesc->Package.Node = Parent->Common.Node;
> -    }
> -
> -    /*
> -     * Allocate the element array (array of pointers to the individual
> -     * objects) based on the NumElements parameter. Add an extra pointer slot
> -     * so that the list is always null terminated.
> -     */
> -    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
> -        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
> -
> -    if (!ObjDesc->Package.Elements)
> -    {
> -        AcpiUtDeleteObjectDesc (ObjDesc);
> -        return_ACPI_STATUS (AE_NO_MEMORY);
> -    }
> -
> -    ObjDesc->Package.Count = ElementCount;
> -
> -    /*
> -     * Initialize the elements of the package, up to the NumElements count.
> -     * Package is automatically padded with uninitialized (NULL) elements
> -     * if NumElements is greater than the package list length. Likewise,
> -     * Package is truncated if NumElements is less than the list length.
> -     */
> -    Arg = Op->Common.Value.Arg;
> -    Arg = Arg->Common.Next;
> -    for (i = 0; Arg && (i < ElementCount); i++)
> -    {
> -        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
> -        {
> -            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
> -            {
> -                /*
> -                 * A method reference "looks" to the parser to be a method
> -                 * invocation, so we special case it here
> -                 */
> -                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> -                Status = AcpiDsBuildInternalObject (
> -                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
> -            }
> -            else
> -            {
> -                /* This package element is already built, just get it */
> -
> -                ObjDesc->Package.Elements[i] =
> -                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
> -            }
> -        }
> -        else
> -        {
> -            Status = AcpiDsBuildInternalObject (
> -                WalkState, Arg, &ObjDesc->Package.Elements[i]);
> -        }
> -
> -        if (*ObjDescPtr)
> -        {
> -            /* Existing package, get existing reference count */
> -
> -            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
> -            if (ReferenceCount > 1)
> -            {
> -                /* Make new element ref count match original ref count */
> -
> -                for (Index = 0; Index < (ReferenceCount - 1); Index++)
> -                {
> -                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
> -                }
> -            }
> -        }
> -
> -        Arg = Arg->Common.Next;
> -    }
> -
> -    /* Check for match between NumElements and actual length of PackageList */
> -
> -    if (Arg)
> -    {
> -        /*
> -         * NumElements was exhausted, but there are remaining elements in the
> -         * PackageList. Truncate the package to NumElements.
> -         *
> -         * Note: technically, this is an error, from ACPI spec: "It is an error
> -         * for NumElements to be less than the number of elements in the
> -         * PackageList". However, we just print a message and
> -         * no exception is returned. This provides Windows compatibility. Some
> -         * BIOSs will alter the NumElements on the fly, creating this type
> -         * of ill-formed package object.
> -         */
> -        while (Arg)
> -        {
> -            /*
> -             * We must delete any package elements that were created earlier
> -             * and are not going to be used because of the package truncation.
> -             */
> -            if (Arg->Common.Node)
> -            {
> -                AcpiUtRemoveReference (
> -                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
> -                Arg->Common.Node = NULL;
> -            }
> -
> -            /* Find out how many elements there really are */
> -
> -            i++;
> -            Arg = Arg->Common.Next;
> -        }
> -
> -        ACPI_INFO ((
> -            "Actual Package length (%u) is larger than "
> -            "NumElements field (%u), truncated",
> -            i, ElementCount));
> -    }
> -    else if (i < ElementCount)
> -    {
> -        /*
> -         * Arg list (elements) was exhausted, but we did not reach NumElements count.
> -         * Note: this is not an error, the package is padded out with NULLs.
> -         */
> -        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -            "Package List length (%u) smaller than NumElements "
> -            "count (%u), padded with null elements\n",
> -            i, ElementCount));
> -    }
> -
> -    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
> -    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
> -    return_ACPI_STATUS (Status);
> -}
> -
> -
>   /*******************************************************************************
>    *
>    * FUNCTION:    AcpiDsCreateNode
> @@ -796,10 +519,20 @@ AcpiDsInitObjectFromOp (
>   
>       case ACPI_TYPE_PACKAGE:
>           /*
> -         * Defer evaluation of Package TermArg operand
> +         * Defer evaluation of Package TermArg operand and all
> +         * package elements. (01/2017): We defer the element
> +         * resolution to allow forward references from the package
> +         * in order to provide compatibility with other ACPI
> +         * implementations.
>            */
>           ObjDesc->Package.Node = ACPI_CAST_PTR (
>               ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
> +
> +        if (!Op->Named.Data)
> +        {
> +            return_ACPI_STATUS (AE_OK);
> +        }
> +
>           ObjDesc->Package.AmlStart = Op->Named.Data;
>           ObjDesc->Package.AmlLength = Op->Named.Length;
>           break;
> @@ -940,8 +673,11 @@ AcpiDsInitObjectFromOp (
>                   /* Node was saved in Op */
>   
>                   ObjDesc->Reference.Node = Op->Common.Node;
> -                ObjDesc->Reference.Object = Op->Common.Node->Object;
>                   ObjDesc->Reference.Class = ACPI_REFCLASS_NAME;
> +                if (Op->Common.Node)
> +                {
> +                    ObjDesc->Reference.Object = Op->Common.Node->Object;
> +                }
>                   break;
>   
>               case AML_DEBUG_OP:
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index 3ceec94b..5ba414d3 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -747,6 +747,16 @@ AcpiDsEvalDataObjectOperands (
>        */
>       WalkState->OperandIndex = WalkState->NumOperands;
>   
> +    /* Ignore if child is not valid */
> +
> +    if (!Op->Common.Value.Arg)
> +    {
> +        ACPI_ERROR ((AE_INFO,
> +            "Dispatch: Missing child while executing TermArg for %X",
> +            Op->Common.AmlOpcode));
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
>       Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
>       if (ACPI_FAILURE (Status))
>       {
> diff --git a/src/acpica/source/components/dispatcher/dspkginit.c b/src/acpica/source/components/dispatcher/dspkginit.c
> new file mode 100644
> index 00000000..14e34b09
> --- /dev/null
> +++ b/src/acpica/source/components/dispatcher/dspkginit.c
> @@ -0,0 +1,635 @@
> +/******************************************************************************
> + *
> + * Module Name: dspkginit - Completion of deferred package initialization
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2017, 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.
> + *
> + *****************************************************************************
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * following license:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acnamesp.h"
> +#include "amlcode.h"
> +#include "acdispat.h"
> +#include "acinterp.h"
> +
> +
> +#define _COMPONENT          ACPI_NAMESPACE
> +        ACPI_MODULE_NAME    ("dspkginit")
> +
> +
> +/* Local prototypes */
> +
> +static void
> +AcpiDsResolvePackageElement (
> +    ACPI_OPERAND_OBJECT     **Element);
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsBuildInternalPackageObj
> + *
> + * PARAMETERS:  WalkState       - Current walk state
> + *              Op              - Parser object to be translated
> + *              ElementCount    - Number of elements in the package - this is
> + *                                the NumElements argument to Package()
> + *              ObjDescPtr      - Where the ACPI internal object is returned
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Translate a parser Op package object to the equivalent
> + *              namespace object
> + *
> + * NOTE: The number of elements in the package will be always be the NumElements
> + * count, regardless of the number of elements in the package list. If
> + * NumElements is smaller, only that many package list elements are used.
> + * if NumElements is larger, the Package object is padded out with
> + * objects of type Uninitialized (as per ACPI spec.)
> + *
> + * Even though the ASL compilers do not allow NumElements to be smaller
> + * than the Package list length (for the fixed length package opcode), some
> + * BIOS code modifies the AML on the fly to adjust the NumElements, and
> + * this code compensates for that. This also provides compatibility with
> + * other AML interpreters.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiDsBuildInternalPackageObj (
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_PARSE_OBJECT       *Op,
> +    UINT32                  ElementCount,
> +    ACPI_OPERAND_OBJECT     **ObjDescPtr)
> +{
> +    ACPI_PARSE_OBJECT       *Arg;
> +    ACPI_PARSE_OBJECT       *Parent;
> +    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
> +    ACPI_STATUS             Status = AE_OK;
> +    UINT16                  ReferenceCount;
> +    UINT32                  Index;
> +    UINT32                  i;
> +
> +
> +    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
> +
> +
> +    /* Find the parent of a possibly nested package */
> +
> +    Parent = Op->Common.Parent;
> +    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
> +           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
> +    {
> +        Parent = Parent->Common.Parent;
> +    }
> +
> +    /*
> +     * If we are evaluating a Named package object of the form:
> +     *      Name (xxxx, Package)
> +     * the package object already exists, otherwise it must be created.
> +     */
> +    ObjDesc = *ObjDescPtr;
> +    if (!ObjDesc)
> +    {
> +        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
> +        *ObjDescPtr = ObjDesc;
> +        if (!ObjDesc)
> +        {
> +            return_ACPI_STATUS (AE_NO_MEMORY);
> +        }
> +
> +        ObjDesc->Package.Node = Parent->Common.Node;
> +    }
> +
> +    if (ObjDesc->Package.Flags & AOPOBJ_DATA_VALID) /* Just in case */
> +    {
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
> +    /*
> +     * Allocate the element array (array of pointers to the individual
> +     * objects) based on the NumElements parameter. Add an extra pointer slot
> +     * so that the list is always null terminated.
> +     */
> +    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
> +        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
> +
> +    if (!ObjDesc->Package.Elements)
> +    {
> +        AcpiUtDeleteObjectDesc (ObjDesc);
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
> +    ObjDesc->Package.Count = ElementCount;
> +    Arg = Op->Common.Value.Arg;
> +    Arg = Arg->Common.Next;
> +
> +    if (Arg)
> +    {
> +        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
> +    }
> +
> +    /*
> +     * Initialize the elements of the package, up to the NumElements count.
> +     * Package is automatically padded with uninitialized (NULL) elements
> +     * if NumElements is greater than the package list length. Likewise,
> +     * Package is truncated if NumElements is less than the list length.
> +     */
> +    for (i = 0; Arg && (i < ElementCount); i++)
> +    {
> +        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
> +        {
> +            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
> +            {
> +                /*
> +                 * A method reference "looks" to the parser to be a method
> +                 * invocation, so we special case it here
> +                 */
> +                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> +                Status = AcpiDsBuildInternalObject (
> +                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
> +            }
> +            else
> +            {
> +                /* This package element is already built, just get it */
> +
> +                ObjDesc->Package.Elements[i] =
> +                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
> +            }
> +        }
> +        else
> +        {
> +            Status = AcpiDsBuildInternalObject (
> +                WalkState, Arg, &ObjDesc->Package.Elements[i]);
> +            if (Status == AE_NOT_FOUND)
> +            {
> +                ACPI_ERROR ((AE_INFO, "%-48s", "****DS namepath not found"));
> +            }
> +
> +            /*
> +             * Initialize this package element. This function handles the
> +             * resolution of named references within the package.
> +             */
> +            AcpiDsInitPackageElement (0, ObjDesc->Package.Elements[i],
> +                NULL, &ObjDesc->Package.Elements[i]);
> +        }
> +
> +        if (*ObjDescPtr)
> +        {
> +            /* Existing package, get existing reference count */
> +
> +            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
> +            if (ReferenceCount > 1)
> +            {
> +                /* Make new element ref count match original ref count */
> +                /* TBD: Probably need an AcpiUtAddReferences function */
> +
> +                for (Index = 0; Index < ((UINT32) ReferenceCount - 1); Index++)
> +                {
> +                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
> +                }
> +            }
> +        }
> +
> +        Arg = Arg->Common.Next;
> +    }
> +
> +    /* Check for match between NumElements and actual length of PackageList */
> +
> +    if (Arg)
> +    {
> +        /*
> +         * NumElements was exhausted, but there are remaining elements in
> +         * the PackageList. Truncate the package to NumElements.
> +         *
> +         * Note: technically, this is an error, from ACPI spec: "It is an
> +         * error for NumElements to be less than the number of elements in
> +         * the PackageList". However, we just print a message and no
> +         * exception is returned. This provides compatibility with other
> +         * ACPI implementations. Some firmware implementations will alter
> +         * the NumElements on the fly, possibly creating this type of
> +         * ill-formed package object.
> +         */
> +        while (Arg)
> +        {
> +            /*
> +             * We must delete any package elements that were created earlier
> +             * and are not going to be used because of the package truncation.
> +             */
> +            if (Arg->Common.Node)
> +            {
> +                AcpiUtRemoveReference (
> +                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
> +                Arg->Common.Node = NULL;
> +            }
> +
> +            /* Find out how many elements there really are */
> +
> +            i++;
> +            Arg = Arg->Common.Next;
> +        }
> +
> +        ACPI_INFO ((
> +            "Actual Package length (%u) is larger than "
> +            "NumElements field (%u), truncated",
> +            i, ElementCount));
> +    }
> +    else if (i < ElementCount)
> +    {
> +        /*
> +         * Arg list (elements) was exhausted, but we did not reach
> +         * NumElements count.
> +         *
> +         * Note: this is not an error, the package is padded out
> +         * with NULLs.
> +         */
> +        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +            "Package List length (%u) smaller than NumElements "
> +            "count (%u), padded with null elements\n",
> +            i, ElementCount));
> +    }
> +
> +    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
> +    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
> +    return_ACPI_STATUS (Status);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsInitPackageElement
> + *
> + * PARAMETERS:  ACPI_PKG_CALLBACK
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Resolve a named reference element within a package object
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiDsInitPackageElement (
> +    UINT8                   ObjectType,
> +    ACPI_OPERAND_OBJECT     *SourceObject,
> +    ACPI_GENERIC_STATE      *State,
> +    void                    *Context)
> +{
> +    ACPI_OPERAND_OBJECT     **ElementPtr;
> +
> +
> +    if (!SourceObject)
> +    {
> +        return (AE_OK);
> +    }
> +
> +    /*
> +     * The following code is a bit of a hack to workaround a (current)
> +     * limitation of the ACPI_PKG_CALLBACK interface. We need a pointer
> +     * to the location within the element array because a new object
> +     * may be created and stored there.
> +     */
> +    if (Context)
> +    {
> +        /* A direct call was made to this function */
> +
> +        ElementPtr = (ACPI_OPERAND_OBJECT **) Context;
> +    }
> +    else
> +    {
> +        /* Call came from AcpiUtWalkPackageTree */
> +
> +        ElementPtr = State->Pkg.ThisTargetObj;
> +    }
> +
> +    /* We are only interested in reference objects/elements */
> +
> +    if (SourceObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
> +    {
> +        /* Attempt to resolve the (named) reference to a namespace node */
> +
> +        AcpiDsResolvePackageElement (ElementPtr);
> +    }
> +    else if (SourceObject->Common.Type == ACPI_TYPE_PACKAGE)
> +    {
> +        SourceObject->Package.Flags |= AOPOBJ_DATA_VALID;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsResolvePackageElement
> + *
> + * PARAMETERS:  ElementPtr          - Pointer to a reference object
> + *
> + * RETURN:      Possible new element is stored to the indirect ElementPtr
> + *
> + * DESCRIPTION: Resolve a package element that is a reference to a named
> + *              object.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDsResolvePackageElement (
> +    ACPI_OPERAND_OBJECT     **ElementPtr)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_GENERIC_STATE      ScopeInfo;
> +    ACPI_OPERAND_OBJECT     *Element = *ElementPtr;
> +    ACPI_NAMESPACE_NODE     *ResolvedNode;
> +    char                    *ExternalPath = NULL;
> +    ACPI_OBJECT_TYPE        Type;
> +
> +
> +    ACPI_FUNCTION_TRACE (DsResolvePackageElement);
> +
> +
> +    /* Check if reference element is already resolved */
> +
> +    if (Element->Reference.Resolved)
> +    {
> +        return_VOID;
> +    }
> +
> +    /* Element must be a reference object of correct type */
> +
> +    ScopeInfo.Scope.Node = Element->Reference.Node; /* Prefix node */
> +
> +    Status = AcpiNsLookup (&ScopeInfo,
> +        (char *) Element->Reference.Aml,            /* Pointer to AML path */
> +        ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
> +        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
> +        NULL, &ResolvedNode);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
> +            (char *) Element->Reference.Aml,
> +            NULL, &ExternalPath);
> +
> +        ACPI_EXCEPTION ((AE_INFO, Status,
> +            "Could not find/resolve named package element: %s", ExternalPath));
> +
> +        ACPI_FREE (ExternalPath);
> +        *ElementPtr = NULL;
> +        return_VOID;
> +    }
> +    else if (ResolvedNode->Type == ACPI_TYPE_ANY)
> +    {
> +        /* Named reference not resolved, return a NULL package element */
> +
> +        ACPI_ERROR ((AE_INFO,
> +            "Could not resolve named package element [%4.4s] in [%4.4s]",
> +            ResolvedNode->Name.Ascii, ScopeInfo.Scope.Node->Name.Ascii));
> +        *ElementPtr = NULL;
> +        return_VOID;
> +    }
> +#if 0
> +    else if (ResolvedNode->Flags & ANOBJ_TEMPORARY)
> +    {
> +        /*
> +         * A temporary node found here indicates that the reference is
> +         * to a node that was created within this method. We are not
> +         * going to allow it (especially if the package is returned
> +         * from the method) -- the temporary node will be deleted out
> +         * from under the method. (05/2017).
> +         */
> +        ACPI_ERROR ((AE_INFO,
> +            "Package element refers to a temporary name [%4.4s], "
> +            "inserting a NULL element",
> +            ResolvedNode->Name.Ascii));
> +        *ElementPtr = NULL;
> +        return_VOID;
> +    }
> +#endif
> +
> +    /*
> +     * Special handling for Alias objects. We need ResolvedNode to point
> +     * to the Alias target. This effectively "resolves" the alias.
> +     */
> +    if (ResolvedNode->Type == ACPI_TYPE_LOCAL_ALIAS)
> +    {
> +        ResolvedNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> +            ResolvedNode->Object);
> +    }
> +
> +    /* Update the reference object */
> +
> +    Element->Reference.Resolved = TRUE;
> +    Element->Reference.Node = ResolvedNode;
> +    Type = Element->Reference.Node->Type;
> +
> +    /*
> +     * Attempt to resolve the node to a value before we insert it into
> +     * the package. If this is a reference to a common data type,
> +     * resolve it immediately. According to the ACPI spec, package
> +     * elements can only be "data objects" or method references.
> +     * Attempt to resolve to an Integer, Buffer, String or Package.
> +     * If cannot, return the named reference (for things like Devices,
> +     * Methods, etc.) Buffer Fields and Fields will resolve to simple
> +     * objects (int/buf/str/pkg).
> +     *
> +     * NOTE: References to things like Devices, Methods, Mutexes, etc.
> +     * will remain as named references. This behavior is not described
> +     * in the ACPI spec, but it appears to be an oversight.
> +     */
> +    Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return_VOID;
> +    }
> +
> +#if 0
> +/* TBD - alias support */
> +    /*
> +     * Special handling for Alias objects. We need to setup the type
> +     * and the Op->Common.Node to point to the Alias target. Note,
> +     * Alias has at most one level of indirection internally.
> +     */
> +    Type = Op->Common.Node->Type;
> +    if (Type == ACPI_TYPE_LOCAL_ALIAS)
> +    {
> +        Type = ObjDesc->Common.Type;
> +        Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
> +            Op->Common.Node->Object);
> +    }
> +#endif
> +
> +    switch (Type)
> +    {
> +    /*
> +     * These object types are a result of named references, so we will
> +     * leave them as reference objects. In other words, these types
> +     * have no intrinsic "value".
> +     */
> +    case ACPI_TYPE_DEVICE:
> +    case ACPI_TYPE_THERMAL:
> +
> +        /* TBD: This may not be necesssary */
> +
> +        AcpiUtAddReference (ResolvedNode->Object);
> +        break;
> +
> +    case ACPI_TYPE_MUTEX:
> +    case ACPI_TYPE_METHOD:
> +    case ACPI_TYPE_POWER:
> +    case ACPI_TYPE_PROCESSOR:
> +    case ACPI_TYPE_EVENT:
> +    case ACPI_TYPE_REGION:
> +
> +        break;
> +
> +    default:
> +        /*
> +         * For all other types - the node was resolved to an actual
> +         * operand object with a value, return the object
> +         */
> +        *ElementPtr = (ACPI_OPERAND_OBJECT *) ResolvedNode;
> +        break;
> +    }
> +
> +    return_VOID;
> +}
> diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c
> index 15b38574..a2cce00a 100644
> --- a/src/acpica/source/components/executer/excreate.c
> +++ b/src/acpica/source/components/executer/excreate.c
> @@ -204,70 +204,39 @@ AcpiExCreateAlias (
>       }
>   
>       /* Ensure that the target node is valid */
> +
>       if (!TargetNode)
>       {
>           return_ACPI_STATUS (AE_NULL_OBJECT);
>       }
>   
> -    /*
> -     * For objects that can never change (i.e., the NS node will
> -     * permanently point to the same object), we can simply attach
> -     * the object to the new NS node. For other objects (such as
> -     * Integers, buffers, etc.), we have to point the Alias node
> -     * to the original Node.
> -     */
> +    /* Construct the alias object (a namespace node) */
> +
>       switch (TargetNode->Type)
>       {
> -
> -    /* For these types, the sub-object can change dynamically via a Store */
> -
> -    case ACPI_TYPE_INTEGER:
> -    case ACPI_TYPE_STRING:
> -    case ACPI_TYPE_BUFFER:
> -    case ACPI_TYPE_PACKAGE:
> -    case ACPI_TYPE_BUFFER_FIELD:
> -    /*
> -     * These types open a new scope, so we need the NS node in order to access
> -     * any children.
> -     */
> -    case ACPI_TYPE_DEVICE:
> -    case ACPI_TYPE_POWER:
> -    case ACPI_TYPE_PROCESSOR:
> -    case ACPI_TYPE_THERMAL:
> -    case ACPI_TYPE_LOCAL_SCOPE:
> -        /*
> -         * The new alias has the type ALIAS and points to the original
> -         * NS node, not the object itself.
> -         */
> -        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
> -        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
> -        break;
> -
>       case ACPI_TYPE_METHOD:
>           /*
> -         * Control method aliases need to be differentiated
> +         * Control method aliases need to be differentiated with
> +         * a special type
>            */
>           AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
> -        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
>           break;
>   
>       default:
> -
> -        /* Attach the original source object to the new Alias Node */
> -
>           /*
> -         * The new alias assumes the type of the target, and it points
> -         * to the same object. The reference count of the object has an
> -         * additional reference to prevent deletion out from under either the
> -         * target node or the alias Node
> +         * All other object types.
> +         *
> +         * The new alias has the type ALIAS and points to the original
> +         * NS node, not the object itself.
>            */
> -        Status = AcpiNsAttachObject (AliasNode,
> -            AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
> +        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
> +        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
>           break;
>       }
>   
>       /* Since both operands are Nodes, we don't need to delete them */
>   
> +    AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
>       return_ACPI_STATUS (Status);
>   }
>   
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 2b23881f..c1069b2c 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -229,7 +229,7 @@ static ACPI_EXDUMP_INFO     AcpiExDumpPackage[6] =
>       {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
>       {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Package.Node),                 "Parent Node"},
>       {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
> -    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Elements"},
> +    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Element Count"},
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
>       {ACPI_EXD_PACKAGE,  0,                                              NULL}
>   };
> @@ -510,6 +510,11 @@ AcpiExDumpObject (
>   
>       while (Count)
>       {
> +        if (!ObjDesc)
> +        {
> +            return;
> +        }
> +
>           Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
>           Name = Info->Name;
>   
> @@ -522,7 +527,8 @@ AcpiExDumpObject (
>           case ACPI_EXD_TYPE:
>   
>               AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
> -                ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
> +                ObjDesc->Common.Type,
> +                AcpiUtGetObjectTypeName (ObjDesc));
>               break;
>   
>           case ACPI_EXD_UINT8:
> @@ -588,10 +594,10 @@ AcpiExDumpObject (
>               Start = *ACPI_CAST_PTR (void *, Target);
>               Next = Start;
>   
> -            AcpiOsPrintf ("%20s : %p", Name, Next);
> +            AcpiOsPrintf ("%20s : %p ", Name, Next);
>               if (Next)
>               {
> -                AcpiOsPrintf ("(%s %2.2X)",
> +                AcpiOsPrintf ("%s (Type %2.2X)",
>                       AcpiUtGetObjectTypeName (Next), Next->Common.Type);
>   
>                   while (Next->Common.NextObject)
> @@ -614,6 +620,10 @@ AcpiExDumpObject (
>                       }
>                   }
>               }
> +            else
> +            {
> +                AcpiOsPrintf ("- No attached objects");
> +            }
>   
>               AcpiOsPrintf ("\n");
>               break;
> @@ -1294,7 +1304,8 @@ AcpiExDumpPackageObj (
>   
>       default:
>   
> -        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
> +        AcpiOsPrintf ("[%s] Type: %2.2X\n",
> +            AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
>           break;
>       }
>   }
> @@ -1338,10 +1349,19 @@ AcpiExDumpObjectDescriptor (
>       {
>           AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
>   
> -        AcpiOsPrintf ("\nAttached Object (%p):\n",
> -            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
> -
>           ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
> +        if (!ObjDesc)
> +        {
> +            return_VOID;
> +        }
> +
> +        AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
> +        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
> +        {
> +            AcpiOsPrintf (" - Namespace Node");
> +        }
> +
> +        AcpiOsPrintf (":\n");
>           goto DumpObject;
>       }
>   
> @@ -1365,6 +1385,11 @@ AcpiExDumpObjectDescriptor (
>   
>   DumpObject:
>   
> +    if (!ObjDesc)
> +    {
> +        return_VOID;
> +    }
> +
>       /* Common Fields */
>   
>       AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
> diff --git a/src/acpica/source/components/executer/exmisc.c b/src/acpica/source/components/executer/exmisc.c
> index b1fc02d2..dfa4421a 100644
> --- a/src/acpica/source/components/executer/exmisc.c
> +++ b/src/acpica/source/components/executer/exmisc.c
> @@ -401,6 +401,8 @@ AcpiExDoLogicalNumericOp (
>   
>       default:
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Invalid numeric logical opcode: %X", Opcode));
>           Status = AE_AML_INTERNAL;
>           break;
>       }
> @@ -486,6 +488,9 @@ AcpiExDoLogicalOp (
>   
>       default:
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Invalid object type for logical operator: %X",
> +            Operand0->Common.Type));
>           Status = AE_AML_INTERNAL;
>           break;
>       }
> @@ -535,6 +540,8 @@ AcpiExDoLogicalOp (
>   
>           default:
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Invalid comparison opcode: %X", Opcode));
>               Status = AE_AML_INTERNAL;
>               break;
>           }
> @@ -613,6 +620,8 @@ AcpiExDoLogicalOp (
>   
>           default:
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Invalid comparison opcode: %X", Opcode));
>               Status = AE_AML_INTERNAL;
>               break;
>           }
> diff --git a/src/acpica/source/components/executer/exoparg2.c b/src/acpica/source/components/executer/exoparg2.c
> index 3ce965a6..f4bf9c17 100644
> --- a/src/acpica/source/components/executer/exoparg2.c
> +++ b/src/acpica/source/components/executer/exoparg2.c
> @@ -556,6 +556,8 @@ AcpiExOpcode_2A_1T_1R (
>   
>           default:
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Invalid object type: %X", (Operand[0])->Common.Type));
>               Status = AE_AML_INTERNAL;
>               goto Cleanup;
>           }
> diff --git a/src/acpica/source/components/hardware/hwregs.c b/src/acpica/source/components/hardware/hwregs.c
> index e90fd148..b5b23831 100644
> --- a/src/acpica/source/components/hardware/hwregs.c
> +++ b/src/acpica/source/components/hardware/hwregs.c
> @@ -228,7 +228,7 @@ AcpiHwGetAccessBitWidth (
>       }
>       else if (Reg->AccessWidth)
>       {
> -        AccessBitWidth = (1 << (Reg->AccessWidth + 2));
> +        AccessBitWidth = ACPI_ACCESS_BIT_WIDTH (Reg->AccessWidth);
>       }
>       else
>       {
> diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
> index 89d766b4..0ae1fbdd 100644
> --- a/src/acpica/source/components/namespace/nsaccess.c
> +++ b/src/acpica/source/components/namespace/nsaccess.c
> @@ -410,6 +410,7 @@ AcpiNsLookup (
>   {
>       ACPI_STATUS             Status;
>       char                    *Path = Pathname;
> +    char                    *ExternalPath;
>       ACPI_NAMESPACE_NODE     *PrefixNode;
>       ACPI_NAMESPACE_NODE     *CurrentNode = NULL;
>       ACPI_NAMESPACE_NODE     *ThisNode = NULL;
> @@ -556,11 +557,21 @@ AcpiNsLookup (
>                   ThisNode = ThisNode->Parent;
>                   if (!ThisNode)
>                   {
> -                    /* Current scope has no parent scope */
> +                    /*
> +                     * Current scope has no parent scope. Externalize
> +                     * the internal path for error message.
> +                     */
> +                    Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Pathname,
> +                        NULL, &ExternalPath);
> +                    if (ACPI_SUCCESS (Status))
> +                    {
> +                        ACPI_ERROR ((AE_INFO,
> +                            "%s: Path has too many parent prefixes (^)",
> +                            ExternalPath));
> +
> +                        ACPI_FREE (ExternalPath);
> +                    }
>   
> -                    ACPI_ERROR ((AE_INFO,
> -                        "%s: Path has too many parent prefixes (^) "
> -                        "- reached beyond root node", Pathname));
>                       return_ACPI_STATUS (AE_NOT_FOUND);
>                   }
>               }
> diff --git a/src/acpica/source/components/namespace/nsarguments.c b/src/acpica/source/components/namespace/nsarguments.c
> index 0412672a..0a7fa3d9 100644
> --- a/src/acpica/source/components/namespace/nsarguments.c
> +++ b/src/acpica/source/components/namespace/nsarguments.c
> @@ -183,9 +183,14 @@ AcpiNsCheckArgumentTypes (
>       UINT32                      i;
>   
>   
> -    /* If not a predefined name, cannot typecheck args */
> -
> -    if (!Info->Predefined)
> +    /*
> +     * If not a predefined name, cannot typecheck args, because
> +     * we have no idea what argument types are expected.
> +     * Also, ignore typecheck if warnings/errors if this method
> +     * has already been evaluated at least once -- in order
> +     * to suppress repetitive messages.
> +     */
> +    if (!Info->Predefined || (Info->Node->Flags & ANOBJ_EVALUATED))
>       {
>           return;
>       }
> @@ -207,6 +212,10 @@ AcpiNsCheckArgumentTypes (
>                   "Found [%s], ACPI requires [%s]", (i + 1),
>                   AcpiUtGetTypeName (UserArgType),
>                   AcpiUtGetTypeName (ArgType)));
> +
> +            /* Prevent any additional typechecking for this method */
> +
> +            Info->Node->Flags |= ANOBJ_EVALUATED;
>           }
>       }
>   }
> @@ -238,7 +247,7 @@ AcpiNsCheckAcpiCompliance (
>       UINT32                      RequiredParamCount;
>   
>   
> -    if (!Predefined)
> +    if (!Predefined || (Node->Flags & ANOBJ_EVALUATED))
>       {
>           return;
>       }
> @@ -332,6 +341,11 @@ AcpiNsCheckArgumentCount (
>       UINT32                      RequiredParamCount;
>   
>   
> +    if (Node->Flags & ANOBJ_EVALUATED)
> +    {
> +        return;
> +    }
> +
>       if (!Predefined)
>       {
>           /*
> diff --git a/src/acpica/source/components/namespace/nsinit.c b/src/acpica/source/components/namespace/nsinit.c
> index d4286bf8..2786e24c 100644
> --- a/src/acpica/source/components/namespace/nsinit.c
> +++ b/src/acpica/source/components/namespace/nsinit.c
> @@ -535,6 +535,20 @@ AcpiNsInitOneObject (
>   
>           Info->PackageInit++;
>           Status = AcpiDsGetPackageArguments (ObjDesc);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            break;
> +        }
> +
> +        /*
> +         * Resolve all named references in package objects (and all
> +         * sub-packages). This action has been deferred until the entire
> +         * namespace has been loaded, in order to support external and
> +         * forward references from individual package elements (05/2017).
> +         */
> +        Status = AcpiUtWalkPackageTree (ObjDesc, NULL,
> +            AcpiDsInitPackageElement, NULL);
> +        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
>           break;
>   
>       default:
> diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
> index f68fbc1e..fb74c44c 100644
> --- a/src/acpica/source/components/namespace/nsnames.c
> +++ b/src/acpica/source/components/namespace/nsnames.c
> @@ -208,8 +208,15 @@ AcpiNsGetPathnameLength (
>       ACPI_SIZE               Size;
>   
>   
> -    ACPI_FUNCTION_ENTRY ();
> +    /* Validate the Node */
>   
> +    if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
> +    {
> +        ACPI_ERROR ((AE_INFO,
> +            "Invalid/cached reference target node: %p, descriptor type %d",
> +            Node, ACPI_GET_DESCRIPTOR_TYPE (Node)));
> +        return (0);
> +    }
>   
>       Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE);
>       return (Size);
> diff --git a/src/acpica/source/components/namespace/nsprepkg.c b/src/acpica/source/components/namespace/nsprepkg.c
> index 84856817..6ad53d61 100644
> --- a/src/acpica/source/components/namespace/nsprepkg.c
> +++ b/src/acpica/source/components/namespace/nsprepkg.c
> @@ -722,6 +722,8 @@ AcpiNsCheckPackageList (
>   
>           default: /* Should not get here, type was validated by caller */
>   
> +            ACPI_ERROR ((AE_INFO, "Invalid Package type: %X",
> +                Package->RetInfo.Type));
>               return (AE_AML_INTERNAL);
>           }
>   
> diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c
> index 649f0276..fe7fe6d0 100644
> --- a/src/acpica/source/components/parser/psloop.c
> +++ b/src/acpica/source/components/parser/psloop.c
> @@ -282,6 +282,9 @@ AcpiPsGetArguments (
>               INCREMENT_ARG_LIST (WalkState->ArgTypes);
>           }
>   
> +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
> +            "Final argument count: %u pass %u\n",
> +            WalkState->ArgCount, WalkState->PassNumber));
>   
>           /*
>            * Handle executable code at "module-level". This refers to
> @@ -380,6 +383,10 @@ AcpiPsGetArguments (
>                   (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
>                   (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
>               {
> +                ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
> +                    "Setup Package/Buffer: Pass %u, AML Ptr: %p\n",
> +                    WalkState->PassNumber, AmlOpStart));
> +
>                   /*
>                    * Skip parsing of Buffers and Packages because we don't have
>                    * enough info in the first pass to parse them correctly.
> @@ -689,6 +696,9 @@ AcpiPsParseLoop (
>   
>           /* Check for arguments that need to be processed */
>   
> +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
> +            "Parseloop: argument count: %u\n", WalkState->ArgCount));
> +
>           if (WalkState->ArgCount)
>           {
>               /*
> diff --git a/src/acpica/source/components/resources/rsxface.c b/src/acpica/source/components/resources/rsxface.c
> index 5e3f7352..2c27eaf5 100644
> --- a/src/acpica/source/components/resources/rsxface.c
> +++ b/src/acpica/source/components/resources/rsxface.c
> @@ -796,7 +796,7 @@ ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer)
>    *                                device we are querying
>    *              Name            - Method name of the resources we want.
>    *                                (METHOD_NAME__CRS, METHOD_NAME__PRS, or
> - *                                METHOD_NAME__AEI)
> + *                                METHOD_NAME__AEI or METHOD_NAME__DMA)
>    *              UserFunction    - Called for each resource
>    *              Context         - Passed to UserFunction
>    *
> @@ -827,12 +827,13 @@ AcpiWalkResources (
>       if (!DeviceHandle || !UserFunction || !Name ||
>           (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
>            !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) &&
> -         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI)))
> +         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI) &&
> +         !ACPI_COMPARE_NAME (Name, METHOD_NAME__DMA)))
>       {
>           return_ACPI_STATUS (AE_BAD_PARAMETER);
>       }
>   
> -    /* Get the _CRS/_PRS/_AEI resource list */
> +    /* Get the _CRS/_PRS/_AEI/_DMA resource list */
>   
>       Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
>       Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
> diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c
> index 47096186..18e58f9d 100644
> --- a/src/acpica/source/components/tables/tbdata.c
> +++ b/src/acpica/source/components/tables/tbdata.c
> @@ -648,6 +648,8 @@ AcpiTbCheckDuplication (
>    *
>    * DESCRIPTION: This function is called to validate and verify the table, the
>    *              returned table descriptor is in "VALIDATED" state.
> + *              Note that 'TableIndex' is required to be set to !NULL to
> + *              enable duplication check.
>    *
>    *****************************************************************************/
>   
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 5fd178f5..d8cb6b18 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -293,7 +293,7 @@ AcpiReallocateRootTable (
>   {
>       ACPI_STATUS             Status;
>       ACPI_TABLE_DESC         *TableDesc;
> -    UINT32                  i;
> +    UINT32                  i, j;
>   
>   
>       ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
> @@ -339,7 +339,7 @@ AcpiReallocateRootTable (
>               TableDesc = &AcpiGbl_RootTableList.Tables[i];
>               if (!(TableDesc->Flags & ACPI_TABLE_IS_VERIFIED))
>               {
> -                Status = AcpiTbVerifyTempTable (TableDesc, NULL, NULL);
> +                Status = AcpiTbVerifyTempTable (TableDesc, NULL, &j);
>                   if (ACPI_FAILURE (Status))
>                   {
>                       AcpiTbUninstallTable (TableDesc);
> diff --git a/src/acpica/source/components/utilities/uthex.c b/src/acpica/source/components/utilities/uthex.c
> index 7f507697..8c7bcccc 100644
> --- a/src/acpica/source/components/utilities/uthex.c
> +++ b/src/acpica/source/components/utilities/uthex.c
> @@ -183,8 +183,10 @@ AcpiUtHexToAsciiChar (
>       UINT64                  Integer,
>       UINT32                  Position)
>   {
> +    UINT64                  Index;
>   
> -    return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
> +    AcpiUtShortShiftRight (Integer, Position, &Index);
> +    return (AcpiGbl_HexToAscii[Index & 0xF]);
>   }
>   
>   
> diff --git a/src/acpica/source/components/utilities/utmath.c b/src/acpica/source/components/utilities/utmath.c
> index 1da5f9ad..4aa94025 100644
> --- a/src/acpica/source/components/utilities/utmath.c
> +++ b/src/acpica/source/components/utilities/utmath.c
> @@ -156,16 +156,6 @@
>   #define _COMPONENT          ACPI_UTILITIES
>           ACPI_MODULE_NAME    ("utmath")
>   
> -/*
> - * Optional support for 64-bit double-precision integer divide. This code
> - * is configurable and is implemented in order to support 32-bit kernel
> - * environments where a 64-bit double-precision math library is not available.
> - *
> - * Support for a more normal 64-bit divide/modulo (with check for a divide-
> - * by-zero) appears after this optional section of code.
> - */
> -#ifndef ACPI_USE_NATIVE_DIVIDE
> -
>   /* Structures used only for 64-bit divide */
>   
>   typedef struct uint64_struct
> @@ -182,6 +172,257 @@ typedef union uint64_overlay
>   
>   } UINT64_OVERLAY;
>   
> +/*
> + * Optional support for 64-bit double-precision integer multiply and shift.
> + * This code is configurable and is implemented in order to support 32-bit
> + * kernel environments where a 64-bit double-precision math library is not
> + * available.
> + */
> +#ifndef ACPI_USE_NATIVE_MATH64
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortMultiply
> + *
> + * PARAMETERS:  Multiplicand        - 64-bit multiplicand
> + *              Multiplier          - 32-bit multiplier
> + *              OutProduct          - Pointer to where the product is returned
> + *
> + * DESCRIPTION: Perform a short multiply.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortMultiply (
> +    UINT64                  Multiplicand,
> +    UINT32                  Multiplier,
> +    UINT64                  *OutProduct)
> +{
> +    UINT64_OVERLAY          MultiplicandOvl;
> +    UINT64_OVERLAY          Product;
> +    UINT32                  Carry32;
> +
> +
> +    ACPI_FUNCTION_TRACE (UtShortMultiply);
> +
> +
> +    MultiplicandOvl.Full = Multiplicand;
> +
> +    /*
> +     * The Product is 64 bits, the carry is always 32 bits,
> +     * and is generated by the second multiply.
> +     */
> +    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Hi, Multiplier,
> +        Product.Part.Hi, Carry32);
> +
> +    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Lo, Multiplier,
> +        Product.Part.Lo, Carry32);
> +
> +    Product.Part.Hi += Carry32;
> +
> +    /* Return only what was requested */
> +
> +    if (OutProduct)
> +    {
> +        *OutProduct = Product.Full;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftLeft
> + *
> + * PARAMETERS:  Operand             - 64-bit shift operand
> + *              Count               - 32-bit shift count
> + *              OutResult           - Pointer to where the result is returned
> + *
> + * DESCRIPTION: Perform a short left shift.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftLeft (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +    UINT64_OVERLAY          OperandOvl;
> +
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
> +
> +
> +    OperandOvl.Full = Operand;
> +
> +    if ((Count & 63) >= 32)
> +    {
> +        OperandOvl.Part.Hi = OperandOvl.Part.Lo;
> +        OperandOvl.Part.Lo ^= OperandOvl.Part.Lo;
> +        Count = (Count & 63) - 32;
> +    }
> +    ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
> +        OperandOvl.Part.Lo, Count);
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = OperandOvl.Full;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftRight
> + *
> + * PARAMETERS:  Operand             - 64-bit shift operand
> + *              Count               - 32-bit shift count
> + *              OutResult           - Pointer to where the result is returned
> + *
> + * DESCRIPTION: Perform a short right shift.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftRight (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +    UINT64_OVERLAY          OperandOvl;
> +
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftRight);
> +
> +
> +    OperandOvl.Full = Operand;
> +
> +    if ((Count & 63) >= 32)
> +    {
> +        OperandOvl.Part.Lo = OperandOvl.Part.Hi;
> +        OperandOvl.Part.Hi ^= OperandOvl.Part.Hi;
> +        Count = (Count & 63) - 32;
> +    }
> +    ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
> +        OperandOvl.Part.Lo, Count);
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = OperandOvl.Full;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +#else
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortMultiply
> + *
> + * PARAMETERS:  See function headers above
> + *
> + * DESCRIPTION: Native version of the UtShortMultiply function.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortMultiply (
> +    UINT64                  Multiplicand,
> +    UINT32                  Multiplier,
> +    UINT64                  *OutProduct)
> +{
> +
> +    ACPI_FUNCTION_TRACE (UtShortMultiply);
> +
> +
> +    /* Return only what was requested */
> +
> +    if (OutProduct)
> +    {
> +        *OutProduct = Multiplicand * Multiplier;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftLeft
> + *
> + * PARAMETERS:  See function headers above
> + *
> + * DESCRIPTION: Native version of the UtShortShiftLeft function.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftLeft (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
> +
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = Operand << Count;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiUtShortShiftRight
> + *
> + * PARAMETERS:  See function headers above
> + *
> + * DESCRIPTION: Native version of the UtShortShiftRight function.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtShortShiftRight (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult)
> +{
> +
> +    ACPI_FUNCTION_TRACE (UtShortShiftRight);
> +
> +
> +    /* Return only what was requested */
> +
> +    if (OutResult)
> +    {
> +        *OutResult = Operand >> Count;
> +    }
> +
> +    return_ACPI_STATUS (AE_OK);
> +}
> +#endif
> +
> +/*
> + * Optional support for 64-bit double-precision integer divide. This code
> + * is configurable and is implemented in order to support 32-bit kernel
> + * environments where a 64-bit double-precision math library is not available.
> + *
> + * Support for a more normal 64-bit divide/modulo (with check for a divide-
> + * by-zero) appears after this optional section of code.
> + */
> +#ifndef ACPI_USE_NATIVE_DIVIDE
> +
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
> index 33e51f5c..7280bca7 100644
> --- a/src/acpica/source/components/utilities/utmisc.c
> +++ b/src/acpica/source/components/utilities/utmisc.c
> @@ -363,7 +363,7 @@ AcpiUtCreateUpdateStateAndPush (
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Walk through a package
> + * DESCRIPTION: Walk through a package, including subpackages
>    *
>    ******************************************************************************/
>   
> @@ -377,8 +377,8 @@ AcpiUtWalkPackageTree (
>       ACPI_STATUS             Status = AE_OK;
>       ACPI_GENERIC_STATE      *StateList = NULL;
>       ACPI_GENERIC_STATE      *State;
> -    UINT32                  ThisIndex;
>       ACPI_OPERAND_OBJECT     *ThisSourceObj;
> +    UINT32                  ThisIndex;
>   
>   
>       ACPI_FUNCTION_TRACE (UtWalkPackageTree);
> @@ -395,8 +395,10 @@ AcpiUtWalkPackageTree (
>           /* Get one element of the package */
>   
>           ThisIndex = State->Pkg.Index;
> -        ThisSourceObj = (ACPI_OPERAND_OBJECT *)
> +        ThisSourceObj =
>               State->Pkg.SourceObject->Package.Elements[ThisIndex];
> +        State->Pkg.ThisTargetObj =
> +            &State->Pkg.SourceObject->Package.Elements[ThisIndex];
>   
>           /*
>            * Check for:
> @@ -412,7 +414,7 @@ AcpiUtWalkPackageTree (
>               (ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
>           {
>               Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
> -                                    State, Context);
> +                State, Context);
>               if (ACPI_FAILURE (Status))
>               {
>                   return_ACPI_STATUS (Status);
> @@ -485,6 +487,9 @@ AcpiUtWalkPackageTree (
>   
>       /* We should never get here */
>   
> +    ACPI_ERROR ((AE_INFO,
> +        "State list did not terminate correctly"));
> +
>       return_ACPI_STATUS (AE_AML_INTERNAL);
>   }
>   
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index a94c882e..65aae85f 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -651,6 +651,10 @@ AcpiUtGetSimpleObjectSize (
>       {
>           /* A namespace node should never get here */
>   
> +        ACPI_ERROR ((AE_INFO,
> +            "Received a namespace node [%4.4s] "
> +            "where an operand object is required",
> +            ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, InternalObject)->Name.Ascii));
>           return_ACPI_STATUS (AE_AML_INTERNAL);
>       }
>   
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index e34662c8..da4fdc43 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -360,14 +360,11 @@ AcpiUtWalkAmlResources (
>               }
>   
>               /*
> -             * The EndTag opcode must be followed by a zero byte.
> -             * Although this byte is technically defined to be a checksum,
> -             * in practice, all ASL compilers set this byte to zero.
> +             * Don't attempt to perform any validation on the 2nd byte.
> +             * Although all known ASL compilers insert a zero for the 2nd
> +             * byte, it can also be a checksum (as per the ACPI spec),
> +             * and this is occasionally seen in the field. July 2017.
>                */
> -            if (*(Aml + 1) != 0)
> -            {
> -                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
> -            }
>   
>               /* Return the pointer to the EndTag if requested */
>   
> diff --git a/src/acpica/source/components/utilities/utstate.c b/src/acpica/source/components/utilities/utstate.c
> index 2d75c894..8effe5ba 100644
> --- a/src/acpica/source/components/utilities/utstate.c
> +++ b/src/acpica/source/components/utilities/utstate.c
> @@ -363,7 +363,7 @@ ACPI_GENERIC_STATE *
>   AcpiUtCreatePkgState (
>       void                    *InternalObject,
>       void                    *ExternalObject,
> -    UINT16                  Index)
> +    UINT32                  Index)
>   {
>       ACPI_GENERIC_STATE      *State;
>   
> diff --git a/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
> index a3c52b9e..d91e9084 100644
> --- a/src/acpica/source/components/utilities/utstrtoul64.c
> +++ b/src/acpica/source/components/utilities/utstrtoul64.c
> @@ -419,8 +419,8 @@ AcpiUtStrtoulBase10 (
>   
>           /* Convert and insert (add) the decimal digit */
>   
> -        NextValue =
> -            (ReturnValue * 10) + (AsciiDigit - ACPI_ASCII_ZERO);
> +        AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
> +        NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
>   
>           /* Check for overflow (32 or 64 bit) - return current converted value */
>   
> @@ -486,8 +486,8 @@ AcpiUtStrtoulBase16 (
>   
>           /* Convert and insert the hex digit */
>   
> -        ReturnValue =
> -            (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit);
> +        AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
> +        ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
>   
>           String++;
>           ValidDigits++;
> diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
> index 3ac6a381..a88a4a3d 100644
> --- a/src/acpica/source/components/utilities/uttrack.c
> +++ b/src/acpica/source/components/utilities/uttrack.c
> @@ -776,6 +776,11 @@ AcpiUtDumpAllocations (
>           return_VOID;
>       }
>   
> +    if (!AcpiGbl_GlobalList)
> +    {
> +        goto Exit;
> +    }
> +
>       Element = AcpiGbl_GlobalList->ListHead;
>       while (Element)
>       {
> @@ -787,7 +792,7 @@ AcpiUtDumpAllocations (
>   
>               if (Element->Size < sizeof (ACPI_COMMON_DESCRIPTOR))
>               {
> -                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u "
> +                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u "
>                       "[Not a Descriptor - too small]\n",
>                       Descriptor, Element->Size, Element->Module,
>                       Element->Line);
> @@ -799,7 +804,7 @@ AcpiUtDumpAllocations (
>                   if (ACPI_GET_DESCRIPTOR_TYPE (Descriptor) !=
>                       ACPI_DESC_TYPE_CACHED)
>                   {
> -                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u [%s] ",
> +                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u [%s] ",
>                           Descriptor, Element->Size, Element->Module,
>                           Element->Line, AcpiUtGetDescriptorName (Descriptor));
>   
> @@ -875,6 +880,7 @@ AcpiUtDumpAllocations (
>           Element = Element->Next;
>       }
>   
> +Exit:
>       (void) AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
>   
>       /* Print summary */
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 5beec2d4..26d4f47b 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -271,6 +271,7 @@ typedef enum
>       ACPI_DMT_PCCT,
>       ACPI_DMT_PMTT,
>       ACPI_DMT_PPTT,
> +    ACPI_DMT_SDEI,
>       ACPI_DMT_SLIC,
>       ACPI_DMT_SRAT,
>   
> @@ -527,6 +528,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3ptHdr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt0[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt1[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSbst[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdei[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlic[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlit[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSpcr[];
> diff --git a/src/acpica/source/include/acdispat.h b/src/acpica/source/include/acdispat.h
> index 1c294c3a..bae3d794 100644
> --- a/src/acpica/source/include/acdispat.h
> +++ b/src/acpica/source/include/acdispat.h
> @@ -409,6 +409,12 @@ AcpiDsInitializeObjects (
>    * dsobject - Parser/Interpreter interface - object initialization and conversion
>    */
>   ACPI_STATUS
> +AcpiDsBuildInternalObject (
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_PARSE_OBJECT       *Op,
> +    ACPI_OPERAND_OBJECT     **ObjDescPtr);
> +
> +ACPI_STATUS
>   AcpiDsBuildInternalBufferObj (
>       ACPI_WALK_STATE         *WalkState,
>       ACPI_PARSE_OBJECT       *Op,
> @@ -437,6 +443,17 @@ AcpiDsCreateNode (
>   
>   
>   /*
> + * dspkginit - Package object initialization
> + */
> +ACPI_STATUS
> +AcpiDsInitPackageElement (
> +    UINT8                   ObjectType,
> +    ACPI_OPERAND_OBJECT     *SourceObject,
> +    ACPI_GENERIC_STATE      *State,
> +    void                    *Context);
> +
> +
> +/*
>    * dsutils - Parser/Interpreter interface utility routines
>    */
>   void
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index 399e4c06..00be20ed 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -813,7 +813,7 @@ typedef struct acpi_update_state
>   typedef struct acpi_pkg_state
>   {
>       ACPI_STATE_COMMON
> -    UINT16                          Index;
> +    UINT32                          Index;
>       union acpi_operand_object       *SourceObject;
>       union acpi_operand_object       *DestObject;
>       struct acpi_walk_state          *WalkState;
> diff --git a/src/acpica/source/include/acnames.h b/src/acpica/source/include/acnames.h
> index 27b0b970..69f88844 100644
> --- a/src/acpica/source/include/acnames.h
> +++ b/src/acpica/source/include/acnames.h
> @@ -162,6 +162,7 @@
>   #define METHOD_NAME__CLS        "_CLS"
>   #define METHOD_NAME__CRS        "_CRS"
>   #define METHOD_NAME__DDN        "_DDN"
> +#define METHOD_NAME__DMA        "_DMA"
>   #define METHOD_NAME__HID        "_HID"
>   #define METHOD_NAME__INI        "_INI"
>   #define METHOD_NAME__PLD        "_PLD"
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index f0376097..7dce4cee 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -546,11 +546,12 @@ typedef struct acpi_object_reference
>       ACPI_OBJECT_COMMON_HEADER
>       UINT8                           Class;              /* Reference Class */
>       UINT8                           TargetType;         /* Used for Index Op */
> -    UINT8                           Reserved;
> +    UINT8                           Resolved;           /* Reference has been resolved to a value */
>       void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
>       ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
>       union acpi_operand_object       **Where;            /* Target of Index */
>       UINT8                           *IndexPointer;      /* Used for Buffers and Strings */
> +    UINT8                           *Aml;               /* Used for deferred resolution of the ref */
>       UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
>   
>   } ACPI_OBJECT_REFERENCE;
> @@ -571,7 +572,6 @@ typedef enum
>   
>   } ACPI_REFERENCE_CLASSES;
>   
> -
>   /*
>    * Extra object is used as additional storage for types that
>    * have AML code in their declarations (TermArgs) that must be
> diff --git a/src/acpica/source/include/acpi.h b/src/acpica/source/include/acpi.h
> index 46d75eb7..8c4152b8 100644
> --- a/src/acpica/source/include/acpi.h
> +++ b/src/acpica/source/include/acpi.h
> @@ -162,14 +162,14 @@
>    * Note: The order of these include files is important.
>    */
>   #include "platform/acenv.h"     /* Environment-specific items */
> -#include "acnames.h"            /* Common ACPI names and strings */
>   #include "actypes.h"            /* ACPICA data types and structures */
> +#include "platform/acenvex.h"   /* Extra environment-specific items */
> +#include "acnames.h"            /* Common ACPI names and strings */
>   #include "acexcep.h"            /* ACPICA exceptions */
>   #include "actbl.h"              /* ACPI table definitions */
>   #include "acoutput.h"           /* Error output and Debug macros */
>   #include "acrestyp.h"           /* Resource Descriptor structs */
>   #include "acpiosxf.h"           /* OSL interfaces (ACPICA-to-OS) */
>   #include "acpixf.h"             /* ACPI core subsystem external interfaces */
> -#include "platform/acenvex.h"   /* Extra environment-specific items */
>   
>   #endif /* __ACPI_H__ */
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 7aad8386..7a24391d 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -154,7 +154,7 @@
>   
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>   
> -#define ACPI_CA_VERSION                 0x20170629
> +#define ACPI_CA_VERSION                 0x20170728
>   
>   #include "acconfig.h"
>   #include "actypes.h"
> diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
> index 1e91ffc5..18cfdd46 100644
> --- a/src/acpica/source/include/actbl2.h
> +++ b/src/acpica/source/include/actbl2.h
> @@ -186,6 +186,7 @@
>   #define ACPI_SIG_MCHI           "MCHI"      /* Management Controller Host Interface table */
>   #define ACPI_SIG_MSDM           "MSDM"      /* Microsoft Data Management Table */
>   #define ACPI_SIG_MTMR           "MTMR"      /* MID Timer table */
> +#define ACPI_SIG_SDEI           "SDEI"      /* Software Delegated Exception Interface Table */
>   #define ACPI_SIG_SLIC           "SLIC"      /* Software Licensing Description Table */
>   #define ACPI_SIG_SPCR           "SPCR"      /* Serial Port Console Redirection table */
>   #define ACPI_SIG_SPMI           "SPMI"      /* Server Platform Management Interface table */
> @@ -1422,6 +1423,21 @@ typedef struct acpi_mtmr_entry
>   
>   } ACPI_MTMR_ENTRY;
>   
> +/*******************************************************************************
> + *
> + * SDEI - Software Delegated Exception Interface Descriptor Table
> + *
> + * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
> + * May 8th, 2017. Copyright 2017 ARM Ltd.
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_sdei
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_SDEI;
> +
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index 843adec7..1839f936 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -276,6 +276,7 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
>   #define ACPI_MAX_PTR                    ACPI_UINT64_MAX
>   #define ACPI_SIZE_MAX                   ACPI_UINT64_MAX
>   #define ACPI_USE_NATIVE_DIVIDE          /* Has native 64-bit integer support */
> +#define ACPI_USE_NATIVE_MATH64          /* Has native 64-bit integer support */
>   
>   /*
>    * In the case of the Itanium Processor Family (IPF), the hardware does not
> @@ -675,6 +676,13 @@ typedef UINT64                          ACPI_INTEGER;
>   #define ACPI_VALIDATE_RSDP_SIG(a)       (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
>   #define ACPI_MAKE_RSDP_SIG(dest)        (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
>   
> +/*
> + * Algorithm to obtain access bit width.
> + * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
> + * ACPI_RESOURCE_GENERIC_REGISTER.
> + */
> +#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
> +
>   
>   /*******************************************************************************
>    *
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 46588a40..bca4a94c 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -845,7 +845,7 @@ ACPI_GENERIC_STATE *
>   AcpiUtCreatePkgState (
>       void                    *InternalObject,
>       void                    *ExternalObject,
> -    UINT16                  Index);
> +    UINT32                  Index);
>   
>   ACPI_STATUS
>   AcpiUtCreateUpdateStateAndPush (
> @@ -879,6 +879,24 @@ AcpiUtShortDivide (
>       UINT64                  *OutQuotient,
>       UINT32                  *OutRemainder);
>   
> +ACPI_STATUS
> +AcpiUtShortMultiply (
> +    UINT64                  InMultiplicand,
> +    UINT32                  Multiplier,
> +    UINT64                  *Outproduct);
> +
> +ACPI_STATUS
> +AcpiUtShortShiftLeft (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult);
> +
> +ACPI_STATUS
> +AcpiUtShortShiftRight (
> +    UINT64                  Operand,
> +    UINT32                  Count,
> +    UINT64                  *OutResult);
> +
>   
>   /*
>    * utmisc
> diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
> index da719a7d..74c7108b 100644
> --- a/src/acpica/source/include/platform/acgcc.h
> +++ b/src/acpica/source/include/platform/acgcc.h
> @@ -192,4 +192,8 @@ typedef __builtin_va_list       va_list;
>   
>   #define COMPILER_VA_MACRO               1
>   
> +/* GCC supports native multiply/shift on 32-bit platforms */
> +
> +#define ACPI_USE_NATIVE_MATH64
> +
>   #endif /* __ACGCC_H__ */
> diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
> index b287e4d9..75b1d827 100644
> --- a/src/acpica/source/include/platform/aclinux.h
> +++ b/src/acpica/source/include/platform/aclinux.h
> @@ -237,6 +237,7 @@
>   /* Host-dependent types and defines for in-kernel ACPICA */
>   
>   #define ACPI_MACHINE_WIDTH          BITS_PER_LONG
> +#define ACPI_USE_NATIVE_MATH64
>   #define ACPI_EXPORT_SYMBOL(symbol)  EXPORT_SYMBOL(symbol);
>   #define strtoul                     simple_strtoul
>   
> @@ -325,6 +326,7 @@
>   #define COMPILER_DEPENDENT_INT64    long long
>   #define COMPILER_DEPENDENT_UINT64   unsigned long long
>   #define ACPI_USE_NATIVE_DIVIDE
> +#define ACPI_USE_NATIVE_MATH64
>   #endif
>   
>   #ifndef __cdecl
> 


Acked-by: Ivan Hu <ivan.hu@canonical.com>
diff mbox

Patch

diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
index 4b7ef1da..58b07494 100644
--- a/src/acpica/Makefile.am
+++ b/src/acpica/Makefile.am
@@ -116,6 +116,7 @@  libfwtsacpica_la_SOURCES =				\
 	source/components/dispatcher/dsmethod.c		\
 	source/components/dispatcher/dsmthdat.c		\
 	source/components/dispatcher/dsobject.c		\
+	source/components/dispatcher/dspkginit.c	\
 	source/components/dispatcher/dsutils.c		\
 	source/components/dispatcher/dswexec.c		\
 	source/components/dispatcher/dswload.c		\
diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
index 38c1ea20..7aee3c66 100644
--- a/src/acpica/source/common/ahtable.c
+++ b/src/acpica/source/common/ahtable.c
@@ -239,6 +239,7 @@  const AH_TABLE      Gbl_AcpiSupportedTables[] =
     {ACPI_SIG_RSDT, "Root System Description Table"},
     {ACPI_SIG_S3PT, "S3 Performance Table"},
     {ACPI_SIG_SBST, "Smart Battery Specification Table"},
+    {ACPI_SIG_SDEI, "Software Delegated Exception Interface Table"},
     {ACPI_SIG_SLIC, "Software Licensing Description Table"},
     {ACPI_SIG_SLIT, "System Locality Information Table"},
     {ACPI_SIG_SPCR, "Serial Port Console Redirection table"},
diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
index b85bb0c3..38248c2c 100644
--- a/src/acpica/source/common/dmtable.c
+++ b/src/acpica/source/common/dmtable.c
@@ -493,6 +493,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
     {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
+    {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
     {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
     {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
     {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
index 56dd5539..4b902b96 100644
--- a/src/acpica/source/common/dmtbinfo.c
+++ b/src/acpica/source/common/dmtbinfo.c
@@ -218,6 +218,7 @@ 
 #define ACPI_RASF_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_RASF,f)
 #define ACPI_S3PT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_S3PT,f)
 #define ACPI_SBST_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SBST,f)
+#define ACPI_SDEI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEI,f)
 #define ACPI_SLIT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIT,f)
 #define ACPI_SPCR_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPCR,f)
 #define ACPI_SPMI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
@@ -2767,6 +2768,16 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
     ACPI_DMT_TERMINATOR
 };
 
+/*******************************************************************************
+ *
+ * SDEI - Software Delegated Execption Interface Descriptor Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdei[] =
+{
+    ACPI_DMT_TERMINATOR
+};
 
 /*******************************************************************************
  *
diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
index 181fc364..38568440 100644
--- a/src/acpica/source/compiler/aslcompile.c
+++ b/src/acpica/source/compiler/aslcompile.c
@@ -815,6 +815,7 @@  CmCleanupAndExit (
     BOOLEAN                 DeleteAmlFile = FALSE;
 
 
+    AslCheckExpectedExceptions ();
     AePrintErrorLog (ASL_FILE_STDERR);
     if (Gbl_DebugFlag)
     {
diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
index c3794246..fdf4dbf7 100644
--- a/src/acpica/source/compiler/aslcompiler.h
+++ b/src/acpica/source/compiler/aslcompiler.h
@@ -413,12 +413,20 @@  AslError (
     ACPI_PARSE_OBJECT       *Op,
     char                    *ExtraMessage);
 
+void
+AslCheckExpectedExceptions (
+    void);
+
+ACPI_STATUS
+AslExpectException (
+    char                    *MessageIdString);
+
 ACPI_STATUS
 AslDisableException (
     char                    *MessageIdString);
 
 BOOLEAN
-AslIsExceptionDisabled (
+AslIsExceptionIgnored (
     UINT8                   Level,
     UINT16                  MessageId);
 
diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
index 4b36058b..b49233be 100644
--- a/src/acpica/source/compiler/aslcompiler.l
+++ b/src/acpica/source/compiler/aslcompiler.l
@@ -809,7 +809,7 @@  NamePathTail                [.]{NameSeg}
 "__FILE__"                  { count (0); return (PARSEOP___FILE__); }
 "__LINE__"                  { count (0); return (PARSEOP___LINE__); }
 "__PATH__"                  { count (0); return (PARSEOP___PATH__); }
-
+"__METHOD__"                { count (0); return (PARSEOP___METHOD__); }
 
 {NameSeg}                   { char *s;
                                 count (0);
diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
index b6f7ee7d..ec91ca3e 100644
--- a/src/acpica/source/compiler/aslerror.c
+++ b/src/acpica/source/compiler/aslerror.c
@@ -160,6 +160,16 @@  static void
 AeAddToErrorLog (
     ASL_ERROR_MSG           *Enode);
 
+static BOOLEAN
+AslIsExceptionExpected (
+    UINT8                   Level,
+    UINT16                  MessageId);
+
+static BOOLEAN
+AslIsExceptionDisabled (
+    UINT8                   Level,
+    UINT16                  MessageId);
+
 
 /*******************************************************************************
  *
@@ -806,6 +816,115 @@  AslCommonError (
     return;
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AslIsExceptionIgnored
+ *
+ * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
+ *              MessageId           - Index into global message buffer
+ *
+ * RETURN:      BOOLEAN
+ *
+ * DESCRIPTION: Check if a particular exception is ignored. In this case it
+ *              means that the exception is (expected or disabled.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AslIsExceptionIgnored (
+    UINT8                   Level,
+    UINT16                  MessageId)
+{
+    BOOLEAN ExceptionIgnored;
+
+
+    /* Note: this allows exception to be disabled and expected */
+
+    ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
+    ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
+
+    return (Gbl_AllExceptionsDisabled || ExceptionIgnored);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AslCheckExpectException
+ *
+ * PARAMETERS:  none
+ *
+ * RETURN:      none
+ *
+ * DESCRIPTION: Check the global expected messages table and raise an error
+ *              for each message that has not been received.
+ *
+ ******************************************************************************/
+
+void
+AslCheckExpectedExceptions (
+    void)
+{
+    UINT8 i;
+
+    for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
+    {
+        if (!Gbl_ExpectedMessages[i].MessageReceived)
+        {
+            AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
+                Gbl_ExpectedMessages[i].MessageIdStr);
+        }
+    }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AslExpectException
+ *
+ * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Enter a message ID into the global expected messages table
+ *              If these messages are not raised during the compilation, throw
+ *              an error.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AslExpectException (
+    char                    *MessageIdString)
+{
+    UINT32                  MessageId;
+
+
+    /* Convert argument to an integer and validate it */
+
+    MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
+
+    if (MessageId > 6999)
+    {
+        printf ("\"%s\" is not a valid warning/remark/erro ID\n",
+            MessageIdString);
+        return (AE_BAD_PARAMETER);
+    }
+
+    /* Insert value into the global expected message array */
+
+    if (Gbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
+    {
+        printf ("Too many messages have been registered as expected (max %u)\n",
+            ASL_MAX_DISABLED_MESSAGES);
+        return (AE_LIMIT);
+    }
+
+    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageId = MessageId;
+    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
+    Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageReceived = FALSE;
+    Gbl_ExpectedMessagesIndex++;
+    return (AE_OK);
+}
+
 
 /*******************************************************************************
  *
@@ -866,7 +985,48 @@  AslDisableException (
  *
  ******************************************************************************/
 
-BOOLEAN
+static BOOLEAN
+AslIsExceptionExpected (
+    UINT8                   Level,
+    UINT16                  MessageId)
+{
+    UINT32                  EncodedMessageId;
+    UINT32                  i;
+
+
+    /*
+     * Mark this exception as received
+     */
+    EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
+    for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
+    {
+        /* Simple implementation via fixed array */
+
+        if (EncodedMessageId == Gbl_ExpectedMessages[i].MessageId)
+        {
+            return (Gbl_ExpectedMessages[i].MessageReceived = TRUE);
+        }
+    }
+
+    return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AslIsExceptionDisabled
+ *
+ * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
+ *              MessageId           - Index into global message buffer
+ *
+ * RETURN:      TRUE if exception/message should be ignored
+ *
+ * DESCRIPTION: Check if the user has specified options such that this
+ *              exception should be ignored
+ *
+ ******************************************************************************/
+
+static BOOLEAN
 AslIsExceptionDisabled (
     UINT8                   Level,
     UINT16                  MessageId)
@@ -940,8 +1100,7 @@  AslError (
 
     /* Check if user wants to ignore this exception */
 
-    if (Gbl_AllExceptionsDisabled ||
-        AslIsExceptionDisabled (Level, MessageId))
+    if (AslIsExceptionIgnored (Level, MessageId))
     {
         return;
     }
diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
index 0c58041f..169b25e7 100644
--- a/src/acpica/source/compiler/aslglobal.h
+++ b/src/acpica/source/compiler/aslglobal.h
@@ -252,6 +252,7 @@  extern int                  AslCompilerdebug;
 #define ASL_DEFAULT_LINE_BUFFER_SIZE    (1024 * 32) /* 32K */
 #define ASL_MSG_BUFFER_SIZE             (1024 * 32) /* 32k */
 #define ASL_MAX_DISABLED_MESSAGES       32
+#define ASL_MAX_EXPECTED_MESSAGES       32
 #define HEX_TABLE_LINE_SIZE             8
 #define HEX_LISTING_LINE_SIZE           8
 
@@ -396,6 +397,7 @@  ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentHexColumn, 0);
 ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentAmlOffset, 0);
 ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_CurrentLine, 0);
 ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_DisabledMessagesIndex, 0);
+ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_ExpectedMessagesIndex, 0);
 ASL_EXTERN UINT8                    ASL_INIT_GLOBAL (Gbl_HexBytesWereWritten, FALSE);
 ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_NumNamespaceObjects, 0);
 ASL_EXTERN UINT32                   ASL_INIT_GLOBAL (Gbl_ReservedMethods, 0);
@@ -438,6 +440,7 @@  ASL_EXTERN char                     MsgBuffer[ASL_MSG_BUFFER_SIZE];
 ASL_EXTERN char                     StringBuffer[ASL_MSG_BUFFER_SIZE];
 ASL_EXTERN char                     StringBuffer2[ASL_MSG_BUFFER_SIZE];
 ASL_EXTERN UINT32                   Gbl_DisabledMessages[ASL_MAX_DISABLED_MESSAGES];
+ASL_EXTERN ASL_EXPECTED_MESSAGE     Gbl_ExpectedMessages[ASL_MAX_EXPECTED_MESSAGES];
 
 
 #endif /* __ASLGLOBAL_H */
diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
index eb3d23dd..b87d5499 100644
--- a/src/acpica/source/compiler/aslmessages.c
+++ b/src/acpica/source/compiler/aslmessages.c
@@ -348,7 +348,8 @@  const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_ARG_AS_LOCAL_NOT_USED */      "Method Argument (as a local) is set but never used",
 /*    ASL_MSG_ARG_NOT_USED */               "Method Argument is never used",
 /*    ASL_MSG_CONSTANT_REQUIRED */          "Non-reducible expression",
-/*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT"
+/*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT",
+/*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:"
 };
 
 /* Table compiler */
diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
index 86fb1631..68216e5c 100644
--- a/src/acpica/source/compiler/aslmessages.h
+++ b/src/acpica/source/compiler/aslmessages.h
@@ -351,6 +351,7 @@  typedef enum
     ASL_MSG_ARG_NOT_USED,
     ASL_MSG_CONSTANT_REQUIRED,
     ASL_MSG_CROSS_TABLE_SCOPE,
+    ASL_MSG_EXCEPTION_NOT_RECEIVED,
 
     /* These messages are used by the Data Table compiler only */
 
diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c
index 4e6e5a16..41badcee 100644
--- a/src/acpica/source/compiler/aslparseop.c
+++ b/src/acpica/source/compiler/aslparseop.c
@@ -685,10 +685,10 @@  TrCreateNullTargetOp (
  * DESCRIPTION: Create a leaf op (no children or peers) for one of the
  *              special constants - __LINE__, __FILE__, and __DATE__.
  *
- * Note: An implemenation of __FUNC__ cannot happen here because we don't
- * have a full parse tree at this time and cannot find the parent control
- * method. If it is ever needed, __FUNC__ must be implemented later, after
- * the parse tree has been fully constructed.
+ * Note: The fullimplemenation of __METHOD__ cannot happen here because we
+ * don't have a full parse tree at this time and cannot find the parent
+ * control method. __METHOD__ must be implemented later, after the parse
+ * tree has been fully constructed.
  *
  ******************************************************************************/
 
@@ -711,6 +711,14 @@  TrCreateConstantLeafOp (
         Op->Asl.Value.Integer = Op->Asl.LineNumber;
         break;
 
+    case PARSEOP___METHOD__:
+
+        /* Will become a string literal later */
+
+        Op = TrAllocateOp (PARSEOP___METHOD__);
+        Op->Asl.Value.String = NULL;
+        break;
+
     case PARSEOP___PATH__:
 
         Op = TrAllocateOp (PARSEOP_STRING_LITERAL);
diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
index eb785069..f26ea874 100644
--- a/src/acpica/source/compiler/aslrules.y
+++ b/src/acpica/source/compiler/aslrules.y
@@ -592,6 +592,7 @@  ConstExprTerm
     | PARSEOP___FILE__              {$$ = TrCreateConstantLeafOp (PARSEOP___FILE__);}
     | PARSEOP___LINE__              {$$ = TrCreateConstantLeafOp (PARSEOP___LINE__);}
     | PARSEOP___PATH__              {$$ = TrCreateConstantLeafOp (PARSEOP___PATH__);}
+    | PARSEOP___METHOD__            {$$ = TrCreateConstantLeafOp (PARSEOP___METHOD__);}
     ;
 
 Integer
diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
index e6e9006d..38c55c18 100644
--- a/src/acpica/source/compiler/asltokens.y
+++ b/src/acpica/source/compiler/asltokens.y
@@ -637,3 +637,4 @@  NoEcho('
 %token <i> PARSEOP___FILE__
 %token <i> PARSEOP___LINE__
 %token <i> PARSEOP___PATH__
+%token <i> PARSEOP___METHOD__
diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
index d3ed53a1..daaca947 100644
--- a/src/acpica/source/compiler/asltransform.c
+++ b/src/acpica/source/compiler/asltransform.c
@@ -430,6 +430,8 @@  static void
 TrTransformSubtree (
     ACPI_PARSE_OBJECT           *Op)
 {
+    ACPI_PARSE_OBJECT           *MethodOp;
+
 
     if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
     {
@@ -465,6 +467,35 @@  TrTransformSubtree (
 
         break;
 
+    case PARSEOP___METHOD__:
+
+        /* Transform to a string op containing the parent method name */
+
+        Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
+        UtSetParseOpName (Op);
+
+        /* Find the parent control method op */
+
+        MethodOp = Op;
+        while (MethodOp)
+        {
+            if (MethodOp->Asl.ParseOpcode == PARSEOP_METHOD)
+            {
+                /* First child contains the method name */
+
+                MethodOp = MethodOp->Asl.Child;
+                Op->Asl.Value.String = MethodOp->Asl.Value.String;
+                return;
+            }
+
+            MethodOp = MethodOp->Asl.Parent;
+        }
+
+        /* At the root, invocation not within a control method */
+
+        Op->Asl.Value.String = "\\";
+        break;
+
     default:
 
         /* Nothing to do here for other opcodes */
diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h
index 4c2a2772..e4250871 100644
--- a/src/acpica/source/compiler/asltypes.h
+++ b/src/acpica/source/compiler/asltypes.h
@@ -355,6 +355,15 @@  typedef struct asl_error_msg
 
 } ASL_ERROR_MSG;
 
+/* An entry in the expected messages array */
+typedef struct asl_expected_message
+{
+    UINT32                       MessageId;
+    char                         *MessageIdStr;
+    BOOLEAN                      MessageReceived;
+
+} ASL_EXPECTED_MESSAGE;
+
 
 /* An entry in the listing file stack (for include files) */
 
diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
index fd91baeb..c5ff42c0 100644
--- a/src/acpica/source/compiler/aslutils.c
+++ b/src/acpica/source/compiler/aslutils.c
@@ -174,6 +174,12 @@  UtAttachNameseg (
     ACPI_PARSE_OBJECT       *Op,
     char                    *Name);
 
+static void
+UtReallocLineBuffers (
+    char                    **Buffer,
+    UINT32                  OldSize,
+    UINT32                  NewSize);
+
 
 /*******************************************************************************
  *
@@ -733,43 +739,48 @@  UtExpandLineBuffers (
             Gbl_LineBufferSize, NewSize);
     }
 
-    Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
+    UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize);
+    UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize);
+    UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize);
+    UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize);
+
     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
-    if (!Gbl_CurrentLineBuffer)
-    {
-        goto ErrorExit;
-    }
+    Gbl_LineBufferSize = NewSize;
+}
 
-    Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
-    if (!Gbl_MainTokenBuffer)
-    {
-        goto ErrorExit;
-    }
 
-    Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
-    if (!Gbl_MacroTokenBuffer)
-    {
-        goto ErrorExit;
-    }
+/******************************************************************************
+ *
+ * FUNCTION:    UtReallocLineBuffers
+ *
+ * PARAMETERS:  Buffer              - Buffer to realloc
+ *              OldSize             - Old size of Buffer
+ *              NewSize             - New size of Buffer
+ *
+ * RETURN:      none
+ *
+ * DESCRIPTION: Reallocate and initialize Buffer
+ *
+ *****************************************************************************/
+
+static void
+UtReallocLineBuffers (
+    char                    **Buffer,
+    UINT32                  OldSize,
+    UINT32                  NewSize)
+{
 
-    Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
-    if (!Gbl_ExpressionTokenBuffer)
+    *Buffer = realloc (*Buffer, NewSize);
+    if (*Buffer)
     {
-        goto ErrorExit;
+        memset (*Buffer + OldSize, 0, NewSize - OldSize);
+        return;
     }
 
-    Gbl_LineBufferSize = NewSize;
-    return;
-
-
-    /* On error above, simply issue error messages and abort, cannot continue */
-
-ErrorExit:
     printf ("Could not increase line buffer size from %u to %u\n",
-        Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
+        OldSize, NewSize);
 
-    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
-        NULL, NULL);
+    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL);
     AslAbort ();
 }
 
diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
index 45274168..e74fed51 100644
--- a/src/acpica/source/compiler/dtcompile.c
+++ b/src/acpica/source/compiler/dtcompile.c
@@ -486,18 +486,21 @@  DtCompileDataTable (
     }
     else if (TableData->TableInfo)
     {
-        /* Simple table, just walk the info table */
+        /* Simple table, just walk the info table, unless its empty */
 
-        Subtable = NULL;
-        Status = DtCompileTable (FieldList, TableData->TableInfo,
-            &Subtable, TRUE);
-        if (ACPI_FAILURE (Status))
+        if (FieldList && *FieldList)
         {
-            return (Status);
-        }
+            Subtable = NULL;
+            Status = DtCompileTable (FieldList, TableData->TableInfo,
+                &Subtable, TRUE);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
 
-        DtInsertSubtable (Gbl_RootTable, Subtable);
-        DtPopSubtable ();
+            DtInsertSubtable (Gbl_RootTable, Subtable);
+            DtPopSubtable ();
+        }
     }
     else
     {
diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
index 61b40b4a..1e81c580 100644
--- a/src/acpica/source/compiler/dtcompiler.h
+++ b/src/acpica/source/compiler/dtcompiler.h
@@ -726,6 +726,7 @@  extern const unsigned char  TemplateRasf[];
 extern const unsigned char  TemplateRsdt[];
 extern const unsigned char  TemplateS3pt[];
 extern const unsigned char  TemplateSbst[];
+extern const unsigned char  TemplateSdei[];
 extern const unsigned char  TemplateSlic[];
 extern const unsigned char  TemplateSlit[];
 extern const unsigned char  TemplateSpcr[];
diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
index bb4dded4..8d27359d 100644
--- a/src/acpica/source/compiler/dttemplate.h
+++ b/src/acpica/source/compiler/dttemplate.h
@@ -1178,6 +1178,15 @@  const unsigned char TemplateSbst[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00   /* 00000028    "........" */
 };
 
+const unsigned char TemplateSdei[] =
+{
+    0x53,0x44,0x45,0x49,0x3e,0x00,0x00,0x00,  /* 00000000    "SDEI>..." */
+    0x01,0x59,0x41,0x52,0x4d,0x20,0x20,0x20,  /* 00000008    ".mARM  " */
+    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
+    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x30,0x09,0x16,0x20                       /* 00000028    "0.. " */
+};
+
 const unsigned char TemplateSlic[] =
 {
     0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00,  /* 00000000    "SLICv..." */
diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
index 88072175..6edcf637 100644
--- a/src/acpica/source/compiler/dtutils.c
+++ b/src/acpica/source/compiler/dtutils.c
@@ -190,7 +190,7 @@  DtError (
 
     /* Check if user wants to ignore this exception */
 
-    if (AslIsExceptionDisabled (Level, MessageId))
+    if (AslIsExceptionIgnored (Level, MessageId))
     {
         return;
     }
diff --git a/src/acpica/source/compiler/prmacros.c b/src/acpica/source/compiler/prmacros.c
index 55aab466..675d4522 100644
--- a/src/acpica/source/compiler/prmacros.c
+++ b/src/acpica/source/compiler/prmacros.c
@@ -483,7 +483,7 @@  PrAddMacro (
     {
         /* Search the macro arg list for matching arg */
 
-        for (i = 0; Args[i].Name && (i < PR_MAX_MACRO_ARGS); i++)
+        for (i = 0; ((i < PR_MAX_MACRO_ARGS) && Args[i].Name); i++)
         {
             /*
              * Save argument offset within macro body. This is the mechanism
diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
index 2c5ef74a..75198951 100644
--- a/src/acpica/source/components/debugger/dbdisply.c
+++ b/src/acpica/source/components/debugger/dbdisply.c
@@ -451,7 +451,7 @@  DumpNode:
 
     else
     {
-        AcpiOsPrintf ("Object (%p) Pathname:  %s\n",
+        AcpiOsPrintf ("Object %p: Namespace Node - Pathname: %s\n",
             Node, (char *) RetBuf.Pointer);
     }
 
@@ -468,7 +468,7 @@  DumpNode:
     ObjDesc = AcpiNsGetAttachedObject (Node);
     if (ObjDesc)
     {
-        AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc);
+        AcpiOsPrintf ("\nAttached Object %p:", ObjDesc);
         if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
         {
             AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
@@ -476,8 +476,33 @@  DumpNode:
             return;
         }
 
-        AcpiUtDebugDumpBuffer ((void *) ObjDesc,
-            sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
+        if (ACPI_GET_DESCRIPTOR_TYPE (
+            ((ACPI_NAMESPACE_NODE *) ObjDesc)) == ACPI_DESC_TYPE_NAMED)
+        {
+            AcpiOsPrintf (" Namespace Node - ");
+            Status = AcpiGetName ((ACPI_NAMESPACE_NODE *) ObjDesc,
+                ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
+            if (ACPI_FAILURE (Status))
+            {
+                AcpiOsPrintf ("Could not convert name to pathname\n");
+            }
+            else
+            {
+                AcpiOsPrintf ("Pathname: %s",
+                    (char *) RetBuf.Pointer);
+            }
+
+            AcpiOsPrintf ("\n");
+            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
+                sizeof (ACPI_NAMESPACE_NODE), Display, ACPI_UINT32_MAX);
+        }
+        else
+        {
+            AcpiOsPrintf ("\n");
+            AcpiUtDebugDumpBuffer ((void *) ObjDesc,
+                sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
+        }
+
         AcpiExDumpObjectDescriptor (ObjDesc, 1);
     }
 }
diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
index bfa45b3e..fe9d0605 100644
--- a/src/acpica/source/components/dispatcher/dsfield.c
+++ b/src/acpica/source/components/dispatcher/dsfield.c
@@ -313,6 +313,8 @@  AcpiDsCreateBufferField (
 
         if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
         {
+            ACPI_ERROR ((AE_INFO,
+                "Parse execute mode is not set"));
             return_ACPI_STATUS (AE_AML_INTERNAL);
         }
 
@@ -701,6 +703,8 @@  AcpiDsInitFieldObjects (
             return_ACPI_STATUS (AE_OK);
         }
 
+        ACPI_ERROR ((AE_INFO,
+            "Parse deferred mode is not set"));
         return_ACPI_STATUS (AE_AML_INTERNAL);
     }
 
diff --git a/src/acpica/source/components/dispatcher/dsobject.c b/src/acpica/source/components/dispatcher/dsobject.c
index 5be9c8fd..4cbd8f78 100644
--- a/src/acpica/source/components/dispatcher/dsobject.c
+++ b/src/acpica/source/components/dispatcher/dsobject.c
@@ -160,14 +160,6 @@ 
 #define _COMPONENT          ACPI_DISPATCHER
         ACPI_MODULE_NAME    ("dsobject")
 
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiDsBuildInternalObject (
-    ACPI_WALK_STATE         *WalkState,
-    ACPI_PARSE_OBJECT       *Op,
-    ACPI_OPERAND_OBJECT     **ObjDescPtr);
-
 
 #ifndef ACPI_NO_METHOD_EXECUTION
 /*******************************************************************************
@@ -185,7 +177,7 @@  AcpiDsBuildInternalObject (
  *
  ******************************************************************************/
 
-static ACPI_STATUS
+ACPI_STATUS
 AcpiDsBuildInternalObject (
     ACPI_WALK_STATE         *WalkState,
     ACPI_PARSE_OBJECT       *Op,
@@ -193,7 +185,6 @@  AcpiDsBuildInternalObject (
 {
     ACPI_OPERAND_OBJECT     *ObjDesc;
     ACPI_STATUS             Status;
-    ACPI_OBJECT_TYPE        Type;
 
 
     ACPI_FUNCTION_TRACE (DsBuildInternalObject);
@@ -204,129 +195,43 @@  AcpiDsBuildInternalObject (
     {
         /*
          * This is a named object reference. If this name was
-         * previously looked up in the namespace, it was stored in this op.
-         * Otherwise, go ahead and look it up now
+         * previously looked up in the namespace, it was stored in
+         * this op. Otherwise, go ahead and look it up now
          */
         if (!Op->Common.Node)
         {
-            Status = AcpiNsLookup (WalkState->ScopeInfo,
-                Op->Common.Value.String,
-                ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
-                ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
-                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
-            if (ACPI_FAILURE (Status))
-            {
-                /* Check if we are resolving a named reference within a package */
-
-                if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
-
-                    ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
-                     (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP)))
-                {
-                    /*
-                     * We didn't find the target and we are populating elements
-                     * of a package - ignore if slack enabled. Some ASL code
-                     * contains dangling invalid references in packages and
-                     * expects that no exception will be issued. Leave the
-                     * element as a null element. It cannot be used, but it
-                     * can be overwritten by subsequent ASL code - this is
-                     * typically the case.
-                     */
-                    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-                        "Ignoring unresolved reference in package [%4.4s]\n",
-                        WalkState->ScopeInfo->Scope.Node->Name.Ascii));
-
-                    return_ACPI_STATUS (AE_OK);
-                }
-                else
-                {
-                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
-                }
-
-                return_ACPI_STATUS (Status);
-            }
-        }
-
-        /* Special object resolution for elements of a package */
-
-        if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
-            (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
-        {
-            /*
-             * Attempt to resolve the node to a value before we insert it into
-             * the package. If this is a reference to a common data type,
-             * resolve it immediately. According to the ACPI spec, package
-             * elements can only be "data objects" or method references.
-             * Attempt to resolve to an Integer, Buffer, String or Package.
-             * If cannot, return the named reference (for things like Devices,
-             * Methods, etc.) Buffer Fields and Fields will resolve to simple
-             * objects (int/buf/str/pkg).
-             *
-             * NOTE: References to things like Devices, Methods, Mutexes, etc.
-             * will remain as named references. This behavior is not described
-             * in the ACPI spec, but it appears to be an oversight.
-             */
-            ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Op->Common.Node);
-
-            Status = AcpiExResolveNodeToValue (
-                ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc),
-                WalkState);
-            if (ACPI_FAILURE (Status))
-            {
-                return_ACPI_STATUS (Status);
-            }
+            /* Check if we are resolving a named reference within a package */
 
-            /*
-             * Special handling for Alias objects. We need to setup the type
-             * and the Op->Common.Node to point to the Alias target. Note,
-             * Alias has at most one level of indirection internally.
-             */
-            Type = Op->Common.Node->Type;
-            if (Type == ACPI_TYPE_LOCAL_ALIAS)
+            if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+                (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
             {
-                Type = ObjDesc->Common.Type;
-                Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
-                    Op->Common.Node->Object);
-            }
-
-            switch (Type)
-            {
-            /*
-             * For these types, we need the actual node, not the subobject.
-             * However, the subobject did not get an extra reference count above.
-             *
-             * TBD: should ExResolveNodeToValue be changed to fix this?
-             */
-            case ACPI_TYPE_DEVICE:
-            case ACPI_TYPE_THERMAL:
-
-                AcpiUtAddReference (Op->Common.Node->Object);
-
-                /*lint -fallthrough */
-            /*
-             * For these types, we need the actual node, not the subobject.
-             * The subobject got an extra reference count in ExResolveNodeToValue.
-             */
-            case ACPI_TYPE_MUTEX:
-            case ACPI_TYPE_METHOD:
-            case ACPI_TYPE_POWER:
-            case ACPI_TYPE_PROCESSOR:
-            case ACPI_TYPE_EVENT:
-            case ACPI_TYPE_REGION:
-
-                /* We will create a reference object for these types below */
-                break;
-
-            default:
                 /*
-                 * All other types - the node was resolved to an actual
-                 * object, we are done.
+                 * We won't resolve package elements here, we will do this
+                 * after all ACPI tables are loaded into the namespace. This
+                 * behavior supports both forward references to named objects
+                 * and external references to objects in other tables.
                  */
-                goto Exit;
+                goto CreateNewObject;
+            }
+            else
+            {
+                Status = AcpiNsLookup (WalkState->ScopeInfo,
+                    Op->Common.Value.String,
+                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+                    ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
+                    ACPI_CAST_INDIRECT_PTR (
+                        ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
+                if (ACPI_FAILURE (Status))
+                {
+                    ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
+                    return_ACPI_STATUS (Status);
+                }
             }
         }
     }
 
+CreateNewObject:
+
     /* Create and init a new internal ACPI object */
 
     ObjDesc = AcpiUtCreateInternalObject (
@@ -344,7 +249,28 @@  AcpiDsBuildInternalObject (
         return_ACPI_STATUS (Status);
     }
 
-Exit:
+    /*
+     * Handling for unresolved package reference elements.
+     * These are elements that are namepaths.
+     */
+    if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+        (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
+    {
+        ObjDesc->Reference.Resolved = TRUE;
+
+        if ((Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+            !ObjDesc->Reference.Node)
+        {
+            /*
+             * Name was unresolved above.
+             * Get the prefix node for later lookup
+             */
+            ObjDesc->Reference.Node = WalkState->ScopeInfo->Scope.Node;
+            ObjDesc->Reference.Aml = Op->Common.Aml;
+            ObjDesc->Reference.Resolved = FALSE;
+        }
+    }
+
     *ObjDescPtr = ObjDesc;
     return_ACPI_STATUS (Status);
 }
@@ -466,209 +392,6 @@  AcpiDsBuildInternalBufferObj (
     return_ACPI_STATUS (AE_OK);
 }
 
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDsBuildInternalPackageObj
- *
- * PARAMETERS:  WalkState       - Current walk state
- *              Op              - Parser object to be translated
- *              ElementCount    - Number of elements in the package - this is
- *                                the NumElements argument to Package()
- *              ObjDescPtr      - Where the ACPI internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Translate a parser Op package object to the equivalent
- *              namespace object
- *
- * NOTE: The number of elements in the package will be always be the NumElements
- * count, regardless of the number of elements in the package list. If
- * NumElements is smaller, only that many package list elements are used.
- * if NumElements is larger, the Package object is padded out with
- * objects of type Uninitialized (as per ACPI spec.)
- *
- * Even though the ASL compilers do not allow NumElements to be smaller
- * than the Package list length (for the fixed length package opcode), some
- * BIOS code modifies the AML on the fly to adjust the NumElements, and
- * this code compensates for that. This also provides compatibility with
- * other AML interpreters.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiDsBuildInternalPackageObj (
-    ACPI_WALK_STATE         *WalkState,
-    ACPI_PARSE_OBJECT       *Op,
-    UINT32                  ElementCount,
-    ACPI_OPERAND_OBJECT     **ObjDescPtr)
-{
-    ACPI_PARSE_OBJECT       *Arg;
-    ACPI_PARSE_OBJECT       *Parent;
-    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
-    ACPI_STATUS             Status = AE_OK;
-    UINT32                  i;
-    UINT16                  Index;
-    UINT16                  ReferenceCount;
-
-
-    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
-
-
-    /* Find the parent of a possibly nested package */
-
-    Parent = Op->Common.Parent;
-    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
-           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
-    {
-        Parent = Parent->Common.Parent;
-    }
-
-    /*
-     * If we are evaluating a Named package object "Name (xxxx, Package)",
-     * the package object already exists, otherwise it must be created.
-     */
-    ObjDesc = *ObjDescPtr;
-    if (!ObjDesc)
-    {
-        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
-        *ObjDescPtr = ObjDesc;
-        if (!ObjDesc)
-        {
-            return_ACPI_STATUS (AE_NO_MEMORY);
-        }
-
-        ObjDesc->Package.Node = Parent->Common.Node;
-    }
-
-    /*
-     * Allocate the element array (array of pointers to the individual
-     * objects) based on the NumElements parameter. Add an extra pointer slot
-     * so that the list is always null terminated.
-     */
-    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
-        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
-
-    if (!ObjDesc->Package.Elements)
-    {
-        AcpiUtDeleteObjectDesc (ObjDesc);
-        return_ACPI_STATUS (AE_NO_MEMORY);
-    }
-
-    ObjDesc->Package.Count = ElementCount;
-
-    /*
-     * Initialize the elements of the package, up to the NumElements count.
-     * Package is automatically padded with uninitialized (NULL) elements
-     * if NumElements is greater than the package list length. Likewise,
-     * Package is truncated if NumElements is less than the list length.
-     */
-    Arg = Op->Common.Value.Arg;
-    Arg = Arg->Common.Next;
-    for (i = 0; Arg && (i < ElementCount); i++)
-    {
-        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
-        {
-            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
-            {
-                /*
-                 * A method reference "looks" to the parser to be a method
-                 * invocation, so we special case it here
-                 */
-                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
-                Status = AcpiDsBuildInternalObject (
-                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
-            }
-            else
-            {
-                /* This package element is already built, just get it */
-
-                ObjDesc->Package.Elements[i] =
-                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
-            }
-        }
-        else
-        {
-            Status = AcpiDsBuildInternalObject (
-                WalkState, Arg, &ObjDesc->Package.Elements[i]);
-        }
-
-        if (*ObjDescPtr)
-        {
-            /* Existing package, get existing reference count */
-
-            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
-            if (ReferenceCount > 1)
-            {
-                /* Make new element ref count match original ref count */
-
-                for (Index = 0; Index < (ReferenceCount - 1); Index++)
-                {
-                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
-                }
-            }
-        }
-
-        Arg = Arg->Common.Next;
-    }
-
-    /* Check for match between NumElements and actual length of PackageList */
-
-    if (Arg)
-    {
-        /*
-         * NumElements was exhausted, but there are remaining elements in the
-         * PackageList. Truncate the package to NumElements.
-         *
-         * Note: technically, this is an error, from ACPI spec: "It is an error
-         * for NumElements to be less than the number of elements in the
-         * PackageList". However, we just print a message and
-         * no exception is returned. This provides Windows compatibility. Some
-         * BIOSs will alter the NumElements on the fly, creating this type
-         * of ill-formed package object.
-         */
-        while (Arg)
-        {
-            /*
-             * We must delete any package elements that were created earlier
-             * and are not going to be used because of the package truncation.
-             */
-            if (Arg->Common.Node)
-            {
-                AcpiUtRemoveReference (
-                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
-                Arg->Common.Node = NULL;
-            }
-
-            /* Find out how many elements there really are */
-
-            i++;
-            Arg = Arg->Common.Next;
-        }
-
-        ACPI_INFO ((
-            "Actual Package length (%u) is larger than "
-            "NumElements field (%u), truncated",
-            i, ElementCount));
-    }
-    else if (i < ElementCount)
-    {
-        /*
-         * Arg list (elements) was exhausted, but we did not reach NumElements count.
-         * Note: this is not an error, the package is padded out with NULLs.
-         */
-        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-            "Package List length (%u) smaller than NumElements "
-            "count (%u), padded with null elements\n",
-            i, ElementCount));
-    }
-
-    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
-    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
-    return_ACPI_STATUS (Status);
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDsCreateNode
@@ -796,10 +519,20 @@  AcpiDsInitObjectFromOp (
 
     case ACPI_TYPE_PACKAGE:
         /*
-         * Defer evaluation of Package TermArg operand
+         * Defer evaluation of Package TermArg operand and all
+         * package elements. (01/2017): We defer the element
+         * resolution to allow forward references from the package
+         * in order to provide compatibility with other ACPI
+         * implementations.
          */
         ObjDesc->Package.Node = ACPI_CAST_PTR (
             ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
+
+        if (!Op->Named.Data)
+        {
+            return_ACPI_STATUS (AE_OK);
+        }
+
         ObjDesc->Package.AmlStart = Op->Named.Data;
         ObjDesc->Package.AmlLength = Op->Named.Length;
         break;
@@ -940,8 +673,11 @@  AcpiDsInitObjectFromOp (
                 /* Node was saved in Op */
 
                 ObjDesc->Reference.Node = Op->Common.Node;
-                ObjDesc->Reference.Object = Op->Common.Node->Object;
                 ObjDesc->Reference.Class = ACPI_REFCLASS_NAME;
+                if (Op->Common.Node)
+                {
+                    ObjDesc->Reference.Object = Op->Common.Node->Object;
+                }
                 break;
 
             case AML_DEBUG_OP:
diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
index 3ceec94b..5ba414d3 100644
--- a/src/acpica/source/components/dispatcher/dsopcode.c
+++ b/src/acpica/source/components/dispatcher/dsopcode.c
@@ -747,6 +747,16 @@  AcpiDsEvalDataObjectOperands (
      */
     WalkState->OperandIndex = WalkState->NumOperands;
 
+    /* Ignore if child is not valid */
+
+    if (!Op->Common.Value.Arg)
+    {
+        ACPI_ERROR ((AE_INFO,
+            "Dispatch: Missing child while executing TermArg for %X",
+            Op->Common.AmlOpcode));
+        return_ACPI_STATUS (AE_OK);
+    }
+
     Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
     if (ACPI_FAILURE (Status))
     {
diff --git a/src/acpica/source/components/dispatcher/dspkginit.c b/src/acpica/source/components/dispatcher/dspkginit.c
new file mode 100644
index 00000000..14e34b09
--- /dev/null
+++ b/src/acpica/source/components/dispatcher/dspkginit.c
@@ -0,0 +1,635 @@ 
+/******************************************************************************
+ *
+ * Module Name: dspkginit - Completion of deferred package initialization
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2017, 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.
+ *
+ *****************************************************************************
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ *****************************************************************************/
+
+#include "acpi.h"
+#include "accommon.h"
+#include "acnamesp.h"
+#include "amlcode.h"
+#include "acdispat.h"
+#include "acinterp.h"
+
+
+#define _COMPONENT          ACPI_NAMESPACE
+        ACPI_MODULE_NAME    ("dspkginit")
+
+
+/* Local prototypes */
+
+static void
+AcpiDsResolvePackageElement (
+    ACPI_OPERAND_OBJECT     **Element);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsBuildInternalPackageObj
+ *
+ * PARAMETERS:  WalkState       - Current walk state
+ *              Op              - Parser object to be translated
+ *              ElementCount    - Number of elements in the package - this is
+ *                                the NumElements argument to Package()
+ *              ObjDescPtr      - Where the ACPI internal object is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Translate a parser Op package object to the equivalent
+ *              namespace object
+ *
+ * NOTE: The number of elements in the package will be always be the NumElements
+ * count, regardless of the number of elements in the package list. If
+ * NumElements is smaller, only that many package list elements are used.
+ * if NumElements is larger, the Package object is padded out with
+ * objects of type Uninitialized (as per ACPI spec.)
+ *
+ * Even though the ASL compilers do not allow NumElements to be smaller
+ * than the Package list length (for the fixed length package opcode), some
+ * BIOS code modifies the AML on the fly to adjust the NumElements, and
+ * this code compensates for that. This also provides compatibility with
+ * other AML interpreters.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsBuildInternalPackageObj (
+    ACPI_WALK_STATE         *WalkState,
+    ACPI_PARSE_OBJECT       *Op,
+    UINT32                  ElementCount,
+    ACPI_OPERAND_OBJECT     **ObjDescPtr)
+{
+    ACPI_PARSE_OBJECT       *Arg;
+    ACPI_PARSE_OBJECT       *Parent;
+    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
+    ACPI_STATUS             Status = AE_OK;
+    UINT16                  ReferenceCount;
+    UINT32                  Index;
+    UINT32                  i;
+
+
+    ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
+
+
+    /* Find the parent of a possibly nested package */
+
+    Parent = Op->Common.Parent;
+    while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+           (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
+    {
+        Parent = Parent->Common.Parent;
+    }
+
+    /*
+     * If we are evaluating a Named package object of the form:
+     *      Name (xxxx, Package)
+     * the package object already exists, otherwise it must be created.
+     */
+    ObjDesc = *ObjDescPtr;
+    if (!ObjDesc)
+    {
+        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+        *ObjDescPtr = ObjDesc;
+        if (!ObjDesc)
+        {
+            return_ACPI_STATUS (AE_NO_MEMORY);
+        }
+
+        ObjDesc->Package.Node = Parent->Common.Node;
+    }
+
+    if (ObjDesc->Package.Flags & AOPOBJ_DATA_VALID) /* Just in case */
+    {
+        return_ACPI_STATUS (AE_OK);
+    }
+
+    /*
+     * Allocate the element array (array of pointers to the individual
+     * objects) based on the NumElements parameter. Add an extra pointer slot
+     * so that the list is always null terminated.
+     */
+    ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
+        ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
+
+    if (!ObjDesc->Package.Elements)
+    {
+        AcpiUtDeleteObjectDesc (ObjDesc);
+        return_ACPI_STATUS (AE_NO_MEMORY);
+    }
+
+    ObjDesc->Package.Count = ElementCount;
+    Arg = Op->Common.Value.Arg;
+    Arg = Arg->Common.Next;
+
+    if (Arg)
+    {
+        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+    }
+
+    /*
+     * Initialize the elements of the package, up to the NumElements count.
+     * Package is automatically padded with uninitialized (NULL) elements
+     * if NumElements is greater than the package list length. Likewise,
+     * Package is truncated if NumElements is less than the list length.
+     */
+    for (i = 0; Arg && (i < ElementCount); i++)
+    {
+        if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
+        {
+            if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
+            {
+                /*
+                 * A method reference "looks" to the parser to be a method
+                 * invocation, so we special case it here
+                 */
+                Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
+                Status = AcpiDsBuildInternalObject (
+                    WalkState, Arg, &ObjDesc->Package.Elements[i]);
+            }
+            else
+            {
+                /* This package element is already built, just get it */
+
+                ObjDesc->Package.Elements[i] =
+                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
+            }
+        }
+        else
+        {
+            Status = AcpiDsBuildInternalObject (
+                WalkState, Arg, &ObjDesc->Package.Elements[i]);
+            if (Status == AE_NOT_FOUND)
+            {
+                ACPI_ERROR ((AE_INFO, "%-48s", "****DS namepath not found"));
+            }
+
+            /*
+             * Initialize this package element. This function handles the
+             * resolution of named references within the package.
+             */
+            AcpiDsInitPackageElement (0, ObjDesc->Package.Elements[i],
+                NULL, &ObjDesc->Package.Elements[i]);
+        }
+
+        if (*ObjDescPtr)
+        {
+            /* Existing package, get existing reference count */
+
+            ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
+            if (ReferenceCount > 1)
+            {
+                /* Make new element ref count match original ref count */
+                /* TBD: Probably need an AcpiUtAddReferences function */
+
+                for (Index = 0; Index < ((UINT32) ReferenceCount - 1); Index++)
+                {
+                    AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
+                }
+            }
+        }
+
+        Arg = Arg->Common.Next;
+    }
+
+    /* Check for match between NumElements and actual length of PackageList */
+
+    if (Arg)
+    {
+        /*
+         * NumElements was exhausted, but there are remaining elements in
+         * the PackageList. Truncate the package to NumElements.
+         *
+         * Note: technically, this is an error, from ACPI spec: "It is an
+         * error for NumElements to be less than the number of elements in
+         * the PackageList". However, we just print a message and no
+         * exception is returned. This provides compatibility with other
+         * ACPI implementations. Some firmware implementations will alter
+         * the NumElements on the fly, possibly creating this type of
+         * ill-formed package object.
+         */
+        while (Arg)
+        {
+            /*
+             * We must delete any package elements that were created earlier
+             * and are not going to be used because of the package truncation.
+             */
+            if (Arg->Common.Node)
+            {
+                AcpiUtRemoveReference (
+                    ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
+                Arg->Common.Node = NULL;
+            }
+
+            /* Find out how many elements there really are */
+
+            i++;
+            Arg = Arg->Common.Next;
+        }
+
+        ACPI_INFO ((
+            "Actual Package length (%u) is larger than "
+            "NumElements field (%u), truncated",
+            i, ElementCount));
+    }
+    else if (i < ElementCount)
+    {
+        /*
+         * Arg list (elements) was exhausted, but we did not reach
+         * NumElements count.
+         *
+         * Note: this is not an error, the package is padded out
+         * with NULLs.
+         */
+        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+            "Package List length (%u) smaller than NumElements "
+            "count (%u), padded with null elements\n",
+            i, ElementCount));
+    }
+
+    ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+    Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
+    return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsInitPackageElement
+ *
+ * PARAMETERS:  ACPI_PKG_CALLBACK
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Resolve a named reference element within a package object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitPackageElement (
+    UINT8                   ObjectType,
+    ACPI_OPERAND_OBJECT     *SourceObject,
+    ACPI_GENERIC_STATE      *State,
+    void                    *Context)
+{
+    ACPI_OPERAND_OBJECT     **ElementPtr;
+
+
+    if (!SourceObject)
+    {
+        return (AE_OK);
+    }
+
+    /*
+     * The following code is a bit of a hack to workaround a (current)
+     * limitation of the ACPI_PKG_CALLBACK interface. We need a pointer
+     * to the location within the element array because a new object
+     * may be created and stored there.
+     */
+    if (Context)
+    {
+        /* A direct call was made to this function */
+
+        ElementPtr = (ACPI_OPERAND_OBJECT **) Context;
+    }
+    else
+    {
+        /* Call came from AcpiUtWalkPackageTree */
+
+        ElementPtr = State->Pkg.ThisTargetObj;
+    }
+
+    /* We are only interested in reference objects/elements */
+
+    if (SourceObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
+    {
+        /* Attempt to resolve the (named) reference to a namespace node */
+
+        AcpiDsResolvePackageElement (ElementPtr);
+    }
+    else if (SourceObject->Common.Type == ACPI_TYPE_PACKAGE)
+    {
+        SourceObject->Package.Flags |= AOPOBJ_DATA_VALID;
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsResolvePackageElement
+ *
+ * PARAMETERS:  ElementPtr          - Pointer to a reference object
+ *
+ * RETURN:      Possible new element is stored to the indirect ElementPtr
+ *
+ * DESCRIPTION: Resolve a package element that is a reference to a named
+ *              object.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDsResolvePackageElement (
+    ACPI_OPERAND_OBJECT     **ElementPtr)
+{
+    ACPI_STATUS             Status;
+    ACPI_GENERIC_STATE      ScopeInfo;
+    ACPI_OPERAND_OBJECT     *Element = *ElementPtr;
+    ACPI_NAMESPACE_NODE     *ResolvedNode;
+    char                    *ExternalPath = NULL;
+    ACPI_OBJECT_TYPE        Type;
+
+
+    ACPI_FUNCTION_TRACE (DsResolvePackageElement);
+
+
+    /* Check if reference element is already resolved */
+
+    if (Element->Reference.Resolved)
+    {
+        return_VOID;
+    }
+
+    /* Element must be a reference object of correct type */
+
+    ScopeInfo.Scope.Node = Element->Reference.Node; /* Prefix node */
+
+    Status = AcpiNsLookup (&ScopeInfo,
+        (char *) Element->Reference.Aml,            /* Pointer to AML path */
+        ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+        NULL, &ResolvedNode);
+    if (ACPI_FAILURE (Status))
+    {
+        Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
+            (char *) Element->Reference.Aml,
+            NULL, &ExternalPath);
+
+        ACPI_EXCEPTION ((AE_INFO, Status,
+            "Could not find/resolve named package element: %s", ExternalPath));
+
+        ACPI_FREE (ExternalPath);
+        *ElementPtr = NULL;
+        return_VOID;
+    }
+    else if (ResolvedNode->Type == ACPI_TYPE_ANY)
+    {
+        /* Named reference not resolved, return a NULL package element */
+
+        ACPI_ERROR ((AE_INFO,
+            "Could not resolve named package element [%4.4s] in [%4.4s]",
+            ResolvedNode->Name.Ascii, ScopeInfo.Scope.Node->Name.Ascii));
+        *ElementPtr = NULL;
+        return_VOID;
+    }
+#if 0
+    else if (ResolvedNode->Flags & ANOBJ_TEMPORARY)
+    {
+        /*
+         * A temporary node found here indicates that the reference is
+         * to a node that was created within this method. We are not
+         * going to allow it (especially if the package is returned
+         * from the method) -- the temporary node will be deleted out
+         * from under the method. (05/2017).
+         */
+        ACPI_ERROR ((AE_INFO,
+            "Package element refers to a temporary name [%4.4s], "
+            "inserting a NULL element",
+            ResolvedNode->Name.Ascii));
+        *ElementPtr = NULL;
+        return_VOID;
+    }
+#endif
+
+    /*
+     * Special handling for Alias objects. We need ResolvedNode to point
+     * to the Alias target. This effectively "resolves" the alias.
+     */
+    if (ResolvedNode->Type == ACPI_TYPE_LOCAL_ALIAS)
+    {
+        ResolvedNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+            ResolvedNode->Object);
+    }
+
+    /* Update the reference object */
+
+    Element->Reference.Resolved = TRUE;
+    Element->Reference.Node = ResolvedNode;
+    Type = Element->Reference.Node->Type;
+
+    /*
+     * Attempt to resolve the node to a value before we insert it into
+     * the package. If this is a reference to a common data type,
+     * resolve it immediately. According to the ACPI spec, package
+     * elements can only be "data objects" or method references.
+     * Attempt to resolve to an Integer, Buffer, String or Package.
+     * If cannot, return the named reference (for things like Devices,
+     * Methods, etc.) Buffer Fields and Fields will resolve to simple
+     * objects (int/buf/str/pkg).
+     *
+     * NOTE: References to things like Devices, Methods, Mutexes, etc.
+     * will remain as named references. This behavior is not described
+     * in the ACPI spec, but it appears to be an oversight.
+     */
+    Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
+    if (ACPI_FAILURE (Status))
+    {
+        return_VOID;
+    }
+
+#if 0
+/* TBD - alias support */
+    /*
+     * Special handling for Alias objects. We need to setup the type
+     * and the Op->Common.Node to point to the Alias target. Note,
+     * Alias has at most one level of indirection internally.
+     */
+    Type = Op->Common.Node->Type;
+    if (Type == ACPI_TYPE_LOCAL_ALIAS)
+    {
+        Type = ObjDesc->Common.Type;
+        Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+            Op->Common.Node->Object);
+    }
+#endif
+
+    switch (Type)
+    {
+    /*
+     * These object types are a result of named references, so we will
+     * leave them as reference objects. In other words, these types
+     * have no intrinsic "value".
+     */
+    case ACPI_TYPE_DEVICE:
+    case ACPI_TYPE_THERMAL:
+
+        /* TBD: This may not be necesssary */
+
+        AcpiUtAddReference (ResolvedNode->Object);
+        break;
+
+    case ACPI_TYPE_MUTEX:
+    case ACPI_TYPE_METHOD:
+    case ACPI_TYPE_POWER:
+    case ACPI_TYPE_PROCESSOR:
+    case ACPI_TYPE_EVENT:
+    case ACPI_TYPE_REGION:
+
+        break;
+
+    default:
+        /*
+         * For all other types - the node was resolved to an actual
+         * operand object with a value, return the object
+         */
+        *ElementPtr = (ACPI_OPERAND_OBJECT *) ResolvedNode;
+        break;
+    }
+
+    return_VOID;
+}
diff --git a/src/acpica/source/components/executer/excreate.c b/src/acpica/source/components/executer/excreate.c
index 15b38574..a2cce00a 100644
--- a/src/acpica/source/components/executer/excreate.c
+++ b/src/acpica/source/components/executer/excreate.c
@@ -204,70 +204,39 @@  AcpiExCreateAlias (
     }
 
     /* Ensure that the target node is valid */
+
     if (!TargetNode)
     {
         return_ACPI_STATUS (AE_NULL_OBJECT);
     }
 
-    /*
-     * For objects that can never change (i.e., the NS node will
-     * permanently point to the same object), we can simply attach
-     * the object to the new NS node. For other objects (such as
-     * Integers, buffers, etc.), we have to point the Alias node
-     * to the original Node.
-     */
+    /* Construct the alias object (a namespace node) */
+
     switch (TargetNode->Type)
     {
-
-    /* For these types, the sub-object can change dynamically via a Store */
-
-    case ACPI_TYPE_INTEGER:
-    case ACPI_TYPE_STRING:
-    case ACPI_TYPE_BUFFER:
-    case ACPI_TYPE_PACKAGE:
-    case ACPI_TYPE_BUFFER_FIELD:
-    /*
-     * These types open a new scope, so we need the NS node in order to access
-     * any children.
-     */
-    case ACPI_TYPE_DEVICE:
-    case ACPI_TYPE_POWER:
-    case ACPI_TYPE_PROCESSOR:
-    case ACPI_TYPE_THERMAL:
-    case ACPI_TYPE_LOCAL_SCOPE:
-        /*
-         * The new alias has the type ALIAS and points to the original
-         * NS node, not the object itself.
-         */
-        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
-        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
-        break;
-
     case ACPI_TYPE_METHOD:
         /*
-         * Control method aliases need to be differentiated
+         * Control method aliases need to be differentiated with
+         * a special type
          */
         AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
-        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
         break;
 
     default:
-
-        /* Attach the original source object to the new Alias Node */
-
         /*
-         * The new alias assumes the type of the target, and it points
-         * to the same object. The reference count of the object has an
-         * additional reference to prevent deletion out from under either the
-         * target node or the alias Node
+         * All other object types.
+         *
+         * The new alias has the type ALIAS and points to the original
+         * NS node, not the object itself.
          */
-        Status = AcpiNsAttachObject (AliasNode,
-            AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
+        AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
+        AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
         break;
     }
 
     /* Since both operands are Nodes, we don't need to delete them */
 
+    AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
     return_ACPI_STATUS (Status);
 }
 
diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
index 2b23881f..c1069b2c 100644
--- a/src/acpica/source/components/executer/exdump.c
+++ b/src/acpica/source/components/executer/exdump.c
@@ -229,7 +229,7 @@  static ACPI_EXDUMP_INFO     AcpiExDumpPackage[6] =
     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage),        NULL},
     {ACPI_EXD_NODE,     ACPI_EXD_OFFSET (Package.Node),                 "Parent Node"},
     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Package.Flags),                "Flags"},
-    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Elements"},
+    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Package.Count),                "Element Count"},
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Package.Elements),             "Element List"},
     {ACPI_EXD_PACKAGE,  0,                                              NULL}
 };
@@ -510,6 +510,11 @@  AcpiExDumpObject (
 
     while (Count)
     {
+        if (!ObjDesc)
+        {
+            return;
+        }
+
         Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
         Name = Info->Name;
 
@@ -522,7 +527,8 @@  AcpiExDumpObject (
         case ACPI_EXD_TYPE:
 
             AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
-                ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
+                ObjDesc->Common.Type,
+                AcpiUtGetObjectTypeName (ObjDesc));
             break;
 
         case ACPI_EXD_UINT8:
@@ -588,10 +594,10 @@  AcpiExDumpObject (
             Start = *ACPI_CAST_PTR (void *, Target);
             Next = Start;
 
-            AcpiOsPrintf ("%20s : %p", Name, Next);
+            AcpiOsPrintf ("%20s : %p ", Name, Next);
             if (Next)
             {
-                AcpiOsPrintf ("(%s %2.2X)",
+                AcpiOsPrintf ("%s (Type %2.2X)",
                     AcpiUtGetObjectTypeName (Next), Next->Common.Type);
 
                 while (Next->Common.NextObject)
@@ -614,6 +620,10 @@  AcpiExDumpObject (
                     }
                 }
             }
+            else
+            {
+                AcpiOsPrintf ("- No attached objects");
+            }
 
             AcpiOsPrintf ("\n");
             break;
@@ -1294,7 +1304,8 @@  AcpiExDumpPackageObj (
 
     default:
 
-        AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
+        AcpiOsPrintf ("[%s] Type: %2.2X\n",
+            AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
         break;
     }
 }
@@ -1338,10 +1349,19 @@  AcpiExDumpObjectDescriptor (
     {
         AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
 
-        AcpiOsPrintf ("\nAttached Object (%p):\n",
-            ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
-
         ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
+        if (!ObjDesc)
+        {
+            return_VOID;
+        }
+
+        AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
+        if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
+        {
+            AcpiOsPrintf (" - Namespace Node");
+        }
+
+        AcpiOsPrintf (":\n");
         goto DumpObject;
     }
 
@@ -1365,6 +1385,11 @@  AcpiExDumpObjectDescriptor (
 
 DumpObject:
 
+    if (!ObjDesc)
+    {
+        return_VOID;
+    }
+
     /* Common Fields */
 
     AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
diff --git a/src/acpica/source/components/executer/exmisc.c b/src/acpica/source/components/executer/exmisc.c
index b1fc02d2..dfa4421a 100644
--- a/src/acpica/source/components/executer/exmisc.c
+++ b/src/acpica/source/components/executer/exmisc.c
@@ -401,6 +401,8 @@  AcpiExDoLogicalNumericOp (
 
     default:
 
+        ACPI_ERROR ((AE_INFO,
+            "Invalid numeric logical opcode: %X", Opcode));
         Status = AE_AML_INTERNAL;
         break;
     }
@@ -486,6 +488,9 @@  AcpiExDoLogicalOp (
 
     default:
 
+        ACPI_ERROR ((AE_INFO,
+            "Invalid object type for logical operator: %X",
+            Operand0->Common.Type));
         Status = AE_AML_INTERNAL;
         break;
     }
@@ -535,6 +540,8 @@  AcpiExDoLogicalOp (
 
         default:
 
+            ACPI_ERROR ((AE_INFO,
+                "Invalid comparison opcode: %X", Opcode));
             Status = AE_AML_INTERNAL;
             break;
         }
@@ -613,6 +620,8 @@  AcpiExDoLogicalOp (
 
         default:
 
+            ACPI_ERROR ((AE_INFO,
+                "Invalid comparison opcode: %X", Opcode));
             Status = AE_AML_INTERNAL;
             break;
         }
diff --git a/src/acpica/source/components/executer/exoparg2.c b/src/acpica/source/components/executer/exoparg2.c
index 3ce965a6..f4bf9c17 100644
--- a/src/acpica/source/components/executer/exoparg2.c
+++ b/src/acpica/source/components/executer/exoparg2.c
@@ -556,6 +556,8 @@  AcpiExOpcode_2A_1T_1R (
 
         default:
 
+            ACPI_ERROR ((AE_INFO,
+                "Invalid object type: %X", (Operand[0])->Common.Type));
             Status = AE_AML_INTERNAL;
             goto Cleanup;
         }
diff --git a/src/acpica/source/components/hardware/hwregs.c b/src/acpica/source/components/hardware/hwregs.c
index e90fd148..b5b23831 100644
--- a/src/acpica/source/components/hardware/hwregs.c
+++ b/src/acpica/source/components/hardware/hwregs.c
@@ -228,7 +228,7 @@  AcpiHwGetAccessBitWidth (
     }
     else if (Reg->AccessWidth)
     {
-        AccessBitWidth = (1 << (Reg->AccessWidth + 2));
+        AccessBitWidth = ACPI_ACCESS_BIT_WIDTH (Reg->AccessWidth);
     }
     else
     {
diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
index 89d766b4..0ae1fbdd 100644
--- a/src/acpica/source/components/namespace/nsaccess.c
+++ b/src/acpica/source/components/namespace/nsaccess.c
@@ -410,6 +410,7 @@  AcpiNsLookup (
 {
     ACPI_STATUS             Status;
     char                    *Path = Pathname;
+    char                    *ExternalPath;
     ACPI_NAMESPACE_NODE     *PrefixNode;
     ACPI_NAMESPACE_NODE     *CurrentNode = NULL;
     ACPI_NAMESPACE_NODE     *ThisNode = NULL;
@@ -556,11 +557,21 @@  AcpiNsLookup (
                 ThisNode = ThisNode->Parent;
                 if (!ThisNode)
                 {
-                    /* Current scope has no parent scope */
+                    /*
+                     * Current scope has no parent scope. Externalize
+                     * the internal path for error message.
+                     */
+                    Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Pathname,
+                        NULL, &ExternalPath);
+                    if (ACPI_SUCCESS (Status))
+                    {
+                        ACPI_ERROR ((AE_INFO,
+                            "%s: Path has too many parent prefixes (^)",
+                            ExternalPath));
+
+                        ACPI_FREE (ExternalPath);
+                    }
 
-                    ACPI_ERROR ((AE_INFO,
-                        "%s: Path has too many parent prefixes (^) "
-                        "- reached beyond root node", Pathname));
                     return_ACPI_STATUS (AE_NOT_FOUND);
                 }
             }
diff --git a/src/acpica/source/components/namespace/nsarguments.c b/src/acpica/source/components/namespace/nsarguments.c
index 0412672a..0a7fa3d9 100644
--- a/src/acpica/source/components/namespace/nsarguments.c
+++ b/src/acpica/source/components/namespace/nsarguments.c
@@ -183,9 +183,14 @@  AcpiNsCheckArgumentTypes (
     UINT32                      i;
 
 
-    /* If not a predefined name, cannot typecheck args */
-
-    if (!Info->Predefined)
+    /*
+     * If not a predefined name, cannot typecheck args, because
+     * we have no idea what argument types are expected.
+     * Also, ignore typecheck if warnings/errors if this method
+     * has already been evaluated at least once -- in order
+     * to suppress repetitive messages.
+     */
+    if (!Info->Predefined || (Info->Node->Flags & ANOBJ_EVALUATED))
     {
         return;
     }
@@ -207,6 +212,10 @@  AcpiNsCheckArgumentTypes (
                 "Found [%s], ACPI requires [%s]", (i + 1),
                 AcpiUtGetTypeName (UserArgType),
                 AcpiUtGetTypeName (ArgType)));
+
+            /* Prevent any additional typechecking for this method */
+
+            Info->Node->Flags |= ANOBJ_EVALUATED;
         }
     }
 }
@@ -238,7 +247,7 @@  AcpiNsCheckAcpiCompliance (
     UINT32                      RequiredParamCount;
 
 
-    if (!Predefined)
+    if (!Predefined || (Node->Flags & ANOBJ_EVALUATED))
     {
         return;
     }
@@ -332,6 +341,11 @@  AcpiNsCheckArgumentCount (
     UINT32                      RequiredParamCount;
 
 
+    if (Node->Flags & ANOBJ_EVALUATED)
+    {
+        return;
+    }
+
     if (!Predefined)
     {
         /*
diff --git a/src/acpica/source/components/namespace/nsinit.c b/src/acpica/source/components/namespace/nsinit.c
index d4286bf8..2786e24c 100644
--- a/src/acpica/source/components/namespace/nsinit.c
+++ b/src/acpica/source/components/namespace/nsinit.c
@@ -535,6 +535,20 @@  AcpiNsInitOneObject (
 
         Info->PackageInit++;
         Status = AcpiDsGetPackageArguments (ObjDesc);
+        if (ACPI_FAILURE (Status))
+        {
+            break;
+        }
+
+        /*
+         * Resolve all named references in package objects (and all
+         * sub-packages). This action has been deferred until the entire
+         * namespace has been loaded, in order to support external and
+         * forward references from individual package elements (05/2017).
+         */
+        Status = AcpiUtWalkPackageTree (ObjDesc, NULL,
+            AcpiDsInitPackageElement, NULL);
+        ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
         break;
 
     default:
diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
index f68fbc1e..fb74c44c 100644
--- a/src/acpica/source/components/namespace/nsnames.c
+++ b/src/acpica/source/components/namespace/nsnames.c
@@ -208,8 +208,15 @@  AcpiNsGetPathnameLength (
     ACPI_SIZE               Size;
 
 
-    ACPI_FUNCTION_ENTRY ();
+    /* Validate the Node */
 
+    if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+    {
+        ACPI_ERROR ((AE_INFO,
+            "Invalid/cached reference target node: %p, descriptor type %d",
+            Node, ACPI_GET_DESCRIPTOR_TYPE (Node)));
+        return (0);
+    }
 
     Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE);
     return (Size);
diff --git a/src/acpica/source/components/namespace/nsprepkg.c b/src/acpica/source/components/namespace/nsprepkg.c
index 84856817..6ad53d61 100644
--- a/src/acpica/source/components/namespace/nsprepkg.c
+++ b/src/acpica/source/components/namespace/nsprepkg.c
@@ -722,6 +722,8 @@  AcpiNsCheckPackageList (
 
         default: /* Should not get here, type was validated by caller */
 
+            ACPI_ERROR ((AE_INFO, "Invalid Package type: %X",
+                Package->RetInfo.Type));
             return (AE_AML_INTERNAL);
         }
 
diff --git a/src/acpica/source/components/parser/psloop.c b/src/acpica/source/components/parser/psloop.c
index 649f0276..fe7fe6d0 100644
--- a/src/acpica/source/components/parser/psloop.c
+++ b/src/acpica/source/components/parser/psloop.c
@@ -282,6 +282,9 @@  AcpiPsGetArguments (
             INCREMENT_ARG_LIST (WalkState->ArgTypes);
         }
 
+        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+            "Final argument count: %u pass %u\n",
+            WalkState->ArgCount, WalkState->PassNumber));
 
         /*
          * Handle executable code at "module-level". This refers to
@@ -380,6 +383,10 @@  AcpiPsGetArguments (
                 (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
                 (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
             {
+                ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+                    "Setup Package/Buffer: Pass %u, AML Ptr: %p\n",
+                    WalkState->PassNumber, AmlOpStart));
+
                 /*
                  * Skip parsing of Buffers and Packages because we don't have
                  * enough info in the first pass to parse them correctly.
@@ -689,6 +696,9 @@  AcpiPsParseLoop (
 
         /* Check for arguments that need to be processed */
 
+        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+            "Parseloop: argument count: %u\n", WalkState->ArgCount));
+
         if (WalkState->ArgCount)
         {
             /*
diff --git a/src/acpica/source/components/resources/rsxface.c b/src/acpica/source/components/resources/rsxface.c
index 5e3f7352..2c27eaf5 100644
--- a/src/acpica/source/components/resources/rsxface.c
+++ b/src/acpica/source/components/resources/rsxface.c
@@ -796,7 +796,7 @@  ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer)
  *                                device we are querying
  *              Name            - Method name of the resources we want.
  *                                (METHOD_NAME__CRS, METHOD_NAME__PRS, or
- *                                METHOD_NAME__AEI)
+ *                                METHOD_NAME__AEI or METHOD_NAME__DMA)
  *              UserFunction    - Called for each resource
  *              Context         - Passed to UserFunction
  *
@@ -827,12 +827,13 @@  AcpiWalkResources (
     if (!DeviceHandle || !UserFunction || !Name ||
         (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
          !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) &&
-         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI)))
+         !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI) &&
+         !ACPI_COMPARE_NAME (Name, METHOD_NAME__DMA)))
     {
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
 
-    /* Get the _CRS/_PRS/_AEI resource list */
+    /* Get the _CRS/_PRS/_AEI/_DMA resource list */
 
     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
     Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c
index 47096186..18e58f9d 100644
--- a/src/acpica/source/components/tables/tbdata.c
+++ b/src/acpica/source/components/tables/tbdata.c
@@ -648,6 +648,8 @@  AcpiTbCheckDuplication (
  *
  * DESCRIPTION: This function is called to validate and verify the table, the
  *              returned table descriptor is in "VALIDATED" state.
+ *              Note that 'TableIndex' is required to be set to !NULL to
+ *              enable duplication check.
  *
  *****************************************************************************/
 
diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
index 5fd178f5..d8cb6b18 100644
--- a/src/acpica/source/components/tables/tbxface.c
+++ b/src/acpica/source/components/tables/tbxface.c
@@ -293,7 +293,7 @@  AcpiReallocateRootTable (
 {
     ACPI_STATUS             Status;
     ACPI_TABLE_DESC         *TableDesc;
-    UINT32                  i;
+    UINT32                  i, j;
 
 
     ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
@@ -339,7 +339,7 @@  AcpiReallocateRootTable (
             TableDesc = &AcpiGbl_RootTableList.Tables[i];
             if (!(TableDesc->Flags & ACPI_TABLE_IS_VERIFIED))
             {
-                Status = AcpiTbVerifyTempTable (TableDesc, NULL, NULL);
+                Status = AcpiTbVerifyTempTable (TableDesc, NULL, &j);
                 if (ACPI_FAILURE (Status))
                 {
                     AcpiTbUninstallTable (TableDesc);
diff --git a/src/acpica/source/components/utilities/uthex.c b/src/acpica/source/components/utilities/uthex.c
index 7f507697..8c7bcccc 100644
--- a/src/acpica/source/components/utilities/uthex.c
+++ b/src/acpica/source/components/utilities/uthex.c
@@ -183,8 +183,10 @@  AcpiUtHexToAsciiChar (
     UINT64                  Integer,
     UINT32                  Position)
 {
+    UINT64                  Index;
 
-    return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
+    AcpiUtShortShiftRight (Integer, Position, &Index);
+    return (AcpiGbl_HexToAscii[Index & 0xF]);
 }
 
 
diff --git a/src/acpica/source/components/utilities/utmath.c b/src/acpica/source/components/utilities/utmath.c
index 1da5f9ad..4aa94025 100644
--- a/src/acpica/source/components/utilities/utmath.c
+++ b/src/acpica/source/components/utilities/utmath.c
@@ -156,16 +156,6 @@ 
 #define _COMPONENT          ACPI_UTILITIES
         ACPI_MODULE_NAME    ("utmath")
 
-/*
- * Optional support for 64-bit double-precision integer divide. This code
- * is configurable and is implemented in order to support 32-bit kernel
- * environments where a 64-bit double-precision math library is not available.
- *
- * Support for a more normal 64-bit divide/modulo (with check for a divide-
- * by-zero) appears after this optional section of code.
- */
-#ifndef ACPI_USE_NATIVE_DIVIDE
-
 /* Structures used only for 64-bit divide */
 
 typedef struct uint64_struct
@@ -182,6 +172,257 @@  typedef union uint64_overlay
 
 } UINT64_OVERLAY;
 
+/*
+ * Optional support for 64-bit double-precision integer multiply and shift.
+ * This code is configurable and is implemented in order to support 32-bit
+ * kernel environments where a 64-bit double-precision math library is not
+ * available.
+ */
+#ifndef ACPI_USE_NATIVE_MATH64
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortMultiply
+ *
+ * PARAMETERS:  Multiplicand        - 64-bit multiplicand
+ *              Multiplier          - 32-bit multiplier
+ *              OutProduct          - Pointer to where the product is returned
+ *
+ * DESCRIPTION: Perform a short multiply.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortMultiply (
+    UINT64                  Multiplicand,
+    UINT32                  Multiplier,
+    UINT64                  *OutProduct)
+{
+    UINT64_OVERLAY          MultiplicandOvl;
+    UINT64_OVERLAY          Product;
+    UINT32                  Carry32;
+
+
+    ACPI_FUNCTION_TRACE (UtShortMultiply);
+
+
+    MultiplicandOvl.Full = Multiplicand;
+
+    /*
+     * The Product is 64 bits, the carry is always 32 bits,
+     * and is generated by the second multiply.
+     */
+    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Hi, Multiplier,
+        Product.Part.Hi, Carry32);
+
+    ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Lo, Multiplier,
+        Product.Part.Lo, Carry32);
+
+    Product.Part.Hi += Carry32;
+
+    /* Return only what was requested */
+
+    if (OutProduct)
+    {
+        *OutProduct = Product.Full;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftLeft
+ *
+ * PARAMETERS:  Operand             - 64-bit shift operand
+ *              Count               - 32-bit shift count
+ *              OutResult           - Pointer to where the result is returned
+ *
+ * DESCRIPTION: Perform a short left shift.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+    UINT64_OVERLAY          OperandOvl;
+
+
+    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
+
+
+    OperandOvl.Full = Operand;
+
+    if ((Count & 63) >= 32)
+    {
+        OperandOvl.Part.Hi = OperandOvl.Part.Lo;
+        OperandOvl.Part.Lo ^= OperandOvl.Part.Lo;
+        Count = (Count & 63) - 32;
+    }
+    ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
+        OperandOvl.Part.Lo, Count);
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = OperandOvl.Full;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftRight
+ *
+ * PARAMETERS:  Operand             - 64-bit shift operand
+ *              Count               - 32-bit shift count
+ *              OutResult           - Pointer to where the result is returned
+ *
+ * DESCRIPTION: Perform a short right shift.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+    UINT64_OVERLAY          OperandOvl;
+
+
+    ACPI_FUNCTION_TRACE (UtShortShiftRight);
+
+
+    OperandOvl.Full = Operand;
+
+    if ((Count & 63) >= 32)
+    {
+        OperandOvl.Part.Lo = OperandOvl.Part.Hi;
+        OperandOvl.Part.Hi ^= OperandOvl.Part.Hi;
+        Count = (Count & 63) - 32;
+    }
+    ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
+        OperandOvl.Part.Lo, Count);
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = OperandOvl.Full;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+#else
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortMultiply
+ *
+ * PARAMETERS:  See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortMultiply function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortMultiply (
+    UINT64                  Multiplicand,
+    UINT32                  Multiplier,
+    UINT64                  *OutProduct)
+{
+
+    ACPI_FUNCTION_TRACE (UtShortMultiply);
+
+
+    /* Return only what was requested */
+
+    if (OutProduct)
+    {
+        *OutProduct = Multiplicand * Multiplier;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftLeft
+ *
+ * PARAMETERS:  See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortShiftLeft function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+
+    ACPI_FUNCTION_TRACE (UtShortShiftLeft);
+
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = Operand << Count;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtShortShiftRight
+ *
+ * PARAMETERS:  See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortShiftRight function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult)
+{
+
+    ACPI_FUNCTION_TRACE (UtShortShiftRight);
+
+
+    /* Return only what was requested */
+
+    if (OutResult)
+    {
+        *OutResult = Operand >> Count;
+    }
+
+    return_ACPI_STATUS (AE_OK);
+}
+#endif
+
+/*
+ * Optional support for 64-bit double-precision integer divide. This code
+ * is configurable and is implemented in order to support 32-bit kernel
+ * environments where a 64-bit double-precision math library is not available.
+ *
+ * Support for a more normal 64-bit divide/modulo (with check for a divide-
+ * by-zero) appears after this optional section of code.
+ */
+#ifndef ACPI_USE_NATIVE_DIVIDE
+
 
 /*******************************************************************************
  *
diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
index 33e51f5c..7280bca7 100644
--- a/src/acpica/source/components/utilities/utmisc.c
+++ b/src/acpica/source/components/utilities/utmisc.c
@@ -363,7 +363,7 @@  AcpiUtCreateUpdateStateAndPush (
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Walk through a package
+ * DESCRIPTION: Walk through a package, including subpackages
  *
  ******************************************************************************/
 
@@ -377,8 +377,8 @@  AcpiUtWalkPackageTree (
     ACPI_STATUS             Status = AE_OK;
     ACPI_GENERIC_STATE      *StateList = NULL;
     ACPI_GENERIC_STATE      *State;
-    UINT32                  ThisIndex;
     ACPI_OPERAND_OBJECT     *ThisSourceObj;
+    UINT32                  ThisIndex;
 
 
     ACPI_FUNCTION_TRACE (UtWalkPackageTree);
@@ -395,8 +395,10 @@  AcpiUtWalkPackageTree (
         /* Get one element of the package */
 
         ThisIndex = State->Pkg.Index;
-        ThisSourceObj = (ACPI_OPERAND_OBJECT *)
+        ThisSourceObj =
             State->Pkg.SourceObject->Package.Elements[ThisIndex];
+        State->Pkg.ThisTargetObj =
+            &State->Pkg.SourceObject->Package.Elements[ThisIndex];
 
         /*
          * Check for:
@@ -412,7 +414,7 @@  AcpiUtWalkPackageTree (
             (ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
         {
             Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
-                                    State, Context);
+                State, Context);
             if (ACPI_FAILURE (Status))
             {
                 return_ACPI_STATUS (Status);
@@ -485,6 +487,9 @@  AcpiUtWalkPackageTree (
 
     /* We should never get here */
 
+    ACPI_ERROR ((AE_INFO,
+        "State list did not terminate correctly"));
+
     return_ACPI_STATUS (AE_AML_INTERNAL);
 }
 
diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
index a94c882e..65aae85f 100644
--- a/src/acpica/source/components/utilities/utobject.c
+++ b/src/acpica/source/components/utilities/utobject.c
@@ -651,6 +651,10 @@  AcpiUtGetSimpleObjectSize (
     {
         /* A namespace node should never get here */
 
+        ACPI_ERROR ((AE_INFO,
+            "Received a namespace node [%4.4s] "
+            "where an operand object is required",
+            ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, InternalObject)->Name.Ascii));
         return_ACPI_STATUS (AE_AML_INTERNAL);
     }
 
diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
index e34662c8..da4fdc43 100644
--- a/src/acpica/source/components/utilities/utresrc.c
+++ b/src/acpica/source/components/utilities/utresrc.c
@@ -360,14 +360,11 @@  AcpiUtWalkAmlResources (
             }
 
             /*
-             * The EndTag opcode must be followed by a zero byte.
-             * Although this byte is technically defined to be a checksum,
-             * in practice, all ASL compilers set this byte to zero.
+             * Don't attempt to perform any validation on the 2nd byte.
+             * Although all known ASL compilers insert a zero for the 2nd
+             * byte, it can also be a checksum (as per the ACPI spec),
+             * and this is occasionally seen in the field. July 2017.
              */
-            if (*(Aml + 1) != 0)
-            {
-                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
-            }
 
             /* Return the pointer to the EndTag if requested */
 
diff --git a/src/acpica/source/components/utilities/utstate.c b/src/acpica/source/components/utilities/utstate.c
index 2d75c894..8effe5ba 100644
--- a/src/acpica/source/components/utilities/utstate.c
+++ b/src/acpica/source/components/utilities/utstate.c
@@ -363,7 +363,7 @@  ACPI_GENERIC_STATE *
 AcpiUtCreatePkgState (
     void                    *InternalObject,
     void                    *ExternalObject,
-    UINT16                  Index)
+    UINT32                  Index)
 {
     ACPI_GENERIC_STATE      *State;
 
diff --git a/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
index a3c52b9e..d91e9084 100644
--- a/src/acpica/source/components/utilities/utstrtoul64.c
+++ b/src/acpica/source/components/utilities/utstrtoul64.c
@@ -419,8 +419,8 @@  AcpiUtStrtoulBase10 (
 
         /* Convert and insert (add) the decimal digit */
 
-        NextValue =
-            (ReturnValue * 10) + (AsciiDigit - ACPI_ASCII_ZERO);
+        AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
+        NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
 
         /* Check for overflow (32 or 64 bit) - return current converted value */
 
@@ -486,8 +486,8 @@  AcpiUtStrtoulBase16 (
 
         /* Convert and insert the hex digit */
 
-        ReturnValue =
-            (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit);
+        AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
+        ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
 
         String++;
         ValidDigits++;
diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
index 3ac6a381..a88a4a3d 100644
--- a/src/acpica/source/components/utilities/uttrack.c
+++ b/src/acpica/source/components/utilities/uttrack.c
@@ -776,6 +776,11 @@  AcpiUtDumpAllocations (
         return_VOID;
     }
 
+    if (!AcpiGbl_GlobalList)
+    {
+        goto Exit;
+    }
+
     Element = AcpiGbl_GlobalList->ListHead;
     while (Element)
     {
@@ -787,7 +792,7 @@  AcpiUtDumpAllocations (
 
             if (Element->Size < sizeof (ACPI_COMMON_DESCRIPTOR))
             {
-                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u "
+                AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u "
                     "[Not a Descriptor - too small]\n",
                     Descriptor, Element->Size, Element->Module,
                     Element->Line);
@@ -799,7 +804,7 @@  AcpiUtDumpAllocations (
                 if (ACPI_GET_DESCRIPTOR_TYPE (Descriptor) !=
                     ACPI_DESC_TYPE_CACHED)
                 {
-                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u [%s] ",
+                    AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u [%s] ",
                         Descriptor, Element->Size, Element->Module,
                         Element->Line, AcpiUtGetDescriptorName (Descriptor));
 
@@ -875,6 +880,7 @@  AcpiUtDumpAllocations (
         Element = Element->Next;
     }
 
+Exit:
     (void) AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
 
     /* Print summary */
diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
index 5beec2d4..26d4f47b 100644
--- a/src/acpica/source/include/acdisasm.h
+++ b/src/acpica/source/include/acdisasm.h
@@ -271,6 +271,7 @@  typedef enum
     ACPI_DMT_PCCT,
     ACPI_DMT_PMTT,
     ACPI_DMT_PPTT,
+    ACPI_DMT_SDEI,
     ACPI_DMT_SLIC,
     ACPI_DMT_SRAT,
 
@@ -527,6 +528,7 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3ptHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSbst[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdei[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlic[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlit[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSpcr[];
diff --git a/src/acpica/source/include/acdispat.h b/src/acpica/source/include/acdispat.h
index 1c294c3a..bae3d794 100644
--- a/src/acpica/source/include/acdispat.h
+++ b/src/acpica/source/include/acdispat.h
@@ -409,6 +409,12 @@  AcpiDsInitializeObjects (
  * dsobject - Parser/Interpreter interface - object initialization and conversion
  */
 ACPI_STATUS
+AcpiDsBuildInternalObject (
+    ACPI_WALK_STATE         *WalkState,
+    ACPI_PARSE_OBJECT       *Op,
+    ACPI_OPERAND_OBJECT     **ObjDescPtr);
+
+ACPI_STATUS
 AcpiDsBuildInternalBufferObj (
     ACPI_WALK_STATE         *WalkState,
     ACPI_PARSE_OBJECT       *Op,
@@ -437,6 +443,17 @@  AcpiDsCreateNode (
 
 
 /*
+ * dspkginit - Package object initialization
+ */
+ACPI_STATUS
+AcpiDsInitPackageElement (
+    UINT8                   ObjectType,
+    ACPI_OPERAND_OBJECT     *SourceObject,
+    ACPI_GENERIC_STATE      *State,
+    void                    *Context);
+
+
+/*
  * dsutils - Parser/Interpreter interface utility routines
  */
 void
diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
index 399e4c06..00be20ed 100644
--- a/src/acpica/source/include/aclocal.h
+++ b/src/acpica/source/include/aclocal.h
@@ -813,7 +813,7 @@  typedef struct acpi_update_state
 typedef struct acpi_pkg_state
 {
     ACPI_STATE_COMMON
-    UINT16                          Index;
+    UINT32                          Index;
     union acpi_operand_object       *SourceObject;
     union acpi_operand_object       *DestObject;
     struct acpi_walk_state          *WalkState;
diff --git a/src/acpica/source/include/acnames.h b/src/acpica/source/include/acnames.h
index 27b0b970..69f88844 100644
--- a/src/acpica/source/include/acnames.h
+++ b/src/acpica/source/include/acnames.h
@@ -162,6 +162,7 @@ 
 #define METHOD_NAME__CLS        "_CLS"
 #define METHOD_NAME__CRS        "_CRS"
 #define METHOD_NAME__DDN        "_DDN"
+#define METHOD_NAME__DMA        "_DMA"
 #define METHOD_NAME__HID        "_HID"
 #define METHOD_NAME__INI        "_INI"
 #define METHOD_NAME__PLD        "_PLD"
diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
index f0376097..7dce4cee 100644
--- a/src/acpica/source/include/acobject.h
+++ b/src/acpica/source/include/acobject.h
@@ -546,11 +546,12 @@  typedef struct acpi_object_reference
     ACPI_OBJECT_COMMON_HEADER
     UINT8                           Class;              /* Reference Class */
     UINT8                           TargetType;         /* Used for Index Op */
-    UINT8                           Reserved;
+    UINT8                           Resolved;           /* Reference has been resolved to a value */
     void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
     ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
     union acpi_operand_object       **Where;            /* Target of Index */
     UINT8                           *IndexPointer;      /* Used for Buffers and Strings */
+    UINT8                           *Aml;               /* Used for deferred resolution of the ref */
     UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
 
 } ACPI_OBJECT_REFERENCE;
@@ -571,7 +572,6 @@  typedef enum
 
 } ACPI_REFERENCE_CLASSES;
 
-
 /*
  * Extra object is used as additional storage for types that
  * have AML code in their declarations (TermArgs) that must be
diff --git a/src/acpica/source/include/acpi.h b/src/acpica/source/include/acpi.h
index 46d75eb7..8c4152b8 100644
--- a/src/acpica/source/include/acpi.h
+++ b/src/acpica/source/include/acpi.h
@@ -162,14 +162,14 @@ 
  * Note: The order of these include files is important.
  */
 #include "platform/acenv.h"     /* Environment-specific items */
-#include "acnames.h"            /* Common ACPI names and strings */
 #include "actypes.h"            /* ACPICA data types and structures */
+#include "platform/acenvex.h"   /* Extra environment-specific items */
+#include "acnames.h"            /* Common ACPI names and strings */
 #include "acexcep.h"            /* ACPICA exceptions */
 #include "actbl.h"              /* ACPI table definitions */
 #include "acoutput.h"           /* Error output and Debug macros */
 #include "acrestyp.h"           /* Resource Descriptor structs */
 #include "acpiosxf.h"           /* OSL interfaces (ACPICA-to-OS) */
 #include "acpixf.h"             /* ACPI core subsystem external interfaces */
-#include "platform/acenvex.h"   /* Extra environment-specific items */
 
 #endif /* __ACPI_H__ */
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 7aad8386..7a24391d 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -154,7 +154,7 @@ 
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20170629
+#define ACPI_CA_VERSION                 0x20170728
 
 #include "acconfig.h"
 #include "actypes.h"
diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
index 1e91ffc5..18cfdd46 100644
--- a/src/acpica/source/include/actbl2.h
+++ b/src/acpica/source/include/actbl2.h
@@ -186,6 +186,7 @@ 
 #define ACPI_SIG_MCHI           "MCHI"      /* Management Controller Host Interface table */
 #define ACPI_SIG_MSDM           "MSDM"      /* Microsoft Data Management Table */
 #define ACPI_SIG_MTMR           "MTMR"      /* MID Timer table */
+#define ACPI_SIG_SDEI           "SDEI"      /* Software Delegated Exception Interface Table */
 #define ACPI_SIG_SLIC           "SLIC"      /* Software Licensing Description Table */
 #define ACPI_SIG_SPCR           "SPCR"      /* Serial Port Console Redirection table */
 #define ACPI_SIG_SPMI           "SPMI"      /* Server Platform Management Interface table */
@@ -1422,6 +1423,21 @@  typedef struct acpi_mtmr_entry
 
 } ACPI_MTMR_ENTRY;
 
+/*******************************************************************************
+ *
+ * SDEI - Software Delegated Exception Interface Descriptor Table
+ *
+ * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
+ * May 8th, 2017. Copyright 2017 ARM Ltd.
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_sdei
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+
+} ACPI_TABLE_SDEI;
+
 
 /*******************************************************************************
  *
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index 843adec7..1839f936 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -276,6 +276,7 @@  typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
 #define ACPI_MAX_PTR                    ACPI_UINT64_MAX
 #define ACPI_SIZE_MAX                   ACPI_UINT64_MAX
 #define ACPI_USE_NATIVE_DIVIDE          /* Has native 64-bit integer support */
+#define ACPI_USE_NATIVE_MATH64          /* Has native 64-bit integer support */
 
 /*
  * In the case of the Itanium Processor Family (IPF), the hardware does not
@@ -675,6 +676,13 @@  typedef UINT64                          ACPI_INTEGER;
 #define ACPI_VALIDATE_RSDP_SIG(a)       (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
 #define ACPI_MAKE_RSDP_SIG(dest)        (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
 
+/*
+ * Algorithm to obtain access bit width.
+ * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
+ * ACPI_RESOURCE_GENERIC_REGISTER.
+ */
+#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
+
 
 /*******************************************************************************
  *
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index 46588a40..bca4a94c 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -845,7 +845,7 @@  ACPI_GENERIC_STATE *
 AcpiUtCreatePkgState (
     void                    *InternalObject,
     void                    *ExternalObject,
-    UINT16                  Index);
+    UINT32                  Index);
 
 ACPI_STATUS
 AcpiUtCreateUpdateStateAndPush (
@@ -879,6 +879,24 @@  AcpiUtShortDivide (
     UINT64                  *OutQuotient,
     UINT32                  *OutRemainder);
 
+ACPI_STATUS
+AcpiUtShortMultiply (
+    UINT64                  InMultiplicand,
+    UINT32                  Multiplier,
+    UINT64                  *Outproduct);
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult);
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+    UINT64                  Operand,
+    UINT32                  Count,
+    UINT64                  *OutResult);
+
 
 /*
  * utmisc
diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
index da719a7d..74c7108b 100644
--- a/src/acpica/source/include/platform/acgcc.h
+++ b/src/acpica/source/include/platform/acgcc.h
@@ -192,4 +192,8 @@  typedef __builtin_va_list       va_list;
 
 #define COMPILER_VA_MACRO               1
 
+/* GCC supports native multiply/shift on 32-bit platforms */
+
+#define ACPI_USE_NATIVE_MATH64
+
 #endif /* __ACGCC_H__ */
diff --git a/src/acpica/source/include/platform/aclinux.h b/src/acpica/source/include/platform/aclinux.h
index b287e4d9..75b1d827 100644
--- a/src/acpica/source/include/platform/aclinux.h
+++ b/src/acpica/source/include/platform/aclinux.h
@@ -237,6 +237,7 @@ 
 /* Host-dependent types and defines for in-kernel ACPICA */
 
 #define ACPI_MACHINE_WIDTH          BITS_PER_LONG
+#define ACPI_USE_NATIVE_MATH64
 #define ACPI_EXPORT_SYMBOL(symbol)  EXPORT_SYMBOL(symbol);
 #define strtoul                     simple_strtoul
 
@@ -325,6 +326,7 @@ 
 #define COMPILER_DEPENDENT_INT64    long long
 #define COMPILER_DEPENDENT_UINT64   unsigned long long
 #define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
 #endif
 
 #ifndef __cdecl