ACK: [PATCH] ACPICA: Update to version 20170728

Alex Hung alex.hung at canonical.com
Wed Aug 9 17:24:34 UTC 2017


On 2017-08-06 03:23 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/pipermail/devel/2017-July/001402.html
> 
> Signed-off-by: Colin Ian King <colin.king at 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 at canonical.com>



More information about the fwts-devel mailing list