diff mbox series

[1/2] ACPICA: Update to version 20200214

Message ID 20200224001351.603695-2-colin.king@canonical.com
State Accepted
Headers show
Series [1/2] ACPICA: Update to version 20200214 | expand

Commit Message

Colin Ian King Feb. 24, 2020, 12:13 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

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

https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/Z5YA7FWAFECPLPNLRNKI6P4THAR5YSCU

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/source/common/adisasm.c            |  19 +-
 src/acpica/source/common/dmtables.c           |   1 -
 src/acpica/source/compiler/aslanalyze.c       |  14 +-
 src/acpica/source/compiler/aslcompile.c       |  16 +-
 src/acpica/source/compiler/aslcompiler.h      |  17 +-
 src/acpica/source/compiler/aslexternal.c      |  44 +++-
 src/acpica/source/compiler/aslload.c          | 226 ++++++++++++++----
 src/acpica/source/compiler/aslmessages.c      |  13 +-
 src/acpica/source/compiler/aslmessages.h      |  10 +
 src/acpica/source/compiler/aslmethod.c        | 205 +++++++++++++---
 src/acpica/source/compiler/aslparseop.c       |  13 +-
 src/acpica/source/compiler/aslprimaries.y     |   2 +-
 src/acpica/source/compiler/aslrules.y         |  23 +-
 src/acpica/source/compiler/asltransform.c     |  84 ++++++-
 src/acpica/source/compiler/aslutils.c         |  41 +++-
 src/acpica/source/compiler/aslxref.c          |  57 +----
 src/acpica/source/compiler/cvparser.c         |  16 +-
 src/acpica/source/components/events/evevent.c |   2 +-
 src/acpica/source/components/events/evxfgpe.c |  38 +++
 src/acpica/source/components/hardware/hwgpe.c |  79 ++++++
 .../source/components/hardware/hwsleep.c      |  10 +
 .../source/components/namespace/nsnames.c     |   6 +-
 .../source/components/namespace/nsxfname.c    |   2 +-
 src/acpica/source/components/tables/tbxface.c |  12 +-
 .../source/components/utilities/utobject.c    |   2 +-
 src/acpica/source/include/acconvert.h         |   3 +-
 src/acpica/source/include/achware.h           |   4 +
 src/acpica/source/include/acmacros.h          |   4 +-
 src/acpica/source/include/acpixf.h            |   6 +-
 src/acpica/source/include/actbl1.h            |   2 +-
 src/acpica/source/include/actypes.h           |   7 +-
 31 files changed, 775 insertions(+), 203 deletions(-)

Comments

Ivan Hu Feb. 24, 2020, 4:17 a.m. UTC | #1
On 2/24/20 8:13 AM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/Z5YA7FWAFECPLPNLRNKI6P4THAR5YSCU
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/acpica/source/common/adisasm.c            |  19 +-
>  src/acpica/source/common/dmtables.c           |   1 -
>  src/acpica/source/compiler/aslanalyze.c       |  14 +-
>  src/acpica/source/compiler/aslcompile.c       |  16 +-
>  src/acpica/source/compiler/aslcompiler.h      |  17 +-
>  src/acpica/source/compiler/aslexternal.c      |  44 +++-
>  src/acpica/source/compiler/aslload.c          | 226 ++++++++++++++----
>  src/acpica/source/compiler/aslmessages.c      |  13 +-
>  src/acpica/source/compiler/aslmessages.h      |  10 +
>  src/acpica/source/compiler/aslmethod.c        | 205 +++++++++++++---
>  src/acpica/source/compiler/aslparseop.c       |  13 +-
>  src/acpica/source/compiler/aslprimaries.y     |   2 +-
>  src/acpica/source/compiler/aslrules.y         |  23 +-
>  src/acpica/source/compiler/asltransform.c     |  84 ++++++-
>  src/acpica/source/compiler/aslutils.c         |  41 +++-
>  src/acpica/source/compiler/aslxref.c          |  57 +----
>  src/acpica/source/compiler/cvparser.c         |  16 +-
>  src/acpica/source/components/events/evevent.c |   2 +-
>  src/acpica/source/components/events/evxfgpe.c |  38 +++
>  src/acpica/source/components/hardware/hwgpe.c |  79 ++++++
>  .../source/components/hardware/hwsleep.c      |  10 +
>  .../source/components/namespace/nsnames.c     |   6 +-
>  .../source/components/namespace/nsxfname.c    |   2 +-
>  src/acpica/source/components/tables/tbxface.c |  12 +-
>  .../source/components/utilities/utobject.c    |   2 +-
>  src/acpica/source/include/acconvert.h         |   3 +-
>  src/acpica/source/include/achware.h           |   4 +
>  src/acpica/source/include/acmacros.h          |   4 +-
>  src/acpica/source/include/acpixf.h            |   6 +-
>  src/acpica/source/include/actbl1.h            |   2 +-
>  src/acpica/source/include/actypes.h           |   7 +-
>  31 files changed, 775 insertions(+), 203 deletions(-)
> 
> diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
> index 60bd5fda..015765ff 100644
> --- a/src/acpica/source/common/adisasm.c
> +++ b/src/acpica/source/common/adisasm.c
> @@ -156,6 +156,7 @@
>  #include "acnamesp.h"
>  #include "acparser.h"
>  #include "acapps.h"
> +#include "acconvert.h"
>  
>  
>  #define _COMPONENT          ACPI_TOOLS
> @@ -379,8 +380,6 @@ AdAmlDisassemble (
>              Status = AE_ERROR;
>              goto Cleanup;
>          }
> -
> -        AcpiOsRedirectOutput (File);
>      }
>  
>      *OutFilename = DisasmFilename;
> @@ -467,6 +466,11 @@ AdDisassembleOneTable (
>  
>      if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
>      {
> +        if (File)
> +        {
> +            AcpiOsRedirectOutput (File);
> +        }
> +
>          AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE);
>  
>          /* This is a "Data Table" (non-AML table) */
> @@ -489,6 +493,10 @@ AdDisassembleOneTable (
>          return (AE_OK);
>      }
>  
> +    /* Initialize the converter output file */
> +
> +    ASL_CV_INIT_FILETREE(Table, File);
> +
>      /*
>       * This is an AML table (DSDT or SSDT).
>       * Always parse the tables, only option is what to display
> @@ -501,6 +509,13 @@ AdDisassembleOneTable (
>          return (Status);
>      }
>  
> +    /* Redirect output for code generation and debugging output */
> +
> +    if (File)
> +    {
> +        AcpiOsRedirectOutput (File);
> +    }
> +
>      /* Debug output, namespace and parse tree */
>  
>      if (AslCompilerdebug && File)
> diff --git a/src/acpica/source/common/dmtables.c b/src/acpica/source/common/dmtables.c
> index 3bc9c07a..ee18d26c 100644
> --- a/src/acpica/source/common/dmtables.c
> +++ b/src/acpica/source/common/dmtables.c
> @@ -506,7 +506,6 @@ AdParseTable (
>  
>      AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
>      AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
> -    ASL_CV_INIT_FILETREE(Table, AmlStart, AmlLength);
>  
>      AcpiUtSetIntegerWidth (Table->Revision);
>  
> diff --git a/src/acpica/source/compiler/aslanalyze.c b/src/acpica/source/compiler/aslanalyze.c
> index 9139f4e9..63feba2b 100644
> --- a/src/acpica/source/compiler/aslanalyze.c
> +++ b/src/acpica/source/compiler/aslanalyze.c
> @@ -151,6 +151,7 @@
>  
>  #include "aslcompiler.h"
>  #include "aslcompiler.y.h"
> +#include "acnamesp.h"
>  #include <string.h>
>  
>  
> @@ -421,6 +422,7 @@ AnCheckMethodReturnValue (
>  {
>      ACPI_PARSE_OBJECT       *OwningOp;
>      ACPI_NAMESPACE_NODE     *Node;
> +    char                    *ExternalPath;
>  
>  
>      Node = ArgOp->Asl.Node;
> @@ -435,18 +437,19 @@ AnCheckMethodReturnValue (
>      /* Examine the parent op of this method */
>  
>      OwningOp = Node->Op;
> +    ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE);
> +
>      if (OwningOp->Asl.CompileFlags & OP_METHOD_NO_RETVAL)
>      {
>          /* Method NEVER returns a value */
>  
> -        AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, Op->Asl.ExternalName);
> +        AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, ExternalPath);
>      }
>      else if (OwningOp->Asl.CompileFlags & OP_METHOD_SOME_NO_RETVAL)
>      {
>          /* Method SOMETIMES returns a value, SOMETIMES not */
>  
> -        AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL,
> -            Op, Op->Asl.ExternalName);
> +        AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL, Op, ExternalPath);
>      }
>      else if (!(ThisNodeBtype & RequiredBtypes))
>      {
> @@ -470,6 +473,11 @@ AnCheckMethodReturnValue (
>              AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, AslGbl_MsgBuffer);
>          }
>      }
> +
> +    if (ExternalPath)
> +    {
> +        ACPI_FREE (ExternalPath);
> +    }
>  }
>  
>  
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 0f145560..9481b6bb 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -647,7 +647,7 @@ void
>  AslCompilerFileHeader (
>      UINT32                  FileId)
>  {
> -    struct tm               *NewTime;
> +    char                    *NewTime;
>      time_t                  Aclock;
>      char                    *Prefix = "";
>  
> @@ -691,13 +691,17 @@ AslCompilerFileHeader (
>  
>      /* Compilation header with timestamp */
>  
> -    (void) time (&Aclock);
> -    NewTime = localtime (&Aclock);
> +    Aclock = time (NULL);
> +    NewTime = ctime (&Aclock);
>  
>      FlPrintFile (FileId,
> -        "%sCompilation of \"%s\" - %s%s\n",
> -        Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename, asctime (NewTime),
> -        Prefix);
> +        "%sCompilation of \"%s\" -",
> +        Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename);
> +
> +    if (NewTime)
> +    {
> +        FlPrintFile (FileId, " %s%s\n", NewTime, Prefix);
> +    }
>  
>      switch (FileId)
>      {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index e82a91e4..9bebc380 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -373,6 +373,15 @@ MtMethodAnalysisWalkEnd (
>      UINT32                  Level,
>      void                    *Context);
>  
> +UINT32
> +MtProcessTypeOp (
> +    ACPI_PARSE_OBJECT       *TypeOp);
> +
> +UINT8
> +MtProcessParameterTypeList (
> +    ACPI_PARSE_OBJECT       *ParamTypeOp,
> +    UINT32                  *TypeList);
> +
>  
>  /*
>   * aslbtypes - bitfield data types
> @@ -1233,10 +1242,14 @@ UtDumpBasicOp (
>      ACPI_PARSE_OBJECT       *Op,
>      UINT32                  Level);
>  
> -void *
> -UtGetParentMethod (
> +ACPI_NAMESPACE_NODE *
> +UtGetParentMethodNode (
>      ACPI_NAMESPACE_NODE     *Node);
>  
> +ACPI_PARSE_OBJECT *
> +UtGetParentMethodOp (
> +    ACPI_PARSE_OBJECT       *Op);
> +
>  BOOLEAN
>  UtNodeIsDescendantOf (
>      ACPI_NAMESPACE_NODE     *Node1,
> diff --git a/src/acpica/source/compiler/aslexternal.c b/src/acpica/source/compiler/aslexternal.c
> index 37f07e87..315247be 100644
> --- a/src/acpica/source/compiler/aslexternal.c
> +++ b/src/acpica/source/compiler/aslexternal.c
> @@ -192,12 +192,54 @@ ExDoExternal (
>      ACPI_PARSE_OBJECT       *Prev;
>      ACPI_PARSE_OBJECT       *Next;
>      ACPI_PARSE_OBJECT       *ArgCountOp;
> +    ACPI_PARSE_OBJECT       *TypeOp;
> +    ACPI_PARSE_OBJECT       *ExternTypeOp = Op->Asl.Child->Asl.Next;
> +    UINT32                  ExternType;
> +    UINT8                   ParamCount = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
> +    UINT32                  ParamTypes[ACPI_METHOD_NUM_ARGS];
>  
>  
> +    ExternType = AnMapObjTypeToBtype (ExternTypeOp);
> +
> +    /*
> +     * The parser allows optional parameter return types regardless of the
> +     * type. Check object type keyword emit error if optional parameter/return
> +     * types exist.
> +     *
> +     * Check the parameter return type
> +     */
> +    TypeOp = ExternTypeOp->Asl.Next;
> +    if (TypeOp->Asl.Child)
> +    {
> +        /* Ignore the return type for now. */
> +
> +        (void) MtProcessTypeOp (TypeOp->Asl.Child);
> +        if (ExternType != ACPI_BTYPE_METHOD)
> +        {
> +            sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
> +            AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_RET_TYPE, TypeOp,
> +                AslGbl_MsgBuffer);
> +        }
> +    }
> +
> +    /* Check the parameter types */
> +
> +    TypeOp = TypeOp->Asl.Next;
> +    if (TypeOp->Asl.Child)
> +    {
> +        ParamCount = MtProcessParameterTypeList (TypeOp->Asl.Child, ParamTypes);
> +        if (ExternType != ACPI_BTYPE_METHOD)
> +        {
> +            sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
> +            AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_PARAM_TYPE, TypeOp,
> +                AslGbl_MsgBuffer);
> +        }
> +    }
> +
>      ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next;
>      ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
>      ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
> -    ArgCountOp->Asl.Value.Integer = 0;
> +    ArgCountOp->Asl.Value.Integer = ParamCount;
>      UtSetParseOpName (ArgCountOp);
>  
>      /* Create new list node of arbitrary type */
> diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c
> index d9728206..0d26c641 100644
> --- a/src/acpica/source/compiler/aslload.c
> +++ b/src/acpica/source/compiler/aslload.c
> @@ -196,6 +196,15 @@ LdCheckSpecialNames (
>      ACPI_NAMESPACE_NODE     *Node,
>      ACPI_PARSE_OBJECT       *Op);
>  
> +static ACPI_STATUS
> +LdAnalyzeExternals (
> +    ACPI_NAMESPACE_NODE     *Node,
> +    ACPI_PARSE_OBJECT       *Op,
> +    ACPI_OBJECT_TYPE        ExternalOpType,
> +    ACPI_OBJECT_TYPE        ObjectType,
> +    ACPI_WALK_STATE         *WalkState);
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    LdLoadNamespace
> @@ -575,7 +584,8 @@ LdNamespace1Begin (
>      /* Check for a possible illegal forward reference */
>  
>      if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
> -        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
> +        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
> +        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
>      {
>          /*
>           * Op->Asl.Namepath will be NULL for these opcodes.
> @@ -591,7 +601,8 @@ LdNamespace1Begin (
>           * We only want references to named objects:
>           *      Store (2, WXYZ) -> Attempt to resolve the name
>           */
> -        if (OpInfo->Class == AML_CLASS_NAMED_OBJECT)
> +        if ((Op->Asl.ParseOpcode != PARSEOP_METHODCALL) &&
> +            (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
>          {
>              return (AE_OK);
>          }
> @@ -899,56 +910,24 @@ LdNamespace1Begin (
>                  Node->Type = (UINT8) ObjectType;
>                  Status = AE_OK;
>              }
> -            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> -                     (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
> +            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) ||
> +                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
>              {
> -                /*
> -                 * Allow one create on an object or segment that was
> -                 * previously declared External
> -                 */
> -                Node->Flags &= ~ANOBJ_IS_EXTERNAL;
> -                Node->Type = (UINT8) ObjectType;
> -
> -                /* Just retyped a node, probably will need to open a scope */
> -
> -                if (AcpiNsOpensScope (ObjectType))
> +                Status = LdAnalyzeExternals (Node, Op, ActualObjectType,
> +                    ObjectType, WalkState);
> +                if (ACPI_FAILURE (Status))
>                  {
> -                    Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
> -                    if (ACPI_FAILURE (Status))
> +                    if (Status == AE_ERROR)
>                      {
> -                        return_ACPI_STATUS (Status);
> +                        /*
> +                         * The use of AE_ERROR here indicates that there was a
> +                         * compiler error emitted in LdAnalyzeExternals which
> +                         * means that the caller should proceed to the next Op
> +                         * for analysis of subsequent parse objects.
> +                         */
> +                        Status = AE_OK;
>                      }
> -                }
> -
> -                Status = AE_OK;
> -            }
> -            else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
> -                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
> -            {
> -                /*
> -                 * Allow externals in same scope as the definition of the
> -                 * actual object. Similar to C. Allows multiple definition
> -                 * blocks that refer to each other in the same file.
> -                 */
> -                Status = AE_OK;
> -            }
> -            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> -                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
> -                     (ObjectType == ACPI_TYPE_ANY))
> -            {
> -                /* Allow update of externals of unknown type. */
> -
> -                if (AcpiNsOpensScope (ActualObjectType))
> -                {
> -                    Node->Type = (UINT8) ActualObjectType;
> -                    Status = AE_OK;
> -                }
> -                else
> -                {
> -                    sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
> -                        AcpiUtGetTypeName (Node->Type));
> -                    AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer);
> -                    return_ACPI_STATUS (AE_OK);
> +                    return_ACPI_STATUS (Status);
>                  }
>              }
>              else
> @@ -1013,15 +992,17 @@ FinishNode:
>       * Set the actual data type if appropriate (EXTERNAL term only)
>       * As of 11/19/2019, ASL External() does not support parameter
>       * counts. When an External method is loaded, the parameter count is
> -     * unknown setting Node->Value to ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS
> -     * indicates that the parameter count for this method is unknown.
> -     * This information is used in ASL cross reference to help determine the
> -     * parameter count through method calls.
> +     * recorded in the external's arg count parameter. The parameter count may
> +     * or may not be known in the declaration. If the value of this node turns
> +     * out to be ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS, it indicates that
> +     * we do not know the parameter count and that we must look at the usage of
> +     * the External method call to get this information.
>       */
>      if (ActualObjectType != ACPI_TYPE_ANY)
>      {
>          Node->Type = (UINT8) ActualObjectType;
> -        Node->Value = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
> +        Node->Value = (UINT32)
> +            Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer;
>      }
>  
>      if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
> @@ -1037,6 +1018,145 @@ FinishNode:
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    LdAnalyzeExternals
> + *
> + * PARAMETERS:  Node            - Node that represents the named object
> + *              Op              - Named object declaring this named object
> + *              ExternalOpType  - Type of ExternalOp
> + *              ObjectType      - Type of Declared object
> + *              WalkState       - Current WalkState
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Node and Op represents an identically named object declaration
> + *              that is either declared by the ASL external keyword or declared
> + *              by operators that declare named objects (i.e. Name, Device,
> + *              OperationRegion, and etc.). This function ensures that the
> + *              declarations do not contradict each other.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +LdAnalyzeExternals (
> +    ACPI_NAMESPACE_NODE     *Node,
> +    ACPI_PARSE_OBJECT       *Op,
> +    ACPI_OBJECT_TYPE        ExternalOpType,
> +    ACPI_OBJECT_TYPE        ObjectType,
> +    ACPI_WALK_STATE         *WalkState)
> +{
> +    ACPI_STATUS             Status = AE_OK;
> +    ACPI_OBJECT_TYPE        ActualExternalOpType;
> +    ACPI_OBJECT_TYPE        ActualOpType;
> +    ACPI_PARSE_OBJECT       *ExternalOp;
> +    ACPI_PARSE_OBJECT       *ActualOp;
> +
> +
> +    /*
> +     * The declaration represented by Node and Op must have the same type.
> +     * The type of the external Op is represented by ExternalOpType. However,
> +     * the type of the pre-existing declaration depends on whether if Op
> +     * is an external declaration or an actual declaration.
> +     */
> +    if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
> +    {
> +        ActualExternalOpType = ExternalOpType;
> +        ActualOpType = Node->Type;
> +    }
> +    else
> +    {
> +        ActualExternalOpType = Node->Type;
> +        ActualOpType = ObjectType;
> +    }
> +
> +    if ((ActualOpType != ACPI_TYPE_ANY) &&
> +        (ActualExternalOpType != ACPI_TYPE_ANY) &&
> +        (ActualExternalOpType != ActualOpType))
> +    {
> +        if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
> +            Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
> +        {
> +            AslDualParseOpError (ASL_ERROR,
> +                ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL,
> +                ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL);
> +        }
> +        else
> +        {
> +            if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
> +                Node->Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)
> +            {
> +                ExternalOp = Op;
> +                ActualOp = Node->Op;
> +            }
> +            else
> +            {
> +                ExternalOp = Node->Op;
> +                ActualOp = Op;
> +            }
> +            AslDualParseOpError (ASL_ERROR,
> +                ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL,
> +                ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL);
> +        }
> +    }
> +
> +    if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> +        (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
> +    {
> +        /*
> +         * Allow one create on an object or segment that was
> +         * previously declared External
> +         */
> +        Node->Flags &= ~ANOBJ_IS_EXTERNAL;
> +        Node->Type = (UINT8) ObjectType;
> +
> +        /* Just retyped a node, probably will need to open a scope */
> +
> +        if (AcpiNsOpensScope (ObjectType))
> +        {
> +            Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +        }
> +
> +        Status = AE_OK;
> +    }
> +    else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
> +             (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
> +    {
> +        /*
> +         * Allow externals in same scope as the definition of the
> +         * actual object. Similar to C. Allows multiple definition
> +         * blocks that refer to each other in the same file.
> +         */
> +        Status = AE_OK;
> +    }
> +    else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> +             (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
> +             (ObjectType == ACPI_TYPE_ANY))
> +    {
> +        /* Allow update of externals of unknown type. */
> +
> +        if (AcpiNsOpensScope (ExternalOpType))
> +        {
> +            Node->Type = (UINT8) ExternalOpType;
> +            Status = AE_OK;
> +        }
> +        else
> +        {
> +            sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
> +                AcpiUtGetTypeName (Node->Type));
> +            AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer);
> +            Status = AE_ERROR;
> +        }
> +    }
> +
> +    return (Status);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    LdCheckSpecialNames
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index 418df32c..81280b28 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -320,7 +320,7 @@ const char                      *AslCompilerMsgs [] =
>  /*    ASL_MSG_SCOPE_TYPE */                 "Existing object has invalid type for Scope operator",
>  /*    ASL_MSG_SEEK */                       "Could not seek file",
>  /*    ASL_MSG_SERIALIZED */                 "Control Method marked Serialized",
> -/*    ASL_MSG_SERIALIZED_REQUIRED */        "Control Method should be made Serialized",
> +/*    ASL_MSG_SERIALIZED_REQUIRED */        "Control Method should be made Serialized due to creation of named objects within",
>  /*    ASL_MSG_SINGLE_NAME_OPTIMIZATION */   "NamePath optimized to NameSeg (uses run-time search path)",
>  /*    ASL_MSG_SOME_NO_RETVAL */             "Called method may not always return a value",
>  /*    ASL_MSG_STRING_LENGTH */              "String literal too long",
> @@ -370,7 +370,16 @@ const char                      *AslCompilerMsgs [] =
>  /*    ASL_MSG_INVALID_PROCESSOR_UID */      "_UID inside processor declaration must be an integer",
>  /*    ASL_MSG_LEGACY_PROCESSOR_OP */        "Legacy Processor() keyword detected. Use Device() keyword instead.",
>  /*    ASL_MSG_NAMESTRING_LENGTH */          "NameString contains too many NameSegs (>255)",
> -/*    ASL_MSG_CASE_FOUND_HERE */            "Original Case value below:"
> +/*    ASL_MSG_CASE_FOUND_HERE */            "Original Case value below:",
> +/*    ASL_MSG_EXTERN_INVALID_RET_TYPE */    "Return type is only allowed for Externals declared as MethodObj",
> +/*    ASL_MSG_EXTERN_INVALID_PARAM_TYPE */  "Parameter type is only allowed for Externals declared as MethodObj",
> +/*    ASL_MSG_NAMED_OBJECT_CREATION */      "Creation of named objects within a method is highly inefficient, use globals or method local variables instead",
> +/*    ASL_MSG_ARG_COUNT_MISMATCH */         "Method NumArgs count does not match length of ParameterTypes list",
> +/*    ASL_MSG_STATIC_OPREGION_IN_METHOD */  "Static OperationRegion should be declared outside control method",
> +/*    ASL_MSG_DECLARATION_TYPE_MISMATCH */  "Type mismatch between external declaration and actual object declaration detected",
> +/*    ASL_MSG_TYPE_MISMATCH_FOUND_HERE */   "Actual object declaration:",
> +/*    ASL_MSG_DUPLICATE_EXTERN_MISMATCH */  "Type mismatch between multiple external declarations detected",
> +/*    ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE */"Duplicate external declaration:",
>  };
>  
>  /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index fb3513ab..6d5ffd4d 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -373,6 +373,16 @@ typedef enum
>      ASL_MSG_LEGACY_PROCESSOR_OP,
>      ASL_MSG_NAMESTRING_LENGTH,
>      ASL_MSG_CASE_FOUND_HERE,
> +    ASL_MSG_EXTERN_INVALID_RET_TYPE,
> +    ASL_MSG_EXTERN_INVALID_PARAM_TYPE,
> +    ASL_MSG_NAMED_OBJECT_CREATION,
> +    ASL_MSG_ARG_COUNT_MISMATCH,
> +    ASL_MSG_STATIC_OPREGION_IN_METHOD,
> +    ASL_MSG_DECLARATION_TYPE_MISMATCH,
> +    ASL_MSG_TYPE_MISMATCH_FOUND_HERE,
> +    ASL_MSG_DUPLICATE_EXTERN_MISMATCH,
> +    ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE,
> +
>  
>      /* These messages are used by the Data Table compiler only */
>  
> diff --git a/src/acpica/source/compiler/aslmethod.c b/src/acpica/source/compiler/aslmethod.c
> index b7b7ec42..d56f4817 100644
> --- a/src/acpica/source/compiler/aslmethod.c
> +++ b/src/acpica/source/compiler/aslmethod.c
> @@ -151,6 +151,7 @@
>  
>  #include "aslcompiler.h"
>  #include "aslcompiler.y.h"
> +#include "acnamesp.h"
>  #include "acparser.h"
>  #include "amlcode.h"
>  
> @@ -166,6 +167,10 @@ MtCheckNamedObjectInMethod (
>      ACPI_PARSE_OBJECT       *Op,
>      ASL_METHOD_INFO         *MethodInfo);
>  
> +static void
> +MtCheckStaticOperationRegionInMethod (
> +    ACPI_PARSE_OBJECT       *Op);
> +
>  
>  /*******************************************************************************
>   *
> @@ -197,7 +202,6 @@ MtMethodAnalysisWalkBegin (
>      char                    ArgName[] = "Arg0";
>      ACPI_PARSE_OBJECT       *ArgNode;
>      ACPI_PARSE_OBJECT       *NextType;
> -    ACPI_PARSE_OBJECT       *NextParamType;
>      UINT8                   ActualArgs = 0;
>      BOOLEAN                 HidExists;
>      BOOLEAN                 AdrExists;
> @@ -282,50 +286,35 @@ MtMethodAnalysisWalkBegin (
>          Next = Next->Asl.Next;
>  
>          NextType = Next->Asl.Child;
> -        while (NextType)
> -        {
> -            /* Get and map each of the ReturnTypes */
>  
> -            MethodInfo->ValidReturnTypes |= AnMapObjTypeToBtype (NextType);
> -            NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> -            NextType = NextType->Asl.Next;
> -        }
> +        MethodInfo->ValidReturnTypes = MtProcessTypeOp (NextType);
>  
>          /* Get the ParameterType node */
>  
>          Next = Next->Asl.Next;
>  
>          NextType = Next->Asl.Child;
> -        while (NextType)
> +        if (!NextType)
>          {
> -            if (NextType->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> -            {
> -                NextParamType = NextType->Asl.Child;
> -                while (NextParamType)
> -                {
> -                    MethodInfo->ValidArgTypes[ActualArgs] |=
> -                        AnMapObjTypeToBtype (NextParamType);
> -
> -                    NextParamType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> -                    NextParamType = NextParamType->Asl.Next;
> -                }
> -            }
> -            else
> -            {
> -                MethodInfo->ValidArgTypes[ActualArgs] =
> -                    AnMapObjTypeToBtype (NextType);
> -
> -                NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> -                ActualArgs++;
> -            }
> -
> -            NextType = NextType->Asl.Next;
> +            /*
> +             * The optional parameter types list was omitted  at the source
> +             * level. Use the Argument count parameter instead.
> +             */
> +            ActualArgs = MethodInfo->NumArguments;
> +        }
> +        else
> +        {
> +            ActualArgs = MtProcessParameterTypeList (NextType,
> +                MethodInfo->ValidArgTypes);
>          }
>  
>          if ((MethodInfo->NumArguments) &&
>              (MethodInfo->NumArguments != ActualArgs))
>          {
> -            /* error: Param list did not match number of args */
> +            sprintf (AslGbl_MsgBuffer,
> +                "Length = %u", ActualArgs);
> +            AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_MISMATCH,
> +                Op->Asl.Child->Asl.Next, AslGbl_MsgBuffer);
>          }
>  
>          /* Allow numarguments == 0 for Function() */
> @@ -576,6 +565,8 @@ MtMethodAnalysisWalkBegin (
>              AslError (ASL_ERROR, ASL_MSG_RESERVED_USE,
>                  Op, Op->Asl.ExternalName);
>          }
> +
> +        MtCheckStaticOperationRegionInMethod (Op);
>          break;
>  
>      case PARSEOP_NAME:
> @@ -628,6 +619,71 @@ MtMethodAnalysisWalkBegin (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    MtProcessTypeOp
> + *
> + * PARAMETERS:  Op                  - Op representing a btype
> + *
> + * RETURN:      Btype represented by Op
> + *
> + * DESCRIPTION: Process a parse object that represents single parameter type or
> + *              a return type in method, function, and external declarations.
> + *
> + ******************************************************************************/
> +
> +UINT32
> +MtProcessTypeOp (
> +    ACPI_PARSE_OBJECT       *TypeOp)
> +{
> +    UINT32                  Btype = ACPI_BTYPE_ANY;
> +
> +
> +    while (TypeOp)
> +    {
> +        Btype |= AnMapObjTypeToBtype (TypeOp);
> +        TypeOp->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> +        TypeOp = TypeOp->Asl.Next;
> +    }
> +
> +    return (Btype);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    MtProcessParameterTypeList
> + *
> + * PARAMETERS:  Op                  - Op representing a btype
> + *
> + * RETURN:      Btype represented by Op
> + *
> + * DESCRIPTION: Process a parse object that represents a parameter type list in
> + *              method, function, and external declarations.
> + *
> + ******************************************************************************/
> +
> +UINT8
> +MtProcessParameterTypeList (
> +    ACPI_PARSE_OBJECT       *ParamTypeOp,
> +    UINT32                  *TypeList)
> +{
> +    UINT8                   ParameterCount = 0;
> +
> +
> +    while (ParamTypeOp)
> +    {
> +        TypeList[ParameterCount] =
> +            MtProcessTypeOp (ParamTypeOp->Asl.Child);
> +
> +        ParameterCount++;
> +        ParamTypeOp = ParamTypeOp->Asl.Next;
> +    }
> +
> +    return (ParameterCount);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    MtCheckNamedObjectInMethod
> @@ -649,6 +705,7 @@ MtCheckNamedObjectInMethod (
>      ASL_METHOD_INFO         *MethodInfo)
>  {
>      const ACPI_OPCODE_INFO  *OpInfo;
> +    char                    *ExternalPath;
>  
>  
>      /* We don't care about actual method declarations or scopes */
> @@ -672,27 +729,97 @@ MtCheckNamedObjectInMethod (
>          /*
>           * 1) Mark the method as a method that creates named objects.
>           *
> -         * 2) If the method is non-serialized, emit a remark that the method
> +         * 2) Issue a remark indicating the inefficiency of creating named
> +         * objects within a method (Except for compiler-emitted temporary
> +         * variables).
> +         *
> +         * 3) If the method is non-serialized, emit a remark that the method
>           * should be serialized.
>           *
>           * Reason: If a thread blocks within the method for any reason, and
>           * another thread enters the method, the method will fail because
>           * an attempt will be made to create the same object twice.
>           */
> +        ExternalPath = AcpiNsGetNormalizedPathname (MethodInfo->Op->Asl.Node, TRUE);
> +
> +        /* No error for compiler temp variables (name starts with "_T_") */
> +
> +        if ((Op->Asl.NameSeg[0] != '_') &&
> +            (Op->Asl.NameSeg[1] != 'T') &&
> +            (Op->Asl.NameSeg[2] != '_'))
> +        {
> +            AslError (ASL_REMARK, ASL_MSG_NAMED_OBJECT_CREATION, Op,
> +                ExternalPath);
> +        }
> +
>          MethodInfo->CreatesNamedObjects = TRUE;
>          if (!MethodInfo->ShouldBeSerialized)
>          {
>              AslError (ASL_REMARK, ASL_MSG_SERIALIZED_REQUIRED, MethodInfo->Op,
> -                "due to creation of named objects within");
> +                ExternalPath);
>  
>              /* Emit message only ONCE per method */
>  
>              MethodInfo->ShouldBeSerialized = TRUE;
>          }
> +
> +        if (ExternalPath)
> +        {
> +            ACPI_FREE (ExternalPath);
> +        }
>      }
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    MtCheckStaticOperationRegionInMethod
> + *
> + * PARAMETERS:  Op                  - Current parser op
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Warns if an Operation Region with static address or length
> + *              is declared inside a control method
> + *
> + ******************************************************************************/
> +
> +static void
> +MtCheckStaticOperationRegionInMethod(
> +    ACPI_PARSE_OBJECT*       Op)
> +{
> +    ACPI_PARSE_OBJECT*       AddressOp;
> +    ACPI_PARSE_OBJECT*       LengthOp;
> +
> +
> +    if (Op->Asl.ParseOpcode != PARSEOP_OPERATIONREGION)
> +    {
> +        return;
> +    }
> +
> +    /*
> +     * OperationRegion should have 4 arguments defined. At this point, we
> +     * assume that the parse tree is well-formed.
> +     */
> +    AddressOp = Op->Asl.Child->Asl.Next->Asl.Next;
> +    LengthOp = Op->Asl.Child->Asl.Next->Asl.Next->Asl.Next;
> +
> +    if (UtGetParentMethodOp (Op) &&
> +        AddressOp->Asl.ParseOpcode == PARSEOP_INTEGER &&
> +        LengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)
> +    {
> +        /*
> +         * At this point, a static operation region declared inside of a
> +         * control method has been found. Throw a warning because this is
> +         * highly inefficient.
> +         */
> +        AslError(ASL_WARNING, ASL_MSG_STATIC_OPREGION_IN_METHOD, Op, NULL);
> +    }
> +
> +    return;
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    MtMethodAnalysisWalkEnd
> @@ -714,6 +841,7 @@ MtMethodAnalysisWalkEnd (
>  {
>      ASL_ANALYSIS_WALK_INFO  *WalkInfo = (ASL_ANALYSIS_WALK_INFO *) Context;
>      ASL_METHOD_INFO         *MethodInfo = WalkInfo->MethodStack;
> +    char                    *ExternalPath;
>  
>  
>      switch (Op->Asl.ParseOpcode)
> @@ -766,8 +894,15 @@ MtMethodAnalysisWalkEnd (
>          if (MethodInfo->NumReturnNoValue &&
>              MethodInfo->NumReturnWithValue)
>          {
> +            ExternalPath = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
> +
>              AslError (ASL_WARNING, ASL_MSG_RETURN_TYPES, Op,
> -                Op->Asl.ExternalName);
> +                ExternalPath);
> +
> +            if (ExternalPath)
> +            {
> +                ACPI_FREE (ExternalPath);
> +            }
>          }
>  
>          /*
> diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c
> index b58d4e66..46875413 100644
> --- a/src/acpica/source/compiler/aslparseop.c
> +++ b/src/acpica/source/compiler/aslparseop.c
> @@ -743,13 +743,18 @@ TrCreateConstantLeafOp (
>  
>          /* Get a copy of the current time */
>  
> +        Op->Asl.Value.String = "";
>          CurrentTime = time (NULL);
> +
>          StaticTimeString = ctime (&CurrentTime);
> -        TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1);
> -        strcpy (TimeString, StaticTimeString);
> +        if (StaticTimeString)
> +        {
> +            TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1);
> +            strcpy (TimeString, StaticTimeString);
>  
> -        TimeString[strlen(TimeString) -1] = 0;  /* Remove trailing newline */
> -        Op->Asl.Value.String = TimeString;
> +            TimeString[strlen(TimeString) -1] = 0;  /* Remove trailing newline */
> +            Op->Asl.Value.String = TimeString;
> +        }
>          break;
>  
>      default: /* This would be an internal error */
> diff --git a/src/acpica/source/compiler/aslprimaries.y b/src/acpica/source/compiler/aslprimaries.y
> index 7bbf4155..1fb9e501 100644
> --- a/src/acpica/source/compiler/aslprimaries.y
> +++ b/src/acpica/source/compiler/aslprimaries.y
> @@ -663,7 +663,7 @@ FunctionTerm
>          PARSEOP_CLOSE_PAREN '{'     {COMMENT_CAPTURE_ON; }
>              TermList '}'            {$$ = TrLinkOpChildren ($<n>3,7,
>                                          TrSetOpFlags ($4, OP_IS_NAME_DECLARATION),
> -                                        TrCreateValuedLeafOp (PARSEOP_BYTECONST, 0),
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),
>                                          TrCreateLeafOp (PARSEOP_SERIALIZERULE_NOTSERIAL),
>                                          TrCreateValuedLeafOp (PARSEOP_BYTECONST, 0),$5,$6,$10);}
>      | PARSEOP_FUNCTION
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index 9035e8bb..f998527b 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -421,14 +421,16 @@ ParameterTypePackage
>  
>  ParameterTypePackageList
>      :                               {$$ = NULL;}
> -    | ObjectTypeKeyword             {$$ = $1;}
> -    | '{' ParameterTypePackage '}'  {$$ = $2;}
> +    | ObjectTypeKeyword             {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$1);}
> +    | '{' ParameterTypePackage '}'  {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
>      ;
>  
> +
>  OptionalParameterTypePackage
> -    :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
> -    | ',' ParameterTypePackageList  {$$ = TrLinkOpChildren (
> -                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
> +    :                               {$$ = NULL;}
> +    | ',' ParameterTypePackageList  {$$ = $2;}
>      ;
>  
>      /* Rules for specifying the types for method arguments */
> @@ -441,14 +443,15 @@ ParameterTypesPackage
>  
>  ParameterTypesPackageList
>      :                               {$$ = NULL;}
> -    | ObjectTypeKeyword             {$$ = $1;}
> -    | '{' ParameterTypesPackage '}' {$$ = $2;}
> +    | ObjectTypeKeyword             {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$1);}
> +    | '{' ParameterTypesPackage '}' {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
>      ;
>  
>  OptionalParameterTypesPackage
> -    :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
> -    | ',' ParameterTypesPackageList {$$ = TrLinkOpChildren (
> -                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
> +    :                               {$$ = NULL;}
> +    | ',' ParameterTypesPackageList {$$ = $2;}
>      ;
>  
>  /*
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index dcb60f7a..67adf82e 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -205,6 +205,10 @@ TrCheckForBufferMatch (
>      ACPI_PARSE_OBJECT       *Next1,
>      ACPI_PARSE_OBJECT       *Next2);
>  
> +static void
> +TrDoMethod (
> +    ACPI_PARSE_OBJECT       *Op);
> +
>  
>  /*******************************************************************************
>   *
> @@ -463,11 +467,8 @@ TrTransformSubtree (
>          break;
>  
>      case PARSEOP_METHOD:
> -        /*
> -         * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
> -         * however
> -         */
> -        AslGbl_TempCount = 0;
> +
> +        TrDoMethod (Op);
>          break;
>  
>      case PARSEOP_EXTERNAL:
> @@ -1240,3 +1241,76 @@ TrCheckForBufferMatch (
>  
>      return (TRUE);
>  }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    TrDoMethod
> + *
> + * PARAMETERS:  Op               - Parse node for SWITCH
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Determine that parameter count of an ASL method node by
> + *              translating the parameter count parse node from
> + *              PARSEOP_DEFAULT_ARG to PARSEOP_BYTECONST.
> + *
> + ******************************************************************************/
> +
> +static void
> +TrDoMethod (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +    ACPI_PARSE_OBJECT           *ArgCountOp;
> +    UINT8                       ArgCount;
> +    ACPI_PARSE_OBJECT           *ParameterOp;
> +
> +
> +    /*
> +     * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
> +     * however
> +     */
> +    AslGbl_TempCount = 0;
> +
> +    ArgCountOp = Op->Asl.Child->Asl.Next;
> +    if (ArgCountOp->Asl.ParseOpcode == PARSEOP_BYTECONST)
> +    {
> +        /*
> +         * Parameter count for this method has already been recorded in the
> +         * method declaration.
> +         */
> +        return;
> +    }
> +
> +    /*
> +     * Parameter count has been omitted in the method declaration.
> +     * Count the amount of arguments here.
> +     */
> +    ParameterOp = ArgCountOp->Asl.Next->Asl.Next->Asl.Next->Asl.Next;
> +    if (ParameterOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> +    {
> +        ArgCount = 0;
> +        ParameterOp = ParameterOp->Asl.Child;
> +
> +        while (ParameterOp)
> +        {
> +            ParameterOp = ParameterOp->Asl.Next;
> +            ArgCount++;
> +        }
> +
> +        ArgCountOp->Asl.Value.Integer = ArgCount;
> +        ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
> +    }
> +    else
> +    {
> +        /*
> +         * Method parameters can be counted by analyzing the Parameter type
> +         * list. If the Parameter list contains more than 1 parameter, it
> +         * is nested under PARSEOP_DEFAULT_ARG. When there is only 1
> +         * parameter, the parse tree contains a single node representing
> +         * that type.
> +         */
> +        ArgCountOp->Asl.Value.Integer = 1;
> +        ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
> +    }
> +}
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 4233318f..42ef2c0b 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -298,7 +298,7 @@ UtNodeIsDescendantOf (
>  
>  /*******************************************************************************
>   *
> - * FUNCTION:    UtGetParentMethod
> + * FUNCTION:    UtGetParentMethodNode
>   *
>   * PARAMETERS:  Node                    - Namespace node for any object
>   *
> @@ -309,8 +309,8 @@ UtNodeIsDescendantOf (
>   *
>   ******************************************************************************/
>  
> -void *
> -UtGetParentMethod (
> +ACPI_NAMESPACE_NODE *
> +UtGetParentMethodNode (
>      ACPI_NAMESPACE_NODE     *Node)
>  {
>      ACPI_NAMESPACE_NODE     *ParentNode;
> @@ -338,6 +338,41 @@ UtGetParentMethod (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    UtGetParentMethodOp
> + *
> + * PARAMETERS:  Op                      - Parse Op to be checked
> + *
> + * RETURN:      Control method Op if found. NULL otherwise
> + *
> + * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
> + *              the input Op is not within a control method.
> + *
> + ******************************************************************************/
> +
> +ACPI_PARSE_OBJECT *
> +UtGetParentMethodOp (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +    ACPI_PARSE_OBJECT       *NextOp;
> +
> +
> +    NextOp = Op->Asl.Parent;
> +    while (NextOp)
> +    {
> +        if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
> +        {
> +            return (NextOp);
> +        }
> +
> +        NextOp = NextOp->Asl.Parent;
> +    }
> +
> +    return (NULL); /* No parent method found */
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    UtDisplaySupportedTables
> diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
> index 2649373f..38356aa2 100644
> --- a/src/acpica/source/compiler/aslxref.c
> +++ b/src/acpica/source/compiler/aslxref.c
> @@ -180,10 +180,6 @@ XfValidateCrossReference (
>      const ACPI_OPCODE_INFO  *OpInfo,
>      ACPI_NAMESPACE_NODE     *Node);
>  
> -static ACPI_PARSE_OBJECT *
> -XfGetParentMethod (
> -    ACPI_PARSE_OBJECT       *Op);
> -
>  static BOOLEAN
>  XfObjectExists (
>      char                    *Name);
> @@ -380,41 +376,6 @@ XfCheckFieldRange (
>  }
>  
>  
> -/*******************************************************************************
> - *
> - * FUNCTION:    XfGetParentMethod
> - *
> - * PARAMETERS:  Op                      - Parse Op to be checked
> - *
> - * RETURN:      Control method Op if found. NULL otherwise
> - *
> - * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
> - *              the input Op is not within a control method.
> - *
> - ******************************************************************************/
> -
> -static ACPI_PARSE_OBJECT *
> -XfGetParentMethod (
> -    ACPI_PARSE_OBJECT       *Op)
> -{
> -    ACPI_PARSE_OBJECT       *NextOp;
> -
> -
> -    NextOp = Op->Asl.Parent;
> -    while (NextOp)
> -    {
> -        if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
> -        {
> -            return (NextOp);
> -        }
> -
> -        NextOp = NextOp->Asl.Parent;
> -    }
> -
> -    return (NULL); /* No parent method found */
> -}
> -
> -
>  /*******************************************************************************
>   *
>   * FUNCTION:    XfNamespaceLocateBegin
> @@ -539,7 +500,7 @@ XfNamespaceLocateBegin (
>      {
>          /* Find parent method Op */
>  
> -        NextOp = XfGetParentMethod (Op);
> +        NextOp = UtGetParentMethodOp (Op);
>          if (!NextOp)
>          {
>              return_ACPI_STATUS (AE_OK);
> @@ -576,7 +537,7 @@ XfNamespaceLocateBegin (
>      {
>          /* Find parent method Op */
>  
> -        NextOp = XfGetParentMethod (Op);
> +        NextOp = UtGetParentMethodOp (Op);
>          if (!NextOp)
>          {
>              return_ACPI_STATUS (AE_OK);
> @@ -814,10 +775,10 @@ XfNamespaceLocateBegin (
>           * same method or outside of any method, this is a forward reference
>           * and should be reported as a compiler error.
>           */
> -        DeclarationParentMethod = UtGetParentMethod (Node);
> -        ReferenceParentMethod = XfGetParentMethod (Op);
> +        DeclarationParentMethod = UtGetParentMethodNode (Node);
> +        ReferenceParentMethod = UtGetParentMethodOp (Op);
>  
> -        /* case 1: declaration and refrence are both outside of method */
> +        /* case 1: declaration and reference are both outside of method */
>  
>          if (!ReferenceParentMethod && !DeclarationParentMethod)
>          {
> @@ -1337,8 +1298,8 @@ XfNamespaceLocateEnd (
>   *                                      execution of A)
>   *
>   * NOTES:
> - *      A null pointer returned by either XfGetParentMethod or
> - *      UtGetParentMethod indicates that the parameter object is not
> + *      A null pointer returned by either UtGetParentMethodOp or
> + *      UtGetParentMethodNode indicates that the parameter object is not
>   *      within a control method.
>   *
>   *      Five cases are handled: Case(Op, Node)
> @@ -1371,8 +1332,8 @@ XfValidateCrossReference (
>       * 1) Search upwards in parse tree for owner of the referencing object
>       * 2) Search upwards in namespace to find the owner of the referenced object
>       */
> -    ReferencingMethodOp = XfGetParentMethod (Op);
> -    ReferencedMethodNode = UtGetParentMethod (Node);
> +    ReferencingMethodOp = UtGetParentMethodOp (Op);
> +    ReferencedMethodNode = UtGetParentMethodNode (Node);
>  
>      if (!ReferencingMethodOp && !ReferencedMethodNode)
>      {
> diff --git a/src/acpica/source/compiler/cvparser.c b/src/acpica/source/compiler/cvparser.c
> index 0e0a5b80..370b8036 100644
> --- a/src/acpica/source/compiler/cvparser.c
> +++ b/src/acpica/source/compiler/cvparser.c
> @@ -230,8 +230,7 @@ CvIsFilename (
>   * FUNCTION:    CvInitFileTree
>   *
>   * PARAMETERS:  Table      - input table
> - *              AmlStart   - Address of the starting point of the AML.
> - *              AmlLength  - Length of the AML file.
> + *              RootFile   - Output file that defines the DefinitionBlock
>   *
>   * RETURN:      None
>   *
> @@ -243,8 +242,7 @@ CvIsFilename (
>  void
>  CvInitFileTree (
>      ACPI_TABLE_HEADER       *Table,
> -    UINT8                   *AmlStart,
> -    UINT32                  AmlLength)
> +    FILE                    *RootFile)
>  {
>      UINT8                   *TreeAml;
>      UINT8                   *FileEnd;
> @@ -252,6 +250,8 @@ CvInitFileTree (
>      char                    *PreviousFilename = NULL;
>      char                    *ParentFilename = NULL;
>      char                    *ChildFilename = NULL;
> +    UINT8                   *AmlStart;
> +    UINT32                  AmlLength;
>  
>  
>      if (!AcpiGbl_CaptureComments)
> @@ -259,9 +259,13 @@ CvInitFileTree (
>          return;
>      }
>  
> +
> +    AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
> +    AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
> +
>      CvDbgPrint ("AmlLength: %x\n", AmlLength);
>      CvDbgPrint ("AmlStart:  %p\n", AmlStart);
> -    CvDbgPrint ("AmlEnd?:   %p\n", AmlStart+AmlLength);
> +    CvDbgPrint ("AmlEnd:    %p\n", AmlStart+AmlLength);
>  
>      AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
>  
> @@ -273,7 +277,7 @@ CvInitFileTree (
>  
>      /* Set the root file to the current open file */
>  
> -    AcpiGbl_FileTreeRoot->File = AcpiGbl_OutputFile;
> +    AcpiGbl_FileTreeRoot->File = RootFile;
>  
>      /*
>       * Set this to true because we don't need to output
> diff --git a/src/acpica/source/components/events/evevent.c b/src/acpica/source/components/events/evevent.c
> index 800dd962..0afc7473 100644
> --- a/src/acpica/source/components/events/evevent.c
> +++ b/src/acpica/source/components/events/evevent.c
> @@ -299,7 +299,7 @@ AcpiEvFixedEventInitialize (
>  
>      /*
>       * Initialize the structure that keeps track of fixed event handlers and
> -     * enable the fixed events.
> +     * disable all of the fixed events.
>       */
>      for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
>      {
> diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
> index 131021f1..d652c29f 100644
> --- a/src/acpica/source/components/events/evxfgpe.c
> +++ b/src/acpica/source/components/events/evxfgpe.c
> @@ -1065,6 +1065,44 @@ AcpiEnableAllWakeupGpes (
>  ACPI_EXPORT_SYMBOL (AcpiEnableAllWakeupGpes)
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiAnyGpeStatusSet
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      Whether or not the status bit is set for any GPE
> + *
> + * DESCRIPTION: Check the status bits of all enabled GPEs and return TRUE if any
> + *              of them is set or FALSE otherwise.
> + *
> + ******************************************************************************/
> +
> +UINT32
> +AcpiAnyGpeStatusSet (
> +    void)
> +{
> +    ACPI_STATUS                Status;
> +    UINT8                      Ret;
> +
> +
> +    ACPI_FUNCTION_TRACE (AcpiAnyGpeStatusSet);
> +
> +    Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (FALSE);
> +    }
> +
> +    Ret = AcpiHwCheckAllGpes ();
> +    (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
> +
> +    return (Ret);
> +}
> +
> +ACPI_EXPORT_SYMBOL(AcpiAnyGpeStatusSet)
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiInstallGpeBlock
> diff --git a/src/acpica/source/components/hardware/hwgpe.c b/src/acpica/source/components/hardware/hwgpe.c
> index f0b32bd6..e8ad8926 100644
> --- a/src/acpica/source/components/hardware/hwgpe.c
> +++ b/src/acpica/source/components/hardware/hwgpe.c
> @@ -635,6 +635,58 @@ AcpiHwEnableWakeupGpeBlock (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiHwGetGpeBlockStatus
> + *
> + * PARAMETERS:  GpeXruptInfo    - GPE Interrupt info
> + *              GpeBlock        - Gpe Block info
> + *
> + * RETURN:      Success
> + *
> + * DESCRIPTION: Produce a combined GPE status bits mask for the given block.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiHwGetGpeBlockStatus(
> +    ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
> +    ACPI_GPE_BLOCK_INFO     *GpeBlock,
> +    void *RetPtr)
> +{
> +    ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
> +    UINT64                  InEnable;
> +    UINT64                  InStatus;
> +    ACPI_STATUS             Status;
> +    UINT8                   *Ret = RetPtr;
> +    UINT32                  i;
> +
> +
> +    /* Examine each GPE Register within the block */
> +
> +    for (i = 0; i < GpeBlock->RegisterCount; i++)
> +    {
> +        GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
> +
> +        Status = AcpiHwRead (&InEnable, &GpeRegisterInfo->EnableAddress);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            continue;
> +        }
> +
> +        Status = AcpiHwRead (&InStatus, &GpeRegisterInfo->StatusAddress);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            continue;
> +        }
> +
> +        *Ret |= InEnable & InStatus;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    AcpiHwDisableAllGpes
> @@ -715,4 +767,31 @@ AcpiHwEnableAllWakeupGpes (
>      return_ACPI_STATUS (Status);
>  }
>  
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiHwCheckAllGpes
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      Combined status of all GPEs
> + *
> + * DESCRIPTION: Check all enabled GPEs in all GPE blocks and return TRUE if the
> + *              status bit is set for at least one of them of FALSE otherwise.
> + *
> + ******************************************************************************/
> +
> +UINT8
> +AcpiHwCheckAllGpes (
> +    void)
> +{
> +    UINT8                      Ret = 0;
> +
> +
> +    ACPI_FUNCTION_TRACE (AcpiHwCheckAllGpes);
> +
> +    (void) AcpiEvWalkGpeList (AcpiHwGetGpeBlockStatus, &Ret);
> +    return (Ret != 0);
> +}
> +
>  #endif /* !ACPI_REDUCED_HARDWARE */
> diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
> index 3ad4ae23..016f62be 100644
> --- a/src/acpica/source/components/hardware/hwsleep.c
> +++ b/src/acpica/source/components/hardware/hwsleep.c
> @@ -464,6 +464,16 @@ AcpiHwLegacyWake (
>              AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
>              ACPI_CLEAR_STATUS);
>  
> +    /* Enable sleep button */
> +
> +	(void) AcpiWriteBitRegister (
> +            AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].EnableRegisterId,
> +            ACPI_ENABLE_EVENT);
> +
> +	(void) AcpiWriteBitRegister (
> +            AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId,
> +            ACPI_CLEAR_STATUS);
> +
>      AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
>      return_ACPI_STATUS (Status);
>  }
> diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
> index eebdd1a2..a9509195 100644
> --- a/src/acpica/source/components/namespace/nsnames.c
> +++ b/src/acpica/source/components/namespace/nsnames.c
> @@ -336,7 +336,7 @@ AcpiNsHandleToPathname (
>      /* Build the path in the caller buffer */
>  
>      (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer,
> -        RequiredSize, NoTrailing);
> +        (UINT32) RequiredSize, NoTrailing);
>  
>      ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n",
>          (char *) Buffer->Pointer, (UINT32) RequiredSize));
> @@ -509,7 +509,7 @@ AcpiNsGetNormalizedPathname (
>  
>      /* Build the path in the allocated buffer */
>  
> -    (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing);
> +    (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, (UINT32) Size, NoTrailing);
>  
>      ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%s: Path \"%s\"\n",
>          ACPI_GET_FUNCTION_NAME, NameBuffer));
> @@ -542,7 +542,7 @@ AcpiNsBuildPrefixedPathname (
>      char                    *FullPath = NULL;
>      char                    *ExternalPath = NULL;
>      char                    *PrefixPath = NULL;
> -    UINT32                  PrefixPathLength = 0;
> +    ACPI_SIZE               PrefixPathLength = 0;
>  
>  
>      /* If there is a prefix, get the pathname to it */
> diff --git a/src/acpica/source/components/namespace/nsxfname.c b/src/acpica/source/components/namespace/nsxfname.c
> index 5b3d5a9b..53a2f4bf 100644
> --- a/src/acpica/source/components/namespace/nsxfname.c
> +++ b/src/acpica/source/components/namespace/nsxfname.c
> @@ -714,7 +714,7 @@ AcpiInstallMethod (
>  
>      MethodFlags = *ParserState.Aml++;
>      AmlStart = ParserState.Aml;
> -    AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
> +    AmlLength = (UINT32) ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
>  
>      /*
>       * Allocate resources up-front. We don't want to have to delete a new
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 3c17ee00..682cb5a8 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -368,14 +368,14 @@ ACPI_EXPORT_SYMBOL_INIT (AcpiReallocateRootTable)
>   *
>   * PARAMETERS:  Signature           - ACPI signature of needed table
>   *              Instance            - Which instance (for SSDTs)
> - *              OutTableHeader      - The pointer to the table header to fill
> + *              OutTableHeader      - The pointer to the where the table header
> + *                                    is returned
>   *
> - * RETURN:      Status and pointer to mapped table header
> + * RETURN:      Status and a copy of the table header
>   *
> - * DESCRIPTION: Finds an ACPI table header.
> - *
> - * NOTE:        Caller is responsible in unmapping the header with
> - *              AcpiOsUnmapMemory
> + * DESCRIPTION: Finds and returns an ACPI table header. Caller provides the
> + *              memory where a copy of the header is to be returned
> + *              (fixed length).
>   *
>   ******************************************************************************/
>  
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index e4b93058..71244e51 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -192,7 +192,7 @@ AcpiUtGetElementLength (
>   *
>   * NOTE:        We always allocate the worst-case object descriptor because
>   *              these objects are cached, and we want them to be
> - *              one-size-satisifies-any-request. This in itself may not be
> + *              one-size-satisfies-any-request. This in itself may not be
>   *              the most memory efficient, but the efficiency of the object
>   *              cache should more than make up for this!
>   *
> diff --git a/src/acpica/source/include/acconvert.h b/src/acpica/source/include/acconvert.h
> index 2894b729..0962a164 100644
> --- a/src/acpica/source/include/acconvert.h
> +++ b/src/acpica/source/include/acconvert.h
> @@ -237,8 +237,7 @@ CgWriteAmlComment (
>  void
>  CvInitFileTree (
>      ACPI_TABLE_HEADER       *Table,
> -    UINT8                   *AmlStart,
> -    UINT32                  AmlLength);
> +    FILE                    *RootFile);
>  
>  void
>  CvClearOpComments (
> diff --git a/src/acpica/source/include/achware.h b/src/acpica/source/include/achware.h
> index 646cef85..9ff14d95 100644
> --- a/src/acpica/source/include/achware.h
> +++ b/src/acpica/source/include/achware.h
> @@ -315,6 +315,10 @@ ACPI_STATUS
>  AcpiHwEnableAllWakeupGpes (
>      void);
>  
> +UINT8
> +AcpiHwCheckAllGpes (
> +    void);
> +
>  ACPI_STATUS
>  AcpiHwEnableRuntimeGpeBlock (
>      ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
> diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
> index 340875e8..71cd18e2 100644
> --- a/src/acpica/source/include/acmacros.h
> +++ b/src/acpica/source/include/acmacros.h
> @@ -625,7 +625,7 @@
>  #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d) CvPrintOneCommentType (a,b,c,d);
>  #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b) CvPrintOneCommentList (a,b);
>  #define ASL_CV_FILE_HAS_SWITCHED(a)       CvFileHasSwitched(a)
> -#define ASL_CV_INIT_FILETREE(a,b,c)      CvInitFileTree(a,b,c);
> +#define ASL_CV_INIT_FILETREE(a,b)      CvInitFileTree(a,b);
>  
>  #else
>  
> @@ -640,7 +640,7 @@
>  #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d)
>  #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b)
>  #define ASL_CV_FILE_HAS_SWITCHED(a)       0
> -#define ASL_CV_INIT_FILETREE(a,b,c)
> +#define ASL_CV_INIT_FILETREE(a,b)
>  
>  #endif
>  
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 10e5e79a..a39d180e 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                 0x20200110
> +#define ACPI_CA_VERSION                 0x20200214
>  
>  #include "acconfig.h"
>  #include "actypes.h"
> @@ -1109,6 +1109,10 @@ ACPI_STATUS
>  AcpiEnableAllWakeupGpes (
>      void))
>  
> +ACPI_HW_DEPENDENT_RETURN_UINT32 (
> +    UINT32                  AcpiAnyGpeStatusSet (
> +    void))
> +
>  ACPI_HW_DEPENDENT_RETURN_STATUS (
>  ACPI_STATUS
>  AcpiGetGpeDevice (
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 6cb327a1..1f0d5c2f 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -1149,7 +1149,7 @@ enum AcpiErstInstructions
>  
>  enum AcpiErstCommandStatus
>  {
> -    ACPI_ERST_SUCESS                = 0,
> +    ACPI_ERST_SUCCESS                = 0,
>      ACPI_ERST_NO_SPACE              = 1,
>      ACPI_ERST_NOT_AVAILABLE         = 2,
>      ACPI_ERST_FAILURE               = 3,
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index 532d1fa8..c7d2c9aa 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -683,11 +683,12 @@ typedef UINT64                          ACPI_INTEGER;
>                                        strnlen (a, ACPI_NAMESEG_SIZE) == ACPI_NAMESEG_SIZE)
>  
>  /*
> - * Algorithm to obtain access bit width.
> - * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
> + * Algorithm to obtain access bit or byte width.
> + * Can be used with AccessSize field of ACPI_GENERIC_ADDRESS and
>   * ACPI_RESOURCE_GENERIC_REGISTER.
>   */
> -#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
> +#define ACPI_ACCESS_BIT_WIDTH(AccessSize)   (1 << ((AccessSize) + 2))
> +#define ACPI_ACCESS_BYTE_WIDTH(AccessSize)  (1 << ((AccessSize) - 1))
>  
>  
>  /*******************************************************************************
> 


Acked-by: Ivan Hu <ivan.hu@canonical.com>
Alex Hung Feb. 24, 2020, 6:36 a.m. UTC | #2
On 2020-02-23 5:13 p.m., Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/hyperkitty/list/devel@acpica.org/thread/Z5YA7FWAFECPLPNLRNKI6P4THAR5YSCU
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/acpica/source/common/adisasm.c            |  19 +-
>  src/acpica/source/common/dmtables.c           |   1 -
>  src/acpica/source/compiler/aslanalyze.c       |  14 +-
>  src/acpica/source/compiler/aslcompile.c       |  16 +-
>  src/acpica/source/compiler/aslcompiler.h      |  17 +-
>  src/acpica/source/compiler/aslexternal.c      |  44 +++-
>  src/acpica/source/compiler/aslload.c          | 226 ++++++++++++++----
>  src/acpica/source/compiler/aslmessages.c      |  13 +-
>  src/acpica/source/compiler/aslmessages.h      |  10 +
>  src/acpica/source/compiler/aslmethod.c        | 205 +++++++++++++---
>  src/acpica/source/compiler/aslparseop.c       |  13 +-
>  src/acpica/source/compiler/aslprimaries.y     |   2 +-
>  src/acpica/source/compiler/aslrules.y         |  23 +-
>  src/acpica/source/compiler/asltransform.c     |  84 ++++++-
>  src/acpica/source/compiler/aslutils.c         |  41 +++-
>  src/acpica/source/compiler/aslxref.c          |  57 +----
>  src/acpica/source/compiler/cvparser.c         |  16 +-
>  src/acpica/source/components/events/evevent.c |   2 +-
>  src/acpica/source/components/events/evxfgpe.c |  38 +++
>  src/acpica/source/components/hardware/hwgpe.c |  79 ++++++
>  .../source/components/hardware/hwsleep.c      |  10 +
>  .../source/components/namespace/nsnames.c     |   6 +-
>  .../source/components/namespace/nsxfname.c    |   2 +-
>  src/acpica/source/components/tables/tbxface.c |  12 +-
>  .../source/components/utilities/utobject.c    |   2 +-
>  src/acpica/source/include/acconvert.h         |   3 +-
>  src/acpica/source/include/achware.h           |   4 +
>  src/acpica/source/include/acmacros.h          |   4 +-
>  src/acpica/source/include/acpixf.h            |   6 +-
>  src/acpica/source/include/actbl1.h            |   2 +-
>  src/acpica/source/include/actypes.h           |   7 +-
>  31 files changed, 775 insertions(+), 203 deletions(-)
> 
> diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
> index 60bd5fda..015765ff 100644
> --- a/src/acpica/source/common/adisasm.c
> +++ b/src/acpica/source/common/adisasm.c
> @@ -156,6 +156,7 @@
>  #include "acnamesp.h"
>  #include "acparser.h"
>  #include "acapps.h"
> +#include "acconvert.h"
>  
>  
>  #define _COMPONENT          ACPI_TOOLS
> @@ -379,8 +380,6 @@ AdAmlDisassemble (
>              Status = AE_ERROR;
>              goto Cleanup;
>          }
> -
> -        AcpiOsRedirectOutput (File);
>      }
>  
>      *OutFilename = DisasmFilename;
> @@ -467,6 +466,11 @@ AdDisassembleOneTable (
>  
>      if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
>      {
> +        if (File)
> +        {
> +            AcpiOsRedirectOutput (File);
> +        }
> +
>          AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE);
>  
>          /* This is a "Data Table" (non-AML table) */
> @@ -489,6 +493,10 @@ AdDisassembleOneTable (
>          return (AE_OK);
>      }
>  
> +    /* Initialize the converter output file */
> +
> +    ASL_CV_INIT_FILETREE(Table, File);
> +
>      /*
>       * This is an AML table (DSDT or SSDT).
>       * Always parse the tables, only option is what to display
> @@ -501,6 +509,13 @@ AdDisassembleOneTable (
>          return (Status);
>      }
>  
> +    /* Redirect output for code generation and debugging output */
> +
> +    if (File)
> +    {
> +        AcpiOsRedirectOutput (File);
> +    }
> +
>      /* Debug output, namespace and parse tree */
>  
>      if (AslCompilerdebug && File)
> diff --git a/src/acpica/source/common/dmtables.c b/src/acpica/source/common/dmtables.c
> index 3bc9c07a..ee18d26c 100644
> --- a/src/acpica/source/common/dmtables.c
> +++ b/src/acpica/source/common/dmtables.c
> @@ -506,7 +506,6 @@ AdParseTable (
>  
>      AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
>      AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
> -    ASL_CV_INIT_FILETREE(Table, AmlStart, AmlLength);
>  
>      AcpiUtSetIntegerWidth (Table->Revision);
>  
> diff --git a/src/acpica/source/compiler/aslanalyze.c b/src/acpica/source/compiler/aslanalyze.c
> index 9139f4e9..63feba2b 100644
> --- a/src/acpica/source/compiler/aslanalyze.c
> +++ b/src/acpica/source/compiler/aslanalyze.c
> @@ -151,6 +151,7 @@
>  
>  #include "aslcompiler.h"
>  #include "aslcompiler.y.h"
> +#include "acnamesp.h"
>  #include <string.h>
>  
>  
> @@ -421,6 +422,7 @@ AnCheckMethodReturnValue (
>  {
>      ACPI_PARSE_OBJECT       *OwningOp;
>      ACPI_NAMESPACE_NODE     *Node;
> +    char                    *ExternalPath;
>  
>  
>      Node = ArgOp->Asl.Node;
> @@ -435,18 +437,19 @@ AnCheckMethodReturnValue (
>      /* Examine the parent op of this method */
>  
>      OwningOp = Node->Op;
> +    ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE);
> +
>      if (OwningOp->Asl.CompileFlags & OP_METHOD_NO_RETVAL)
>      {
>          /* Method NEVER returns a value */
>  
> -        AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, Op->Asl.ExternalName);
> +        AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, ExternalPath);
>      }
>      else if (OwningOp->Asl.CompileFlags & OP_METHOD_SOME_NO_RETVAL)
>      {
>          /* Method SOMETIMES returns a value, SOMETIMES not */
>  
> -        AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL,
> -            Op, Op->Asl.ExternalName);
> +        AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL, Op, ExternalPath);
>      }
>      else if (!(ThisNodeBtype & RequiredBtypes))
>      {
> @@ -470,6 +473,11 @@ AnCheckMethodReturnValue (
>              AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, AslGbl_MsgBuffer);
>          }
>      }
> +
> +    if (ExternalPath)
> +    {
> +        ACPI_FREE (ExternalPath);
> +    }
>  }
>  
>  
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 0f145560..9481b6bb 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -647,7 +647,7 @@ void
>  AslCompilerFileHeader (
>      UINT32                  FileId)
>  {
> -    struct tm               *NewTime;
> +    char                    *NewTime;
>      time_t                  Aclock;
>      char                    *Prefix = "";
>  
> @@ -691,13 +691,17 @@ AslCompilerFileHeader (
>  
>      /* Compilation header with timestamp */
>  
> -    (void) time (&Aclock);
> -    NewTime = localtime (&Aclock);
> +    Aclock = time (NULL);
> +    NewTime = ctime (&Aclock);
>  
>      FlPrintFile (FileId,
> -        "%sCompilation of \"%s\" - %s%s\n",
> -        Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename, asctime (NewTime),
> -        Prefix);
> +        "%sCompilation of \"%s\" -",
> +        Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename);
> +
> +    if (NewTime)
> +    {
> +        FlPrintFile (FileId, " %s%s\n", NewTime, Prefix);
> +    }
>  
>      switch (FileId)
>      {
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index e82a91e4..9bebc380 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -373,6 +373,15 @@ MtMethodAnalysisWalkEnd (
>      UINT32                  Level,
>      void                    *Context);
>  
> +UINT32
> +MtProcessTypeOp (
> +    ACPI_PARSE_OBJECT       *TypeOp);
> +
> +UINT8
> +MtProcessParameterTypeList (
> +    ACPI_PARSE_OBJECT       *ParamTypeOp,
> +    UINT32                  *TypeList);
> +
>  
>  /*
>   * aslbtypes - bitfield data types
> @@ -1233,10 +1242,14 @@ UtDumpBasicOp (
>      ACPI_PARSE_OBJECT       *Op,
>      UINT32                  Level);
>  
> -void *
> -UtGetParentMethod (
> +ACPI_NAMESPACE_NODE *
> +UtGetParentMethodNode (
>      ACPI_NAMESPACE_NODE     *Node);
>  
> +ACPI_PARSE_OBJECT *
> +UtGetParentMethodOp (
> +    ACPI_PARSE_OBJECT       *Op);
> +
>  BOOLEAN
>  UtNodeIsDescendantOf (
>      ACPI_NAMESPACE_NODE     *Node1,
> diff --git a/src/acpica/source/compiler/aslexternal.c b/src/acpica/source/compiler/aslexternal.c
> index 37f07e87..315247be 100644
> --- a/src/acpica/source/compiler/aslexternal.c
> +++ b/src/acpica/source/compiler/aslexternal.c
> @@ -192,12 +192,54 @@ ExDoExternal (
>      ACPI_PARSE_OBJECT       *Prev;
>      ACPI_PARSE_OBJECT       *Next;
>      ACPI_PARSE_OBJECT       *ArgCountOp;
> +    ACPI_PARSE_OBJECT       *TypeOp;
> +    ACPI_PARSE_OBJECT       *ExternTypeOp = Op->Asl.Child->Asl.Next;
> +    UINT32                  ExternType;
> +    UINT8                   ParamCount = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
> +    UINT32                  ParamTypes[ACPI_METHOD_NUM_ARGS];
>  
>  
> +    ExternType = AnMapObjTypeToBtype (ExternTypeOp);
> +
> +    /*
> +     * The parser allows optional parameter return types regardless of the
> +     * type. Check object type keyword emit error if optional parameter/return
> +     * types exist.
> +     *
> +     * Check the parameter return type
> +     */
> +    TypeOp = ExternTypeOp->Asl.Next;
> +    if (TypeOp->Asl.Child)
> +    {
> +        /* Ignore the return type for now. */
> +
> +        (void) MtProcessTypeOp (TypeOp->Asl.Child);
> +        if (ExternType != ACPI_BTYPE_METHOD)
> +        {
> +            sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
> +            AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_RET_TYPE, TypeOp,
> +                AslGbl_MsgBuffer);
> +        }
> +    }
> +
> +    /* Check the parameter types */
> +
> +    TypeOp = TypeOp->Asl.Next;
> +    if (TypeOp->Asl.Child)
> +    {
> +        ParamCount = MtProcessParameterTypeList (TypeOp->Asl.Child, ParamTypes);
> +        if (ExternType != ACPI_BTYPE_METHOD)
> +        {
> +            sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
> +            AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_PARAM_TYPE, TypeOp,
> +                AslGbl_MsgBuffer);
> +        }
> +    }
> +
>      ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next;
>      ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
>      ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
> -    ArgCountOp->Asl.Value.Integer = 0;
> +    ArgCountOp->Asl.Value.Integer = ParamCount;
>      UtSetParseOpName (ArgCountOp);
>  
>      /* Create new list node of arbitrary type */
> diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c
> index d9728206..0d26c641 100644
> --- a/src/acpica/source/compiler/aslload.c
> +++ b/src/acpica/source/compiler/aslload.c
> @@ -196,6 +196,15 @@ LdCheckSpecialNames (
>      ACPI_NAMESPACE_NODE     *Node,
>      ACPI_PARSE_OBJECT       *Op);
>  
> +static ACPI_STATUS
> +LdAnalyzeExternals (
> +    ACPI_NAMESPACE_NODE     *Node,
> +    ACPI_PARSE_OBJECT       *Op,
> +    ACPI_OBJECT_TYPE        ExternalOpType,
> +    ACPI_OBJECT_TYPE        ObjectType,
> +    ACPI_WALK_STATE         *WalkState);
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    LdLoadNamespace
> @@ -575,7 +584,8 @@ LdNamespace1Begin (
>      /* Check for a possible illegal forward reference */
>  
>      if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
> -        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
> +        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
> +        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
>      {
>          /*
>           * Op->Asl.Namepath will be NULL for these opcodes.
> @@ -591,7 +601,8 @@ LdNamespace1Begin (
>           * We only want references to named objects:
>           *      Store (2, WXYZ) -> Attempt to resolve the name
>           */
> -        if (OpInfo->Class == AML_CLASS_NAMED_OBJECT)
> +        if ((Op->Asl.ParseOpcode != PARSEOP_METHODCALL) &&
> +            (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
>          {
>              return (AE_OK);
>          }
> @@ -899,56 +910,24 @@ LdNamespace1Begin (
>                  Node->Type = (UINT8) ObjectType;
>                  Status = AE_OK;
>              }
> -            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> -                     (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
> +            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) ||
> +                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
>              {
> -                /*
> -                 * Allow one create on an object or segment that was
> -                 * previously declared External
> -                 */
> -                Node->Flags &= ~ANOBJ_IS_EXTERNAL;
> -                Node->Type = (UINT8) ObjectType;
> -
> -                /* Just retyped a node, probably will need to open a scope */
> -
> -                if (AcpiNsOpensScope (ObjectType))
> +                Status = LdAnalyzeExternals (Node, Op, ActualObjectType,
> +                    ObjectType, WalkState);
> +                if (ACPI_FAILURE (Status))
>                  {
> -                    Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
> -                    if (ACPI_FAILURE (Status))
> +                    if (Status == AE_ERROR)
>                      {
> -                        return_ACPI_STATUS (Status);
> +                        /*
> +                         * The use of AE_ERROR here indicates that there was a
> +                         * compiler error emitted in LdAnalyzeExternals which
> +                         * means that the caller should proceed to the next Op
> +                         * for analysis of subsequent parse objects.
> +                         */
> +                        Status = AE_OK;
>                      }
> -                }
> -
> -                Status = AE_OK;
> -            }
> -            else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
> -                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
> -            {
> -                /*
> -                 * Allow externals in same scope as the definition of the
> -                 * actual object. Similar to C. Allows multiple definition
> -                 * blocks that refer to each other in the same file.
> -                 */
> -                Status = AE_OK;
> -            }
> -            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> -                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
> -                     (ObjectType == ACPI_TYPE_ANY))
> -            {
> -                /* Allow update of externals of unknown type. */
> -
> -                if (AcpiNsOpensScope (ActualObjectType))
> -                {
> -                    Node->Type = (UINT8) ActualObjectType;
> -                    Status = AE_OK;
> -                }
> -                else
> -                {
> -                    sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
> -                        AcpiUtGetTypeName (Node->Type));
> -                    AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer);
> -                    return_ACPI_STATUS (AE_OK);
> +                    return_ACPI_STATUS (Status);
>                  }
>              }
>              else
> @@ -1013,15 +992,17 @@ FinishNode:
>       * Set the actual data type if appropriate (EXTERNAL term only)
>       * As of 11/19/2019, ASL External() does not support parameter
>       * counts. When an External method is loaded, the parameter count is
> -     * unknown setting Node->Value to ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS
> -     * indicates that the parameter count for this method is unknown.
> -     * This information is used in ASL cross reference to help determine the
> -     * parameter count through method calls.
> +     * recorded in the external's arg count parameter. The parameter count may
> +     * or may not be known in the declaration. If the value of this node turns
> +     * out to be ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS, it indicates that
> +     * we do not know the parameter count and that we must look at the usage of
> +     * the External method call to get this information.
>       */
>      if (ActualObjectType != ACPI_TYPE_ANY)
>      {
>          Node->Type = (UINT8) ActualObjectType;
> -        Node->Value = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
> +        Node->Value = (UINT32)
> +            Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer;
>      }
>  
>      if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
> @@ -1037,6 +1018,145 @@ FinishNode:
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    LdAnalyzeExternals
> + *
> + * PARAMETERS:  Node            - Node that represents the named object
> + *              Op              - Named object declaring this named object
> + *              ExternalOpType  - Type of ExternalOp
> + *              ObjectType      - Type of Declared object
> + *              WalkState       - Current WalkState
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Node and Op represents an identically named object declaration
> + *              that is either declared by the ASL external keyword or declared
> + *              by operators that declare named objects (i.e. Name, Device,
> + *              OperationRegion, and etc.). This function ensures that the
> + *              declarations do not contradict each other.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +LdAnalyzeExternals (
> +    ACPI_NAMESPACE_NODE     *Node,
> +    ACPI_PARSE_OBJECT       *Op,
> +    ACPI_OBJECT_TYPE        ExternalOpType,
> +    ACPI_OBJECT_TYPE        ObjectType,
> +    ACPI_WALK_STATE         *WalkState)
> +{
> +    ACPI_STATUS             Status = AE_OK;
> +    ACPI_OBJECT_TYPE        ActualExternalOpType;
> +    ACPI_OBJECT_TYPE        ActualOpType;
> +    ACPI_PARSE_OBJECT       *ExternalOp;
> +    ACPI_PARSE_OBJECT       *ActualOp;
> +
> +
> +    /*
> +     * The declaration represented by Node and Op must have the same type.
> +     * The type of the external Op is represented by ExternalOpType. However,
> +     * the type of the pre-existing declaration depends on whether if Op
> +     * is an external declaration or an actual declaration.
> +     */
> +    if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
> +    {
> +        ActualExternalOpType = ExternalOpType;
> +        ActualOpType = Node->Type;
> +    }
> +    else
> +    {
> +        ActualExternalOpType = Node->Type;
> +        ActualOpType = ObjectType;
> +    }
> +
> +    if ((ActualOpType != ACPI_TYPE_ANY) &&
> +        (ActualExternalOpType != ACPI_TYPE_ANY) &&
> +        (ActualExternalOpType != ActualOpType))
> +    {
> +        if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
> +            Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
> +        {
> +            AslDualParseOpError (ASL_ERROR,
> +                ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL,
> +                ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL);
> +        }
> +        else
> +        {
> +            if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
> +                Node->Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)
> +            {
> +                ExternalOp = Op;
> +                ActualOp = Node->Op;
> +            }
> +            else
> +            {
> +                ExternalOp = Node->Op;
> +                ActualOp = Op;
> +            }
> +            AslDualParseOpError (ASL_ERROR,
> +                ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL,
> +                ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL);
> +        }
> +    }
> +
> +    if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> +        (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
> +    {
> +        /*
> +         * Allow one create on an object or segment that was
> +         * previously declared External
> +         */
> +        Node->Flags &= ~ANOBJ_IS_EXTERNAL;
> +        Node->Type = (UINT8) ObjectType;
> +
> +        /* Just retyped a node, probably will need to open a scope */
> +
> +        if (AcpiNsOpensScope (ObjectType))
> +        {
> +            Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
> +            if (ACPI_FAILURE (Status))
> +            {
> +                return (Status);
> +            }
> +        }
> +
> +        Status = AE_OK;
> +    }
> +    else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
> +             (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
> +    {
> +        /*
> +         * Allow externals in same scope as the definition of the
> +         * actual object. Similar to C. Allows multiple definition
> +         * blocks that refer to each other in the same file.
> +         */
> +        Status = AE_OK;
> +    }
> +    else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
> +             (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
> +             (ObjectType == ACPI_TYPE_ANY))
> +    {
> +        /* Allow update of externals of unknown type. */
> +
> +        if (AcpiNsOpensScope (ExternalOpType))
> +        {
> +            Node->Type = (UINT8) ExternalOpType;
> +            Status = AE_OK;
> +        }
> +        else
> +        {
> +            sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
> +                AcpiUtGetTypeName (Node->Type));
> +            AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer);
> +            Status = AE_ERROR;
> +        }
> +    }
> +
> +    return (Status);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    LdCheckSpecialNames
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index 418df32c..81280b28 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -320,7 +320,7 @@ const char                      *AslCompilerMsgs [] =
>  /*    ASL_MSG_SCOPE_TYPE */                 "Existing object has invalid type for Scope operator",
>  /*    ASL_MSG_SEEK */                       "Could not seek file",
>  /*    ASL_MSG_SERIALIZED */                 "Control Method marked Serialized",
> -/*    ASL_MSG_SERIALIZED_REQUIRED */        "Control Method should be made Serialized",
> +/*    ASL_MSG_SERIALIZED_REQUIRED */        "Control Method should be made Serialized due to creation of named objects within",
>  /*    ASL_MSG_SINGLE_NAME_OPTIMIZATION */   "NamePath optimized to NameSeg (uses run-time search path)",
>  /*    ASL_MSG_SOME_NO_RETVAL */             "Called method may not always return a value",
>  /*    ASL_MSG_STRING_LENGTH */              "String literal too long",
> @@ -370,7 +370,16 @@ const char                      *AslCompilerMsgs [] =
>  /*    ASL_MSG_INVALID_PROCESSOR_UID */      "_UID inside processor declaration must be an integer",
>  /*    ASL_MSG_LEGACY_PROCESSOR_OP */        "Legacy Processor() keyword detected. Use Device() keyword instead.",
>  /*    ASL_MSG_NAMESTRING_LENGTH */          "NameString contains too many NameSegs (>255)",
> -/*    ASL_MSG_CASE_FOUND_HERE */            "Original Case value below:"
> +/*    ASL_MSG_CASE_FOUND_HERE */            "Original Case value below:",
> +/*    ASL_MSG_EXTERN_INVALID_RET_TYPE */    "Return type is only allowed for Externals declared as MethodObj",
> +/*    ASL_MSG_EXTERN_INVALID_PARAM_TYPE */  "Parameter type is only allowed for Externals declared as MethodObj",
> +/*    ASL_MSG_NAMED_OBJECT_CREATION */      "Creation of named objects within a method is highly inefficient, use globals or method local variables instead",
> +/*    ASL_MSG_ARG_COUNT_MISMATCH */         "Method NumArgs count does not match length of ParameterTypes list",
> +/*    ASL_MSG_STATIC_OPREGION_IN_METHOD */  "Static OperationRegion should be declared outside control method",
> +/*    ASL_MSG_DECLARATION_TYPE_MISMATCH */  "Type mismatch between external declaration and actual object declaration detected",
> +/*    ASL_MSG_TYPE_MISMATCH_FOUND_HERE */   "Actual object declaration:",
> +/*    ASL_MSG_DUPLICATE_EXTERN_MISMATCH */  "Type mismatch between multiple external declarations detected",
> +/*    ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE */"Duplicate external declaration:",
>  };
>  
>  /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index fb3513ab..6d5ffd4d 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -373,6 +373,16 @@ typedef enum
>      ASL_MSG_LEGACY_PROCESSOR_OP,
>      ASL_MSG_NAMESTRING_LENGTH,
>      ASL_MSG_CASE_FOUND_HERE,
> +    ASL_MSG_EXTERN_INVALID_RET_TYPE,
> +    ASL_MSG_EXTERN_INVALID_PARAM_TYPE,
> +    ASL_MSG_NAMED_OBJECT_CREATION,
> +    ASL_MSG_ARG_COUNT_MISMATCH,
> +    ASL_MSG_STATIC_OPREGION_IN_METHOD,
> +    ASL_MSG_DECLARATION_TYPE_MISMATCH,
> +    ASL_MSG_TYPE_MISMATCH_FOUND_HERE,
> +    ASL_MSG_DUPLICATE_EXTERN_MISMATCH,
> +    ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE,
> +
>  
>      /* These messages are used by the Data Table compiler only */
>  
> diff --git a/src/acpica/source/compiler/aslmethod.c b/src/acpica/source/compiler/aslmethod.c
> index b7b7ec42..d56f4817 100644
> --- a/src/acpica/source/compiler/aslmethod.c
> +++ b/src/acpica/source/compiler/aslmethod.c
> @@ -151,6 +151,7 @@
>  
>  #include "aslcompiler.h"
>  #include "aslcompiler.y.h"
> +#include "acnamesp.h"
>  #include "acparser.h"
>  #include "amlcode.h"
>  
> @@ -166,6 +167,10 @@ MtCheckNamedObjectInMethod (
>      ACPI_PARSE_OBJECT       *Op,
>      ASL_METHOD_INFO         *MethodInfo);
>  
> +static void
> +MtCheckStaticOperationRegionInMethod (
> +    ACPI_PARSE_OBJECT       *Op);
> +
>  
>  /*******************************************************************************
>   *
> @@ -197,7 +202,6 @@ MtMethodAnalysisWalkBegin (
>      char                    ArgName[] = "Arg0";
>      ACPI_PARSE_OBJECT       *ArgNode;
>      ACPI_PARSE_OBJECT       *NextType;
> -    ACPI_PARSE_OBJECT       *NextParamType;
>      UINT8                   ActualArgs = 0;
>      BOOLEAN                 HidExists;
>      BOOLEAN                 AdrExists;
> @@ -282,50 +286,35 @@ MtMethodAnalysisWalkBegin (
>          Next = Next->Asl.Next;
>  
>          NextType = Next->Asl.Child;
> -        while (NextType)
> -        {
> -            /* Get and map each of the ReturnTypes */
>  
> -            MethodInfo->ValidReturnTypes |= AnMapObjTypeToBtype (NextType);
> -            NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> -            NextType = NextType->Asl.Next;
> -        }
> +        MethodInfo->ValidReturnTypes = MtProcessTypeOp (NextType);
>  
>          /* Get the ParameterType node */
>  
>          Next = Next->Asl.Next;
>  
>          NextType = Next->Asl.Child;
> -        while (NextType)
> +        if (!NextType)
>          {
> -            if (NextType->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> -            {
> -                NextParamType = NextType->Asl.Child;
> -                while (NextParamType)
> -                {
> -                    MethodInfo->ValidArgTypes[ActualArgs] |=
> -                        AnMapObjTypeToBtype (NextParamType);
> -
> -                    NextParamType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> -                    NextParamType = NextParamType->Asl.Next;
> -                }
> -            }
> -            else
> -            {
> -                MethodInfo->ValidArgTypes[ActualArgs] =
> -                    AnMapObjTypeToBtype (NextType);
> -
> -                NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> -                ActualArgs++;
> -            }
> -
> -            NextType = NextType->Asl.Next;
> +            /*
> +             * The optional parameter types list was omitted  at the source
> +             * level. Use the Argument count parameter instead.
> +             */
> +            ActualArgs = MethodInfo->NumArguments;
> +        }
> +        else
> +        {
> +            ActualArgs = MtProcessParameterTypeList (NextType,
> +                MethodInfo->ValidArgTypes);
>          }
>  
>          if ((MethodInfo->NumArguments) &&
>              (MethodInfo->NumArguments != ActualArgs))
>          {
> -            /* error: Param list did not match number of args */
> +            sprintf (AslGbl_MsgBuffer,
> +                "Length = %u", ActualArgs);
> +            AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_MISMATCH,
> +                Op->Asl.Child->Asl.Next, AslGbl_MsgBuffer);
>          }
>  
>          /* Allow numarguments == 0 for Function() */
> @@ -576,6 +565,8 @@ MtMethodAnalysisWalkBegin (
>              AslError (ASL_ERROR, ASL_MSG_RESERVED_USE,
>                  Op, Op->Asl.ExternalName);
>          }
> +
> +        MtCheckStaticOperationRegionInMethod (Op);
>          break;
>  
>      case PARSEOP_NAME:
> @@ -628,6 +619,71 @@ MtMethodAnalysisWalkBegin (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    MtProcessTypeOp
> + *
> + * PARAMETERS:  Op                  - Op representing a btype
> + *
> + * RETURN:      Btype represented by Op
> + *
> + * DESCRIPTION: Process a parse object that represents single parameter type or
> + *              a return type in method, function, and external declarations.
> + *
> + ******************************************************************************/
> +
> +UINT32
> +MtProcessTypeOp (
> +    ACPI_PARSE_OBJECT       *TypeOp)
> +{
> +    UINT32                  Btype = ACPI_BTYPE_ANY;
> +
> +
> +    while (TypeOp)
> +    {
> +        Btype |= AnMapObjTypeToBtype (TypeOp);
> +        TypeOp->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> +        TypeOp = TypeOp->Asl.Next;
> +    }
> +
> +    return (Btype);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    MtProcessParameterTypeList
> + *
> + * PARAMETERS:  Op                  - Op representing a btype
> + *
> + * RETURN:      Btype represented by Op
> + *
> + * DESCRIPTION: Process a parse object that represents a parameter type list in
> + *              method, function, and external declarations.
> + *
> + ******************************************************************************/
> +
> +UINT8
> +MtProcessParameterTypeList (
> +    ACPI_PARSE_OBJECT       *ParamTypeOp,
> +    UINT32                  *TypeList)
> +{
> +    UINT8                   ParameterCount = 0;
> +
> +
> +    while (ParamTypeOp)
> +    {
> +        TypeList[ParameterCount] =
> +            MtProcessTypeOp (ParamTypeOp->Asl.Child);
> +
> +        ParameterCount++;
> +        ParamTypeOp = ParamTypeOp->Asl.Next;
> +    }
> +
> +    return (ParameterCount);
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    MtCheckNamedObjectInMethod
> @@ -649,6 +705,7 @@ MtCheckNamedObjectInMethod (
>      ASL_METHOD_INFO         *MethodInfo)
>  {
>      const ACPI_OPCODE_INFO  *OpInfo;
> +    char                    *ExternalPath;
>  
>  
>      /* We don't care about actual method declarations or scopes */
> @@ -672,27 +729,97 @@ MtCheckNamedObjectInMethod (
>          /*
>           * 1) Mark the method as a method that creates named objects.
>           *
> -         * 2) If the method is non-serialized, emit a remark that the method
> +         * 2) Issue a remark indicating the inefficiency of creating named
> +         * objects within a method (Except for compiler-emitted temporary
> +         * variables).
> +         *
> +         * 3) If the method is non-serialized, emit a remark that the method
>           * should be serialized.
>           *
>           * Reason: If a thread blocks within the method for any reason, and
>           * another thread enters the method, the method will fail because
>           * an attempt will be made to create the same object twice.
>           */
> +        ExternalPath = AcpiNsGetNormalizedPathname (MethodInfo->Op->Asl.Node, TRUE);
> +
> +        /* No error for compiler temp variables (name starts with "_T_") */
> +
> +        if ((Op->Asl.NameSeg[0] != '_') &&
> +            (Op->Asl.NameSeg[1] != 'T') &&
> +            (Op->Asl.NameSeg[2] != '_'))
> +        {
> +            AslError (ASL_REMARK, ASL_MSG_NAMED_OBJECT_CREATION, Op,
> +                ExternalPath);
> +        }
> +
>          MethodInfo->CreatesNamedObjects = TRUE;
>          if (!MethodInfo->ShouldBeSerialized)
>          {
>              AslError (ASL_REMARK, ASL_MSG_SERIALIZED_REQUIRED, MethodInfo->Op,
> -                "due to creation of named objects within");
> +                ExternalPath);
>  
>              /* Emit message only ONCE per method */
>  
>              MethodInfo->ShouldBeSerialized = TRUE;
>          }
> +
> +        if (ExternalPath)
> +        {
> +            ACPI_FREE (ExternalPath);
> +        }
>      }
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    MtCheckStaticOperationRegionInMethod
> + *
> + * PARAMETERS:  Op                  - Current parser op
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Warns if an Operation Region with static address or length
> + *              is declared inside a control method
> + *
> + ******************************************************************************/
> +
> +static void
> +MtCheckStaticOperationRegionInMethod(
> +    ACPI_PARSE_OBJECT*       Op)
> +{
> +    ACPI_PARSE_OBJECT*       AddressOp;
> +    ACPI_PARSE_OBJECT*       LengthOp;
> +
> +
> +    if (Op->Asl.ParseOpcode != PARSEOP_OPERATIONREGION)
> +    {
> +        return;
> +    }
> +
> +    /*
> +     * OperationRegion should have 4 arguments defined. At this point, we
> +     * assume that the parse tree is well-formed.
> +     */
> +    AddressOp = Op->Asl.Child->Asl.Next->Asl.Next;
> +    LengthOp = Op->Asl.Child->Asl.Next->Asl.Next->Asl.Next;
> +
> +    if (UtGetParentMethodOp (Op) &&
> +        AddressOp->Asl.ParseOpcode == PARSEOP_INTEGER &&
> +        LengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)
> +    {
> +        /*
> +         * At this point, a static operation region declared inside of a
> +         * control method has been found. Throw a warning because this is
> +         * highly inefficient.
> +         */
> +        AslError(ASL_WARNING, ASL_MSG_STATIC_OPREGION_IN_METHOD, Op, NULL);
> +    }
> +
> +    return;
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    MtMethodAnalysisWalkEnd
> @@ -714,6 +841,7 @@ MtMethodAnalysisWalkEnd (
>  {
>      ASL_ANALYSIS_WALK_INFO  *WalkInfo = (ASL_ANALYSIS_WALK_INFO *) Context;
>      ASL_METHOD_INFO         *MethodInfo = WalkInfo->MethodStack;
> +    char                    *ExternalPath;
>  
>  
>      switch (Op->Asl.ParseOpcode)
> @@ -766,8 +894,15 @@ MtMethodAnalysisWalkEnd (
>          if (MethodInfo->NumReturnNoValue &&
>              MethodInfo->NumReturnWithValue)
>          {
> +            ExternalPath = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
> +
>              AslError (ASL_WARNING, ASL_MSG_RETURN_TYPES, Op,
> -                Op->Asl.ExternalName);
> +                ExternalPath);
> +
> +            if (ExternalPath)
> +            {
> +                ACPI_FREE (ExternalPath);
> +            }
>          }
>  
>          /*
> diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c
> index b58d4e66..46875413 100644
> --- a/src/acpica/source/compiler/aslparseop.c
> +++ b/src/acpica/source/compiler/aslparseop.c
> @@ -743,13 +743,18 @@ TrCreateConstantLeafOp (
>  
>          /* Get a copy of the current time */
>  
> +        Op->Asl.Value.String = "";
>          CurrentTime = time (NULL);
> +
>          StaticTimeString = ctime (&CurrentTime);
> -        TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1);
> -        strcpy (TimeString, StaticTimeString);
> +        if (StaticTimeString)
> +        {
> +            TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1);
> +            strcpy (TimeString, StaticTimeString);
>  
> -        TimeString[strlen(TimeString) -1] = 0;  /* Remove trailing newline */
> -        Op->Asl.Value.String = TimeString;
> +            TimeString[strlen(TimeString) -1] = 0;  /* Remove trailing newline */
> +            Op->Asl.Value.String = TimeString;
> +        }
>          break;
>  
>      default: /* This would be an internal error */
> diff --git a/src/acpica/source/compiler/aslprimaries.y b/src/acpica/source/compiler/aslprimaries.y
> index 7bbf4155..1fb9e501 100644
> --- a/src/acpica/source/compiler/aslprimaries.y
> +++ b/src/acpica/source/compiler/aslprimaries.y
> @@ -663,7 +663,7 @@ FunctionTerm
>          PARSEOP_CLOSE_PAREN '{'     {COMMENT_CAPTURE_ON; }
>              TermList '}'            {$$ = TrLinkOpChildren ($<n>3,7,
>                                          TrSetOpFlags ($4, OP_IS_NAME_DECLARATION),
> -                                        TrCreateValuedLeafOp (PARSEOP_BYTECONST, 0),
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),
>                                          TrCreateLeafOp (PARSEOP_SERIALIZERULE_NOTSERIAL),
>                                          TrCreateValuedLeafOp (PARSEOP_BYTECONST, 0),$5,$6,$10);}
>      | PARSEOP_FUNCTION
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index 9035e8bb..f998527b 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -421,14 +421,16 @@ ParameterTypePackage
>  
>  ParameterTypePackageList
>      :                               {$$ = NULL;}
> -    | ObjectTypeKeyword             {$$ = $1;}
> -    | '{' ParameterTypePackage '}'  {$$ = $2;}
> +    | ObjectTypeKeyword             {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$1);}
> +    | '{' ParameterTypePackage '}'  {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
>      ;
>  
> +
>  OptionalParameterTypePackage
> -    :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
> -    | ',' ParameterTypePackageList  {$$ = TrLinkOpChildren (
> -                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
> +    :                               {$$ = NULL;}
> +    | ',' ParameterTypePackageList  {$$ = $2;}
>      ;
>  
>      /* Rules for specifying the types for method arguments */
> @@ -441,14 +443,15 @@ ParameterTypesPackage
>  
>  ParameterTypesPackageList
>      :                               {$$ = NULL;}
> -    | ObjectTypeKeyword             {$$ = $1;}
> -    | '{' ParameterTypesPackage '}' {$$ = $2;}
> +    | ObjectTypeKeyword             {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$1);}
> +    | '{' ParameterTypesPackage '}' {$$ = TrLinkOpChildren (
> +                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
>      ;
>  
>  OptionalParameterTypesPackage
> -    :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
> -    | ',' ParameterTypesPackageList {$$ = TrLinkOpChildren (
> -                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
> +    :                               {$$ = NULL;}
> +    | ',' ParameterTypesPackageList {$$ = $2;}
>      ;
>  
>  /*
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index dcb60f7a..67adf82e 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -205,6 +205,10 @@ TrCheckForBufferMatch (
>      ACPI_PARSE_OBJECT       *Next1,
>      ACPI_PARSE_OBJECT       *Next2);
>  
> +static void
> +TrDoMethod (
> +    ACPI_PARSE_OBJECT       *Op);
> +
>  
>  /*******************************************************************************
>   *
> @@ -463,11 +467,8 @@ TrTransformSubtree (
>          break;
>  
>      case PARSEOP_METHOD:
> -        /*
> -         * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
> -         * however
> -         */
> -        AslGbl_TempCount = 0;
> +
> +        TrDoMethod (Op);
>          break;
>  
>      case PARSEOP_EXTERNAL:
> @@ -1240,3 +1241,76 @@ TrCheckForBufferMatch (
>  
>      return (TRUE);
>  }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    TrDoMethod
> + *
> + * PARAMETERS:  Op               - Parse node for SWITCH
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Determine that parameter count of an ASL method node by
> + *              translating the parameter count parse node from
> + *              PARSEOP_DEFAULT_ARG to PARSEOP_BYTECONST.
> + *
> + ******************************************************************************/
> +
> +static void
> +TrDoMethod (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +    ACPI_PARSE_OBJECT           *ArgCountOp;
> +    UINT8                       ArgCount;
> +    ACPI_PARSE_OBJECT           *ParameterOp;
> +
> +
> +    /*
> +     * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
> +     * however
> +     */
> +    AslGbl_TempCount = 0;
> +
> +    ArgCountOp = Op->Asl.Child->Asl.Next;
> +    if (ArgCountOp->Asl.ParseOpcode == PARSEOP_BYTECONST)
> +    {
> +        /*
> +         * Parameter count for this method has already been recorded in the
> +         * method declaration.
> +         */
> +        return;
> +    }
> +
> +    /*
> +     * Parameter count has been omitted in the method declaration.
> +     * Count the amount of arguments here.
> +     */
> +    ParameterOp = ArgCountOp->Asl.Next->Asl.Next->Asl.Next->Asl.Next;
> +    if (ParameterOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> +    {
> +        ArgCount = 0;
> +        ParameterOp = ParameterOp->Asl.Child;
> +
> +        while (ParameterOp)
> +        {
> +            ParameterOp = ParameterOp->Asl.Next;
> +            ArgCount++;
> +        }
> +
> +        ArgCountOp->Asl.Value.Integer = ArgCount;
> +        ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
> +    }
> +    else
> +    {
> +        /*
> +         * Method parameters can be counted by analyzing the Parameter type
> +         * list. If the Parameter list contains more than 1 parameter, it
> +         * is nested under PARSEOP_DEFAULT_ARG. When there is only 1
> +         * parameter, the parse tree contains a single node representing
> +         * that type.
> +         */
> +        ArgCountOp->Asl.Value.Integer = 1;
> +        ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
> +    }
> +}
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 4233318f..42ef2c0b 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -298,7 +298,7 @@ UtNodeIsDescendantOf (
>  
>  /*******************************************************************************
>   *
> - * FUNCTION:    UtGetParentMethod
> + * FUNCTION:    UtGetParentMethodNode
>   *
>   * PARAMETERS:  Node                    - Namespace node for any object
>   *
> @@ -309,8 +309,8 @@ UtNodeIsDescendantOf (
>   *
>   ******************************************************************************/
>  
> -void *
> -UtGetParentMethod (
> +ACPI_NAMESPACE_NODE *
> +UtGetParentMethodNode (
>      ACPI_NAMESPACE_NODE     *Node)
>  {
>      ACPI_NAMESPACE_NODE     *ParentNode;
> @@ -338,6 +338,41 @@ UtGetParentMethod (
>  }
>  
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    UtGetParentMethodOp
> + *
> + * PARAMETERS:  Op                      - Parse Op to be checked
> + *
> + * RETURN:      Control method Op if found. NULL otherwise
> + *
> + * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
> + *              the input Op is not within a control method.
> + *
> + ******************************************************************************/
> +
> +ACPI_PARSE_OBJECT *
> +UtGetParentMethodOp (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +    ACPI_PARSE_OBJECT       *NextOp;
> +
> +
> +    NextOp = Op->Asl.Parent;
> +    while (NextOp)
> +    {
> +        if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
> +        {
> +            return (NextOp);
> +        }
> +
> +        NextOp = NextOp->Asl.Parent;
> +    }
> +
> +    return (NULL); /* No parent method found */
> +}
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    UtDisplaySupportedTables
> diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
> index 2649373f..38356aa2 100644
> --- a/src/acpica/source/compiler/aslxref.c
> +++ b/src/acpica/source/compiler/aslxref.c
> @@ -180,10 +180,6 @@ XfValidateCrossReference (
>      const ACPI_OPCODE_INFO  *OpInfo,
>      ACPI_NAMESPACE_NODE     *Node);
>  
> -static ACPI_PARSE_OBJECT *
> -XfGetParentMethod (
> -    ACPI_PARSE_OBJECT       *Op);
> -
>  static BOOLEAN
>  XfObjectExists (
>      char                    *Name);
> @@ -380,41 +376,6 @@ XfCheckFieldRange (
>  }
>  
>  
> -/*******************************************************************************
> - *
> - * FUNCTION:    XfGetParentMethod
> - *
> - * PARAMETERS:  Op                      - Parse Op to be checked
> - *
> - * RETURN:      Control method Op if found. NULL otherwise
> - *
> - * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
> - *              the input Op is not within a control method.
> - *
> - ******************************************************************************/
> -
> -static ACPI_PARSE_OBJECT *
> -XfGetParentMethod (
> -    ACPI_PARSE_OBJECT       *Op)
> -{
> -    ACPI_PARSE_OBJECT       *NextOp;
> -
> -
> -    NextOp = Op->Asl.Parent;
> -    while (NextOp)
> -    {
> -        if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
> -        {
> -            return (NextOp);
> -        }
> -
> -        NextOp = NextOp->Asl.Parent;
> -    }
> -
> -    return (NULL); /* No parent method found */
> -}
> -
> -
>  /*******************************************************************************
>   *
>   * FUNCTION:    XfNamespaceLocateBegin
> @@ -539,7 +500,7 @@ XfNamespaceLocateBegin (
>      {
>          /* Find parent method Op */
>  
> -        NextOp = XfGetParentMethod (Op);
> +        NextOp = UtGetParentMethodOp (Op);
>          if (!NextOp)
>          {
>              return_ACPI_STATUS (AE_OK);
> @@ -576,7 +537,7 @@ XfNamespaceLocateBegin (
>      {
>          /* Find parent method Op */
>  
> -        NextOp = XfGetParentMethod (Op);
> +        NextOp = UtGetParentMethodOp (Op);
>          if (!NextOp)
>          {
>              return_ACPI_STATUS (AE_OK);
> @@ -814,10 +775,10 @@ XfNamespaceLocateBegin (
>           * same method or outside of any method, this is a forward reference
>           * and should be reported as a compiler error.
>           */
> -        DeclarationParentMethod = UtGetParentMethod (Node);
> -        ReferenceParentMethod = XfGetParentMethod (Op);
> +        DeclarationParentMethod = UtGetParentMethodNode (Node);
> +        ReferenceParentMethod = UtGetParentMethodOp (Op);
>  
> -        /* case 1: declaration and refrence are both outside of method */
> +        /* case 1: declaration and reference are both outside of method */
>  
>          if (!ReferenceParentMethod && !DeclarationParentMethod)
>          {
> @@ -1337,8 +1298,8 @@ XfNamespaceLocateEnd (
>   *                                      execution of A)
>   *
>   * NOTES:
> - *      A null pointer returned by either XfGetParentMethod or
> - *      UtGetParentMethod indicates that the parameter object is not
> + *      A null pointer returned by either UtGetParentMethodOp or
> + *      UtGetParentMethodNode indicates that the parameter object is not
>   *      within a control method.
>   *
>   *      Five cases are handled: Case(Op, Node)
> @@ -1371,8 +1332,8 @@ XfValidateCrossReference (
>       * 1) Search upwards in parse tree for owner of the referencing object
>       * 2) Search upwards in namespace to find the owner of the referenced object
>       */
> -    ReferencingMethodOp = XfGetParentMethod (Op);
> -    ReferencedMethodNode = UtGetParentMethod (Node);
> +    ReferencingMethodOp = UtGetParentMethodOp (Op);
> +    ReferencedMethodNode = UtGetParentMethodNode (Node);
>  
>      if (!ReferencingMethodOp && !ReferencedMethodNode)
>      {
> diff --git a/src/acpica/source/compiler/cvparser.c b/src/acpica/source/compiler/cvparser.c
> index 0e0a5b80..370b8036 100644
> --- a/src/acpica/source/compiler/cvparser.c
> +++ b/src/acpica/source/compiler/cvparser.c
> @@ -230,8 +230,7 @@ CvIsFilename (
>   * FUNCTION:    CvInitFileTree
>   *
>   * PARAMETERS:  Table      - input table
> - *              AmlStart   - Address of the starting point of the AML.
> - *              AmlLength  - Length of the AML file.
> + *              RootFile   - Output file that defines the DefinitionBlock
>   *
>   * RETURN:      None
>   *
> @@ -243,8 +242,7 @@ CvIsFilename (
>  void
>  CvInitFileTree (
>      ACPI_TABLE_HEADER       *Table,
> -    UINT8                   *AmlStart,
> -    UINT32                  AmlLength)
> +    FILE                    *RootFile)
>  {
>      UINT8                   *TreeAml;
>      UINT8                   *FileEnd;
> @@ -252,6 +250,8 @@ CvInitFileTree (
>      char                    *PreviousFilename = NULL;
>      char                    *ParentFilename = NULL;
>      char                    *ChildFilename = NULL;
> +    UINT8                   *AmlStart;
> +    UINT32                  AmlLength;
>  
>  
>      if (!AcpiGbl_CaptureComments)
> @@ -259,9 +259,13 @@ CvInitFileTree (
>          return;
>      }
>  
> +
> +    AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
> +    AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
> +
>      CvDbgPrint ("AmlLength: %x\n", AmlLength);
>      CvDbgPrint ("AmlStart:  %p\n", AmlStart);
> -    CvDbgPrint ("AmlEnd?:   %p\n", AmlStart+AmlLength);
> +    CvDbgPrint ("AmlEnd:    %p\n", AmlStart+AmlLength);
>  
>      AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
>  
> @@ -273,7 +277,7 @@ CvInitFileTree (
>  
>      /* Set the root file to the current open file */
>  
> -    AcpiGbl_FileTreeRoot->File = AcpiGbl_OutputFile;
> +    AcpiGbl_FileTreeRoot->File = RootFile;
>  
>      /*
>       * Set this to true because we don't need to output
> diff --git a/src/acpica/source/components/events/evevent.c b/src/acpica/source/components/events/evevent.c
> index 800dd962..0afc7473 100644
> --- a/src/acpica/source/components/events/evevent.c
> +++ b/src/acpica/source/components/events/evevent.c
> @@ -299,7 +299,7 @@ AcpiEvFixedEventInitialize (
>  
>      /*
>       * Initialize the structure that keeps track of fixed event handlers and
> -     * enable the fixed events.
> +     * disable all of the fixed events.
>       */
>      for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
>      {
> diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
> index 131021f1..d652c29f 100644
> --- a/src/acpica/source/components/events/evxfgpe.c
> +++ b/src/acpica/source/components/events/evxfgpe.c
> @@ -1065,6 +1065,44 @@ AcpiEnableAllWakeupGpes (
>  ACPI_EXPORT_SYMBOL (AcpiEnableAllWakeupGpes)
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiAnyGpeStatusSet
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      Whether or not the status bit is set for any GPE
> + *
> + * DESCRIPTION: Check the status bits of all enabled GPEs and return TRUE if any
> + *              of them is set or FALSE otherwise.
> + *
> + ******************************************************************************/
> +
> +UINT32
> +AcpiAnyGpeStatusSet (
> +    void)
> +{
> +    ACPI_STATUS                Status;
> +    UINT8                      Ret;
> +
> +
> +    ACPI_FUNCTION_TRACE (AcpiAnyGpeStatusSet);
> +
> +    Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (FALSE);
> +    }
> +
> +    Ret = AcpiHwCheckAllGpes ();
> +    (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
> +
> +    return (Ret);
> +}
> +
> +ACPI_EXPORT_SYMBOL(AcpiAnyGpeStatusSet)
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiInstallGpeBlock
> diff --git a/src/acpica/source/components/hardware/hwgpe.c b/src/acpica/source/components/hardware/hwgpe.c
> index f0b32bd6..e8ad8926 100644
> --- a/src/acpica/source/components/hardware/hwgpe.c
> +++ b/src/acpica/source/components/hardware/hwgpe.c
> @@ -635,6 +635,58 @@ AcpiHwEnableWakeupGpeBlock (
>  }
>  
>  
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiHwGetGpeBlockStatus
> + *
> + * PARAMETERS:  GpeXruptInfo    - GPE Interrupt info
> + *              GpeBlock        - Gpe Block info
> + *
> + * RETURN:      Success
> + *
> + * DESCRIPTION: Produce a combined GPE status bits mask for the given block.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiHwGetGpeBlockStatus(
> +    ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
> +    ACPI_GPE_BLOCK_INFO     *GpeBlock,
> +    void *RetPtr)
> +{
> +    ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
> +    UINT64                  InEnable;
> +    UINT64                  InStatus;
> +    ACPI_STATUS             Status;
> +    UINT8                   *Ret = RetPtr;
> +    UINT32                  i;
> +
> +
> +    /* Examine each GPE Register within the block */
> +
> +    for (i = 0; i < GpeBlock->RegisterCount; i++)
> +    {
> +        GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
> +
> +        Status = AcpiHwRead (&InEnable, &GpeRegisterInfo->EnableAddress);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            continue;
> +        }
> +
> +        Status = AcpiHwRead (&InStatus, &GpeRegisterInfo->StatusAddress);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            continue;
> +        }
> +
> +        *Ret |= InEnable & InStatus;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
>  /******************************************************************************
>   *
>   * FUNCTION:    AcpiHwDisableAllGpes
> @@ -715,4 +767,31 @@ AcpiHwEnableAllWakeupGpes (
>      return_ACPI_STATUS (Status);
>  }
>  
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiHwCheckAllGpes
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      Combined status of all GPEs
> + *
> + * DESCRIPTION: Check all enabled GPEs in all GPE blocks and return TRUE if the
> + *              status bit is set for at least one of them of FALSE otherwise.
> + *
> + ******************************************************************************/
> +
> +UINT8
> +AcpiHwCheckAllGpes (
> +    void)
> +{
> +    UINT8                      Ret = 0;
> +
> +
> +    ACPI_FUNCTION_TRACE (AcpiHwCheckAllGpes);
> +
> +    (void) AcpiEvWalkGpeList (AcpiHwGetGpeBlockStatus, &Ret);
> +    return (Ret != 0);
> +}
> +
>  #endif /* !ACPI_REDUCED_HARDWARE */
> diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
> index 3ad4ae23..016f62be 100644
> --- a/src/acpica/source/components/hardware/hwsleep.c
> +++ b/src/acpica/source/components/hardware/hwsleep.c
> @@ -464,6 +464,16 @@ AcpiHwLegacyWake (
>              AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
>              ACPI_CLEAR_STATUS);
>  
> +    /* Enable sleep button */
> +
> +	(void) AcpiWriteBitRegister (
> +            AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].EnableRegisterId,
> +            ACPI_ENABLE_EVENT);
> +
> +	(void) AcpiWriteBitRegister (
> +            AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId,
> +            ACPI_CLEAR_STATUS);
> +
>      AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
>      return_ACPI_STATUS (Status);
>  }
> diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
> index eebdd1a2..a9509195 100644
> --- a/src/acpica/source/components/namespace/nsnames.c
> +++ b/src/acpica/source/components/namespace/nsnames.c
> @@ -336,7 +336,7 @@ AcpiNsHandleToPathname (
>      /* Build the path in the caller buffer */
>  
>      (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer,
> -        RequiredSize, NoTrailing);
> +        (UINT32) RequiredSize, NoTrailing);
>  
>      ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n",
>          (char *) Buffer->Pointer, (UINT32) RequiredSize));
> @@ -509,7 +509,7 @@ AcpiNsGetNormalizedPathname (
>  
>      /* Build the path in the allocated buffer */
>  
> -    (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing);
> +    (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, (UINT32) Size, NoTrailing);
>  
>      ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%s: Path \"%s\"\n",
>          ACPI_GET_FUNCTION_NAME, NameBuffer));
> @@ -542,7 +542,7 @@ AcpiNsBuildPrefixedPathname (
>      char                    *FullPath = NULL;
>      char                    *ExternalPath = NULL;
>      char                    *PrefixPath = NULL;
> -    UINT32                  PrefixPathLength = 0;
> +    ACPI_SIZE               PrefixPathLength = 0;
>  
>  
>      /* If there is a prefix, get the pathname to it */
> diff --git a/src/acpica/source/components/namespace/nsxfname.c b/src/acpica/source/components/namespace/nsxfname.c
> index 5b3d5a9b..53a2f4bf 100644
> --- a/src/acpica/source/components/namespace/nsxfname.c
> +++ b/src/acpica/source/components/namespace/nsxfname.c
> @@ -714,7 +714,7 @@ AcpiInstallMethod (
>  
>      MethodFlags = *ParserState.Aml++;
>      AmlStart = ParserState.Aml;
> -    AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
> +    AmlLength = (UINT32) ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
>  
>      /*
>       * Allocate resources up-front. We don't want to have to delete a new
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 3c17ee00..682cb5a8 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -368,14 +368,14 @@ ACPI_EXPORT_SYMBOL_INIT (AcpiReallocateRootTable)
>   *
>   * PARAMETERS:  Signature           - ACPI signature of needed table
>   *              Instance            - Which instance (for SSDTs)
> - *              OutTableHeader      - The pointer to the table header to fill
> + *              OutTableHeader      - The pointer to the where the table header
> + *                                    is returned
>   *
> - * RETURN:      Status and pointer to mapped table header
> + * RETURN:      Status and a copy of the table header
>   *
> - * DESCRIPTION: Finds an ACPI table header.
> - *
> - * NOTE:        Caller is responsible in unmapping the header with
> - *              AcpiOsUnmapMemory
> + * DESCRIPTION: Finds and returns an ACPI table header. Caller provides the
> + *              memory where a copy of the header is to be returned
> + *              (fixed length).
>   *
>   ******************************************************************************/
>  
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index e4b93058..71244e51 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -192,7 +192,7 @@ AcpiUtGetElementLength (
>   *
>   * NOTE:        We always allocate the worst-case object descriptor because
>   *              these objects are cached, and we want them to be
> - *              one-size-satisifies-any-request. This in itself may not be
> + *              one-size-satisfies-any-request. This in itself may not be
>   *              the most memory efficient, but the efficiency of the object
>   *              cache should more than make up for this!
>   *
> diff --git a/src/acpica/source/include/acconvert.h b/src/acpica/source/include/acconvert.h
> index 2894b729..0962a164 100644
> --- a/src/acpica/source/include/acconvert.h
> +++ b/src/acpica/source/include/acconvert.h
> @@ -237,8 +237,7 @@ CgWriteAmlComment (
>  void
>  CvInitFileTree (
>      ACPI_TABLE_HEADER       *Table,
> -    UINT8                   *AmlStart,
> -    UINT32                  AmlLength);
> +    FILE                    *RootFile);
>  
>  void
>  CvClearOpComments (
> diff --git a/src/acpica/source/include/achware.h b/src/acpica/source/include/achware.h
> index 646cef85..9ff14d95 100644
> --- a/src/acpica/source/include/achware.h
> +++ b/src/acpica/source/include/achware.h
> @@ -315,6 +315,10 @@ ACPI_STATUS
>  AcpiHwEnableAllWakeupGpes (
>      void);
>  
> +UINT8
> +AcpiHwCheckAllGpes (
> +    void);
> +
>  ACPI_STATUS
>  AcpiHwEnableRuntimeGpeBlock (
>      ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
> diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
> index 340875e8..71cd18e2 100644
> --- a/src/acpica/source/include/acmacros.h
> +++ b/src/acpica/source/include/acmacros.h
> @@ -625,7 +625,7 @@
>  #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d) CvPrintOneCommentType (a,b,c,d);
>  #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b) CvPrintOneCommentList (a,b);
>  #define ASL_CV_FILE_HAS_SWITCHED(a)       CvFileHasSwitched(a)
> -#define ASL_CV_INIT_FILETREE(a,b,c)      CvInitFileTree(a,b,c);
> +#define ASL_CV_INIT_FILETREE(a,b)      CvInitFileTree(a,b);
>  
>  #else
>  
> @@ -640,7 +640,7 @@
>  #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d)
>  #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b)
>  #define ASL_CV_FILE_HAS_SWITCHED(a)       0
> -#define ASL_CV_INIT_FILETREE(a,b,c)
> +#define ASL_CV_INIT_FILETREE(a,b)
>  
>  #endif
>  
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 10e5e79a..a39d180e 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                 0x20200110
> +#define ACPI_CA_VERSION                 0x20200214
>  
>  #include "acconfig.h"
>  #include "actypes.h"
> @@ -1109,6 +1109,10 @@ ACPI_STATUS
>  AcpiEnableAllWakeupGpes (
>      void))
>  
> +ACPI_HW_DEPENDENT_RETURN_UINT32 (
> +    UINT32                  AcpiAnyGpeStatusSet (
> +    void))
> +
>  ACPI_HW_DEPENDENT_RETURN_STATUS (
>  ACPI_STATUS
>  AcpiGetGpeDevice (
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 6cb327a1..1f0d5c2f 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -1149,7 +1149,7 @@ enum AcpiErstInstructions
>  
>  enum AcpiErstCommandStatus
>  {
> -    ACPI_ERST_SUCESS                = 0,
> +    ACPI_ERST_SUCCESS                = 0,
>      ACPI_ERST_NO_SPACE              = 1,
>      ACPI_ERST_NOT_AVAILABLE         = 2,
>      ACPI_ERST_FAILURE               = 3,
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index 532d1fa8..c7d2c9aa 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -683,11 +683,12 @@ typedef UINT64                          ACPI_INTEGER;
>                                        strnlen (a, ACPI_NAMESEG_SIZE) == ACPI_NAMESEG_SIZE)
>  
>  /*
> - * Algorithm to obtain access bit width.
> - * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
> + * Algorithm to obtain access bit or byte width.
> + * Can be used with AccessSize field of ACPI_GENERIC_ADDRESS and
>   * ACPI_RESOURCE_GENERIC_REGISTER.
>   */
> -#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
> +#define ACPI_ACCESS_BIT_WIDTH(AccessSize)   (1 << ((AccessSize) + 2))
> +#define ACPI_ACCESS_BYTE_WIDTH(AccessSize)  (1 << ((AccessSize) - 1))
>  
>  
>  /*******************************************************************************
> 


Acked-by: Alex Hung <alex.hung@canonical.com>
diff mbox series

Patch

diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
index 60bd5fda..015765ff 100644
--- a/src/acpica/source/common/adisasm.c
+++ b/src/acpica/source/common/adisasm.c
@@ -156,6 +156,7 @@ 
 #include "acnamesp.h"
 #include "acparser.h"
 #include "acapps.h"
+#include "acconvert.h"
 
 
 #define _COMPONENT          ACPI_TOOLS
@@ -379,8 +380,6 @@  AdAmlDisassemble (
             Status = AE_ERROR;
             goto Cleanup;
         }
-
-        AcpiOsRedirectOutput (File);
     }
 
     *OutFilename = DisasmFilename;
@@ -467,6 +466,11 @@  AdDisassembleOneTable (
 
     if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
     {
+        if (File)
+        {
+            AcpiOsRedirectOutput (File);
+        }
+
         AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE);
 
         /* This is a "Data Table" (non-AML table) */
@@ -489,6 +493,10 @@  AdDisassembleOneTable (
         return (AE_OK);
     }
 
+    /* Initialize the converter output file */
+
+    ASL_CV_INIT_FILETREE(Table, File);
+
     /*
      * This is an AML table (DSDT or SSDT).
      * Always parse the tables, only option is what to display
@@ -501,6 +509,13 @@  AdDisassembleOneTable (
         return (Status);
     }
 
+    /* Redirect output for code generation and debugging output */
+
+    if (File)
+    {
+        AcpiOsRedirectOutput (File);
+    }
+
     /* Debug output, namespace and parse tree */
 
     if (AslCompilerdebug && File)
diff --git a/src/acpica/source/common/dmtables.c b/src/acpica/source/common/dmtables.c
index 3bc9c07a..ee18d26c 100644
--- a/src/acpica/source/common/dmtables.c
+++ b/src/acpica/source/common/dmtables.c
@@ -506,7 +506,6 @@  AdParseTable (
 
     AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
     AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
-    ASL_CV_INIT_FILETREE(Table, AmlStart, AmlLength);
 
     AcpiUtSetIntegerWidth (Table->Revision);
 
diff --git a/src/acpica/source/compiler/aslanalyze.c b/src/acpica/source/compiler/aslanalyze.c
index 9139f4e9..63feba2b 100644
--- a/src/acpica/source/compiler/aslanalyze.c
+++ b/src/acpica/source/compiler/aslanalyze.c
@@ -151,6 +151,7 @@ 
 
 #include "aslcompiler.h"
 #include "aslcompiler.y.h"
+#include "acnamesp.h"
 #include <string.h>
 
 
@@ -421,6 +422,7 @@  AnCheckMethodReturnValue (
 {
     ACPI_PARSE_OBJECT       *OwningOp;
     ACPI_NAMESPACE_NODE     *Node;
+    char                    *ExternalPath;
 
 
     Node = ArgOp->Asl.Node;
@@ -435,18 +437,19 @@  AnCheckMethodReturnValue (
     /* Examine the parent op of this method */
 
     OwningOp = Node->Op;
+    ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE);
+
     if (OwningOp->Asl.CompileFlags & OP_METHOD_NO_RETVAL)
     {
         /* Method NEVER returns a value */
 
-        AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, Op->Asl.ExternalName);
+        AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, ExternalPath);
     }
     else if (OwningOp->Asl.CompileFlags & OP_METHOD_SOME_NO_RETVAL)
     {
         /* Method SOMETIMES returns a value, SOMETIMES not */
 
-        AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL,
-            Op, Op->Asl.ExternalName);
+        AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL, Op, ExternalPath);
     }
     else if (!(ThisNodeBtype & RequiredBtypes))
     {
@@ -470,6 +473,11 @@  AnCheckMethodReturnValue (
             AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, AslGbl_MsgBuffer);
         }
     }
+
+    if (ExternalPath)
+    {
+        ACPI_FREE (ExternalPath);
+    }
 }
 
 
diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
index 0f145560..9481b6bb 100644
--- a/src/acpica/source/compiler/aslcompile.c
+++ b/src/acpica/source/compiler/aslcompile.c
@@ -647,7 +647,7 @@  void
 AslCompilerFileHeader (
     UINT32                  FileId)
 {
-    struct tm               *NewTime;
+    char                    *NewTime;
     time_t                  Aclock;
     char                    *Prefix = "";
 
@@ -691,13 +691,17 @@  AslCompilerFileHeader (
 
     /* Compilation header with timestamp */
 
-    (void) time (&Aclock);
-    NewTime = localtime (&Aclock);
+    Aclock = time (NULL);
+    NewTime = ctime (&Aclock);
 
     FlPrintFile (FileId,
-        "%sCompilation of \"%s\" - %s%s\n",
-        Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename, asctime (NewTime),
-        Prefix);
+        "%sCompilation of \"%s\" -",
+        Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename);
+
+    if (NewTime)
+    {
+        FlPrintFile (FileId, " %s%s\n", NewTime, Prefix);
+    }
 
     switch (FileId)
     {
diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
index e82a91e4..9bebc380 100644
--- a/src/acpica/source/compiler/aslcompiler.h
+++ b/src/acpica/source/compiler/aslcompiler.h
@@ -373,6 +373,15 @@  MtMethodAnalysisWalkEnd (
     UINT32                  Level,
     void                    *Context);
 
+UINT32
+MtProcessTypeOp (
+    ACPI_PARSE_OBJECT       *TypeOp);
+
+UINT8
+MtProcessParameterTypeList (
+    ACPI_PARSE_OBJECT       *ParamTypeOp,
+    UINT32                  *TypeList);
+
 
 /*
  * aslbtypes - bitfield data types
@@ -1233,10 +1242,14 @@  UtDumpBasicOp (
     ACPI_PARSE_OBJECT       *Op,
     UINT32                  Level);
 
-void *
-UtGetParentMethod (
+ACPI_NAMESPACE_NODE *
+UtGetParentMethodNode (
     ACPI_NAMESPACE_NODE     *Node);
 
+ACPI_PARSE_OBJECT *
+UtGetParentMethodOp (
+    ACPI_PARSE_OBJECT       *Op);
+
 BOOLEAN
 UtNodeIsDescendantOf (
     ACPI_NAMESPACE_NODE     *Node1,
diff --git a/src/acpica/source/compiler/aslexternal.c b/src/acpica/source/compiler/aslexternal.c
index 37f07e87..315247be 100644
--- a/src/acpica/source/compiler/aslexternal.c
+++ b/src/acpica/source/compiler/aslexternal.c
@@ -192,12 +192,54 @@  ExDoExternal (
     ACPI_PARSE_OBJECT       *Prev;
     ACPI_PARSE_OBJECT       *Next;
     ACPI_PARSE_OBJECT       *ArgCountOp;
+    ACPI_PARSE_OBJECT       *TypeOp;
+    ACPI_PARSE_OBJECT       *ExternTypeOp = Op->Asl.Child->Asl.Next;
+    UINT32                  ExternType;
+    UINT8                   ParamCount = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
+    UINT32                  ParamTypes[ACPI_METHOD_NUM_ARGS];
 
 
+    ExternType = AnMapObjTypeToBtype (ExternTypeOp);
+
+    /*
+     * The parser allows optional parameter return types regardless of the
+     * type. Check object type keyword emit error if optional parameter/return
+     * types exist.
+     *
+     * Check the parameter return type
+     */
+    TypeOp = ExternTypeOp->Asl.Next;
+    if (TypeOp->Asl.Child)
+    {
+        /* Ignore the return type for now. */
+
+        (void) MtProcessTypeOp (TypeOp->Asl.Child);
+        if (ExternType != ACPI_BTYPE_METHOD)
+        {
+            sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
+            AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_RET_TYPE, TypeOp,
+                AslGbl_MsgBuffer);
+        }
+    }
+
+    /* Check the parameter types */
+
+    TypeOp = TypeOp->Asl.Next;
+    if (TypeOp->Asl.Child)
+    {
+        ParamCount = MtProcessParameterTypeList (TypeOp->Asl.Child, ParamTypes);
+        if (ExternType != ACPI_BTYPE_METHOD)
+        {
+            sprintf (AslGbl_MsgBuffer, "Found type [%s]", AcpiUtGetTypeName(ExternType));
+            AslError (ASL_ERROR, ASL_MSG_EXTERN_INVALID_PARAM_TYPE, TypeOp,
+                AslGbl_MsgBuffer);
+        }
+    }
+
     ArgCountOp = Op->Asl.Child->Asl.Next->Asl.Next;
     ArgCountOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
     ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
-    ArgCountOp->Asl.Value.Integer = 0;
+    ArgCountOp->Asl.Value.Integer = ParamCount;
     UtSetParseOpName (ArgCountOp);
 
     /* Create new list node of arbitrary type */
diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c
index d9728206..0d26c641 100644
--- a/src/acpica/source/compiler/aslload.c
+++ b/src/acpica/source/compiler/aslload.c
@@ -196,6 +196,15 @@  LdCheckSpecialNames (
     ACPI_NAMESPACE_NODE     *Node,
     ACPI_PARSE_OBJECT       *Op);
 
+static ACPI_STATUS
+LdAnalyzeExternals (
+    ACPI_NAMESPACE_NODE     *Node,
+    ACPI_PARSE_OBJECT       *Op,
+    ACPI_OBJECT_TYPE        ExternalOpType,
+    ACPI_OBJECT_TYPE        ObjectType,
+    ACPI_WALK_STATE         *WalkState);
+
+
 /*******************************************************************************
  *
  * FUNCTION:    LdLoadNamespace
@@ -575,7 +584,8 @@  LdNamespace1Begin (
     /* Check for a possible illegal forward reference */
 
     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
-        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
+        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
+        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
     {
         /*
          * Op->Asl.Namepath will be NULL for these opcodes.
@@ -591,7 +601,8 @@  LdNamespace1Begin (
          * We only want references to named objects:
          *      Store (2, WXYZ) -> Attempt to resolve the name
          */
-        if (OpInfo->Class == AML_CLASS_NAMED_OBJECT)
+        if ((Op->Asl.ParseOpcode != PARSEOP_METHODCALL) &&
+            (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
         {
             return (AE_OK);
         }
@@ -899,56 +910,24 @@  LdNamespace1Begin (
                 Node->Type = (UINT8) ObjectType;
                 Status = AE_OK;
             }
-            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
-                     (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
+            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) ||
+                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
             {
-                /*
-                 * Allow one create on an object or segment that was
-                 * previously declared External
-                 */
-                Node->Flags &= ~ANOBJ_IS_EXTERNAL;
-                Node->Type = (UINT8) ObjectType;
-
-                /* Just retyped a node, probably will need to open a scope */
-
-                if (AcpiNsOpensScope (ObjectType))
+                Status = LdAnalyzeExternals (Node, Op, ActualObjectType,
+                    ObjectType, WalkState);
+                if (ACPI_FAILURE (Status))
                 {
-                    Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
-                    if (ACPI_FAILURE (Status))
+                    if (Status == AE_ERROR)
                     {
-                        return_ACPI_STATUS (Status);
+                        /*
+                         * The use of AE_ERROR here indicates that there was a
+                         * compiler error emitted in LdAnalyzeExternals which
+                         * means that the caller should proceed to the next Op
+                         * for analysis of subsequent parse objects.
+                         */
+                        Status = AE_OK;
                     }
-                }
-
-                Status = AE_OK;
-            }
-            else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
-                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
-            {
-                /*
-                 * Allow externals in same scope as the definition of the
-                 * actual object. Similar to C. Allows multiple definition
-                 * blocks that refer to each other in the same file.
-                 */
-                Status = AE_OK;
-            }
-            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
-                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
-                     (ObjectType == ACPI_TYPE_ANY))
-            {
-                /* Allow update of externals of unknown type. */
-
-                if (AcpiNsOpensScope (ActualObjectType))
-                {
-                    Node->Type = (UINT8) ActualObjectType;
-                    Status = AE_OK;
-                }
-                else
-                {
-                    sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
-                        AcpiUtGetTypeName (Node->Type));
-                    AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer);
-                    return_ACPI_STATUS (AE_OK);
+                    return_ACPI_STATUS (Status);
                 }
             }
             else
@@ -1013,15 +992,17 @@  FinishNode:
      * Set the actual data type if appropriate (EXTERNAL term only)
      * As of 11/19/2019, ASL External() does not support parameter
      * counts. When an External method is loaded, the parameter count is
-     * unknown setting Node->Value to ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS
-     * indicates that the parameter count for this method is unknown.
-     * This information is used in ASL cross reference to help determine the
-     * parameter count through method calls.
+     * recorded in the external's arg count parameter. The parameter count may
+     * or may not be known in the declaration. If the value of this node turns
+     * out to be ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS, it indicates that
+     * we do not know the parameter count and that we must look at the usage of
+     * the External method call to get this information.
      */
     if (ActualObjectType != ACPI_TYPE_ANY)
     {
         Node->Type = (UINT8) ActualObjectType;
-        Node->Value = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
+        Node->Value = (UINT32)
+            Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer;
     }
 
     if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
@@ -1037,6 +1018,145 @@  FinishNode:
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    LdAnalyzeExternals
+ *
+ * PARAMETERS:  Node            - Node that represents the named object
+ *              Op              - Named object declaring this named object
+ *              ExternalOpType  - Type of ExternalOp
+ *              ObjectType      - Type of Declared object
+ *              WalkState       - Current WalkState
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Node and Op represents an identically named object declaration
+ *              that is either declared by the ASL external keyword or declared
+ *              by operators that declare named objects (i.e. Name, Device,
+ *              OperationRegion, and etc.). This function ensures that the
+ *              declarations do not contradict each other.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LdAnalyzeExternals (
+    ACPI_NAMESPACE_NODE     *Node,
+    ACPI_PARSE_OBJECT       *Op,
+    ACPI_OBJECT_TYPE        ExternalOpType,
+    ACPI_OBJECT_TYPE        ObjectType,
+    ACPI_WALK_STATE         *WalkState)
+{
+    ACPI_STATUS             Status = AE_OK;
+    ACPI_OBJECT_TYPE        ActualExternalOpType;
+    ACPI_OBJECT_TYPE        ActualOpType;
+    ACPI_PARSE_OBJECT       *ExternalOp;
+    ACPI_PARSE_OBJECT       *ActualOp;
+
+
+    /*
+     * The declaration represented by Node and Op must have the same type.
+     * The type of the external Op is represented by ExternalOpType. However,
+     * the type of the pre-existing declaration depends on whether if Op
+     * is an external declaration or an actual declaration.
+     */
+    if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
+    {
+        ActualExternalOpType = ExternalOpType;
+        ActualOpType = Node->Type;
+    }
+    else
+    {
+        ActualExternalOpType = Node->Type;
+        ActualOpType = ObjectType;
+    }
+
+    if ((ActualOpType != ACPI_TYPE_ANY) &&
+        (ActualExternalOpType != ACPI_TYPE_ANY) &&
+        (ActualExternalOpType != ActualOpType))
+    {
+        if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
+            Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
+        {
+            AslDualParseOpError (ASL_ERROR,
+                ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL,
+                ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL);
+        }
+        else
+        {
+            if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
+                Node->Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)
+            {
+                ExternalOp = Op;
+                ActualOp = Node->Op;
+            }
+            else
+            {
+                ExternalOp = Node->Op;
+                ActualOp = Op;
+            }
+            AslDualParseOpError (ASL_ERROR,
+                ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL,
+                ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL);
+        }
+    }
+
+    if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
+        (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
+    {
+        /*
+         * Allow one create on an object or segment that was
+         * previously declared External
+         */
+        Node->Flags &= ~ANOBJ_IS_EXTERNAL;
+        Node->Type = (UINT8) ObjectType;
+
+        /* Just retyped a node, probably will need to open a scope */
+
+        if (AcpiNsOpensScope (ObjectType))
+        {
+            Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+        }
+
+        Status = AE_OK;
+    }
+    else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
+             (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
+    {
+        /*
+         * Allow externals in same scope as the definition of the
+         * actual object. Similar to C. Allows multiple definition
+         * blocks that refer to each other in the same file.
+         */
+        Status = AE_OK;
+    }
+    else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
+             (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
+             (ObjectType == ACPI_TYPE_ANY))
+    {
+        /* Allow update of externals of unknown type. */
+
+        if (AcpiNsOpensScope (ExternalOpType))
+        {
+            Node->Type = (UINT8) ExternalOpType;
+            Status = AE_OK;
+        }
+        else
+        {
+            sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
+                AcpiUtGetTypeName (Node->Type));
+            AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer);
+            Status = AE_ERROR;
+        }
+    }
+
+    return (Status);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    LdCheckSpecialNames
diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
index 418df32c..81280b28 100644
--- a/src/acpica/source/compiler/aslmessages.c
+++ b/src/acpica/source/compiler/aslmessages.c
@@ -320,7 +320,7 @@  const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_SCOPE_TYPE */                 "Existing object has invalid type for Scope operator",
 /*    ASL_MSG_SEEK */                       "Could not seek file",
 /*    ASL_MSG_SERIALIZED */                 "Control Method marked Serialized",
-/*    ASL_MSG_SERIALIZED_REQUIRED */        "Control Method should be made Serialized",
+/*    ASL_MSG_SERIALIZED_REQUIRED */        "Control Method should be made Serialized due to creation of named objects within",
 /*    ASL_MSG_SINGLE_NAME_OPTIMIZATION */   "NamePath optimized to NameSeg (uses run-time search path)",
 /*    ASL_MSG_SOME_NO_RETVAL */             "Called method may not always return a value",
 /*    ASL_MSG_STRING_LENGTH */              "String literal too long",
@@ -370,7 +370,16 @@  const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_INVALID_PROCESSOR_UID */      "_UID inside processor declaration must be an integer",
 /*    ASL_MSG_LEGACY_PROCESSOR_OP */        "Legacy Processor() keyword detected. Use Device() keyword instead.",
 /*    ASL_MSG_NAMESTRING_LENGTH */          "NameString contains too many NameSegs (>255)",
-/*    ASL_MSG_CASE_FOUND_HERE */            "Original Case value below:"
+/*    ASL_MSG_CASE_FOUND_HERE */            "Original Case value below:",
+/*    ASL_MSG_EXTERN_INVALID_RET_TYPE */    "Return type is only allowed for Externals declared as MethodObj",
+/*    ASL_MSG_EXTERN_INVALID_PARAM_TYPE */  "Parameter type is only allowed for Externals declared as MethodObj",
+/*    ASL_MSG_NAMED_OBJECT_CREATION */      "Creation of named objects within a method is highly inefficient, use globals or method local variables instead",
+/*    ASL_MSG_ARG_COUNT_MISMATCH */         "Method NumArgs count does not match length of ParameterTypes list",
+/*    ASL_MSG_STATIC_OPREGION_IN_METHOD */  "Static OperationRegion should be declared outside control method",
+/*    ASL_MSG_DECLARATION_TYPE_MISMATCH */  "Type mismatch between external declaration and actual object declaration detected",
+/*    ASL_MSG_TYPE_MISMATCH_FOUND_HERE */   "Actual object declaration:",
+/*    ASL_MSG_DUPLICATE_EXTERN_MISMATCH */  "Type mismatch between multiple external declarations detected",
+/*    ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE */"Duplicate external declaration:",
 };
 
 /* Table compiler */
diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
index fb3513ab..6d5ffd4d 100644
--- a/src/acpica/source/compiler/aslmessages.h
+++ b/src/acpica/source/compiler/aslmessages.h
@@ -373,6 +373,16 @@  typedef enum
     ASL_MSG_LEGACY_PROCESSOR_OP,
     ASL_MSG_NAMESTRING_LENGTH,
     ASL_MSG_CASE_FOUND_HERE,
+    ASL_MSG_EXTERN_INVALID_RET_TYPE,
+    ASL_MSG_EXTERN_INVALID_PARAM_TYPE,
+    ASL_MSG_NAMED_OBJECT_CREATION,
+    ASL_MSG_ARG_COUNT_MISMATCH,
+    ASL_MSG_STATIC_OPREGION_IN_METHOD,
+    ASL_MSG_DECLARATION_TYPE_MISMATCH,
+    ASL_MSG_TYPE_MISMATCH_FOUND_HERE,
+    ASL_MSG_DUPLICATE_EXTERN_MISMATCH,
+    ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE,
+
 
     /* These messages are used by the Data Table compiler only */
 
diff --git a/src/acpica/source/compiler/aslmethod.c b/src/acpica/source/compiler/aslmethod.c
index b7b7ec42..d56f4817 100644
--- a/src/acpica/source/compiler/aslmethod.c
+++ b/src/acpica/source/compiler/aslmethod.c
@@ -151,6 +151,7 @@ 
 
 #include "aslcompiler.h"
 #include "aslcompiler.y.h"
+#include "acnamesp.h"
 #include "acparser.h"
 #include "amlcode.h"
 
@@ -166,6 +167,10 @@  MtCheckNamedObjectInMethod (
     ACPI_PARSE_OBJECT       *Op,
     ASL_METHOD_INFO         *MethodInfo);
 
+static void
+MtCheckStaticOperationRegionInMethod (
+    ACPI_PARSE_OBJECT       *Op);
+
 
 /*******************************************************************************
  *
@@ -197,7 +202,6 @@  MtMethodAnalysisWalkBegin (
     char                    ArgName[] = "Arg0";
     ACPI_PARSE_OBJECT       *ArgNode;
     ACPI_PARSE_OBJECT       *NextType;
-    ACPI_PARSE_OBJECT       *NextParamType;
     UINT8                   ActualArgs = 0;
     BOOLEAN                 HidExists;
     BOOLEAN                 AdrExists;
@@ -282,50 +286,35 @@  MtMethodAnalysisWalkBegin (
         Next = Next->Asl.Next;
 
         NextType = Next->Asl.Child;
-        while (NextType)
-        {
-            /* Get and map each of the ReturnTypes */
 
-            MethodInfo->ValidReturnTypes |= AnMapObjTypeToBtype (NextType);
-            NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
-            NextType = NextType->Asl.Next;
-        }
+        MethodInfo->ValidReturnTypes = MtProcessTypeOp (NextType);
 
         /* Get the ParameterType node */
 
         Next = Next->Asl.Next;
 
         NextType = Next->Asl.Child;
-        while (NextType)
+        if (!NextType)
         {
-            if (NextType->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
-            {
-                NextParamType = NextType->Asl.Child;
-                while (NextParamType)
-                {
-                    MethodInfo->ValidArgTypes[ActualArgs] |=
-                        AnMapObjTypeToBtype (NextParamType);
-
-                    NextParamType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
-                    NextParamType = NextParamType->Asl.Next;
-                }
-            }
-            else
-            {
-                MethodInfo->ValidArgTypes[ActualArgs] =
-                    AnMapObjTypeToBtype (NextType);
-
-                NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
-                ActualArgs++;
-            }
-
-            NextType = NextType->Asl.Next;
+            /*
+             * The optional parameter types list was omitted  at the source
+             * level. Use the Argument count parameter instead.
+             */
+            ActualArgs = MethodInfo->NumArguments;
+        }
+        else
+        {
+            ActualArgs = MtProcessParameterTypeList (NextType,
+                MethodInfo->ValidArgTypes);
         }
 
         if ((MethodInfo->NumArguments) &&
             (MethodInfo->NumArguments != ActualArgs))
         {
-            /* error: Param list did not match number of args */
+            sprintf (AslGbl_MsgBuffer,
+                "Length = %u", ActualArgs);
+            AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_MISMATCH,
+                Op->Asl.Child->Asl.Next, AslGbl_MsgBuffer);
         }
 
         /* Allow numarguments == 0 for Function() */
@@ -576,6 +565,8 @@  MtMethodAnalysisWalkBegin (
             AslError (ASL_ERROR, ASL_MSG_RESERVED_USE,
                 Op, Op->Asl.ExternalName);
         }
+
+        MtCheckStaticOperationRegionInMethod (Op);
         break;
 
     case PARSEOP_NAME:
@@ -628,6 +619,71 @@  MtMethodAnalysisWalkBegin (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    MtProcessTypeOp
+ *
+ * PARAMETERS:  Op                  - Op representing a btype
+ *
+ * RETURN:      Btype represented by Op
+ *
+ * DESCRIPTION: Process a parse object that represents single parameter type or
+ *              a return type in method, function, and external declarations.
+ *
+ ******************************************************************************/
+
+UINT32
+MtProcessTypeOp (
+    ACPI_PARSE_OBJECT       *TypeOp)
+{
+    UINT32                  Btype = ACPI_BTYPE_ANY;
+
+
+    while (TypeOp)
+    {
+        Btype |= AnMapObjTypeToBtype (TypeOp);
+        TypeOp->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+        TypeOp = TypeOp->Asl.Next;
+    }
+
+    return (Btype);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    MtProcessParameterTypeList
+ *
+ * PARAMETERS:  Op                  - Op representing a btype
+ *
+ * RETURN:      Btype represented by Op
+ *
+ * DESCRIPTION: Process a parse object that represents a parameter type list in
+ *              method, function, and external declarations.
+ *
+ ******************************************************************************/
+
+UINT8
+MtProcessParameterTypeList (
+    ACPI_PARSE_OBJECT       *ParamTypeOp,
+    UINT32                  *TypeList)
+{
+    UINT8                   ParameterCount = 0;
+
+
+    while (ParamTypeOp)
+    {
+        TypeList[ParameterCount] =
+            MtProcessTypeOp (ParamTypeOp->Asl.Child);
+
+        ParameterCount++;
+        ParamTypeOp = ParamTypeOp->Asl.Next;
+    }
+
+    return (ParameterCount);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    MtCheckNamedObjectInMethod
@@ -649,6 +705,7 @@  MtCheckNamedObjectInMethod (
     ASL_METHOD_INFO         *MethodInfo)
 {
     const ACPI_OPCODE_INFO  *OpInfo;
+    char                    *ExternalPath;
 
 
     /* We don't care about actual method declarations or scopes */
@@ -672,27 +729,97 @@  MtCheckNamedObjectInMethod (
         /*
          * 1) Mark the method as a method that creates named objects.
          *
-         * 2) If the method is non-serialized, emit a remark that the method
+         * 2) Issue a remark indicating the inefficiency of creating named
+         * objects within a method (Except for compiler-emitted temporary
+         * variables).
+         *
+         * 3) If the method is non-serialized, emit a remark that the method
          * should be serialized.
          *
          * Reason: If a thread blocks within the method for any reason, and
          * another thread enters the method, the method will fail because
          * an attempt will be made to create the same object twice.
          */
+        ExternalPath = AcpiNsGetNormalizedPathname (MethodInfo->Op->Asl.Node, TRUE);
+
+        /* No error for compiler temp variables (name starts with "_T_") */
+
+        if ((Op->Asl.NameSeg[0] != '_') &&
+            (Op->Asl.NameSeg[1] != 'T') &&
+            (Op->Asl.NameSeg[2] != '_'))
+        {
+            AslError (ASL_REMARK, ASL_MSG_NAMED_OBJECT_CREATION, Op,
+                ExternalPath);
+        }
+
         MethodInfo->CreatesNamedObjects = TRUE;
         if (!MethodInfo->ShouldBeSerialized)
         {
             AslError (ASL_REMARK, ASL_MSG_SERIALIZED_REQUIRED, MethodInfo->Op,
-                "due to creation of named objects within");
+                ExternalPath);
 
             /* Emit message only ONCE per method */
 
             MethodInfo->ShouldBeSerialized = TRUE;
         }
+
+        if (ExternalPath)
+        {
+            ACPI_FREE (ExternalPath);
+        }
     }
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    MtCheckStaticOperationRegionInMethod
+ *
+ * PARAMETERS:  Op                  - Current parser op
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Warns if an Operation Region with static address or length
+ *              is declared inside a control method
+ *
+ ******************************************************************************/
+
+static void
+MtCheckStaticOperationRegionInMethod(
+    ACPI_PARSE_OBJECT*       Op)
+{
+    ACPI_PARSE_OBJECT*       AddressOp;
+    ACPI_PARSE_OBJECT*       LengthOp;
+
+
+    if (Op->Asl.ParseOpcode != PARSEOP_OPERATIONREGION)
+    {
+        return;
+    }
+
+    /*
+     * OperationRegion should have 4 arguments defined. At this point, we
+     * assume that the parse tree is well-formed.
+     */
+    AddressOp = Op->Asl.Child->Asl.Next->Asl.Next;
+    LengthOp = Op->Asl.Child->Asl.Next->Asl.Next->Asl.Next;
+
+    if (UtGetParentMethodOp (Op) &&
+        AddressOp->Asl.ParseOpcode == PARSEOP_INTEGER &&
+        LengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)
+    {
+        /*
+         * At this point, a static operation region declared inside of a
+         * control method has been found. Throw a warning because this is
+         * highly inefficient.
+         */
+        AslError(ASL_WARNING, ASL_MSG_STATIC_OPREGION_IN_METHOD, Op, NULL);
+    }
+
+    return;
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    MtMethodAnalysisWalkEnd
@@ -714,6 +841,7 @@  MtMethodAnalysisWalkEnd (
 {
     ASL_ANALYSIS_WALK_INFO  *WalkInfo = (ASL_ANALYSIS_WALK_INFO *) Context;
     ASL_METHOD_INFO         *MethodInfo = WalkInfo->MethodStack;
+    char                    *ExternalPath;
 
 
     switch (Op->Asl.ParseOpcode)
@@ -766,8 +894,15 @@  MtMethodAnalysisWalkEnd (
         if (MethodInfo->NumReturnNoValue &&
             MethodInfo->NumReturnWithValue)
         {
+            ExternalPath = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
+
             AslError (ASL_WARNING, ASL_MSG_RETURN_TYPES, Op,
-                Op->Asl.ExternalName);
+                ExternalPath);
+
+            if (ExternalPath)
+            {
+                ACPI_FREE (ExternalPath);
+            }
         }
 
         /*
diff --git a/src/acpica/source/compiler/aslparseop.c b/src/acpica/source/compiler/aslparseop.c
index b58d4e66..46875413 100644
--- a/src/acpica/source/compiler/aslparseop.c
+++ b/src/acpica/source/compiler/aslparseop.c
@@ -743,13 +743,18 @@  TrCreateConstantLeafOp (
 
         /* Get a copy of the current time */
 
+        Op->Asl.Value.String = "";
         CurrentTime = time (NULL);
+
         StaticTimeString = ctime (&CurrentTime);
-        TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1);
-        strcpy (TimeString, StaticTimeString);
+        if (StaticTimeString)
+        {
+            TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1);
+            strcpy (TimeString, StaticTimeString);
 
-        TimeString[strlen(TimeString) -1] = 0;  /* Remove trailing newline */
-        Op->Asl.Value.String = TimeString;
+            TimeString[strlen(TimeString) -1] = 0;  /* Remove trailing newline */
+            Op->Asl.Value.String = TimeString;
+        }
         break;
 
     default: /* This would be an internal error */
diff --git a/src/acpica/source/compiler/aslprimaries.y b/src/acpica/source/compiler/aslprimaries.y
index 7bbf4155..1fb9e501 100644
--- a/src/acpica/source/compiler/aslprimaries.y
+++ b/src/acpica/source/compiler/aslprimaries.y
@@ -663,7 +663,7 @@  FunctionTerm
         PARSEOP_CLOSE_PAREN '{'     {COMMENT_CAPTURE_ON; }
             TermList '}'            {$$ = TrLinkOpChildren ($<n>3,7,
                                         TrSetOpFlags ($4, OP_IS_NAME_DECLARATION),
-                                        TrCreateValuedLeafOp (PARSEOP_BYTECONST, 0),
+                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),
                                         TrCreateLeafOp (PARSEOP_SERIALIZERULE_NOTSERIAL),
                                         TrCreateValuedLeafOp (PARSEOP_BYTECONST, 0),$5,$6,$10);}
     | PARSEOP_FUNCTION
diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
index 9035e8bb..f998527b 100644
--- a/src/acpica/source/compiler/aslrules.y
+++ b/src/acpica/source/compiler/aslrules.y
@@ -421,14 +421,16 @@  ParameterTypePackage
 
 ParameterTypePackageList
     :                               {$$ = NULL;}
-    | ObjectTypeKeyword             {$$ = $1;}
-    | '{' ParameterTypePackage '}'  {$$ = $2;}
+    | ObjectTypeKeyword             {$$ = TrLinkOpChildren (
+                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$1);}
+    | '{' ParameterTypePackage '}'  {$$ = TrLinkOpChildren (
+                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
     ;
 
+
 OptionalParameterTypePackage
-    :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
-    | ',' ParameterTypePackageList  {$$ = TrLinkOpChildren (
-                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
+    :                               {$$ = NULL;}
+    | ',' ParameterTypePackageList  {$$ = $2;}
     ;
 
     /* Rules for specifying the types for method arguments */
@@ -441,14 +443,15 @@  ParameterTypesPackage
 
 ParameterTypesPackageList
     :                               {$$ = NULL;}
-    | ObjectTypeKeyword             {$$ = $1;}
-    | '{' ParameterTypesPackage '}' {$$ = $2;}
+    | ObjectTypeKeyword             {$$ = TrLinkOpChildren (
+                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$1);}
+    | '{' ParameterTypesPackage '}' {$$ = TrLinkOpChildren (
+                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
     ;
 
 OptionalParameterTypesPackage
-    :                               {$$ = TrCreateLeafOp (PARSEOP_DEFAULT_ARG);}
-    | ',' ParameterTypesPackageList {$$ = TrLinkOpChildren (
-                                        TrCreateLeafOp (PARSEOP_DEFAULT_ARG),1,$2);}
+    :                               {$$ = NULL;}
+    | ',' ParameterTypesPackageList {$$ = $2;}
     ;
 
 /*
diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
index dcb60f7a..67adf82e 100644
--- a/src/acpica/source/compiler/asltransform.c
+++ b/src/acpica/source/compiler/asltransform.c
@@ -205,6 +205,10 @@  TrCheckForBufferMatch (
     ACPI_PARSE_OBJECT       *Next1,
     ACPI_PARSE_OBJECT       *Next2);
 
+static void
+TrDoMethod (
+    ACPI_PARSE_OBJECT       *Op);
+
 
 /*******************************************************************************
  *
@@ -463,11 +467,8 @@  TrTransformSubtree (
         break;
 
     case PARSEOP_METHOD:
-        /*
-         * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
-         * however
-         */
-        AslGbl_TempCount = 0;
+
+        TrDoMethod (Op);
         break;
 
     case PARSEOP_EXTERNAL:
@@ -1240,3 +1241,76 @@  TrCheckForBufferMatch (
 
     return (TRUE);
 }
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    TrDoMethod
+ *
+ * PARAMETERS:  Op               - Parse node for SWITCH
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Determine that parameter count of an ASL method node by
+ *              translating the parameter count parse node from
+ *              PARSEOP_DEFAULT_ARG to PARSEOP_BYTECONST.
+ *
+ ******************************************************************************/
+
+static void
+TrDoMethod (
+    ACPI_PARSE_OBJECT       *Op)
+{
+    ACPI_PARSE_OBJECT           *ArgCountOp;
+    UINT8                       ArgCount;
+    ACPI_PARSE_OBJECT           *ParameterOp;
+
+
+    /*
+     * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
+     * however
+     */
+    AslGbl_TempCount = 0;
+
+    ArgCountOp = Op->Asl.Child->Asl.Next;
+    if (ArgCountOp->Asl.ParseOpcode == PARSEOP_BYTECONST)
+    {
+        /*
+         * Parameter count for this method has already been recorded in the
+         * method declaration.
+         */
+        return;
+    }
+
+    /*
+     * Parameter count has been omitted in the method declaration.
+     * Count the amount of arguments here.
+     */
+    ParameterOp = ArgCountOp->Asl.Next->Asl.Next->Asl.Next->Asl.Next;
+    if (ParameterOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+    {
+        ArgCount = 0;
+        ParameterOp = ParameterOp->Asl.Child;
+
+        while (ParameterOp)
+        {
+            ParameterOp = ParameterOp->Asl.Next;
+            ArgCount++;
+        }
+
+        ArgCountOp->Asl.Value.Integer = ArgCount;
+        ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
+    }
+    else
+    {
+        /*
+         * Method parameters can be counted by analyzing the Parameter type
+         * list. If the Parameter list contains more than 1 parameter, it
+         * is nested under PARSEOP_DEFAULT_ARG. When there is only 1
+         * parameter, the parse tree contains a single node representing
+         * that type.
+         */
+        ArgCountOp->Asl.Value.Integer = 1;
+        ArgCountOp->Asl.ParseOpcode = PARSEOP_BYTECONST;
+    }
+}
diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
index 4233318f..42ef2c0b 100644
--- a/src/acpica/source/compiler/aslutils.c
+++ b/src/acpica/source/compiler/aslutils.c
@@ -298,7 +298,7 @@  UtNodeIsDescendantOf (
 
 /*******************************************************************************
  *
- * FUNCTION:    UtGetParentMethod
+ * FUNCTION:    UtGetParentMethodNode
  *
  * PARAMETERS:  Node                    - Namespace node for any object
  *
@@ -309,8 +309,8 @@  UtNodeIsDescendantOf (
  *
  ******************************************************************************/
 
-void *
-UtGetParentMethod (
+ACPI_NAMESPACE_NODE *
+UtGetParentMethodNode (
     ACPI_NAMESPACE_NODE     *Node)
 {
     ACPI_NAMESPACE_NODE     *ParentNode;
@@ -338,6 +338,41 @@  UtGetParentMethod (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    UtGetParentMethodOp
+ *
+ * PARAMETERS:  Op                      - Parse Op to be checked
+ *
+ * RETURN:      Control method Op if found. NULL otherwise
+ *
+ * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
+ *              the input Op is not within a control method.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+UtGetParentMethodOp (
+    ACPI_PARSE_OBJECT       *Op)
+{
+    ACPI_PARSE_OBJECT       *NextOp;
+
+
+    NextOp = Op->Asl.Parent;
+    while (NextOp)
+    {
+        if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
+        {
+            return (NextOp);
+        }
+
+        NextOp = NextOp->Asl.Parent;
+    }
+
+    return (NULL); /* No parent method found */
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    UtDisplaySupportedTables
diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
index 2649373f..38356aa2 100644
--- a/src/acpica/source/compiler/aslxref.c
+++ b/src/acpica/source/compiler/aslxref.c
@@ -180,10 +180,6 @@  XfValidateCrossReference (
     const ACPI_OPCODE_INFO  *OpInfo,
     ACPI_NAMESPACE_NODE     *Node);
 
-static ACPI_PARSE_OBJECT *
-XfGetParentMethod (
-    ACPI_PARSE_OBJECT       *Op);
-
 static BOOLEAN
 XfObjectExists (
     char                    *Name);
@@ -380,41 +376,6 @@  XfCheckFieldRange (
 }
 
 
-/*******************************************************************************
- *
- * FUNCTION:    XfGetParentMethod
- *
- * PARAMETERS:  Op                      - Parse Op to be checked
- *
- * RETURN:      Control method Op if found. NULL otherwise
- *
- * DESCRIPTION: Find the control method parent of a parse op. Returns NULL if
- *              the input Op is not within a control method.
- *
- ******************************************************************************/
-
-static ACPI_PARSE_OBJECT *
-XfGetParentMethod (
-    ACPI_PARSE_OBJECT       *Op)
-{
-    ACPI_PARSE_OBJECT       *NextOp;
-
-
-    NextOp = Op->Asl.Parent;
-    while (NextOp)
-    {
-        if (NextOp->Asl.AmlOpcode == AML_METHOD_OP)
-        {
-            return (NextOp);
-        }
-
-        NextOp = NextOp->Asl.Parent;
-    }
-
-    return (NULL); /* No parent method found */
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    XfNamespaceLocateBegin
@@ -539,7 +500,7 @@  XfNamespaceLocateBegin (
     {
         /* Find parent method Op */
 
-        NextOp = XfGetParentMethod (Op);
+        NextOp = UtGetParentMethodOp (Op);
         if (!NextOp)
         {
             return_ACPI_STATUS (AE_OK);
@@ -576,7 +537,7 @@  XfNamespaceLocateBegin (
     {
         /* Find parent method Op */
 
-        NextOp = XfGetParentMethod (Op);
+        NextOp = UtGetParentMethodOp (Op);
         if (!NextOp)
         {
             return_ACPI_STATUS (AE_OK);
@@ -814,10 +775,10 @@  XfNamespaceLocateBegin (
          * same method or outside of any method, this is a forward reference
          * and should be reported as a compiler error.
          */
-        DeclarationParentMethod = UtGetParentMethod (Node);
-        ReferenceParentMethod = XfGetParentMethod (Op);
+        DeclarationParentMethod = UtGetParentMethodNode (Node);
+        ReferenceParentMethod = UtGetParentMethodOp (Op);
 
-        /* case 1: declaration and refrence are both outside of method */
+        /* case 1: declaration and reference are both outside of method */
 
         if (!ReferenceParentMethod && !DeclarationParentMethod)
         {
@@ -1337,8 +1298,8 @@  XfNamespaceLocateEnd (
  *                                      execution of A)
  *
  * NOTES:
- *      A null pointer returned by either XfGetParentMethod or
- *      UtGetParentMethod indicates that the parameter object is not
+ *      A null pointer returned by either UtGetParentMethodOp or
+ *      UtGetParentMethodNode indicates that the parameter object is not
  *      within a control method.
  *
  *      Five cases are handled: Case(Op, Node)
@@ -1371,8 +1332,8 @@  XfValidateCrossReference (
      * 1) Search upwards in parse tree for owner of the referencing object
      * 2) Search upwards in namespace to find the owner of the referenced object
      */
-    ReferencingMethodOp = XfGetParentMethod (Op);
-    ReferencedMethodNode = UtGetParentMethod (Node);
+    ReferencingMethodOp = UtGetParentMethodOp (Op);
+    ReferencedMethodNode = UtGetParentMethodNode (Node);
 
     if (!ReferencingMethodOp && !ReferencedMethodNode)
     {
diff --git a/src/acpica/source/compiler/cvparser.c b/src/acpica/source/compiler/cvparser.c
index 0e0a5b80..370b8036 100644
--- a/src/acpica/source/compiler/cvparser.c
+++ b/src/acpica/source/compiler/cvparser.c
@@ -230,8 +230,7 @@  CvIsFilename (
  * FUNCTION:    CvInitFileTree
  *
  * PARAMETERS:  Table      - input table
- *              AmlStart   - Address of the starting point of the AML.
- *              AmlLength  - Length of the AML file.
+ *              RootFile   - Output file that defines the DefinitionBlock
  *
  * RETURN:      None
  *
@@ -243,8 +242,7 @@  CvIsFilename (
 void
 CvInitFileTree (
     ACPI_TABLE_HEADER       *Table,
-    UINT8                   *AmlStart,
-    UINT32                  AmlLength)
+    FILE                    *RootFile)
 {
     UINT8                   *TreeAml;
     UINT8                   *FileEnd;
@@ -252,6 +250,8 @@  CvInitFileTree (
     char                    *PreviousFilename = NULL;
     char                    *ParentFilename = NULL;
     char                    *ChildFilename = NULL;
+    UINT8                   *AmlStart;
+    UINT32                  AmlLength;
 
 
     if (!AcpiGbl_CaptureComments)
@@ -259,9 +259,13 @@  CvInitFileTree (
         return;
     }
 
+
+    AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
+    AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
+
     CvDbgPrint ("AmlLength: %x\n", AmlLength);
     CvDbgPrint ("AmlStart:  %p\n", AmlStart);
-    CvDbgPrint ("AmlEnd?:   %p\n", AmlStart+AmlLength);
+    CvDbgPrint ("AmlEnd:    %p\n", AmlStart+AmlLength);
 
     AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
 
@@ -273,7 +277,7 @@  CvInitFileTree (
 
     /* Set the root file to the current open file */
 
-    AcpiGbl_FileTreeRoot->File = AcpiGbl_OutputFile;
+    AcpiGbl_FileTreeRoot->File = RootFile;
 
     /*
      * Set this to true because we don't need to output
diff --git a/src/acpica/source/components/events/evevent.c b/src/acpica/source/components/events/evevent.c
index 800dd962..0afc7473 100644
--- a/src/acpica/source/components/events/evevent.c
+++ b/src/acpica/source/components/events/evevent.c
@@ -299,7 +299,7 @@  AcpiEvFixedEventInitialize (
 
     /*
      * Initialize the structure that keeps track of fixed event handlers and
-     * enable the fixed events.
+     * disable all of the fixed events.
      */
     for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
     {
diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
index 131021f1..d652c29f 100644
--- a/src/acpica/source/components/events/evxfgpe.c
+++ b/src/acpica/source/components/events/evxfgpe.c
@@ -1065,6 +1065,44 @@  AcpiEnableAllWakeupGpes (
 ACPI_EXPORT_SYMBOL (AcpiEnableAllWakeupGpes)
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiAnyGpeStatusSet
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Whether or not the status bit is set for any GPE
+ *
+ * DESCRIPTION: Check the status bits of all enabled GPEs and return TRUE if any
+ *              of them is set or FALSE otherwise.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiAnyGpeStatusSet (
+    void)
+{
+    ACPI_STATUS                Status;
+    UINT8                      Ret;
+
+
+    ACPI_FUNCTION_TRACE (AcpiAnyGpeStatusSet);
+
+    Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+    if (ACPI_FAILURE (Status))
+    {
+        return (FALSE);
+    }
+
+    Ret = AcpiHwCheckAllGpes ();
+    (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+
+    return (Ret);
+}
+
+ACPI_EXPORT_SYMBOL(AcpiAnyGpeStatusSet)
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiInstallGpeBlock
diff --git a/src/acpica/source/components/hardware/hwgpe.c b/src/acpica/source/components/hardware/hwgpe.c
index f0b32bd6..e8ad8926 100644
--- a/src/acpica/source/components/hardware/hwgpe.c
+++ b/src/acpica/source/components/hardware/hwgpe.c
@@ -635,6 +635,58 @@  AcpiHwEnableWakeupGpeBlock (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiHwGetGpeBlockStatus
+ *
+ * PARAMETERS:  GpeXruptInfo    - GPE Interrupt info
+ *              GpeBlock        - Gpe Block info
+ *
+ * RETURN:      Success
+ *
+ * DESCRIPTION: Produce a combined GPE status bits mask for the given block.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiHwGetGpeBlockStatus(
+    ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
+    ACPI_GPE_BLOCK_INFO     *GpeBlock,
+    void *RetPtr)
+{
+    ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
+    UINT64                  InEnable;
+    UINT64                  InStatus;
+    ACPI_STATUS             Status;
+    UINT8                   *Ret = RetPtr;
+    UINT32                  i;
+
+
+    /* Examine each GPE Register within the block */
+
+    for (i = 0; i < GpeBlock->RegisterCount; i++)
+    {
+        GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
+
+        Status = AcpiHwRead (&InEnable, &GpeRegisterInfo->EnableAddress);
+        if (ACPI_FAILURE (Status))
+        {
+            continue;
+        }
+
+        Status = AcpiHwRead (&InStatus, &GpeRegisterInfo->StatusAddress);
+        if (ACPI_FAILURE (Status))
+        {
+            continue;
+        }
+
+        *Ret |= InEnable & InStatus;
+    }
+
+    return (AE_OK);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    AcpiHwDisableAllGpes
@@ -715,4 +767,31 @@  AcpiHwEnableAllWakeupGpes (
     return_ACPI_STATUS (Status);
 }
 
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiHwCheckAllGpes
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Combined status of all GPEs
+ *
+ * DESCRIPTION: Check all enabled GPEs in all GPE blocks and return TRUE if the
+ *              status bit is set for at least one of them of FALSE otherwise.
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiHwCheckAllGpes (
+    void)
+{
+    UINT8                      Ret = 0;
+
+
+    ACPI_FUNCTION_TRACE (AcpiHwCheckAllGpes);
+
+    (void) AcpiEvWalkGpeList (AcpiHwGetGpeBlockStatus, &Ret);
+    return (Ret != 0);
+}
+
 #endif /* !ACPI_REDUCED_HARDWARE */
diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
index 3ad4ae23..016f62be 100644
--- a/src/acpica/source/components/hardware/hwsleep.c
+++ b/src/acpica/source/components/hardware/hwsleep.c
@@ -464,6 +464,16 @@  AcpiHwLegacyWake (
             AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
             ACPI_CLEAR_STATUS);
 
+    /* Enable sleep button */
+
+	(void) AcpiWriteBitRegister (
+            AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].EnableRegisterId,
+            ACPI_ENABLE_EVENT);
+
+	(void) AcpiWriteBitRegister (
+            AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId,
+            ACPI_CLEAR_STATUS);
+
     AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
     return_ACPI_STATUS (Status);
 }
diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
index eebdd1a2..a9509195 100644
--- a/src/acpica/source/components/namespace/nsnames.c
+++ b/src/acpica/source/components/namespace/nsnames.c
@@ -336,7 +336,7 @@  AcpiNsHandleToPathname (
     /* Build the path in the caller buffer */
 
     (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer,
-        RequiredSize, NoTrailing);
+        (UINT32) RequiredSize, NoTrailing);
 
     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n",
         (char *) Buffer->Pointer, (UINT32) RequiredSize));
@@ -509,7 +509,7 @@  AcpiNsGetNormalizedPathname (
 
     /* Build the path in the allocated buffer */
 
-    (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing);
+    (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, (UINT32) Size, NoTrailing);
 
     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%s: Path \"%s\"\n",
         ACPI_GET_FUNCTION_NAME, NameBuffer));
@@ -542,7 +542,7 @@  AcpiNsBuildPrefixedPathname (
     char                    *FullPath = NULL;
     char                    *ExternalPath = NULL;
     char                    *PrefixPath = NULL;
-    UINT32                  PrefixPathLength = 0;
+    ACPI_SIZE               PrefixPathLength = 0;
 
 
     /* If there is a prefix, get the pathname to it */
diff --git a/src/acpica/source/components/namespace/nsxfname.c b/src/acpica/source/components/namespace/nsxfname.c
index 5b3d5a9b..53a2f4bf 100644
--- a/src/acpica/source/components/namespace/nsxfname.c
+++ b/src/acpica/source/components/namespace/nsxfname.c
@@ -714,7 +714,7 @@  AcpiInstallMethod (
 
     MethodFlags = *ParserState.Aml++;
     AmlStart = ParserState.Aml;
-    AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
+    AmlLength = (UINT32) ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
 
     /*
      * Allocate resources up-front. We don't want to have to delete a new
diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
index 3c17ee00..682cb5a8 100644
--- a/src/acpica/source/components/tables/tbxface.c
+++ b/src/acpica/source/components/tables/tbxface.c
@@ -368,14 +368,14 @@  ACPI_EXPORT_SYMBOL_INIT (AcpiReallocateRootTable)
  *
  * PARAMETERS:  Signature           - ACPI signature of needed table
  *              Instance            - Which instance (for SSDTs)
- *              OutTableHeader      - The pointer to the table header to fill
+ *              OutTableHeader      - The pointer to the where the table header
+ *                                    is returned
  *
- * RETURN:      Status and pointer to mapped table header
+ * RETURN:      Status and a copy of the table header
  *
- * DESCRIPTION: Finds an ACPI table header.
- *
- * NOTE:        Caller is responsible in unmapping the header with
- *              AcpiOsUnmapMemory
+ * DESCRIPTION: Finds and returns an ACPI table header. Caller provides the
+ *              memory where a copy of the header is to be returned
+ *              (fixed length).
  *
  ******************************************************************************/
 
diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
index e4b93058..71244e51 100644
--- a/src/acpica/source/components/utilities/utobject.c
+++ b/src/acpica/source/components/utilities/utobject.c
@@ -192,7 +192,7 @@  AcpiUtGetElementLength (
  *
  * NOTE:        We always allocate the worst-case object descriptor because
  *              these objects are cached, and we want them to be
- *              one-size-satisifies-any-request. This in itself may not be
+ *              one-size-satisfies-any-request. This in itself may not be
  *              the most memory efficient, but the efficiency of the object
  *              cache should more than make up for this!
  *
diff --git a/src/acpica/source/include/acconvert.h b/src/acpica/source/include/acconvert.h
index 2894b729..0962a164 100644
--- a/src/acpica/source/include/acconvert.h
+++ b/src/acpica/source/include/acconvert.h
@@ -237,8 +237,7 @@  CgWriteAmlComment (
 void
 CvInitFileTree (
     ACPI_TABLE_HEADER       *Table,
-    UINT8                   *AmlStart,
-    UINT32                  AmlLength);
+    FILE                    *RootFile);
 
 void
 CvClearOpComments (
diff --git a/src/acpica/source/include/achware.h b/src/acpica/source/include/achware.h
index 646cef85..9ff14d95 100644
--- a/src/acpica/source/include/achware.h
+++ b/src/acpica/source/include/achware.h
@@ -315,6 +315,10 @@  ACPI_STATUS
 AcpiHwEnableAllWakeupGpes (
     void);
 
+UINT8
+AcpiHwCheckAllGpes (
+    void);
+
 ACPI_STATUS
 AcpiHwEnableRuntimeGpeBlock (
     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo,
diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
index 340875e8..71cd18e2 100644
--- a/src/acpica/source/include/acmacros.h
+++ b/src/acpica/source/include/acmacros.h
@@ -625,7 +625,7 @@ 
 #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d) CvPrintOneCommentType (a,b,c,d);
 #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b) CvPrintOneCommentList (a,b);
 #define ASL_CV_FILE_HAS_SWITCHED(a)       CvFileHasSwitched(a)
-#define ASL_CV_INIT_FILETREE(a,b,c)      CvInitFileTree(a,b,c);
+#define ASL_CV_INIT_FILETREE(a,b)      CvInitFileTree(a,b);
 
 #else
 
@@ -640,7 +640,7 @@ 
 #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d)
 #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b)
 #define ASL_CV_FILE_HAS_SWITCHED(a)       0
-#define ASL_CV_INIT_FILETREE(a,b,c)
+#define ASL_CV_INIT_FILETREE(a,b)
 
 #endif
 
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 10e5e79a..a39d180e 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                 0x20200110
+#define ACPI_CA_VERSION                 0x20200214
 
 #include "acconfig.h"
 #include "actypes.h"
@@ -1109,6 +1109,10 @@  ACPI_STATUS
 AcpiEnableAllWakeupGpes (
     void))
 
+ACPI_HW_DEPENDENT_RETURN_UINT32 (
+    UINT32                  AcpiAnyGpeStatusSet (
+    void))
+
 ACPI_HW_DEPENDENT_RETURN_STATUS (
 ACPI_STATUS
 AcpiGetGpeDevice (
diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
index 6cb327a1..1f0d5c2f 100644
--- a/src/acpica/source/include/actbl1.h
+++ b/src/acpica/source/include/actbl1.h
@@ -1149,7 +1149,7 @@  enum AcpiErstInstructions
 
 enum AcpiErstCommandStatus
 {
-    ACPI_ERST_SUCESS                = 0,
+    ACPI_ERST_SUCCESS                = 0,
     ACPI_ERST_NO_SPACE              = 1,
     ACPI_ERST_NOT_AVAILABLE         = 2,
     ACPI_ERST_FAILURE               = 3,
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index 532d1fa8..c7d2c9aa 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -683,11 +683,12 @@  typedef UINT64                          ACPI_INTEGER;
                                       strnlen (a, ACPI_NAMESEG_SIZE) == ACPI_NAMESEG_SIZE)
 
 /*
- * Algorithm to obtain access bit width.
- * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
+ * Algorithm to obtain access bit or byte width.
+ * Can be used with AccessSize field of ACPI_GENERIC_ADDRESS and
  * ACPI_RESOURCE_GENERIC_REGISTER.
  */
-#define ACPI_ACCESS_BIT_WIDTH(size)     (1 << ((size) + 2))
+#define ACPI_ACCESS_BIT_WIDTH(AccessSize)   (1 << ((AccessSize) + 2))
+#define ACPI_ACCESS_BYTE_WIDTH(AccessSize)  (1 << ((AccessSize) - 1))
 
 
 /*******************************************************************************