Patchwork [2/4] acpica: use latest ACPICA source

login
register
mail settings
Submitter Colin King
Date July 17, 2012, 11:52 p.m.
Message ID <1342569140-21829-3-git-send-email-colin.king@canonical.com>
Download mbox | patch
Permalink /patch/171576/
State Accepted
Headers show

Comments

Colin King - July 17, 2012, 11:52 p.m.
From: Colin Ian King <colin.king@canonical.com>

Update to ACPICA version 20120711, commit
b9058029d3bd6216f594a3b5e70b2f6cba1052ad to get the latest
goodness.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/Makefile.am                             |    2 +
 src/acpica/source/common/adfile.c                  |   19 +-
 src/acpica/source/common/adwalk.c                  |   30 +-
 src/acpica/source/common/dmextern.c                |   36 +-
 src/acpica/source/common/dmrestag.c                |   21 +-
 src/acpica/source/compiler/Makefile.am             |    1 +
 src/acpica/source/compiler/aslcompile.c            |  121 ++++---
 src/acpica/source/compiler/aslcompiler.h           |    9 +-
 src/acpica/source/compiler/aslcompiler.l           |    1 +
 src/acpica/source/compiler/aslcompiler.y           |    4 +-
 src/acpica/source/compiler/aslerror.c              |   23 +-
 src/acpica/source/compiler/aslfiles.c              |  126 ++++++-
 src/acpica/source/compiler/asllookup.c             |    2 +-
 src/acpica/source/compiler/aslmain.c               |   66 ++--
 src/acpica/source/compiler/aslmap.c                |    1 +
 src/acpica/source/compiler/aslmessages.h           |   11 +-
 src/acpica/source/compiler/aslstartup.c            |    2 +-
 src/acpica/source/compiler/aslsupport.l            |   52 ++-
 src/acpica/source/compiler/aslutils.c              |   90 ++---
 src/acpica/source/compiler/dtio.c                  |   45 ++-
 src/acpica/source/compiler/dttemplate.c            |    2 +-
 src/acpica/source/compiler/prscan.c                |    2 +-
 src/acpica/source/compiler/prutils.c               |   15 +-
 src/acpica/source/components/debugger/dbcmds.c     |  120 ++++---
 src/acpica/source/components/debugger/dbdisply.c   |   15 +-
 src/acpica/source/components/debugger/dbexec.c     |    6 +-
 src/acpica/source/components/debugger/dbfileio.c   |   13 +
 src/acpica/source/components/debugger/dbinput.c    |    4 +-
 src/acpica/source/components/debugger/dbstats.c    |   28 +-
 src/acpica/source/components/debugger/dbutils.c    |    4 +-
 .../source/components/disassembler/dmopcode.c      |  213 ++++++++++++
 src/acpica/source/components/disassembler/dmwalk.c |   55 +++-
 src/acpica/source/components/dispatcher/dsfield.c  |   88 ++++-
 src/acpica/source/components/dispatcher/dsopcode.c |   14 +-
 src/acpica/source/components/dispatcher/dswload.c  |   14 +
 src/acpica/source/components/dispatcher/dswload2.c |   14 +
 src/acpica/source/components/events/evgpe.c        |   15 +-
 src/acpica/source/components/events/evgpeutil.c    |   19 ++
 src/acpica/source/components/events/evmisc.c       |  183 ++++-------
 src/acpica/source/components/events/evxface.c      |  344 ++++++++++----------
 src/acpica/source/components/events/evxfgpe.c      |   86 ++++-
 src/acpica/source/components/executer/exconfig.c   |    2 +-
 src/acpica/source/components/executer/exdump.c     |   24 +-
 src/acpica/source/components/executer/exprep.c     |    4 +-
 src/acpica/source/components/executer/exresolv.c   |    2 +-
 src/acpica/source/components/executer/exstore.c    |    6 +-
 src/acpica/source/components/executer/exutils.c    |    2 +-
 src/acpica/source/components/hardware/hwsleep.c    |   25 --
 src/acpica/source/components/hardware/hwxfsleep.c  |    8 +
 src/acpica/source/components/namespace/nspredef.c  |    2 +-
 src/acpica/source/components/parser/psxface.c      |    4 +-
 src/acpica/source/components/resources/rscreate.c  |    6 +-
 src/acpica/source/components/resources/rsutils.c   |    2 +-
 src/acpica/source/components/tables/tbfadt.c       |   64 ++--
 src/acpica/source/components/tables/tbinstal.c     |    5 +-
 src/acpica/source/components/tables/tbutils.c      |   17 +-
 src/acpica/source/components/tables/tbxface.c      |  159 +--------
 src/acpica/source/components/tables/tbxfroot.c     |    2 +-
 src/acpica/source/components/utilities/utdecode.c  |   62 +---
 src/acpica/source/components/utilities/utdelete.c  |   21 +-
 src/acpica/source/components/utilities/utglobal.c  |    9 +-
 src/acpica/source/components/utilities/utmisc.c    |   81 +----
 src/acpica/source/components/utilities/utobject.c  |    6 +-
 src/acpica/source/components/utilities/utresrc.c   |    4 +-
 src/acpica/source/components/utilities/uttrack.c   |    6 +-
 src/acpica/source/components/utilities/utxferror.c |   81 +++++
 src/acpica/source/include/acdebug.h                |    5 +-
 src/acpica/source/include/acdisasm.h               |    8 +
 src/acpica/source/include/acexcep.h                |    5 +-
 src/acpica/source/include/acglobal.h               |   22 +-
 src/acpica/source/include/aclocal.h                |   45 ++-
 src/acpica/source/include/acmacros.h               |    4 +-
 src/acpica/source/include/acobject.h               |   15 +-
 src/acpica/source/include/acoutput.h               |    4 +
 src/acpica/source/include/acpiosxf.h               |    2 +-
 src/acpica/source/include/acpixf.h                 |   36 +-
 src/acpica/source/include/acpredef.h               |    6 +-
 src/acpica/source/include/actbl1.h                 |    2 +-
 src/acpica/source/include/actypes.h                |    7 +-
 src/acpica/source/include/acutils.h                |    6 +-
 src/acpica/source/include/platform/acenv.h         |    5 +-
 .../source/os_specific/service_layers/osunixxf.c   |   31 +-
 src/acpica/source/tools/acpiexec/aecommon.h        |    1 +
 src/acpica/source/tools/acpiexec/aehandlers.c      |  163 ++++++++--
 84 files changed, 1846 insertions(+), 1041 deletions(-)
Ivan Hu - July 20, 2012, 9:48 a.m.
On 07/18/2012 07:52 AM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Update to ACPICA version 20120711, commit
> b9058029d3bd6216f594a3b5e70b2f6cba1052ad to get the latest
> goodness.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/Makefile.am                             |    2 +
>   src/acpica/source/common/adfile.c                  |   19 +-
>   src/acpica/source/common/adwalk.c                  |   30 +-
>   src/acpica/source/common/dmextern.c                |   36 +-
>   src/acpica/source/common/dmrestag.c                |   21 +-
>   src/acpica/source/compiler/Makefile.am             |    1 +
>   src/acpica/source/compiler/aslcompile.c            |  121 ++++---
>   src/acpica/source/compiler/aslcompiler.h           |    9 +-
>   src/acpica/source/compiler/aslcompiler.l           |    1 +
>   src/acpica/source/compiler/aslcompiler.y           |    4 +-
>   src/acpica/source/compiler/aslerror.c              |   23 +-
>   src/acpica/source/compiler/aslfiles.c              |  126 ++++++-
>   src/acpica/source/compiler/asllookup.c             |    2 +-
>   src/acpica/source/compiler/aslmain.c               |   66 ++--
>   src/acpica/source/compiler/aslmap.c                |    1 +
>   src/acpica/source/compiler/aslmessages.h           |   11 +-
>   src/acpica/source/compiler/aslstartup.c            |    2 +-
>   src/acpica/source/compiler/aslsupport.l            |   52 ++-
>   src/acpica/source/compiler/aslutils.c              |   90 ++---
>   src/acpica/source/compiler/dtio.c                  |   45 ++-
>   src/acpica/source/compiler/dttemplate.c            |    2 +-
>   src/acpica/source/compiler/prscan.c                |    2 +-
>   src/acpica/source/compiler/prutils.c               |   15 +-
>   src/acpica/source/components/debugger/dbcmds.c     |  120 ++++---
>   src/acpica/source/components/debugger/dbdisply.c   |   15 +-
>   src/acpica/source/components/debugger/dbexec.c     |    6 +-
>   src/acpica/source/components/debugger/dbfileio.c   |   13 +
>   src/acpica/source/components/debugger/dbinput.c    |    4 +-
>   src/acpica/source/components/debugger/dbstats.c    |   28 +-
>   src/acpica/source/components/debugger/dbutils.c    |    4 +-
>   .../source/components/disassembler/dmopcode.c      |  213 ++++++++++++
>   src/acpica/source/components/disassembler/dmwalk.c |   55 +++-
>   src/acpica/source/components/dispatcher/dsfield.c  |   88 ++++-
>   src/acpica/source/components/dispatcher/dsopcode.c |   14 +-
>   src/acpica/source/components/dispatcher/dswload.c  |   14 +
>   src/acpica/source/components/dispatcher/dswload2.c |   14 +
>   src/acpica/source/components/events/evgpe.c        |   15 +-
>   src/acpica/source/components/events/evgpeutil.c    |   19 ++
>   src/acpica/source/components/events/evmisc.c       |  183 ++++-------
>   src/acpica/source/components/events/evxface.c      |  344 ++++++++++----------
>   src/acpica/source/components/events/evxfgpe.c      |   86 ++++-
>   src/acpica/source/components/executer/exconfig.c   |    2 +-
>   src/acpica/source/components/executer/exdump.c     |   24 +-
>   src/acpica/source/components/executer/exprep.c     |    4 +-
>   src/acpica/source/components/executer/exresolv.c   |    2 +-
>   src/acpica/source/components/executer/exstore.c    |    6 +-
>   src/acpica/source/components/executer/exutils.c    |    2 +-
>   src/acpica/source/components/hardware/hwsleep.c    |   25 --
>   src/acpica/source/components/hardware/hwxfsleep.c  |    8 +
>   src/acpica/source/components/namespace/nspredef.c  |    2 +-
>   src/acpica/source/components/parser/psxface.c      |    4 +-
>   src/acpica/source/components/resources/rscreate.c  |    6 +-
>   src/acpica/source/components/resources/rsutils.c   |    2 +-
>   src/acpica/source/components/tables/tbfadt.c       |   64 ++--
>   src/acpica/source/components/tables/tbinstal.c     |    5 +-
>   src/acpica/source/components/tables/tbutils.c      |   17 +-
>   src/acpica/source/components/tables/tbxface.c      |  159 +--------
>   src/acpica/source/components/tables/tbxfroot.c     |    2 +-
>   src/acpica/source/components/utilities/utdecode.c  |   62 +---
>   src/acpica/source/components/utilities/utdelete.c  |   21 +-
>   src/acpica/source/components/utilities/utglobal.c  |    9 +-
>   src/acpica/source/components/utilities/utmisc.c    |   81 +----
>   src/acpica/source/components/utilities/utobject.c  |    6 +-
>   src/acpica/source/components/utilities/utresrc.c   |    4 +-
>   src/acpica/source/components/utilities/uttrack.c   |    6 +-
>   src/acpica/source/components/utilities/utxferror.c |   81 +++++
>   src/acpica/source/include/acdebug.h                |    5 +-
>   src/acpica/source/include/acdisasm.h               |    8 +
>   src/acpica/source/include/acexcep.h                |    5 +-
>   src/acpica/source/include/acglobal.h               |   22 +-
>   src/acpica/source/include/aclocal.h                |   45 ++-
>   src/acpica/source/include/acmacros.h               |    4 +-
>   src/acpica/source/include/acobject.h               |   15 +-
>   src/acpica/source/include/acoutput.h               |    4 +
>   src/acpica/source/include/acpiosxf.h               |    2 +-
>   src/acpica/source/include/acpixf.h                 |   36 +-
>   src/acpica/source/include/acpredef.h               |    6 +-
>   src/acpica/source/include/actbl1.h                 |    2 +-
>   src/acpica/source/include/actypes.h                |    7 +-
>   src/acpica/source/include/acutils.h                |    6 +-
>   src/acpica/source/include/platform/acenv.h         |    5 +-
>   .../source/os_specific/service_layers/osunixxf.c   |   31 +-
>   src/acpica/source/tools/acpiexec/aecommon.h        |    1 +
>   src/acpica/source/tools/acpiexec/aehandlers.c      |  163 ++++++++--
>   84 files changed, 1846 insertions(+), 1041 deletions(-)
>
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 3187432..e2213d5 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -175,6 +175,7 @@ libfwtsacpica_la_SOURCES = \
>   	$(ACPICA_COMP)/tables/tbutils.c \
>   	$(ACPICA_COMP)/tables/tbxface.c \
>   	$(ACPICA_COMP)/tables/tbxfroot.c \
> +	$(ACPICA_COMP)/tables/tbxfload.c \
>   	$(ACPICA_COMP)/utilities/utaddress.c \
>   	$(ACPICA_COMP)/utilities/utalloc.c \
>   	$(ACPICA_COMP)/utilities/utcache.c \
> @@ -197,6 +198,7 @@ libfwtsacpica_la_SOURCES = \
>   	$(ACPICA_COMP)/utilities/utxferror.c \
>   	$(ACPICA_COMP)/utilities/utxface.c \
>   	$(ACPICA_COMP)/utilities/utdecode.c \
> +	$(ACPICA_COMP)/utilities/utexcep.c \
>   	$(ACPICA_SRC)/tools/acpiexec/aehandlers.c
>
>   libfwtsacpica_la_LIBADD = \
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index f4e33e2..36c3176 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -370,20 +370,24 @@ FlSplitInputPathname (
>           return (AE_NO_MEMORY);
>       }
>
> -    Substring = strrchr (DirectoryPath, '\\');
> +    /* Convert backslashes to slashes in the entire path */
> +
> +    UtConvertBackslashes (DirectoryPath);
> +
> +    /* Backup to last slash or colon */
> +
> +    Substring = strrchr (DirectoryPath, '/');
>       if (!Substring)
>       {
> -        Substring = strrchr (DirectoryPath, '/');
> -        if (!Substring)
> -        {
> -            Substring = strrchr (DirectoryPath, ':');
> -        }
> +        Substring = strrchr (DirectoryPath, ':');
>       }
>
> +    /* Extract the simple filename */
> +
>       if (!Substring)
>       {
> +        Filename = FlStrdup (DirectoryPath);
>           DirectoryPath[0] = 0;
> -        Filename = FlStrdup (InputPath);
>       }
>       else
>       {
> @@ -398,7 +402,6 @@ FlSplitInputPathname (
>
>       *OutDirectoryPath = DirectoryPath;
>       *OutFilename = Filename;
> -
>       return (AE_OK);
>   }
>
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index eeb61d8..00d9bb6 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -593,6 +593,7 @@ AcpiDmFindOrphanDescending (
>
>           if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
>               (OpInfo->Class != AML_CLASS_CREATE) &&
> +            (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
>               (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
>               !Op->Common.Node)
>           {
> @@ -815,13 +816,23 @@ AcpiDmXrefDescendingOp (
>
>       if (OpInfo->Flags & AML_NAMED)
>       {
> -        if ((Op->Common.AmlOpcode == AML_ALIAS_OP) ||
> -            (Op->Common.AmlOpcode == AML_SCOPE_OP))
> +        /*
> +         * Only these two operators (Alias, Scope) refer to an existing
> +         * name, it is the first argument
> +         */
> +        if (Op->Common.AmlOpcode == AML_ALIAS_OP)
> +        {
> +            ObjectType = ACPI_TYPE_ANY;
> +
> +            NextOp = Op->Common.Value.Arg;
> +            NextOp = NextOp->Common.Value.Arg;
> +            if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
> +            {
> +                Path = NextOp->Common.Value.String;
> +            }
> +        }
> +        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
>           {
> -            /*
> -             * Only these two operators refer to an existing name,
> -             * first argument
> -             */
>               Path = (char *) Op->Named.Path;
>           }
>       }
> @@ -829,6 +840,8 @@ AcpiDmXrefDescendingOp (
>       {
>           /* Referenced Buffer Name is the first child */
>
> +        ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
> +
>           NextOp = Op->Common.Value.Arg;
>           if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
>           {
> @@ -855,6 +868,11 @@ AcpiDmXrefDescendingOp (
>       Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
>                   ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
>                   WalkState, &Node);
> +    if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
> +    {
> +        Status = AE_NOT_FOUND;
> +    }
> +
>       if (ACPI_FAILURE (Status))
>       {
>           if (Status == AE_NOT_FOUND)
> diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
> index 8b8402e..622db8a 100644
> --- a/src/acpica/source/common/dmextern.c
> +++ b/src/acpica/source/common/dmextern.c
> @@ -293,8 +293,10 @@ AcpiDmNormalizeParentPrefix (
>        */
>       ACPI_STRCAT (Fullpath, ParentPath);
>
> -    /* Add dot separator (don't need dot if parent fullpath is a single "\") */
> -
> +    /*
> +     * Add dot separator
> +     * (don't need dot if parent fullpath is a single backslash)
> +     */
>       if (ParentPath[1])
>       {
>           ACPI_STRCAT (Fullpath, ".");
> @@ -526,12 +528,12 @@ AcpiDmAddToExternalList (
>
>       NewExternal->InternalPath = Path;
>
> -    /* Link the new descriptor into the global list, ordered by string length */
> +    /* Link the new descriptor into the global list, alphabetically ordered */
>
>       NextExternal = AcpiGbl_ExternalList;
>       while (NextExternal)
>       {
> -        if (NewExternal->Length <= NextExternal->Length)
> +        if (AcpiUtStricmp (NewExternal->Path, NextExternal->Path) < 0)
>           {
>               if (PrevExternal)
>               {
> @@ -580,7 +582,7 @@ AcpiDmAddExternalsToNamespace (
>   {
>       ACPI_STATUS             Status;
>       ACPI_NAMESPACE_NODE     *Node;
> -    ACPI_OPERAND_OBJECT     *MethodDesc;
> +    ACPI_OPERAND_OBJECT     *ObjDesc;
>       ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
>
>
> @@ -599,13 +601,29 @@ AcpiDmAddExternalsToNamespace (
>                   "while adding external to namespace [%s]",
>                   External->Path));
>           }
> -        else if (External->Type == ACPI_TYPE_METHOD)
> +
> +        else switch (External->Type)
>           {
> +        case ACPI_TYPE_METHOD:
> +
>               /* For methods, we need to save the argument count */
>
> -            MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> -            MethodDesc->Method.ParamCount = (UINT8) External->Value;
> -            Node->Object = MethodDesc;
> +            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> +            ObjDesc->Method.ParamCount = (UINT8) External->Value;
> +            Node->Object = ObjDesc;
> +            break;
> +
> +        case ACPI_TYPE_REGION:
> +
> +            /* Regions require a region sub-object */
> +
> +            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> +            ObjDesc->Region.Node = Node;
> +            Node->Object = ObjDesc;
> +            break;
> +
> +        default:
> +            break;
>           }
>
>           External = External->Next;
> diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
> index 1f0c5fb..9afaad3 100644
> --- a/src/acpica/source/common/dmrestag.c
> +++ b/src/acpica/source/common/dmrestag.c
> @@ -145,6 +145,7 @@ AcpiDmGetResourceTag (
>
>   static char *
>   AcpiGetTagPathname (
> +    ACPI_PARSE_OBJECT       *Op,
>       ACPI_NAMESPACE_NODE     *BufferNode,
>       ACPI_NAMESPACE_NODE     *ResourceNode,
>       UINT32                  BitIndex);
> @@ -515,7 +516,6 @@ AcpiDmCheckResourceReference (
>       ACPI_NAMESPACE_NODE     *BufferNode;
>       ACPI_NAMESPACE_NODE     *ResourceNode;
>       const ACPI_OPCODE_INFO  *OpInfo;
> -    char                    *Pathname;
>       UINT32                  BitIndex;
>
>
> @@ -591,14 +591,7 @@ AcpiDmCheckResourceReference (
>
>       /* Translate the Index to a resource tag pathname */
>
> -    Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex);
> -    if (Pathname)
> -    {
> -        /* Complete the conversion of the Index to a symbol */
> -
> -        IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> -        IndexOp->Common.Value.String = Pathname;
> -    }
> +    AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex);
>   }
>
>
> @@ -669,6 +662,7 @@ AcpiDmGetResourceNode (
>
>   static char *
>   AcpiGetTagPathname (
> +    ACPI_PARSE_OBJECT       *IndexOp,
>       ACPI_NAMESPACE_NODE     *BufferNode,
>       ACPI_NAMESPACE_NODE     *ResourceNode,
>       UINT32                  BitIndex)
> @@ -761,6 +755,15 @@ AcpiGetTagPathname (
>
>       AcpiNsInternalizeName (Pathname, &InternalPath);
>       ACPI_FREE (Pathname);
> +
> +    /* Update the Op with the symbol */
> +
> +    AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP);
> +    IndexOp->Common.Value.String = InternalPath;
> +
> +    /* We will need the tag later. Cheat by putting it in the Node field */
> +
> +    IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag);
>       return (InternalPath);
>   }
>
> diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
> index cee1f4f..b7a72c9 100644
> --- a/src/acpica/source/compiler/Makefile.am
> +++ b/src/acpica/source/compiler/Makefile.am
> @@ -183,6 +183,7 @@ libfwtsiasl_la_SOURCES = \
>   	$(ACPICA_COMMON)/adfile.c \
>   	$(ACPICA_COMMON)/adisasm.c \
>   	$(ACPICA_COMMON)/adwalk.c \
> +	$(ACPICA_COMMON)/ahpredef.c \
>   	$(ACPICA_COMMON)/dmextern.c \
>   	$(ACPICA_COMMON)/dmrestag.c \
>   	$(ACPICA_COMMON)/dmtable.c \
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 371a6e3..623bc3d 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -131,14 +131,18 @@ CmFlushSourceCode (
>
>   static void
>   FlConsumeAnsiComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>       ASL_FILE_STATUS         *Status);
>
>   static void
>   FlConsumeNewComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>       ASL_FILE_STATUS         *Status);
>
> +static void
> +CmDumpAllEvents (
> +    void);
> +
>
>   /*******************************************************************************
>    *
> @@ -325,7 +329,8 @@ CmFlushSourceCode (
>    *
>    * FUNCTION:    FlConsume*
>    *
> - * PARAMETERS:  FileInfo        - Points to an open input file
> + * PARAMETERS:  Handle              - Open input file
> + *              Status              - File current status struct
>    *
>    * RETURN:      Number of lines consumed
>    *
> @@ -335,14 +340,14 @@ CmFlushSourceCode (
>
>   static void
>   FlConsumeAnsiComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>       ASL_FILE_STATUS         *Status)
>   {
>       UINT8                   Byte;
>       BOOLEAN                 ClosingComment = FALSE;
>
>
> -    while (fread (&Byte, 1, 1, FileInfo->Handle))
> +    while (fread (&Byte, 1, 1, Handle))
>       {
>           /* Scan until comment close is found */
>
> @@ -379,13 +384,13 @@ FlConsumeAnsiComment (
>
>   static void
>   FlConsumeNewComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>       ASL_FILE_STATUS         *Status)
>   {
>       UINT8                   Byte;
>
>
> -    while (fread (&Byte, 1, 1, FileInfo->Handle))
> +    while (fread (&Byte, 1, 1, Handle))
>       {
>           Status->Offset++;
>
> @@ -404,7 +409,9 @@ FlConsumeNewComment (
>    *
>    * FUNCTION:    FlCheckForAscii
>    *
> - * PARAMETERS:  FileInfo        - Points to an open input file
> + * PARAMETERS:  Handle              - Open input file
> + *              Filename            - Input filename
> + *              DisplayErrors       - TRUE if error messages desired
>    *
>    * RETURN:      Status
>    *
> @@ -419,7 +426,9 @@ FlConsumeNewComment (
>
>   ACPI_STATUS
>   FlCheckForAscii (
> -    ASL_FILE_INFO           *FileInfo)
> +    FILE                    *Handle,
> +    char                    *Filename,
> +    BOOLEAN                 DisplayErrors)
>   {
>       UINT8                   Byte;
>       ACPI_SIZE               BadBytes = 0;
> @@ -432,7 +441,7 @@ FlCheckForAscii (
>
>       /* Read the entire file */
>
> -    while (fread (&Byte, 1, 1, FileInfo->Handle))
> +    while (fread (&Byte, 1, 1, Handle))
>       {
>           /* Ignore comment fields (allow non-ascii within) */
>
> @@ -442,12 +451,12 @@ FlCheckForAscii (
>
>               if (Byte == '*')
>               {
> -                FlConsumeAnsiComment (FileInfo, &Status);
> +                FlConsumeAnsiComment (Handle, &Status);
>               }
>
>               if (Byte == '/')
>               {
> -                FlConsumeNewComment (FileInfo, &Status);
> +                FlConsumeNewComment (Handle, &Status);
>               }
>
>               /* Reset */
> @@ -463,7 +472,7 @@ FlCheckForAscii (
>
>           if (!ACPI_IS_ASCII (Byte))
>           {
> -            if (BadBytes < 10)
> +            if ((BadBytes < 10) && (DisplayErrors))
>               {
>                   AcpiOsPrintf (
>                       "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n",
> @@ -485,20 +494,24 @@ FlCheckForAscii (
>
>       /* Seek back to the beginning of the source file */
>
> -    fseek (FileInfo->Handle, 0, SEEK_SET);
> +    fseek (Handle, 0, SEEK_SET);
>
>       /* Were there any non-ASCII characters in the file? */
>
>       if (BadBytes)
>       {
> -        AcpiOsPrintf (
> -            "%u non-ASCII characters found in input source text, could be a binary file\n",
> -            BadBytes);
> -        AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename);
> +        if (DisplayErrors)
> +        {
> +            AcpiOsPrintf (
> +                "%u non-ASCII characters found in input source text, could be a binary file\n",
> +                BadBytes);
> +            AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, Filename);
> +        }
> +
>           return (AE_BAD_CHARACTER);
>       }
>
> -    /* File is OK */
> +    /* File is OK (100% ASCII) */
>
>       return (AE_OK);
>   }
> @@ -780,45 +793,65 @@ CmDoOutputFiles (
>
>   /*******************************************************************************
>    *
> - * FUNCTION:    CmDumpEvent
> + * FUNCTION:    CmDumpAllEvents
>    *
> - * PARAMETERS:  Event           - A compiler event struct
> + * PARAMETERS:  None
>    *
>    * RETURN:      None.
>    *
> - * DESCRIPTION: Dump a compiler event struct
> + * DESCRIPTION: Dump all compiler events
>    *
>    ******************************************************************************/
>
>   static void
> -CmDumpEvent (
> -    ASL_EVENT_INFO          *Event)
> +CmDumpAllEvents (
> +    void)
>   {
> +    ASL_EVENT_INFO          *Event;
>       UINT32                  Delta;
>       UINT32                  USec;
>       UINT32                  MSec;
> +    UINT32                  i;
>
> -    if (!Event->Valid)
> +
> +    Event = AslGbl_Events;
> +
> +    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
> +    if (Gbl_CompileTimesFlag)
>       {
> -        return;
> +        printf ("\nElapsed time for major events\n\n");
>       }
>
> -    /* Delta will be in 100-nanosecond units */
> +    for (i = 0; i < AslGbl_NextEvent; i++)
> +    {
> +        if (Event->Valid)
> +        {
> +            /* Delta will be in 100-nanosecond units */
>
> -    Delta = (UINT32) (Event->EndTime - Event->StartTime);
> +            Delta = (UINT32) (Event->EndTime - Event->StartTime);
>
> -    USec = Delta / 10;
> -    MSec = Delta / 10000;
> +            USec = Delta / 10;
> +            MSec = Delta / 10000;
>
> -    /* Round milliseconds up */
> +            /* Round milliseconds up */
>
> -    if ((USec - (MSec * 1000)) >= 500)
> -    {
> -        MSec++;
> -    }
> +            if ((USec - (MSec * 1000)) >= 500)
> +            {
> +                MSec++;
> +            }
>
> -    DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
> -        USec, MSec, Event->EventName);
> +            DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
> +                USec, MSec, Event->EventName);
> +
> +            if (Gbl_CompileTimesFlag)
> +            {
> +                printf ("%8u usec %8u msec - %s\n",
> +                    USec, MSec, Event->EventName);
> +            }
> +        }
> +
> +        Event++;
> +    }
>   }
>
>
> @@ -849,20 +882,12 @@ CmCleanupAndExit (
>           AePrintErrorLog (ASL_FILE_STDOUT);
>       }
>
> -    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
> -    for (i = 0; i < AslGbl_NextEvent; i++)
> -    {
> -        CmDumpEvent (&AslGbl_Events[i]);
> -    }
> +    /* Emit compile times if enabled */
> +
> +    CmDumpAllEvents ();
>
>       if (Gbl_CompileTimesFlag)
>       {
> -        printf ("\nElapsed time for major events\n\n");
> -        for (i = 0; i < AslGbl_NextEvent; i++)
> -        {
> -            CmDumpEvent (&AslGbl_Events[i]);
> -        }
> -
>           printf ("\nMiscellaneous compile statistics\n\n");
>           printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
>           printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 29558fc..03303f5 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -238,7 +238,9 @@ CmCleanupAndExit (
>
>   ACPI_STATUS
>   FlCheckForAscii (
> -    ASL_FILE_INFO           *FileInfo);
> +    FILE                    *Handle,
> +    char                    *Filename,
> +    BOOLEAN                 DisplayErrors);
>
>
>   /*
> @@ -680,6 +682,11 @@ void
>   FlAddIncludeDirectory (
>       char                    *Dir);
>
> +char *
> +FlMergePathnames (
> +    char                    *PrefixDir,
> +    char                    *FilePathname);
> +
>   void
>   FlOpenIncludeFile (
>       ACPI_PARSE_OBJECT       *Op);
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index f911072..98f9e7e 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -595,6 +595,7 @@ NamePathTail                [.]{NameSeg}
>   "IPMI"                      { count (0); return (PARSEOP_REGIONSPACE_IPMI); }
>   "GeneralPurposeIo"          { count (0); return (PARSEOP_REGIONSPACE_GPIO); }       /* ACPI 5.0 */
>   "GenericSerialBus"          { count (0); return (PARSEOP_REGIONSPACE_GSBUS); }      /* ACPI 5.0 */
> +"PCC"                       { count (0); return (PARSEOP_REGIONSPACE_PCC); }        /* ACPI 5.0 */
>   "FFixedHW"                  { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); }
>
>       /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */
> diff --git a/src/acpica/source/compiler/aslcompiler.y b/src/acpica/source/compiler/aslcompiler.y
> index 9aa8b51..9675b1d 100644
> --- a/src/acpica/source/compiler/aslcompiler.y
> +++ b/src/acpica/source/compiler/aslcompiler.y
> @@ -435,6 +435,7 @@ void *                      AslLocalAllocate (unsigned int Size);
>   %token <i> PARSEOP_REGIONSPACE_IO
>   %token <i> PARSEOP_REGIONSPACE_IPMI
>   %token <i> PARSEOP_REGIONSPACE_MEM
> +%token <i> PARSEOP_REGIONSPACE_PCC
>   %token <i> PARSEOP_REGIONSPACE_PCI
>   %token <i> PARSEOP_REGIONSPACE_PCIBAR
>   %token <i> PARSEOP_REGIONSPACE_SMBUS
> @@ -2271,7 +2272,7 @@ AddressKeyword
>       ;
>
>   AddressSpaceKeyword
> -    : ByteConst                             {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
> +    : ByteConst                             {$$ = UtCheckIntegerRange ($1, 0x0A, 0xFF);}
>       | RegionSpaceKeyword                    {}
>       ;
>
> @@ -2431,6 +2432,7 @@ RegionSpaceKeyword
>       | PARSEOP_REGIONSPACE_IPMI              {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_IPMI);}
>       | PARSEOP_REGIONSPACE_GPIO              {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GPIO);}
>       | PARSEOP_REGIONSPACE_GSBUS             {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GSBUS);}
> +    | PARSEOP_REGIONSPACE_PCC               {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCC);}
>       | PARSEOP_REGIONSPACE_FFIXEDHW          {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_FFIXEDHW);}
>       ;
>
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index c93a1a2..4d7c846 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -387,12 +387,16 @@ AePrintException (
>           }
>           else
>           {
> +            /*
> +             * Less verbose version of the error message, enabled via the
> +             * -vi switch. The format is compatible with MS Visual Studio.
> +             */
>               fprintf (OutputFile, "%s", Enode->Filename);
>
>               if (Enode->LineNumber)
>               {
> -                fprintf (OutputFile, "(%u) i:%6u : ",
> -                    Enode->LineNumber, Enode->LineNumber);
> +                fprintf (OutputFile, "(%u) : ",
> +                    Enode->LineNumber);
>               }
>           }
>       }
> @@ -407,9 +411,18 @@ AePrintException (
>       {
>           /* Decode the message ID */
>
> -        fprintf (OutputFile, "%s %4.4d - ",
> -                    AslErrorLevel[Enode->Level],
> -                    Enode->MessageId + ((Enode->Level+1) * 1000));
> +        if (Gbl_VerboseErrors)
> +        {
> +            fprintf (OutputFile, "%s %4.4d -",
> +                        AslErrorLevel[Enode->Level],
> +                        Enode->MessageId + ((Enode->Level+1) * 1000));
> +        }
> +        else /* IDE case */
> +        {
> +            fprintf (OutputFile, "%s %4.4d:",
> +                        AslErrorLevelIde[Enode->Level],
> +                        Enode->MessageId + ((Enode->Level+1) * 1000));
> +        }
>
>           MainMessage = AslMessages[Enode->MessageId];
>           ExtraMessage = Enode->Message;
> diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c
> index ef10668..a2512a6 100644
> --- a/src/acpica/source/compiler/aslfiles.c
> +++ b/src/acpica/source/compiler/aslfiles.c
> @@ -564,6 +564,107 @@ FlAddIncludeDirectory (
>
>   /*******************************************************************************
>    *
> + * FUNCTION:    FlMergePathnames
> + *
> + * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
> + *                                a zero length string.
> + *              FilePathname    - The include filename from the source ASL.
> + *
> + * RETURN:      Merged pathname string
> + *
> + * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
> + *              arrive at a minimal length string. Merge can occur if the
> + *              FilePathname is relative to the PrefixDir.
> + *
> + ******************************************************************************/
> +
> +char *
> +FlMergePathnames (
> +    char                    *PrefixDir,
> +    char                    *FilePathname)
> +{
> +    char                    *CommonPath;
> +    char                    *Pathname;
> +    char                    *LastElement;
> +
> +
> +    DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
> +        "Include: FilePathname - \"%s\"\n",
> +         PrefixDir, FilePathname);
> +
> +    /*
> +     * If there is no prefix directory or if the file pathname is absolute,
> +     * just return the original file pathname
> +     */
> +    if (!PrefixDir || (!*PrefixDir) ||
> +        (*FilePathname == '/') ||
> +         (FilePathname[1] == ':'))
> +    {
> +        Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1);
> +        strcpy (Pathname, FilePathname);
> +        goto ConvertBackslashes;
> +    }
> +
> +    /* Need a local copy of the prefix directory path */
> +
> +    CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1);
> +    strcpy (CommonPath, PrefixDir);
> +
> +    /*
> +     * Walk forward through the file path, and simultaneously backward
> +     * through the prefix directory path until there are no more
> +     * relative references at the start of the file path.
> +     */
> +    while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
> +    {
> +        /* Remove last element of the prefix directory path */
> +
> +        LastElement = strrchr (CommonPath, '/');
> +        if (!LastElement)
> +        {
> +            goto ConcatenatePaths;
> +        }
> +
> +        *LastElement = 0;   /* Terminate CommonPath string */
> +        FilePathname += 3;  /* Point to next path element */
> +    }
> +
> +    /*
> +     * Remove the last element of the prefix directory path (it is the same as
> +     * the first element of the file pathname), and build the final merged
> +     * pathname.
> +     */
> +    LastElement = strrchr (CommonPath, '/');
> +    if (LastElement)
> +    {
> +        *LastElement = 0;
> +    }
> +
> +    /* Build the final merged pathname */
> +
> +ConcatenatePaths:
> +    Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2);
> +    if (LastElement && *CommonPath)
> +    {
> +        strcpy (Pathname, CommonPath);
> +        strcat (Pathname, "/");
> +    }
> +    strcat (Pathname, FilePathname);
> +    ACPI_FREE (CommonPath);
> +
> +    /* Convert all backslashes to normal slashes */
> +
> +ConvertBackslashes:
> +    UtConvertBackslashes (Pathname);
> +
> +    DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
> +         Pathname);
> +    return (Pathname);
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    FlOpenIncludeWithPrefix
>    *
>    * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
> @@ -587,12 +688,9 @@ FlOpenIncludeWithPrefix (
>
>       /* Build the full pathname to the file */
>
> -    Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> -
> -    strcpy (Pathname, PrefixDir);
> -    strcat (Pathname, Filename);
> +    Pathname = FlMergePathnames (PrefixDir, Filename);
>
> -    DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
> +    DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
>           Pathname);
>
>       /* Attempt to open the file, push if successful */
> @@ -728,7 +826,7 @@ FlOpenInputFile (
>
>       /* Open the input ASL file, text mode */
>
> -    FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
> +    FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
>       AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
>
>       return (AE_OK);
> @@ -812,7 +910,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the hex file, text mode */
>
> -        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
>
>           AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
>           AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
> @@ -863,7 +961,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the listing file, text mode */
>
> -        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
>
>           AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
>           AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
> @@ -881,7 +979,7 @@ FlOpenMiscOutputFiles (
>               return (AE_ERROR);
>           }
>
> -        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b");
> +        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
>       }
>
>       /* All done for data table compiler */
> @@ -926,7 +1024,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the assembly code source file, text mode */
>
> -        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
>
>           AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
>           AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
> @@ -946,7 +1044,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the C code source file, text mode */
>
> -        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
>
>           FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
>           AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
> @@ -967,7 +1065,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the assembly include file, text mode */
>
> -        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
>
>           AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
>           AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
> @@ -987,7 +1085,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the C include file, text mode */
>
> -        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
>
>           FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
>           AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
> @@ -1008,7 +1106,7 @@ FlOpenMiscOutputFiles (
>
>           /* Open the namespace file, text mode */
>
> -        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
>
>           AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
>           AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
> diff --git a/src/acpica/source/compiler/asllookup.c b/src/acpica/source/compiler/asllookup.c
> index 0d92c91..8f8dc5d 100644
> --- a/src/acpica/source/compiler/asllookup.c
> +++ b/src/acpica/source/compiler/asllookup.c
> @@ -1170,7 +1170,7 @@ LkNamespaceLocateBegin (
>
>               if (Message)
>               {
> -                sprintf (MsgBuffer, "Tag: %u bit%s, Field: %u bit%s",
> +                sprintf (MsgBuffer, "Size mismatch, Tag: %u bit%s, Field: %u bit%s",
>                       TagBitLength, (TagBitLength > 1) ? "s" : "",
>                       FieldBitLength, (FieldBitLength > 1) ? "s" : "");
>
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index 285d765..efd5906 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -135,7 +135,7 @@ Options (
>       void);
>
>   static void
> -HelpMessage (
> +FilenameHelp (
>       void);
>
>   static void
> @@ -168,7 +168,7 @@ AslDoResponseFile (
>
>
>   #define ASL_TOKEN_SEPARATORS    " \t\n"
> -#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v|w|x:z"
> +#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v^w|x:z"
>
>
>   /*******************************************************************************
> @@ -191,6 +191,7 @@ Options (
>       printf ("\nGlobal:\n");
>       ACPI_OPTION ("-@ <file>",       "Specify command file");
>       ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
> +    ACPI_OPTION ("-v",              "Display compiler version");
>
>       printf ("\nPreprocessor:\n");
>       ACPI_OPTION ("-D <symbol>",     "Define symbol for preprocessor use");
> @@ -242,27 +243,36 @@ Options (
>       ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
>
>       printf ("\nHelp:\n");
> -    ACPI_OPTION ("-h",              "Additional help and compiler debug options");
> +    ACPI_OPTION ("-h",              "This message");
>       ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
> +    ACPI_OPTION ("-hf",             "Display help for output filename generation");
>       ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
>       ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
> +
> +    printf ("\nDebug Options:\n");
> +    ACPI_OPTION ("-bf -bt",         "Create debug file (full or parse tree only) (*.txt)");
> +    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
> +    ACPI_OPTION ("-n",              "Parse only, no output generation");
> +    ACPI_OPTION ("-ot",             "Display compile times and statistics");
> +    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
> +    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
>   }
>
>
>   /*******************************************************************************
>    *
> - * FUNCTION:    HelpMessage
> + * FUNCTION:    FilenameHelp
>    *
>    * PARAMETERS:  None
>    *
>    * RETURN:      None
>    *
> - * DESCRIPTION: Display help message
> + * DESCRIPTION: Display help message for output filename generation
>    *
>    ******************************************************************************/
>
>   static void
> -HelpMessage (
> +FilenameHelp (
>       void)
>   {
>
> @@ -274,17 +284,6 @@ HelpMessage (
>       printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
>       printf ("    3) The prefix of the input filename\n");
>       printf ("\n");
> -
> -    Options ();
> -
> -    printf ("\nCompiler/Disassembler Debug Options:\n");
> -    ACPI_OPTION ("-bb -bp -bt",     "Create compiler debug/trace file (*.txt)");
> -    ACPI_OPTION ("",                "Types: Parse/Tree/Both");
> -    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
> -    ACPI_OPTION ("-n",              "Parse only, no output generation");
> -    ACPI_OPTION ("-ot",             "Display compile times");
> -    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
> -    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
>   }
>
>
> @@ -502,13 +501,7 @@ AslDoOptions (
>       case 'b':   /* Debug output options */
>           switch (AcpiGbl_Optarg[0])
>           {
> -        case 'b':
> -            AslCompilerdebug = 1; /* same as yydebug */
> -            DtParserdebug = 1;
> -            PrParserdebug = 1;
> -            break;
> -
> -        case 'p':
> +        case 'f':
>               AslCompilerdebug = 1; /* same as yydebug */
>               DtParserdebug = 1;
>               PrParserdebug = 1;
> @@ -602,13 +595,17 @@ AslDoOptions (
>           switch (AcpiGbl_Optarg[0])
>           {
>           case '^':
> -            HelpMessage ();
> +            Usage ();
>               exit (0);
>
>           case 'c':
>               UtDisplayConstantOpcodes ();
>               exit (0);
>
> +        case 'f':
> +            FilenameHelp ();
> +            exit (0);
> +
>           case 'r':
>               /* reserved names */
>
> @@ -827,9 +824,13 @@ AslDoOptions (
>           break;
>
>
> -    case 'v':   /* Verbosity settings */
> +    case 'v':   /* Version and verbosity settings */
>           switch (AcpiGbl_Optarg[0])
>           {
> +        case '^':
> +            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
> +            exit (0);
> +
>           case 'a':
>               /* Disable All error/warning messages */
>
> @@ -837,9 +838,18 @@ AslDoOptions (
>               break;
>
>           case 'i':
> -            /* Less verbose error messages */
> -
> +            /*
> +             * Support for integrated development environment(s).
> +             *
> +             * 1) No compiler signon
> +             * 2) Send stderr messages to stdout
> +             * 3) Less verbose error messages (single line only for each)
> +             * 4) Error/warning messages are formatted appropriately to
> +             *    be recognized by MS Visual Studio
> +             */
>               Gbl_VerboseErrors = FALSE;
> +            Gbl_DoSignon = FALSE;
> +            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
>               break;
>
>           case 'o':
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index 498ca42..c276972 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -439,6 +439,7 @@ const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
>   /* REGIONSPACE_IO */            OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SYSTEM_IO,       0,                  0),
>   /* REGIONSPACE_IPMI */          OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_IPMI,            0,                  0),
>   /* REGIONSPACE_MEM */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SYSTEM_MEMORY,   0,                  0),
> +/* REGIONSPACE_PCC */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PLATFORM_COMM,   0,                  0),
>   /* REGIONSPACE_PCI */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PCI_CONFIG,      0,                  0),
>   /* REGIONSPACE_PCIBAR */        OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PCI_BAR_TARGET,  0,                  0),
>   /* REGIONSPACE_SMBUS */         OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SMBUS,           0,                  0),
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 4e5bb31..56951bc 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -474,7 +474,7 @@ char                        *AslMessages [] = {
>   };
>
>
> -char                    *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
> +const char              *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
>       "Warning ",
>       "Warning ",
>       "Warning ",
> @@ -483,6 +483,15 @@ char                    *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
>       "Optimize"
>   };
>
> +const char              *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = {
> +    "warning ",
> +    "warning ",
> +    "warning ",
> +    "error   ",
> +    "remark  ",
> +    "optimize"
> +};
> +
>   #define ASL_ERROR_LEVEL_LENGTH          8       /* Length of strings above */
>
>   #endif  /* ASL_EXCEPTIONS */
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index 49b25d9..2fbe0d3 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -299,7 +299,7 @@ AslDetectSourceFileType (
>
>       /* Check for 100% ASCII source file (comments are ignored) */
>
> -    Status = FlCheckForAscii (Info);
> +    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
>       if (ACPI_FAILURE (Status))
>       {
>           printf ("Non-ascii input file - %s\n", Info->Filename);
> diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
> index cdaf2b8..0ce5a20 100644
> --- a/src/acpica/source/compiler/aslsupport.l
> +++ b/src/acpica/source/compiler/aslsupport.l
> @@ -164,19 +164,23 @@ static void
>   AslDoLineDirective (
>       void)
>   {
> -    char                    c;
> +    int                     c;
>       char                    *Token;
>       UINT32                  LineNumber;
>       char                    *Filename;
> +    UINT32                  i;
>
>
>       /* Eat the entire line that contains the #line directive */
>
> -    while ((c = (char) input()) != '\n' && c != EOF)
> +    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> +
> +    while ((c = input()) != '\n' && c != EOF)
>       {
> -        AslInsertLineBuffer (c);
> +        *Gbl_LineBufPtr = c;
> +        Gbl_LineBufPtr++;
>       }
> -    AslInsertLineBuffer (0);
> +    *Gbl_LineBufPtr = 0;
>
>       /* First argument is the actual line number */
>
> @@ -186,10 +190,23 @@ AslDoLineDirective (
>           goto ResetAndExit;
>       }
>
> -    /* Convert line number. Subtract one to handle _this_ line */
> +    /* First argument is the line number */
>
>       LineNumber = (UINT32) UtDoConstant (Token);
> -    FlSetLineNumber (LineNumber - 1);
> +
> +    /* Emit the appropriate number of newlines */
> +
> +    Gbl_CurrentColumn = 0;
> +    if (LineNumber > Gbl_CurrentLineNumber)
> +    {
> +        for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++)
> +        {
> +            FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
> +            Gbl_CurrentColumn++;
> +        }
> +    }
> +
> +    FlSetLineNumber (LineNumber);
>
>       /* Second argument is the optional filename (in double quotes) */
>
> @@ -204,7 +221,12 @@ AslDoLineDirective (
>       /* Third argument is not supported at this time */
>
>   ResetAndExit:
> -    AslResetCurrentLineBuffer ();
> +
> +    /* Reset globals for a new line */
> +
> +    Gbl_CurrentLineOffset += Gbl_CurrentColumn;
> +    Gbl_CurrentColumn = 0;
> +    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
>   }
>
>
> @@ -480,8 +502,8 @@ static char
>   AslDoComment (
>       void)
>   {
> -    char                c;
> -    char                c1 = 0;
> +    int                 c;
> +    int                 c1 = 0;
>
>
>       AslInsertLineBuffer ('/');
> @@ -491,7 +513,7 @@ loop:
>
>       /* Eat chars until end-of-comment */
>
> -    while ((c = (char) input()) != '*' && c != EOF)
> +    while ((c = input()) != '*' && c != EOF)
>       {
>           AslInsertLineBuffer (c);
>           c1 = c;
> @@ -518,7 +540,7 @@ loop:
>
>       AslInsertLineBuffer (c);
>
> -    if ((c1 = (char) input()) != '/' && c1 != EOF)
> +    if ((c1 = input()) != '/' && c1 != EOF)
>       {
>           unput(c1);
>           goto loop;
> @@ -561,13 +583,13 @@ static char
>   AslDoCommentType2 (
>       void)
>   {
> -    char                c;
> +    int                 c;
>
>
>       AslInsertLineBuffer ('/');
>       AslInsertLineBuffer ('/');
>
> -    while ((c = (char) input()) != '\n' && c != EOF)
> +    while ((c = input()) != '\n' && c != EOF)
>       {
>           AslInsertLineBuffer (c);
>       }
> @@ -603,7 +625,7 @@ AslDoStringLiteral (
>       char                *StringBuffer = MsgBuffer;
>       char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
>       char                *CleanString;
> -    char                StringChar;
> +    int                 StringChar;
>       UINT32              State = ASL_NORMAL_CHAR;
>       UINT32              i = 0;
>       UINT8               Digit;
> @@ -616,7 +638,7 @@ AslDoStringLiteral (
>        * source line buffer.
>        */
>       AslInsertLineBuffer ('\"');
> -    while ((StringChar = (char) input()) != EOF)
> +    while ((StringChar = input()) != EOF)
>       {
>           AslInsertLineBuffer (StringChar);
>
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 8a7dbba..de7ea0d 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -211,7 +211,7 @@ UtDisplaySupportedTables (
>
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiPsDisplayConstantOpcodes
> + * FUNCTION:    UtDisplayConstantOpcodes
>    *
>    * PARAMETERS:  None
>    *
> @@ -244,11 +244,11 @@ UtDisplayConstantOpcodes (
>    *
>    * FUNCTION:    UtLocalCalloc
>    *
> - * PARAMETERS:  Size        - Bytes to be allocated
> + * PARAMETERS:  Size                - Bytes to be allocated
>    *
> - * RETURN:      Pointer to the allocated memory.  Guaranteed to be valid.
> + * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
>    *
> - * DESCRIPTION: Allocate zero-initialized memory.  Aborts the compile on an
> + * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
>    *              allocation failure, on the assumption that nothing more can be
>    *              accomplished.
>    *
> @@ -283,9 +283,9 @@ UtLocalCalloc (
>    *
>    * FUNCTION:    UtBeginEvent
>    *
> - * PARAMETERS:  Name        - Ascii name of this event
> + * PARAMETERS:  Name                - Ascii name of this event
>    *
> - * RETURN:      Event       - Event number (integer index)
> + * RETURN:      Event number (integer index)
>    *
>    * DESCRIPTION: Saves the current time with this event
>    *
> @@ -316,7 +316,7 @@ UtBeginEvent (
>    *
>    * FUNCTION:    UtEndEvent
>    *
> - * PARAMETERS:  Event       - Event number (integer index)
> + * PARAMETERS:  Event               - Event number (integer index)
>    *
>    * RETURN:      None
>    *
> @@ -326,7 +326,7 @@ UtBeginEvent (
>
>   void
>   UtEndEvent (
> -    UINT8                  Event)
> +    UINT8                   Event)
>   {
>
>       if (Event >= ASL_NUM_EVENTS)
> @@ -344,7 +344,7 @@ UtEndEvent (
>    *
>    * FUNCTION:    UtHexCharToValue
>    *
> - * PARAMETERS:  HexChar         - Hex character in Ascii
> + * PARAMETERS:  HexChar             - Hex character in Ascii
>    *
>    * RETURN:      The binary value of the hex character
>    *
> @@ -375,12 +375,13 @@ UtHexCharToValue (
>    *
>    * FUNCTION:    UtConvertByteToHex
>    *
> - * PARAMETERS:  RawByte         - Binary data
> - *              Buffer          - Pointer to where the hex bytes will be stored
> + * PARAMETERS:  RawByte             - Binary data
> + *              Buffer              - Pointer to where the hex bytes will be
> + *                                    stored
>    *
>    * RETURN:      Ascii hex byte is stored in Buffer.
>    *
> - * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
> + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
>    *              with "0x"
>    *
>    ******************************************************************************/
> @@ -403,12 +404,13 @@ UtConvertByteToHex (
>    *
>    * FUNCTION:    UtConvertByteToAsmHex
>    *
> - * PARAMETERS:  RawByte         - Binary data
> - *              Buffer          - Pointer to where the hex bytes will be stored
> + * PARAMETERS:  RawByte             - Binary data
> + *              Buffer              - Pointer to where the hex bytes will be
> + *                                    stored
>    *
>    * RETURN:      Ascii hex byte is stored in Buffer.
>    *
> - * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
> + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
>    *              with "0x"
>    *
>    ******************************************************************************/
> @@ -430,13 +432,13 @@ UtConvertByteToAsmHex (
>    *
>    * FUNCTION:    DbgPrint
>    *
> - * PARAMETERS:  Type            - Type of output
> - *              Fmt             - Printf format string
> - *              ...             - variable printf list
> + * PARAMETERS:  Type                - Type of output
> + *              Fmt                 - Printf format string
> + *              ...                 - variable printf list
>    *
>    * RETURN:      None
>    *
> - * DESCRIPTION: Conditional print statement.  Prints to stderr only if the
> + * DESCRIPTION: Conditional print statement. Prints to stderr only if the
>    *              debug flag is set.
>    *
>    ******************************************************************************/
> @@ -510,7 +512,7 @@ UtPrintFormattedName (
>    *
>    * FUNCTION:    UtSetParseOpName
>    *
> - * PARAMETERS:  Op
> + * PARAMETERS:  Op                  - Parse op to be named.
>    *
>    * RETURN:      None
>    *
> @@ -532,7 +534,7 @@ UtSetParseOpName (
>    *
>    * FUNCTION:    UtDisplaySummary
>    *
> - * PARAMETERS:  FileID          - ID of outpout file
> + * PARAMETERS:  FileID              - ID of outpout file
>    *
>    * RETURN:      None
>    *
> @@ -643,11 +645,11 @@ UtDisplaySummary (
>
>   /*******************************************************************************
>    *
> - * FUNCTION:    UtDisplaySummary
> + * FUNCTION:    UtCheckIntegerRange
>    *
> - * PARAMETERS:  Op              - Integer parse node
> - *              LowValue        - Smallest allowed value
> - *              HighValue       - Largest allowed value
> + * PARAMETERS:  Op                  - Integer parse node
> + *              LowValue            - Smallest allowed value
> + *              HighValue           - Largest allowed value
>    *
>    * RETURN:      Op if OK, otherwise NULL
>    *
> @@ -698,11 +700,11 @@ UtCheckIntegerRange (
>    *
>    * FUNCTION:    UtGetStringBuffer
>    *
> - * PARAMETERS:  Length          - Size of buffer requested
> + * PARAMETERS:  Length              - Size of buffer requested
>    *
> - * RETURN:      Pointer to the buffer.  Aborts on allocation failure
> + * RETURN:      Pointer to the buffer. Aborts on allocation failure
>    *
> - * DESCRIPTION: Allocate a string buffer.  Bypass the local
> + * DESCRIPTION: Allocate a string buffer. Bypass the local
>    *              dynamic memory manager for performance reasons (This has a
>    *              major impact on the speed of the compiler.)
>    *
> @@ -733,8 +735,8 @@ UtGetStringBuffer (
>    *
>    * FUNCTION:    UtInternalizeName
>    *
> - * PARAMETERS:  ExternalName            - Name to convert
> - *              ConvertedName           - Where the converted name is returned
> + * PARAMETERS:  ExternalName        - Name to convert
> + *              ConvertedName       - Where the converted name is returned
>    *
>    * RETURN:      Status
>    *
> @@ -786,8 +788,8 @@ UtInternalizeName (
>    *
>    * FUNCTION:    UtPadNameWithUnderscores
>    *
> - * PARAMETERS:  NameSeg         - Input nameseg
> - *              PaddedNameSeg   - Output padded nameseg
> + * PARAMETERS:  NameSeg             - Input nameseg
> + *              PaddedNameSeg       - Output padded nameseg
>    *
>    * RETURN:      Padded nameseg.
>    *
> @@ -824,8 +826,8 @@ UtPadNameWithUnderscores (
>    *
>    * FUNCTION:    UtAttachNameseg
>    *
> - * PARAMETERS:  Op              - Parent parse node
> - *              Name            - Full ExternalName
> + * PARAMETERS:  Op                  - Parent parse node
> + *              Name                - Full ExternalName
>    *
>    * RETURN:      None; Sets the NameSeg field in parent node
>    *
> @@ -881,12 +883,12 @@ UtAttachNameseg (
>    *
>    * FUNCTION:    UtAttachNamepathToOwner
>    *
> - * PARAMETERS:  Op            - Parent parse node
> - *              NameOp        - Node that contains the name
> + * PARAMETERS:  Op                  - Parent parse node
> + *              NameOp              - Node that contains the name
>    *
>    * RETURN:      Sets the ExternalName and Namepath in the parent node
>    *
> - * DESCRIPTION: Store the name in two forms in the parent node:  The original
> + * DESCRIPTION: Store the name in two forms in the parent node: The original
>    *              (external) name, and the internalized name that is used within
>    *              the ACPI namespace manager.
>    *
> @@ -926,11 +928,11 @@ UtAttachNamepathToOwner (
>    *
>    * FUNCTION:    UtDoConstant
>    *
> - * PARAMETERS:  String      - Hex, Octal, or Decimal string
> + * PARAMETERS:  String              - Hex, Octal, or Decimal string
>    *
>    * RETURN:      Converted Integer
>    *
> - * DESCRIPTION: Convert a string to an integer.  With error checking.
> + * DESCRIPTION: Convert a string to an integer, with error checking.
>    *
>    ******************************************************************************/
>
> @@ -961,10 +963,10 @@ UtDoConstant (
>    *
>    * FUNCTION:    UtStrtoul64
>    *
> - * PARAMETERS:  String          - Null terminated string
> - *              Terminater      - Where a pointer to the terminating byte is
> - *                                returned
> - *              Base            - Radix of the string
> + * PARAMETERS:  String              - Null terminated string
> + *              Terminater          - Where a pointer to the terminating byte
> + *                                    is returned
> + *              Base                - Radix of the string
>    *
>    * RETURN:      Converted value
>    *
> @@ -1144,5 +1146,3 @@ ErrorExit:
>
>       return (Status);
>   }
> -
> -
> diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c
> index 91d4aba..7a68e84 100644
> --- a/src/acpica/source/compiler/dtio.c
> +++ b/src/acpica/source/compiler/dtio.c
> @@ -161,6 +161,7 @@ DtDumpBuffer (
>   #define DT_SLASH_SLASH_COMMENT      4
>   #define DT_END_COMMENT              5
>   #define DT_MERGE_LINES              6
> +#define DT_ESCAPE_SEQUENCE          7
>
>   static UINT32  Gbl_NextLineOffset;
>
> @@ -498,7 +499,6 @@ DtGetNextLine (
>               {
>               case DT_START_QUOTED_STRING:
>               case DT_SLASH_ASTERISK_COMMENT:
> -            case DT_SLASH_SLASH_COMMENT:
>
>                   AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
>                   break;
> @@ -507,7 +507,22 @@ DtGetNextLine (
>                   break;
>               }
>
> -            return (ASL_EOF);
> +            /* Standalone EOF is OK */
> +
> +            if (i == 0)
> +            {
> +                return (ASL_EOF);
> +            }
> +
> +            /*
> +             * Received an EOF in the middle of a line. Terminate the
> +             * line with a newline. The next call to this function will
> +             * return a standalone EOF. Thus, the upper parsing software
> +             * never has to deal with an EOF within a valid line (or
> +             * the last line does not get tossed on the floor.)
> +             */
> +            c = '\n';
> +            State = DT_NORMAL_TEXT;
>           }
>
>           switch (State)
> @@ -576,12 +591,36 @@ DtGetNextLine (
>               Gbl_CurrentLineBuffer[i] = c;
>               i++;
>
> -            if (c == '"')
> +            switch (c)
>               {
> +            case '"':
>                   State = DT_NORMAL_TEXT;
> +                break;
> +
> +            case '\\':
> +                State = DT_ESCAPE_SEQUENCE;
> +                break;
> +
> +            case '\n':
> +                AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
> +                    Gbl_CurrentLineNumber++);
> +                State = DT_NORMAL_TEXT;
> +                break;
> +
> +            default:    /* Get next character */
> +                break;
>               }
>               break;
>
> +        case DT_ESCAPE_SEQUENCE:
> +
> +            /* Just copy the escaped character. TBD: sufficient for table compiler? */
> +
> +            Gbl_CurrentLineBuffer[i] = c;
> +            i++;
> +            State = DT_START_QUOTED_STRING;
> +            break;
> +
>           case DT_START_COMMENT:
>
>               /* Open comment if this character is an asterisk or slash */
> diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
> index ed5f79b..1d92b78 100644
> --- a/src/acpica/source/compiler/dttemplate.c
> +++ b/src/acpica/source/compiler/dttemplate.c
> @@ -298,7 +298,7 @@ DtCreateAllTemplates (
>       }
>
>       /*
> -     * Create the "special ACPI tables:
> +     * Create the special ACPI tables:
>        * 1) DSDT/SSDT are AML tables, not data tables
>        * 2) FACS and RSDP have non-standard headers
>        */
> diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c
> index e98e186..687af45 100644
> --- a/src/acpica/source/compiler/prscan.c
> +++ b/src/acpica/source/compiler/prscan.c
> @@ -726,7 +726,7 @@ PrDoDirective (
>           }
>
>           DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> -            "Start #include file %s\n", Gbl_CurrentLineNumber,
> +            "Start #include file \"%s\"\n", Gbl_CurrentLineNumber,
>               Token, Gbl_CurrentLineNumber);
>
>           PrOpenIncludeFile (Token);
> diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c
> index a5fb46a..64dc9e8 100644
> --- a/src/acpica/source/compiler/prutils.c
> +++ b/src/acpica/source/compiler/prutils.c
> @@ -318,13 +318,11 @@ PrOpenIncludeFile (
>       ASL_INCLUDE_DIR         *NextDir;
>
>
> -    /*
> -     * start the actual include file on the next line
> -     */
> +    /* Start the actual include file on the next line */
> +
>       Gbl_CurrentLineOffset++;
>
>       /* Attempt to open the include file */
> -
>       /* If the file specifies an absolute path, just open it */
>
>       if ((Filename[0] == '/')  ||
> @@ -402,13 +400,10 @@ PrOpenIncludeWithPrefix (
>
>       /* Build the full pathname to the file */
>
> -    Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> +    Pathname = FlMergePathnames (PrefixDir, Filename);
>
> -    strcpy (Pathname, PrefixDir);
> -    strcat (Pathname, Filename);
> -
> -    DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID
> -        "Opening include file: path %s\n",
> +    DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID
> +        "Include: Opening file - \"%s\"\n",
>           Gbl_CurrentLineNumber, Pathname);
>
>       /* Attempt to open the file, push if successful */
> diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
> index 4c34a79..27aa4cd 100644
> --- a/src/acpica/source/components/debugger/dbcmds.c
> +++ b/src/acpica/source/components/debugger/dbcmds.c
> @@ -326,12 +326,53 @@ AcpiDbDisplayTableInfo (
>       ACPI_STATUS             Status;
>
>
> +    /* Header */
> +
> +    AcpiOsPrintf ("Idx ID Status    Type            Sig  Address  Len   Header\n");
> +
>       /* Walk the entire root table list */
>
>       for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
>       {
>           TableDesc = &AcpiGbl_RootTableList.Tables[i];
> -        AcpiOsPrintf ("%u ", i);
> +
> +        /* Index and Table ID */
> +
> +        AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
> +
> +        /* Decode the table flags */
> +
> +        if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
> +        {
> +            AcpiOsPrintf ("NotLoaded ");
> +        }
> +        else
> +        {
> +            AcpiOsPrintf ("   Loaded ");
> +        }
> +
> +        switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
> +        {
> +        case ACPI_TABLE_ORIGIN_UNKNOWN:
> +            AcpiOsPrintf ("Unknown   ");
> +            break;
> +
> +        case ACPI_TABLE_ORIGIN_MAPPED:
> +            AcpiOsPrintf ("Mapped    ");
> +            break;
> +
> +        case ACPI_TABLE_ORIGIN_ALLOCATED:
> +            AcpiOsPrintf ("Allocated ");
> +            break;
> +
> +        case ACPI_TABLE_ORIGIN_OVERRIDE:
> +            AcpiOsPrintf ("Override  ");
> +            break;
> +
> +        default:
> +            AcpiOsPrintf ("INVALID   ");
> +            break;
> +        }
>
>           /* Make sure that the table is mapped */
>
> @@ -362,55 +403,45 @@ AcpiDbDisplayTableInfo (
>    *
>    * FUNCTION:    AcpiDbUnloadAcpiTable
>    *
> - * PARAMETERS:  TableArg        - Name of the table to be unloaded
> - *              InstanceArg     - Which instance of the table to unload (if
> - *                                there are multiple tables of the same type)
> + * PARAMETERS:  ObjectName          - Namespace pathname for an object that
> + *                                    is owned by the table to be unloaded
>    *
> - * RETURN:      Nonde
> + * RETURN:      None
>    *
> - * DESCRIPTION: Unload an ACPI table.
> - *              Instance is not implemented
> + * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
> + *              by the table.
>    *
>    ******************************************************************************/
>
>   void
>   AcpiDbUnloadAcpiTable (
> -    char                    *TableArg,
> -    char                    *InstanceArg)
> +    char                    *ObjectName)
>   {
> -/* TBD: Need to reimplement for new data structures */
> -
> -#if 0
> -    UINT32                  i;
> +    ACPI_NAMESPACE_NODE     *Node;
>       ACPI_STATUS             Status;
>
>
> -    /* Search all tables for the target type */
> +    /* Translate name to an Named object */
>
> -    for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
> +    Node = AcpiDbConvertToNode (ObjectName);
> +    if (!Node)
>       {
> -        if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
> -                AcpiGbl_TableData[i].SigLength))
> -        {
> -            /* Found the table, unload it */
> -
> -            Status = AcpiUnloadTable (i);
> -            if (ACPI_SUCCESS (Status))
> -            {
> -                AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
> -            }
> -            else
> -            {
> -                AcpiOsPrintf ("%s, while unloading [%s]\n",
> -                    AcpiFormatException (Status), TableArg);
> -            }
> -
> -            return;
> -        }
> +        AcpiOsPrintf ("Could not find [%s] in namespace\n",
> +            ObjectName);
> +        return;
>       }
>
> -    AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
> -#endif
> +    Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
> +            ObjectName, Node);
> +    }
> +    else
> +    {
> +        AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
> +            AcpiFormatException (Status), ObjectName);
> +    }
>   }
>
>
> @@ -445,25 +476,20 @@ AcpiDbSendNotify (
>           return;
>       }
>
> -    /* Decode Named object type */
> +    /* Dispatch the notify if legal */
>
> -    switch (Node->Type)
> +    if (AcpiEvIsNotifyObject (Node))
>       {
> -    case ACPI_TYPE_DEVICE:
> -    case ACPI_TYPE_THERMAL:
> -
> -         /* Send the notify */
> -
>           Status = AcpiEvQueueNotifyRequest (Node, Value);
>           if (ACPI_FAILURE (Status))
>           {
>               AcpiOsPrintf ("Could not queue notify\n");
>           }
> -        break;
> -
> -    default:
> -        AcpiOsPrintf ("Named object is not a device or a thermal object\n");
> -        break;
> +    }
> +    else
> +    {
> +        AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
> +            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
>       }
>   }
>
> diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
> index d8b3aa9..2e91c88 100644
> --- a/src/acpica/source/components/debugger/dbdisply.c
> +++ b/src/acpica/source/components/debugger/dbdisply.c
> @@ -179,8 +179,8 @@ typedef struct acpi_handler_info
>
>   static ACPI_HANDLER_INFO    AcpiGbl_HandlerList[] =
>   {
> -    {&AcpiGbl_SystemNotify.Handler,     "System Notifications"},
> -    {&AcpiGbl_DeviceNotify.Handler,     "Device Notifications"},
> +    {&AcpiGbl_GlobalNotify[0].Handler,  "System Notifications"},
> +    {&AcpiGbl_GlobalNotify[1].Handler,  "Device Notifications"},
>       {&AcpiGbl_TableHandler,             "ACPI Table Events"},
>       {&AcpiGbl_ExceptionHandler,         "Control Method Exceptions"},
>       {&AcpiGbl_InterfaceHandler,         "OSI Invocations"}
> @@ -864,10 +864,12 @@ AcpiDbDisplayGpes (
>       ACPI_GPE_EVENT_INFO     *GpeEventInfo;
>       ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
>       char                    *GpeType;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
>       UINT32                  GpeIndex;
>       UINT32                  Block = 0;
>       UINT32                  i;
>       UINT32                  j;
> +    UINT32                  Count;
>       char                    Buffer[80];
>       ACPI_BUFFER             RetBuf;
>       ACPI_STATUS             Status;
> @@ -988,7 +990,14 @@ AcpiDbDisplayGpes (
>                           AcpiOsPrintf ("Handler");
>                           break;
>                       case ACPI_GPE_DISPATCH_NOTIFY:
> -                        AcpiOsPrintf ("Notify");
> +                        Count = 0;
> +                        Notify = GpeEventInfo->Dispatch.NotifyList;
> +                        while (Notify)
> +                        {
> +                            Count++;
> +                            Notify = Notify->Next;
> +                        }
> +                        AcpiOsPrintf ("Implicit Notify on %u devices", Count);
>                           break;
>                       default:
>                           AcpiOsPrintf ("UNKNOWN: %X",
> diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
> index eb85998..174f77a 100644
> --- a/src/acpica/source/components/debugger/dbexec.c
> +++ b/src/acpica/source/components/debugger/dbexec.c
> @@ -944,8 +944,8 @@ AcpiDbMethodThread (
>
>       if (Info->InitArgs)
>       {
> -        AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
> -        AcpiDbUInt32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
> +        AcpiDbUint32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
> +        AcpiDbUint32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
>       }
>
>       if (Info->Threads && (Info->NumCreated < Info->NumThreads))
> @@ -1135,7 +1135,7 @@ AcpiDbCreateExecutionThreads (
>       AcpiGbl_DbMethodInfo.ArgTypes[1] = ACPI_TYPE_INTEGER;
>       AcpiGbl_DbMethodInfo.ArgTypes[2] = ACPI_TYPE_INTEGER;
>
> -    AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
> +    AcpiDbUint32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
>
>       AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
>
> diff --git a/src/acpica/source/components/debugger/dbfileio.c b/src/acpica/source/components/debugger/dbfileio.c
> index 495d609..8e36c87 100644
> --- a/src/acpica/source/components/debugger/dbfileio.c
> +++ b/src/acpica/source/components/debugger/dbfileio.c
> @@ -123,6 +123,10 @@
>   #include "actables.h"
>   #endif
>
> +#ifdef ACPI_ASL_COMPILER
> +#include "aslcompiler.h"
> +#endif
> +
>   #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
>
>   #define _COMPONENT          ACPI_CA_DEBUGGER
> @@ -381,6 +385,15 @@ AcpiDbReadTable (
>               AcpiOsPrintf (
>                   "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
>                   TableHeader.Length, FileSize);
> +
> +#ifdef ACPI_ASL_COMPILER
> +            Status = FlCheckForAscii (fp, NULL, FALSE);
> +            if (ACPI_SUCCESS (Status))
> +            {
> +                AcpiOsPrintf ("File appears to be ASCII only, must be binary\n",
> +                    TableHeader.Length, FileSize);
> +            }
> +#endif
>               return (AE_BAD_HEADER);
>           }
>
> diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
> index 3e61bdb..1b2ee1d 100644
> --- a/src/acpica/source/components/debugger/dbinput.c
> +++ b/src/acpica/source/components/debugger/dbinput.c
> @@ -322,7 +322,7 @@ AcpiDbDisplayHelp (
>       AcpiOsPrintf ("     Stack                            Display CPU stack usage\n");
>       AcpiOsPrintf ("     Tables                           Info about current ACPI table(s)\n");
>       AcpiOsPrintf ("  Tables                              Display info about loaded ACPI tables\n");
> -    AcpiOsPrintf ("  Unload <TableSig> [Instance]        Unload an ACPI table\n");
> +    AcpiOsPrintf ("  Unload <Namepath>                   Unload an ACPI table via namespace object\n");
>       AcpiOsPrintf ("  ! <CommandNumber>                   Execute command from history buffer\n");
>       AcpiOsPrintf ("  !!                                  Execute last command again\n");
>
> @@ -966,7 +966,7 @@ AcpiDbCommandDispatch (
>           break;
>
>       case CMD_UNLOAD:
> -        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
> +        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]);
>           break;
>
>       case CMD_EXIT:
> diff --git a/src/acpica/source/components/debugger/dbstats.c b/src/acpica/source/components/debugger/dbstats.c
> index 8a6e713..e309668 100644
> --- a/src/acpica/source/components/debugger/dbstats.c
> +++ b/src/acpica/source/components/debugger/dbstats.c
> @@ -299,8 +299,8 @@ AcpiDbEnumerateObject (
>
>       case ACPI_TYPE_DEVICE:
>
> -        AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[1]);
>           AcpiDbEnumerateObject (ObjDesc->Device.Handler);
>           break;
>
> @@ -320,21 +320,21 @@ AcpiDbEnumerateObject (
>
>       case ACPI_TYPE_POWER:
>
> -        AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[1]);
>           break;
>
>       case ACPI_TYPE_PROCESSOR:
>
> -        AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[1]);
>           AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
>           break;
>
>       case ACPI_TYPE_THERMAL:
>
> -        AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[1]);
>           AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
>           break;
>
> @@ -594,6 +594,18 @@ AcpiDbDisplayStatistics (
>           AcpiOsPrintf ("NamespaceNode    %3d\n", sizeof (ACPI_NAMESPACE_NODE));
>           AcpiOsPrintf ("AcpiObject       %3d\n", sizeof (ACPI_OBJECT));
>
> +        AcpiOsPrintf ("\n");
> +
> +        AcpiOsPrintf ("Generic State    %3d\n", sizeof (ACPI_GENERIC_STATE));
> +        AcpiOsPrintf ("Common State     %3d\n", sizeof (ACPI_COMMON_STATE));
> +        AcpiOsPrintf ("Control State    %3d\n", sizeof (ACPI_CONTROL_STATE));
> +        AcpiOsPrintf ("Update State     %3d\n", sizeof (ACPI_UPDATE_STATE));
> +        AcpiOsPrintf ("Scope State      %3d\n", sizeof (ACPI_SCOPE_STATE));
> +        AcpiOsPrintf ("Parse Scope      %3d\n", sizeof (ACPI_PSCOPE_STATE));
> +        AcpiOsPrintf ("Package State    %3d\n", sizeof (ACPI_PKG_STATE));
> +        AcpiOsPrintf ("Thread State     %3d\n", sizeof (ACPI_THREAD_STATE));
> +        AcpiOsPrintf ("Result Values    %3d\n", sizeof (ACPI_RESULT_VALUES));
> +        AcpiOsPrintf ("Notify Info      %3d\n", sizeof (ACPI_NOTIFY_INFO));
>           break;
>
>
> diff --git a/src/acpica/source/components/debugger/dbutils.c b/src/acpica/source/components/debugger/dbutils.c
> index fd318d9..f913c64 100644
> --- a/src/acpica/source/components/debugger/dbutils.c
> +++ b/src/acpica/source/components/debugger/dbutils.c
> @@ -432,7 +432,7 @@ AcpiDbLocalNsLookup (
>
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiDbUInt32ToHexString
> + * FUNCTION:    AcpiDbUint32ToHexString
>    *
>    * PARAMETERS:  Value           - The value to be converted to string
>    *              Buffer          - Buffer for result (not less than 11 bytes)
> @@ -447,7 +447,7 @@ AcpiDbLocalNsLookup (
>    ******************************************************************************/
>
>   void
> -AcpiDbUInt32ToHexString (
> +AcpiDbUint32ToHexString (
>       UINT32                  Value,
>       char                    *Buffer)
>   {
> diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
> index ed457ed..252b1b8 100644
> --- a/src/acpica/source/components/disassembler/dmopcode.c
> +++ b/src/acpica/source/components/disassembler/dmopcode.c
> @@ -118,6 +118,7 @@
>   #include "acparser.h"
>   #include "amlcode.h"
>   #include "acdisasm.h"
> +#include "acnamesp.h"
>
>   #ifdef ACPI_DISASSEMBLER
>
> @@ -133,6 +134,218 @@ AcpiDmMatchKeyword (
>
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiDmPredefinedDescription
> + *
> + * PARAMETERS:  Op              - Name() parse object
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Emit a description comment for a predefined ACPI name.
> + *              Used for iASL compiler only.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +#ifdef ACPI_ASL_COMPILER
> +    const AH_PREDEFINED_NAME    *Info;
> +    char                        *NameString;
> +    int                         LastCharIsDigit;
> +    int                         LastCharsAreHex;
> +
> +
> +    if (!Op)
> +    {
> +        return;
> +    }
> +
> +    /* Ensure that the comment field is emitted only once */
> +
> +    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
> +    {
> +        return;
> +    }
> +    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
> +
> +    /* Predefined name must start with an underscore */
> +
> +    NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
> +    if (NameString[0] != '_')
> +    {
> +        return;
> +    }
> +
> +    /*
> +     * Check for the special ACPI names:
> +     * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
> +     * (where d=decimal_digit, x=hex_digit, a=anything)
> +     *
> +     * Convert these to the generic name for table lookup.
> +     * Note: NameString is guaranteed to be upper case here.
> +     */
> +    LastCharIsDigit =
> +        (ACPI_IS_DIGIT (NameString[3]));    /* d */
> +    LastCharsAreHex =
> +        (ACPI_IS_XDIGIT (NameString[2]) &&  /* xx */
> +         ACPI_IS_XDIGIT (NameString[3]));
> +
> +    switch (NameString[1])
> +    {
> +    case 'A':
> +        if ((NameString[2] == 'C') && (LastCharIsDigit))
> +        {
> +            NameString = "_ACx";
> +        }
> +        else if ((NameString[2] == 'L') && (LastCharIsDigit))
> +        {
> +            NameString = "_ALx";
> +        }
> +        break;
> +
> +    case 'E':
> +        if ((NameString[2] == 'J') && (LastCharIsDigit))
> +        {
> +            NameString = "_EJx";
> +        }
> +        else if (LastCharsAreHex)
> +        {
> +            NameString = "_Exx";
> +        }
> +        break;
> +
> +    case 'L':
> +        if (LastCharsAreHex)
> +        {
> +            NameString = "_Lxx";
> +        }
> +        break;
> +
> +    case 'Q':
> +        if (LastCharsAreHex)
> +        {
> +            NameString = "_Qxx";
> +        }
> +        break;
> +
> +    case 'T':
> +        if (NameString[2] == '_')
> +        {
> +            NameString = "_T_x";
> +        }
> +        break;
> +
> +    case 'W':
> +        if (LastCharsAreHex)
> +        {
> +            NameString = "_Wxx";
> +        }
> +        break;
> +
> +    default:
> +        break;
> +    }
> +
> +    /* Match the name in the info table */
> +
> +    for (Info = AslPredefinedInfo; Info->Name; Info++)
> +    {
> +        if (ACPI_COMPARE_NAME (NameString, Info->Name))
> +        {
> +            AcpiOsPrintf ("  // %4.4s: %s",
> +                NameString, ACPI_CAST_PTR (char, Info->Description));
> +            return;
> +        }
> +    }
> +
> +#endif
> +    return;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmFieldPredefinedDescription
> + *
> + * PARAMETERS:  Op              - Parse object
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Emit a description comment for a resource descriptor tag
> + *              (which is a predefined ACPI name.) Used for iASL compiler only.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmFieldPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +#ifdef ACPI_ASL_COMPILER
> +    ACPI_PARSE_OBJECT       *IndexOp;
> +    char                    *Tag;
> +    const ACPI_OPCODE_INFO  *OpInfo;
> +    const AH_PREDEFINED_NAME *Info;
> +
> +
> +    if (!Op)
> +    {
> +        return;
> +    }
> +
> +    /* Ensure that the comment field is emitted only once */
> +
> +    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
> +    {
> +        return;
> +    }
> +    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
> +
> +    /*
> +     * Op must be one of the Create* operators: CreateField, CreateBitField,
> +     * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
> +     */
> +    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
> +    if (!(OpInfo->Flags & AML_CREATE))
> +    {
> +        return;
> +    }
> +
> +    /* Second argument is the Index argument */
> +
> +    IndexOp = Op->Common.Value.Arg;
> +    IndexOp = IndexOp->Common.Next;
> +
> +    /* Index argument must be a namepath */
> +
> +    if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
> +    {
> +        return;
> +    }
> +
> +    /* Major cheat: We previously put the Tag ptr in the Node field */
> +
> +    Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
> +
> +    /* Match the name in the info table */
> +
> +    for (Info = AslPredefinedInfo; Info->Name; Info++)
> +    {
> +        if (ACPI_COMPARE_NAME (Tag, Info->Name))
> +        {
> +            AcpiOsPrintf ("  // %4.4s: %s", Tag,
> +                ACPI_CAST_PTR (char, Info->Description));
> +            return;
> +        }
> +    }
> +
> +#endif
> +    return;
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiDmMethodFlags
>    *
>    * PARAMETERS:  Op              - Method Object to be examined
> diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
> index 2bec308..dd655d8 100644
> --- a/src/acpica/source/components/disassembler/dmwalk.c
> +++ b/src/acpica/source/components/disassembler/dmwalk.c
> @@ -525,7 +525,7 @@ AcpiDmDescendingOp (
>        * keep track of the current column.
>        */
>       Info->Count++;
> -    if (Info->Count /*+Info->LastLevel*/ > 10)
> +    if (Info->Count /* +Info->LastLevel */ > 10)
>       {
>           Info->Count = 0;
>           AcpiOsPrintf ("\n");
> @@ -605,6 +605,10 @@ AcpiDmDescendingOp (
>
>                   AcpiDmMethodFlags (Op);
>                   AcpiOsPrintf (")");
> +
> +                /* Emit description comment for Method() with a predefined ACPI name */
> +
> +                AcpiDmPredefinedDescription (Op);
>                   break;
>
>
> @@ -675,7 +679,8 @@ AcpiDmDescendingOp (
>
>               default:
>
> -                AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode);
> +                AcpiOsPrintf ("*** Unhandled named opcode %X\n",
> +                    Op->Common.AmlOpcode);
>                   break;
>               }
>           }
> @@ -716,7 +721,8 @@ AcpiDmDescendingOp (
>                   NextOp = NextOp->Common.Next;
>
>                   Info->Flags = ACPI_PARSEOP_PARAMLIST;
> -                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info);
> +                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp,
> +                    AcpiDmAscendingOp, Info);
>                   Info->Flags = 0;
>                   Info->Level = Level;
>
> @@ -758,12 +764,18 @@ AcpiDmDescendingOp (
>               if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
>               {
>                   /*
> -                 * We have a resource list.  Don't need to output
> -                 * the buffer size Op.  Open up a new block
> +                 * We have a resource list. Don't need to output
> +                 * the buffer size Op. Open up a new block
>                    */
>                   NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
>                   NextOp = NextOp->Common.Next;
> -                AcpiOsPrintf (")\n");
> +                AcpiOsPrintf (")");
> +
> +                /* Emit description comment for Name() with a predefined ACPI name */
> +
> +                AcpiDmPredefinedDescription (Op->Asl.Parent);
> +
> +                AcpiOsPrintf ("\n");
>                   AcpiDmIndent (Info->Level);
>                   AcpiOsPrintf ("{\n");
>                   return (AE_OK);
> @@ -791,7 +803,7 @@ AcpiDmDescendingOp (
>
>           case AML_PACKAGE_OP:
>
> -            /* The next op is the size or predicate parameter */
> +            /* The next op is the size parameter */
>
>               NextOp = AcpiPsGetDepthNext (NULL, Op);
>               if (NextOp)
> @@ -844,6 +856,7 @@ AcpiDmAscendingOp (
>       void                    *Context)
>   {
>       ACPI_OP_WALK_INFO       *Info = Context;
> +    ACPI_PARSE_OBJECT       *ParentOp;
>
>
>       if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
> @@ -869,6 +882,19 @@ AcpiDmAscendingOp (
>
>           AcpiOsPrintf (")");
>
> +        if (Op->Common.AmlOpcode == AML_NAME_OP)
> +        {
> +            /* Emit description comment for Name() with a predefined ACPI name */
> +
> +            AcpiDmPredefinedDescription (Op);
> +        }
> +        else
> +        {
> +            /* For Create* operators, attempt to emit resource tag description */
> +
> +            AcpiDmFieldPredefinedDescription (Op);
> +        }
> +
>           /* Could be a nested operator, check if comma required */
>
>           if (!AcpiDmCommaIfListMember (Op))
> @@ -983,7 +1009,20 @@ AcpiDmAscendingOp (
>            */
>           if (Op->Common.Next)
>           {
> -            AcpiOsPrintf (")\n");
> +            AcpiOsPrintf (")");
> +
> +            /* Emit description comment for Name() with a predefined ACPI name */
> +
> +            ParentOp = Op->Common.Parent;
> +            if (ParentOp)
> +            {
> +                ParentOp = ParentOp->Common.Parent;
> +                if (ParentOp && ParentOp->Asl.AmlOpcode == AML_NAME_OP)
> +                {
> +                    AcpiDmPredefinedDescription (ParentOp);
> +                }
> +            }
> +            AcpiOsPrintf ("\n");
>               AcpiDmIndent (Level - 1);
>               AcpiOsPrintf ("{\n");
>           }
> diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index 526d478..3047c5f 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/source/components/dispatcher/dsfield.c
> @@ -129,6 +129,18 @@
>
>   /* Local prototypes */
>
> +#ifdef ACPI_ASL_COMPILER
> +#include "acdisasm.h"
> +
> +static ACPI_STATUS
> +AcpiDsCreateExternalRegion (
> +    ACPI_STATUS             LookupStatus,
> +    ACPI_PARSE_OBJECT       *Op,
> +    char                    *Path,
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_NAMESPACE_NODE     **Node);
> +#endif
> +
>   static ACPI_STATUS
>   AcpiDsGetFieldNames (
>       ACPI_CREATE_FIELD_INFO  *Info,
> @@ -136,6 +148,69 @@ AcpiDsGetFieldNames (
>       ACPI_PARSE_OBJECT       *Arg);
>
>
> +#ifdef ACPI_ASL_COMPILER
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsCreateExternalRegion (iASL Disassembler only)
> + *
> + * PARAMETERS:  LookupStatus    - Status from NsLookup operation
> + *              Op              - Op containing the Field definition and args
> + *              Path            - Pathname of the region
> + *  `           WalkState       - Current method state
> + *              Node            - Where the new region node is returned
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
> + *              region node/object.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDsCreateExternalRegion (
> +    ACPI_STATUS             LookupStatus,
> +    ACPI_PARSE_OBJECT       *Op,
> +    char                    *Path,
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_NAMESPACE_NODE     **Node)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_OPERAND_OBJECT     *ObjDesc;
> +
> +
> +    if (LookupStatus != AE_NOT_FOUND)
> +    {
> +        return (LookupStatus);
> +    }
> +
> +    /*
> +     * Table disassembly:
> +     * OperationRegion not found. Generate an External for it, and
> +     * insert the name into the namespace.
> +     */
> +    AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_REGION, 0);
> +    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
> +       ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +
> +    /* Must create and install a region object for the new node */
> +
> +    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> +    if (!ObjDesc)
> +    {
> +        return (AE_NO_MEMORY);
> +    }
> +
> +    ObjDesc->Region.Node = *Node;
> +    Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION);
> +    return (Status);
> +}
> +#endif
> +
> +
>   /*******************************************************************************
>    *
>    * FUNCTION:    AcpiDsCreateBufferField
> @@ -149,8 +224,8 @@ AcpiDsGetFieldNames (
>    *              CreateBitFieldOp,
>    *              CreateByteFieldOp,
>    *              CreateWordFieldOp,
> - *              CreateDWordFieldOp,
> - *              CreateQWordFieldOp,
> + *              CreateDwordFieldOp,
> + *              CreateQwordFieldOp,
>    *              CreateFieldOp       (all of which define a field in a buffer)
>    *
>    ******************************************************************************/
> @@ -510,11 +585,16 @@ AcpiDsCreateField (
>       /* First arg is the name of the parent OpRegion (must already exist) */
>
>       Arg = Op->Common.Value.Arg;
> +
>       if (!RegionNode)
>       {
>           Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
>                           ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
>                           ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
> +#ifdef ACPI_ASL_COMPILER
> +        Status = AcpiDsCreateExternalRegion (Status, Arg,
> +            Arg->Common.Value.Name, WalkState, &RegionNode);
> +#endif
>           if (ACPI_FAILURE (Status))
>           {
>               ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
> @@ -700,6 +780,10 @@ AcpiDsCreateBankField (
>           Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
>                           ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
>                           ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
> +#ifdef ACPI_ASL_COMPILER
> +        Status = AcpiDsCreateExternalRegion (Status, Arg,
> +            Arg->Common.Value.Name, WalkState, &RegionNode);
> +#endif
>           if (ACPI_FAILURE (Status))
>           {
>               ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index 5da09bd..d6ddbfa 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -595,18 +595,18 @@ AcpiDsEvalTableRegionOperands (
>
>
>       /*
> -     * This is where we evaluate the SignatureString and OemIDString
> -     * and OemTableIDString of the DataTableRegion declaration
> +     * This is where we evaluate the Signature string, OemId string,
> +     * and OemTableId string of the Data Table Region declaration
>        */
>       Node =  Op->Common.Node;
>
> -    /* NextOp points to SignatureString op */
> +    /* NextOp points to Signature string op */
>
>       NextOp = Op->Common.Value.Arg;
>
>       /*
> -     * Evaluate/create the SignatureString and OemIDString
> -     * and OemTableIDString operands
> +     * Evaluate/create the Signature string, OemId string,
> +     * and OemTableId string operands
>        */
>       Status = AcpiDsCreateOperands (WalkState, NextOp);
>       if (ACPI_FAILURE (Status))
> @@ -615,8 +615,8 @@ AcpiDsEvalTableRegionOperands (
>       }
>
>       /*
> -     * Resolve the SignatureString and OemIDString
> -     * and OemTableIDString operands
> +     * Resolve the Signature string, OemId string,
> +     * and OemTableId string operands
>        */
>       Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
>                   ACPI_WALK_OPERANDS, WalkState);
> diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
> index 1f689d6..7a4a84f 100644
> --- a/src/acpica/source/components/dispatcher/dswload.c
> +++ b/src/acpica/source/components/dispatcher/dswload.c
> @@ -313,6 +313,20 @@ AcpiDsLoad1BeginOp (
>               WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
>               break;
>
> +        case ACPI_TYPE_METHOD:
> +
> +            /*
> +             * Allow scope change to root during execution of module-level
> +             * code. Root is typed METHOD during this time.
> +             */
> +            if ((Node == AcpiGbl_RootNode) &&
> +                (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
> +            {
> +                break;
> +            }
> +
> +            /*lint -fallthrough */
> +
>           default:
>
>               /* All other types are an error */
> diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c
> index 85a86ec..139ff95 100644
> --- a/src/acpica/source/components/dispatcher/dswload2.c
> +++ b/src/acpica/source/components/dispatcher/dswload2.c
> @@ -315,6 +315,20 @@ AcpiDsLoad2BeginOp (
>               WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
>               break;
>
> +        case ACPI_TYPE_METHOD:
> +
> +            /*
> +             * Allow scope change to root during execution of module-level
> +             * code. Root is typed METHOD during this time.
> +             */
> +            if ((Node == AcpiGbl_RootNode) &&
> +                (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
> +            {
> +                break;
> +            }
> +
> +            /*lint -fallthrough */
> +
>           default:
>
>               /* All other types are an error */
> diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
> index de32275..bb72a6e 100644
> --- a/src/acpica/source/components/events/evgpe.c
> +++ b/src/acpica/source/components/events/evgpe.c
> @@ -590,6 +590,7 @@ AcpiEvAsynchExecuteGpeMethod (
>       ACPI_STATUS             Status;
>       ACPI_GPE_EVENT_INFO     *LocalGpeEventInfo;
>       ACPI_EVALUATE_INFO      *Info;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
>
>
>       ACPI_FUNCTION_TRACE (EvAsynchExecuteGpeMethod);
> @@ -645,10 +646,18 @@ AcpiEvAsynchExecuteGpeMethod (
>            * completes. The notify handlers are NOT invoked synchronously
>            * from this thread -- because handlers may in turn run other
>            * control methods.
> +         *
> +         * June 2012: Expand implicit notify mechanism to support
> +         * notifies on multiple device objects.
>            */
> -        Status = AcpiEvQueueNotifyRequest (
> -                    LocalGpeEventInfo->Dispatch.DeviceNode,
> -                    ACPI_NOTIFY_DEVICE_WAKE);
> +        Notify = LocalGpeEventInfo->Dispatch.NotifyList;
> +        while (ACPI_SUCCESS (Status) && Notify)
> +        {
> +            Status = AcpiEvQueueNotifyRequest (Notify->DeviceNode,
> +                        ACPI_NOTIFY_DEVICE_WAKE);
> +
> +            Notify = Notify->Next;
> +        }
>           break;
>
>       case ACPI_GPE_DISPATCH_METHOD:
> diff --git a/src/acpica/source/components/events/evgpeutil.c b/src/acpica/source/components/events/evgpeutil.c
> index a5ad320..38c7928 100644
> --- a/src/acpica/source/components/events/evgpeutil.c
> +++ b/src/acpica/source/components/events/evgpeutil.c
> @@ -463,6 +463,8 @@ AcpiEvDeleteGpeHandlers (
>       void                    *Context)
>   {
>       ACPI_GPE_EVENT_INFO     *GpeEventInfo;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
> +    ACPI_GPE_NOTIFY_INFO    *Next;
>       UINT32                  i;
>       UINT32                  j;
>
> @@ -484,10 +486,27 @@ AcpiEvDeleteGpeHandlers (
>               if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
>                       ACPI_GPE_DISPATCH_HANDLER)
>               {
> +                /* Delete an installed handler block */
> +
>                   ACPI_FREE (GpeEventInfo->Dispatch.Handler);
>                   GpeEventInfo->Dispatch.Handler = NULL;
>                   GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
>               }
> +            else if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> +                    ACPI_GPE_DISPATCH_NOTIFY)
> +            {
> +                /* Delete the implicit notification device list */
> +
> +                Notify = GpeEventInfo->Dispatch.NotifyList;
> +                while (Notify)
> +                {
> +                    Next = Notify->Next;
> +                    ACPI_FREE (Notify);
> +                    Notify = Next;
> +                }
> +                GpeEventInfo->Dispatch.NotifyList = NULL;
> +                GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
> +            }
>           }
>       }
>
> diff --git a/src/acpica/source/components/events/evmisc.c b/src/acpica/source/components/events/evmisc.c
> index 7369daa..ae3cecd 100644
> --- a/src/acpica/source/components/events/evmisc.c
> +++ b/src/acpica/source/components/events/evmisc.c
> @@ -183,107 +183,82 @@ AcpiEvQueueNotifyRequest (
>       UINT32                  NotifyValue)
>   {
>       ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_OPERAND_OBJECT     *HandlerObj = NULL;
> -    ACPI_GENERIC_STATE      *NotifyInfo;
> +    ACPI_OPERAND_OBJECT     *HandlerListHead = NULL;
> +    ACPI_GENERIC_STATE      *Info;
> +    UINT8                   HandlerListId = 0;
>       ACPI_STATUS             Status = AE_OK;
>
>
>       ACPI_FUNCTION_NAME (EvQueueNotifyRequest);
>
>
> -    /*
> -     * For value 0x03 (Ejection Request), may need to run a device method.
> -     * For value 0x02 (Device Wake), if _PRW exists, may need to run
> -     *   the _PS0 method.
> -     * For value 0x80 (Status Change) on the power button or sleep button,
> -     *   initiate soft-off or sleep operation.
> -     *
> -     * For all cases, simply dispatch the notify to the handler.
> -     */
> -    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -        "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
> -        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
> -        NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
> +    /* Are Notifies allowed on this object? */
>
> -    /* Get the notify object attached to the NS Node */
> -
> -    ObjDesc = AcpiNsGetAttachedObject (Node);
> -    if (ObjDesc)
> +    if (!AcpiEvIsNotifyObject (Node))
>       {
> -        /* We have the notify object, Get the correct handler */
> -
> -        switch (Node->Type)
> -        {
> -        /* Notify is allowed only on these types */
> +        return (AE_TYPE);
> +    }
>
> -        case ACPI_TYPE_DEVICE:
> -        case ACPI_TYPE_THERMAL:
> -        case ACPI_TYPE_PROCESSOR:
> +    /* Get the correct notify list type (System or Device) */
>
> -            if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
> -            {
> -                HandlerObj = ObjDesc->CommonNotify.SystemNotify;
> -            }
> -            else
> -            {
> -                HandlerObj = ObjDesc->CommonNotify.DeviceNotify;
> -            }
> -            break;
> +    if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
> +    {
> +        HandlerListId = ACPI_SYSTEM_HANDLER_LIST;
> +    }
> +    else
> +    {
> +        HandlerListId = ACPI_DEVICE_HANDLER_LIST;
> +    }
>
> -        default:
> +    /* Get the notify object attached to the namespace Node */
>
> -            /* All other types are not supported */
> +    ObjDesc = AcpiNsGetAttachedObject (Node);
> +    if (ObjDesc)
> +    {
> +        /* We have an attached object, Get the correct handler list */
>
> -            return (AE_TYPE);
> -        }
> +        HandlerListHead = ObjDesc->CommonNotify.NotifyList[HandlerListId];
>       }
>
>       /*
> -     * If there is a handler to run, schedule the dispatcher.
> -     * Check for:
> -     * 1) Global system notify handler
> -     * 2) Global device notify handler
> -     * 3) Per-device notify handler
> +     * If there is no notify handler (Global or Local)
> +     * for this object, just ignore the notify
>        */
> -    if ((AcpiGbl_SystemNotify.Handler &&
> -            (NotifyValue <= ACPI_MAX_SYS_NOTIFY)) ||
> -        (AcpiGbl_DeviceNotify.Handler &&
> -            (NotifyValue > ACPI_MAX_SYS_NOTIFY))  ||
> -        HandlerObj)
> +    if (!AcpiGbl_GlobalNotify[HandlerListId].Handler && !HandlerListHead)
>       {
> -        NotifyInfo = AcpiUtCreateGenericState ();
> -        if (!NotifyInfo)
> -        {
> -            return (AE_NO_MEMORY);
> -        }
> +        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +            "No notify handler for Notify, ignoring (%4.4s, %X) node %p\n",
> +            AcpiUtGetNodeName (Node), NotifyValue, Node));
>
> -        if (!HandlerObj)
> -        {
> -            ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -                "Executing system notify handler for Notify (%4.4s, %X) "
> -                "node %p\n",
> -                AcpiUtGetNodeName (Node), NotifyValue, Node));
> -        }
> +        return (AE_OK);
> +    }
>
> -        NotifyInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
> -        NotifyInfo->Notify.Node = Node;
> -        NotifyInfo->Notify.Value = (UINT16) NotifyValue;
> -        NotifyInfo->Notify.HandlerObj = HandlerObj;
> +    /* Setup notify info and schedule the notify dispatcher */
>
> -        Status = AcpiOsExecute (
> -                    OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, NotifyInfo);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            AcpiUtDeleteGenericState (NotifyInfo);
> -        }
> -    }
> -    else
> +    Info = AcpiUtCreateGenericState ();
> +    if (!Info)
>       {
> -        /* There is no notify handler (per-device or system) for this device */
> +        return (AE_NO_MEMORY);
> +    }
>
> -        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -            "No notify handler for Notify (%4.4s, %X) node %p\n",
> -            AcpiUtGetNodeName (Node), NotifyValue, Node));
> +    Info->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
> +
> +    Info->Notify.Node = Node;
> +    Info->Notify.Value = (UINT16) NotifyValue;
> +    Info->Notify.HandlerListId = HandlerListId;
> +    Info->Notify.HandlerListHead = HandlerListHead;
> +    Info->Notify.Global = &AcpiGbl_GlobalNotify[HandlerListId];
> +
> +    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +        "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
> +        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
> +        NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
> +
> +    Status = AcpiOsExecute (OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch,
> +        Info);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        AcpiUtDeleteGenericState (Info);
>       }
>
>       return (Status);
> @@ -307,61 +282,37 @@ static void ACPI_SYSTEM_XFACE
>   AcpiEvNotifyDispatch (
>       void                    *Context)
>   {
> -    ACPI_GENERIC_STATE      *NotifyInfo = (ACPI_GENERIC_STATE *) Context;
> -    ACPI_NOTIFY_HANDLER     GlobalHandler = NULL;
> -    void                    *GlobalContext = NULL;
> +    ACPI_GENERIC_STATE      *Info = (ACPI_GENERIC_STATE *) Context;
>       ACPI_OPERAND_OBJECT     *HandlerObj;
>
>
>       ACPI_FUNCTION_ENTRY ();
>
>
> -    /*
> -     * We will invoke a global notify handler if installed. This is done
> -     * _before_ we invoke the per-device handler attached to the device.
> -     */
> -    if (NotifyInfo->Notify.Value <= ACPI_MAX_SYS_NOTIFY)
> -    {
> -        /* Global system notification handler */
> +    /* Invoke a global notify handler if installed */
>
> -        if (AcpiGbl_SystemNotify.Handler)
> -        {
> -            GlobalHandler = AcpiGbl_SystemNotify.Handler;
> -            GlobalContext = AcpiGbl_SystemNotify.Context;
> -        }
> -    }
> -    else
> +    if (Info->Notify.Global->Handler)
>       {
> -        /* Global driver notification handler */
> -
> -        if (AcpiGbl_DeviceNotify.Handler)
> -        {
> -            GlobalHandler = AcpiGbl_DeviceNotify.Handler;
> -            GlobalContext = AcpiGbl_DeviceNotify.Context;
> -        }
> +        Info->Notify.Global->Handler (Info->Notify.Node,
> +            Info->Notify.Value,
> +            Info->Notify.Global->Context);
>       }
>
> -    /* Invoke the system handler first, if present */
> +    /* Now invoke the local notify handler(s) if any are installed */
>
> -    if (GlobalHandler)
> +    HandlerObj = Info->Notify.HandlerListHead;
> +    while (HandlerObj)
>       {
> -        GlobalHandler (NotifyInfo->Notify.Node, NotifyInfo->Notify.Value,
> -            GlobalContext);
> -    }
> -
> -    /* Now invoke the per-device handler, if present */
> -
> -    HandlerObj = NotifyInfo->Notify.HandlerObj;
> -    if (HandlerObj)
> -    {
> -        HandlerObj->Notify.Handler (NotifyInfo->Notify.Node,
> -            NotifyInfo->Notify.Value,
> +        HandlerObj->Notify.Handler (Info->Notify.Node,
> +            Info->Notify.Value,
>               HandlerObj->Notify.Context);
> +
> +        HandlerObj = HandlerObj->Notify.Next[Info->Notify.HandlerListId];
>       }
>
>       /* All done with the info object */
>
> -    AcpiUtDeleteGenericState (NotifyInfo);
> +    AcpiUtDeleteGenericState (Info);
>   }
>
>
> diff --git a/src/acpica/source/components/events/evxface.c b/src/acpica/source/components/events/evxface.c
> index a6aea09..b0c5ce3 100644
> --- a/src/acpica/source/components/events/evxface.c
> +++ b/src/acpica/source/components/events/evxface.c
> @@ -132,15 +132,21 @@
>    *
>    * PARAMETERS:  Device          - The device for which notifies will be handled
>    *              HandlerType     - The type of handler:
> - *                                  ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
> - *                                  ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
> - *                                  ACPI_ALL_NOTIFY:  both system and device
> + *                                  ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
> + *                                  ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
> + *                                  ACPI_ALL_NOTIFY:    Both System and Device
>    *              Handler         - Address of the handler
>    *              Context         - Value passed to the handler on each GPE
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Install a handler for notifies on an ACPI device
> + * DESCRIPTION: Install a handler for notifications on an ACPI Device,
> + *              ThermalZone, or Processor object.
> + *
> + * NOTES:       The Root namespace object may have only one handler for each
> + *              type of notify (System/Device). Device/Thermal/Processor objects
> + *              may have one device notify handler, and multiple system notify
> + *              handlers.
>    *
>    ******************************************************************************/
>
> @@ -151,10 +157,11 @@ AcpiInstallNotifyHandler (
>       ACPI_NOTIFY_HANDLER     Handler,
>       void                    *Context)
>   {
> +    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
>       ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_OPERAND_OBJECT     *NotifyObj;
> -    ACPI_NAMESPACE_NODE     *Node;
> +    ACPI_OPERAND_OBJECT     *HandlerObj;
>       ACPI_STATUS             Status;
> +    UINT32                  i;
>
>
>       ACPI_FUNCTION_TRACE (AcpiInstallNotifyHandler);
> @@ -162,8 +169,7 @@ AcpiInstallNotifyHandler (
>
>       /* Parameter validation */
>
> -    if ((!Device)  ||
> -        (!Handler) ||
> +    if ((!Device) || (!Handler) || (!HandlerType) ||
>           (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
>       {
>           return_ACPI_STATUS (AE_BAD_PARAMETER);
> @@ -175,135 +181,124 @@ AcpiInstallNotifyHandler (
>           return_ACPI_STATUS (Status);
>       }
>
> -    /* Convert and validate the device handle */
> -
> -    Node = AcpiNsValidateHandle (Device);
> -    if (!Node)
> -    {
> -        Status = AE_BAD_PARAMETER;
> -        goto UnlockAndExit;
> -    }
> -
>       /*
>        * Root Object:
>        * Registering a notify handler on the root object indicates that the
>        * caller wishes to receive notifications for all objects. Note that
> -     * only one <external> global handler can be regsitered (per notify type).
> +     * only one global handler can be registered per notify type.
> +     * Ensure that a handler is not already installed.
>        */
>       if (Device == ACPI_ROOT_OBJECT)
>       {
> -        /* Make sure the handler is not already installed */
> -
> -        if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> -                AcpiGbl_SystemNotify.Handler)       ||
> -            ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> -                AcpiGbl_DeviceNotify.Handler))
> -        {
> -            Status = AE_ALREADY_EXISTS;
> -            goto UnlockAndExit;
> -        }
> -
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> -        {
> -            AcpiGbl_SystemNotify.Node    = Node;
> -            AcpiGbl_SystemNotify.Handler = Handler;
> -            AcpiGbl_SystemNotify.Context = Context;
> -        }
> -
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> +        for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
>           {
> -            AcpiGbl_DeviceNotify.Node    = Node;
> -            AcpiGbl_DeviceNotify.Handler = Handler;
> -            AcpiGbl_DeviceNotify.Context = Context;
> +            if (HandlerType & (i+1))
> +            {
> +                if (AcpiGbl_GlobalNotify[i].Handler)
> +                {
> +                    Status = AE_ALREADY_EXISTS;
> +                    goto UnlockAndExit;
> +                }
> +
> +                AcpiGbl_GlobalNotify[i].Handler = Handler;
> +                AcpiGbl_GlobalNotify[i].Context = Context;
> +            }
>           }
>
> -        /* Global notify handler installed */
> +        goto UnlockAndExit; /* Global notify handler installed, all done */
>       }
>
>       /*
>        * All Other Objects:
> -     * Caller will only receive notifications specific to the target object.
> -     * Note that only certain object types can receive notifications.
> +     * Caller will only receive notifications specific to the target
> +     * object. Note that only certain object types are allowed to
> +     * receive notifications.
>        */
> -    else
> +
> +    /* Are Notifies allowed on this object? */
> +
> +    if (!AcpiEvIsNotifyObject (Node))
> +    {
> +        Status = AE_TYPE;
> +        goto UnlockAndExit;
> +    }
> +
> +    /* Check for an existing internal object, might not exist */
> +
> +    ObjDesc = AcpiNsGetAttachedObject (Node);
> +    if (!ObjDesc)
>       {
> -        /* Notifies allowed on this object? */
> +        /* Create a new object */
>
> -        if (!AcpiEvIsNotifyObject (Node))
> +        ObjDesc = AcpiUtCreateInternalObject (Node->Type);
> +        if (!ObjDesc)
>           {
> -            Status = AE_TYPE;
> +            Status = AE_NO_MEMORY;
>               goto UnlockAndExit;
>           }
>
> -        /* Check for an existing internal object */
> +        /* Attach new object to the Node, remove local reference */
>
> -        ObjDesc = AcpiNsGetAttachedObject (Node);
> -        if (ObjDesc)
> +        Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
> +        AcpiUtRemoveReference (ObjDesc);
> +        if (ACPI_FAILURE (Status))
>           {
> -            /* Object exists - make sure there's no handler */
> -
> -            if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> -                    ObjDesc->CommonNotify.SystemNotify)   ||
> -                ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> -                    ObjDesc->CommonNotify.DeviceNotify))
> -            {
> -                Status = AE_ALREADY_EXISTS;
> -                goto UnlockAndExit;
> -            }
> +            goto UnlockAndExit;
>           }
> -        else
> -        {
> -            /* Create a new object */
> -
> -            ObjDesc = AcpiUtCreateInternalObject (Node->Type);
> -            if (!ObjDesc)
> -            {
> -                Status = AE_NO_MEMORY;
> -                goto UnlockAndExit;
> -            }
> -
> -            /* Attach new object to the Node */
> -
> -            Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
> +    }
>
> -            /* Remove local reference to the object */
> +    /* Ensure that the handler is not already installed in the lists */
>
> -            AcpiUtRemoveReference (ObjDesc);
> -            if (ACPI_FAILURE (Status))
> +    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +    {
> +        if (HandlerType & (i+1))
> +        {
> +            HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
> +            while (HandlerObj)
>               {
> -                goto UnlockAndExit;
> +                if (HandlerObj->Notify.Handler == Handler)
> +                {
> +                    Status = AE_ALREADY_EXISTS;
> +                    goto UnlockAndExit;
> +                }
> +
> +                HandlerObj = HandlerObj->Notify.Next[i];
>               }
>           }
> +    }
>
> -        /* Install the handler */
> +    /* Create and populate a new notify handler object */
>
> -        NotifyObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
> -        if (!NotifyObj)
> -        {
> -            Status = AE_NO_MEMORY;
> -            goto UnlockAndExit;
> -        }
> +    HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
> +    if (!HandlerObj)
> +    {
> +        Status = AE_NO_MEMORY;
> +        goto UnlockAndExit;
> +    }
>
> -        NotifyObj->Notify.Node    = Node;
> -        NotifyObj->Notify.Handler = Handler;
> -        NotifyObj->Notify.Context = Context;
> +    HandlerObj->Notify.Node = Node;
> +    HandlerObj->Notify.HandlerType = HandlerType;
> +    HandlerObj->Notify.Handler = Handler;
> +    HandlerObj->Notify.Context = Context;
>
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> -        {
> -            ObjDesc->CommonNotify.SystemNotify = NotifyObj;
> -        }
> +    /* Install the handler at the list head(s) */
>
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> +    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +    {
> +        if (HandlerType & (i+1))
>           {
> -            ObjDesc->CommonNotify.DeviceNotify = NotifyObj;
> +            HandlerObj->Notify.Next[i] =
> +                ObjDesc->CommonNotify.NotifyList[i];
> +
> +            ObjDesc->CommonNotify.NotifyList[i] = HandlerObj;
>           }
> +    }
>
> -        if (HandlerType == ACPI_ALL_NOTIFY)
> -        {
> -            /* Extra ref if installed in both */
> +    /* Add an extra reference if handler was installed in both lists */
>
> -            AcpiUtAddReference (NotifyObj);
> -        }
> +    if (HandlerType == ACPI_ALL_NOTIFY)
> +    {
> +        AcpiUtAddReference (HandlerObj);
>       }
>
>
> @@ -319,11 +314,11 @@ ACPI_EXPORT_SYMBOL (AcpiInstallNotifyHandler)
>    *
>    * FUNCTION:    AcpiRemoveNotifyHandler
>    *
> - * PARAMETERS:  Device          - The device for which notifies will be handled
> + * PARAMETERS:  Device          - The device for which the handler is installed
>    *              HandlerType     - The type of handler:
> - *                                  ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
> - *                                  ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
> - *                                  ACPI_ALL_NOTIFY:  both system and device
> + *                                  ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
> + *                                  ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
> + *                                  ACPI_ALL_NOTIFY:    Both System and Device
>    *              Handler         - Address of the handler
>    *
>    * RETURN:      Status
> @@ -338,10 +333,12 @@ AcpiRemoveNotifyHandler (
>       UINT32                  HandlerType,
>       ACPI_NOTIFY_HANDLER     Handler)
>   {
> -    ACPI_OPERAND_OBJECT     *NotifyObj;
> +    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
>       ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_NAMESPACE_NODE     *Node;
> +    ACPI_OPERAND_OBJECT     *HandlerObj;
> +    ACPI_OPERAND_OBJECT     *PreviousHandlerObj;
>       ACPI_STATUS             Status;
> +    UINT32                  i;
>
>
>       ACPI_FUNCTION_TRACE (AcpiRemoveNotifyHandler);
> @@ -349,122 +346,103 @@ AcpiRemoveNotifyHandler (
>
>       /* Parameter validation */
>
> -    if ((!Device)  ||
> -        (!Handler) ||
> +    if ((!Device) || (!Handler) || (!HandlerType) ||
>           (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
>       {
>           return_ACPI_STATUS (AE_BAD_PARAMETER);
>       }
>
> +    /* Make sure all deferred notify tasks are completed */
> +
> +    AcpiOsWaitEventsComplete ();
> +
>       Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
>       if (ACPI_FAILURE (Status))
>       {
>           return_ACPI_STATUS (Status);
>       }
>
> -    /* Convert and validate the device handle */
> -
> -    Node = AcpiNsValidateHandle (Device);
> -    if (!Node)
> -    {
> -        Status = AE_BAD_PARAMETER;
> -        goto UnlockAndExit;
> -    }
> -
> -    /* Root Object */
> +    /* Root Object. Global handlers are removed here */
>
>       if (Device == ACPI_ROOT_OBJECT)
>       {
> -        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -            "Removing notify handler for namespace root object\n"));
> -
> -        if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> -              !AcpiGbl_SystemNotify.Handler)        ||
> -            ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> -              !AcpiGbl_DeviceNotify.Handler))
> -        {
> -            Status = AE_NOT_EXIST;
> -            goto UnlockAndExit;
> -        }
> -
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> +        for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
>           {
> -            AcpiGbl_SystemNotify.Node    = NULL;
> -            AcpiGbl_SystemNotify.Handler = NULL;
> -            AcpiGbl_SystemNotify.Context = NULL;
> +            if (HandlerType & (i+1))
> +            {
> +                if (!AcpiGbl_GlobalNotify[i].Handler ||
> +                    (AcpiGbl_GlobalNotify[i].Handler != Handler))
> +                {
> +                    Status = AE_NOT_EXIST;
> +                    goto UnlockAndExit;
> +                }
> +
> +                ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +                    "Removing global notify handler\n"));
> +
> +                AcpiGbl_GlobalNotify[i].Handler = NULL;
> +                AcpiGbl_GlobalNotify[i].Context = NULL;
> +            }
>           }
>
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> -        {
> -            AcpiGbl_DeviceNotify.Node    = NULL;
> -            AcpiGbl_DeviceNotify.Handler = NULL;
> -            AcpiGbl_DeviceNotify.Context = NULL;
> -        }
> +        goto UnlockAndExit;
>       }
>
> -    /* All Other Objects */
> +    /* All other objects: Are Notifies allowed on this object? */
>
> -    else
> +    if (!AcpiEvIsNotifyObject (Node))
>       {
> -        /* Notifies allowed on this object? */
> +        Status = AE_TYPE;
> +        goto UnlockAndExit;
> +    }
>
> -        if (!AcpiEvIsNotifyObject (Node))
> -        {
> -            Status = AE_TYPE;
> -            goto UnlockAndExit;
> -        }
> +    /* Must have an existing internal object */
> +
> +    ObjDesc = AcpiNsGetAttachedObject (Node);
> +    if (!ObjDesc)
> +    {
> +        Status = AE_NOT_EXIST;
> +        goto UnlockAndExit;
> +    }
>
> -        /* Check for an existing internal object */
> +    /* Internal object exists. Find the handler and remove it */
>
> -        ObjDesc = AcpiNsGetAttachedObject (Node);
> -        if (!ObjDesc)
> +    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +    {
> +        if (HandlerType & (i+1))
>           {
> -            Status = AE_NOT_EXIST;
> -            goto UnlockAndExit;
> -        }
> +            HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
> +            PreviousHandlerObj = NULL;
>
> -        /* Object exists - make sure there's an existing handler */
> +            /* Attempt to find the handler in the handler list */
>
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> -        {
> -            NotifyObj = ObjDesc->CommonNotify.SystemNotify;
> -            if (!NotifyObj)
> +            while (HandlerObj &&
> +                  (HandlerObj->Notify.Handler != Handler))
>               {
> -                Status = AE_NOT_EXIST;
> -                goto UnlockAndExit;
> +                PreviousHandlerObj = HandlerObj;
> +                HandlerObj = HandlerObj->Notify.Next[i];
>               }
>
> -            if (NotifyObj->Notify.Handler != Handler)
> +            if (!HandlerObj)
>               {
> -                Status = AE_BAD_PARAMETER;
> +                Status = AE_NOT_EXIST;
>                   goto UnlockAndExit;
>               }
>
> -            /* Remove the handler */
> +            /* Remove the handler object from the list */
>
> -            ObjDesc->CommonNotify.SystemNotify = NULL;
> -            AcpiUtRemoveReference (NotifyObj);
> -        }
> -
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> -        {
> -            NotifyObj = ObjDesc->CommonNotify.DeviceNotify;
> -            if (!NotifyObj)
> +            if (PreviousHandlerObj) /* Handler is not at the list head */
>               {
> -                Status = AE_NOT_EXIST;
> -                goto UnlockAndExit;
> +                PreviousHandlerObj->Notify.Next[i] =
> +                    HandlerObj->Notify.Next[i];
>               }
> -
> -            if (NotifyObj->Notify.Handler != Handler)
> +            else /* Handler is at the list head */
>               {
> -                Status = AE_BAD_PARAMETER;
> -                goto UnlockAndExit;
> +                ObjDesc->CommonNotify.NotifyList[i] =
> +                    HandlerObj->Notify.Next[i];
>               }
>
> -            /* Remove the handler */
> -
> -            ObjDesc->CommonNotify.DeviceNotify = NULL;
> -            AcpiUtRemoveReference (NotifyObj);
> +            AcpiUtRemoveReference (HandlerObj);
>           }
>       }
>
> @@ -894,6 +872,10 @@ AcpiRemoveGpeHandler (
>           return_ACPI_STATUS (AE_BAD_PARAMETER);
>       }
>
> +    /* Make sure all deferred GPE tasks are completed */
> +
> +    AcpiOsWaitEventsComplete ();
> +
>       Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
>       if (ACPI_FAILURE (Status))
>       {
> diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
> index 7018513..29e1d68 100644
> --- a/src/acpica/source/components/events/evxfgpe.c
> +++ b/src/acpica/source/components/events/evxfgpe.c
> @@ -155,7 +155,7 @@ AcpiUpdateAllGpes (
>       ACPI_STATUS             Status;
>
>
> -    ACPI_FUNCTION_TRACE (AcpiUpdateGpes);
> +    ACPI_FUNCTION_TRACE (AcpiUpdateAllGpes);
>
>
>       Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> @@ -367,9 +367,11 @@ AcpiSetupGpeForWake (
>       ACPI_HANDLE             GpeDevice,
>       UINT32                  GpeNumber)
>   {
> -    ACPI_STATUS             Status = AE_BAD_PARAMETER;
> +    ACPI_STATUS             Status;
>       ACPI_GPE_EVENT_INFO     *GpeEventInfo;
>       ACPI_NAMESPACE_NODE     *DeviceNode;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
> +    ACPI_GPE_NOTIFY_INFO    *NewNotify;
>       ACPI_CPU_FLAGS          Flags;
>
>
> @@ -405,32 +407,88 @@ AcpiSetupGpeForWake (
>           return_ACPI_STATUS (AE_BAD_PARAMETER);
>       }
>
> +    /*
> +     * Allocate a new notify object up front, in case it is needed.
> +     * Memory allocation while holding a spinlock is a big no-no
> +     * on some hosts.
> +     */
> +    NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
> +    if (!NewNotify)
> +    {
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
>       Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
>
>       /* Ensure that we have a valid GPE number */
>
>       GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
> -    if (GpeEventInfo)
> +    if (!GpeEventInfo)
> +    {
> +        Status = AE_BAD_PARAMETER;
> +        goto UnlockAndExit;
> +    }
> +
> +    /*
> +     * If there is no method or handler for this GPE, then the
> +     * WakeDevice will be notified whenever this GPE fires. This is
> +     * known as an "implicit notify". Note: The GPE is assumed to be
> +     * level-triggered (for windows compatibility).
> +     */
> +    if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> +            ACPI_GPE_DISPATCH_NONE)
>       {
>           /*
> -         * If there is no method or handler for this GPE, then the
> -         * WakeDevice will be notified whenever this GPE fires (aka
> -         * "implicit notify") Note: The GPE is assumed to be
> -         * level-triggered (for windows compatibility).
> +         * This is the first device for implicit notify on this GPE.
> +         * Just set the flags here, and enter the NOTIFY block below.
>            */
> -        if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> -                ACPI_GPE_DISPATCH_NONE)
> +        GpeEventInfo->Flags =
> +            (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
> +    }
> +
> +    /*
> +     * If we already have an implicit notify on this GPE, add
> +     * this device to the notify list.
> +     */
> +    if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> +            ACPI_GPE_DISPATCH_NOTIFY)
> +    {
> +        /* Ensure that the device is not already in the list */
> +
> +        Notify = GpeEventInfo->Dispatch.NotifyList;
> +        while (Notify)
>           {
> -            GpeEventInfo->Flags =
> -                (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
> -            GpeEventInfo->Dispatch.DeviceNode = DeviceNode;
> +            if (Notify->DeviceNode == DeviceNode)
> +            {
> +                Status = AE_ALREADY_EXISTS;
> +                goto UnlockAndExit;
> +            }
> +            Notify = Notify->Next;
>           }
>
> -        GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
> -        Status = AE_OK;
> +        /* Add this device to the notify list for this GPE */
> +
> +        NewNotify->DeviceNode = DeviceNode;
> +        NewNotify->Next = GpeEventInfo->Dispatch.NotifyList;
> +        GpeEventInfo->Dispatch.NotifyList = NewNotify;
> +        NewNotify = NULL;
>       }
>
> +    /* Mark the GPE as a possible wake event */
> +
> +    GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
> +    Status = AE_OK;
> +
> +
> +UnlockAndExit:
>       AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> +
> +    /* Delete the notify object if it was not used above */
> +
> +    if (NewNotify)
> +    {
> +        ACPI_FREE (NewNotify);
> +    }
>       return_ACPI_STATUS (Status);
>   }
>
> diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c
> index 69361d5..55cef28 100644
> --- a/src/acpica/source/components/executer/exconfig.c
> +++ b/src/acpica/source/components/executer/exconfig.c
> @@ -252,7 +252,7 @@ AcpiExLoadTableOp (
>       ACPI_FUNCTION_TRACE (ExLoadTableOp);
>
>
> -    /* Validate lengths for the SignatureString, OEMIDString, OEMTableID */
> +    /* Validate lengths for the Signature, OemId, and OemTableId strings */
>
>       if ((Operand[0]->String.Length > ACPI_NAME_SIZE) ||
>           (Operand[1]->String.Length > ACPI_OEM_ID_SIZE) ||
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 5aab606..b525333 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -203,8 +203,8 @@ static ACPI_EXDUMP_INFO     AcpiExDumpDevice[4] =
>   {
>       {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice),         NULL},
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.Handler),               "Handler"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.SystemNotify),          "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.DeviceNotify),          "Device Notify"}
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[0]),         "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "Device Notify"}
>   };
>
>   static ACPI_EXDUMP_INFO     AcpiExDumpEvent[2] =
> @@ -251,8 +251,8 @@ static ACPI_EXDUMP_INFO     AcpiExDumpPower[5] =
>       {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPower),          NULL},
>       {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.SystemLevel),    "System Level"},
>       {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.ResourceOrder),  "Resource Order"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.SystemNotify),   "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.DeviceNotify),   "Device Notify"}
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[0]),  "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "Device Notify"}
>   };
>
>   static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
> @@ -261,16 +261,16 @@ static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
>       {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Processor.ProcId),             "Processor ID"},
>       {ACPI_EXD_UINT8 ,   ACPI_EXD_OFFSET (Processor.Length),             "Length"},
>       {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Processor.Address),            "Address"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.SystemNotify),       "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.DeviceNotify),       "Device Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[0]),      "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[1]),      "Device Notify"},
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.Handler),            "Handler"}
>   };
>
>   static ACPI_EXDUMP_INFO     AcpiExDumpThermal[4] =
>   {
>       {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal),        NULL},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.SystemNotify),     "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.DeviceNotify),     "Device Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]),    "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]),    "Device Notify"},
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.Handler),          "Handler"}
>   };
>
> @@ -330,11 +330,15 @@ static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
>   };
>
> -static ACPI_EXDUMP_INFO     AcpiExDumpNotify[3] =
> +static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
>   {
>       {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
>       {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"}
> +    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
>   };
>
>
> diff --git a/src/acpica/source/components/executer/exprep.c b/src/acpica/source/components/executer/exprep.c
> index 0b65ab9..9b05f9d 100644
> --- a/src/acpica/source/components/executer/exprep.c
> +++ b/src/acpica/source/components/executer/exprep.c
> @@ -490,8 +490,8 @@ AcpiExPrepCommonFieldObject (
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and
> - *              connect it to the parent Node.
> + * DESCRIPTION: Construct an object of type ACPI_OPERAND_OBJECT with a
> + *              subtype of DefField and connect it to the parent Node.
>    *
>    ******************************************************************************/
>
> diff --git a/src/acpica/source/components/executer/exresolv.c b/src/acpica/source/components/executer/exresolv.c
> index 8d3893b..4b9e9b3 100644
> --- a/src/acpica/source/components/executer/exresolv.c
> +++ b/src/acpica/source/components/executer/exresolv.c
> @@ -237,7 +237,7 @@ AcpiExResolveObjectToValue (
>
>       StackDesc = *StackPtr;
>
> -    /* This is an ACPI_OPERAND_OBJECT  */
> +    /* This is an object of type ACPI_OPERAND_OBJECT */
>
>       switch (StackDesc->Common.Type)
>       {
> diff --git a/src/acpica/source/components/executer/exstore.c b/src/acpica/source/components/executer/exstore.c
> index 8bea79b..36fccf8 100644
> --- a/src/acpica/source/components/executer/exstore.c
> +++ b/src/acpica/source/components/executer/exstore.c
> @@ -140,15 +140,15 @@ AcpiExStoreObjectToIndex (
>    * FUNCTION:    AcpiExStore
>    *
>    * PARAMETERS:  *SourceDesc         - Value to be stored
> - *              *DestDesc           - Where to store it.  Must be an NS node
> - *                                    or an ACPI_OPERAND_OBJECT of type
> + *              *DestDesc           - Where to store it. Must be an NS node
> + *                                    or ACPI_OPERAND_OBJECT of type
>    *                                    Reference;
>    *              WalkState           - Current walk state
>    *
>    * RETURN:      Status
>    *
>    * DESCRIPTION: Store the value described by SourceDesc into the location
> - *              described by DestDesc.  Called by various interpreter
> + *              described by DestDesc. Called by various interpreter
>    *              functions to store the result of an operation into
>    *              the destination operand -- not just simply the actual "Store"
>    *              ASL operator.
> diff --git a/src/acpica/source/components/executer/exutils.c b/src/acpica/source/components/executer/exutils.c
> index 3ebcbe5..28a18ad 100644
> --- a/src/acpica/source/components/executer/exutils.c
> +++ b/src/acpica/source/components/executer/exutils.c
> @@ -193,7 +193,7 @@ AcpiExEnterInterpreter (
>    *
>    * DESCRIPTION: Reacquire the interpreter execution region from within the
>    *              interpreter code. Failure to enter the interpreter region is a
> - *              fatal system error. Used in  conjuction with
> + *              fatal system error. Used in conjunction with
>    *              RelinquishInterpreter
>    *
>    ******************************************************************************/
> diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
> index 6fd9d66..a2e4c43 100644
> --- a/src/acpica/source/components/hardware/hwsleep.c
> +++ b/src/acpica/source/components/hardware/hwsleep.c
> @@ -171,20 +171,6 @@ AcpiHwLegacySleep (
>           return_ACPI_STATUS (Status);
>       }
>
> -    if (SleepState != ACPI_STATE_S5)
> -    {
> -        /*
> -         * Disable BM arbitration. This feature is contained within an
> -         * optional register (PM2 Control), so ignore a BAD_ADDRESS
> -         * exception.
> -         */
> -        Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 1);
> -        if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
> -        {
> -            return_ACPI_STATUS (Status);
> -        }
> -    }
> -
>       /*
>        * 1) Disable/Clear all GPEs
>        * 2) Enable all wakeup GPEs
> @@ -452,17 +438,6 @@ AcpiHwLegacyWake (
>               AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
>               ACPI_CLEAR_STATUS);
>
> -    /*
> -     * Enable BM arbitration. This feature is contained within an
> -     * optional register (PM2 Control), so ignore a BAD_ADDRESS
> -     * exception.
> -     */
> -    Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 0);
> -    if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
> -    {
> -        return_ACPI_STATUS (Status);
> -    }
> -
>       AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
>       return_ACPI_STATUS (Status);
>   }
> diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
> index 631b81e..dfb7112 100644
> --- a/src/acpica/source/components/hardware/hwxfsleep.c
> +++ b/src/acpica/source/components/hardware/hwxfsleep.c
> @@ -173,6 +173,14 @@ AcpiSetFirmwareWakingVector (
>       ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector);
>
>
> +    /*
> +     * According to the ACPI specification 2.0c and later, the 64-bit
> +     * waking vector should be cleared and the 32-bit waking vector should
> +     * be used, unless we want the wake-up code to be called by the BIOS in
> +     * Protected Mode. Some systems (for example HP dv5-1004nr) are known
> +     * to fail to resume if the 64-bit vector is used.
> +     */
> +
>       /* Set the 32-bit vector */
>
>       AcpiGbl_FACS->FirmwareWakingVector = PhysicalAddress;
> diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
> index e6c7cf6..8bc2591 100644
> --- a/src/acpica/source/components/namespace/nspredef.c
> +++ b/src/acpica/source/components/namespace/nspredef.c
> @@ -753,7 +753,7 @@ AcpiNsCheckPackage (
>           {
>               /* Create the new outer package and populate it */
>
> -            Status = AcpiNsWrapWithPackage (Data, *Elements, ReturnObjectPtr);
> +            Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr);
>               if (ACPI_FAILURE (Status))
>               {
>                   return (Status);
> diff --git a/src/acpica/source/components/parser/psxface.c b/src/acpica/source/components/parser/psxface.c
> index 11c5fc2..5da1b6a 100644
> --- a/src/acpica/source/components/parser/psxface.c
> +++ b/src/acpica/source/components/parser/psxface.c
> @@ -420,8 +420,8 @@ AcpiPsExecuteMethod (
>       }
>
>       /*
> -     * Start method evaluation with an implicit return of zero. This is done
> -     * for Windows compatibility.
> +     * Start method evaluation with an implicit return of zero.
> +     * This is done for Windows compatibility.
>        */
>       if (AcpiGbl_EnableInterpreterSlack)
>       {
> diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
> index d75ceb6..6aaf4bb 100644
> --- a/src/acpica/source/components/resources/rscreate.c
> +++ b/src/acpica/source/components/resources/rscreate.c
> @@ -281,8 +281,8 @@ AcpiRsCreateResourceList (
>    *
>    * FUNCTION:    AcpiRsCreatePciRoutingTable
>    *
> - * PARAMETERS:  PackageObject           - Pointer to an ACPI_OPERAND_OBJECT
> - *                                        package
> + * PARAMETERS:  PackageObject           - Pointer to a package containing one
> + *                                        of more ACPI_OPERAND_OBJECTs
>    *              OutputBuffer            - Pointer to the user's buffer
>    *
>    * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
> @@ -290,7 +290,7 @@ AcpiRsCreateResourceList (
>    *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
>    *              to the size buffer needed.
>    *
> - * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT  package and creates a
> + * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a
>    *              linked list of PCI interrupt descriptions
>    *
>    * NOTE: It is the caller's responsibility to ensure that the start of the
> diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
> index ce3143c..a45b3d6 100644
> --- a/src/acpica/source/components/resources/rsutils.c
> +++ b/src/acpica/source/components/resources/rsutils.c
> @@ -253,7 +253,7 @@ AcpiRsMoveData (
>
>           /*
>            * 16-, 32-, and 64-bit cases must use the move macros that perform
> -         * endian conversion and/or accomodate hardware that cannot perform
> +         * endian conversion and/or accommodate hardware that cannot perform
>            * misaligned memory transfers
>            */
>           case ACPI_RSC_MOVE16:
> diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
> index fa43dbb..2c51511 100644
> --- a/src/acpica/source/components/tables/tbfadt.c
> +++ b/src/acpica/source/components/tables/tbfadt.c
> @@ -124,12 +124,13 @@
>
>   /* Local prototypes */
>
> -static ACPI_INLINE void
> +static void
>   AcpiTbInitGenericAddress (
>       ACPI_GENERIC_ADDRESS    *GenericAddress,
>       UINT8                   SpaceId,
>       UINT8                   ByteWidth,
> -    UINT64                  Address);
> +    UINT64                  Address,
> +    char                    *RegisterName);
>
>   static void
>   AcpiTbConvertFadt (
> @@ -263,7 +264,7 @@ static ACPI_FADT_PM_INFO    FadtPmInfoTable[] =
>    *
>    * PARAMETERS:  GenericAddress      - GAS struct to be initialized
>    *              SpaceId             - ACPI Space ID for this register
> - *              ByteWidth           - Width of this register, in bytes
> + *              ByteWidth           - Width of this register
>    *              Address             - Address of the register
>    *
>    * RETURN:      None
> @@ -274,13 +275,30 @@ static ACPI_FADT_PM_INFO    FadtPmInfoTable[] =
>    *
>    ******************************************************************************/
>
> -static ACPI_INLINE void
> +static void
>   AcpiTbInitGenericAddress (
>       ACPI_GENERIC_ADDRESS    *GenericAddress,
>       UINT8                   SpaceId,
>       UINT8                   ByteWidth,
> -    UINT64                  Address)
> +    UINT64                  Address,
> +    char                    *RegisterName)
>   {
> +    UINT8                   BitWidth;
> +
> +
> +    /* Bit width field in the GAS is only one byte long, 255 max */
> +
> +    BitWidth = (UINT8) (ByteWidth * 8);
> +
> +    if (ByteWidth > 31) /* (31*8)=248 */
> +    {
> +        ACPI_ERROR ((AE_INFO,
> +            "%s - 32-bit FADT register is too long (%u bytes, %u bits) "
> +            "to convert to GAS struct - 255 bits max, truncating",
> +            RegisterName, ByteWidth, (ByteWidth * 8)));
> +
> +        BitWidth = 255;
> +    }
>
>       /*
>        * The 64-bit Address field is non-aligned in the byte packed
> @@ -291,7 +309,7 @@ AcpiTbInitGenericAddress (
>       /* All other fields are byte-wide */
>
>       GenericAddress->SpaceId = SpaceId;
> -    GenericAddress->BitWidth = (UINT8) ACPI_MUL_8 (ByteWidth);
> +    GenericAddress->BitWidth = BitWidth;
>       GenericAddress->BitOffset = 0;
>       GenericAddress->AccessWidth = 0; /* Access width ANY */
>   }
> @@ -392,7 +410,7 @@ AcpiTbCreateLocalFadt (
>        */
>       if (Length > sizeof (ACPI_TABLE_FADT))
>       {
> -        ACPI_WARNING ((AE_INFO,
> +        ACPI_BIOS_WARNING ((AE_INFO,
>               "FADT (revision %u) is longer than ACPI 5.0 version, "
>               "truncating length %u to %u",
>               Table->Revision, Length, (UINT32) sizeof (ACPI_TABLE_FADT)));
> @@ -540,8 +558,9 @@ AcpiTbConvertFadt (
>           if (Address64->Address && Address32 &&
>              (Address64->Address != (UINT64) Address32))
>           {
> -            ACPI_ERROR ((AE_INFO,
> -                "32/64X address mismatch in %s: 0x%8.8X/0x%8.8X%8.8X, using 32",
> +            ACPI_BIOS_ERROR ((AE_INFO,
> +                "32/64X address mismatch in FADT/%s: "
> +                "0x%8.8X/0x%8.8X%8.8X, using 32",
>                   FadtInfoTable[i].Name, Address32,
>                   ACPI_FORMAT_UINT64 (Address64->Address)));
>           }
> @@ -556,7 +575,7 @@ AcpiTbConvertFadt (
>                */
>               AcpiTbInitGenericAddress (Address64, ACPI_ADR_SPACE_SYSTEM_IO,
>                   *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length),
> -                (UINT64) Address32);
> +                (UINT64) Address32, FadtInfoTable[i].Name);
>           }
>       }
>   }
> @@ -600,7 +619,7 @@ AcpiTbValidateFadt (
>       if (AcpiGbl_FADT.Facs &&
>           (AcpiGbl_FADT.XFacs != (UINT64) AcpiGbl_FADT.Facs))
>       {
> -        ACPI_WARNING ((AE_INFO,
> +        ACPI_BIOS_WARNING ((AE_INFO,
>               "32/64X FACS address mismatch in FADT - "
>               "0x%8.8X/0x%8.8X%8.8X, using 32",
>               AcpiGbl_FADT.Facs, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XFacs)));
> @@ -611,7 +630,7 @@ AcpiTbValidateFadt (
>       if (AcpiGbl_FADT.Dsdt &&
>           (AcpiGbl_FADT.XDsdt != (UINT64) AcpiGbl_FADT.Dsdt))
>       {
> -        ACPI_WARNING ((AE_INFO,
> +        ACPI_BIOS_WARNING ((AE_INFO,
>               "32/64X DSDT address mismatch in FADT - "
>               "0x%8.8X/0x%8.8X%8.8X, using 32",
>               AcpiGbl_FADT.Dsdt, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XDsdt)));
> @@ -647,8 +666,8 @@ AcpiTbValidateFadt (
>           if (Address64->Address &&
>              (Address64->BitWidth != ACPI_MUL_8 (Length)))
>           {
> -            ACPI_WARNING ((AE_INFO,
> -                "32/64X length mismatch in %s: %u/%u",
> +            ACPI_BIOS_WARNING ((AE_INFO,
> +                "32/64X length mismatch in FADT/%s: %u/%u",
>                   Name, ACPI_MUL_8 (Length), Address64->BitWidth));
>           }
>
> @@ -660,9 +679,9 @@ AcpiTbValidateFadt (
>                */
>               if (!Address64->Address || !Length)
>               {
> -                ACPI_ERROR ((AE_INFO,
> -                    "Required field %s has zero address and/or length:"
> -                    " 0x%8.8X%8.8X/0x%X",
> +                ACPI_BIOS_ERROR ((AE_INFO,
> +                    "Required FADT field %s has zero address and/or length: "
> +                    "0x%8.8X%8.8X/0x%X",
>                       Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
>               }
>           }
> @@ -676,8 +695,8 @@ AcpiTbValidateFadt (
>               if ((Address64->Address && !Length) ||
>                   (!Address64->Address && Length))
>               {
> -                ACPI_WARNING ((AE_INFO,
> -                    "Optional field %s has zero address or length: "
> +                ACPI_BIOS_WARNING ((AE_INFO,
> +                    "Optional FADT field %s has zero address or length: "
>                       "0x%8.8X%8.8X/0x%X",
>                       Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
>               }
> @@ -728,8 +747,8 @@ AcpiTbSetupFadtRegisters (
>                   (FadtInfoTable[i].DefaultLength > 0) &&
>                   (FadtInfoTable[i].DefaultLength != Target64->BitWidth))
>               {
> -                ACPI_WARNING ((AE_INFO,
> -                    "Invalid length for %s: %u, using default %u",
> +                ACPI_BIOS_WARNING ((AE_INFO,
> +                    "Invalid length for FADT/%s: %u, using default %u",
>                       FadtInfoTable[i].Name, Target64->BitWidth,
>                       FadtInfoTable[i].DefaultLength));
>
> @@ -772,7 +791,8 @@ AcpiTbSetupFadtRegisters (
>               AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target,
>                   Source64->SpaceId, Pm1RegisterByteWidth,
>                   Source64->Address +
> -                    (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth));
> +                    (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth),
> +                "PmRegisters");
>           }
>       }
>   }
> diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c
> index 00fd2a2..5e112dc 100644
> --- a/src/acpica/source/components/tables/tbinstal.c
> +++ b/src/acpica/source/components/tables/tbinstal.c
> @@ -229,8 +229,9 @@ AcpiTbAddTable (
>          (!ACPI_COMPARE_NAME (TableDesc->Pointer->Signature, ACPI_SIG_SSDT)) &&
>          (ACPI_STRNCMP (TableDesc->Pointer->Signature, "OEM", 3)))
>       {
> -        ACPI_ERROR ((AE_INFO,
> -            "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx",
> +        ACPI_BIOS_ERROR ((AE_INFO,
> +            "Table has invalid signature [%4.4s] (0x%8.8X), "
> +            "must be SSDT or OEMx",
>               AcpiUtValidAcpiName (*(UINT32 *) TableDesc->Pointer->Signature) ?
>                   TableDesc->Pointer->Signature : "????",
>               *(UINT32 *) TableDesc->Pointer->Signature));
> diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
> index 4ad777c..4f0b75d 100644
> --- a/src/acpica/source/components/tables/tbutils.c
> +++ b/src/acpica/source/components/tables/tbutils.c
> @@ -359,8 +359,9 @@ AcpiTbVerifyChecksum (
>
>       if (Checksum)
>       {
> -        ACPI_WARNING ((AE_INFO,
> -            "Incorrect checksum in table [%4.4s] - 0x%2.2X, should be 0x%2.2X",
> +        ACPI_BIOS_WARNING ((AE_INFO,
> +            "Incorrect checksum in table [%4.4s] - 0x%2.2X, "
> +            "should be 0x%2.2X",
>               Table->Signature, Table->Checksum,
>               (UINT8) (Table->Checksum - Checksum)));
>
> @@ -428,8 +429,9 @@ AcpiTbCheckDsdtHeader (
>       if (AcpiGbl_OriginalDsdtHeader.Length != AcpiGbl_DSDT->Length ||
>           AcpiGbl_OriginalDsdtHeader.Checksum != AcpiGbl_DSDT->Checksum)
>       {
> -        ACPI_ERROR ((AE_INFO,
> -            "The DSDT has been corrupted or replaced - old, new headers below"));
> +        ACPI_BIOS_ERROR ((AE_INFO,
> +            "The DSDT has been corrupted or replaced - "
> +            "old, new headers below"));
>           AcpiTbPrintTableHeader (0, &AcpiGbl_OriginalDsdtHeader);
>           AcpiTbPrintTableHeader (0, AcpiGbl_DSDT);
>
> @@ -537,7 +539,7 @@ AcpiTbInstallTable (
>       if (Signature &&
>           !ACPI_COMPARE_NAME (Table->Signature, Signature))
>       {
> -        ACPI_ERROR ((AE_INFO,
> +        ACPI_BIOS_ERROR ((AE_INFO,
>               "Invalid signature 0x%X for ACPI table, expected [%s]",
>               *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));
>           goto UnmapAndExit;
> @@ -656,7 +658,7 @@ AcpiTbGetRootTableEntry (
>           {
>               /* Will truncate 64-bit address to 32 bits, issue warning */
>
> -            ACPI_WARNING ((AE_INFO,
> +            ACPI_BIOS_WARNING ((AE_INFO,
>                   "64-bit Physical Address in XSDT is too large (0x%8.8X%8.8X),"
>                   " truncating",
>                   ACPI_FORMAT_UINT64 (Address64)));
> @@ -758,7 +760,8 @@ AcpiTbParseRootTable (
>
>       if (Length < sizeof (ACPI_TABLE_HEADER))
>       {
> -        ACPI_ERROR ((AE_INFO, "Invalid length 0x%X in RSDT/XSDT", Length));
> +        ACPI_BIOS_ERROR ((AE_INFO,
> +            "Invalid table length 0x%X in RSDT/XSDT", Length));
>           return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);
>       }
>
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 860dc2e..b91cce1 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -1,7 +1,6 @@
>   /******************************************************************************
>    *
> - * Module Name: tbxface - Public interfaces to the ACPI subsystem
> - *                         ACPI table oriented interfaces
> + * Module Name: tbxface - ACPI table oriented external interfaces
>    *
>    *****************************************************************************/
>
> @@ -118,18 +117,11 @@
>
>   #include "acpi.h"
>   #include "accommon.h"
> -#include "acnamesp.h"
>   #include "actables.h"
>
>   #define _COMPONENT          ACPI_TABLES
>           ACPI_MODULE_NAME    ("tbxface")
>
> -/* Local prototypes */
> -
> -static ACPI_STATUS
> -AcpiTbLoadNamespace (
> -    void);
> -
>
>   /*******************************************************************************
>    *
> @@ -530,155 +522,6 @@ ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex)
>
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiTbLoadNamespace
> - *
> - * PARAMETERS:  None
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
> - *              the RSDT/XSDT.
> - *
> - ******************************************************************************/
> -
> -static ACPI_STATUS
> -AcpiTbLoadNamespace (
> -    void)
> -{
> -    ACPI_STATUS             Status;
> -    UINT32                  i;
> -    ACPI_TABLE_HEADER       *NewDsdt;
> -
> -
> -    ACPI_FUNCTION_TRACE (TbLoadNamespace);
> -
> -
> -    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -
> -    /*
> -     * Load the namespace. The DSDT is required, but any SSDT and
> -     * PSDT tables are optional. Verify the DSDT.
> -     */
> -    if (!AcpiGbl_RootTableList.CurrentTableCount ||
> -        !ACPI_COMPARE_NAME (
> -            &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
> -            ACPI_SIG_DSDT) ||
> -         ACPI_FAILURE (AcpiTbVerifyTable (
> -            &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
> -    {
> -        Status = AE_NO_ACPI_TABLES;
> -        goto UnlockAndExit;
> -    }
> -
> -    /*
> -     * Save the DSDT pointer for simple access. This is the mapped memory
> -     * address. We must take care here because the address of the .Tables
> -     * array can change dynamically as tables are loaded at run-time. Note:
> -     * .Pointer field is not validated until after call to AcpiTbVerifyTable.
> -     */
> -    AcpiGbl_DSDT = AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer;
> -
> -    /*
> -     * Optionally copy the entire DSDT to local memory (instead of simply
> -     * mapping it.) There are some BIOSs that corrupt or replace the original
> -     * DSDT, creating the need for this option. Default is FALSE, do not copy
> -     * the DSDT.
> -     */
> -    if (AcpiGbl_CopyDsdtLocally)
> -    {
> -        NewDsdt = AcpiTbCopyDsdt (ACPI_TABLE_INDEX_DSDT);
> -        if (NewDsdt)
> -        {
> -            AcpiGbl_DSDT = NewDsdt;
> -        }
> -    }
> -
> -    /*
> -     * Save the original DSDT header for detection of table corruption
> -     * and/or replacement of the DSDT from outside the OS.
> -     */
> -    ACPI_MEMCPY (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
> -        sizeof (ACPI_TABLE_HEADER));
> -
> -    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -
> -    /* Load and parse tables */
> -
> -    Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return_ACPI_STATUS (Status);
> -    }
> -
> -    /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
> -
> -    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
> -    {
> -        if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
> -                    ACPI_SIG_SSDT) &&
> -             !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
> -                    ACPI_SIG_PSDT)) ||
> -             ACPI_FAILURE (AcpiTbVerifyTable (
> -                &AcpiGbl_RootTableList.Tables[i])))
> -        {
> -            continue;
> -        }
> -
> -        /* Ignore errors while loading tables, get as many as possible */
> -
> -        (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -        (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
> -        (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -    }
> -
> -    ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
> -
> -UnlockAndExit:
> -    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -    return_ACPI_STATUS (Status);
> -}
> -
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiLoadTables
> - *
> - * PARAMETERS:  None
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -AcpiLoadTables (
> -    void)
> -{
> -    ACPI_STATUS             Status;
> -
> -
> -    ACPI_FUNCTION_TRACE (AcpiLoadTables);
> -
> -
> -    /* Load the namespace from the tables */
> -
> -    Status = AcpiTbLoadNamespace ();
> -    if (ACPI_FAILURE (Status))
> -    {
> -        ACPI_EXCEPTION ((AE_INFO, Status,
> -            "While loading namespace from ACPI tables"));
> -    }
> -
> -    return_ACPI_STATUS (Status);
> -}
> -
> -ACPI_EXPORT_SYMBOL (AcpiLoadTables)
> -
> -
> -/*******************************************************************************
> - *
>    * FUNCTION:    AcpiInstallTableHandler
>    *
>    * PARAMETERS:  Handler         - Table event handler
> diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
> index e85c1fd..d00db5f 100644
> --- a/src/acpica/source/components/tables/tbxfroot.c
> +++ b/src/acpica/source/components/tables/tbxfroot.c
> @@ -306,7 +306,7 @@ AcpiFindRootPointer (
>
>       /* A valid RSDP was not found */
>
> -    ACPI_ERROR ((AE_INFO, "A valid RSDP was not found"));
> +    ACPI_BIOS_ERROR ((AE_INFO, "A valid RSDP was not found"));
>       return_ACPI_STATUS (AE_NOT_FOUND);
>   }
>
> diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c
> index b36aa45..a88c581 100644
> --- a/src/acpica/source/components/utilities/utdecode.c
> +++ b/src/acpica/source/components/utilities/utdecode.c
> @@ -123,47 +123,6 @@
>           ACPI_MODULE_NAME    ("utdecode")
>
>
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiFormatException
> - *
> - * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
> - *
> - * RETURN:      A string containing the exception text. A valid pointer is
> - *              always returned.
> - *
> - * DESCRIPTION: This function translates an ACPI exception into an ASCII string
> - *              It is here instead of utxface.c so it is always present.
> - *
> - ******************************************************************************/
> -
> -const char *
> -AcpiFormatException (
> -    ACPI_STATUS             Status)
> -{
> -    const char              *Exception = NULL;
> -
> -
> -    ACPI_FUNCTION_ENTRY ();
> -
> -
> -    Exception = AcpiUtValidateException (Status);
> -    if (!Exception)
> -    {
> -        /* Exception code was not recognized */
> -
> -        ACPI_ERROR ((AE_INFO,
> -            "Unknown exception code: 0x%8.8X", Status));
> -
> -        Exception = "UNKNOWN_STATUS_CODE";
> -    }
> -
> -    return (ACPI_CAST_PTR (const char, Exception));
> -}
> -
> -ACPI_EXPORT_SYMBOL (AcpiFormatException)
> -
> -
>   /*
>    * Properties of the ACPI Object Types, both internal and external.
>    * The table is indexed by values of ACPI_OBJECT_TYPE
> @@ -252,16 +211,17 @@ AcpiUtHexToAsciiChar (
>
>   const char        *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
>   {
> -    "SystemMemory",
> -    "SystemIO",
> -    "PCI_Config",
> -    "EmbeddedControl",
> -    "SMBus",
> -    "SystemCMOS",
> -    "PCIBARTarget",
> -    "IPMI",
> -    "GeneralPurposeIo",
> -    "GenericSerialBus"
> +    "SystemMemory",     /* 0x00 */
> +    "SystemIO",         /* 0x01 */
> +    "PCI_Config",       /* 0x02 */
> +    "EmbeddedControl",  /* 0x03 */
> +    "SMBus",            /* 0x04 */
> +    "SystemCMOS",       /* 0x05 */
> +    "PCIBARTarget",     /* 0x06 */
> +    "IPMI",             /* 0x07 */
> +    "GeneralPurposeIo", /* 0x08 */
> +    "GenericSerialBus", /* 0x09 */
> +    "PCC"               /* 0x0A */
>   };
>
>
> diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c
> index 3130e6d..b64a585 100644
> --- a/src/acpica/source/components/utilities/utdelete.c
> +++ b/src/acpica/source/components/utilities/utdelete.c
> @@ -239,7 +239,7 @@ AcpiUtDeleteInternalObj (
>       case ACPI_TYPE_PROCESSOR:
>       case ACPI_TYPE_THERMAL:
>
> -        /* Walk the notify handler list for this object */
> +        /* Walk the address handler list for this object */
>
>           HandlerDesc = Object->CommonNotify.Handler;
>           while (HandlerDesc)
> @@ -595,6 +595,7 @@ AcpiUtUpdateObjectReference (
>       ACPI_STATUS             Status = AE_OK;
>       ACPI_GENERIC_STATE      *StateList = NULL;
>       ACPI_OPERAND_OBJECT     *NextObject = NULL;
> +    ACPI_OPERAND_OBJECT     *PrevObject;
>       ACPI_GENERIC_STATE      *State;
>       UINT32                  i;
>
> @@ -624,10 +625,20 @@ AcpiUtUpdateObjectReference (
>           case ACPI_TYPE_POWER:
>           case ACPI_TYPE_THERMAL:
>
> -            /* Update the notify objects for these types (if present) */
> -
> -            AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
> -            AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
> +            /*
> +             * Update the notify objects for these types (if present)
> +             * Two lists, system and device notify handlers.
> +             */
> +            for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +            {
> +                PrevObject = Object->CommonNotify.NotifyList[i];
> +                while (PrevObject)
> +                {
> +                    NextObject = PrevObject->Notify.Next[i];
> +                    AcpiUtUpdateRefCount (PrevObject, Action);
> +                    PrevObject = NextObject;
> +                }
> +            }
>               break;
>
>           case ACPI_TYPE_PACKAGE:
> diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
> index 8ebbaec..98b1e48 100644
> --- a/src/acpica/source/components/utilities/utglobal.c
> +++ b/src/acpica/source/components/utilities/utglobal.c
> @@ -283,8 +283,9 @@ ACPI_FIXED_EVENT_INFO       AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: Init ACPICA globals.  All globals that require specific
> - *              initialization should be initialized here!
> + * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
> + *              initialization should be initialized here. This allows for
> + *              a warm restart.
>    *
>    ******************************************************************************/
>
> @@ -359,8 +360,8 @@ AcpiUtInitGlobals (
>
>       /* Global handlers */
>
> -    AcpiGbl_SystemNotify.Handler        = NULL;
> -    AcpiGbl_DeviceNotify.Handler        = NULL;
> +    AcpiGbl_GlobalNotify[0].Handler     = NULL;
> +    AcpiGbl_GlobalNotify[1].Handler     = NULL;
>       AcpiGbl_ExceptionHandler            = NULL;
>       AcpiGbl_InitHandler                 = NULL;
>       AcpiGbl_TableHandler                = NULL;
> diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
> index 44dd533..7318f68 100644
> --- a/src/acpica/source/components/utilities/utmisc.c
> +++ b/src/acpica/source/components/utilities/utmisc.c
> @@ -125,84 +125,41 @@
>           ACPI_MODULE_NAME    ("utmisc")
>
>
> +#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiUtValidateException
> + * FUNCTION:    UtConvertBackslashes
>    *
> - * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
> + * PARAMETERS:  Pathname        - File pathname string to be converted
>    *
> - * RETURN:      A string containing the exception text. NULL if exception is
> - *              not valid.
> + * RETURN:      Modifies the input Pathname
>    *
> - * DESCRIPTION: This function validates and translates an ACPI exception into
> - *              an ASCII string.
> + * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
> + *              the entire input file pathname string.
>    *
>    ******************************************************************************/
>
> -const char *
> -AcpiUtValidateException (
> -    ACPI_STATUS             Status)
> +void
> +UtConvertBackslashes (
> +    char                    *Pathname)
>   {
> -    UINT32                  SubStatus;
> -    const char              *Exception = NULL;
> -
> -
> -    ACPI_FUNCTION_ENTRY ();
> -
>
> -    /*
> -     * Status is composed of two parts, a "type" and an actual code
> -     */
> -    SubStatus = (Status & ~AE_CODE_MASK);
> -
> -    switch (Status & AE_CODE_MASK)
> +    if (!Pathname)
>       {
> -    case AE_CODE_ENVIRONMENTAL:
> -
> -        if (SubStatus <= AE_CODE_ENV_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_PROGRAMMER:
> -
> -        if (SubStatus <= AE_CODE_PGM_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_ACPI_TABLES:
> -
> -        if (SubStatus <= AE_CODE_TBL_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_AML:
> -
> -        if (SubStatus <= AE_CODE_AML_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Aml [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_CONTROL:
> +        return;
> +    }
>
> -        if (SubStatus <= AE_CODE_CTRL_MAX)
> +    while (*Pathname)
> +    {
> +        if (*Pathname == '\\')
>           {
> -            Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus];
> +            *Pathname = '/';
>           }
> -        break;
>
> -    default:
> -        break;
> +        Pathname++;
>       }
> -
> -    return (ACPI_CAST_PTR (const char, Exception));
>   }
> +#endif
>
>
>   /*******************************************************************************
> @@ -1367,5 +1324,3 @@ AcpiUtWalkPackageTree (
>
>       return_ACPI_STATUS (AE_AML_INTERNAL);
>   }
> -
> -
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index ade2980..4914159 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -438,7 +438,7 @@ AcpiUtCreateStringObject (
>    *
>    * RETURN:      TRUE if object is valid, FALSE otherwise
>    *
> - * DESCRIPTION: Validate a pointer to be an ACPI_OPERAND_OBJECT
> + * DESCRIPTION: Validate a pointer to be of type ACPI_OPERAND_OBJECT
>    *
>    ******************************************************************************/
>
> @@ -464,7 +464,7 @@ AcpiUtValidInternalObject (
>       {
>       case ACPI_DESC_TYPE_OPERAND:
>
> -        /* The object appears to be a valid ACPI_OPERAND_OBJECT  */
> +        /* The object appears to be a valid ACPI_OPERAND_OBJECT */
>
>           return (TRUE);
>
> @@ -545,7 +545,7 @@ AcpiUtDeleteObjectDesc (
>       ACPI_FUNCTION_TRACE_PTR (UtDeleteObjectDesc, Object);
>
>
> -    /* Object must be an ACPI_OPERAND_OBJECT  */
> +    /* Object must be of type ACPI_OPERAND_OBJECT */
>
>       if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
>       {
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index 69df740..3835b47 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -1,6 +1,6 @@
>   /*******************************************************************************
>    *
> - * Module Name: utresrc - Resource managment utilities
> + * Module Name: utresrc - Resource management utilities
>    *
>    ******************************************************************************/
>
> @@ -129,7 +129,7 @@
>
>   /*
>    * Strings used to decode resource descriptors.
> - * Used by both the disasssembler and the debugger resource dump routines
> + * Used by both the disassembler and the debugger resource dump routines
>    */
>   const char                      *AcpiGbl_BmDecode[] =
>   {
> diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
> index 7f2311a..3d73fc5 100644
> --- a/src/acpica/source/components/utilities/uttrack.c
> +++ b/src/acpica/source/components/utilities/uttrack.c
> @@ -705,21 +705,21 @@ AcpiUtDumpAllocations (
>                       switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor))
>                       {
>                       case ACPI_DESC_TYPE_OPERAND:
> -                        if (Element->Size == sizeof (ACPI_DESC_TYPE_OPERAND))
> +                        if (Element->Size == sizeof (ACPI_OPERAND_OBJECT))
>                           {
>                               DescriptorType = ACPI_DESC_TYPE_OPERAND;
>                           }
>                           break;
>
>                       case ACPI_DESC_TYPE_PARSER:
> -                        if (Element->Size == sizeof (ACPI_DESC_TYPE_PARSER))
> +                        if (Element->Size == sizeof (ACPI_PARSE_OBJECT))
>                           {
>                               DescriptorType = ACPI_DESC_TYPE_PARSER;
>                           }
>                           break;
>
>                       case ACPI_DESC_TYPE_NAMED:
> -                        if (Element->Size == sizeof (ACPI_DESC_TYPE_NAMED))
> +                        if (Element->Size == sizeof (ACPI_NAMESPACE_NODE))
>                           {
>                               DescriptorType = ACPI_DESC_TYPE_NAMED;
>                           }
> diff --git a/src/acpica/source/components/utilities/utxferror.c b/src/acpica/source/components/utilities/utxferror.c
> index 8a98a89..c0961a2 100644
> --- a/src/acpica/source/components/utilities/utxferror.c
> +++ b/src/acpica/source/components/utilities/utxferror.c
> @@ -159,6 +159,9 @@ extern FILE                 *AcpiGbl_OutputFile;
>   #define ACPI_MSG_WARNING        "ACPI Warning: "
>   #define ACPI_MSG_INFO           "ACPI: "
>
> +#define ACPI_MSG_BIOS_ERROR     "ACPI Firmware Error: "
> +#define ACPI_MSG_BIOS_WARNING   "ACPI Firmware Warning: "
> +
>   /*
>    * Common message suffix
>    */
> @@ -324,6 +327,84 @@ AcpiInfo (
>   ACPI_EXPORT_SYMBOL (AcpiInfo)
>
>
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiBiosError
> + *
> + * PARAMETERS:  ModuleName          - Caller's module name (for error output)
> + *              LineNumber          - Caller's line number (for error output)
> + *              Format              - Printf format string + additional args
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Print "ACPI Firmware Error" message with module/line/version
> + *              info
> + *
> + ******************************************************************************/
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosError (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...)
> +{
> +    va_list                 ArgList;
> +
> +
> +    ACPI_MSG_REDIRECT_BEGIN;
> +    AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
> +
> +    va_start (ArgList, Format);
> +    AcpiOsVprintf (Format, ArgList);
> +    ACPI_MSG_SUFFIX;
> +    va_end (ArgList);
> +
> +    ACPI_MSG_REDIRECT_END;
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiBiosError)
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiBiosWarning
> + *
> + * PARAMETERS:  ModuleName          - Caller's module name (for error output)
> + *              LineNumber          - Caller's line number (for error output)
> + *              Format              - Printf format string + additional args
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Print "ACPI Firmware Warning" message with module/line/version
> + *              info
> + *
> + ******************************************************************************/
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosWarning (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...)
> +{
> +    va_list                 ArgList;
> +
> +
> +    ACPI_MSG_REDIRECT_BEGIN;
> +    AcpiOsPrintf (ACPI_MSG_BIOS_WARNING);
> +
> +    va_start (ArgList, Format);
> +    AcpiOsVprintf (Format, ArgList);
> +    ACPI_MSG_SUFFIX;
> +    va_end (ArgList);
> +
> +    ACPI_MSG_REDIRECT_END;
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiBiosWarning)
> +
> +
>   /*
>    * The remainder of this module contains internal error functions that may
>    * be configured out.
> diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h
> index 4a9ecf0..45cfb26 100644
> --- a/src/acpica/source/include/acdebug.h
> +++ b/src/acpica/source/include/acdebug.h
> @@ -184,8 +184,7 @@ AcpiDbDisplayTemplate (
>
>   void
>   AcpiDbUnloadAcpiTable (
> -    char                    *TableArg,
> -    char                    *InstanceArg);
> +    char                    *Name);
>
>   void
>   AcpiDbSendNotify (
> @@ -477,7 +476,7 @@ AcpiDbLocalNsLookup (
>       char                    *Name);
>
>   void
> -AcpiDbUInt32ToHexString (
> +AcpiDbUint32ToHexString (
>       UINT32                  Value,
>       char                    *Buffer);
>
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 9e8f2e3..056e8ea 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -591,6 +591,14 @@ AcpiDmMethodFlags (
>       ACPI_PARSE_OBJECT       *Op);
>
>   void
> +AcpiDmPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op);
> +
> +void
> +AcpiDmFieldPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op);
> +
> +void
>   AcpiDmFieldFlags (
>       ACPI_PARSE_OBJECT       *Op);
>
> diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index 7129954..ccc6f71 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/source/include/acexcep.h
> @@ -125,6 +125,7 @@
>   #define AE_CODE_ACPI_TABLES             0x2000
>   #define AE_CODE_AML                     0x3000
>   #define AE_CODE_CONTROL                 0x4000
> +#define AE_CODE_MAX                     0x4000
>   #define AE_CODE_MASK                    0xF000
>
>
> @@ -260,7 +261,7 @@
>
>   /* Exception strings for AcpiFormatException */
>
> -#ifdef DEFINE_ACPI_GLOBALS
> +#ifdef ACPI_DEFINE_EXCEPTION_TABLE
>
>   /*
>    * String versions of the exception codes above
> @@ -379,6 +380,6 @@ char const   *AcpiGbl_ExceptionNames_Ctrl[] =
>       "AE_CTRL_PARSE_PENDING"
>   };
>
> -#endif /* ACPI GLOBALS */
> +#endif /* EXCEPTION_TABLE */
>
>   #endif /* __ACEXCEP_H__ */
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index b27ee3a..b96b658 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -326,8 +326,7 @@ ACPI_EXTERN ACPI_CACHE_T               *AcpiGbl_OperandCache;
>
>   /* Global handlers */
>
> -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  AcpiGbl_DeviceNotify;
> -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  AcpiGbl_SystemNotify;
> +ACPI_EXTERN ACPI_GLOBAL_NOTIFY_HANDLER  AcpiGbl_GlobalNotify[2];
>   ACPI_EXTERN ACPI_EXCEPTION_HANDLER      AcpiGbl_ExceptionHandler;
>   ACPI_EXTERN ACPI_INIT_HANDLER           AcpiGbl_InitHandler;
>   ACPI_EXTERN ACPI_TABLE_HANDLER          AcpiGbl_TableHandler;
> @@ -360,17 +359,8 @@ ACPI_EXTERN UINT8                       AcpiGbl_OsiData;
>   ACPI_EXTERN ACPI_INTERFACE_INFO        *AcpiGbl_SupportedInterfaces;
>   ACPI_EXTERN ACPI_ADDRESS_RANGE         *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
>
> -
>   #ifndef DEFINE_ACPI_GLOBALS
>
> -/* Exception codes */
> -
> -extern char const                       *AcpiGbl_ExceptionNames_Env[];
> -extern char const                       *AcpiGbl_ExceptionNames_Pgm[];
> -extern char const                       *AcpiGbl_ExceptionNames_Tbl[];
> -extern char const                       *AcpiGbl_ExceptionNames_Aml[];
> -extern char const                       *AcpiGbl_ExceptionNames_Ctrl[];
> -
>   /* Other miscellaneous */
>
>   extern BOOLEAN                          AcpiGbl_Shutdown;
> @@ -552,4 +542,14 @@ ACPI_EXTERN UINT32                      AcpiGbl_SizeOfAcpiObjects;
>
>   #endif /* ACPI_DEBUGGER */
>
> +
> +/*****************************************************************************
> + *
> + * Info/help support
> + *
> + ****************************************************************************/
> +
> +extern const AH_PREDEFINED_NAME     AslPredefinedInfo[];
> +
> +
>   #endif /* __ACGLOBAL_H__ */
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index f9065af..00d933e 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -534,6 +534,15 @@ typedef struct acpi_gpe_handler_info
>
>   } ACPI_GPE_HANDLER_INFO;
>
> +/* Notify info for implicit notify, multiple device objects */
> +
> +typedef struct acpi_gpe_notify_info
> +{
> +    ACPI_NAMESPACE_NODE             *DeviceNode;    /* Device to be notified */
> +    struct acpi_gpe_notify_info     *Next;
> +
> +} ACPI_GPE_NOTIFY_INFO;
> +
>   /*
>    * GPE dispatch info. At any time, the GPE can have at most one type
>    * of dispatch - Method, Handler, or Implicit Notify.
> @@ -541,8 +550,8 @@ typedef struct acpi_gpe_handler_info
>   typedef union acpi_gpe_dispatch_info
>   {
>       ACPI_NAMESPACE_NODE             *MethodNode;    /* Method node for this GPE level */
> -    struct acpi_gpe_handler_info    *Handler;       /* Installed GPE handler */
> -    ACPI_NAMESPACE_NODE             *DeviceNode;    /* Parent _PRW device for implicit notify */
> +    ACPI_GPE_HANDLER_INFO           *Handler;       /* Installed GPE handler */
> +    ACPI_GPE_NOTIFY_INFO            *NotifyList;    /* List of _PRW devices for implicit notifies */
>
>   } ACPI_GPE_DISPATCH_INFO;
>
> @@ -552,7 +561,7 @@ typedef union acpi_gpe_dispatch_info
>    */
>   typedef struct acpi_gpe_event_info
>   {
> -    union acpi_gpe_dispatch_info    Dispatch;       /* Either Method or Handler */
> +    union acpi_gpe_dispatch_info    Dispatch;       /* Either Method, Handler, or NotifyList */
>       struct acpi_gpe_register_info   *RegisterInfo;  /* Backpointer to register info */
>       UINT8                           Flags;          /* Misc info about this GPE */
>       UINT8                           GpeNumber;      /* This GPE */
> @@ -788,6 +797,15 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
>       struct acpi_walk_state          *WalkState);
>
>
> +/* Global handlers for AML Notifies */
> +
> +typedef struct acpi_global_notify_handler
> +{
> +    ACPI_NOTIFY_HANDLER             Handler;
> +    void                            *Context;
> +
> +} ACPI_GLOBAL_NOTIFY_HANDLER;
> +
>   /*
>    * Notify info - used to pass info to the deferred notify
>    * handler/dispatcher.
> @@ -795,8 +813,10 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
>   typedef struct acpi_notify_info
>   {
>       ACPI_STATE_COMMON
> +    UINT8                           HandlerListId;
>       ACPI_NAMESPACE_NODE             *Node;
> -    union acpi_operand_object       *HandlerObj;
> +    union acpi_operand_object       *HandlerListHead;
> +    ACPI_GLOBAL_NOTIFY_HANDLER      *Global;
>
>   } ACPI_NOTIFY_INFO;
>
> @@ -1021,6 +1041,7 @@ typedef struct acpi_parse_state
>   #define ACPI_PARSEOP_IGNORE             0x01
>   #define ACPI_PARSEOP_PARAMLIST          0x02
>   #define ACPI_PARSEOP_EMPTY_TERMLIST     0x04
> +#define ACPI_PARSEOP_PREDEF_CHECKED     0x08
>   #define ACPI_PARSEOP_SPECIAL            0x10
>
>
> @@ -1372,4 +1393,20 @@ typedef struct acpi_debug_mem_block
>   #define ACPI_NUM_MEM_LISTS              2
>
>
> +/*****************************************************************************
> + *
> + * Info/help support
> + *
> + ****************************************************************************/
> +
> +typedef struct ah_predefined_name
> +{
> +    char            *Name;
> +    char            *Description;
> +#ifndef ACPI_ASL_COMPILER
> +    char            *Action;
> +#endif
> +
> +} AH_PREDEFINED_NAME;
> +
>   #endif /* __ACLOCAL_H__ */
> diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
> index 5451d84..3cf0ac0 100644
> --- a/src/acpica/source/include/acmacros.h
> +++ b/src/acpica/source/include/acmacros.h
> @@ -346,8 +346,8 @@
>   #define ACPI_INSERT_BITS(Target, Mask, Source)          Target = ((Target & (~(Mask))) | (Source & Mask))
>
>   /*
> - * An ACPI_NAMESPACE_NODE can appear in some contexts
> - * where a pointer to an ACPI_OPERAND_OBJECT can also
> + * An object of type ACPI_NAMESPACE_NODE can appear in some contexts
> + * where a pointer to an object of type ACPI_OPERAND_OBJECT can also
>    * appear. This macro is used to distinguish them.
>    *
>    * The "Descriptor" field is the first field in both structures.
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index 009232a..9014d4f 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -166,7 +166,7 @@
>
>   #define AOPOBJ_AML_CONSTANT         0x01    /* Integer is an AML constant */
>   #define AOPOBJ_STATIC_POINTER       0x02    /* Data is part of an ACPI table, don't delete */
> -#define AOPOBJ_DATA_VALID           0x04    /* Object is intialized and data is valid */
> +#define AOPOBJ_DATA_VALID           0x04    /* Object is initialized and data is valid */
>   #define AOPOBJ_OBJECT_INITIALIZED   0x08    /* Region is initialized, _REG was run */
>   #define AOPOBJ_SETUP_COMPLETE       0x10    /* Region setup is complete */
>   #define AOPOBJ_INVALID              0x20    /* Host OS won't allow a Region address */
> @@ -195,8 +195,8 @@ typedef struct acpi_object_integer
>
>
>   /*
> - * Note: The String and Buffer object must be identical through the Pointer
> - * and length elements.  There is code that depends on this.
> + * Note: The String and Buffer object must be identical through the
> + * pointer and length elements. There is code that depends on this.
>    *
>    * Fields common to both Strings and Buffers
>    */
> @@ -318,8 +318,7 @@ typedef struct acpi_object_method
>    * Common fields for objects that support ASL notifications
>    */
>   #define ACPI_COMMON_NOTIFY_INFO \
> -    union acpi_operand_object       *SystemNotify;      /* Handler for system notifies */\
> -    union acpi_operand_object       *DeviceNotify;      /* Handler for driver notifies */\
> +    union acpi_operand_object       *NotifyList[2];     /* Handlers for system/device notifies */\
>       union acpi_operand_object       *Handler;           /* Handler for Address space */
>
>
> @@ -461,8 +460,10 @@ typedef struct acpi_object_notify_handler
>   {
>       ACPI_OBJECT_COMMON_HEADER
>       ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
> -    ACPI_NOTIFY_HANDLER             Handler;
> +    UINT32                          HandlerType;        /* Type: Device/System/Both */
> +    ACPI_NOTIFY_HANDLER             Handler;            /* Handler address */
>       void                            *Context;
> +    union acpi_operand_object       *Next[2];           /* Device and System handler lists */
>
>   } ACPI_OBJECT_NOTIFY_HANDLER;
>
> @@ -476,7 +477,7 @@ typedef struct acpi_object_addr_handler
>       ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
>       void                            *Context;
>       ACPI_ADR_SPACE_SETUP            Setup;
> -    union acpi_operand_object       *RegionList;        /* regions using this handler */
> +    union acpi_operand_object       *RegionList;        /* Regions using this handler */
>       union acpi_operand_object       *Next;
>
>   } ACPI_OBJECT_ADDR_HANDLER;
> diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
> index 12f7851..cbdbd8f 100644
> --- a/src/acpica/source/include/acoutput.h
> +++ b/src/acpica/source/include/acoutput.h
> @@ -289,6 +289,8 @@
>   #define ACPI_WARNING(plist)             AcpiWarning plist
>   #define ACPI_EXCEPTION(plist)           AcpiException plist
>   #define ACPI_ERROR(plist)               AcpiError plist
> +#define ACPI_BIOS_WARNING(plist)        AcpiBiosWarning plist
> +#define ACPI_BIOS_ERROR(plist)          AcpiBiosError plist
>   #define ACPI_DEBUG_OBJECT(obj,l,i)      AcpiExDoDebugObject(obj,l,i)
>
>   #else
> @@ -299,6 +301,8 @@
>   #define ACPI_WARNING(plist)
>   #define ACPI_EXCEPTION(plist)
>   #define ACPI_ERROR(plist)
> +#define ACPI_BIOS_WARNING(plist)
> +#define ACPI_BIOS_ERROR(plist)
>   #define ACPI_DEBUG_OBJECT(obj,l,i)
>
>   #endif /* ACPI_NO_ERROR_MESSAGES */
> diff --git a/src/acpica/source/include/acpiosxf.h b/src/acpica/source/include/acpiosxf.h
> index d6d205f..48d8aa4 100644
> --- a/src/acpica/source/include/acpiosxf.h
> +++ b/src/acpica/source/include/acpiosxf.h
> @@ -348,7 +348,7 @@ AcpiOsExecute (
>
>   void
>   AcpiOsWaitEventsComplete (
> -    void                    *Context);
> +    void);
>
>   void
>   AcpiOsSleep (
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 2d4a5f8..036d817 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -120,7 +120,7 @@
>
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION                 0x20120320
> +#define ACPI_CA_VERSION                 0x20120711
>
>   #include "acconfig.h"
>   #include "actypes.h"
> @@ -273,6 +273,22 @@ AcpiFree (
>
>
>   /*
> + * ACPI table load/unload interfaces
> + */
> +ACPI_STATUS
> +AcpiLoadTable (
> +    ACPI_TABLE_HEADER       *Table);
> +
> +ACPI_STATUS
> +AcpiUnloadParentTable (
> +    ACPI_HANDLE             Object);
> +
> +ACPI_STATUS
> +AcpiLoadTables (
> +    void);
> +
> +
> +/*
>    * ACPI table manipulation interfaces
>    */
>   ACPI_STATUS
> @@ -284,10 +300,6 @@ AcpiFindRootPointer (
>       ACPI_SIZE               *RsdpAddress);
>
>   ACPI_STATUS
> -AcpiLoadTables (
> -    void);
> -
> -ACPI_STATUS
>   AcpiGetTableHeader (
>       ACPI_STRING             Signature,
>       UINT32                  Instance,
> @@ -829,6 +841,20 @@ AcpiInfo (
>       const char              *Format,
>       ...) ACPI_PRINTF_LIKE(3);
>
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosError (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...) ACPI_PRINTF_LIKE(3);
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosWarning (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...) ACPI_PRINTF_LIKE(3);
> +
>
>   /*
>    * Debug output
> diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
> index 82a1cb3..8da4836 100644
> --- a/src/acpica/source/include/acpredef.h
> +++ b/src/acpica/source/include/acpredef.h
> @@ -584,14 +584,14 @@ static const ACPI_PREDEFINED_INFO     PredefinedNames[] =
>       {{"_TMP", 0, ACPI_RTYPE_INTEGER}},
>       {{"_TPC", 0, ACPI_RTYPE_INTEGER}},
>       {{"_TPT", 1, 0}},
> -    {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2Ref/6Int */
> +    {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2 Ref/6 Int */
>                       {{{ACPI_PTYPE2, ACPI_RTYPE_REFERENCE, 2, ACPI_RTYPE_INTEGER}, 6, 0}},
>
> -    {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int with count */
> +    {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int with count */
>                       {{{ACPI_PTYPE2_COUNT,ACPI_RTYPE_INTEGER, 5,0}, 0,0}},
>
>       {{"_TSP", 0, ACPI_RTYPE_INTEGER}},
> -    {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int */
> +    {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int */
>                       {{{ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 5,0}, 0,0}},
>
>       {{"_TST", 0, ACPI_RTYPE_INTEGER}},
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 6e6edcc..c046b05 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -202,7 +202,7 @@ typedef struct acpi_table_bert
>   {
>       ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
>       UINT32                  RegionLength;       /* Length of the boot error region */
> -    UINT64                  Address;            /* Physical addresss of the error region */
> +    UINT64                  Address;            /* Physical address of the error region */
>
>   } ACPI_TABLE_BERT;
>
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index ff90c38..5d01e32 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -780,10 +780,14 @@ typedef UINT32                          ACPI_EVENT_STATUS;
>   #define ACPI_DEVICE_NOTIFY              0x2
>   #define ACPI_ALL_NOTIFY                 (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY)
>   #define ACPI_MAX_NOTIFY_HANDLER_TYPE    0x3
> +#define ACPI_NUM_NOTIFY_TYPES           2
>
>   #define ACPI_MAX_SYS_NOTIFY             0x7F
>   #define ACPI_MAX_DEVICE_SPECIFIC_NOTIFY 0xBF
>
> +#define ACPI_SYSTEM_HANDLER_LIST        0 /* Used as index, must be SYSTEM_NOTIFY -1 */
> +#define ACPI_DEVICE_HANDLER_LIST        1 /* Used as index, must be DEVICE_NOTIFY -1 */
> +
>
>   /* Address Space (Operation Region) Types */
>
> @@ -799,8 +803,9 @@ typedef UINT8                           ACPI_ADR_SPACE_TYPE;
>   #define ACPI_ADR_SPACE_IPMI             (ACPI_ADR_SPACE_TYPE) 7
>   #define ACPI_ADR_SPACE_GPIO             (ACPI_ADR_SPACE_TYPE) 8
>   #define ACPI_ADR_SPACE_GSBUS            (ACPI_ADR_SPACE_TYPE) 9
> +#define ACPI_ADR_SPACE_PLATFORM_COMM    (ACPI_ADR_SPACE_TYPE) 10
>
> -#define ACPI_NUM_PREDEFINED_REGIONS     10
> +#define ACPI_NUM_PREDEFINED_REGIONS     11
>
>   /*
>    * Special Address Spaces
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 5c21320..50b5b99 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -501,7 +501,7 @@ AcpiUtDumpBuffer (
>       UINT8                   *Buffer,
>       UINT32                  Count,
>       UINT32                  Display,
> -    UINT32                  componentId);
> +    UINT32                  ComponentId);
>
>   void
>   AcpiUtDumpBuffer2 (
> @@ -775,6 +775,10 @@ AcpiUtShortDivide (
>   /*
>    * utmisc
>    */
> +void
> +UtConvertBackslashes (
> +    char                    *Pathname);
> +
>   const char *
>   AcpiUtValidateException (
>       ACPI_STATUS             Status);
> diff --git a/src/acpica/source/include/platform/acenv.h b/src/acpica/source/include/platform/acenv.h
> index 342615f..1f3596a 100644
> --- a/src/acpica/source/include/platform/acenv.h
> +++ b/src/acpica/source/include/platform/acenv.h
> @@ -180,9 +180,9 @@
>   #endif
>
>   #ifdef ACPI_HELP_APP
> -#define ACPI_DEBUG_OUTPUT
>   #define ACPI_APPLICATION
>   #define ACPI_SINGLE_THREADED
> +#define ACPI_NO_ERROR_MESSAGES
>   #endif
>
>   /* Linkable ACPICA library */
> @@ -252,6 +252,9 @@
>   #elif defined(_AED_EFI)
>   #include "acefi.h"
>
> +#elif defined(__HAIKU__)
> +#include "achaiku.h"
> +
>   #else
>
>   /* Unknown environment */
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index d5e3af9..840328b 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -425,7 +425,7 @@ AcpiOsGetLine (
>       UINT32                  BufferLength,
>       UINT32                  *BytesRead)
>   {
> -    UINT8                   Temp;
> +    int                     Temp;
>       UINT32                  i;
>
>
> @@ -436,13 +436,17 @@ AcpiOsGetLine (
>               return (AE_BUFFER_OVERFLOW);
>           }
>
> -        scanf ("%1c", &Temp);
> +        if ((Temp = getchar ()) == EOF)
> +        {
> +            return (AE_ERROR);
> +        }
> +
>           if (!Temp || Temp == '\n')
>           {
>               break;
>           }
>
> -        Buffer [i] = Temp;
> +        Buffer [i] = (char) Temp;
>       }
>
>       /* Null terminate the buffer */
> @@ -1313,3 +1317,24 @@ AcpiOsExecute (
>   }
>
>   #endif /* ACPI_SINGLE_THREADED */
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiOsWaitEventsComplete
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Wait for all asynchronous events to complete. This
> + *              implementation does nothing.
> + *
> + *****************************************************************************/
> +
> +void
> +AcpiOsWaitEventsComplete (
> +    void)
> +{
> +    return;
> +}
> diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
> index 01615b1..0f5f789 100644
> --- a/src/acpica/source/tools/acpiexec/aecommon.h
> +++ b/src/acpica/source/tools/acpiexec/aecommon.h
> @@ -140,6 +140,7 @@ extern BOOLEAN              AcpiGbl_IgnoreErrors;
>   extern UINT8                AcpiGbl_RegionFillValue;
>   extern UINT8                AcpiGbl_UseHwReducedFadt;
>   extern BOOLEAN              AcpiGbl_DisplayRegionAccess;
> +extern BOOLEAN              AcpiGbl_DoInterfaceTests;
>
>   /* Check for unexpected exceptions */
>
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index ccf6966..ba7e5a1 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -121,12 +121,24 @@
>   /* Local prototypes */
>
>   static void
> -AeNotifyHandler (
> +AeNotifyHandler1 (
>       ACPI_HANDLE             Device,
>       UINT32                  Value,
>       void                    *Context);
>
>   static void
> +AeNotifyHandler2 (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    void                    *Context);
> +
> +static void
> +AeCommonNotifyHandler (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    UINT32                  HandlerId);
> +
> +static void
>   AeDeviceNotifyHandler (
>       ACPI_HANDLE             Device,
>       UINT32                  Value,
> @@ -258,24 +270,51 @@ AeCtrlCHandler (
>
>   /******************************************************************************
>    *
> - * FUNCTION:    AeNotifyHandler
> + * FUNCTION:    AeNotifyHandler(s)
>    *
>    * PARAMETERS:  Standard notify handler parameters
>    *
>    * RETURN:      Status
>    *
> - * DESCRIPTION: System notify handler for AcpiExec utility.  Used by the ASL
> + * DESCRIPTION: Notify handlers for AcpiExec utility. Used by the ASL
>    *              test suite(s) to communicate errors and other information to
> - *              this utility via the Notify() operator.
> + *              this utility via the Notify() operator. Tests notify handling
> + *              and multiple notify handler support.
>    *
>    *****************************************************************************/
>
>   static void
> -AeNotifyHandler (
> -    ACPI_HANDLE                 Device,
> -    UINT32                      Value,
> -    void                        *Context)
> +AeNotifyHandler1 (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    void                    *Context)
> +{
> +    AeCommonNotifyHandler (Device, Value, 1);
> +}
> +
> +static void
> +AeNotifyHandler2 (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    void                    *Context)
>   {
> +    AeCommonNotifyHandler (Device, Value, 2);
> +}
> +
> +static void
> +AeCommonNotifyHandler (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    UINT32                  HandlerId)
> +{
> +    char                    *Type;
> +
> +
> +    Type = "Device";
> +    if (Value <= ACPI_MAX_SYS_NOTIFY)
> +    {
> +        Type = "System";
> +    }
>
>       switch (Value)
>       {
> @@ -309,12 +348,13 @@ AeNotifyHandler (
>   #endif
>
>       default:
> -        printf ("[AcpiExec] Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> -            AcpiUtGetNodeName (Device), Device, Value,
> +        printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +            HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
>               AcpiUtGetNotifyName (Value));
>           if (AcpiGbl_DebugFile)
>           {
> -            AcpiOsPrintf ("[AcpiExec] Received a system notify, Value 0x%2.2X\n", Value);
> +            AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
> +                HandlerId, Type, Value);
>           }
>
>           (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -325,6 +365,39 @@ AeNotifyHandler (
>
>   /******************************************************************************
>    *
> + * FUNCTION:    AeSystemNotifyHandler
> + *
> + * PARAMETERS:  Standard notify handler parameters
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: System notify handler for AcpiExec utility.  Used by the ASL
> + *              test suite(s) to communicate errors and other information to
> + *              this utility via the Notify() operator.
> + *
> + *****************************************************************************/
> +
> +static void
> +AeSystemNotifyHandler (
> +    ACPI_HANDLE                 Device,
> +    UINT32                      Value,
> +    void                        *Context)
> +{
> +
> +    printf ("[AcpiExec] Global:    Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +        AcpiUtGetNodeName (Device), Device, Value,
> +        AcpiUtGetNotifyName (Value));
> +    if (AcpiGbl_DebugFile)
> +    {
> +        AcpiOsPrintf ("[AcpiExec] Global:    Received a System Notify, Value 0x%2.2X\n", Value);
> +    }
> +
> +    (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> +}
> +
> +
> +/******************************************************************************
> + *
>    * FUNCTION:    AeDeviceNotifyHandler
>    *
>    * PARAMETERS:  Standard notify handler parameters
> @@ -344,12 +417,12 @@ AeDeviceNotifyHandler (
>       void                        *Context)
>   {
>
> -    printf ("[AcpiExec] Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +    printf ("[AcpiExec] Global:    Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
>           AcpiUtGetNodeName (Device), Device, Value,
>           AcpiUtGetNotifyName (Value));
>       if (AcpiGbl_DebugFile)
>       {
> -        AcpiOsPrintf ("[AcpiExec] Received a device notify, Value 0x%2.2X\n", Value);
> +        AcpiOsPrintf ("[AcpiExec] Global:    Received a Device Notify, Value 0x%2.2X\n", Value);
>       }
>
>       (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -759,18 +832,18 @@ AeInstallEarlyHandlers (
>               AcpiFormatException (Status));
>       }
>
> -    /* Install global notify handler */
> +    /* Install global notify handlers */
>
>       Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
> -                                        AeNotifyHandler, NULL);
> +        AeSystemNotifyHandler, NULL);
>       if (ACPI_FAILURE (Status))
>       {
> -        printf ("Could not install a global notify handler, %s\n",
> +        printf ("Could not install a global system notify handler, %s\n",
>               AcpiFormatException (Status));
>       }
>
>       Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
> -                                        AeDeviceNotifyHandler, NULL);
> +        AeDeviceNotifyHandler, NULL);
>       if (ACPI_FAILURE (Status))
>       {
>           printf ("Could not install a global notify handler, %s\n",
> @@ -781,7 +854,7 @@ AeInstallEarlyHandlers (
>       if (ACPI_SUCCESS (Status))
>       {
>           Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> -                                            AeNotifyHandler, NULL);
> +            AeNotifyHandler1, NULL);
>           if (ACPI_FAILURE (Status))
>           {
>               printf ("Could not install a notify handler, %s\n",
> @@ -789,7 +862,7 @@ AeInstallEarlyHandlers (
>           }
>
>           Status = AcpiRemoveNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> -                                            AeNotifyHandler);
> +            AeNotifyHandler1);
>           if (ACPI_FAILURE (Status))
>           {
>               printf ("Could not remove a notify handler, %s\n",
> @@ -797,20 +870,35 @@ AeInstallEarlyHandlers (
>           }
>
>           Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> -                                            AeNotifyHandler, NULL);
> +            AeNotifyHandler1, NULL);
>           AE_CHECK_OK (AcpiInstallNotifyHandler, Status);
>
>           Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> -                                            AeNotifyHandler);
> +            AeNotifyHandler1);
>           AE_CHECK_OK (AcpiRemoveNotifyHandler, Status);
>
> +#if 0
>           Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> -                                            AeNotifyHandler, NULL);
> +            AeNotifyHandler1, NULL);
>           if (ACPI_FAILURE (Status))
>           {
>               printf ("Could not install a notify handler, %s\n",
>                   AcpiFormatException (Status));
>           }
> +#endif
> +
> +        /* Install two handlers for _SB_ */
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> +        /* Attempt duplicate handler installation, should fail */
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x77777777));
>
>           Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
>           AE_CHECK_OK (AcpiAttachData, Status);
> @@ -827,6 +915,37 @@ AeInstallEarlyHandlers (
>       }
>
>
> +    Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> +        Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1);
> +        Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler2);
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +    }
> +
> +    Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +    }
> +
>       /*
>        * Install handlers that will override the default handlers for some of
>        * the space IDs.
>
Acked-by: Ivan Hu<ivan.hu@canonical.com>
Keng-Yu Lin - July 23, 2012, 5:39 a.m.
On Wed, Jul 18, 2012 at 7:52 AM, Colin King <colin.king@canonical.com> wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Update to ACPICA version 20120711, commit
> b9058029d3bd6216f594a3b5e70b2f6cba1052ad to get the latest
> goodness.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/acpica/Makefile.am                             |    2 +
>  src/acpica/source/common/adfile.c                  |   19 +-
>  src/acpica/source/common/adwalk.c                  |   30 +-
>  src/acpica/source/common/dmextern.c                |   36 +-
>  src/acpica/source/common/dmrestag.c                |   21 +-
>  src/acpica/source/compiler/Makefile.am             |    1 +
>  src/acpica/source/compiler/aslcompile.c            |  121 ++++---
>  src/acpica/source/compiler/aslcompiler.h           |    9 +-
>  src/acpica/source/compiler/aslcompiler.l           |    1 +
>  src/acpica/source/compiler/aslcompiler.y           |    4 +-
>  src/acpica/source/compiler/aslerror.c              |   23 +-
>  src/acpica/source/compiler/aslfiles.c              |  126 ++++++-
>  src/acpica/source/compiler/asllookup.c             |    2 +-
>  src/acpica/source/compiler/aslmain.c               |   66 ++--
>  src/acpica/source/compiler/aslmap.c                |    1 +
>  src/acpica/source/compiler/aslmessages.h           |   11 +-
>  src/acpica/source/compiler/aslstartup.c            |    2 +-
>  src/acpica/source/compiler/aslsupport.l            |   52 ++-
>  src/acpica/source/compiler/aslutils.c              |   90 ++---
>  src/acpica/source/compiler/dtio.c                  |   45 ++-
>  src/acpica/source/compiler/dttemplate.c            |    2 +-
>  src/acpica/source/compiler/prscan.c                |    2 +-
>  src/acpica/source/compiler/prutils.c               |   15 +-
>  src/acpica/source/components/debugger/dbcmds.c     |  120 ++++---
>  src/acpica/source/components/debugger/dbdisply.c   |   15 +-
>  src/acpica/source/components/debugger/dbexec.c     |    6 +-
>  src/acpica/source/components/debugger/dbfileio.c   |   13 +
>  src/acpica/source/components/debugger/dbinput.c    |    4 +-
>  src/acpica/source/components/debugger/dbstats.c    |   28 +-
>  src/acpica/source/components/debugger/dbutils.c    |    4 +-
>  .../source/components/disassembler/dmopcode.c      |  213 ++++++++++++
>  src/acpica/source/components/disassembler/dmwalk.c |   55 +++-
>  src/acpica/source/components/dispatcher/dsfield.c  |   88 ++++-
>  src/acpica/source/components/dispatcher/dsopcode.c |   14 +-
>  src/acpica/source/components/dispatcher/dswload.c  |   14 +
>  src/acpica/source/components/dispatcher/dswload2.c |   14 +
>  src/acpica/source/components/events/evgpe.c        |   15 +-
>  src/acpica/source/components/events/evgpeutil.c    |   19 ++
>  src/acpica/source/components/events/evmisc.c       |  183 ++++-------
>  src/acpica/source/components/events/evxface.c      |  344 ++++++++++----------
>  src/acpica/source/components/events/evxfgpe.c      |   86 ++++-
>  src/acpica/source/components/executer/exconfig.c   |    2 +-
>  src/acpica/source/components/executer/exdump.c     |   24 +-
>  src/acpica/source/components/executer/exprep.c     |    4 +-
>  src/acpica/source/components/executer/exresolv.c   |    2 +-
>  src/acpica/source/components/executer/exstore.c    |    6 +-
>  src/acpica/source/components/executer/exutils.c    |    2 +-
>  src/acpica/source/components/hardware/hwsleep.c    |   25 --
>  src/acpica/source/components/hardware/hwxfsleep.c  |    8 +
>  src/acpica/source/components/namespace/nspredef.c  |    2 +-
>  src/acpica/source/components/parser/psxface.c      |    4 +-
>  src/acpica/source/components/resources/rscreate.c  |    6 +-
>  src/acpica/source/components/resources/rsutils.c   |    2 +-
>  src/acpica/source/components/tables/tbfadt.c       |   64 ++--
>  src/acpica/source/components/tables/tbinstal.c     |    5 +-
>  src/acpica/source/components/tables/tbutils.c      |   17 +-
>  src/acpica/source/components/tables/tbxface.c      |  159 +--------
>  src/acpica/source/components/tables/tbxfroot.c     |    2 +-
>  src/acpica/source/components/utilities/utdecode.c  |   62 +---
>  src/acpica/source/components/utilities/utdelete.c  |   21 +-
>  src/acpica/source/components/utilities/utglobal.c  |    9 +-
>  src/acpica/source/components/utilities/utmisc.c    |   81 +----
>  src/acpica/source/components/utilities/utobject.c  |    6 +-
>  src/acpica/source/components/utilities/utresrc.c   |    4 +-
>  src/acpica/source/components/utilities/uttrack.c   |    6 +-
>  src/acpica/source/components/utilities/utxferror.c |   81 +++++
>  src/acpica/source/include/acdebug.h                |    5 +-
>  src/acpica/source/include/acdisasm.h               |    8 +
>  src/acpica/source/include/acexcep.h                |    5 +-
>  src/acpica/source/include/acglobal.h               |   22 +-
>  src/acpica/source/include/aclocal.h                |   45 ++-
>  src/acpica/source/include/acmacros.h               |    4 +-
>  src/acpica/source/include/acobject.h               |   15 +-
>  src/acpica/source/include/acoutput.h               |    4 +
>  src/acpica/source/include/acpiosxf.h               |    2 +-
>  src/acpica/source/include/acpixf.h                 |   36 +-
>  src/acpica/source/include/acpredef.h               |    6 +-
>  src/acpica/source/include/actbl1.h                 |    2 +-
>  src/acpica/source/include/actypes.h                |    7 +-
>  src/acpica/source/include/acutils.h                |    6 +-
>  src/acpica/source/include/platform/acenv.h         |    5 +-
>  .../source/os_specific/service_layers/osunixxf.c   |   31 +-
>  src/acpica/source/tools/acpiexec/aecommon.h        |    1 +
>  src/acpica/source/tools/acpiexec/aehandlers.c      |  163 ++++++++--
>  84 files changed, 1846 insertions(+), 1041 deletions(-)
>
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 3187432..e2213d5 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -175,6 +175,7 @@ libfwtsacpica_la_SOURCES = \
>         $(ACPICA_COMP)/tables/tbutils.c \
>         $(ACPICA_COMP)/tables/tbxface.c \
>         $(ACPICA_COMP)/tables/tbxfroot.c \
> +       $(ACPICA_COMP)/tables/tbxfload.c \
>         $(ACPICA_COMP)/utilities/utaddress.c \
>         $(ACPICA_COMP)/utilities/utalloc.c \
>         $(ACPICA_COMP)/utilities/utcache.c \
> @@ -197,6 +198,7 @@ libfwtsacpica_la_SOURCES = \
>         $(ACPICA_COMP)/utilities/utxferror.c \
>         $(ACPICA_COMP)/utilities/utxface.c \
>         $(ACPICA_COMP)/utilities/utdecode.c \
> +       $(ACPICA_COMP)/utilities/utexcep.c \
>         $(ACPICA_SRC)/tools/acpiexec/aehandlers.c
>
>  libfwtsacpica_la_LIBADD = \
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index f4e33e2..36c3176 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -370,20 +370,24 @@ FlSplitInputPathname (
>          return (AE_NO_MEMORY);
>      }
>
> -    Substring = strrchr (DirectoryPath, '\\');
> +    /* Convert backslashes to slashes in the entire path */
> +
> +    UtConvertBackslashes (DirectoryPath);
> +
> +    /* Backup to last slash or colon */
> +
> +    Substring = strrchr (DirectoryPath, '/');
>      if (!Substring)
>      {
> -        Substring = strrchr (DirectoryPath, '/');
> -        if (!Substring)
> -        {
> -            Substring = strrchr (DirectoryPath, ':');
> -        }
> +        Substring = strrchr (DirectoryPath, ':');
>      }
>
> +    /* Extract the simple filename */
> +
>      if (!Substring)
>      {
> +        Filename = FlStrdup (DirectoryPath);
>          DirectoryPath[0] = 0;
> -        Filename = FlStrdup (InputPath);
>      }
>      else
>      {
> @@ -398,7 +402,6 @@ FlSplitInputPathname (
>
>      *OutDirectoryPath = DirectoryPath;
>      *OutFilename = Filename;
> -
>      return (AE_OK);
>  }
>
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index eeb61d8..00d9bb6 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -593,6 +593,7 @@ AcpiDmFindOrphanDescending (
>
>          if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
>              (OpInfo->Class != AML_CLASS_CREATE) &&
> +            (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
>              (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
>              !Op->Common.Node)
>          {
> @@ -815,13 +816,23 @@ AcpiDmXrefDescendingOp (
>
>      if (OpInfo->Flags & AML_NAMED)
>      {
> -        if ((Op->Common.AmlOpcode == AML_ALIAS_OP) ||
> -            (Op->Common.AmlOpcode == AML_SCOPE_OP))
> +        /*
> +         * Only these two operators (Alias, Scope) refer to an existing
> +         * name, it is the first argument
> +         */
> +        if (Op->Common.AmlOpcode == AML_ALIAS_OP)
> +        {
> +            ObjectType = ACPI_TYPE_ANY;
> +
> +            NextOp = Op->Common.Value.Arg;
> +            NextOp = NextOp->Common.Value.Arg;
> +            if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
> +            {
> +                Path = NextOp->Common.Value.String;
> +            }
> +        }
> +        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
>          {
> -            /*
> -             * Only these two operators refer to an existing name,
> -             * first argument
> -             */
>              Path = (char *) Op->Named.Path;
>          }
>      }
> @@ -829,6 +840,8 @@ AcpiDmXrefDescendingOp (
>      {
>          /* Referenced Buffer Name is the first child */
>
> +        ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
> +
>          NextOp = Op->Common.Value.Arg;
>          if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
>          {
> @@ -855,6 +868,11 @@ AcpiDmXrefDescendingOp (
>      Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
>                  ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
>                  WalkState, &Node);
> +    if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
> +    {
> +        Status = AE_NOT_FOUND;
> +    }
> +
>      if (ACPI_FAILURE (Status))
>      {
>          if (Status == AE_NOT_FOUND)
> diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
> index 8b8402e..622db8a 100644
> --- a/src/acpica/source/common/dmextern.c
> +++ b/src/acpica/source/common/dmextern.c
> @@ -293,8 +293,10 @@ AcpiDmNormalizeParentPrefix (
>       */
>      ACPI_STRCAT (Fullpath, ParentPath);
>
> -    /* Add dot separator (don't need dot if parent fullpath is a single "\") */
> -
> +    /*
> +     * Add dot separator
> +     * (don't need dot if parent fullpath is a single backslash)
> +     */
>      if (ParentPath[1])
>      {
>          ACPI_STRCAT (Fullpath, ".");
> @@ -526,12 +528,12 @@ AcpiDmAddToExternalList (
>
>      NewExternal->InternalPath = Path;
>
> -    /* Link the new descriptor into the global list, ordered by string length */
> +    /* Link the new descriptor into the global list, alphabetically ordered */
>
>      NextExternal = AcpiGbl_ExternalList;
>      while (NextExternal)
>      {
> -        if (NewExternal->Length <= NextExternal->Length)
> +        if (AcpiUtStricmp (NewExternal->Path, NextExternal->Path) < 0)
>          {
>              if (PrevExternal)
>              {
> @@ -580,7 +582,7 @@ AcpiDmAddExternalsToNamespace (
>  {
>      ACPI_STATUS             Status;
>      ACPI_NAMESPACE_NODE     *Node;
> -    ACPI_OPERAND_OBJECT     *MethodDesc;
> +    ACPI_OPERAND_OBJECT     *ObjDesc;
>      ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
>
>
> @@ -599,13 +601,29 @@ AcpiDmAddExternalsToNamespace (
>                  "while adding external to namespace [%s]",
>                  External->Path));
>          }
> -        else if (External->Type == ACPI_TYPE_METHOD)
> +
> +        else switch (External->Type)
>          {
> +        case ACPI_TYPE_METHOD:
> +
>              /* For methods, we need to save the argument count */
>
> -            MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> -            MethodDesc->Method.ParamCount = (UINT8) External->Value;
> -            Node->Object = MethodDesc;
> +            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> +            ObjDesc->Method.ParamCount = (UINT8) External->Value;
> +            Node->Object = ObjDesc;
> +            break;
> +
> +        case ACPI_TYPE_REGION:
> +
> +            /* Regions require a region sub-object */
> +
> +            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> +            ObjDesc->Region.Node = Node;
> +            Node->Object = ObjDesc;
> +            break;
> +
> +        default:
> +            break;
>          }
>
>          External = External->Next;
> diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
> index 1f0c5fb..9afaad3 100644
> --- a/src/acpica/source/common/dmrestag.c
> +++ b/src/acpica/source/common/dmrestag.c
> @@ -145,6 +145,7 @@ AcpiDmGetResourceTag (
>
>  static char *
>  AcpiGetTagPathname (
> +    ACPI_PARSE_OBJECT       *Op,
>      ACPI_NAMESPACE_NODE     *BufferNode,
>      ACPI_NAMESPACE_NODE     *ResourceNode,
>      UINT32                  BitIndex);
> @@ -515,7 +516,6 @@ AcpiDmCheckResourceReference (
>      ACPI_NAMESPACE_NODE     *BufferNode;
>      ACPI_NAMESPACE_NODE     *ResourceNode;
>      const ACPI_OPCODE_INFO  *OpInfo;
> -    char                    *Pathname;
>      UINT32                  BitIndex;
>
>
> @@ -591,14 +591,7 @@ AcpiDmCheckResourceReference (
>
>      /* Translate the Index to a resource tag pathname */
>
> -    Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex);
> -    if (Pathname)
> -    {
> -        /* Complete the conversion of the Index to a symbol */
> -
> -        IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
> -        IndexOp->Common.Value.String = Pathname;
> -    }
> +    AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex);
>  }
>
>
> @@ -669,6 +662,7 @@ AcpiDmGetResourceNode (
>
>  static char *
>  AcpiGetTagPathname (
> +    ACPI_PARSE_OBJECT       *IndexOp,
>      ACPI_NAMESPACE_NODE     *BufferNode,
>      ACPI_NAMESPACE_NODE     *ResourceNode,
>      UINT32                  BitIndex)
> @@ -761,6 +755,15 @@ AcpiGetTagPathname (
>
>      AcpiNsInternalizeName (Pathname, &InternalPath);
>      ACPI_FREE (Pathname);
> +
> +    /* Update the Op with the symbol */
> +
> +    AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP);
> +    IndexOp->Common.Value.String = InternalPath;
> +
> +    /* We will need the tag later. Cheat by putting it in the Node field */
> +
> +    IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag);
>      return (InternalPath);
>  }
>
> diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
> index cee1f4f..b7a72c9 100644
> --- a/src/acpica/source/compiler/Makefile.am
> +++ b/src/acpica/source/compiler/Makefile.am
> @@ -183,6 +183,7 @@ libfwtsiasl_la_SOURCES = \
>         $(ACPICA_COMMON)/adfile.c \
>         $(ACPICA_COMMON)/adisasm.c \
>         $(ACPICA_COMMON)/adwalk.c \
> +       $(ACPICA_COMMON)/ahpredef.c \
>         $(ACPICA_COMMON)/dmextern.c \
>         $(ACPICA_COMMON)/dmrestag.c \
>         $(ACPICA_COMMON)/dmtable.c \
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 371a6e3..623bc3d 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -131,14 +131,18 @@ CmFlushSourceCode (
>
>  static void
>  FlConsumeAnsiComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>      ASL_FILE_STATUS         *Status);
>
>  static void
>  FlConsumeNewComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>      ASL_FILE_STATUS         *Status);
>
> +static void
> +CmDumpAllEvents (
> +    void);
> +
>
>  /*******************************************************************************
>   *
> @@ -325,7 +329,8 @@ CmFlushSourceCode (
>   *
>   * FUNCTION:    FlConsume*
>   *
> - * PARAMETERS:  FileInfo        - Points to an open input file
> + * PARAMETERS:  Handle              - Open input file
> + *              Status              - File current status struct
>   *
>   * RETURN:      Number of lines consumed
>   *
> @@ -335,14 +340,14 @@ CmFlushSourceCode (
>
>  static void
>  FlConsumeAnsiComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>      ASL_FILE_STATUS         *Status)
>  {
>      UINT8                   Byte;
>      BOOLEAN                 ClosingComment = FALSE;
>
>
> -    while (fread (&Byte, 1, 1, FileInfo->Handle))
> +    while (fread (&Byte, 1, 1, Handle))
>      {
>          /* Scan until comment close is found */
>
> @@ -379,13 +384,13 @@ FlConsumeAnsiComment (
>
>  static void
>  FlConsumeNewComment (
> -    ASL_FILE_INFO           *FileInfo,
> +    FILE                    *Handle,
>      ASL_FILE_STATUS         *Status)
>  {
>      UINT8                   Byte;
>
>
> -    while (fread (&Byte, 1, 1, FileInfo->Handle))
> +    while (fread (&Byte, 1, 1, Handle))
>      {
>          Status->Offset++;
>
> @@ -404,7 +409,9 @@ FlConsumeNewComment (
>   *
>   * FUNCTION:    FlCheckForAscii
>   *
> - * PARAMETERS:  FileInfo        - Points to an open input file
> + * PARAMETERS:  Handle              - Open input file
> + *              Filename            - Input filename
> + *              DisplayErrors       - TRUE if error messages desired
>   *
>   * RETURN:      Status
>   *
> @@ -419,7 +426,9 @@ FlConsumeNewComment (
>
>  ACPI_STATUS
>  FlCheckForAscii (
> -    ASL_FILE_INFO           *FileInfo)
> +    FILE                    *Handle,
> +    char                    *Filename,
> +    BOOLEAN                 DisplayErrors)
>  {
>      UINT8                   Byte;
>      ACPI_SIZE               BadBytes = 0;
> @@ -432,7 +441,7 @@ FlCheckForAscii (
>
>      /* Read the entire file */
>
> -    while (fread (&Byte, 1, 1, FileInfo->Handle))
> +    while (fread (&Byte, 1, 1, Handle))
>      {
>          /* Ignore comment fields (allow non-ascii within) */
>
> @@ -442,12 +451,12 @@ FlCheckForAscii (
>
>              if (Byte == '*')
>              {
> -                FlConsumeAnsiComment (FileInfo, &Status);
> +                FlConsumeAnsiComment (Handle, &Status);
>              }
>
>              if (Byte == '/')
>              {
> -                FlConsumeNewComment (FileInfo, &Status);
> +                FlConsumeNewComment (Handle, &Status);
>              }
>
>              /* Reset */
> @@ -463,7 +472,7 @@ FlCheckForAscii (
>
>          if (!ACPI_IS_ASCII (Byte))
>          {
> -            if (BadBytes < 10)
> +            if ((BadBytes < 10) && (DisplayErrors))
>              {
>                  AcpiOsPrintf (
>                      "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n",
> @@ -485,20 +494,24 @@ FlCheckForAscii (
>
>      /* Seek back to the beginning of the source file */
>
> -    fseek (FileInfo->Handle, 0, SEEK_SET);
> +    fseek (Handle, 0, SEEK_SET);
>
>      /* Were there any non-ASCII characters in the file? */
>
>      if (BadBytes)
>      {
> -        AcpiOsPrintf (
> -            "%u non-ASCII characters found in input source text, could be a binary file\n",
> -            BadBytes);
> -        AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename);
> +        if (DisplayErrors)
> +        {
> +            AcpiOsPrintf (
> +                "%u non-ASCII characters found in input source text, could be a binary file\n",
> +                BadBytes);
> +            AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, Filename);
> +        }
> +
>          return (AE_BAD_CHARACTER);
>      }
>
> -    /* File is OK */
> +    /* File is OK (100% ASCII) */
>
>      return (AE_OK);
>  }
> @@ -780,45 +793,65 @@ CmDoOutputFiles (
>
>  /*******************************************************************************
>   *
> - * FUNCTION:    CmDumpEvent
> + * FUNCTION:    CmDumpAllEvents
>   *
> - * PARAMETERS:  Event           - A compiler event struct
> + * PARAMETERS:  None
>   *
>   * RETURN:      None.
>   *
> - * DESCRIPTION: Dump a compiler event struct
> + * DESCRIPTION: Dump all compiler events
>   *
>   ******************************************************************************/
>
>  static void
> -CmDumpEvent (
> -    ASL_EVENT_INFO          *Event)
> +CmDumpAllEvents (
> +    void)
>  {
> +    ASL_EVENT_INFO          *Event;
>      UINT32                  Delta;
>      UINT32                  USec;
>      UINT32                  MSec;
> +    UINT32                  i;
>
> -    if (!Event->Valid)
> +
> +    Event = AslGbl_Events;
> +
> +    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
> +    if (Gbl_CompileTimesFlag)
>      {
> -        return;
> +        printf ("\nElapsed time for major events\n\n");
>      }
>
> -    /* Delta will be in 100-nanosecond units */
> +    for (i = 0; i < AslGbl_NextEvent; i++)
> +    {
> +        if (Event->Valid)
> +        {
> +            /* Delta will be in 100-nanosecond units */
>
> -    Delta = (UINT32) (Event->EndTime - Event->StartTime);
> +            Delta = (UINT32) (Event->EndTime - Event->StartTime);
>
> -    USec = Delta / 10;
> -    MSec = Delta / 10000;
> +            USec = Delta / 10;
> +            MSec = Delta / 10000;
>
> -    /* Round milliseconds up */
> +            /* Round milliseconds up */
>
> -    if ((USec - (MSec * 1000)) >= 500)
> -    {
> -        MSec++;
> -    }
> +            if ((USec - (MSec * 1000)) >= 500)
> +            {
> +                MSec++;
> +            }
>
> -    DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
> -        USec, MSec, Event->EventName);
> +            DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
> +                USec, MSec, Event->EventName);
> +
> +            if (Gbl_CompileTimesFlag)
> +            {
> +                printf ("%8u usec %8u msec - %s\n",
> +                    USec, MSec, Event->EventName);
> +            }
> +        }
> +
> +        Event++;
> +    }
>  }
>
>
> @@ -849,20 +882,12 @@ CmCleanupAndExit (
>          AePrintErrorLog (ASL_FILE_STDOUT);
>      }
>
> -    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
> -    for (i = 0; i < AslGbl_NextEvent; i++)
> -    {
> -        CmDumpEvent (&AslGbl_Events[i]);
> -    }
> +    /* Emit compile times if enabled */
> +
> +    CmDumpAllEvents ();
>
>      if (Gbl_CompileTimesFlag)
>      {
> -        printf ("\nElapsed time for major events\n\n");
> -        for (i = 0; i < AslGbl_NextEvent; i++)
> -        {
> -            CmDumpEvent (&AslGbl_Events[i]);
> -        }
> -
>          printf ("\nMiscellaneous compile statistics\n\n");
>          printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
>          printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 29558fc..03303f5 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -238,7 +238,9 @@ CmCleanupAndExit (
>
>  ACPI_STATUS
>  FlCheckForAscii (
> -    ASL_FILE_INFO           *FileInfo);
> +    FILE                    *Handle,
> +    char                    *Filename,
> +    BOOLEAN                 DisplayErrors);
>
>
>  /*
> @@ -680,6 +682,11 @@ void
>  FlAddIncludeDirectory (
>      char                    *Dir);
>
> +char *
> +FlMergePathnames (
> +    char                    *PrefixDir,
> +    char                    *FilePathname);
> +
>  void
>  FlOpenIncludeFile (
>      ACPI_PARSE_OBJECT       *Op);
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index f911072..98f9e7e 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -595,6 +595,7 @@ NamePathTail                [.]{NameSeg}
>  "IPMI"                      { count (0); return (PARSEOP_REGIONSPACE_IPMI); }
>  "GeneralPurposeIo"          { count (0); return (PARSEOP_REGIONSPACE_GPIO); }       /* ACPI 5.0 */
>  "GenericSerialBus"          { count (0); return (PARSEOP_REGIONSPACE_GSBUS); }      /* ACPI 5.0 */
> +"PCC"                       { count (0); return (PARSEOP_REGIONSPACE_PCC); }        /* ACPI 5.0 */
>  "FFixedHW"                  { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); }
>
>      /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */
> diff --git a/src/acpica/source/compiler/aslcompiler.y b/src/acpica/source/compiler/aslcompiler.y
> index 9aa8b51..9675b1d 100644
> --- a/src/acpica/source/compiler/aslcompiler.y
> +++ b/src/acpica/source/compiler/aslcompiler.y
> @@ -435,6 +435,7 @@ void *                      AslLocalAllocate (unsigned int Size);
>  %token <i> PARSEOP_REGIONSPACE_IO
>  %token <i> PARSEOP_REGIONSPACE_IPMI
>  %token <i> PARSEOP_REGIONSPACE_MEM
> +%token <i> PARSEOP_REGIONSPACE_PCC
>  %token <i> PARSEOP_REGIONSPACE_PCI
>  %token <i> PARSEOP_REGIONSPACE_PCIBAR
>  %token <i> PARSEOP_REGIONSPACE_SMBUS
> @@ -2271,7 +2272,7 @@ AddressKeyword
>      ;
>
>  AddressSpaceKeyword
> -    : ByteConst                             {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
> +    : ByteConst                             {$$ = UtCheckIntegerRange ($1, 0x0A, 0xFF);}
>      | RegionSpaceKeyword                    {}
>      ;
>
> @@ -2431,6 +2432,7 @@ RegionSpaceKeyword
>      | PARSEOP_REGIONSPACE_IPMI              {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_IPMI);}
>      | PARSEOP_REGIONSPACE_GPIO              {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GPIO);}
>      | PARSEOP_REGIONSPACE_GSBUS             {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GSBUS);}
> +    | PARSEOP_REGIONSPACE_PCC               {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCC);}
>      | PARSEOP_REGIONSPACE_FFIXEDHW          {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_FFIXEDHW);}
>      ;
>
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index c93a1a2..4d7c846 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -387,12 +387,16 @@ AePrintException (
>          }
>          else
>          {
> +            /*
> +             * Less verbose version of the error message, enabled via the
> +             * -vi switch. The format is compatible with MS Visual Studio.
> +             */
>              fprintf (OutputFile, "%s", Enode->Filename);
>
>              if (Enode->LineNumber)
>              {
> -                fprintf (OutputFile, "(%u) i:%6u : ",
> -                    Enode->LineNumber, Enode->LineNumber);
> +                fprintf (OutputFile, "(%u) : ",
> +                    Enode->LineNumber);
>              }
>          }
>      }
> @@ -407,9 +411,18 @@ AePrintException (
>      {
>          /* Decode the message ID */
>
> -        fprintf (OutputFile, "%s %4.4d - ",
> -                    AslErrorLevel[Enode->Level],
> -                    Enode->MessageId + ((Enode->Level+1) * 1000));
> +        if (Gbl_VerboseErrors)
> +        {
> +            fprintf (OutputFile, "%s %4.4d -",
> +                        AslErrorLevel[Enode->Level],
> +                        Enode->MessageId + ((Enode->Level+1) * 1000));
> +        }
> +        else /* IDE case */
> +        {
> +            fprintf (OutputFile, "%s %4.4d:",
> +                        AslErrorLevelIde[Enode->Level],
> +                        Enode->MessageId + ((Enode->Level+1) * 1000));
> +        }
>
>          MainMessage = AslMessages[Enode->MessageId];
>          ExtraMessage = Enode->Message;
> diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c
> index ef10668..a2512a6 100644
> --- a/src/acpica/source/compiler/aslfiles.c
> +++ b/src/acpica/source/compiler/aslfiles.c
> @@ -564,6 +564,107 @@ FlAddIncludeDirectory (
>
>  /*******************************************************************************
>   *
> + * FUNCTION:    FlMergePathnames
> + *
> + * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
> + *                                a zero length string.
> + *              FilePathname    - The include filename from the source ASL.
> + *
> + * RETURN:      Merged pathname string
> + *
> + * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
> + *              arrive at a minimal length string. Merge can occur if the
> + *              FilePathname is relative to the PrefixDir.
> + *
> + ******************************************************************************/
> +
> +char *
> +FlMergePathnames (
> +    char                    *PrefixDir,
> +    char                    *FilePathname)
> +{
> +    char                    *CommonPath;
> +    char                    *Pathname;
> +    char                    *LastElement;
> +
> +
> +    DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
> +        "Include: FilePathname - \"%s\"\n",
> +         PrefixDir, FilePathname);
> +
> +    /*
> +     * If there is no prefix directory or if the file pathname is absolute,
> +     * just return the original file pathname
> +     */
> +    if (!PrefixDir || (!*PrefixDir) ||
> +        (*FilePathname == '/') ||
> +         (FilePathname[1] == ':'))
> +    {
> +        Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1);
> +        strcpy (Pathname, FilePathname);
> +        goto ConvertBackslashes;
> +    }
> +
> +    /* Need a local copy of the prefix directory path */
> +
> +    CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1);
> +    strcpy (CommonPath, PrefixDir);
> +
> +    /*
> +     * Walk forward through the file path, and simultaneously backward
> +     * through the prefix directory path until there are no more
> +     * relative references at the start of the file path.
> +     */
> +    while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
> +    {
> +        /* Remove last element of the prefix directory path */
> +
> +        LastElement = strrchr (CommonPath, '/');
> +        if (!LastElement)
> +        {
> +            goto ConcatenatePaths;
> +        }
> +
> +        *LastElement = 0;   /* Terminate CommonPath string */
> +        FilePathname += 3;  /* Point to next path element */
> +    }
> +
> +    /*
> +     * Remove the last element of the prefix directory path (it is the same as
> +     * the first element of the file pathname), and build the final merged
> +     * pathname.
> +     */
> +    LastElement = strrchr (CommonPath, '/');
> +    if (LastElement)
> +    {
> +        *LastElement = 0;
> +    }
> +
> +    /* Build the final merged pathname */
> +
> +ConcatenatePaths:
> +    Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2);
> +    if (LastElement && *CommonPath)
> +    {
> +        strcpy (Pathname, CommonPath);
> +        strcat (Pathname, "/");
> +    }
> +    strcat (Pathname, FilePathname);
> +    ACPI_FREE (CommonPath);
> +
> +    /* Convert all backslashes to normal slashes */
> +
> +ConvertBackslashes:
> +    UtConvertBackslashes (Pathname);
> +
> +    DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
> +         Pathname);
> +    return (Pathname);
> +}
> +
> +
> +/*******************************************************************************
> + *
>   * FUNCTION:    FlOpenIncludeWithPrefix
>   *
>   * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
> @@ -587,12 +688,9 @@ FlOpenIncludeWithPrefix (
>
>      /* Build the full pathname to the file */
>
> -    Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> -
> -    strcpy (Pathname, PrefixDir);
> -    strcat (Pathname, Filename);
> +    Pathname = FlMergePathnames (PrefixDir, Filename);
>
> -    DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
> +    DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
>          Pathname);
>
>      /* Attempt to open the file, push if successful */
> @@ -728,7 +826,7 @@ FlOpenInputFile (
>
>      /* Open the input ASL file, text mode */
>
> -    FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
> +    FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
>      AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
>
>      return (AE_OK);
> @@ -812,7 +910,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the hex file, text mode */
>
> -        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
>
>          AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
>          AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
> @@ -863,7 +961,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the listing file, text mode */
>
> -        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
>
>          AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
>          AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
> @@ -881,7 +979,7 @@ FlOpenMiscOutputFiles (
>              return (AE_ERROR);
>          }
>
> -        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b");
> +        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
>      }
>
>      /* All done for data table compiler */
> @@ -926,7 +1024,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the assembly code source file, text mode */
>
> -        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
>
>          AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
>          AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
> @@ -946,7 +1044,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the C code source file, text mode */
>
> -        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
>
>          FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
>          AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
> @@ -967,7 +1065,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the assembly include file, text mode */
>
> -        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
>
>          AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
>          AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
> @@ -987,7 +1085,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the C include file, text mode */
>
> -        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
>
>          FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
>          AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
> @@ -1008,7 +1106,7 @@ FlOpenMiscOutputFiles (
>
>          /* Open the namespace file, text mode */
>
> -        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
> +        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
>
>          AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
>          AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
> diff --git a/src/acpica/source/compiler/asllookup.c b/src/acpica/source/compiler/asllookup.c
> index 0d92c91..8f8dc5d 100644
> --- a/src/acpica/source/compiler/asllookup.c
> +++ b/src/acpica/source/compiler/asllookup.c
> @@ -1170,7 +1170,7 @@ LkNamespaceLocateBegin (
>
>              if (Message)
>              {
> -                sprintf (MsgBuffer, "Tag: %u bit%s, Field: %u bit%s",
> +                sprintf (MsgBuffer, "Size mismatch, Tag: %u bit%s, Field: %u bit%s",
>                      TagBitLength, (TagBitLength > 1) ? "s" : "",
>                      FieldBitLength, (FieldBitLength > 1) ? "s" : "");
>
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index 285d765..efd5906 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -135,7 +135,7 @@ Options (
>      void);
>
>  static void
> -HelpMessage (
> +FilenameHelp (
>      void);
>
>  static void
> @@ -168,7 +168,7 @@ AslDoResponseFile (
>
>
>  #define ASL_TOKEN_SEPARATORS    " \t\n"
> -#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v|w|x:z"
> +#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v^w|x:z"
>
>
>  /*******************************************************************************
> @@ -191,6 +191,7 @@ Options (
>      printf ("\nGlobal:\n");
>      ACPI_OPTION ("-@ <file>",       "Specify command file");
>      ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
> +    ACPI_OPTION ("-v",              "Display compiler version");
>
>      printf ("\nPreprocessor:\n");
>      ACPI_OPTION ("-D <symbol>",     "Define symbol for preprocessor use");
> @@ -242,27 +243,36 @@ Options (
>      ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
>
>      printf ("\nHelp:\n");
> -    ACPI_OPTION ("-h",              "Additional help and compiler debug options");
> +    ACPI_OPTION ("-h",              "This message");
>      ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
> +    ACPI_OPTION ("-hf",             "Display help for output filename generation");
>      ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
>      ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
> +
> +    printf ("\nDebug Options:\n");
> +    ACPI_OPTION ("-bf -bt",         "Create debug file (full or parse tree only) (*.txt)");
> +    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
> +    ACPI_OPTION ("-n",              "Parse only, no output generation");
> +    ACPI_OPTION ("-ot",             "Display compile times and statistics");
> +    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
> +    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
>  }
>
>
>  /*******************************************************************************
>   *
> - * FUNCTION:    HelpMessage
> + * FUNCTION:    FilenameHelp
>   *
>   * PARAMETERS:  None
>   *
>   * RETURN:      None
>   *
> - * DESCRIPTION: Display help message
> + * DESCRIPTION: Display help message for output filename generation
>   *
>   ******************************************************************************/
>
>  static void
> -HelpMessage (
> +FilenameHelp (
>      void)
>  {
>
> @@ -274,17 +284,6 @@ HelpMessage (
>      printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
>      printf ("    3) The prefix of the input filename\n");
>      printf ("\n");
> -
> -    Options ();
> -
> -    printf ("\nCompiler/Disassembler Debug Options:\n");
> -    ACPI_OPTION ("-bb -bp -bt",     "Create compiler debug/trace file (*.txt)");
> -    ACPI_OPTION ("",                "Types: Parse/Tree/Both");
> -    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
> -    ACPI_OPTION ("-n",              "Parse only, no output generation");
> -    ACPI_OPTION ("-ot",             "Display compile times");
> -    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
> -    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
>  }
>
>
> @@ -502,13 +501,7 @@ AslDoOptions (
>      case 'b':   /* Debug output options */
>          switch (AcpiGbl_Optarg[0])
>          {
> -        case 'b':
> -            AslCompilerdebug = 1; /* same as yydebug */
> -            DtParserdebug = 1;
> -            PrParserdebug = 1;
> -            break;
> -
> -        case 'p':
> +        case 'f':
>              AslCompilerdebug = 1; /* same as yydebug */
>              DtParserdebug = 1;
>              PrParserdebug = 1;
> @@ -602,13 +595,17 @@ AslDoOptions (
>          switch (AcpiGbl_Optarg[0])
>          {
>          case '^':
> -            HelpMessage ();
> +            Usage ();
>              exit (0);
>
>          case 'c':
>              UtDisplayConstantOpcodes ();
>              exit (0);
>
> +        case 'f':
> +            FilenameHelp ();
> +            exit (0);
> +
>          case 'r':
>              /* reserved names */
>
> @@ -827,9 +824,13 @@ AslDoOptions (
>          break;
>
>
> -    case 'v':   /* Verbosity settings */
> +    case 'v':   /* Version and verbosity settings */
>          switch (AcpiGbl_Optarg[0])
>          {
> +        case '^':
> +            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
> +            exit (0);
> +
>          case 'a':
>              /* Disable All error/warning messages */
>
> @@ -837,9 +838,18 @@ AslDoOptions (
>              break;
>
>          case 'i':
> -            /* Less verbose error messages */
> -
> +            /*
> +             * Support for integrated development environment(s).
> +             *
> +             * 1) No compiler signon
> +             * 2) Send stderr messages to stdout
> +             * 3) Less verbose error messages (single line only for each)
> +             * 4) Error/warning messages are formatted appropriately to
> +             *    be recognized by MS Visual Studio
> +             */
>              Gbl_VerboseErrors = FALSE;
> +            Gbl_DoSignon = FALSE;
> +            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
>              break;
>
>          case 'o':
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index 498ca42..c276972 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -439,6 +439,7 @@ const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
>  /* REGIONSPACE_IO */            OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SYSTEM_IO,       0,                  0),
>  /* REGIONSPACE_IPMI */          OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_IPMI,            0,                  0),
>  /* REGIONSPACE_MEM */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SYSTEM_MEMORY,   0,                  0),
> +/* REGIONSPACE_PCC */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PLATFORM_COMM,   0,                  0),
>  /* REGIONSPACE_PCI */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PCI_CONFIG,      0,                  0),
>  /* REGIONSPACE_PCIBAR */        OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PCI_BAR_TARGET,  0,                  0),
>  /* REGIONSPACE_SMBUS */         OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SMBUS,           0,                  0),
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 4e5bb31..56951bc 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -474,7 +474,7 @@ char                        *AslMessages [] = {
>  };
>
>
> -char                    *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
> +const char              *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
>      "Warning ",
>      "Warning ",
>      "Warning ",
> @@ -483,6 +483,15 @@ char                    *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
>      "Optimize"
>  };
>
> +const char              *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = {
> +    "warning ",
> +    "warning ",
> +    "warning ",
> +    "error   ",
> +    "remark  ",
> +    "optimize"
> +};
> +
>  #define ASL_ERROR_LEVEL_LENGTH          8       /* Length of strings above */
>
>  #endif  /* ASL_EXCEPTIONS */
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index 49b25d9..2fbe0d3 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -299,7 +299,7 @@ AslDetectSourceFileType (
>
>      /* Check for 100% ASCII source file (comments are ignored) */
>
> -    Status = FlCheckForAscii (Info);
> +    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
>      if (ACPI_FAILURE (Status))
>      {
>          printf ("Non-ascii input file - %s\n", Info->Filename);
> diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
> index cdaf2b8..0ce5a20 100644
> --- a/src/acpica/source/compiler/aslsupport.l
> +++ b/src/acpica/source/compiler/aslsupport.l
> @@ -164,19 +164,23 @@ static void
>  AslDoLineDirective (
>      void)
>  {
> -    char                    c;
> +    int                     c;
>      char                    *Token;
>      UINT32                  LineNumber;
>      char                    *Filename;
> +    UINT32                  i;
>
>
>      /* Eat the entire line that contains the #line directive */
>
> -    while ((c = (char) input()) != '\n' && c != EOF)
> +    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> +
> +    while ((c = input()) != '\n' && c != EOF)
>      {
> -        AslInsertLineBuffer (c);
> +        *Gbl_LineBufPtr = c;
> +        Gbl_LineBufPtr++;
>      }
> -    AslInsertLineBuffer (0);
> +    *Gbl_LineBufPtr = 0;
>
>      /* First argument is the actual line number */
>
> @@ -186,10 +190,23 @@ AslDoLineDirective (
>          goto ResetAndExit;
>      }
>
> -    /* Convert line number. Subtract one to handle _this_ line */
> +    /* First argument is the line number */
>
>      LineNumber = (UINT32) UtDoConstant (Token);
> -    FlSetLineNumber (LineNumber - 1);
> +
> +    /* Emit the appropriate number of newlines */
> +
> +    Gbl_CurrentColumn = 0;
> +    if (LineNumber > Gbl_CurrentLineNumber)
> +    {
> +        for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++)
> +        {
> +            FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
> +            Gbl_CurrentColumn++;
> +        }
> +    }
> +
> +    FlSetLineNumber (LineNumber);
>
>      /* Second argument is the optional filename (in double quotes) */
>
> @@ -204,7 +221,12 @@ AslDoLineDirective (
>      /* Third argument is not supported at this time */
>
>  ResetAndExit:
> -    AslResetCurrentLineBuffer ();
> +
> +    /* Reset globals for a new line */
> +
> +    Gbl_CurrentLineOffset += Gbl_CurrentColumn;
> +    Gbl_CurrentColumn = 0;
> +    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
>  }
>
>
> @@ -480,8 +502,8 @@ static char
>  AslDoComment (
>      void)
>  {
> -    char                c;
> -    char                c1 = 0;
> +    int                 c;
> +    int                 c1 = 0;
>
>
>      AslInsertLineBuffer ('/');
> @@ -491,7 +513,7 @@ loop:
>
>      /* Eat chars until end-of-comment */
>
> -    while ((c = (char) input()) != '*' && c != EOF)
> +    while ((c = input()) != '*' && c != EOF)
>      {
>          AslInsertLineBuffer (c);
>          c1 = c;
> @@ -518,7 +540,7 @@ loop:
>
>      AslInsertLineBuffer (c);
>
> -    if ((c1 = (char) input()) != '/' && c1 != EOF)
> +    if ((c1 = input()) != '/' && c1 != EOF)
>      {
>          unput(c1);
>          goto loop;
> @@ -561,13 +583,13 @@ static char
>  AslDoCommentType2 (
>      void)
>  {
> -    char                c;
> +    int                 c;
>
>
>      AslInsertLineBuffer ('/');
>      AslInsertLineBuffer ('/');
>
> -    while ((c = (char) input()) != '\n' && c != EOF)
> +    while ((c = input()) != '\n' && c != EOF)
>      {
>          AslInsertLineBuffer (c);
>      }
> @@ -603,7 +625,7 @@ AslDoStringLiteral (
>      char                *StringBuffer = MsgBuffer;
>      char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
>      char                *CleanString;
> -    char                StringChar;
> +    int                 StringChar;
>      UINT32              State = ASL_NORMAL_CHAR;
>      UINT32              i = 0;
>      UINT8               Digit;
> @@ -616,7 +638,7 @@ AslDoStringLiteral (
>       * source line buffer.
>       */
>      AslInsertLineBuffer ('\"');
> -    while ((StringChar = (char) input()) != EOF)
> +    while ((StringChar = input()) != EOF)
>      {
>          AslInsertLineBuffer (StringChar);
>
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 8a7dbba..de7ea0d 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -211,7 +211,7 @@ UtDisplaySupportedTables (
>
>  /*******************************************************************************
>   *
> - * FUNCTION:    AcpiPsDisplayConstantOpcodes
> + * FUNCTION:    UtDisplayConstantOpcodes
>   *
>   * PARAMETERS:  None
>   *
> @@ -244,11 +244,11 @@ UtDisplayConstantOpcodes (
>   *
>   * FUNCTION:    UtLocalCalloc
>   *
> - * PARAMETERS:  Size        - Bytes to be allocated
> + * PARAMETERS:  Size                - Bytes to be allocated
>   *
> - * RETURN:      Pointer to the allocated memory.  Guaranteed to be valid.
> + * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
>   *
> - * DESCRIPTION: Allocate zero-initialized memory.  Aborts the compile on an
> + * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
>   *              allocation failure, on the assumption that nothing more can be
>   *              accomplished.
>   *
> @@ -283,9 +283,9 @@ UtLocalCalloc (
>   *
>   * FUNCTION:    UtBeginEvent
>   *
> - * PARAMETERS:  Name        - Ascii name of this event
> + * PARAMETERS:  Name                - Ascii name of this event
>   *
> - * RETURN:      Event       - Event number (integer index)
> + * RETURN:      Event number (integer index)
>   *
>   * DESCRIPTION: Saves the current time with this event
>   *
> @@ -316,7 +316,7 @@ UtBeginEvent (
>   *
>   * FUNCTION:    UtEndEvent
>   *
> - * PARAMETERS:  Event       - Event number (integer index)
> + * PARAMETERS:  Event               - Event number (integer index)
>   *
>   * RETURN:      None
>   *
> @@ -326,7 +326,7 @@ UtBeginEvent (
>
>  void
>  UtEndEvent (
> -    UINT8                  Event)
> +    UINT8                   Event)
>  {
>
>      if (Event >= ASL_NUM_EVENTS)
> @@ -344,7 +344,7 @@ UtEndEvent (
>   *
>   * FUNCTION:    UtHexCharToValue
>   *
> - * PARAMETERS:  HexChar         - Hex character in Ascii
> + * PARAMETERS:  HexChar             - Hex character in Ascii
>   *
>   * RETURN:      The binary value of the hex character
>   *
> @@ -375,12 +375,13 @@ UtHexCharToValue (
>   *
>   * FUNCTION:    UtConvertByteToHex
>   *
> - * PARAMETERS:  RawByte         - Binary data
> - *              Buffer          - Pointer to where the hex bytes will be stored
> + * PARAMETERS:  RawByte             - Binary data
> + *              Buffer              - Pointer to where the hex bytes will be
> + *                                    stored
>   *
>   * RETURN:      Ascii hex byte is stored in Buffer.
>   *
> - * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
> + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
>   *              with "0x"
>   *
>   ******************************************************************************/
> @@ -403,12 +404,13 @@ UtConvertByteToHex (
>   *
>   * FUNCTION:    UtConvertByteToAsmHex
>   *
> - * PARAMETERS:  RawByte         - Binary data
> - *              Buffer          - Pointer to where the hex bytes will be stored
> + * PARAMETERS:  RawByte             - Binary data
> + *              Buffer              - Pointer to where the hex bytes will be
> + *                                    stored
>   *
>   * RETURN:      Ascii hex byte is stored in Buffer.
>   *
> - * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
> + * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
>   *              with "0x"
>   *
>   ******************************************************************************/
> @@ -430,13 +432,13 @@ UtConvertByteToAsmHex (
>   *
>   * FUNCTION:    DbgPrint
>   *
> - * PARAMETERS:  Type            - Type of output
> - *              Fmt             - Printf format string
> - *              ...             - variable printf list
> + * PARAMETERS:  Type                - Type of output
> + *              Fmt                 - Printf format string
> + *              ...                 - variable printf list
>   *
>   * RETURN:      None
>   *
> - * DESCRIPTION: Conditional print statement.  Prints to stderr only if the
> + * DESCRIPTION: Conditional print statement. Prints to stderr only if the
>   *              debug flag is set.
>   *
>   ******************************************************************************/
> @@ -510,7 +512,7 @@ UtPrintFormattedName (
>   *
>   * FUNCTION:    UtSetParseOpName
>   *
> - * PARAMETERS:  Op
> + * PARAMETERS:  Op                  - Parse op to be named.
>   *
>   * RETURN:      None
>   *
> @@ -532,7 +534,7 @@ UtSetParseOpName (
>   *
>   * FUNCTION:    UtDisplaySummary
>   *
> - * PARAMETERS:  FileID          - ID of outpout file
> + * PARAMETERS:  FileID              - ID of outpout file
>   *
>   * RETURN:      None
>   *
> @@ -643,11 +645,11 @@ UtDisplaySummary (
>
>  /*******************************************************************************
>   *
> - * FUNCTION:    UtDisplaySummary
> + * FUNCTION:    UtCheckIntegerRange
>   *
> - * PARAMETERS:  Op              - Integer parse node
> - *              LowValue        - Smallest allowed value
> - *              HighValue       - Largest allowed value
> + * PARAMETERS:  Op                  - Integer parse node
> + *              LowValue            - Smallest allowed value
> + *              HighValue           - Largest allowed value
>   *
>   * RETURN:      Op if OK, otherwise NULL
>   *
> @@ -698,11 +700,11 @@ UtCheckIntegerRange (
>   *
>   * FUNCTION:    UtGetStringBuffer
>   *
> - * PARAMETERS:  Length          - Size of buffer requested
> + * PARAMETERS:  Length              - Size of buffer requested
>   *
> - * RETURN:      Pointer to the buffer.  Aborts on allocation failure
> + * RETURN:      Pointer to the buffer. Aborts on allocation failure
>   *
> - * DESCRIPTION: Allocate a string buffer.  Bypass the local
> + * DESCRIPTION: Allocate a string buffer. Bypass the local
>   *              dynamic memory manager for performance reasons (This has a
>   *              major impact on the speed of the compiler.)
>   *
> @@ -733,8 +735,8 @@ UtGetStringBuffer (
>   *
>   * FUNCTION:    UtInternalizeName
>   *
> - * PARAMETERS:  ExternalName            - Name to convert
> - *              ConvertedName           - Where the converted name is returned
> + * PARAMETERS:  ExternalName        - Name to convert
> + *              ConvertedName       - Where the converted name is returned
>   *
>   * RETURN:      Status
>   *
> @@ -786,8 +788,8 @@ UtInternalizeName (
>   *
>   * FUNCTION:    UtPadNameWithUnderscores
>   *
> - * PARAMETERS:  NameSeg         - Input nameseg
> - *              PaddedNameSeg   - Output padded nameseg
> + * PARAMETERS:  NameSeg             - Input nameseg
> + *              PaddedNameSeg       - Output padded nameseg
>   *
>   * RETURN:      Padded nameseg.
>   *
> @@ -824,8 +826,8 @@ UtPadNameWithUnderscores (
>   *
>   * FUNCTION:    UtAttachNameseg
>   *
> - * PARAMETERS:  Op              - Parent parse node
> - *              Name            - Full ExternalName
> + * PARAMETERS:  Op                  - Parent parse node
> + *              Name                - Full ExternalName
>   *
>   * RETURN:      None; Sets the NameSeg field in parent node
>   *
> @@ -881,12 +883,12 @@ UtAttachNameseg (
>   *
>   * FUNCTION:    UtAttachNamepathToOwner
>   *
> - * PARAMETERS:  Op            - Parent parse node
> - *              NameOp        - Node that contains the name
> + * PARAMETERS:  Op                  - Parent parse node
> + *              NameOp              - Node that contains the name
>   *
>   * RETURN:      Sets the ExternalName and Namepath in the parent node
>   *
> - * DESCRIPTION: Store the name in two forms in the parent node:  The original
> + * DESCRIPTION: Store the name in two forms in the parent node: The original
>   *              (external) name, and the internalized name that is used within
>   *              the ACPI namespace manager.
>   *
> @@ -926,11 +928,11 @@ UtAttachNamepathToOwner (
>   *
>   * FUNCTION:    UtDoConstant
>   *
> - * PARAMETERS:  String      - Hex, Octal, or Decimal string
> + * PARAMETERS:  String              - Hex, Octal, or Decimal string
>   *
>   * RETURN:      Converted Integer
>   *
> - * DESCRIPTION: Convert a string to an integer.  With error checking.
> + * DESCRIPTION: Convert a string to an integer, with error checking.
>   *
>   ******************************************************************************/
>
> @@ -961,10 +963,10 @@ UtDoConstant (
>   *
>   * FUNCTION:    UtStrtoul64
>   *
> - * PARAMETERS:  String          - Null terminated string
> - *              Terminater      - Where a pointer to the terminating byte is
> - *                                returned
> - *              Base            - Radix of the string
> + * PARAMETERS:  String              - Null terminated string
> + *              Terminater          - Where a pointer to the terminating byte
> + *                                    is returned
> + *              Base                - Radix of the string
>   *
>   * RETURN:      Converted value
>   *
> @@ -1144,5 +1146,3 @@ ErrorExit:
>
>      return (Status);
>  }
> -
> -
> diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c
> index 91d4aba..7a68e84 100644
> --- a/src/acpica/source/compiler/dtio.c
> +++ b/src/acpica/source/compiler/dtio.c
> @@ -161,6 +161,7 @@ DtDumpBuffer (
>  #define DT_SLASH_SLASH_COMMENT      4
>  #define DT_END_COMMENT              5
>  #define DT_MERGE_LINES              6
> +#define DT_ESCAPE_SEQUENCE          7
>
>  static UINT32  Gbl_NextLineOffset;
>
> @@ -498,7 +499,6 @@ DtGetNextLine (
>              {
>              case DT_START_QUOTED_STRING:
>              case DT_SLASH_ASTERISK_COMMENT:
> -            case DT_SLASH_SLASH_COMMENT:
>
>                  AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
>                  break;
> @@ -507,7 +507,22 @@ DtGetNextLine (
>                  break;
>              }
>
> -            return (ASL_EOF);
> +            /* Standalone EOF is OK */
> +
> +            if (i == 0)
> +            {
> +                return (ASL_EOF);
> +            }
> +
> +            /*
> +             * Received an EOF in the middle of a line. Terminate the
> +             * line with a newline. The next call to this function will
> +             * return a standalone EOF. Thus, the upper parsing software
> +             * never has to deal with an EOF within a valid line (or
> +             * the last line does not get tossed on the floor.)
> +             */
> +            c = '\n';
> +            State = DT_NORMAL_TEXT;
>          }
>
>          switch (State)
> @@ -576,12 +591,36 @@ DtGetNextLine (
>              Gbl_CurrentLineBuffer[i] = c;
>              i++;
>
> -            if (c == '"')
> +            switch (c)
>              {
> +            case '"':
>                  State = DT_NORMAL_TEXT;
> +                break;
> +
> +            case '\\':
> +                State = DT_ESCAPE_SEQUENCE;
> +                break;
> +
> +            case '\n':
> +                AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
> +                    Gbl_CurrentLineNumber++);
> +                State = DT_NORMAL_TEXT;
> +                break;
> +
> +            default:    /* Get next character */
> +                break;
>              }
>              break;
>
> +        case DT_ESCAPE_SEQUENCE:
> +
> +            /* Just copy the escaped character. TBD: sufficient for table compiler? */
> +
> +            Gbl_CurrentLineBuffer[i] = c;
> +            i++;
> +            State = DT_START_QUOTED_STRING;
> +            break;
> +
>          case DT_START_COMMENT:
>
>              /* Open comment if this character is an asterisk or slash */
> diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
> index ed5f79b..1d92b78 100644
> --- a/src/acpica/source/compiler/dttemplate.c
> +++ b/src/acpica/source/compiler/dttemplate.c
> @@ -298,7 +298,7 @@ DtCreateAllTemplates (
>      }
>
>      /*
> -     * Create the "special ACPI tables:
> +     * Create the special ACPI tables:
>       * 1) DSDT/SSDT are AML tables, not data tables
>       * 2) FACS and RSDP have non-standard headers
>       */
> diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c
> index e98e186..687af45 100644
> --- a/src/acpica/source/compiler/prscan.c
> +++ b/src/acpica/source/compiler/prscan.c
> @@ -726,7 +726,7 @@ PrDoDirective (
>          }
>
>          DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> -            "Start #include file %s\n", Gbl_CurrentLineNumber,
> +            "Start #include file \"%s\"\n", Gbl_CurrentLineNumber,
>              Token, Gbl_CurrentLineNumber);
>
>          PrOpenIncludeFile (Token);
> diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c
> index a5fb46a..64dc9e8 100644
> --- a/src/acpica/source/compiler/prutils.c
> +++ b/src/acpica/source/compiler/prutils.c
> @@ -318,13 +318,11 @@ PrOpenIncludeFile (
>      ASL_INCLUDE_DIR         *NextDir;
>
>
> -    /*
> -     * start the actual include file on the next line
> -     */
> +    /* Start the actual include file on the next line */
> +
>      Gbl_CurrentLineOffset++;
>
>      /* Attempt to open the include file */
> -
>      /* If the file specifies an absolute path, just open it */
>
>      if ((Filename[0] == '/')  ||
> @@ -402,13 +400,10 @@ PrOpenIncludeWithPrefix (
>
>      /* Build the full pathname to the file */
>
> -    Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> +    Pathname = FlMergePathnames (PrefixDir, Filename);
>
> -    strcpy (Pathname, PrefixDir);
> -    strcat (Pathname, Filename);
> -
> -    DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID
> -        "Opening include file: path %s\n",
> +    DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID
> +        "Include: Opening file - \"%s\"\n",
>          Gbl_CurrentLineNumber, Pathname);
>
>      /* Attempt to open the file, push if successful */
> diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
> index 4c34a79..27aa4cd 100644
> --- a/src/acpica/source/components/debugger/dbcmds.c
> +++ b/src/acpica/source/components/debugger/dbcmds.c
> @@ -326,12 +326,53 @@ AcpiDbDisplayTableInfo (
>      ACPI_STATUS             Status;
>
>
> +    /* Header */
> +
> +    AcpiOsPrintf ("Idx ID Status    Type            Sig  Address  Len   Header\n");
> +
>      /* Walk the entire root table list */
>
>      for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
>      {
>          TableDesc = &AcpiGbl_RootTableList.Tables[i];
> -        AcpiOsPrintf ("%u ", i);
> +
> +        /* Index and Table ID */
> +
> +        AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
> +
> +        /* Decode the table flags */
> +
> +        if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
> +        {
> +            AcpiOsPrintf ("NotLoaded ");
> +        }
> +        else
> +        {
> +            AcpiOsPrintf ("   Loaded ");
> +        }
> +
> +        switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
> +        {
> +        case ACPI_TABLE_ORIGIN_UNKNOWN:
> +            AcpiOsPrintf ("Unknown   ");
> +            break;
> +
> +        case ACPI_TABLE_ORIGIN_MAPPED:
> +            AcpiOsPrintf ("Mapped    ");
> +            break;
> +
> +        case ACPI_TABLE_ORIGIN_ALLOCATED:
> +            AcpiOsPrintf ("Allocated ");
> +            break;
> +
> +        case ACPI_TABLE_ORIGIN_OVERRIDE:
> +            AcpiOsPrintf ("Override  ");
> +            break;
> +
> +        default:
> +            AcpiOsPrintf ("INVALID   ");
> +            break;
> +        }
>
>          /* Make sure that the table is mapped */
>
> @@ -362,55 +403,45 @@ AcpiDbDisplayTableInfo (
>   *
>   * FUNCTION:    AcpiDbUnloadAcpiTable
>   *
> - * PARAMETERS:  TableArg        - Name of the table to be unloaded
> - *              InstanceArg     - Which instance of the table to unload (if
> - *                                there are multiple tables of the same type)
> + * PARAMETERS:  ObjectName          - Namespace pathname for an object that
> + *                                    is owned by the table to be unloaded
>   *
> - * RETURN:      Nonde
> + * RETURN:      None
>   *
> - * DESCRIPTION: Unload an ACPI table.
> - *              Instance is not implemented
> + * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
> + *              by the table.
>   *
>   ******************************************************************************/
>
>  void
>  AcpiDbUnloadAcpiTable (
> -    char                    *TableArg,
> -    char                    *InstanceArg)
> +    char                    *ObjectName)
>  {
> -/* TBD: Need to reimplement for new data structures */
> -
> -#if 0
> -    UINT32                  i;
> +    ACPI_NAMESPACE_NODE     *Node;
>      ACPI_STATUS             Status;
>
>
> -    /* Search all tables for the target type */
> +    /* Translate name to an Named object */
>
> -    for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
> +    Node = AcpiDbConvertToNode (ObjectName);
> +    if (!Node)
>      {
> -        if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
> -                AcpiGbl_TableData[i].SigLength))
> -        {
> -            /* Found the table, unload it */
> -
> -            Status = AcpiUnloadTable (i);
> -            if (ACPI_SUCCESS (Status))
> -            {
> -                AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
> -            }
> -            else
> -            {
> -                AcpiOsPrintf ("%s, while unloading [%s]\n",
> -                    AcpiFormatException (Status), TableArg);
> -            }
> -
> -            return;
> -        }
> +        AcpiOsPrintf ("Could not find [%s] in namespace\n",
> +            ObjectName);
> +        return;
>      }
>
> -    AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
> -#endif
> +    Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
> +            ObjectName, Node);
> +    }
> +    else
> +    {
> +        AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
> +            AcpiFormatException (Status), ObjectName);
> +    }
>  }
>
>
> @@ -445,25 +476,20 @@ AcpiDbSendNotify (
>          return;
>      }
>
> -    /* Decode Named object type */
> +    /* Dispatch the notify if legal */
>
> -    switch (Node->Type)
> +    if (AcpiEvIsNotifyObject (Node))
>      {
> -    case ACPI_TYPE_DEVICE:
> -    case ACPI_TYPE_THERMAL:
> -
> -         /* Send the notify */
> -
>          Status = AcpiEvQueueNotifyRequest (Node, Value);
>          if (ACPI_FAILURE (Status))
>          {
>              AcpiOsPrintf ("Could not queue notify\n");
>          }
> -        break;
> -
> -    default:
> -        AcpiOsPrintf ("Named object is not a device or a thermal object\n");
> -        break;
> +    }
> +    else
> +    {
> +        AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
> +            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
>      }
>  }
>
> diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
> index d8b3aa9..2e91c88 100644
> --- a/src/acpica/source/components/debugger/dbdisply.c
> +++ b/src/acpica/source/components/debugger/dbdisply.c
> @@ -179,8 +179,8 @@ typedef struct acpi_handler_info
>
>  static ACPI_HANDLER_INFO    AcpiGbl_HandlerList[] =
>  {
> -    {&AcpiGbl_SystemNotify.Handler,     "System Notifications"},
> -    {&AcpiGbl_DeviceNotify.Handler,     "Device Notifications"},
> +    {&AcpiGbl_GlobalNotify[0].Handler,  "System Notifications"},
> +    {&AcpiGbl_GlobalNotify[1].Handler,  "Device Notifications"},
>      {&AcpiGbl_TableHandler,             "ACPI Table Events"},
>      {&AcpiGbl_ExceptionHandler,         "Control Method Exceptions"},
>      {&AcpiGbl_InterfaceHandler,         "OSI Invocations"}
> @@ -864,10 +864,12 @@ AcpiDbDisplayGpes (
>      ACPI_GPE_EVENT_INFO     *GpeEventInfo;
>      ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
>      char                    *GpeType;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
>      UINT32                  GpeIndex;
>      UINT32                  Block = 0;
>      UINT32                  i;
>      UINT32                  j;
> +    UINT32                  Count;
>      char                    Buffer[80];
>      ACPI_BUFFER             RetBuf;
>      ACPI_STATUS             Status;
> @@ -988,7 +990,14 @@ AcpiDbDisplayGpes (
>                          AcpiOsPrintf ("Handler");
>                          break;
>                      case ACPI_GPE_DISPATCH_NOTIFY:
> -                        AcpiOsPrintf ("Notify");
> +                        Count = 0;
> +                        Notify = GpeEventInfo->Dispatch.NotifyList;
> +                        while (Notify)
> +                        {
> +                            Count++;
> +                            Notify = Notify->Next;
> +                        }
> +                        AcpiOsPrintf ("Implicit Notify on %u devices", Count);
>                          break;
>                      default:
>                          AcpiOsPrintf ("UNKNOWN: %X",
> diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
> index eb85998..174f77a 100644
> --- a/src/acpica/source/components/debugger/dbexec.c
> +++ b/src/acpica/source/components/debugger/dbexec.c
> @@ -944,8 +944,8 @@ AcpiDbMethodThread (
>
>      if (Info->InitArgs)
>      {
> -        AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
> -        AcpiDbUInt32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
> +        AcpiDbUint32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
> +        AcpiDbUint32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
>      }
>
>      if (Info->Threads && (Info->NumCreated < Info->NumThreads))
> @@ -1135,7 +1135,7 @@ AcpiDbCreateExecutionThreads (
>      AcpiGbl_DbMethodInfo.ArgTypes[1] = ACPI_TYPE_INTEGER;
>      AcpiGbl_DbMethodInfo.ArgTypes[2] = ACPI_TYPE_INTEGER;
>
> -    AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
> +    AcpiDbUint32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
>
>      AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
>
> diff --git a/src/acpica/source/components/debugger/dbfileio.c b/src/acpica/source/components/debugger/dbfileio.c
> index 495d609..8e36c87 100644
> --- a/src/acpica/source/components/debugger/dbfileio.c
> +++ b/src/acpica/source/components/debugger/dbfileio.c
> @@ -123,6 +123,10 @@
>  #include "actables.h"
>  #endif
>
> +#ifdef ACPI_ASL_COMPILER
> +#include "aslcompiler.h"
> +#endif
> +
>  #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
>
>  #define _COMPONENT          ACPI_CA_DEBUGGER
> @@ -381,6 +385,15 @@ AcpiDbReadTable (
>              AcpiOsPrintf (
>                  "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
>                  TableHeader.Length, FileSize);
> +
> +#ifdef ACPI_ASL_COMPILER
> +            Status = FlCheckForAscii (fp, NULL, FALSE);
> +            if (ACPI_SUCCESS (Status))
> +            {
> +                AcpiOsPrintf ("File appears to be ASCII only, must be binary\n",
> +                    TableHeader.Length, FileSize);
> +            }
> +#endif
>              return (AE_BAD_HEADER);
>          }
>
> diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
> index 3e61bdb..1b2ee1d 100644
> --- a/src/acpica/source/components/debugger/dbinput.c
> +++ b/src/acpica/source/components/debugger/dbinput.c
> @@ -322,7 +322,7 @@ AcpiDbDisplayHelp (
>      AcpiOsPrintf ("     Stack                            Display CPU stack usage\n");
>      AcpiOsPrintf ("     Tables                           Info about current ACPI table(s)\n");
>      AcpiOsPrintf ("  Tables                              Display info about loaded ACPI tables\n");
> -    AcpiOsPrintf ("  Unload <TableSig> [Instance]        Unload an ACPI table\n");
> +    AcpiOsPrintf ("  Unload <Namepath>                   Unload an ACPI table via namespace object\n");
>      AcpiOsPrintf ("  ! <CommandNumber>                   Execute command from history buffer\n");
>      AcpiOsPrintf ("  !!                                  Execute last command again\n");
>
> @@ -966,7 +966,7 @@ AcpiDbCommandDispatch (
>          break;
>
>      case CMD_UNLOAD:
> -        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
> +        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]);
>          break;
>
>      case CMD_EXIT:
> diff --git a/src/acpica/source/components/debugger/dbstats.c b/src/acpica/source/components/debugger/dbstats.c
> index 8a6e713..e309668 100644
> --- a/src/acpica/source/components/debugger/dbstats.c
> +++ b/src/acpica/source/components/debugger/dbstats.c
> @@ -299,8 +299,8 @@ AcpiDbEnumerateObject (
>
>      case ACPI_TYPE_DEVICE:
>
> -        AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[1]);
>          AcpiDbEnumerateObject (ObjDesc->Device.Handler);
>          break;
>
> @@ -320,21 +320,21 @@ AcpiDbEnumerateObject (
>
>      case ACPI_TYPE_POWER:
>
> -        AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[1]);
>          break;
>
>      case ACPI_TYPE_PROCESSOR:
>
> -        AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[1]);
>          AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
>          break;
>
>      case ACPI_TYPE_THERMAL:
>
> -        AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
> -        AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
> +        AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[0]);
> +        AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[1]);
>          AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
>          break;
>
> @@ -594,6 +594,18 @@ AcpiDbDisplayStatistics (
>          AcpiOsPrintf ("NamespaceNode    %3d\n", sizeof (ACPI_NAMESPACE_NODE));
>          AcpiOsPrintf ("AcpiObject       %3d\n", sizeof (ACPI_OBJECT));
>
> +        AcpiOsPrintf ("\n");
> +
> +        AcpiOsPrintf ("Generic State    %3d\n", sizeof (ACPI_GENERIC_STATE));
> +        AcpiOsPrintf ("Common State     %3d\n", sizeof (ACPI_COMMON_STATE));
> +        AcpiOsPrintf ("Control State    %3d\n", sizeof (ACPI_CONTROL_STATE));
> +        AcpiOsPrintf ("Update State     %3d\n", sizeof (ACPI_UPDATE_STATE));
> +        AcpiOsPrintf ("Scope State      %3d\n", sizeof (ACPI_SCOPE_STATE));
> +        AcpiOsPrintf ("Parse Scope      %3d\n", sizeof (ACPI_PSCOPE_STATE));
> +        AcpiOsPrintf ("Package State    %3d\n", sizeof (ACPI_PKG_STATE));
> +        AcpiOsPrintf ("Thread State     %3d\n", sizeof (ACPI_THREAD_STATE));
> +        AcpiOsPrintf ("Result Values    %3d\n", sizeof (ACPI_RESULT_VALUES));
> +        AcpiOsPrintf ("Notify Info      %3d\n", sizeof (ACPI_NOTIFY_INFO));
>          break;
>
>
> diff --git a/src/acpica/source/components/debugger/dbutils.c b/src/acpica/source/components/debugger/dbutils.c
> index fd318d9..f913c64 100644
> --- a/src/acpica/source/components/debugger/dbutils.c
> +++ b/src/acpica/source/components/debugger/dbutils.c
> @@ -432,7 +432,7 @@ AcpiDbLocalNsLookup (
>
>  /*******************************************************************************
>   *
> - * FUNCTION:    AcpiDbUInt32ToHexString
> + * FUNCTION:    AcpiDbUint32ToHexString
>   *
>   * PARAMETERS:  Value           - The value to be converted to string
>   *              Buffer          - Buffer for result (not less than 11 bytes)
> @@ -447,7 +447,7 @@ AcpiDbLocalNsLookup (
>   ******************************************************************************/
>
>  void
> -AcpiDbUInt32ToHexString (
> +AcpiDbUint32ToHexString (
>      UINT32                  Value,
>      char                    *Buffer)
>  {
> diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
> index ed457ed..252b1b8 100644
> --- a/src/acpica/source/components/disassembler/dmopcode.c
> +++ b/src/acpica/source/components/disassembler/dmopcode.c
> @@ -118,6 +118,7 @@
>  #include "acparser.h"
>  #include "amlcode.h"
>  #include "acdisasm.h"
> +#include "acnamesp.h"
>
>  #ifdef ACPI_DISASSEMBLER
>
> @@ -133,6 +134,218 @@ AcpiDmMatchKeyword (
>
>  /*******************************************************************************
>   *
> + * FUNCTION:    AcpiDmPredefinedDescription
> + *
> + * PARAMETERS:  Op              - Name() parse object
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Emit a description comment for a predefined ACPI name.
> + *              Used for iASL compiler only.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +#ifdef ACPI_ASL_COMPILER
> +    const AH_PREDEFINED_NAME    *Info;
> +    char                        *NameString;
> +    int                         LastCharIsDigit;
> +    int                         LastCharsAreHex;
> +
> +
> +    if (!Op)
> +    {
> +        return;
> +    }
> +
> +    /* Ensure that the comment field is emitted only once */
> +
> +    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
> +    {
> +        return;
> +    }
> +    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
> +
> +    /* Predefined name must start with an underscore */
> +
> +    NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
> +    if (NameString[0] != '_')
> +    {
> +        return;
> +    }
> +
> +    /*
> +     * Check for the special ACPI names:
> +     * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
> +     * (where d=decimal_digit, x=hex_digit, a=anything)
> +     *
> +     * Convert these to the generic name for table lookup.
> +     * Note: NameString is guaranteed to be upper case here.
> +     */
> +    LastCharIsDigit =
> +        (ACPI_IS_DIGIT (NameString[3]));    /* d */
> +    LastCharsAreHex =
> +        (ACPI_IS_XDIGIT (NameString[2]) &&  /* xx */
> +         ACPI_IS_XDIGIT (NameString[3]));
> +
> +    switch (NameString[1])
> +    {
> +    case 'A':
> +        if ((NameString[2] == 'C') && (LastCharIsDigit))
> +        {
> +            NameString = "_ACx";
> +        }
> +        else if ((NameString[2] == 'L') && (LastCharIsDigit))
> +        {
> +            NameString = "_ALx";
> +        }
> +        break;
> +
> +    case 'E':
> +        if ((NameString[2] == 'J') && (LastCharIsDigit))
> +        {
> +            NameString = "_EJx";
> +        }
> +        else if (LastCharsAreHex)
> +        {
> +            NameString = "_Exx";
> +        }
> +        break;
> +
> +    case 'L':
> +        if (LastCharsAreHex)
> +        {
> +            NameString = "_Lxx";
> +        }
> +        break;
> +
> +    case 'Q':
> +        if (LastCharsAreHex)
> +        {
> +            NameString = "_Qxx";
> +        }
> +        break;
> +
> +    case 'T':
> +        if (NameString[2] == '_')
> +        {
> +            NameString = "_T_x";
> +        }
> +        break;
> +
> +    case 'W':
> +        if (LastCharsAreHex)
> +        {
> +            NameString = "_Wxx";
> +        }
> +        break;
> +
> +    default:
> +        break;
> +    }
> +
> +    /* Match the name in the info table */
> +
> +    for (Info = AslPredefinedInfo; Info->Name; Info++)
> +    {
> +        if (ACPI_COMPARE_NAME (NameString, Info->Name))
> +        {
> +            AcpiOsPrintf ("  // %4.4s: %s",
> +                NameString, ACPI_CAST_PTR (char, Info->Description));
> +            return;
> +        }
> +    }
> +
> +#endif
> +    return;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmFieldPredefinedDescription
> + *
> + * PARAMETERS:  Op              - Parse object
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Emit a description comment for a resource descriptor tag
> + *              (which is a predefined ACPI name.) Used for iASL compiler only.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmFieldPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +#ifdef ACPI_ASL_COMPILER
> +    ACPI_PARSE_OBJECT       *IndexOp;
> +    char                    *Tag;
> +    const ACPI_OPCODE_INFO  *OpInfo;
> +    const AH_PREDEFINED_NAME *Info;
> +
> +
> +    if (!Op)
> +    {
> +        return;
> +    }
> +
> +    /* Ensure that the comment field is emitted only once */
> +
> +    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
> +    {
> +        return;
> +    }
> +    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
> +
> +    /*
> +     * Op must be one of the Create* operators: CreateField, CreateBitField,
> +     * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
> +     */
> +    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
> +    if (!(OpInfo->Flags & AML_CREATE))
> +    {
> +        return;
> +    }
> +
> +    /* Second argument is the Index argument */
> +
> +    IndexOp = Op->Common.Value.Arg;
> +    IndexOp = IndexOp->Common.Next;
> +
> +    /* Index argument must be a namepath */
> +
> +    if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
> +    {
> +        return;
> +    }
> +
> +    /* Major cheat: We previously put the Tag ptr in the Node field */
> +
> +    Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
> +
> +    /* Match the name in the info table */
> +
> +    for (Info = AslPredefinedInfo; Info->Name; Info++)
> +    {
> +        if (ACPI_COMPARE_NAME (Tag, Info->Name))
> +        {
> +            AcpiOsPrintf ("  // %4.4s: %s", Tag,
> +                ACPI_CAST_PTR (char, Info->Description));
> +            return;
> +        }
> +    }
> +
> +#endif
> +    return;
> +}
> +
> +
> +/*******************************************************************************
> + *
>   * FUNCTION:    AcpiDmMethodFlags
>   *
>   * PARAMETERS:  Op              - Method Object to be examined
> diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
> index 2bec308..dd655d8 100644
> --- a/src/acpica/source/components/disassembler/dmwalk.c
> +++ b/src/acpica/source/components/disassembler/dmwalk.c
> @@ -525,7 +525,7 @@ AcpiDmDescendingOp (
>       * keep track of the current column.
>       */
>      Info->Count++;
> -    if (Info->Count /*+Info->LastLevel*/ > 10)
> +    if (Info->Count /* +Info->LastLevel */ > 10)
>      {
>          Info->Count = 0;
>          AcpiOsPrintf ("\n");
> @@ -605,6 +605,10 @@ AcpiDmDescendingOp (
>
>                  AcpiDmMethodFlags (Op);
>                  AcpiOsPrintf (")");
> +
> +                /* Emit description comment for Method() with a predefined ACPI name */
> +
> +                AcpiDmPredefinedDescription (Op);
>                  break;
>
>
> @@ -675,7 +679,8 @@ AcpiDmDescendingOp (
>
>              default:
>
> -                AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode);
> +                AcpiOsPrintf ("*** Unhandled named opcode %X\n",
> +                    Op->Common.AmlOpcode);
>                  break;
>              }
>          }
> @@ -716,7 +721,8 @@ AcpiDmDescendingOp (
>                  NextOp = NextOp->Common.Next;
>
>                  Info->Flags = ACPI_PARSEOP_PARAMLIST;
> -                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info);
> +                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp,
> +                    AcpiDmAscendingOp, Info);
>                  Info->Flags = 0;
>                  Info->Level = Level;
>
> @@ -758,12 +764,18 @@ AcpiDmDescendingOp (
>              if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
>              {
>                  /*
> -                 * We have a resource list.  Don't need to output
> -                 * the buffer size Op.  Open up a new block
> +                 * We have a resource list. Don't need to output
> +                 * the buffer size Op. Open up a new block
>                   */
>                  NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
>                  NextOp = NextOp->Common.Next;
> -                AcpiOsPrintf (")\n");
> +                AcpiOsPrintf (")");
> +
> +                /* Emit description comment for Name() with a predefined ACPI name */
> +
> +                AcpiDmPredefinedDescription (Op->Asl.Parent);
> +
> +                AcpiOsPrintf ("\n");
>                  AcpiDmIndent (Info->Level);
>                  AcpiOsPrintf ("{\n");
>                  return (AE_OK);
> @@ -791,7 +803,7 @@ AcpiDmDescendingOp (
>
>          case AML_PACKAGE_OP:
>
> -            /* The next op is the size or predicate parameter */
> +            /* The next op is the size parameter */
>
>              NextOp = AcpiPsGetDepthNext (NULL, Op);
>              if (NextOp)
> @@ -844,6 +856,7 @@ AcpiDmAscendingOp (
>      void                    *Context)
>  {
>      ACPI_OP_WALK_INFO       *Info = Context;
> +    ACPI_PARSE_OBJECT       *ParentOp;
>
>
>      if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
> @@ -869,6 +882,19 @@ AcpiDmAscendingOp (
>
>          AcpiOsPrintf (")");
>
> +        if (Op->Common.AmlOpcode == AML_NAME_OP)
> +        {
> +            /* Emit description comment for Name() with a predefined ACPI name */
> +
> +            AcpiDmPredefinedDescription (Op);
> +        }
> +        else
> +        {
> +            /* For Create* operators, attempt to emit resource tag description */
> +
> +            AcpiDmFieldPredefinedDescription (Op);
> +        }
> +
>          /* Could be a nested operator, check if comma required */
>
>          if (!AcpiDmCommaIfListMember (Op))
> @@ -983,7 +1009,20 @@ AcpiDmAscendingOp (
>           */
>          if (Op->Common.Next)
>          {
> -            AcpiOsPrintf (")\n");
> +            AcpiOsPrintf (")");
> +
> +            /* Emit description comment for Name() with a predefined ACPI name */
> +
> +            ParentOp = Op->Common.Parent;
> +            if (ParentOp)
> +            {
> +                ParentOp = ParentOp->Common.Parent;
> +                if (ParentOp && ParentOp->Asl.AmlOpcode == AML_NAME_OP)
> +                {
> +                    AcpiDmPredefinedDescription (ParentOp);
> +                }
> +            }
> +            AcpiOsPrintf ("\n");
>              AcpiDmIndent (Level - 1);
>              AcpiOsPrintf ("{\n");
>          }
> diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index 526d478..3047c5f 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/source/components/dispatcher/dsfield.c
> @@ -129,6 +129,18 @@
>
>  /* Local prototypes */
>
> +#ifdef ACPI_ASL_COMPILER
> +#include "acdisasm.h"
> +
> +static ACPI_STATUS
> +AcpiDsCreateExternalRegion (
> +    ACPI_STATUS             LookupStatus,
> +    ACPI_PARSE_OBJECT       *Op,
> +    char                    *Path,
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_NAMESPACE_NODE     **Node);
> +#endif
> +
>  static ACPI_STATUS
>  AcpiDsGetFieldNames (
>      ACPI_CREATE_FIELD_INFO  *Info,
> @@ -136,6 +148,69 @@ AcpiDsGetFieldNames (
>      ACPI_PARSE_OBJECT       *Arg);
>
>
> +#ifdef ACPI_ASL_COMPILER
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDsCreateExternalRegion (iASL Disassembler only)
> + *
> + * PARAMETERS:  LookupStatus    - Status from NsLookup operation
> + *              Op              - Op containing the Field definition and args
> + *              Path            - Pathname of the region
> + *  `           WalkState       - Current method state
> + *              Node            - Where the new region node is returned
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
> + *              region node/object.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDsCreateExternalRegion (
> +    ACPI_STATUS             LookupStatus,
> +    ACPI_PARSE_OBJECT       *Op,
> +    char                    *Path,
> +    ACPI_WALK_STATE         *WalkState,
> +    ACPI_NAMESPACE_NODE     **Node)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_OPERAND_OBJECT     *ObjDesc;
> +
> +
> +    if (LookupStatus != AE_NOT_FOUND)
> +    {
> +        return (LookupStatus);
> +    }
> +
> +    /*
> +     * Table disassembly:
> +     * OperationRegion not found. Generate an External for it, and
> +     * insert the name into the namespace.
> +     */
> +    AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_REGION, 0);
> +    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
> +       ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +
> +    /* Must create and install a region object for the new node */
> +
> +    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> +    if (!ObjDesc)
> +    {
> +        return (AE_NO_MEMORY);
> +    }
> +
> +    ObjDesc->Region.Node = *Node;
> +    Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION);
> +    return (Status);
> +}
> +#endif
> +
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    AcpiDsCreateBufferField
> @@ -149,8 +224,8 @@ AcpiDsGetFieldNames (
>   *              CreateBitFieldOp,
>   *              CreateByteFieldOp,
>   *              CreateWordFieldOp,
> - *              CreateDWordFieldOp,
> - *              CreateQWordFieldOp,
> + *              CreateDwordFieldOp,
> + *              CreateQwordFieldOp,
>   *              CreateFieldOp       (all of which define a field in a buffer)
>   *
>   ******************************************************************************/
> @@ -510,11 +585,16 @@ AcpiDsCreateField (
>      /* First arg is the name of the parent OpRegion (must already exist) */
>
>      Arg = Op->Common.Value.Arg;
> +
>      if (!RegionNode)
>      {
>          Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
>                          ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
>                          ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
> +#ifdef ACPI_ASL_COMPILER
> +        Status = AcpiDsCreateExternalRegion (Status, Arg,
> +            Arg->Common.Value.Name, WalkState, &RegionNode);
> +#endif
>          if (ACPI_FAILURE (Status))
>          {
>              ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
> @@ -700,6 +780,10 @@ AcpiDsCreateBankField (
>          Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
>                          ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
>                          ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
> +#ifdef ACPI_ASL_COMPILER
> +        Status = AcpiDsCreateExternalRegion (Status, Arg,
> +            Arg->Common.Value.Name, WalkState, &RegionNode);
> +#endif
>          if (ACPI_FAILURE (Status))
>          {
>              ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index 5da09bd..d6ddbfa 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -595,18 +595,18 @@ AcpiDsEvalTableRegionOperands (
>
>
>      /*
> -     * This is where we evaluate the SignatureString and OemIDString
> -     * and OemTableIDString of the DataTableRegion declaration
> +     * This is where we evaluate the Signature string, OemId string,
> +     * and OemTableId string of the Data Table Region declaration
>       */
>      Node =  Op->Common.Node;
>
> -    /* NextOp points to SignatureString op */
> +    /* NextOp points to Signature string op */
>
>      NextOp = Op->Common.Value.Arg;
>
>      /*
> -     * Evaluate/create the SignatureString and OemIDString
> -     * and OemTableIDString operands
> +     * Evaluate/create the Signature string, OemId string,
> +     * and OemTableId string operands
>       */
>      Status = AcpiDsCreateOperands (WalkState, NextOp);
>      if (ACPI_FAILURE (Status))
> @@ -615,8 +615,8 @@ AcpiDsEvalTableRegionOperands (
>      }
>
>      /*
> -     * Resolve the SignatureString and OemIDString
> -     * and OemTableIDString operands
> +     * Resolve the Signature string, OemId string,
> +     * and OemTableId string operands
>       */
>      Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
>                  ACPI_WALK_OPERANDS, WalkState);
> diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
> index 1f689d6..7a4a84f 100644
> --- a/src/acpica/source/components/dispatcher/dswload.c
> +++ b/src/acpica/source/components/dispatcher/dswload.c
> @@ -313,6 +313,20 @@ AcpiDsLoad1BeginOp (
>              WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
>              break;
>
> +        case ACPI_TYPE_METHOD:
> +
> +            /*
> +             * Allow scope change to root during execution of module-level
> +             * code. Root is typed METHOD during this time.
> +             */
> +            if ((Node == AcpiGbl_RootNode) &&
> +                (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
> +            {
> +                break;
> +            }
> +
> +            /*lint -fallthrough */
> +
>          default:
>
>              /* All other types are an error */
> diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c
> index 85a86ec..139ff95 100644
> --- a/src/acpica/source/components/dispatcher/dswload2.c
> +++ b/src/acpica/source/components/dispatcher/dswload2.c
> @@ -315,6 +315,20 @@ AcpiDsLoad2BeginOp (
>              WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
>              break;
>
> +        case ACPI_TYPE_METHOD:
> +
> +            /*
> +             * Allow scope change to root during execution of module-level
> +             * code. Root is typed METHOD during this time.
> +             */
> +            if ((Node == AcpiGbl_RootNode) &&
> +                (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
> +            {
> +                break;
> +            }
> +
> +            /*lint -fallthrough */
> +
>          default:
>
>              /* All other types are an error */
> diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
> index de32275..bb72a6e 100644
> --- a/src/acpica/source/components/events/evgpe.c
> +++ b/src/acpica/source/components/events/evgpe.c
> @@ -590,6 +590,7 @@ AcpiEvAsynchExecuteGpeMethod (
>      ACPI_STATUS             Status;
>      ACPI_GPE_EVENT_INFO     *LocalGpeEventInfo;
>      ACPI_EVALUATE_INFO      *Info;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
>
>
>      ACPI_FUNCTION_TRACE (EvAsynchExecuteGpeMethod);
> @@ -645,10 +646,18 @@ AcpiEvAsynchExecuteGpeMethod (
>           * completes. The notify handlers are NOT invoked synchronously
>           * from this thread -- because handlers may in turn run other
>           * control methods.
> +         *
> +         * June 2012: Expand implicit notify mechanism to support
> +         * notifies on multiple device objects.
>           */
> -        Status = AcpiEvQueueNotifyRequest (
> -                    LocalGpeEventInfo->Dispatch.DeviceNode,
> -                    ACPI_NOTIFY_DEVICE_WAKE);
> +        Notify = LocalGpeEventInfo->Dispatch.NotifyList;
> +        while (ACPI_SUCCESS (Status) && Notify)
> +        {
> +            Status = AcpiEvQueueNotifyRequest (Notify->DeviceNode,
> +                        ACPI_NOTIFY_DEVICE_WAKE);
> +
> +            Notify = Notify->Next;
> +        }
>          break;
>
>      case ACPI_GPE_DISPATCH_METHOD:
> diff --git a/src/acpica/source/components/events/evgpeutil.c b/src/acpica/source/components/events/evgpeutil.c
> index a5ad320..38c7928 100644
> --- a/src/acpica/source/components/events/evgpeutil.c
> +++ b/src/acpica/source/components/events/evgpeutil.c
> @@ -463,6 +463,8 @@ AcpiEvDeleteGpeHandlers (
>      void                    *Context)
>  {
>      ACPI_GPE_EVENT_INFO     *GpeEventInfo;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
> +    ACPI_GPE_NOTIFY_INFO    *Next;
>      UINT32                  i;
>      UINT32                  j;
>
> @@ -484,10 +486,27 @@ AcpiEvDeleteGpeHandlers (
>              if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
>                      ACPI_GPE_DISPATCH_HANDLER)
>              {
> +                /* Delete an installed handler block */
> +
>                  ACPI_FREE (GpeEventInfo->Dispatch.Handler);
>                  GpeEventInfo->Dispatch.Handler = NULL;
>                  GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
>              }
> +            else if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> +                    ACPI_GPE_DISPATCH_NOTIFY)
> +            {
> +                /* Delete the implicit notification device list */
> +
> +                Notify = GpeEventInfo->Dispatch.NotifyList;
> +                while (Notify)
> +                {
> +                    Next = Notify->Next;
> +                    ACPI_FREE (Notify);
> +                    Notify = Next;
> +                }
> +                GpeEventInfo->Dispatch.NotifyList = NULL;
> +                GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
> +            }
>          }
>      }
>
> diff --git a/src/acpica/source/components/events/evmisc.c b/src/acpica/source/components/events/evmisc.c
> index 7369daa..ae3cecd 100644
> --- a/src/acpica/source/components/events/evmisc.c
> +++ b/src/acpica/source/components/events/evmisc.c
> @@ -183,107 +183,82 @@ AcpiEvQueueNotifyRequest (
>      UINT32                  NotifyValue)
>  {
>      ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_OPERAND_OBJECT     *HandlerObj = NULL;
> -    ACPI_GENERIC_STATE      *NotifyInfo;
> +    ACPI_OPERAND_OBJECT     *HandlerListHead = NULL;
> +    ACPI_GENERIC_STATE      *Info;
> +    UINT8                   HandlerListId = 0;
>      ACPI_STATUS             Status = AE_OK;
>
>
>      ACPI_FUNCTION_NAME (EvQueueNotifyRequest);
>
>
> -    /*
> -     * For value 0x03 (Ejection Request), may need to run a device method.
> -     * For value 0x02 (Device Wake), if _PRW exists, may need to run
> -     *   the _PS0 method.
> -     * For value 0x80 (Status Change) on the power button or sleep button,
> -     *   initiate soft-off or sleep operation.
> -     *
> -     * For all cases, simply dispatch the notify to the handler.
> -     */
> -    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -        "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
> -        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
> -        NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
> +    /* Are Notifies allowed on this object? */
>
> -    /* Get the notify object attached to the NS Node */
> -
> -    ObjDesc = AcpiNsGetAttachedObject (Node);
> -    if (ObjDesc)
> +    if (!AcpiEvIsNotifyObject (Node))
>      {
> -        /* We have the notify object, Get the correct handler */
> -
> -        switch (Node->Type)
> -        {
> -        /* Notify is allowed only on these types */
> +        return (AE_TYPE);
> +    }
>
> -        case ACPI_TYPE_DEVICE:
> -        case ACPI_TYPE_THERMAL:
> -        case ACPI_TYPE_PROCESSOR:
> +    /* Get the correct notify list type (System or Device) */
>
> -            if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
> -            {
> -                HandlerObj = ObjDesc->CommonNotify.SystemNotify;
> -            }
> -            else
> -            {
> -                HandlerObj = ObjDesc->CommonNotify.DeviceNotify;
> -            }
> -            break;
> +    if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
> +    {
> +        HandlerListId = ACPI_SYSTEM_HANDLER_LIST;
> +    }
> +    else
> +    {
> +        HandlerListId = ACPI_DEVICE_HANDLER_LIST;
> +    }
>
> -        default:
> +    /* Get the notify object attached to the namespace Node */
>
> -            /* All other types are not supported */
> +    ObjDesc = AcpiNsGetAttachedObject (Node);
> +    if (ObjDesc)
> +    {
> +        /* We have an attached object, Get the correct handler list */
>
> -            return (AE_TYPE);
> -        }
> +        HandlerListHead = ObjDesc->CommonNotify.NotifyList[HandlerListId];
>      }
>
>      /*
> -     * If there is a handler to run, schedule the dispatcher.
> -     * Check for:
> -     * 1) Global system notify handler
> -     * 2) Global device notify handler
> -     * 3) Per-device notify handler
> +     * If there is no notify handler (Global or Local)
> +     * for this object, just ignore the notify
>       */
> -    if ((AcpiGbl_SystemNotify.Handler &&
> -            (NotifyValue <= ACPI_MAX_SYS_NOTIFY)) ||
> -        (AcpiGbl_DeviceNotify.Handler &&
> -            (NotifyValue > ACPI_MAX_SYS_NOTIFY))  ||
> -        HandlerObj)
> +    if (!AcpiGbl_GlobalNotify[HandlerListId].Handler && !HandlerListHead)
>      {
> -        NotifyInfo = AcpiUtCreateGenericState ();
> -        if (!NotifyInfo)
> -        {
> -            return (AE_NO_MEMORY);
> -        }
> +        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +            "No notify handler for Notify, ignoring (%4.4s, %X) node %p\n",
> +            AcpiUtGetNodeName (Node), NotifyValue, Node));
>
> -        if (!HandlerObj)
> -        {
> -            ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -                "Executing system notify handler for Notify (%4.4s, %X) "
> -                "node %p\n",
> -                AcpiUtGetNodeName (Node), NotifyValue, Node));
> -        }
> +        return (AE_OK);
> +    }
>
> -        NotifyInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
> -        NotifyInfo->Notify.Node = Node;
> -        NotifyInfo->Notify.Value = (UINT16) NotifyValue;
> -        NotifyInfo->Notify.HandlerObj = HandlerObj;
> +    /* Setup notify info and schedule the notify dispatcher */
>
> -        Status = AcpiOsExecute (
> -                    OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, NotifyInfo);
> -        if (ACPI_FAILURE (Status))
> -        {
> -            AcpiUtDeleteGenericState (NotifyInfo);
> -        }
> -    }
> -    else
> +    Info = AcpiUtCreateGenericState ();
> +    if (!Info)
>      {
> -        /* There is no notify handler (per-device or system) for this device */
> +        return (AE_NO_MEMORY);
> +    }
>
> -        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -            "No notify handler for Notify (%4.4s, %X) node %p\n",
> -            AcpiUtGetNodeName (Node), NotifyValue, Node));
> +    Info->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
> +
> +    Info->Notify.Node = Node;
> +    Info->Notify.Value = (UINT16) NotifyValue;
> +    Info->Notify.HandlerListId = HandlerListId;
> +    Info->Notify.HandlerListHead = HandlerListHead;
> +    Info->Notify.Global = &AcpiGbl_GlobalNotify[HandlerListId];
> +
> +    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +        "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
> +        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
> +        NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
> +
> +    Status = AcpiOsExecute (OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch,
> +        Info);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        AcpiUtDeleteGenericState (Info);
>      }
>
>      return (Status);
> @@ -307,61 +282,37 @@ static void ACPI_SYSTEM_XFACE
>  AcpiEvNotifyDispatch (
>      void                    *Context)
>  {
> -    ACPI_GENERIC_STATE      *NotifyInfo = (ACPI_GENERIC_STATE *) Context;
> -    ACPI_NOTIFY_HANDLER     GlobalHandler = NULL;
> -    void                    *GlobalContext = NULL;
> +    ACPI_GENERIC_STATE      *Info = (ACPI_GENERIC_STATE *) Context;
>      ACPI_OPERAND_OBJECT     *HandlerObj;
>
>
>      ACPI_FUNCTION_ENTRY ();
>
>
> -    /*
> -     * We will invoke a global notify handler if installed. This is done
> -     * _before_ we invoke the per-device handler attached to the device.
> -     */
> -    if (NotifyInfo->Notify.Value <= ACPI_MAX_SYS_NOTIFY)
> -    {
> -        /* Global system notification handler */
> +    /* Invoke a global notify handler if installed */
>
> -        if (AcpiGbl_SystemNotify.Handler)
> -        {
> -            GlobalHandler = AcpiGbl_SystemNotify.Handler;
> -            GlobalContext = AcpiGbl_SystemNotify.Context;
> -        }
> -    }
> -    else
> +    if (Info->Notify.Global->Handler)
>      {
> -        /* Global driver notification handler */
> -
> -        if (AcpiGbl_DeviceNotify.Handler)
> -        {
> -            GlobalHandler = AcpiGbl_DeviceNotify.Handler;
> -            GlobalContext = AcpiGbl_DeviceNotify.Context;
> -        }
> +        Info->Notify.Global->Handler (Info->Notify.Node,
> +            Info->Notify.Value,
> +            Info->Notify.Global->Context);
>      }
>
> -    /* Invoke the system handler first, if present */
> +    /* Now invoke the local notify handler(s) if any are installed */
>
> -    if (GlobalHandler)
> +    HandlerObj = Info->Notify.HandlerListHead;
> +    while (HandlerObj)
>      {
> -        GlobalHandler (NotifyInfo->Notify.Node, NotifyInfo->Notify.Value,
> -            GlobalContext);
> -    }
> -
> -    /* Now invoke the per-device handler, if present */
> -
> -    HandlerObj = NotifyInfo->Notify.HandlerObj;
> -    if (HandlerObj)
> -    {
> -        HandlerObj->Notify.Handler (NotifyInfo->Notify.Node,
> -            NotifyInfo->Notify.Value,
> +        HandlerObj->Notify.Handler (Info->Notify.Node,
> +            Info->Notify.Value,
>              HandlerObj->Notify.Context);
> +
> +        HandlerObj = HandlerObj->Notify.Next[Info->Notify.HandlerListId];
>      }
>
>      /* All done with the info object */
>
> -    AcpiUtDeleteGenericState (NotifyInfo);
> +    AcpiUtDeleteGenericState (Info);
>  }
>
>
> diff --git a/src/acpica/source/components/events/evxface.c b/src/acpica/source/components/events/evxface.c
> index a6aea09..b0c5ce3 100644
> --- a/src/acpica/source/components/events/evxface.c
> +++ b/src/acpica/source/components/events/evxface.c
> @@ -132,15 +132,21 @@
>   *
>   * PARAMETERS:  Device          - The device for which notifies will be handled
>   *              HandlerType     - The type of handler:
> - *                                  ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
> - *                                  ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
> - *                                  ACPI_ALL_NOTIFY:  both system and device
> + *                                  ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
> + *                                  ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
> + *                                  ACPI_ALL_NOTIFY:    Both System and Device
>   *              Handler         - Address of the handler
>   *              Context         - Value passed to the handler on each GPE
>   *
>   * RETURN:      Status
>   *
> - * DESCRIPTION: Install a handler for notifies on an ACPI device
> + * DESCRIPTION: Install a handler for notifications on an ACPI Device,
> + *              ThermalZone, or Processor object.
> + *
> + * NOTES:       The Root namespace object may have only one handler for each
> + *              type of notify (System/Device). Device/Thermal/Processor objects
> + *              may have one device notify handler, and multiple system notify
> + *              handlers.
>   *
>   ******************************************************************************/
>
> @@ -151,10 +157,11 @@ AcpiInstallNotifyHandler (
>      ACPI_NOTIFY_HANDLER     Handler,
>      void                    *Context)
>  {
> +    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
>      ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_OPERAND_OBJECT     *NotifyObj;
> -    ACPI_NAMESPACE_NODE     *Node;
> +    ACPI_OPERAND_OBJECT     *HandlerObj;
>      ACPI_STATUS             Status;
> +    UINT32                  i;
>
>
>      ACPI_FUNCTION_TRACE (AcpiInstallNotifyHandler);
> @@ -162,8 +169,7 @@ AcpiInstallNotifyHandler (
>
>      /* Parameter validation */
>
> -    if ((!Device)  ||
> -        (!Handler) ||
> +    if ((!Device) || (!Handler) || (!HandlerType) ||
>          (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
>      {
>          return_ACPI_STATUS (AE_BAD_PARAMETER);
> @@ -175,135 +181,124 @@ AcpiInstallNotifyHandler (
>          return_ACPI_STATUS (Status);
>      }
>
> -    /* Convert and validate the device handle */
> -
> -    Node = AcpiNsValidateHandle (Device);
> -    if (!Node)
> -    {
> -        Status = AE_BAD_PARAMETER;
> -        goto UnlockAndExit;
> -    }
> -
>      /*
>       * Root Object:
>       * Registering a notify handler on the root object indicates that the
>       * caller wishes to receive notifications for all objects. Note that
> -     * only one <external> global handler can be regsitered (per notify type).
> +     * only one global handler can be registered per notify type.
> +     * Ensure that a handler is not already installed.
>       */
>      if (Device == ACPI_ROOT_OBJECT)
>      {
> -        /* Make sure the handler is not already installed */
> -
> -        if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> -                AcpiGbl_SystemNotify.Handler)       ||
> -            ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> -                AcpiGbl_DeviceNotify.Handler))
> -        {
> -            Status = AE_ALREADY_EXISTS;
> -            goto UnlockAndExit;
> -        }
> -
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> -        {
> -            AcpiGbl_SystemNotify.Node    = Node;
> -            AcpiGbl_SystemNotify.Handler = Handler;
> -            AcpiGbl_SystemNotify.Context = Context;
> -        }
> -
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> +        for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
>          {
> -            AcpiGbl_DeviceNotify.Node    = Node;
> -            AcpiGbl_DeviceNotify.Handler = Handler;
> -            AcpiGbl_DeviceNotify.Context = Context;
> +            if (HandlerType & (i+1))
> +            {
> +                if (AcpiGbl_GlobalNotify[i].Handler)
> +                {
> +                    Status = AE_ALREADY_EXISTS;
> +                    goto UnlockAndExit;
> +                }
> +
> +                AcpiGbl_GlobalNotify[i].Handler = Handler;
> +                AcpiGbl_GlobalNotify[i].Context = Context;
> +            }
>          }
>
> -        /* Global notify handler installed */
> +        goto UnlockAndExit; /* Global notify handler installed, all done */
>      }
>
>      /*
>       * All Other Objects:
> -     * Caller will only receive notifications specific to the target object.
> -     * Note that only certain object types can receive notifications.
> +     * Caller will only receive notifications specific to the target
> +     * object. Note that only certain object types are allowed to
> +     * receive notifications.
>       */
> -    else
> +
> +    /* Are Notifies allowed on this object? */
> +
> +    if (!AcpiEvIsNotifyObject (Node))
> +    {
> +        Status = AE_TYPE;
> +        goto UnlockAndExit;
> +    }
> +
> +    /* Check for an existing internal object, might not exist */
> +
> +    ObjDesc = AcpiNsGetAttachedObject (Node);
> +    if (!ObjDesc)
>      {
> -        /* Notifies allowed on this object? */
> +        /* Create a new object */
>
> -        if (!AcpiEvIsNotifyObject (Node))
> +        ObjDesc = AcpiUtCreateInternalObject (Node->Type);
> +        if (!ObjDesc)
>          {
> -            Status = AE_TYPE;
> +            Status = AE_NO_MEMORY;
>              goto UnlockAndExit;
>          }
>
> -        /* Check for an existing internal object */
> +        /* Attach new object to the Node, remove local reference */
>
> -        ObjDesc = AcpiNsGetAttachedObject (Node);
> -        if (ObjDesc)
> +        Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
> +        AcpiUtRemoveReference (ObjDesc);
> +        if (ACPI_FAILURE (Status))
>          {
> -            /* Object exists - make sure there's no handler */
> -
> -            if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> -                    ObjDesc->CommonNotify.SystemNotify)   ||
> -                ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> -                    ObjDesc->CommonNotify.DeviceNotify))
> -            {
> -                Status = AE_ALREADY_EXISTS;
> -                goto UnlockAndExit;
> -            }
> +            goto UnlockAndExit;
>          }
> -        else
> -        {
> -            /* Create a new object */
> -
> -            ObjDesc = AcpiUtCreateInternalObject (Node->Type);
> -            if (!ObjDesc)
> -            {
> -                Status = AE_NO_MEMORY;
> -                goto UnlockAndExit;
> -            }
> -
> -            /* Attach new object to the Node */
> -
> -            Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
> +    }
>
> -            /* Remove local reference to the object */
> +    /* Ensure that the handler is not already installed in the lists */
>
> -            AcpiUtRemoveReference (ObjDesc);
> -            if (ACPI_FAILURE (Status))
> +    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +    {
> +        if (HandlerType & (i+1))
> +        {
> +            HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
> +            while (HandlerObj)
>              {
> -                goto UnlockAndExit;
> +                if (HandlerObj->Notify.Handler == Handler)
> +                {
> +                    Status = AE_ALREADY_EXISTS;
> +                    goto UnlockAndExit;
> +                }
> +
> +                HandlerObj = HandlerObj->Notify.Next[i];
>              }
>          }
> +    }
>
> -        /* Install the handler */
> +    /* Create and populate a new notify handler object */
>
> -        NotifyObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
> -        if (!NotifyObj)
> -        {
> -            Status = AE_NO_MEMORY;
> -            goto UnlockAndExit;
> -        }
> +    HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
> +    if (!HandlerObj)
> +    {
> +        Status = AE_NO_MEMORY;
> +        goto UnlockAndExit;
> +    }
>
> -        NotifyObj->Notify.Node    = Node;
> -        NotifyObj->Notify.Handler = Handler;
> -        NotifyObj->Notify.Context = Context;
> +    HandlerObj->Notify.Node = Node;
> +    HandlerObj->Notify.HandlerType = HandlerType;
> +    HandlerObj->Notify.Handler = Handler;
> +    HandlerObj->Notify.Context = Context;
>
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> -        {
> -            ObjDesc->CommonNotify.SystemNotify = NotifyObj;
> -        }
> +    /* Install the handler at the list head(s) */
>
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> +    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +    {
> +        if (HandlerType & (i+1))
>          {
> -            ObjDesc->CommonNotify.DeviceNotify = NotifyObj;
> +            HandlerObj->Notify.Next[i] =
> +                ObjDesc->CommonNotify.NotifyList[i];
> +
> +            ObjDesc->CommonNotify.NotifyList[i] = HandlerObj;
>          }
> +    }
>
> -        if (HandlerType == ACPI_ALL_NOTIFY)
> -        {
> -            /* Extra ref if installed in both */
> +    /* Add an extra reference if handler was installed in both lists */
>
> -            AcpiUtAddReference (NotifyObj);
> -        }
> +    if (HandlerType == ACPI_ALL_NOTIFY)
> +    {
> +        AcpiUtAddReference (HandlerObj);
>      }
>
>
> @@ -319,11 +314,11 @@ ACPI_EXPORT_SYMBOL (AcpiInstallNotifyHandler)
>   *
>   * FUNCTION:    AcpiRemoveNotifyHandler
>   *
> - * PARAMETERS:  Device          - The device for which notifies will be handled
> + * PARAMETERS:  Device          - The device for which the handler is installed
>   *              HandlerType     - The type of handler:
> - *                                  ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
> - *                                  ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
> - *                                  ACPI_ALL_NOTIFY:  both system and device
> + *                                  ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
> + *                                  ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
> + *                                  ACPI_ALL_NOTIFY:    Both System and Device
>   *              Handler         - Address of the handler
>   *
>   * RETURN:      Status
> @@ -338,10 +333,12 @@ AcpiRemoveNotifyHandler (
>      UINT32                  HandlerType,
>      ACPI_NOTIFY_HANDLER     Handler)
>  {
> -    ACPI_OPERAND_OBJECT     *NotifyObj;
> +    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
>      ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_NAMESPACE_NODE     *Node;
> +    ACPI_OPERAND_OBJECT     *HandlerObj;
> +    ACPI_OPERAND_OBJECT     *PreviousHandlerObj;
>      ACPI_STATUS             Status;
> +    UINT32                  i;
>
>
>      ACPI_FUNCTION_TRACE (AcpiRemoveNotifyHandler);
> @@ -349,122 +346,103 @@ AcpiRemoveNotifyHandler (
>
>      /* Parameter validation */
>
> -    if ((!Device)  ||
> -        (!Handler) ||
> +    if ((!Device) || (!Handler) || (!HandlerType) ||
>          (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
>      {
>          return_ACPI_STATUS (AE_BAD_PARAMETER);
>      }
>
> +    /* Make sure all deferred notify tasks are completed */
> +
> +    AcpiOsWaitEventsComplete ();
> +
>      Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
>      if (ACPI_FAILURE (Status))
>      {
>          return_ACPI_STATUS (Status);
>      }
>
> -    /* Convert and validate the device handle */
> -
> -    Node = AcpiNsValidateHandle (Device);
> -    if (!Node)
> -    {
> -        Status = AE_BAD_PARAMETER;
> -        goto UnlockAndExit;
> -    }
> -
> -    /* Root Object */
> +    /* Root Object. Global handlers are removed here */
>
>      if (Device == ACPI_ROOT_OBJECT)
>      {
> -        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> -            "Removing notify handler for namespace root object\n"));
> -
> -        if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
> -              !AcpiGbl_SystemNotify.Handler)        ||
> -            ((HandlerType & ACPI_DEVICE_NOTIFY) &&
> -              !AcpiGbl_DeviceNotify.Handler))
> -        {
> -            Status = AE_NOT_EXIST;
> -            goto UnlockAndExit;
> -        }
> -
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> +        for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
>          {
> -            AcpiGbl_SystemNotify.Node    = NULL;
> -            AcpiGbl_SystemNotify.Handler = NULL;
> -            AcpiGbl_SystemNotify.Context = NULL;
> +            if (HandlerType & (i+1))
> +            {
> +                if (!AcpiGbl_GlobalNotify[i].Handler ||
> +                    (AcpiGbl_GlobalNotify[i].Handler != Handler))
> +                {
> +                    Status = AE_NOT_EXIST;
> +                    goto UnlockAndExit;
> +                }
> +
> +                ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
> +                    "Removing global notify handler\n"));
> +
> +                AcpiGbl_GlobalNotify[i].Handler = NULL;
> +                AcpiGbl_GlobalNotify[i].Context = NULL;
> +            }
>          }
>
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> -        {
> -            AcpiGbl_DeviceNotify.Node    = NULL;
> -            AcpiGbl_DeviceNotify.Handler = NULL;
> -            AcpiGbl_DeviceNotify.Context = NULL;
> -        }
> +        goto UnlockAndExit;
>      }
>
> -    /* All Other Objects */
> +    /* All other objects: Are Notifies allowed on this object? */
>
> -    else
> +    if (!AcpiEvIsNotifyObject (Node))
>      {
> -        /* Notifies allowed on this object? */
> +        Status = AE_TYPE;
> +        goto UnlockAndExit;
> +    }
>
> -        if (!AcpiEvIsNotifyObject (Node))
> -        {
> -            Status = AE_TYPE;
> -            goto UnlockAndExit;
> -        }
> +    /* Must have an existing internal object */
> +
> +    ObjDesc = AcpiNsGetAttachedObject (Node);
> +    if (!ObjDesc)
> +    {
> +        Status = AE_NOT_EXIST;
> +        goto UnlockAndExit;
> +    }
>
> -        /* Check for an existing internal object */
> +    /* Internal object exists. Find the handler and remove it */
>
> -        ObjDesc = AcpiNsGetAttachedObject (Node);
> -        if (!ObjDesc)
> +    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +    {
> +        if (HandlerType & (i+1))
>          {
> -            Status = AE_NOT_EXIST;
> -            goto UnlockAndExit;
> -        }
> +            HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
> +            PreviousHandlerObj = NULL;
>
> -        /* Object exists - make sure there's an existing handler */
> +            /* Attempt to find the handler in the handler list */
>
> -        if (HandlerType & ACPI_SYSTEM_NOTIFY)
> -        {
> -            NotifyObj = ObjDesc->CommonNotify.SystemNotify;
> -            if (!NotifyObj)
> +            while (HandlerObj &&
> +                  (HandlerObj->Notify.Handler != Handler))
>              {
> -                Status = AE_NOT_EXIST;
> -                goto UnlockAndExit;
> +                PreviousHandlerObj = HandlerObj;
> +                HandlerObj = HandlerObj->Notify.Next[i];
>              }
>
> -            if (NotifyObj->Notify.Handler != Handler)
> +            if (!HandlerObj)
>              {
> -                Status = AE_BAD_PARAMETER;
> +                Status = AE_NOT_EXIST;
>                  goto UnlockAndExit;
>              }
>
> -            /* Remove the handler */
> +            /* Remove the handler object from the list */
>
> -            ObjDesc->CommonNotify.SystemNotify = NULL;
> -            AcpiUtRemoveReference (NotifyObj);
> -        }
> -
> -        if (HandlerType & ACPI_DEVICE_NOTIFY)
> -        {
> -            NotifyObj = ObjDesc->CommonNotify.DeviceNotify;
> -            if (!NotifyObj)
> +            if (PreviousHandlerObj) /* Handler is not at the list head */
>              {
> -                Status = AE_NOT_EXIST;
> -                goto UnlockAndExit;
> +                PreviousHandlerObj->Notify.Next[i] =
> +                    HandlerObj->Notify.Next[i];
>              }
> -
> -            if (NotifyObj->Notify.Handler != Handler)
> +            else /* Handler is at the list head */
>              {
> -                Status = AE_BAD_PARAMETER;
> -                goto UnlockAndExit;
> +                ObjDesc->CommonNotify.NotifyList[i] =
> +                    HandlerObj->Notify.Next[i];
>              }
>
> -            /* Remove the handler */
> -
> -            ObjDesc->CommonNotify.DeviceNotify = NULL;
> -            AcpiUtRemoveReference (NotifyObj);
> +            AcpiUtRemoveReference (HandlerObj);
>          }
>      }
>
> @@ -894,6 +872,10 @@ AcpiRemoveGpeHandler (
>          return_ACPI_STATUS (AE_BAD_PARAMETER);
>      }
>
> +    /* Make sure all deferred GPE tasks are completed */
> +
> +    AcpiOsWaitEventsComplete ();
> +
>      Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
>      if (ACPI_FAILURE (Status))
>      {
> diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
> index 7018513..29e1d68 100644
> --- a/src/acpica/source/components/events/evxfgpe.c
> +++ b/src/acpica/source/components/events/evxfgpe.c
> @@ -155,7 +155,7 @@ AcpiUpdateAllGpes (
>      ACPI_STATUS             Status;
>
>
> -    ACPI_FUNCTION_TRACE (AcpiUpdateGpes);
> +    ACPI_FUNCTION_TRACE (AcpiUpdateAllGpes);
>
>
>      Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
> @@ -367,9 +367,11 @@ AcpiSetupGpeForWake (
>      ACPI_HANDLE             GpeDevice,
>      UINT32                  GpeNumber)
>  {
> -    ACPI_STATUS             Status = AE_BAD_PARAMETER;
> +    ACPI_STATUS             Status;
>      ACPI_GPE_EVENT_INFO     *GpeEventInfo;
>      ACPI_NAMESPACE_NODE     *DeviceNode;
> +    ACPI_GPE_NOTIFY_INFO    *Notify;
> +    ACPI_GPE_NOTIFY_INFO    *NewNotify;
>      ACPI_CPU_FLAGS          Flags;
>
>
> @@ -405,32 +407,88 @@ AcpiSetupGpeForWake (
>          return_ACPI_STATUS (AE_BAD_PARAMETER);
>      }
>
> +    /*
> +     * Allocate a new notify object up front, in case it is needed.
> +     * Memory allocation while holding a spinlock is a big no-no
> +     * on some hosts.
> +     */
> +    NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
> +    if (!NewNotify)
> +    {
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
>      Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
>
>      /* Ensure that we have a valid GPE number */
>
>      GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
> -    if (GpeEventInfo)
> +    if (!GpeEventInfo)
> +    {
> +        Status = AE_BAD_PARAMETER;
> +        goto UnlockAndExit;
> +    }
> +
> +    /*
> +     * If there is no method or handler for this GPE, then the
> +     * WakeDevice will be notified whenever this GPE fires. This is
> +     * known as an "implicit notify". Note: The GPE is assumed to be
> +     * level-triggered (for windows compatibility).
> +     */
> +    if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> +            ACPI_GPE_DISPATCH_NONE)
>      {
>          /*
> -         * If there is no method or handler for this GPE, then the
> -         * WakeDevice will be notified whenever this GPE fires (aka
> -         * "implicit notify") Note: The GPE is assumed to be
> -         * level-triggered (for windows compatibility).
> +         * This is the first device for implicit notify on this GPE.
> +         * Just set the flags here, and enter the NOTIFY block below.
>           */
> -        if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> -                ACPI_GPE_DISPATCH_NONE)
> +        GpeEventInfo->Flags =
> +            (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
> +    }
> +
> +    /*
> +     * If we already have an implicit notify on this GPE, add
> +     * this device to the notify list.
> +     */
> +    if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
> +            ACPI_GPE_DISPATCH_NOTIFY)
> +    {
> +        /* Ensure that the device is not already in the list */
> +
> +        Notify = GpeEventInfo->Dispatch.NotifyList;
> +        while (Notify)
>          {
> -            GpeEventInfo->Flags =
> -                (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
> -            GpeEventInfo->Dispatch.DeviceNode = DeviceNode;
> +            if (Notify->DeviceNode == DeviceNode)
> +            {
> +                Status = AE_ALREADY_EXISTS;
> +                goto UnlockAndExit;
> +            }
> +            Notify = Notify->Next;
>          }
>
> -        GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
> -        Status = AE_OK;
> +        /* Add this device to the notify list for this GPE */
> +
> +        NewNotify->DeviceNode = DeviceNode;
> +        NewNotify->Next = GpeEventInfo->Dispatch.NotifyList;
> +        GpeEventInfo->Dispatch.NotifyList = NewNotify;
> +        NewNotify = NULL;
>      }
>
> +    /* Mark the GPE as a possible wake event */
> +
> +    GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
> +    Status = AE_OK;
> +
> +
> +UnlockAndExit:
>      AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
> +
> +    /* Delete the notify object if it was not used above */
> +
> +    if (NewNotify)
> +    {
> +        ACPI_FREE (NewNotify);
> +    }
>      return_ACPI_STATUS (Status);
>  }
>
> diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c
> index 69361d5..55cef28 100644
> --- a/src/acpica/source/components/executer/exconfig.c
> +++ b/src/acpica/source/components/executer/exconfig.c
> @@ -252,7 +252,7 @@ AcpiExLoadTableOp (
>      ACPI_FUNCTION_TRACE (ExLoadTableOp);
>
>
> -    /* Validate lengths for the SignatureString, OEMIDString, OEMTableID */
> +    /* Validate lengths for the Signature, OemId, and OemTableId strings */
>
>      if ((Operand[0]->String.Length > ACPI_NAME_SIZE) ||
>          (Operand[1]->String.Length > ACPI_OEM_ID_SIZE) ||
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 5aab606..b525333 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -203,8 +203,8 @@ static ACPI_EXDUMP_INFO     AcpiExDumpDevice[4] =
>  {
>      {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice),         NULL},
>      {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.Handler),               "Handler"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.SystemNotify),          "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.DeviceNotify),          "Device Notify"}
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[0]),         "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "Device Notify"}
>  };
>
>  static ACPI_EXDUMP_INFO     AcpiExDumpEvent[2] =
> @@ -251,8 +251,8 @@ static ACPI_EXDUMP_INFO     AcpiExDumpPower[5] =
>      {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPower),          NULL},
>      {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.SystemLevel),    "System Level"},
>      {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.ResourceOrder),  "Resource Order"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.SystemNotify),   "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.DeviceNotify),   "Device Notify"}
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[0]),  "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "Device Notify"}
>  };
>
>  static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
> @@ -261,16 +261,16 @@ static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
>      {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Processor.ProcId),             "Processor ID"},
>      {ACPI_EXD_UINT8 ,   ACPI_EXD_OFFSET (Processor.Length),             "Length"},
>      {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Processor.Address),            "Address"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.SystemNotify),       "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.DeviceNotify),       "Device Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[0]),      "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[1]),      "Device Notify"},
>      {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.Handler),            "Handler"}
>  };
>
>  static ACPI_EXDUMP_INFO     AcpiExDumpThermal[4] =
>  {
>      {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal),        NULL},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.SystemNotify),     "System Notify"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.DeviceNotify),     "Device Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]),    "System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]),    "Device Notify"},
>      {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.Handler),          "Handler"}
>  };
>
> @@ -330,11 +330,15 @@ static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
>      {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
>  };
>
> -static ACPI_EXDUMP_INFO     AcpiExDumpNotify[3] =
> +static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
>  {
>      {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
>      {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
> -    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"}
> +    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
> +    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
>  };
>
>
> diff --git a/src/acpica/source/components/executer/exprep.c b/src/acpica/source/components/executer/exprep.c
> index 0b65ab9..9b05f9d 100644
> --- a/src/acpica/source/components/executer/exprep.c
> +++ b/src/acpica/source/components/executer/exprep.c
> @@ -490,8 +490,8 @@ AcpiExPrepCommonFieldObject (
>   *
>   * RETURN:      Status
>   *
> - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and
> - *              connect it to the parent Node.
> + * DESCRIPTION: Construct an object of type ACPI_OPERAND_OBJECT with a
> + *              subtype of DefField and connect it to the parent Node.
>   *
>   ******************************************************************************/
>
> diff --git a/src/acpica/source/components/executer/exresolv.c b/src/acpica/source/components/executer/exresolv.c
> index 8d3893b..4b9e9b3 100644
> --- a/src/acpica/source/components/executer/exresolv.c
> +++ b/src/acpica/source/components/executer/exresolv.c
> @@ -237,7 +237,7 @@ AcpiExResolveObjectToValue (
>
>      StackDesc = *StackPtr;
>
> -    /* This is an ACPI_OPERAND_OBJECT  */
> +    /* This is an object of type ACPI_OPERAND_OBJECT */
>
>      switch (StackDesc->Common.Type)
>      {
> diff --git a/src/acpica/source/components/executer/exstore.c b/src/acpica/source/components/executer/exstore.c
> index 8bea79b..36fccf8 100644
> --- a/src/acpica/source/components/executer/exstore.c
> +++ b/src/acpica/source/components/executer/exstore.c
> @@ -140,15 +140,15 @@ AcpiExStoreObjectToIndex (
>   * FUNCTION:    AcpiExStore
>   *
>   * PARAMETERS:  *SourceDesc         - Value to be stored
> - *              *DestDesc           - Where to store it.  Must be an NS node
> - *                                    or an ACPI_OPERAND_OBJECT of type
> + *              *DestDesc           - Where to store it. Must be an NS node
> + *                                    or ACPI_OPERAND_OBJECT of type
>   *                                    Reference;
>   *              WalkState           - Current walk state
>   *
>   * RETURN:      Status
>   *
>   * DESCRIPTION: Store the value described by SourceDesc into the location
> - *              described by DestDesc.  Called by various interpreter
> + *              described by DestDesc. Called by various interpreter
>   *              functions to store the result of an operation into
>   *              the destination operand -- not just simply the actual "Store"
>   *              ASL operator.
> diff --git a/src/acpica/source/components/executer/exutils.c b/src/acpica/source/components/executer/exutils.c
> index 3ebcbe5..28a18ad 100644
> --- a/src/acpica/source/components/executer/exutils.c
> +++ b/src/acpica/source/components/executer/exutils.c
> @@ -193,7 +193,7 @@ AcpiExEnterInterpreter (
>   *
>   * DESCRIPTION: Reacquire the interpreter execution region from within the
>   *              interpreter code. Failure to enter the interpreter region is a
> - *              fatal system error. Used in  conjuction with
> + *              fatal system error. Used in conjunction with
>   *              RelinquishInterpreter
>   *
>   ******************************************************************************/
> diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
> index 6fd9d66..a2e4c43 100644
> --- a/src/acpica/source/components/hardware/hwsleep.c
> +++ b/src/acpica/source/components/hardware/hwsleep.c
> @@ -171,20 +171,6 @@ AcpiHwLegacySleep (
>          return_ACPI_STATUS (Status);
>      }
>
> -    if (SleepState != ACPI_STATE_S5)
> -    {
> -        /*
> -         * Disable BM arbitration. This feature is contained within an
> -         * optional register (PM2 Control), so ignore a BAD_ADDRESS
> -         * exception.
> -         */
> -        Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 1);
> -        if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
> -        {
> -            return_ACPI_STATUS (Status);
> -        }
> -    }
> -
>      /*
>       * 1) Disable/Clear all GPEs
>       * 2) Enable all wakeup GPEs
> @@ -452,17 +438,6 @@ AcpiHwLegacyWake (
>              AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
>              ACPI_CLEAR_STATUS);
>
> -    /*
> -     * Enable BM arbitration. This feature is contained within an
> -     * optional register (PM2 Control), so ignore a BAD_ADDRESS
> -     * exception.
> -     */
> -    Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 0);
> -    if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
> -    {
> -        return_ACPI_STATUS (Status);
> -    }
> -
>      AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
>      return_ACPI_STATUS (Status);
>  }
> diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
> index 631b81e..dfb7112 100644
> --- a/src/acpica/source/components/hardware/hwxfsleep.c
> +++ b/src/acpica/source/components/hardware/hwxfsleep.c
> @@ -173,6 +173,14 @@ AcpiSetFirmwareWakingVector (
>      ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector);
>
>
> +    /*
> +     * According to the ACPI specification 2.0c and later, the 64-bit
> +     * waking vector should be cleared and the 32-bit waking vector should
> +     * be used, unless we want the wake-up code to be called by the BIOS in
> +     * Protected Mode. Some systems (for example HP dv5-1004nr) are known
> +     * to fail to resume if the 64-bit vector is used.
> +     */
> +
>      /* Set the 32-bit vector */
>
>      AcpiGbl_FACS->FirmwareWakingVector = PhysicalAddress;
> diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
> index e6c7cf6..8bc2591 100644
> --- a/src/acpica/source/components/namespace/nspredef.c
> +++ b/src/acpica/source/components/namespace/nspredef.c
> @@ -753,7 +753,7 @@ AcpiNsCheckPackage (
>          {
>              /* Create the new outer package and populate it */
>
> -            Status = AcpiNsWrapWithPackage (Data, *Elements, ReturnObjectPtr);
> +            Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr);
>              if (ACPI_FAILURE (Status))
>              {
>                  return (Status);
> diff --git a/src/acpica/source/components/parser/psxface.c b/src/acpica/source/components/parser/psxface.c
> index 11c5fc2..5da1b6a 100644
> --- a/src/acpica/source/components/parser/psxface.c
> +++ b/src/acpica/source/components/parser/psxface.c
> @@ -420,8 +420,8 @@ AcpiPsExecuteMethod (
>      }
>
>      /*
> -     * Start method evaluation with an implicit return of zero. This is done
> -     * for Windows compatibility.
> +     * Start method evaluation with an implicit return of zero.
> +     * This is done for Windows compatibility.
>       */
>      if (AcpiGbl_EnableInterpreterSlack)
>      {
> diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
> index d75ceb6..6aaf4bb 100644
> --- a/src/acpica/source/components/resources/rscreate.c
> +++ b/src/acpica/source/components/resources/rscreate.c
> @@ -281,8 +281,8 @@ AcpiRsCreateResourceList (
>   *
>   * FUNCTION:    AcpiRsCreatePciRoutingTable
>   *
> - * PARAMETERS:  PackageObject           - Pointer to an ACPI_OPERAND_OBJECT
> - *                                        package
> + * PARAMETERS:  PackageObject           - Pointer to a package containing one
> + *                                        of more ACPI_OPERAND_OBJECTs
>   *              OutputBuffer            - Pointer to the user's buffer
>   *
>   * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
> @@ -290,7 +290,7 @@ AcpiRsCreateResourceList (
>   *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
>   *              to the size buffer needed.
>   *
> - * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT  package and creates a
> + * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a
>   *              linked list of PCI interrupt descriptions
>   *
>   * NOTE: It is the caller's responsibility to ensure that the start of the
> diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
> index ce3143c..a45b3d6 100644
> --- a/src/acpica/source/components/resources/rsutils.c
> +++ b/src/acpica/source/components/resources/rsutils.c
> @@ -253,7 +253,7 @@ AcpiRsMoveData (
>
>          /*
>           * 16-, 32-, and 64-bit cases must use the move macros that perform
> -         * endian conversion and/or accomodate hardware that cannot perform
> +         * endian conversion and/or accommodate hardware that cannot perform
>           * misaligned memory transfers
>           */
>          case ACPI_RSC_MOVE16:
> diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
> index fa43dbb..2c51511 100644
> --- a/src/acpica/source/components/tables/tbfadt.c
> +++ b/src/acpica/source/components/tables/tbfadt.c
> @@ -124,12 +124,13 @@
>
>  /* Local prototypes */
>
> -static ACPI_INLINE void
> +static void
>  AcpiTbInitGenericAddress (
>      ACPI_GENERIC_ADDRESS    *GenericAddress,
>      UINT8                   SpaceId,
>      UINT8                   ByteWidth,
> -    UINT64                  Address);
> +    UINT64                  Address,
> +    char                    *RegisterName);
>
>  static void
>  AcpiTbConvertFadt (
> @@ -263,7 +264,7 @@ static ACPI_FADT_PM_INFO    FadtPmInfoTable[] =
>   *
>   * PARAMETERS:  GenericAddress      - GAS struct to be initialized
>   *              SpaceId             - ACPI Space ID for this register
> - *              ByteWidth           - Width of this register, in bytes
> + *              ByteWidth           - Width of this register
>   *              Address             - Address of the register
>   *
>   * RETURN:      None
> @@ -274,13 +275,30 @@ static ACPI_FADT_PM_INFO    FadtPmInfoTable[] =
>   *
>   ******************************************************************************/
>
> -static ACPI_INLINE void
> +static void
>  AcpiTbInitGenericAddress (
>      ACPI_GENERIC_ADDRESS    *GenericAddress,
>      UINT8                   SpaceId,
>      UINT8                   ByteWidth,
> -    UINT64                  Address)
> +    UINT64                  Address,
> +    char                    *RegisterName)
>  {
> +    UINT8                   BitWidth;
> +
> +
> +    /* Bit width field in the GAS is only one byte long, 255 max */
> +
> +    BitWidth = (UINT8) (ByteWidth * 8);
> +
> +    if (ByteWidth > 31) /* (31*8)=248 */
> +    {
> +        ACPI_ERROR ((AE_INFO,
> +            "%s - 32-bit FADT register is too long (%u bytes, %u bits) "
> +            "to convert to GAS struct - 255 bits max, truncating",
> +            RegisterName, ByteWidth, (ByteWidth * 8)));
> +
> +        BitWidth = 255;
> +    }
>
>      /*
>       * The 64-bit Address field is non-aligned in the byte packed
> @@ -291,7 +309,7 @@ AcpiTbInitGenericAddress (
>      /* All other fields are byte-wide */
>
>      GenericAddress->SpaceId = SpaceId;
> -    GenericAddress->BitWidth = (UINT8) ACPI_MUL_8 (ByteWidth);
> +    GenericAddress->BitWidth = BitWidth;
>      GenericAddress->BitOffset = 0;
>      GenericAddress->AccessWidth = 0; /* Access width ANY */
>  }
> @@ -392,7 +410,7 @@ AcpiTbCreateLocalFadt (
>       */
>      if (Length > sizeof (ACPI_TABLE_FADT))
>      {
> -        ACPI_WARNING ((AE_INFO,
> +        ACPI_BIOS_WARNING ((AE_INFO,
>              "FADT (revision %u) is longer than ACPI 5.0 version, "
>              "truncating length %u to %u",
>              Table->Revision, Length, (UINT32) sizeof (ACPI_TABLE_FADT)));
> @@ -540,8 +558,9 @@ AcpiTbConvertFadt (
>          if (Address64->Address && Address32 &&
>             (Address64->Address != (UINT64) Address32))
>          {
> -            ACPI_ERROR ((AE_INFO,
> -                "32/64X address mismatch in %s: 0x%8.8X/0x%8.8X%8.8X, using 32",
> +            ACPI_BIOS_ERROR ((AE_INFO,
> +                "32/64X address mismatch in FADT/%s: "
> +                "0x%8.8X/0x%8.8X%8.8X, using 32",
>                  FadtInfoTable[i].Name, Address32,
>                  ACPI_FORMAT_UINT64 (Address64->Address)));
>          }
> @@ -556,7 +575,7 @@ AcpiTbConvertFadt (
>               */
>              AcpiTbInitGenericAddress (Address64, ACPI_ADR_SPACE_SYSTEM_IO,
>                  *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length),
> -                (UINT64) Address32);
> +                (UINT64) Address32, FadtInfoTable[i].Name);
>          }
>      }
>  }
> @@ -600,7 +619,7 @@ AcpiTbValidateFadt (
>      if (AcpiGbl_FADT.Facs &&
>          (AcpiGbl_FADT.XFacs != (UINT64) AcpiGbl_FADT.Facs))
>      {
> -        ACPI_WARNING ((AE_INFO,
> +        ACPI_BIOS_WARNING ((AE_INFO,
>              "32/64X FACS address mismatch in FADT - "
>              "0x%8.8X/0x%8.8X%8.8X, using 32",
>              AcpiGbl_FADT.Facs, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XFacs)));
> @@ -611,7 +630,7 @@ AcpiTbValidateFadt (
>      if (AcpiGbl_FADT.Dsdt &&
>          (AcpiGbl_FADT.XDsdt != (UINT64) AcpiGbl_FADT.Dsdt))
>      {
> -        ACPI_WARNING ((AE_INFO,
> +        ACPI_BIOS_WARNING ((AE_INFO,
>              "32/64X DSDT address mismatch in FADT - "
>              "0x%8.8X/0x%8.8X%8.8X, using 32",
>              AcpiGbl_FADT.Dsdt, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XDsdt)));
> @@ -647,8 +666,8 @@ AcpiTbValidateFadt (
>          if (Address64->Address &&
>             (Address64->BitWidth != ACPI_MUL_8 (Length)))
>          {
> -            ACPI_WARNING ((AE_INFO,
> -                "32/64X length mismatch in %s: %u/%u",
> +            ACPI_BIOS_WARNING ((AE_INFO,
> +                "32/64X length mismatch in FADT/%s: %u/%u",
>                  Name, ACPI_MUL_8 (Length), Address64->BitWidth));
>          }
>
> @@ -660,9 +679,9 @@ AcpiTbValidateFadt (
>               */
>              if (!Address64->Address || !Length)
>              {
> -                ACPI_ERROR ((AE_INFO,
> -                    "Required field %s has zero address and/or length:"
> -                    " 0x%8.8X%8.8X/0x%X",
> +                ACPI_BIOS_ERROR ((AE_INFO,
> +                    "Required FADT field %s has zero address and/or length: "
> +                    "0x%8.8X%8.8X/0x%X",
>                      Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
>              }
>          }
> @@ -676,8 +695,8 @@ AcpiTbValidateFadt (
>              if ((Address64->Address && !Length) ||
>                  (!Address64->Address && Length))
>              {
> -                ACPI_WARNING ((AE_INFO,
> -                    "Optional field %s has zero address or length: "
> +                ACPI_BIOS_WARNING ((AE_INFO,
> +                    "Optional FADT field %s has zero address or length: "
>                      "0x%8.8X%8.8X/0x%X",
>                      Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
>              }
> @@ -728,8 +747,8 @@ AcpiTbSetupFadtRegisters (
>                  (FadtInfoTable[i].DefaultLength > 0) &&
>                  (FadtInfoTable[i].DefaultLength != Target64->BitWidth))
>              {
> -                ACPI_WARNING ((AE_INFO,
> -                    "Invalid length for %s: %u, using default %u",
> +                ACPI_BIOS_WARNING ((AE_INFO,
> +                    "Invalid length for FADT/%s: %u, using default %u",
>                      FadtInfoTable[i].Name, Target64->BitWidth,
>                      FadtInfoTable[i].DefaultLength));
>
> @@ -772,7 +791,8 @@ AcpiTbSetupFadtRegisters (
>              AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target,
>                  Source64->SpaceId, Pm1RegisterByteWidth,
>                  Source64->Address +
> -                    (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth));
> +                    (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth),
> +                "PmRegisters");
>          }
>      }
>  }
> diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c
> index 00fd2a2..5e112dc 100644
> --- a/src/acpica/source/components/tables/tbinstal.c
> +++ b/src/acpica/source/components/tables/tbinstal.c
> @@ -229,8 +229,9 @@ AcpiTbAddTable (
>         (!ACPI_COMPARE_NAME (TableDesc->Pointer->Signature, ACPI_SIG_SSDT)) &&
>         (ACPI_STRNCMP (TableDesc->Pointer->Signature, "OEM", 3)))
>      {
> -        ACPI_ERROR ((AE_INFO,
> -            "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx",
> +        ACPI_BIOS_ERROR ((AE_INFO,
> +            "Table has invalid signature [%4.4s] (0x%8.8X), "
> +            "must be SSDT or OEMx",
>              AcpiUtValidAcpiName (*(UINT32 *) TableDesc->Pointer->Signature) ?
>                  TableDesc->Pointer->Signature : "????",
>              *(UINT32 *) TableDesc->Pointer->Signature));
> diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
> index 4ad777c..4f0b75d 100644
> --- a/src/acpica/source/components/tables/tbutils.c
> +++ b/src/acpica/source/components/tables/tbutils.c
> @@ -359,8 +359,9 @@ AcpiTbVerifyChecksum (
>
>      if (Checksum)
>      {
> -        ACPI_WARNING ((AE_INFO,
> -            "Incorrect checksum in table [%4.4s] - 0x%2.2X, should be 0x%2.2X",
> +        ACPI_BIOS_WARNING ((AE_INFO,
> +            "Incorrect checksum in table [%4.4s] - 0x%2.2X, "
> +            "should be 0x%2.2X",
>              Table->Signature, Table->Checksum,
>              (UINT8) (Table->Checksum - Checksum)));
>
> @@ -428,8 +429,9 @@ AcpiTbCheckDsdtHeader (
>      if (AcpiGbl_OriginalDsdtHeader.Length != AcpiGbl_DSDT->Length ||
>          AcpiGbl_OriginalDsdtHeader.Checksum != AcpiGbl_DSDT->Checksum)
>      {
> -        ACPI_ERROR ((AE_INFO,
> -            "The DSDT has been corrupted or replaced - old, new headers below"));
> +        ACPI_BIOS_ERROR ((AE_INFO,
> +            "The DSDT has been corrupted or replaced - "
> +            "old, new headers below"));
>          AcpiTbPrintTableHeader (0, &AcpiGbl_OriginalDsdtHeader);
>          AcpiTbPrintTableHeader (0, AcpiGbl_DSDT);
>
> @@ -537,7 +539,7 @@ AcpiTbInstallTable (
>      if (Signature &&
>          !ACPI_COMPARE_NAME (Table->Signature, Signature))
>      {
> -        ACPI_ERROR ((AE_INFO,
> +        ACPI_BIOS_ERROR ((AE_INFO,
>              "Invalid signature 0x%X for ACPI table, expected [%s]",
>              *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));
>          goto UnmapAndExit;
> @@ -656,7 +658,7 @@ AcpiTbGetRootTableEntry (
>          {
>              /* Will truncate 64-bit address to 32 bits, issue warning */
>
> -            ACPI_WARNING ((AE_INFO,
> +            ACPI_BIOS_WARNING ((AE_INFO,
>                  "64-bit Physical Address in XSDT is too large (0x%8.8X%8.8X),"
>                  " truncating",
>                  ACPI_FORMAT_UINT64 (Address64)));
> @@ -758,7 +760,8 @@ AcpiTbParseRootTable (
>
>      if (Length < sizeof (ACPI_TABLE_HEADER))
>      {
> -        ACPI_ERROR ((AE_INFO, "Invalid length 0x%X in RSDT/XSDT", Length));
> +        ACPI_BIOS_ERROR ((AE_INFO,
> +            "Invalid table length 0x%X in RSDT/XSDT", Length));
>          return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);
>      }
>
> diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
> index 860dc2e..b91cce1 100644
> --- a/src/acpica/source/components/tables/tbxface.c
> +++ b/src/acpica/source/components/tables/tbxface.c
> @@ -1,7 +1,6 @@
>  /******************************************************************************
>   *
> - * Module Name: tbxface - Public interfaces to the ACPI subsystem
> - *                         ACPI table oriented interfaces
> + * Module Name: tbxface - ACPI table oriented external interfaces
>   *
>   *****************************************************************************/
>
> @@ -118,18 +117,11 @@
>
>  #include "acpi.h"
>  #include "accommon.h"
> -#include "acnamesp.h"
>  #include "actables.h"
>
>  #define _COMPONENT          ACPI_TABLES
>          ACPI_MODULE_NAME    ("tbxface")
>
> -/* Local prototypes */
> -
> -static ACPI_STATUS
> -AcpiTbLoadNamespace (
> -    void);
> -
>
>  /*******************************************************************************
>   *
> @@ -530,155 +522,6 @@ ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex)
>
>  /*******************************************************************************
>   *
> - * FUNCTION:    AcpiTbLoadNamespace
> - *
> - * PARAMETERS:  None
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
> - *              the RSDT/XSDT.
> - *
> - ******************************************************************************/
> -
> -static ACPI_STATUS
> -AcpiTbLoadNamespace (
> -    void)
> -{
> -    ACPI_STATUS             Status;
> -    UINT32                  i;
> -    ACPI_TABLE_HEADER       *NewDsdt;
> -
> -
> -    ACPI_FUNCTION_TRACE (TbLoadNamespace);
> -
> -
> -    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -
> -    /*
> -     * Load the namespace. The DSDT is required, but any SSDT and
> -     * PSDT tables are optional. Verify the DSDT.
> -     */
> -    if (!AcpiGbl_RootTableList.CurrentTableCount ||
> -        !ACPI_COMPARE_NAME (
> -            &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
> -            ACPI_SIG_DSDT) ||
> -         ACPI_FAILURE (AcpiTbVerifyTable (
> -            &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
> -    {
> -        Status = AE_NO_ACPI_TABLES;
> -        goto UnlockAndExit;
> -    }
> -
> -    /*
> -     * Save the DSDT pointer for simple access. This is the mapped memory
> -     * address. We must take care here because the address of the .Tables
> -     * array can change dynamically as tables are loaded at run-time. Note:
> -     * .Pointer field is not validated until after call to AcpiTbVerifyTable.
> -     */
> -    AcpiGbl_DSDT = AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer;
> -
> -    /*
> -     * Optionally copy the entire DSDT to local memory (instead of simply
> -     * mapping it.) There are some BIOSs that corrupt or replace the original
> -     * DSDT, creating the need for this option. Default is FALSE, do not copy
> -     * the DSDT.
> -     */
> -    if (AcpiGbl_CopyDsdtLocally)
> -    {
> -        NewDsdt = AcpiTbCopyDsdt (ACPI_TABLE_INDEX_DSDT);
> -        if (NewDsdt)
> -        {
> -            AcpiGbl_DSDT = NewDsdt;
> -        }
> -    }
> -
> -    /*
> -     * Save the original DSDT header for detection of table corruption
> -     * and/or replacement of the DSDT from outside the OS.
> -     */
> -    ACPI_MEMCPY (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
> -        sizeof (ACPI_TABLE_HEADER));
> -
> -    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -
> -    /* Load and parse tables */
> -
> -    Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return_ACPI_STATUS (Status);
> -    }
> -
> -    /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
> -
> -    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
> -    {
> -        if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
> -                    ACPI_SIG_SSDT) &&
> -             !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
> -                    ACPI_SIG_PSDT)) ||
> -             ACPI_FAILURE (AcpiTbVerifyTable (
> -                &AcpiGbl_RootTableList.Tables[i])))
> -        {
> -            continue;
> -        }
> -
> -        /* Ignore errors while loading tables, get as many as possible */
> -
> -        (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -        (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
> -        (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
> -    }
> -
> -    ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
> -
> -UnlockAndExit:
> -    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -    return_ACPI_STATUS (Status);
> -}
> -
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiLoadTables
> - *
> - * PARAMETERS:  None
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
> - *
> - ******************************************************************************/
> -
> -ACPI_STATUS
> -AcpiLoadTables (
> -    void)
> -{
> -    ACPI_STATUS             Status;
> -
> -
> -    ACPI_FUNCTION_TRACE (AcpiLoadTables);
> -
> -
> -    /* Load the namespace from the tables */
> -
> -    Status = AcpiTbLoadNamespace ();
> -    if (ACPI_FAILURE (Status))
> -    {
> -        ACPI_EXCEPTION ((AE_INFO, Status,
> -            "While loading namespace from ACPI tables"));
> -    }
> -
> -    return_ACPI_STATUS (Status);
> -}
> -
> -ACPI_EXPORT_SYMBOL (AcpiLoadTables)
> -
> -
> -/*******************************************************************************
> - *
>   * FUNCTION:    AcpiInstallTableHandler
>   *
>   * PARAMETERS:  Handler         - Table event handler
> diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
> index e85c1fd..d00db5f 100644
> --- a/src/acpica/source/components/tables/tbxfroot.c
> +++ b/src/acpica/source/components/tables/tbxfroot.c
> @@ -306,7 +306,7 @@ AcpiFindRootPointer (
>
>      /* A valid RSDP was not found */
>
> -    ACPI_ERROR ((AE_INFO, "A valid RSDP was not found"));
> +    ACPI_BIOS_ERROR ((AE_INFO, "A valid RSDP was not found"));
>      return_ACPI_STATUS (AE_NOT_FOUND);
>  }
>
> diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c
> index b36aa45..a88c581 100644
> --- a/src/acpica/source/components/utilities/utdecode.c
> +++ b/src/acpica/source/components/utilities/utdecode.c
> @@ -123,47 +123,6 @@
>          ACPI_MODULE_NAME    ("utdecode")
>
>
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiFormatException
> - *
> - * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
> - *
> - * RETURN:      A string containing the exception text. A valid pointer is
> - *              always returned.
> - *
> - * DESCRIPTION: This function translates an ACPI exception into an ASCII string
> - *              It is here instead of utxface.c so it is always present.
> - *
> - ******************************************************************************/
> -
> -const char *
> -AcpiFormatException (
> -    ACPI_STATUS             Status)
> -{
> -    const char              *Exception = NULL;
> -
> -
> -    ACPI_FUNCTION_ENTRY ();
> -
> -
> -    Exception = AcpiUtValidateException (Status);
> -    if (!Exception)
> -    {
> -        /* Exception code was not recognized */
> -
> -        ACPI_ERROR ((AE_INFO,
> -            "Unknown exception code: 0x%8.8X", Status));
> -
> -        Exception = "UNKNOWN_STATUS_CODE";
> -    }
> -
> -    return (ACPI_CAST_PTR (const char, Exception));
> -}
> -
> -ACPI_EXPORT_SYMBOL (AcpiFormatException)
> -
> -
>  /*
>   * Properties of the ACPI Object Types, both internal and external.
>   * The table is indexed by values of ACPI_OBJECT_TYPE
> @@ -252,16 +211,17 @@ AcpiUtHexToAsciiChar (
>
>  const char        *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
>  {
> -    "SystemMemory",
> -    "SystemIO",
> -    "PCI_Config",
> -    "EmbeddedControl",
> -    "SMBus",
> -    "SystemCMOS",
> -    "PCIBARTarget",
> -    "IPMI",
> -    "GeneralPurposeIo",
> -    "GenericSerialBus"
> +    "SystemMemory",     /* 0x00 */
> +    "SystemIO",         /* 0x01 */
> +    "PCI_Config",       /* 0x02 */
> +    "EmbeddedControl",  /* 0x03 */
> +    "SMBus",            /* 0x04 */
> +    "SystemCMOS",       /* 0x05 */
> +    "PCIBARTarget",     /* 0x06 */
> +    "IPMI",             /* 0x07 */
> +    "GeneralPurposeIo", /* 0x08 */
> +    "GenericSerialBus", /* 0x09 */
> +    "PCC"               /* 0x0A */
>  };
>
>
> diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c
> index 3130e6d..b64a585 100644
> --- a/src/acpica/source/components/utilities/utdelete.c
> +++ b/src/acpica/source/components/utilities/utdelete.c
> @@ -239,7 +239,7 @@ AcpiUtDeleteInternalObj (
>      case ACPI_TYPE_PROCESSOR:
>      case ACPI_TYPE_THERMAL:
>
> -        /* Walk the notify handler list for this object */
> +        /* Walk the address handler list for this object */
>
>          HandlerDesc = Object->CommonNotify.Handler;
>          while (HandlerDesc)
> @@ -595,6 +595,7 @@ AcpiUtUpdateObjectReference (
>      ACPI_STATUS             Status = AE_OK;
>      ACPI_GENERIC_STATE      *StateList = NULL;
>      ACPI_OPERAND_OBJECT     *NextObject = NULL;
> +    ACPI_OPERAND_OBJECT     *PrevObject;
>      ACPI_GENERIC_STATE      *State;
>      UINT32                  i;
>
> @@ -624,10 +625,20 @@ AcpiUtUpdateObjectReference (
>          case ACPI_TYPE_POWER:
>          case ACPI_TYPE_THERMAL:
>
> -            /* Update the notify objects for these types (if present) */
> -
> -            AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
> -            AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
> +            /*
> +             * Update the notify objects for these types (if present)
> +             * Two lists, system and device notify handlers.
> +             */
> +            for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
> +            {
> +                PrevObject = Object->CommonNotify.NotifyList[i];
> +                while (PrevObject)
> +                {
> +                    NextObject = PrevObject->Notify.Next[i];
> +                    AcpiUtUpdateRefCount (PrevObject, Action);
> +                    PrevObject = NextObject;
> +                }
> +            }
>              break;
>
>          case ACPI_TYPE_PACKAGE:
> diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
> index 8ebbaec..98b1e48 100644
> --- a/src/acpica/source/components/utilities/utglobal.c
> +++ b/src/acpica/source/components/utilities/utglobal.c
> @@ -283,8 +283,9 @@ ACPI_FIXED_EVENT_INFO       AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
>   *
>   * RETURN:      Status
>   *
> - * DESCRIPTION: Init ACPICA globals.  All globals that require specific
> - *              initialization should be initialized here!
> + * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
> + *              initialization should be initialized here. This allows for
> + *              a warm restart.
>   *
>   ******************************************************************************/
>
> @@ -359,8 +360,8 @@ AcpiUtInitGlobals (
>
>      /* Global handlers */
>
> -    AcpiGbl_SystemNotify.Handler        = NULL;
> -    AcpiGbl_DeviceNotify.Handler        = NULL;
> +    AcpiGbl_GlobalNotify[0].Handler     = NULL;
> +    AcpiGbl_GlobalNotify[1].Handler     = NULL;
>      AcpiGbl_ExceptionHandler            = NULL;
>      AcpiGbl_InitHandler                 = NULL;
>      AcpiGbl_TableHandler                = NULL;
> diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
> index 44dd533..7318f68 100644
> --- a/src/acpica/source/components/utilities/utmisc.c
> +++ b/src/acpica/source/components/utilities/utmisc.c
> @@ -125,84 +125,41 @@
>          ACPI_MODULE_NAME    ("utmisc")
>
>
> +#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
>  /*******************************************************************************
>   *
> - * FUNCTION:    AcpiUtValidateException
> + * FUNCTION:    UtConvertBackslashes
>   *
> - * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
> + * PARAMETERS:  Pathname        - File pathname string to be converted
>   *
> - * RETURN:      A string containing the exception text. NULL if exception is
> - *              not valid.
> + * RETURN:      Modifies the input Pathname
>   *
> - * DESCRIPTION: This function validates and translates an ACPI exception into
> - *              an ASCII string.
> + * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
> + *              the entire input file pathname string.
>   *
>   ******************************************************************************/
>
> -const char *
> -AcpiUtValidateException (
> -    ACPI_STATUS             Status)
> +void
> +UtConvertBackslashes (
> +    char                    *Pathname)
>  {
> -    UINT32                  SubStatus;
> -    const char              *Exception = NULL;
> -
> -
> -    ACPI_FUNCTION_ENTRY ();
> -
>
> -    /*
> -     * Status is composed of two parts, a "type" and an actual code
> -     */
> -    SubStatus = (Status & ~AE_CODE_MASK);
> -
> -    switch (Status & AE_CODE_MASK)
> +    if (!Pathname)
>      {
> -    case AE_CODE_ENVIRONMENTAL:
> -
> -        if (SubStatus <= AE_CODE_ENV_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_PROGRAMMER:
> -
> -        if (SubStatus <= AE_CODE_PGM_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_ACPI_TABLES:
> -
> -        if (SubStatus <= AE_CODE_TBL_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_AML:
> -
> -        if (SubStatus <= AE_CODE_AML_MAX)
> -        {
> -            Exception = AcpiGbl_ExceptionNames_Aml [SubStatus];
> -        }
> -        break;
> -
> -    case AE_CODE_CONTROL:
> +        return;
> +    }
>
> -        if (SubStatus <= AE_CODE_CTRL_MAX)
> +    while (*Pathname)
> +    {
> +        if (*Pathname == '\\')
>          {
> -            Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus];
> +            *Pathname = '/';
>          }
> -        break;
>
> -    default:
> -        break;
> +        Pathname++;
>      }
> -
> -    return (ACPI_CAST_PTR (const char, Exception));
>  }
> +#endif
>
>
>  /*******************************************************************************
> @@ -1367,5 +1324,3 @@ AcpiUtWalkPackageTree (
>
>      return_ACPI_STATUS (AE_AML_INTERNAL);
>  }
> -
> -
> diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
> index ade2980..4914159 100644
> --- a/src/acpica/source/components/utilities/utobject.c
> +++ b/src/acpica/source/components/utilities/utobject.c
> @@ -438,7 +438,7 @@ AcpiUtCreateStringObject (
>   *
>   * RETURN:      TRUE if object is valid, FALSE otherwise
>   *
> - * DESCRIPTION: Validate a pointer to be an ACPI_OPERAND_OBJECT
> + * DESCRIPTION: Validate a pointer to be of type ACPI_OPERAND_OBJECT
>   *
>   ******************************************************************************/
>
> @@ -464,7 +464,7 @@ AcpiUtValidInternalObject (
>      {
>      case ACPI_DESC_TYPE_OPERAND:
>
> -        /* The object appears to be a valid ACPI_OPERAND_OBJECT  */
> +        /* The object appears to be a valid ACPI_OPERAND_OBJECT */
>
>          return (TRUE);
>
> @@ -545,7 +545,7 @@ AcpiUtDeleteObjectDesc (
>      ACPI_FUNCTION_TRACE_PTR (UtDeleteObjectDesc, Object);
>
>
> -    /* Object must be an ACPI_OPERAND_OBJECT  */
> +    /* Object must be of type ACPI_OPERAND_OBJECT */
>
>      if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
>      {
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index 69df740..3835b47 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -1,6 +1,6 @@
>  /*******************************************************************************
>   *
> - * Module Name: utresrc - Resource managment utilities
> + * Module Name: utresrc - Resource management utilities
>   *
>   ******************************************************************************/
>
> @@ -129,7 +129,7 @@
>
>  /*
>   * Strings used to decode resource descriptors.
> - * Used by both the disasssembler and the debugger resource dump routines
> + * Used by both the disassembler and the debugger resource dump routines
>   */
>  const char                      *AcpiGbl_BmDecode[] =
>  {
> diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
> index 7f2311a..3d73fc5 100644
> --- a/src/acpica/source/components/utilities/uttrack.c
> +++ b/src/acpica/source/components/utilities/uttrack.c
> @@ -705,21 +705,21 @@ AcpiUtDumpAllocations (
>                      switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor))
>                      {
>                      case ACPI_DESC_TYPE_OPERAND:
> -                        if (Element->Size == sizeof (ACPI_DESC_TYPE_OPERAND))
> +                        if (Element->Size == sizeof (ACPI_OPERAND_OBJECT))
>                          {
>                              DescriptorType = ACPI_DESC_TYPE_OPERAND;
>                          }
>                          break;
>
>                      case ACPI_DESC_TYPE_PARSER:
> -                        if (Element->Size == sizeof (ACPI_DESC_TYPE_PARSER))
> +                        if (Element->Size == sizeof (ACPI_PARSE_OBJECT))
>                          {
>                              DescriptorType = ACPI_DESC_TYPE_PARSER;
>                          }
>                          break;
>
>                      case ACPI_DESC_TYPE_NAMED:
> -                        if (Element->Size == sizeof (ACPI_DESC_TYPE_NAMED))
> +                        if (Element->Size == sizeof (ACPI_NAMESPACE_NODE))
>                          {
>                              DescriptorType = ACPI_DESC_TYPE_NAMED;
>                          }
> diff --git a/src/acpica/source/components/utilities/utxferror.c b/src/acpica/source/components/utilities/utxferror.c
> index 8a98a89..c0961a2 100644
> --- a/src/acpica/source/components/utilities/utxferror.c
> +++ b/src/acpica/source/components/utilities/utxferror.c
> @@ -159,6 +159,9 @@ extern FILE                 *AcpiGbl_OutputFile;
>  #define ACPI_MSG_WARNING        "ACPI Warning: "
>  #define ACPI_MSG_INFO           "ACPI: "
>
> +#define ACPI_MSG_BIOS_ERROR     "ACPI Firmware Error: "
> +#define ACPI_MSG_BIOS_WARNING   "ACPI Firmware Warning: "
> +
>  /*
>   * Common message suffix
>   */
> @@ -324,6 +327,84 @@ AcpiInfo (
>  ACPI_EXPORT_SYMBOL (AcpiInfo)
>
>
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiBiosError
> + *
> + * PARAMETERS:  ModuleName          - Caller's module name (for error output)
> + *              LineNumber          - Caller's line number (for error output)
> + *              Format              - Printf format string + additional args
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Print "ACPI Firmware Error" message with module/line/version
> + *              info
> + *
> + ******************************************************************************/
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosError (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...)
> +{
> +    va_list                 ArgList;
> +
> +
> +    ACPI_MSG_REDIRECT_BEGIN;
> +    AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
> +
> +    va_start (ArgList, Format);
> +    AcpiOsVprintf (Format, ArgList);
> +    ACPI_MSG_SUFFIX;
> +    va_end (ArgList);
> +
> +    ACPI_MSG_REDIRECT_END;
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiBiosError)
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiBiosWarning
> + *
> + * PARAMETERS:  ModuleName          - Caller's module name (for error output)
> + *              LineNumber          - Caller's line number (for error output)
> + *              Format              - Printf format string + additional args
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Print "ACPI Firmware Warning" message with module/line/version
> + *              info
> + *
> + ******************************************************************************/
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosWarning (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...)
> +{
> +    va_list                 ArgList;
> +
> +
> +    ACPI_MSG_REDIRECT_BEGIN;
> +    AcpiOsPrintf (ACPI_MSG_BIOS_WARNING);
> +
> +    va_start (ArgList, Format);
> +    AcpiOsVprintf (Format, ArgList);
> +    ACPI_MSG_SUFFIX;
> +    va_end (ArgList);
> +
> +    ACPI_MSG_REDIRECT_END;
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiBiosWarning)
> +
> +
>  /*
>   * The remainder of this module contains internal error functions that may
>   * be configured out.
> diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h
> index 4a9ecf0..45cfb26 100644
> --- a/src/acpica/source/include/acdebug.h
> +++ b/src/acpica/source/include/acdebug.h
> @@ -184,8 +184,7 @@ AcpiDbDisplayTemplate (
>
>  void
>  AcpiDbUnloadAcpiTable (
> -    char                    *TableArg,
> -    char                    *InstanceArg);
> +    char                    *Name);
>
>  void
>  AcpiDbSendNotify (
> @@ -477,7 +476,7 @@ AcpiDbLocalNsLookup (
>      char                    *Name);
>
>  void
> -AcpiDbUInt32ToHexString (
> +AcpiDbUint32ToHexString (
>      UINT32                  Value,
>      char                    *Buffer);
>
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 9e8f2e3..056e8ea 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -591,6 +591,14 @@ AcpiDmMethodFlags (
>      ACPI_PARSE_OBJECT       *Op);
>
>  void
> +AcpiDmPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op);
> +
> +void
> +AcpiDmFieldPredefinedDescription (
> +    ACPI_PARSE_OBJECT       *Op);
> +
> +void
>  AcpiDmFieldFlags (
>      ACPI_PARSE_OBJECT       *Op);
>
> diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
> index 7129954..ccc6f71 100644
> --- a/src/acpica/source/include/acexcep.h
> +++ b/src/acpica/source/include/acexcep.h
> @@ -125,6 +125,7 @@
>  #define AE_CODE_ACPI_TABLES             0x2000
>  #define AE_CODE_AML                     0x3000
>  #define AE_CODE_CONTROL                 0x4000
> +#define AE_CODE_MAX                     0x4000
>  #define AE_CODE_MASK                    0xF000
>
>
> @@ -260,7 +261,7 @@
>
>  /* Exception strings for AcpiFormatException */
>
> -#ifdef DEFINE_ACPI_GLOBALS
> +#ifdef ACPI_DEFINE_EXCEPTION_TABLE
>
>  /*
>   * String versions of the exception codes above
> @@ -379,6 +380,6 @@ char const   *AcpiGbl_ExceptionNames_Ctrl[] =
>      "AE_CTRL_PARSE_PENDING"
>  };
>
> -#endif /* ACPI GLOBALS */
> +#endif /* EXCEPTION_TABLE */
>
>  #endif /* __ACEXCEP_H__ */
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index b27ee3a..b96b658 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -326,8 +326,7 @@ ACPI_EXTERN ACPI_CACHE_T               *AcpiGbl_OperandCache;
>
>  /* Global handlers */
>
> -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  AcpiGbl_DeviceNotify;
> -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  AcpiGbl_SystemNotify;
> +ACPI_EXTERN ACPI_GLOBAL_NOTIFY_HANDLER  AcpiGbl_GlobalNotify[2];
>  ACPI_EXTERN ACPI_EXCEPTION_HANDLER      AcpiGbl_ExceptionHandler;
>  ACPI_EXTERN ACPI_INIT_HANDLER           AcpiGbl_InitHandler;
>  ACPI_EXTERN ACPI_TABLE_HANDLER          AcpiGbl_TableHandler;
> @@ -360,17 +359,8 @@ ACPI_EXTERN UINT8                       AcpiGbl_OsiData;
>  ACPI_EXTERN ACPI_INTERFACE_INFO        *AcpiGbl_SupportedInterfaces;
>  ACPI_EXTERN ACPI_ADDRESS_RANGE         *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
>
> -
>  #ifndef DEFINE_ACPI_GLOBALS
>
> -/* Exception codes */
> -
> -extern char const                       *AcpiGbl_ExceptionNames_Env[];
> -extern char const                       *AcpiGbl_ExceptionNames_Pgm[];
> -extern char const                       *AcpiGbl_ExceptionNames_Tbl[];
> -extern char const                       *AcpiGbl_ExceptionNames_Aml[];
> -extern char const                       *AcpiGbl_ExceptionNames_Ctrl[];
> -
>  /* Other miscellaneous */
>
>  extern BOOLEAN                          AcpiGbl_Shutdown;
> @@ -552,4 +542,14 @@ ACPI_EXTERN UINT32                      AcpiGbl_SizeOfAcpiObjects;
>
>  #endif /* ACPI_DEBUGGER */
>
> +
> +/*****************************************************************************
> + *
> + * Info/help support
> + *
> + ****************************************************************************/
> +
> +extern const AH_PREDEFINED_NAME     AslPredefinedInfo[];
> +
> +
>  #endif /* __ACGLOBAL_H__ */
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index f9065af..00d933e 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -534,6 +534,15 @@ typedef struct acpi_gpe_handler_info
>
>  } ACPI_GPE_HANDLER_INFO;
>
> +/* Notify info for implicit notify, multiple device objects */
> +
> +typedef struct acpi_gpe_notify_info
> +{
> +    ACPI_NAMESPACE_NODE             *DeviceNode;    /* Device to be notified */
> +    struct acpi_gpe_notify_info     *Next;
> +
> +} ACPI_GPE_NOTIFY_INFO;
> +
>  /*
>   * GPE dispatch info. At any time, the GPE can have at most one type
>   * of dispatch - Method, Handler, or Implicit Notify.
> @@ -541,8 +550,8 @@ typedef struct acpi_gpe_handler_info
>  typedef union acpi_gpe_dispatch_info
>  {
>      ACPI_NAMESPACE_NODE             *MethodNode;    /* Method node for this GPE level */
> -    struct acpi_gpe_handler_info    *Handler;       /* Installed GPE handler */
> -    ACPI_NAMESPACE_NODE             *DeviceNode;    /* Parent _PRW device for implicit notify */
> +    ACPI_GPE_HANDLER_INFO           *Handler;       /* Installed GPE handler */
> +    ACPI_GPE_NOTIFY_INFO            *NotifyList;    /* List of _PRW devices for implicit notifies */
>
>  } ACPI_GPE_DISPATCH_INFO;
>
> @@ -552,7 +561,7 @@ typedef union acpi_gpe_dispatch_info
>   */
>  typedef struct acpi_gpe_event_info
>  {
> -    union acpi_gpe_dispatch_info    Dispatch;       /* Either Method or Handler */
> +    union acpi_gpe_dispatch_info    Dispatch;       /* Either Method, Handler, or NotifyList */
>      struct acpi_gpe_register_info   *RegisterInfo;  /* Backpointer to register info */
>      UINT8                           Flags;          /* Misc info about this GPE */
>      UINT8                           GpeNumber;      /* This GPE */
> @@ -788,6 +797,15 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
>      struct acpi_walk_state          *WalkState);
>
>
> +/* Global handlers for AML Notifies */
> +
> +typedef struct acpi_global_notify_handler
> +{
> +    ACPI_NOTIFY_HANDLER             Handler;
> +    void                            *Context;
> +
> +} ACPI_GLOBAL_NOTIFY_HANDLER;
> +
>  /*
>   * Notify info - used to pass info to the deferred notify
>   * handler/dispatcher.
> @@ -795,8 +813,10 @@ ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
>  typedef struct acpi_notify_info
>  {
>      ACPI_STATE_COMMON
> +    UINT8                           HandlerListId;
>      ACPI_NAMESPACE_NODE             *Node;
> -    union acpi_operand_object       *HandlerObj;
> +    union acpi_operand_object       *HandlerListHead;
> +    ACPI_GLOBAL_NOTIFY_HANDLER      *Global;
>
>  } ACPI_NOTIFY_INFO;
>
> @@ -1021,6 +1041,7 @@ typedef struct acpi_parse_state
>  #define ACPI_PARSEOP_IGNORE             0x01
>  #define ACPI_PARSEOP_PARAMLIST          0x02
>  #define ACPI_PARSEOP_EMPTY_TERMLIST     0x04
> +#define ACPI_PARSEOP_PREDEF_CHECKED     0x08
>  #define ACPI_PARSEOP_SPECIAL            0x10
>
>
> @@ -1372,4 +1393,20 @@ typedef struct acpi_debug_mem_block
>  #define ACPI_NUM_MEM_LISTS              2
>
>
> +/*****************************************************************************
> + *
> + * Info/help support
> + *
> + ****************************************************************************/
> +
> +typedef struct ah_predefined_name
> +{
> +    char            *Name;
> +    char            *Description;
> +#ifndef ACPI_ASL_COMPILER
> +    char            *Action;
> +#endif
> +
> +} AH_PREDEFINED_NAME;
> +
>  #endif /* __ACLOCAL_H__ */
> diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
> index 5451d84..3cf0ac0 100644
> --- a/src/acpica/source/include/acmacros.h
> +++ b/src/acpica/source/include/acmacros.h
> @@ -346,8 +346,8 @@
>  #define ACPI_INSERT_BITS(Target, Mask, Source)          Target = ((Target & (~(Mask))) | (Source & Mask))
>
>  /*
> - * An ACPI_NAMESPACE_NODE can appear in some contexts
> - * where a pointer to an ACPI_OPERAND_OBJECT can also
> + * An object of type ACPI_NAMESPACE_NODE can appear in some contexts
> + * where a pointer to an object of type ACPI_OPERAND_OBJECT can also
>   * appear. This macro is used to distinguish them.
>   *
>   * The "Descriptor" field is the first field in both structures.
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index 009232a..9014d4f 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -166,7 +166,7 @@
>
>  #define AOPOBJ_AML_CONSTANT         0x01    /* Integer is an AML constant */
>  #define AOPOBJ_STATIC_POINTER       0x02    /* Data is part of an ACPI table, don't delete */
> -#define AOPOBJ_DATA_VALID           0x04    /* Object is intialized and data is valid */
> +#define AOPOBJ_DATA_VALID           0x04    /* Object is initialized and data is valid */
>  #define AOPOBJ_OBJECT_INITIALIZED   0x08    /* Region is initialized, _REG was run */
>  #define AOPOBJ_SETUP_COMPLETE       0x10    /* Region setup is complete */
>  #define AOPOBJ_INVALID              0x20    /* Host OS won't allow a Region address */
> @@ -195,8 +195,8 @@ typedef struct acpi_object_integer
>
>
>  /*
> - * Note: The String and Buffer object must be identical through the Pointer
> - * and length elements.  There is code that depends on this.
> + * Note: The String and Buffer object must be identical through the
> + * pointer and length elements. There is code that depends on this.
>   *
>   * Fields common to both Strings and Buffers
>   */
> @@ -318,8 +318,7 @@ typedef struct acpi_object_method
>   * Common fields for objects that support ASL notifications
>   */
>  #define ACPI_COMMON_NOTIFY_INFO \
> -    union acpi_operand_object       *SystemNotify;      /* Handler for system notifies */\
> -    union acpi_operand_object       *DeviceNotify;      /* Handler for driver notifies */\
> +    union acpi_operand_object       *NotifyList[2];     /* Handlers for system/device notifies */\
>      union acpi_operand_object       *Handler;           /* Handler for Address space */
>
>
> @@ -461,8 +460,10 @@ typedef struct acpi_object_notify_handler
>  {
>      ACPI_OBJECT_COMMON_HEADER
>      ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
> -    ACPI_NOTIFY_HANDLER             Handler;
> +    UINT32                          HandlerType;        /* Type: Device/System/Both */
> +    ACPI_NOTIFY_HANDLER             Handler;            /* Handler address */
>      void                            *Context;
> +    union acpi_operand_object       *Next[2];           /* Device and System handler lists */
>
>  } ACPI_OBJECT_NOTIFY_HANDLER;
>
> @@ -476,7 +477,7 @@ typedef struct acpi_object_addr_handler
>      ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
>      void                            *Context;
>      ACPI_ADR_SPACE_SETUP            Setup;
> -    union acpi_operand_object       *RegionList;        /* regions using this handler */
> +    union acpi_operand_object       *RegionList;        /* Regions using this handler */
>      union acpi_operand_object       *Next;
>
>  } ACPI_OBJECT_ADDR_HANDLER;
> diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
> index 12f7851..cbdbd8f 100644
> --- a/src/acpica/source/include/acoutput.h
> +++ b/src/acpica/source/include/acoutput.h
> @@ -289,6 +289,8 @@
>  #define ACPI_WARNING(plist)             AcpiWarning plist
>  #define ACPI_EXCEPTION(plist)           AcpiException plist
>  #define ACPI_ERROR(plist)               AcpiError plist
> +#define ACPI_BIOS_WARNING(plist)        AcpiBiosWarning plist
> +#define ACPI_BIOS_ERROR(plist)          AcpiBiosError plist
>  #define ACPI_DEBUG_OBJECT(obj,l,i)      AcpiExDoDebugObject(obj,l,i)
>
>  #else
> @@ -299,6 +301,8 @@
>  #define ACPI_WARNING(plist)
>  #define ACPI_EXCEPTION(plist)
>  #define ACPI_ERROR(plist)
> +#define ACPI_BIOS_WARNING(plist)
> +#define ACPI_BIOS_ERROR(plist)
>  #define ACPI_DEBUG_OBJECT(obj,l,i)
>
>  #endif /* ACPI_NO_ERROR_MESSAGES */
> diff --git a/src/acpica/source/include/acpiosxf.h b/src/acpica/source/include/acpiosxf.h
> index d6d205f..48d8aa4 100644
> --- a/src/acpica/source/include/acpiosxf.h
> +++ b/src/acpica/source/include/acpiosxf.h
> @@ -348,7 +348,7 @@ AcpiOsExecute (
>
>  void
>  AcpiOsWaitEventsComplete (
> -    void                    *Context);
> +    void);
>
>  void
>  AcpiOsSleep (
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 2d4a5f8..036d817 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -120,7 +120,7 @@
>
>  /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION                 0x20120320
> +#define ACPI_CA_VERSION                 0x20120711
>
>  #include "acconfig.h"
>  #include "actypes.h"
> @@ -273,6 +273,22 @@ AcpiFree (
>
>
>  /*
> + * ACPI table load/unload interfaces
> + */
> +ACPI_STATUS
> +AcpiLoadTable (
> +    ACPI_TABLE_HEADER       *Table);
> +
> +ACPI_STATUS
> +AcpiUnloadParentTable (
> +    ACPI_HANDLE             Object);
> +
> +ACPI_STATUS
> +AcpiLoadTables (
> +    void);
> +
> +
> +/*
>   * ACPI table manipulation interfaces
>   */
>  ACPI_STATUS
> @@ -284,10 +300,6 @@ AcpiFindRootPointer (
>      ACPI_SIZE               *RsdpAddress);
>
>  ACPI_STATUS
> -AcpiLoadTables (
> -    void);
> -
> -ACPI_STATUS
>  AcpiGetTableHeader (
>      ACPI_STRING             Signature,
>      UINT32                  Instance,
> @@ -829,6 +841,20 @@ AcpiInfo (
>      const char              *Format,
>      ...) ACPI_PRINTF_LIKE(3);
>
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosError (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...) ACPI_PRINTF_LIKE(3);
> +
> +void ACPI_INTERNAL_VAR_XFACE
> +AcpiBiosWarning (
> +    const char              *ModuleName,
> +    UINT32                  LineNumber,
> +    const char              *Format,
> +    ...) ACPI_PRINTF_LIKE(3);
> +
>
>  /*
>   * Debug output
> diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
> index 82a1cb3..8da4836 100644
> --- a/src/acpica/source/include/acpredef.h
> +++ b/src/acpica/source/include/acpredef.h
> @@ -584,14 +584,14 @@ static const ACPI_PREDEFINED_INFO     PredefinedNames[] =
>      {{"_TMP", 0, ACPI_RTYPE_INTEGER}},
>      {{"_TPC", 0, ACPI_RTYPE_INTEGER}},
>      {{"_TPT", 1, 0}},
> -    {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2Ref/6Int */
> +    {{"_TRT", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 2 Ref/6 Int */
>                      {{{ACPI_PTYPE2, ACPI_RTYPE_REFERENCE, 2, ACPI_RTYPE_INTEGER}, 6, 0}},
>
> -    {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int with count */
> +    {{"_TSD", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int with count */
>                      {{{ACPI_PTYPE2_COUNT,ACPI_RTYPE_INTEGER, 5,0}, 0,0}},
>
>      {{"_TSP", 0, ACPI_RTYPE_INTEGER}},
> -    {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5Int */
> +    {{"_TSS", 0, ACPI_RTYPE_PACKAGE}}, /* Variable-length (Pkgs) each 5 Int */
>                      {{{ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 5,0}, 0,0}},
>
>      {{"_TST", 0, ACPI_RTYPE_INTEGER}},
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index 6e6edcc..c046b05 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -202,7 +202,7 @@ typedef struct acpi_table_bert
>  {
>      ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
>      UINT32                  RegionLength;       /* Length of the boot error region */
> -    UINT64                  Address;            /* Physical addresss of the error region */
> +    UINT64                  Address;            /* Physical address of the error region */
>
>  } ACPI_TABLE_BERT;
>
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index ff90c38..5d01e32 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -780,10 +780,14 @@ typedef UINT32                          ACPI_EVENT_STATUS;
>  #define ACPI_DEVICE_NOTIFY              0x2
>  #define ACPI_ALL_NOTIFY                 (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY)
>  #define ACPI_MAX_NOTIFY_HANDLER_TYPE    0x3
> +#define ACPI_NUM_NOTIFY_TYPES           2
>
>  #define ACPI_MAX_SYS_NOTIFY             0x7F
>  #define ACPI_MAX_DEVICE_SPECIFIC_NOTIFY 0xBF
>
> +#define ACPI_SYSTEM_HANDLER_LIST        0 /* Used as index, must be SYSTEM_NOTIFY -1 */
> +#define ACPI_DEVICE_HANDLER_LIST        1 /* Used as index, must be DEVICE_NOTIFY -1 */
> +
>
>  /* Address Space (Operation Region) Types */
>
> @@ -799,8 +803,9 @@ typedef UINT8                           ACPI_ADR_SPACE_TYPE;
>  #define ACPI_ADR_SPACE_IPMI             (ACPI_ADR_SPACE_TYPE) 7
>  #define ACPI_ADR_SPACE_GPIO             (ACPI_ADR_SPACE_TYPE) 8
>  #define ACPI_ADR_SPACE_GSBUS            (ACPI_ADR_SPACE_TYPE) 9
> +#define ACPI_ADR_SPACE_PLATFORM_COMM    (ACPI_ADR_SPACE_TYPE) 10
>
> -#define ACPI_NUM_PREDEFINED_REGIONS     10
> +#define ACPI_NUM_PREDEFINED_REGIONS     11
>
>  /*
>   * Special Address Spaces
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 5c21320..50b5b99 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -501,7 +501,7 @@ AcpiUtDumpBuffer (
>      UINT8                   *Buffer,
>      UINT32                  Count,
>      UINT32                  Display,
> -    UINT32                  componentId);
> +    UINT32                  ComponentId);
>
>  void
>  AcpiUtDumpBuffer2 (
> @@ -775,6 +775,10 @@ AcpiUtShortDivide (
>  /*
>   * utmisc
>   */
> +void
> +UtConvertBackslashes (
> +    char                    *Pathname);
> +
>  const char *
>  AcpiUtValidateException (
>      ACPI_STATUS             Status);
> diff --git a/src/acpica/source/include/platform/acenv.h b/src/acpica/source/include/platform/acenv.h
> index 342615f..1f3596a 100644
> --- a/src/acpica/source/include/platform/acenv.h
> +++ b/src/acpica/source/include/platform/acenv.h
> @@ -180,9 +180,9 @@
>  #endif
>
>  #ifdef ACPI_HELP_APP
> -#define ACPI_DEBUG_OUTPUT
>  #define ACPI_APPLICATION
>  #define ACPI_SINGLE_THREADED
> +#define ACPI_NO_ERROR_MESSAGES
>  #endif
>
>  /* Linkable ACPICA library */
> @@ -252,6 +252,9 @@
>  #elif defined(_AED_EFI)
>  #include "acefi.h"
>
> +#elif defined(__HAIKU__)
> +#include "achaiku.h"
> +
>  #else
>
>  /* Unknown environment */
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index d5e3af9..840328b 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -425,7 +425,7 @@ AcpiOsGetLine (
>      UINT32                  BufferLength,
>      UINT32                  *BytesRead)
>  {
> -    UINT8                   Temp;
> +    int                     Temp;
>      UINT32                  i;
>
>
> @@ -436,13 +436,17 @@ AcpiOsGetLine (
>              return (AE_BUFFER_OVERFLOW);
>          }
>
> -        scanf ("%1c", &Temp);
> +        if ((Temp = getchar ()) == EOF)
> +        {
> +            return (AE_ERROR);
> +        }
> +
>          if (!Temp || Temp == '\n')
>          {
>              break;
>          }
>
> -        Buffer [i] = Temp;
> +        Buffer [i] = (char) Temp;
>      }
>
>      /* Null terminate the buffer */
> @@ -1313,3 +1317,24 @@ AcpiOsExecute (
>  }
>
>  #endif /* ACPI_SINGLE_THREADED */
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AcpiOsWaitEventsComplete
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Wait for all asynchronous events to complete. This
> + *              implementation does nothing.
> + *
> + *****************************************************************************/
> +
> +void
> +AcpiOsWaitEventsComplete (
> +    void)
> +{
> +    return;
> +}
> diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
> index 01615b1..0f5f789 100644
> --- a/src/acpica/source/tools/acpiexec/aecommon.h
> +++ b/src/acpica/source/tools/acpiexec/aecommon.h
> @@ -140,6 +140,7 @@ extern BOOLEAN              AcpiGbl_IgnoreErrors;
>  extern UINT8                AcpiGbl_RegionFillValue;
>  extern UINT8                AcpiGbl_UseHwReducedFadt;
>  extern BOOLEAN              AcpiGbl_DisplayRegionAccess;
> +extern BOOLEAN              AcpiGbl_DoInterfaceTests;
>
>  /* Check for unexpected exceptions */
>
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index ccf6966..ba7e5a1 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -121,12 +121,24 @@
>  /* Local prototypes */
>
>  static void
> -AeNotifyHandler (
> +AeNotifyHandler1 (
>      ACPI_HANDLE             Device,
>      UINT32                  Value,
>      void                    *Context);
>
>  static void
> +AeNotifyHandler2 (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    void                    *Context);
> +
> +static void
> +AeCommonNotifyHandler (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    UINT32                  HandlerId);
> +
> +static void
>  AeDeviceNotifyHandler (
>      ACPI_HANDLE             Device,
>      UINT32                  Value,
> @@ -258,24 +270,51 @@ AeCtrlCHandler (
>
>  /******************************************************************************
>   *
> - * FUNCTION:    AeNotifyHandler
> + * FUNCTION:    AeNotifyHandler(s)
>   *
>   * PARAMETERS:  Standard notify handler parameters
>   *
>   * RETURN:      Status
>   *
> - * DESCRIPTION: System notify handler for AcpiExec utility.  Used by the ASL
> + * DESCRIPTION: Notify handlers for AcpiExec utility. Used by the ASL
>   *              test suite(s) to communicate errors and other information to
> - *              this utility via the Notify() operator.
> + *              this utility via the Notify() operator. Tests notify handling
> + *              and multiple notify handler support.
>   *
>   *****************************************************************************/
>
>  static void
> -AeNotifyHandler (
> -    ACPI_HANDLE                 Device,
> -    UINT32                      Value,
> -    void                        *Context)
> +AeNotifyHandler1 (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    void                    *Context)
> +{
> +    AeCommonNotifyHandler (Device, Value, 1);
> +}
> +
> +static void
> +AeNotifyHandler2 (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    void                    *Context)
>  {
> +    AeCommonNotifyHandler (Device, Value, 2);
> +}
> +
> +static void
> +AeCommonNotifyHandler (
> +    ACPI_HANDLE             Device,
> +    UINT32                  Value,
> +    UINT32                  HandlerId)
> +{
> +    char                    *Type;
> +
> +
> +    Type = "Device";
> +    if (Value <= ACPI_MAX_SYS_NOTIFY)
> +    {
> +        Type = "System";
> +    }
>
>      switch (Value)
>      {
> @@ -309,12 +348,13 @@ AeNotifyHandler (
>  #endif
>
>      default:
> -        printf ("[AcpiExec] Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> -            AcpiUtGetNodeName (Device), Device, Value,
> +        printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +            HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
>              AcpiUtGetNotifyName (Value));
>          if (AcpiGbl_DebugFile)
>          {
> -            AcpiOsPrintf ("[AcpiExec] Received a system notify, Value 0x%2.2X\n", Value);
> +            AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
> +                HandlerId, Type, Value);
>          }
>
>          (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -325,6 +365,39 @@ AeNotifyHandler (
>
>  /******************************************************************************
>   *
> + * FUNCTION:    AeSystemNotifyHandler
> + *
> + * PARAMETERS:  Standard notify handler parameters
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: System notify handler for AcpiExec utility.  Used by the ASL
> + *              test suite(s) to communicate errors and other information to
> + *              this utility via the Notify() operator.
> + *
> + *****************************************************************************/
> +
> +static void
> +AeSystemNotifyHandler (
> +    ACPI_HANDLE                 Device,
> +    UINT32                      Value,
> +    void                        *Context)
> +{
> +
> +    printf ("[AcpiExec] Global:    Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +        AcpiUtGetNodeName (Device), Device, Value,
> +        AcpiUtGetNotifyName (Value));
> +    if (AcpiGbl_DebugFile)
> +    {
> +        AcpiOsPrintf ("[AcpiExec] Global:    Received a System Notify, Value 0x%2.2X\n", Value);
> +    }
> +
> +    (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> +}
> +
> +
> +/******************************************************************************
> + *
>   * FUNCTION:    AeDeviceNotifyHandler
>   *
>   * PARAMETERS:  Standard notify handler parameters
> @@ -344,12 +417,12 @@ AeDeviceNotifyHandler (
>      void                        *Context)
>  {
>
> -    printf ("[AcpiExec] Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +    printf ("[AcpiExec] Global:    Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
>          AcpiUtGetNodeName (Device), Device, Value,
>          AcpiUtGetNotifyName (Value));
>      if (AcpiGbl_DebugFile)
>      {
> -        AcpiOsPrintf ("[AcpiExec] Received a device notify, Value 0x%2.2X\n", Value);
> +        AcpiOsPrintf ("[AcpiExec] Global:    Received a Device Notify, Value 0x%2.2X\n", Value);
>      }
>
>      (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -759,18 +832,18 @@ AeInstallEarlyHandlers (
>              AcpiFormatException (Status));
>      }
>
> -    /* Install global notify handler */
> +    /* Install global notify handlers */
>
>      Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
> -                                        AeNotifyHandler, NULL);
> +        AeSystemNotifyHandler, NULL);
>      if (ACPI_FAILURE (Status))
>      {
> -        printf ("Could not install a global notify handler, %s\n",
> +        printf ("Could not install a global system notify handler, %s\n",
>              AcpiFormatException (Status));
>      }
>
>      Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
> -                                        AeDeviceNotifyHandler, NULL);
> +        AeDeviceNotifyHandler, NULL);
>      if (ACPI_FAILURE (Status))
>      {
>          printf ("Could not install a global notify handler, %s\n",
> @@ -781,7 +854,7 @@ AeInstallEarlyHandlers (
>      if (ACPI_SUCCESS (Status))
>      {
>          Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> -                                            AeNotifyHandler, NULL);
> +            AeNotifyHandler1, NULL);
>          if (ACPI_FAILURE (Status))
>          {
>              printf ("Could not install a notify handler, %s\n",
> @@ -789,7 +862,7 @@ AeInstallEarlyHandlers (
>          }
>
>          Status = AcpiRemoveNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> -                                            AeNotifyHandler);
> +            AeNotifyHandler1);
>          if (ACPI_FAILURE (Status))
>          {
>              printf ("Could not remove a notify handler, %s\n",
> @@ -797,20 +870,35 @@ AeInstallEarlyHandlers (
>          }
>
>          Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> -                                            AeNotifyHandler, NULL);
> +            AeNotifyHandler1, NULL);
>          AE_CHECK_OK (AcpiInstallNotifyHandler, Status);
>
>          Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> -                                            AeNotifyHandler);
> +            AeNotifyHandler1);
>          AE_CHECK_OK (AcpiRemoveNotifyHandler, Status);
>
> +#if 0
>          Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> -                                            AeNotifyHandler, NULL);
> +            AeNotifyHandler1, NULL);
>          if (ACPI_FAILURE (Status))
>          {
>              printf ("Could not install a notify handler, %s\n",
>                  AcpiFormatException (Status));
>          }
> +#endif
> +
> +        /* Install two handlers for _SB_ */
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> +        /* Attempt duplicate handler installation, should fail */
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x77777777));
>
>          Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
>          AE_CHECK_OK (AcpiAttachData, Status);
> @@ -827,6 +915,37 @@ AeInstallEarlyHandlers (
>      }
>
>
> +    Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> +        Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1);
> +        Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler2);
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +    }
> +
> +    Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
> +            AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
> +
> +        Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
> +            AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
> +    }
> +
>      /*
>       * Install handlers that will override the default handlers for some of
>       * the space IDs.
> --
> 1.7.10.4
>
Acked-by: Keng-Yu Lin <kengyu@canonical.com>

Patch

diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
index 3187432..e2213d5 100644
--- a/src/acpica/Makefile.am
+++ b/src/acpica/Makefile.am
@@ -175,6 +175,7 @@  libfwtsacpica_la_SOURCES = \
 	$(ACPICA_COMP)/tables/tbutils.c \
 	$(ACPICA_COMP)/tables/tbxface.c \
 	$(ACPICA_COMP)/tables/tbxfroot.c \
+	$(ACPICA_COMP)/tables/tbxfload.c \
 	$(ACPICA_COMP)/utilities/utaddress.c \
 	$(ACPICA_COMP)/utilities/utalloc.c \
 	$(ACPICA_COMP)/utilities/utcache.c \
@@ -197,6 +198,7 @@  libfwtsacpica_la_SOURCES = \
 	$(ACPICA_COMP)/utilities/utxferror.c \
 	$(ACPICA_COMP)/utilities/utxface.c \
 	$(ACPICA_COMP)/utilities/utdecode.c \
+	$(ACPICA_COMP)/utilities/utexcep.c \
 	$(ACPICA_SRC)/tools/acpiexec/aehandlers.c
 
 libfwtsacpica_la_LIBADD = \
diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
index f4e33e2..36c3176 100644
--- a/src/acpica/source/common/adfile.c
+++ b/src/acpica/source/common/adfile.c
@@ -370,20 +370,24 @@  FlSplitInputPathname (
         return (AE_NO_MEMORY);
     }
 
-    Substring = strrchr (DirectoryPath, '\\');
+    /* Convert backslashes to slashes in the entire path */
+
+    UtConvertBackslashes (DirectoryPath);
+
+    /* Backup to last slash or colon */
+
+    Substring = strrchr (DirectoryPath, '/');
     if (!Substring)
     {
-        Substring = strrchr (DirectoryPath, '/');
-        if (!Substring)
-        {
-            Substring = strrchr (DirectoryPath, ':');
-        }
+        Substring = strrchr (DirectoryPath, ':');
     }
 
+    /* Extract the simple filename */
+
     if (!Substring)
     {
+        Filename = FlStrdup (DirectoryPath);
         DirectoryPath[0] = 0;
-        Filename = FlStrdup (InputPath);
     }
     else
     {
@@ -398,7 +402,6 @@  FlSplitInputPathname (
 
     *OutDirectoryPath = DirectoryPath;
     *OutFilename = Filename;
-
     return (AE_OK);
 }
 
diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
index eeb61d8..00d9bb6 100644
--- a/src/acpica/source/common/adwalk.c
+++ b/src/acpica/source/common/adwalk.c
@@ -593,6 +593,7 @@  AcpiDmFindOrphanDescending (
 
         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
             (OpInfo->Class != AML_CLASS_CREATE) &&
+            (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
             (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
             !Op->Common.Node)
         {
@@ -815,13 +816,23 @@  AcpiDmXrefDescendingOp (
 
     if (OpInfo->Flags & AML_NAMED)
     {
-        if ((Op->Common.AmlOpcode == AML_ALIAS_OP) ||
-            (Op->Common.AmlOpcode == AML_SCOPE_OP))
+        /*
+         * Only these two operators (Alias, Scope) refer to an existing
+         * name, it is the first argument
+         */
+        if (Op->Common.AmlOpcode == AML_ALIAS_OP)
+        {
+            ObjectType = ACPI_TYPE_ANY;
+
+            NextOp = Op->Common.Value.Arg;
+            NextOp = NextOp->Common.Value.Arg;
+            if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
+            {
+                Path = NextOp->Common.Value.String;
+            }
+        }
+        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
         {
-            /*
-             * Only these two operators refer to an existing name,
-             * first argument
-             */
             Path = (char *) Op->Named.Path;
         }
     }
@@ -829,6 +840,8 @@  AcpiDmXrefDescendingOp (
     {
         /* Referenced Buffer Name is the first child */
 
+        ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
+
         NextOp = Op->Common.Value.Arg;
         if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
         {
@@ -855,6 +868,11 @@  AcpiDmXrefDescendingOp (
     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
                 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
                 WalkState, &Node);
+    if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
+    {
+        Status = AE_NOT_FOUND;
+    }
+
     if (ACPI_FAILURE (Status))
     {
         if (Status == AE_NOT_FOUND)
diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
index 8b8402e..622db8a 100644
--- a/src/acpica/source/common/dmextern.c
+++ b/src/acpica/source/common/dmextern.c
@@ -293,8 +293,10 @@  AcpiDmNormalizeParentPrefix (
      */
     ACPI_STRCAT (Fullpath, ParentPath);
 
-    /* Add dot separator (don't need dot if parent fullpath is a single "\") */
-
+    /*
+     * Add dot separator
+     * (don't need dot if parent fullpath is a single backslash)
+     */
     if (ParentPath[1])
     {
         ACPI_STRCAT (Fullpath, ".");
@@ -526,12 +528,12 @@  AcpiDmAddToExternalList (
 
     NewExternal->InternalPath = Path;
 
-    /* Link the new descriptor into the global list, ordered by string length */
+    /* Link the new descriptor into the global list, alphabetically ordered */
 
     NextExternal = AcpiGbl_ExternalList;
     while (NextExternal)
     {
-        if (NewExternal->Length <= NextExternal->Length)
+        if (AcpiUtStricmp (NewExternal->Path, NextExternal->Path) < 0)
         {
             if (PrevExternal)
             {
@@ -580,7 +582,7 @@  AcpiDmAddExternalsToNamespace (
 {
     ACPI_STATUS             Status;
     ACPI_NAMESPACE_NODE     *Node;
-    ACPI_OPERAND_OBJECT     *MethodDesc;
+    ACPI_OPERAND_OBJECT     *ObjDesc;
     ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
 
 
@@ -599,13 +601,29 @@  AcpiDmAddExternalsToNamespace (
                 "while adding external to namespace [%s]",
                 External->Path));
         }
-        else if (External->Type == ACPI_TYPE_METHOD)
+
+        else switch (External->Type)
         {
+        case ACPI_TYPE_METHOD:
+
             /* For methods, we need to save the argument count */
 
-            MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
-            MethodDesc->Method.ParamCount = (UINT8) External->Value;
-            Node->Object = MethodDesc;
+            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
+            ObjDesc->Method.ParamCount = (UINT8) External->Value;
+            Node->Object = ObjDesc;
+            break;
+
+        case ACPI_TYPE_REGION:
+
+            /* Regions require a region sub-object */
+
+            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
+            ObjDesc->Region.Node = Node;
+            Node->Object = ObjDesc;
+            break;
+
+        default:
+            break;
         }
 
         External = External->Next;
diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
index 1f0c5fb..9afaad3 100644
--- a/src/acpica/source/common/dmrestag.c
+++ b/src/acpica/source/common/dmrestag.c
@@ -145,6 +145,7 @@  AcpiDmGetResourceTag (
 
 static char *
 AcpiGetTagPathname (
+    ACPI_PARSE_OBJECT       *Op,
     ACPI_NAMESPACE_NODE     *BufferNode,
     ACPI_NAMESPACE_NODE     *ResourceNode,
     UINT32                  BitIndex);
@@ -515,7 +516,6 @@  AcpiDmCheckResourceReference (
     ACPI_NAMESPACE_NODE     *BufferNode;
     ACPI_NAMESPACE_NODE     *ResourceNode;
     const ACPI_OPCODE_INFO  *OpInfo;
-    char                    *Pathname;
     UINT32                  BitIndex;
 
 
@@ -591,14 +591,7 @@  AcpiDmCheckResourceReference (
 
     /* Translate the Index to a resource tag pathname */
 
-    Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex);
-    if (Pathname)
-    {
-        /* Complete the conversion of the Index to a symbol */
-
-        IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
-        IndexOp->Common.Value.String = Pathname;
-    }
+    AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex);
 }
 
 
@@ -669,6 +662,7 @@  AcpiDmGetResourceNode (
 
 static char *
 AcpiGetTagPathname (
+    ACPI_PARSE_OBJECT       *IndexOp,
     ACPI_NAMESPACE_NODE     *BufferNode,
     ACPI_NAMESPACE_NODE     *ResourceNode,
     UINT32                  BitIndex)
@@ -761,6 +755,15 @@  AcpiGetTagPathname (
 
     AcpiNsInternalizeName (Pathname, &InternalPath);
     ACPI_FREE (Pathname);
+
+    /* Update the Op with the symbol */
+
+    AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP);
+    IndexOp->Common.Value.String = InternalPath;
+
+    /* We will need the tag later. Cheat by putting it in the Node field */
+
+    IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag);
     return (InternalPath);
 }
 
diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
index cee1f4f..b7a72c9 100644
--- a/src/acpica/source/compiler/Makefile.am
+++ b/src/acpica/source/compiler/Makefile.am
@@ -183,6 +183,7 @@  libfwtsiasl_la_SOURCES = \
 	$(ACPICA_COMMON)/adfile.c \
 	$(ACPICA_COMMON)/adisasm.c \
 	$(ACPICA_COMMON)/adwalk.c \
+	$(ACPICA_COMMON)/ahpredef.c \
 	$(ACPICA_COMMON)/dmextern.c \
 	$(ACPICA_COMMON)/dmrestag.c \
 	$(ACPICA_COMMON)/dmtable.c \
diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
index 371a6e3..623bc3d 100644
--- a/src/acpica/source/compiler/aslcompile.c
+++ b/src/acpica/source/compiler/aslcompile.c
@@ -131,14 +131,18 @@  CmFlushSourceCode (
 
 static void
 FlConsumeAnsiComment (
-    ASL_FILE_INFO           *FileInfo,
+    FILE                    *Handle,
     ASL_FILE_STATUS         *Status);
 
 static void
 FlConsumeNewComment (
-    ASL_FILE_INFO           *FileInfo,
+    FILE                    *Handle,
     ASL_FILE_STATUS         *Status);
 
+static void
+CmDumpAllEvents (
+    void);
+
 
 /*******************************************************************************
  *
@@ -325,7 +329,8 @@  CmFlushSourceCode (
  *
  * FUNCTION:    FlConsume*
  *
- * PARAMETERS:  FileInfo        - Points to an open input file
+ * PARAMETERS:  Handle              - Open input file
+ *              Status              - File current status struct
  *
  * RETURN:      Number of lines consumed
  *
@@ -335,14 +340,14 @@  CmFlushSourceCode (
 
 static void
 FlConsumeAnsiComment (
-    ASL_FILE_INFO           *FileInfo,
+    FILE                    *Handle,
     ASL_FILE_STATUS         *Status)
 {
     UINT8                   Byte;
     BOOLEAN                 ClosingComment = FALSE;
 
 
-    while (fread (&Byte, 1, 1, FileInfo->Handle))
+    while (fread (&Byte, 1, 1, Handle))
     {
         /* Scan until comment close is found */
 
@@ -379,13 +384,13 @@  FlConsumeAnsiComment (
 
 static void
 FlConsumeNewComment (
-    ASL_FILE_INFO           *FileInfo,
+    FILE                    *Handle,
     ASL_FILE_STATUS         *Status)
 {
     UINT8                   Byte;
 
 
-    while (fread (&Byte, 1, 1, FileInfo->Handle))
+    while (fread (&Byte, 1, 1, Handle))
     {
         Status->Offset++;
 
@@ -404,7 +409,9 @@  FlConsumeNewComment (
  *
  * FUNCTION:    FlCheckForAscii
  *
- * PARAMETERS:  FileInfo        - Points to an open input file
+ * PARAMETERS:  Handle              - Open input file
+ *              Filename            - Input filename
+ *              DisplayErrors       - TRUE if error messages desired
  *
  * RETURN:      Status
  *
@@ -419,7 +426,9 @@  FlConsumeNewComment (
 
 ACPI_STATUS
 FlCheckForAscii (
-    ASL_FILE_INFO           *FileInfo)
+    FILE                    *Handle,
+    char                    *Filename,
+    BOOLEAN                 DisplayErrors)
 {
     UINT8                   Byte;
     ACPI_SIZE               BadBytes = 0;
@@ -432,7 +441,7 @@  FlCheckForAscii (
 
     /* Read the entire file */
 
-    while (fread (&Byte, 1, 1, FileInfo->Handle))
+    while (fread (&Byte, 1, 1, Handle))
     {
         /* Ignore comment fields (allow non-ascii within) */
 
@@ -442,12 +451,12 @@  FlCheckForAscii (
 
             if (Byte == '*')
             {
-                FlConsumeAnsiComment (FileInfo, &Status);
+                FlConsumeAnsiComment (Handle, &Status);
             }
 
             if (Byte == '/')
             {
-                FlConsumeNewComment (FileInfo, &Status);
+                FlConsumeNewComment (Handle, &Status);
             }
 
             /* Reset */
@@ -463,7 +472,7 @@  FlCheckForAscii (
 
         if (!ACPI_IS_ASCII (Byte))
         {
-            if (BadBytes < 10)
+            if ((BadBytes < 10) && (DisplayErrors))
             {
                 AcpiOsPrintf (
                     "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n",
@@ -485,20 +494,24 @@  FlCheckForAscii (
 
     /* Seek back to the beginning of the source file */
 
-    fseek (FileInfo->Handle, 0, SEEK_SET);
+    fseek (Handle, 0, SEEK_SET);
 
     /* Were there any non-ASCII characters in the file? */
 
     if (BadBytes)
     {
-        AcpiOsPrintf (
-            "%u non-ASCII characters found in input source text, could be a binary file\n",
-            BadBytes);
-        AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename);
+        if (DisplayErrors)
+        {
+            AcpiOsPrintf (
+                "%u non-ASCII characters found in input source text, could be a binary file\n",
+                BadBytes);
+            AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, Filename);
+        }
+
         return (AE_BAD_CHARACTER);
     }
 
-    /* File is OK */
+    /* File is OK (100% ASCII) */
 
     return (AE_OK);
 }
@@ -780,45 +793,65 @@  CmDoOutputFiles (
 
 /*******************************************************************************
  *
- * FUNCTION:    CmDumpEvent
+ * FUNCTION:    CmDumpAllEvents
  *
- * PARAMETERS:  Event           - A compiler event struct
+ * PARAMETERS:  None
  *
  * RETURN:      None.
  *
- * DESCRIPTION: Dump a compiler event struct
+ * DESCRIPTION: Dump all compiler events
  *
  ******************************************************************************/
 
 static void
-CmDumpEvent (
-    ASL_EVENT_INFO          *Event)
+CmDumpAllEvents (
+    void)
 {
+    ASL_EVENT_INFO          *Event;
     UINT32                  Delta;
     UINT32                  USec;
     UINT32                  MSec;
+    UINT32                  i;
 
-    if (!Event->Valid)
+
+    Event = AslGbl_Events;
+
+    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
+    if (Gbl_CompileTimesFlag)
     {
-        return;
+        printf ("\nElapsed time for major events\n\n");
     }
 
-    /* Delta will be in 100-nanosecond units */
+    for (i = 0; i < AslGbl_NextEvent; i++)
+    {
+        if (Event->Valid)
+        {
+            /* Delta will be in 100-nanosecond units */
 
-    Delta = (UINT32) (Event->EndTime - Event->StartTime);
+            Delta = (UINT32) (Event->EndTime - Event->StartTime);
 
-    USec = Delta / 10;
-    MSec = Delta / 10000;
+            USec = Delta / 10;
+            MSec = Delta / 10000;
 
-    /* Round milliseconds up */
+            /* Round milliseconds up */
 
-    if ((USec - (MSec * 1000)) >= 500)
-    {
-        MSec++;
-    }
+            if ((USec - (MSec * 1000)) >= 500)
+            {
+                MSec++;
+            }
 
-    DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
-        USec, MSec, Event->EventName);
+            DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
+                USec, MSec, Event->EventName);
+
+            if (Gbl_CompileTimesFlag)
+            {
+                printf ("%8u usec %8u msec - %s\n",
+                    USec, MSec, Event->EventName);
+            }
+        }
+
+        Event++;
+    }
 }
 
 
@@ -849,20 +882,12 @@  CmCleanupAndExit (
         AePrintErrorLog (ASL_FILE_STDOUT);
     }
 
-    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
-    for (i = 0; i < AslGbl_NextEvent; i++)
-    {
-        CmDumpEvent (&AslGbl_Events[i]);
-    }
+    /* Emit compile times if enabled */
+
+    CmDumpAllEvents ();
 
     if (Gbl_CompileTimesFlag)
     {
-        printf ("\nElapsed time for major events\n\n");
-        for (i = 0; i < AslGbl_NextEvent; i++)
-        {
-            CmDumpEvent (&AslGbl_Events[i]);
-        }
-
         printf ("\nMiscellaneous compile statistics\n\n");
         printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
         printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
index 29558fc..03303f5 100644
--- a/src/acpica/source/compiler/aslcompiler.h
+++ b/src/acpica/source/compiler/aslcompiler.h
@@ -238,7 +238,9 @@  CmCleanupAndExit (
 
 ACPI_STATUS
 FlCheckForAscii (
-    ASL_FILE_INFO           *FileInfo);
+    FILE                    *Handle,
+    char                    *Filename,
+    BOOLEAN                 DisplayErrors);
 
 
 /*
@@ -680,6 +682,11 @@  void
 FlAddIncludeDirectory (
     char                    *Dir);
 
+char *
+FlMergePathnames (
+    char                    *PrefixDir,
+    char                    *FilePathname);
+
 void
 FlOpenIncludeFile (
     ACPI_PARSE_OBJECT       *Op);
diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
index f911072..98f9e7e 100644
--- a/src/acpica/source/compiler/aslcompiler.l
+++ b/src/acpica/source/compiler/aslcompiler.l
@@ -595,6 +595,7 @@  NamePathTail                [.]{NameSeg}
 "IPMI"                      { count (0); return (PARSEOP_REGIONSPACE_IPMI); }
 "GeneralPurposeIo"          { count (0); return (PARSEOP_REGIONSPACE_GPIO); }       /* ACPI 5.0 */
 "GenericSerialBus"          { count (0); return (PARSEOP_REGIONSPACE_GSBUS); }      /* ACPI 5.0 */
+"PCC"                       { count (0); return (PARSEOP_REGIONSPACE_PCC); }        /* ACPI 5.0 */
 "FFixedHW"                  { count (0); return (PARSEOP_REGIONSPACE_FFIXEDHW); }
 
     /* ResourceTypeKeyword: Resource Usage - Resource Descriptors */
diff --git a/src/acpica/source/compiler/aslcompiler.y b/src/acpica/source/compiler/aslcompiler.y
index 9aa8b51..9675b1d 100644
--- a/src/acpica/source/compiler/aslcompiler.y
+++ b/src/acpica/source/compiler/aslcompiler.y
@@ -435,6 +435,7 @@  void *                      AslLocalAllocate (unsigned int Size);
 %token <i> PARSEOP_REGIONSPACE_IO
 %token <i> PARSEOP_REGIONSPACE_IPMI
 %token <i> PARSEOP_REGIONSPACE_MEM
+%token <i> PARSEOP_REGIONSPACE_PCC
 %token <i> PARSEOP_REGIONSPACE_PCI
 %token <i> PARSEOP_REGIONSPACE_PCIBAR
 %token <i> PARSEOP_REGIONSPACE_SMBUS
@@ -2271,7 +2272,7 @@  AddressKeyword
     ;
 
 AddressSpaceKeyword
-    : ByteConst                             {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
+    : ByteConst                             {$$ = UtCheckIntegerRange ($1, 0x0A, 0xFF);}
     | RegionSpaceKeyword                    {}
     ;
 
@@ -2431,6 +2432,7 @@  RegionSpaceKeyword
     | PARSEOP_REGIONSPACE_IPMI              {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_IPMI);}
     | PARSEOP_REGIONSPACE_GPIO              {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GPIO);}
     | PARSEOP_REGIONSPACE_GSBUS             {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_GSBUS);}
+    | PARSEOP_REGIONSPACE_PCC               {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCC);}
     | PARSEOP_REGIONSPACE_FFIXEDHW          {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_FFIXEDHW);}
     ;
 
diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
index c93a1a2..4d7c846 100644
--- a/src/acpica/source/compiler/aslerror.c
+++ b/src/acpica/source/compiler/aslerror.c
@@ -387,12 +387,16 @@  AePrintException (
         }
         else
         {
+            /*
+             * Less verbose version of the error message, enabled via the
+             * -vi switch. The format is compatible with MS Visual Studio.
+             */
             fprintf (OutputFile, "%s", Enode->Filename);
 
             if (Enode->LineNumber)
             {
-                fprintf (OutputFile, "(%u) i:%6u : ",
-                    Enode->LineNumber, Enode->LineNumber);
+                fprintf (OutputFile, "(%u) : ",
+                    Enode->LineNumber);
             }
         }
     }
@@ -407,9 +411,18 @@  AePrintException (
     {
         /* Decode the message ID */
 
-        fprintf (OutputFile, "%s %4.4d - ",
-                    AslErrorLevel[Enode->Level],
-                    Enode->MessageId + ((Enode->Level+1) * 1000));
+        if (Gbl_VerboseErrors)
+        {
+            fprintf (OutputFile, "%s %4.4d -",
+                        AslErrorLevel[Enode->Level],
+                        Enode->MessageId + ((Enode->Level+1) * 1000));
+        }
+        else /* IDE case */
+        {
+            fprintf (OutputFile, "%s %4.4d:",
+                        AslErrorLevelIde[Enode->Level],
+                        Enode->MessageId + ((Enode->Level+1) * 1000));
+        }
 
         MainMessage = AslMessages[Enode->MessageId];
         ExtraMessage = Enode->Message;
diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c
index ef10668..a2512a6 100644
--- a/src/acpica/source/compiler/aslfiles.c
+++ b/src/acpica/source/compiler/aslfiles.c
@@ -564,6 +564,107 @@  FlAddIncludeDirectory (
 
 /*******************************************************************************
  *
+ * FUNCTION:    FlMergePathnames
+ *
+ * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
+ *                                a zero length string.
+ *              FilePathname    - The include filename from the source ASL.
+ *
+ * RETURN:      Merged pathname string
+ *
+ * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
+ *              arrive at a minimal length string. Merge can occur if the
+ *              FilePathname is relative to the PrefixDir.
+ *
+ ******************************************************************************/
+
+char *
+FlMergePathnames (
+    char                    *PrefixDir,
+    char                    *FilePathname)
+{
+    char                    *CommonPath;
+    char                    *Pathname;
+    char                    *LastElement;
+
+
+    DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
+        "Include: FilePathname - \"%s\"\n",
+         PrefixDir, FilePathname);
+
+    /*
+     * If there is no prefix directory or if the file pathname is absolute,
+     * just return the original file pathname
+     */
+    if (!PrefixDir || (!*PrefixDir) ||
+        (*FilePathname == '/') ||
+         (FilePathname[1] == ':'))
+    {
+        Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1);
+        strcpy (Pathname, FilePathname);
+        goto ConvertBackslashes;
+    }
+
+    /* Need a local copy of the prefix directory path */
+
+    CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1);
+    strcpy (CommonPath, PrefixDir);
+
+    /*
+     * Walk forward through the file path, and simultaneously backward
+     * through the prefix directory path until there are no more
+     * relative references at the start of the file path.
+     */
+    while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
+    {
+        /* Remove last element of the prefix directory path */
+
+        LastElement = strrchr (CommonPath, '/');
+        if (!LastElement)
+        {
+            goto ConcatenatePaths;
+        }
+
+        *LastElement = 0;   /* Terminate CommonPath string */
+        FilePathname += 3;  /* Point to next path element */
+    }
+
+    /*
+     * Remove the last element of the prefix directory path (it is the same as
+     * the first element of the file pathname), and build the final merged
+     * pathname.
+     */
+    LastElement = strrchr (CommonPath, '/');
+    if (LastElement)
+    {
+        *LastElement = 0;
+    }
+
+    /* Build the final merged pathname */
+
+ConcatenatePaths:
+    Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2);
+    if (LastElement && *CommonPath)
+    {
+        strcpy (Pathname, CommonPath);
+        strcat (Pathname, "/");
+    }
+    strcat (Pathname, FilePathname);
+    ACPI_FREE (CommonPath);
+
+    /* Convert all backslashes to normal slashes */
+
+ConvertBackslashes:
+    UtConvertBackslashes (Pathname);
+
+    DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
+         Pathname);
+    return (Pathname);
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    FlOpenIncludeWithPrefix
  *
  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
@@ -587,12 +688,9 @@  FlOpenIncludeWithPrefix (
 
     /* Build the full pathname to the file */
 
-    Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
-
-    strcpy (Pathname, PrefixDir);
-    strcat (Pathname, Filename);
+    Pathname = FlMergePathnames (PrefixDir, Filename);
 
-    DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
+    DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
         Pathname);
 
     /* Attempt to open the file, push if successful */
@@ -728,7 +826,7 @@  FlOpenInputFile (
 
     /* Open the input ASL file, text mode */
 
-    FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
+    FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
 
     return (AE_OK);
@@ -812,7 +910,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the hex file, text mode */
 
-        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
 
         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
@@ -863,7 +961,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the listing file, text mode */
 
-        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
 
         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
@@ -881,7 +979,7 @@  FlOpenMiscOutputFiles (
             return (AE_ERROR);
         }
 
-        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b");
+        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
     }
 
     /* All done for data table compiler */
@@ -926,7 +1024,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the assembly code source file, text mode */
 
-        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
 
         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
@@ -946,7 +1044,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the C code source file, text mode */
 
-        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
 
         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
@@ -967,7 +1065,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the assembly include file, text mode */
 
-        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
 
         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
@@ -987,7 +1085,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the C include file, text mode */
 
-        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
 
         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
@@ -1008,7 +1106,7 @@  FlOpenMiscOutputFiles (
 
         /* Open the namespace file, text mode */
 
-        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
+        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
 
         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
diff --git a/src/acpica/source/compiler/asllookup.c b/src/acpica/source/compiler/asllookup.c
index 0d92c91..8f8dc5d 100644
--- a/src/acpica/source/compiler/asllookup.c
+++ b/src/acpica/source/compiler/asllookup.c
@@ -1170,7 +1170,7 @@  LkNamespaceLocateBegin (
 
             if (Message)
             {
-                sprintf (MsgBuffer, "Tag: %u bit%s, Field: %u bit%s",
+                sprintf (MsgBuffer, "Size mismatch, Tag: %u bit%s, Field: %u bit%s",
                     TagBitLength, (TagBitLength > 1) ? "s" : "",
                     FieldBitLength, (FieldBitLength > 1) ? "s" : "");
 
diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
index 285d765..efd5906 100644
--- a/src/acpica/source/compiler/aslmain.c
+++ b/src/acpica/source/compiler/aslmain.c
@@ -135,7 +135,7 @@  Options (
     void);
 
 static void
-HelpMessage (
+FilenameHelp (
     void);
 
 static void
@@ -168,7 +168,7 @@  AslDoResponseFile (
 
 
 #define ASL_TOKEN_SEPARATORS    " \t\n"
-#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v|w|x:z"
+#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v^w|x:z"
 
 
 /*******************************************************************************
@@ -191,6 +191,7 @@  Options (
     printf ("\nGlobal:\n");
     ACPI_OPTION ("-@ <file>",       "Specify command file");
     ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
+    ACPI_OPTION ("-v",              "Display compiler version");
 
     printf ("\nPreprocessor:\n");
     ACPI_OPTION ("-D <symbol>",     "Define symbol for preprocessor use");
@@ -242,27 +243,36 @@  Options (
     ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
 
     printf ("\nHelp:\n");
-    ACPI_OPTION ("-h",              "Additional help and compiler debug options");
+    ACPI_OPTION ("-h",              "This message");
     ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
+    ACPI_OPTION ("-hf",             "Display help for output filename generation");
     ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
     ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
+
+    printf ("\nDebug Options:\n");
+    ACPI_OPTION ("-bf -bt",         "Create debug file (full or parse tree only) (*.txt)");
+    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
+    ACPI_OPTION ("-n",              "Parse only, no output generation");
+    ACPI_OPTION ("-ot",             "Display compile times and statistics");
+    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
+    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
 }
 
 
 /*******************************************************************************
  *
- * FUNCTION:    HelpMessage
+ * FUNCTION:    FilenameHelp
  *
  * PARAMETERS:  None
  *
  * RETURN:      None
  *
- * DESCRIPTION: Display help message
+ * DESCRIPTION: Display help message for output filename generation
  *
  ******************************************************************************/
 
 static void
-HelpMessage (
+FilenameHelp (
     void)
 {
 
@@ -274,17 +284,6 @@  HelpMessage (
     printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
     printf ("    3) The prefix of the input filename\n");
     printf ("\n");
-
-    Options ();
-
-    printf ("\nCompiler/Disassembler Debug Options:\n");
-    ACPI_OPTION ("-bb -bp -bt",     "Create compiler debug/trace file (*.txt)");
-    ACPI_OPTION ("",                "Types: Parse/Tree/Both");
-    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
-    ACPI_OPTION ("-n",              "Parse only, no output generation");
-    ACPI_OPTION ("-ot",             "Display compile times");
-    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
-    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
 }
 
 
@@ -502,13 +501,7 @@  AslDoOptions (
     case 'b':   /* Debug output options */
         switch (AcpiGbl_Optarg[0])
         {
-        case 'b':
-            AslCompilerdebug = 1; /* same as yydebug */
-            DtParserdebug = 1;
-            PrParserdebug = 1;
-            break;
-
-        case 'p':
+        case 'f':
             AslCompilerdebug = 1; /* same as yydebug */
             DtParserdebug = 1;
             PrParserdebug = 1;
@@ -602,13 +595,17 @@  AslDoOptions (
         switch (AcpiGbl_Optarg[0])
         {
         case '^':
-            HelpMessage ();
+            Usage ();
             exit (0);
 
         case 'c':
             UtDisplayConstantOpcodes ();
             exit (0);
 
+        case 'f':
+            FilenameHelp ();
+            exit (0);
+
         case 'r':
             /* reserved names */
 
@@ -827,9 +824,13 @@  AslDoOptions (
         break;
 
 
-    case 'v':   /* Verbosity settings */
+    case 'v':   /* Version and verbosity settings */
         switch (AcpiGbl_Optarg[0])
         {
+        case '^':
+            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
+            exit (0);
+
         case 'a':
             /* Disable All error/warning messages */
 
@@ -837,9 +838,18 @@  AslDoOptions (
             break;
 
         case 'i':
-            /* Less verbose error messages */
-
+            /*
+             * Support for integrated development environment(s).
+             *
+             * 1) No compiler signon
+             * 2) Send stderr messages to stdout
+             * 3) Less verbose error messages (single line only for each)
+             * 4) Error/warning messages are formatted appropriately to
+             *    be recognized by MS Visual Studio
+             */
             Gbl_VerboseErrors = FALSE;
+            Gbl_DoSignon = FALSE;
+            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
             break;
 
         case 'o':
diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
index 498ca42..c276972 100644
--- a/src/acpica/source/compiler/aslmap.c
+++ b/src/acpica/source/compiler/aslmap.c
@@ -439,6 +439,7 @@  const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
 /* REGIONSPACE_IO */            OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SYSTEM_IO,       0,                  0),
 /* REGIONSPACE_IPMI */          OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_IPMI,            0,                  0),
 /* REGIONSPACE_MEM */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SYSTEM_MEMORY,   0,                  0),
+/* REGIONSPACE_PCC */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PLATFORM_COMM,   0,                  0),
 /* REGIONSPACE_PCI */           OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PCI_CONFIG,      0,                  0),
 /* REGIONSPACE_PCIBAR */        OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_PCI_BAR_TARGET,  0,                  0),
 /* REGIONSPACE_SMBUS */         OP_TABLE_ENTRY (AML_RAW_DATA_BYTE,          ACPI_ADR_SPACE_SMBUS,           0,                  0),
diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
index 4e5bb31..56951bc 100644
--- a/src/acpica/source/compiler/aslmessages.h
+++ b/src/acpica/source/compiler/aslmessages.h
@@ -474,7 +474,7 @@  char                        *AslMessages [] = {
 };
 
 
-char                    *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
+const char              *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
     "Warning ",
     "Warning ",
     "Warning ",
@@ -483,6 +483,15 @@  char                    *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
     "Optimize"
 };
 
+const char              *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = {
+    "warning ",
+    "warning ",
+    "warning ",
+    "error   ",
+    "remark  ",
+    "optimize"
+};
+
 #define ASL_ERROR_LEVEL_LENGTH          8       /* Length of strings above */
 
 #endif  /* ASL_EXCEPTIONS */
diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
index 49b25d9..2fbe0d3 100644
--- a/src/acpica/source/compiler/aslstartup.c
+++ b/src/acpica/source/compiler/aslstartup.c
@@ -299,7 +299,7 @@  AslDetectSourceFileType (
 
     /* Check for 100% ASCII source file (comments are ignored) */
 
-    Status = FlCheckForAscii (Info);
+    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
     if (ACPI_FAILURE (Status))
     {
         printf ("Non-ascii input file - %s\n", Info->Filename);
diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
index cdaf2b8..0ce5a20 100644
--- a/src/acpica/source/compiler/aslsupport.l
+++ b/src/acpica/source/compiler/aslsupport.l
@@ -164,19 +164,23 @@  static void
 AslDoLineDirective (
     void)
 {
-    char                    c;
+    int                     c;
     char                    *Token;
     UINT32                  LineNumber;
     char                    *Filename;
+    UINT32                  i;
 
 
     /* Eat the entire line that contains the #line directive */
 
-    while ((c = (char) input()) != '\n' && c != EOF)
+    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
+
+    while ((c = input()) != '\n' && c != EOF)
     {
-        AslInsertLineBuffer (c);
+        *Gbl_LineBufPtr = c;
+        Gbl_LineBufPtr++;
     }
-    AslInsertLineBuffer (0);
+    *Gbl_LineBufPtr = 0;
 
     /* First argument is the actual line number */
 
@@ -186,10 +190,23 @@  AslDoLineDirective (
         goto ResetAndExit;
     }
 
-    /* Convert line number. Subtract one to handle _this_ line */
+    /* First argument is the line number */
 
     LineNumber = (UINT32) UtDoConstant (Token);
-    FlSetLineNumber (LineNumber - 1);
+
+    /* Emit the appropriate number of newlines */
+
+    Gbl_CurrentColumn = 0;
+    if (LineNumber > Gbl_CurrentLineNumber)
+    {
+        for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++)
+        {
+            FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
+            Gbl_CurrentColumn++;
+        }
+    }
+
+    FlSetLineNumber (LineNumber);
 
     /* Second argument is the optional filename (in double quotes) */
 
@@ -204,7 +221,12 @@  AslDoLineDirective (
     /* Third argument is not supported at this time */
 
 ResetAndExit:
-    AslResetCurrentLineBuffer ();
+
+    /* Reset globals for a new line */
+
+    Gbl_CurrentLineOffset += Gbl_CurrentColumn;
+    Gbl_CurrentColumn = 0;
+    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
 }
 
 
@@ -480,8 +502,8 @@  static char
 AslDoComment (
     void)
 {
-    char                c;
-    char                c1 = 0;
+    int                 c;
+    int                 c1 = 0;
 
 
     AslInsertLineBuffer ('/');
@@ -491,7 +513,7 @@  loop:
 
     /* Eat chars until end-of-comment */
 
-    while ((c = (char) input()) != '*' && c != EOF)
+    while ((c = input()) != '*' && c != EOF)
     {
         AslInsertLineBuffer (c);
         c1 = c;
@@ -518,7 +540,7 @@  loop:
 
     AslInsertLineBuffer (c);
 
-    if ((c1 = (char) input()) != '/' && c1 != EOF)
+    if ((c1 = input()) != '/' && c1 != EOF)
     {
         unput(c1);
         goto loop;
@@ -561,13 +583,13 @@  static char
 AslDoCommentType2 (
     void)
 {
-    char                c;
+    int                 c;
 
 
     AslInsertLineBuffer ('/');
     AslInsertLineBuffer ('/');
 
-    while ((c = (char) input()) != '\n' && c != EOF)
+    while ((c = input()) != '\n' && c != EOF)
     {
         AslInsertLineBuffer (c);
     }
@@ -603,7 +625,7 @@  AslDoStringLiteral (
     char                *StringBuffer = MsgBuffer;
     char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
     char                *CleanString;
-    char                StringChar;
+    int                 StringChar;
     UINT32              State = ASL_NORMAL_CHAR;
     UINT32              i = 0;
     UINT8               Digit;
@@ -616,7 +638,7 @@  AslDoStringLiteral (
      * source line buffer.
      */
     AslInsertLineBuffer ('\"');
-    while ((StringChar = (char) input()) != EOF)
+    while ((StringChar = input()) != EOF)
     {
         AslInsertLineBuffer (StringChar);
 
diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
index 8a7dbba..de7ea0d 100644
--- a/src/acpica/source/compiler/aslutils.c
+++ b/src/acpica/source/compiler/aslutils.c
@@ -211,7 +211,7 @@  UtDisplaySupportedTables (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiPsDisplayConstantOpcodes
+ * FUNCTION:    UtDisplayConstantOpcodes
  *
  * PARAMETERS:  None
  *
@@ -244,11 +244,11 @@  UtDisplayConstantOpcodes (
  *
  * FUNCTION:    UtLocalCalloc
  *
- * PARAMETERS:  Size        - Bytes to be allocated
+ * PARAMETERS:  Size                - Bytes to be allocated
  *
- * RETURN:      Pointer to the allocated memory.  Guaranteed to be valid.
+ * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
  *
- * DESCRIPTION: Allocate zero-initialized memory.  Aborts the compile on an
+ * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
  *              allocation failure, on the assumption that nothing more can be
  *              accomplished.
  *
@@ -283,9 +283,9 @@  UtLocalCalloc (
  *
  * FUNCTION:    UtBeginEvent
  *
- * PARAMETERS:  Name        - Ascii name of this event
+ * PARAMETERS:  Name                - Ascii name of this event
  *
- * RETURN:      Event       - Event number (integer index)
+ * RETURN:      Event number (integer index)
  *
  * DESCRIPTION: Saves the current time with this event
  *
@@ -316,7 +316,7 @@  UtBeginEvent (
  *
  * FUNCTION:    UtEndEvent
  *
- * PARAMETERS:  Event       - Event number (integer index)
+ * PARAMETERS:  Event               - Event number (integer index)
  *
  * RETURN:      None
  *
@@ -326,7 +326,7 @@  UtBeginEvent (
 
 void
 UtEndEvent (
-    UINT8                  Event)
+    UINT8                   Event)
 {
 
     if (Event >= ASL_NUM_EVENTS)
@@ -344,7 +344,7 @@  UtEndEvent (
  *
  * FUNCTION:    UtHexCharToValue
  *
- * PARAMETERS:  HexChar         - Hex character in Ascii
+ * PARAMETERS:  HexChar             - Hex character in Ascii
  *
  * RETURN:      The binary value of the hex character
  *
@@ -375,12 +375,13 @@  UtHexCharToValue (
  *
  * FUNCTION:    UtConvertByteToHex
  *
- * PARAMETERS:  RawByte         - Binary data
- *              Buffer          - Pointer to where the hex bytes will be stored
+ * PARAMETERS:  RawByte             - Binary data
+ *              Buffer              - Pointer to where the hex bytes will be
+ *                                    stored
  *
  * RETURN:      Ascii hex byte is stored in Buffer.
  *
- * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
+ * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
  *              with "0x"
  *
  ******************************************************************************/
@@ -403,12 +404,13 @@  UtConvertByteToHex (
  *
  * FUNCTION:    UtConvertByteToAsmHex
  *
- * PARAMETERS:  RawByte         - Binary data
- *              Buffer          - Pointer to where the hex bytes will be stored
+ * PARAMETERS:  RawByte             - Binary data
+ *              Buffer              - Pointer to where the hex bytes will be
+ *                                    stored
  *
  * RETURN:      Ascii hex byte is stored in Buffer.
  *
- * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
+ * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
  *              with "0x"
  *
  ******************************************************************************/
@@ -430,13 +432,13 @@  UtConvertByteToAsmHex (
  *
  * FUNCTION:    DbgPrint
  *
- * PARAMETERS:  Type            - Type of output
- *              Fmt             - Printf format string
- *              ...             - variable printf list
+ * PARAMETERS:  Type                - Type of output
+ *              Fmt                 - Printf format string
+ *              ...                 - variable printf list
  *
  * RETURN:      None
  *
- * DESCRIPTION: Conditional print statement.  Prints to stderr only if the
+ * DESCRIPTION: Conditional print statement. Prints to stderr only if the
  *              debug flag is set.
  *
  ******************************************************************************/
@@ -510,7 +512,7 @@  UtPrintFormattedName (
  *
  * FUNCTION:    UtSetParseOpName
  *
- * PARAMETERS:  Op
+ * PARAMETERS:  Op                  - Parse op to be named.
  *
  * RETURN:      None
  *
@@ -532,7 +534,7 @@  UtSetParseOpName (
  *
  * FUNCTION:    UtDisplaySummary
  *
- * PARAMETERS:  FileID          - ID of outpout file
+ * PARAMETERS:  FileID              - ID of outpout file
  *
  * RETURN:      None
  *
@@ -643,11 +645,11 @@  UtDisplaySummary (
 
 /*******************************************************************************
  *
- * FUNCTION:    UtDisplaySummary
+ * FUNCTION:    UtCheckIntegerRange
  *
- * PARAMETERS:  Op              - Integer parse node
- *              LowValue        - Smallest allowed value
- *              HighValue       - Largest allowed value
+ * PARAMETERS:  Op                  - Integer parse node
+ *              LowValue            - Smallest allowed value
+ *              HighValue           - Largest allowed value
  *
  * RETURN:      Op if OK, otherwise NULL
  *
@@ -698,11 +700,11 @@  UtCheckIntegerRange (
  *
  * FUNCTION:    UtGetStringBuffer
  *
- * PARAMETERS:  Length          - Size of buffer requested
+ * PARAMETERS:  Length              - Size of buffer requested
  *
- * RETURN:      Pointer to the buffer.  Aborts on allocation failure
+ * RETURN:      Pointer to the buffer. Aborts on allocation failure
  *
- * DESCRIPTION: Allocate a string buffer.  Bypass the local
+ * DESCRIPTION: Allocate a string buffer. Bypass the local
  *              dynamic memory manager for performance reasons (This has a
  *              major impact on the speed of the compiler.)
  *
@@ -733,8 +735,8 @@  UtGetStringBuffer (
  *
  * FUNCTION:    UtInternalizeName
  *
- * PARAMETERS:  ExternalName            - Name to convert
- *              ConvertedName           - Where the converted name is returned
+ * PARAMETERS:  ExternalName        - Name to convert
+ *              ConvertedName       - Where the converted name is returned
  *
  * RETURN:      Status
  *
@@ -786,8 +788,8 @@  UtInternalizeName (
  *
  * FUNCTION:    UtPadNameWithUnderscores
  *
- * PARAMETERS:  NameSeg         - Input nameseg
- *              PaddedNameSeg   - Output padded nameseg
+ * PARAMETERS:  NameSeg             - Input nameseg
+ *              PaddedNameSeg       - Output padded nameseg
  *
  * RETURN:      Padded nameseg.
  *
@@ -824,8 +826,8 @@  UtPadNameWithUnderscores (
  *
  * FUNCTION:    UtAttachNameseg
  *
- * PARAMETERS:  Op              - Parent parse node
- *              Name            - Full ExternalName
+ * PARAMETERS:  Op                  - Parent parse node
+ *              Name                - Full ExternalName
  *
  * RETURN:      None; Sets the NameSeg field in parent node
  *
@@ -881,12 +883,12 @@  UtAttachNameseg (
  *
  * FUNCTION:    UtAttachNamepathToOwner
  *
- * PARAMETERS:  Op            - Parent parse node
- *              NameOp        - Node that contains the name
+ * PARAMETERS:  Op                  - Parent parse node
+ *              NameOp              - Node that contains the name
  *
  * RETURN:      Sets the ExternalName and Namepath in the parent node
  *
- * DESCRIPTION: Store the name in two forms in the parent node:  The original
+ * DESCRIPTION: Store the name in two forms in the parent node: The original
  *              (external) name, and the internalized name that is used within
  *              the ACPI namespace manager.
  *
@@ -926,11 +928,11 @@  UtAttachNamepathToOwner (
  *
  * FUNCTION:    UtDoConstant
  *
- * PARAMETERS:  String      - Hex, Octal, or Decimal string
+ * PARAMETERS:  String              - Hex, Octal, or Decimal string
  *
  * RETURN:      Converted Integer
  *
- * DESCRIPTION: Convert a string to an integer.  With error checking.
+ * DESCRIPTION: Convert a string to an integer, with error checking.
  *
  ******************************************************************************/
 
@@ -961,10 +963,10 @@  UtDoConstant (
  *
  * FUNCTION:    UtStrtoul64
  *
- * PARAMETERS:  String          - Null terminated string
- *              Terminater      - Where a pointer to the terminating byte is
- *                                returned
- *              Base            - Radix of the string
+ * PARAMETERS:  String              - Null terminated string
+ *              Terminater          - Where a pointer to the terminating byte
+ *                                    is returned
+ *              Base                - Radix of the string
  *
  * RETURN:      Converted value
  *
@@ -1144,5 +1146,3 @@  ErrorExit:
 
     return (Status);
 }
-
-
diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c
index 91d4aba..7a68e84 100644
--- a/src/acpica/source/compiler/dtio.c
+++ b/src/acpica/source/compiler/dtio.c
@@ -161,6 +161,7 @@  DtDumpBuffer (
 #define DT_SLASH_SLASH_COMMENT      4
 #define DT_END_COMMENT              5
 #define DT_MERGE_LINES              6
+#define DT_ESCAPE_SEQUENCE          7
 
 static UINT32  Gbl_NextLineOffset;
 
@@ -498,7 +499,6 @@  DtGetNextLine (
             {
             case DT_START_QUOTED_STRING:
             case DT_SLASH_ASTERISK_COMMENT:
-            case DT_SLASH_SLASH_COMMENT:
 
                 AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
                 break;
@@ -507,7 +507,22 @@  DtGetNextLine (
                 break;
             }
 
-            return (ASL_EOF);
+            /* Standalone EOF is OK */
+
+            if (i == 0)
+            {
+                return (ASL_EOF);
+            }
+
+            /*
+             * Received an EOF in the middle of a line. Terminate the
+             * line with a newline. The next call to this function will
+             * return a standalone EOF. Thus, the upper parsing software
+             * never has to deal with an EOF within a valid line (or
+             * the last line does not get tossed on the floor.)
+             */
+            c = '\n';
+            State = DT_NORMAL_TEXT;
         }
 
         switch (State)
@@ -576,12 +591,36 @@  DtGetNextLine (
             Gbl_CurrentLineBuffer[i] = c;
             i++;
 
-            if (c == '"')
+            switch (c)
             {
+            case '"':
                 State = DT_NORMAL_TEXT;
+                break;
+
+            case '\\':
+                State = DT_ESCAPE_SEQUENCE;
+                break;
+
+            case '\n':
+                AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
+                    Gbl_CurrentLineNumber++);
+                State = DT_NORMAL_TEXT;
+                break;
+
+            default:    /* Get next character */
+                break;
             }
             break;
 
+        case DT_ESCAPE_SEQUENCE:
+
+            /* Just copy the escaped character. TBD: sufficient for table compiler? */
+
+            Gbl_CurrentLineBuffer[i] = c;
+            i++;
+            State = DT_START_QUOTED_STRING;
+            break;
+
         case DT_START_COMMENT:
 
             /* Open comment if this character is an asterisk or slash */
diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
index ed5f79b..1d92b78 100644
--- a/src/acpica/source/compiler/dttemplate.c
+++ b/src/acpica/source/compiler/dttemplate.c
@@ -298,7 +298,7 @@  DtCreateAllTemplates (
     }
 
     /*
-     * Create the "special ACPI tables:
+     * Create the special ACPI tables:
      * 1) DSDT/SSDT are AML tables, not data tables
      * 2) FACS and RSDP have non-standard headers
      */
diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c
index e98e186..687af45 100644
--- a/src/acpica/source/compiler/prscan.c
+++ b/src/acpica/source/compiler/prscan.c
@@ -726,7 +726,7 @@  PrDoDirective (
         }
 
         DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
-            "Start #include file %s\n", Gbl_CurrentLineNumber,
+            "Start #include file \"%s\"\n", Gbl_CurrentLineNumber,
             Token, Gbl_CurrentLineNumber);
 
         PrOpenIncludeFile (Token);
diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c
index a5fb46a..64dc9e8 100644
--- a/src/acpica/source/compiler/prutils.c
+++ b/src/acpica/source/compiler/prutils.c
@@ -318,13 +318,11 @@  PrOpenIncludeFile (
     ASL_INCLUDE_DIR         *NextDir;
 
 
-    /*
-     * start the actual include file on the next line
-     */
+    /* Start the actual include file on the next line */
+
     Gbl_CurrentLineOffset++;
 
     /* Attempt to open the include file */
-
     /* If the file specifies an absolute path, just open it */
 
     if ((Filename[0] == '/')  ||
@@ -402,13 +400,10 @@  PrOpenIncludeWithPrefix (
 
     /* Build the full pathname to the file */
 
-    Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
+    Pathname = FlMergePathnames (PrefixDir, Filename);
 
-    strcpy (Pathname, PrefixDir);
-    strcat (Pathname, Filename);
-
-    DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID
-        "Opening include file: path %s\n",
+    DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID
+        "Include: Opening file - \"%s\"\n",
         Gbl_CurrentLineNumber, Pathname);
 
     /* Attempt to open the file, push if successful */
diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
index 4c34a79..27aa4cd 100644
--- a/src/acpica/source/components/debugger/dbcmds.c
+++ b/src/acpica/source/components/debugger/dbcmds.c
@@ -326,12 +326,53 @@  AcpiDbDisplayTableInfo (
     ACPI_STATUS             Status;
 
 
+    /* Header */
+
+    AcpiOsPrintf ("Idx ID Status    Type            Sig  Address  Len   Header\n");
+
     /* Walk the entire root table list */
 
     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
     {
         TableDesc = &AcpiGbl_RootTableList.Tables[i];
-        AcpiOsPrintf ("%u ", i);
+
+        /* Index and Table ID */
+
+        AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
+
+        /* Decode the table flags */
+
+        if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
+        {
+            AcpiOsPrintf ("NotLoaded ");
+        }
+        else
+        {
+            AcpiOsPrintf ("   Loaded ");
+        }
+
+        switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
+        {
+        case ACPI_TABLE_ORIGIN_UNKNOWN:
+            AcpiOsPrintf ("Unknown   ");
+            break;
+
+        case ACPI_TABLE_ORIGIN_MAPPED:
+            AcpiOsPrintf ("Mapped    ");
+            break;
+
+        case ACPI_TABLE_ORIGIN_ALLOCATED:
+            AcpiOsPrintf ("Allocated ");
+            break;
+
+        case ACPI_TABLE_ORIGIN_OVERRIDE:
+            AcpiOsPrintf ("Override  ");
+            break;
+
+        default:
+            AcpiOsPrintf ("INVALID   ");
+            break;
+        }
 
         /* Make sure that the table is mapped */
 
@@ -362,55 +403,45 @@  AcpiDbDisplayTableInfo (
  *
  * FUNCTION:    AcpiDbUnloadAcpiTable
  *
- * PARAMETERS:  TableArg        - Name of the table to be unloaded
- *              InstanceArg     - Which instance of the table to unload (if
- *                                there are multiple tables of the same type)
+ * PARAMETERS:  ObjectName          - Namespace pathname for an object that
+ *                                    is owned by the table to be unloaded
  *
- * RETURN:      Nonde
+ * RETURN:      None
  *
- * DESCRIPTION: Unload an ACPI table.
- *              Instance is not implemented
+ * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
+ *              by the table.
  *
  ******************************************************************************/
 
 void
 AcpiDbUnloadAcpiTable (
-    char                    *TableArg,
-    char                    *InstanceArg)
+    char                    *ObjectName)
 {
-/* TBD: Need to reimplement for new data structures */
-
-#if 0
-    UINT32                  i;
+    ACPI_NAMESPACE_NODE     *Node;
     ACPI_STATUS             Status;
 
 
-    /* Search all tables for the target type */
+    /* Translate name to an Named object */
 
-    for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
+    Node = AcpiDbConvertToNode (ObjectName);
+    if (!Node)
     {
-        if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
-                AcpiGbl_TableData[i].SigLength))
-        {
-            /* Found the table, unload it */
-
-            Status = AcpiUnloadTable (i);
-            if (ACPI_SUCCESS (Status))
-            {
-                AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
-            }
-            else
-            {
-                AcpiOsPrintf ("%s, while unloading [%s]\n",
-                    AcpiFormatException (Status), TableArg);
-            }
-
-            return;
-        }
+        AcpiOsPrintf ("Could not find [%s] in namespace\n",
+            ObjectName);
+        return;
     }
 
-    AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
-#endif
+    Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
+    if (ACPI_SUCCESS (Status))
+    {
+        AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
+            ObjectName, Node);
+    }
+    else
+    {
+        AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
+            AcpiFormatException (Status), ObjectName);
+    }
 }
 
 
@@ -445,25 +476,20 @@  AcpiDbSendNotify (
         return;
     }
 
-    /* Decode Named object type */
+    /* Dispatch the notify if legal */
 
-    switch (Node->Type)
+    if (AcpiEvIsNotifyObject (Node))
     {
-    case ACPI_TYPE_DEVICE:
-    case ACPI_TYPE_THERMAL:
-
-         /* Send the notify */
-
         Status = AcpiEvQueueNotifyRequest (Node, Value);
         if (ACPI_FAILURE (Status))
         {
             AcpiOsPrintf ("Could not queue notify\n");
         }
-        break;
-
-    default:
-        AcpiOsPrintf ("Named object is not a device or a thermal object\n");
-        break;
+    }
+    else
+    {
+        AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
+            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
     }
 }
 
diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
index d8b3aa9..2e91c88 100644
--- a/src/acpica/source/components/debugger/dbdisply.c
+++ b/src/acpica/source/components/debugger/dbdisply.c
@@ -179,8 +179,8 @@  typedef struct acpi_handler_info
 
 static ACPI_HANDLER_INFO    AcpiGbl_HandlerList[] =
 {
-    {&AcpiGbl_SystemNotify.Handler,     "System Notifications"},
-    {&AcpiGbl_DeviceNotify.Handler,     "Device Notifications"},
+    {&AcpiGbl_GlobalNotify[0].Handler,  "System Notifications"},
+    {&AcpiGbl_GlobalNotify[1].Handler,  "Device Notifications"},
     {&AcpiGbl_TableHandler,             "ACPI Table Events"},
     {&AcpiGbl_ExceptionHandler,         "Control Method Exceptions"},
     {&AcpiGbl_InterfaceHandler,         "OSI Invocations"}
@@ -864,10 +864,12 @@  AcpiDbDisplayGpes (
     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
     ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
     char                    *GpeType;
+    ACPI_GPE_NOTIFY_INFO    *Notify;
     UINT32                  GpeIndex;
     UINT32                  Block = 0;
     UINT32                  i;
     UINT32                  j;
+    UINT32                  Count;
     char                    Buffer[80];
     ACPI_BUFFER             RetBuf;
     ACPI_STATUS             Status;
@@ -988,7 +990,14 @@  AcpiDbDisplayGpes (
                         AcpiOsPrintf ("Handler");
                         break;
                     case ACPI_GPE_DISPATCH_NOTIFY:
-                        AcpiOsPrintf ("Notify");
+                        Count = 0;
+                        Notify = GpeEventInfo->Dispatch.NotifyList;
+                        while (Notify)
+                        {
+                            Count++;
+                            Notify = Notify->Next;
+                        }
+                        AcpiOsPrintf ("Implicit Notify on %u devices", Count);
                         break;
                     default:
                         AcpiOsPrintf ("UNKNOWN: %X",
diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
index eb85998..174f77a 100644
--- a/src/acpica/source/components/debugger/dbexec.c
+++ b/src/acpica/source/components/debugger/dbexec.c
@@ -944,8 +944,8 @@  AcpiDbMethodThread (
 
     if (Info->InitArgs)
     {
-        AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
-        AcpiDbUInt32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
+        AcpiDbUint32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
+        AcpiDbUint32ToHexString ((UINT32) AcpiOsGetThreadId (), Info->IdOfThreadStr);
     }
 
     if (Info->Threads && (Info->NumCreated < Info->NumThreads))
@@ -1135,7 +1135,7 @@  AcpiDbCreateExecutionThreads (
     AcpiGbl_DbMethodInfo.ArgTypes[1] = ACPI_TYPE_INTEGER;
     AcpiGbl_DbMethodInfo.ArgTypes[2] = ACPI_TYPE_INTEGER;
 
-    AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
+    AcpiDbUint32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
 
     AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
 
diff --git a/src/acpica/source/components/debugger/dbfileio.c b/src/acpica/source/components/debugger/dbfileio.c
index 495d609..8e36c87 100644
--- a/src/acpica/source/components/debugger/dbfileio.c
+++ b/src/acpica/source/components/debugger/dbfileio.c
@@ -123,6 +123,10 @@ 
 #include "actables.h"
 #endif
 
+#ifdef ACPI_ASL_COMPILER
+#include "aslcompiler.h"
+#endif
+
 #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
 
 #define _COMPONENT          ACPI_CA_DEBUGGER
@@ -381,6 +385,15 @@  AcpiDbReadTable (
             AcpiOsPrintf (
                 "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
                 TableHeader.Length, FileSize);
+
+#ifdef ACPI_ASL_COMPILER
+            Status = FlCheckForAscii (fp, NULL, FALSE);
+            if (ACPI_SUCCESS (Status))
+            {
+                AcpiOsPrintf ("File appears to be ASCII only, must be binary\n",
+                    TableHeader.Length, FileSize);
+            }
+#endif
             return (AE_BAD_HEADER);
         }
 
diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
index 3e61bdb..1b2ee1d 100644
--- a/src/acpica/source/components/debugger/dbinput.c
+++ b/src/acpica/source/components/debugger/dbinput.c
@@ -322,7 +322,7 @@  AcpiDbDisplayHelp (
     AcpiOsPrintf ("     Stack                            Display CPU stack usage\n");
     AcpiOsPrintf ("     Tables                           Info about current ACPI table(s)\n");
     AcpiOsPrintf ("  Tables                              Display info about loaded ACPI tables\n");
-    AcpiOsPrintf ("  Unload <TableSig> [Instance]        Unload an ACPI table\n");
+    AcpiOsPrintf ("  Unload <Namepath>                   Unload an ACPI table via namespace object\n");
     AcpiOsPrintf ("  ! <CommandNumber>                   Execute command from history buffer\n");
     AcpiOsPrintf ("  !!                                  Execute last command again\n");
 
@@ -966,7 +966,7 @@  AcpiDbCommandDispatch (
         break;
 
     case CMD_UNLOAD:
-        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]);
         break;
 
     case CMD_EXIT:
diff --git a/src/acpica/source/components/debugger/dbstats.c b/src/acpica/source/components/debugger/dbstats.c
index 8a6e713..e309668 100644
--- a/src/acpica/source/components/debugger/dbstats.c
+++ b/src/acpica/source/components/debugger/dbstats.c
@@ -299,8 +299,8 @@  AcpiDbEnumerateObject (
 
     case ACPI_TYPE_DEVICE:
 
-        AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
-        AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
+        AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[0]);
+        AcpiDbEnumerateObject (ObjDesc->Device.NotifyList[1]);
         AcpiDbEnumerateObject (ObjDesc->Device.Handler);
         break;
 
@@ -320,21 +320,21 @@  AcpiDbEnumerateObject (
 
     case ACPI_TYPE_POWER:
 
-        AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
-        AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
+        AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[0]);
+        AcpiDbEnumerateObject (ObjDesc->PowerResource.NotifyList[1]);
         break;
 
     case ACPI_TYPE_PROCESSOR:
 
-        AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
-        AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
+        AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[0]);
+        AcpiDbEnumerateObject (ObjDesc->Processor.NotifyList[1]);
         AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
         break;
 
     case ACPI_TYPE_THERMAL:
 
-        AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
-        AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
+        AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[0]);
+        AcpiDbEnumerateObject (ObjDesc->ThermalZone.NotifyList[1]);
         AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
         break;
 
@@ -594,6 +594,18 @@  AcpiDbDisplayStatistics (
         AcpiOsPrintf ("NamespaceNode    %3d\n", sizeof (ACPI_NAMESPACE_NODE));
         AcpiOsPrintf ("AcpiObject       %3d\n", sizeof (ACPI_OBJECT));
 
+        AcpiOsPrintf ("\n");
+
+        AcpiOsPrintf ("Generic State    %3d\n", sizeof (ACPI_GENERIC_STATE));
+        AcpiOsPrintf ("Common State     %3d\n", sizeof (ACPI_COMMON_STATE));
+        AcpiOsPrintf ("Control State    %3d\n", sizeof (ACPI_CONTROL_STATE));
+        AcpiOsPrintf ("Update State     %3d\n", sizeof (ACPI_UPDATE_STATE));
+        AcpiOsPrintf ("Scope State      %3d\n", sizeof (ACPI_SCOPE_STATE));
+        AcpiOsPrintf ("Parse Scope      %3d\n", sizeof (ACPI_PSCOPE_STATE));
+        AcpiOsPrintf ("Package State    %3d\n", sizeof (ACPI_PKG_STATE));
+        AcpiOsPrintf ("Thread State     %3d\n", sizeof (ACPI_THREAD_STATE));
+        AcpiOsPrintf ("Result Values    %3d\n", sizeof (ACPI_RESULT_VALUES));
+        AcpiOsPrintf ("Notify Info      %3d\n", sizeof (ACPI_NOTIFY_INFO));
         break;
 
 
diff --git a/src/acpica/source/components/debugger/dbutils.c b/src/acpica/source/components/debugger/dbutils.c
index fd318d9..f913c64 100644
--- a/src/acpica/source/components/debugger/dbutils.c
+++ b/src/acpica/source/components/debugger/dbutils.c
@@ -432,7 +432,7 @@  AcpiDbLocalNsLookup (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDbUInt32ToHexString
+ * FUNCTION:    AcpiDbUint32ToHexString
  *
  * PARAMETERS:  Value           - The value to be converted to string
  *              Buffer          - Buffer for result (not less than 11 bytes)
@@ -447,7 +447,7 @@  AcpiDbLocalNsLookup (
  ******************************************************************************/
 
 void
-AcpiDbUInt32ToHexString (
+AcpiDbUint32ToHexString (
     UINT32                  Value,
     char                    *Buffer)
 {
diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
index ed457ed..252b1b8 100644
--- a/src/acpica/source/components/disassembler/dmopcode.c
+++ b/src/acpica/source/components/disassembler/dmopcode.c
@@ -118,6 +118,7 @@ 
 #include "acparser.h"
 #include "amlcode.h"
 #include "acdisasm.h"
+#include "acnamesp.h"
 
 #ifdef ACPI_DISASSEMBLER
 
@@ -133,6 +134,218 @@  AcpiDmMatchKeyword (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiDmPredefinedDescription
+ *
+ * PARAMETERS:  Op              - Name() parse object
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Emit a description comment for a predefined ACPI name.
+ *              Used for iASL compiler only.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmPredefinedDescription (
+    ACPI_PARSE_OBJECT       *Op)
+{
+#ifdef ACPI_ASL_COMPILER
+    const AH_PREDEFINED_NAME    *Info;
+    char                        *NameString;
+    int                         LastCharIsDigit;
+    int                         LastCharsAreHex;
+
+
+    if (!Op)
+    {
+        return;
+    }
+
+    /* Ensure that the comment field is emitted only once */
+
+    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
+    {
+        return;
+    }
+    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
+
+    /* Predefined name must start with an underscore */
+
+    NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
+    if (NameString[0] != '_')
+    {
+        return;
+    }
+
+    /*
+     * Check for the special ACPI names:
+     * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
+     * (where d=decimal_digit, x=hex_digit, a=anything)
+     *
+     * Convert these to the generic name for table lookup.
+     * Note: NameString is guaranteed to be upper case here.
+     */
+    LastCharIsDigit =
+        (ACPI_IS_DIGIT (NameString[3]));    /* d */
+    LastCharsAreHex =
+        (ACPI_IS_XDIGIT (NameString[2]) &&  /* xx */
+         ACPI_IS_XDIGIT (NameString[3]));
+
+    switch (NameString[1])
+    {
+    case 'A':
+        if ((NameString[2] == 'C') && (LastCharIsDigit))
+        {
+            NameString = "_ACx";
+        }
+        else if ((NameString[2] == 'L') && (LastCharIsDigit))
+        {
+            NameString = "_ALx";
+        }
+        break;
+
+    case 'E':
+        if ((NameString[2] == 'J') && (LastCharIsDigit))
+        {
+            NameString = "_EJx";
+        }
+        else if (LastCharsAreHex)
+        {
+            NameString = "_Exx";
+        }
+        break;
+
+    case 'L':
+        if (LastCharsAreHex)
+        {
+            NameString = "_Lxx";
+        }
+        break;
+
+    case 'Q':
+        if (LastCharsAreHex)
+        {
+            NameString = "_Qxx";
+        }
+        break;
+
+    case 'T':
+        if (NameString[2] == '_')
+        {
+            NameString = "_T_x";
+        }
+        break;
+
+    case 'W':
+        if (LastCharsAreHex)
+        {
+            NameString = "_Wxx";
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    /* Match the name in the info table */
+
+    for (Info = AslPredefinedInfo; Info->Name; Info++)
+    {
+        if (ACPI_COMPARE_NAME (NameString, Info->Name))
+        {
+            AcpiOsPrintf ("  // %4.4s: %s",
+                NameString, ACPI_CAST_PTR (char, Info->Description));
+            return;
+        }
+    }
+
+#endif
+    return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmFieldPredefinedDescription
+ *
+ * PARAMETERS:  Op              - Parse object
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Emit a description comment for a resource descriptor tag
+ *              (which is a predefined ACPI name.) Used for iASL compiler only.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFieldPredefinedDescription (
+    ACPI_PARSE_OBJECT       *Op)
+{
+#ifdef ACPI_ASL_COMPILER
+    ACPI_PARSE_OBJECT       *IndexOp;
+    char                    *Tag;
+    const ACPI_OPCODE_INFO  *OpInfo;
+    const AH_PREDEFINED_NAME *Info;
+
+
+    if (!Op)
+    {
+        return;
+    }
+
+    /* Ensure that the comment field is emitted only once */
+
+    if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
+    {
+        return;
+    }
+    Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
+
+    /*
+     * Op must be one of the Create* operators: CreateField, CreateBitField,
+     * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
+     */
+    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+    if (!(OpInfo->Flags & AML_CREATE))
+    {
+        return;
+    }
+
+    /* Second argument is the Index argument */
+
+    IndexOp = Op->Common.Value.Arg;
+    IndexOp = IndexOp->Common.Next;
+
+    /* Index argument must be a namepath */
+
+    if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
+    {
+        return;
+    }
+
+    /* Major cheat: We previously put the Tag ptr in the Node field */
+
+    Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
+
+    /* Match the name in the info table */
+
+    for (Info = AslPredefinedInfo; Info->Name; Info++)
+    {
+        if (ACPI_COMPARE_NAME (Tag, Info->Name))
+        {
+            AcpiOsPrintf ("  // %4.4s: %s", Tag,
+                ACPI_CAST_PTR (char, Info->Description));
+            return;
+        }
+    }
+
+#endif
+    return;
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiDmMethodFlags
  *
  * PARAMETERS:  Op              - Method Object to be examined
diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
index 2bec308..dd655d8 100644
--- a/src/acpica/source/components/disassembler/dmwalk.c
+++ b/src/acpica/source/components/disassembler/dmwalk.c
@@ -525,7 +525,7 @@  AcpiDmDescendingOp (
      * keep track of the current column.
      */
     Info->Count++;
-    if (Info->Count /*+Info->LastLevel*/ > 10)
+    if (Info->Count /* +Info->LastLevel */ > 10)
     {
         Info->Count = 0;
         AcpiOsPrintf ("\n");
@@ -605,6 +605,10 @@  AcpiDmDescendingOp (
 
                 AcpiDmMethodFlags (Op);
                 AcpiOsPrintf (")");
+
+                /* Emit description comment for Method() with a predefined ACPI name */
+
+                AcpiDmPredefinedDescription (Op);
                 break;
 
 
@@ -675,7 +679,8 @@  AcpiDmDescendingOp (
 
             default:
 
-                AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode);
+                AcpiOsPrintf ("*** Unhandled named opcode %X\n",
+                    Op->Common.AmlOpcode);
                 break;
             }
         }
@@ -716,7 +721,8 @@  AcpiDmDescendingOp (
                 NextOp = NextOp->Common.Next;
 
                 Info->Flags = ACPI_PARSEOP_PARAMLIST;
-                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info);
+                AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp,
+                    AcpiDmAscendingOp, Info);
                 Info->Flags = 0;
                 Info->Level = Level;
 
@@ -758,12 +764,18 @@  AcpiDmDescendingOp (
             if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
             {
                 /*
-                 * We have a resource list.  Don't need to output
-                 * the buffer size Op.  Open up a new block
+                 * We have a resource list. Don't need to output
+                 * the buffer size Op. Open up a new block
                  */
                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
                 NextOp = NextOp->Common.Next;
-                AcpiOsPrintf (")\n");
+                AcpiOsPrintf (")");
+
+                /* Emit description comment for Name() with a predefined ACPI name */
+
+                AcpiDmPredefinedDescription (Op->Asl.Parent);
+
+                AcpiOsPrintf ("\n");
                 AcpiDmIndent (Info->Level);
                 AcpiOsPrintf ("{\n");
                 return (AE_OK);
@@ -791,7 +803,7 @@  AcpiDmDescendingOp (
 
         case AML_PACKAGE_OP:
 
-            /* The next op is the size or predicate parameter */
+            /* The next op is the size parameter */
 
             NextOp = AcpiPsGetDepthNext (NULL, Op);
             if (NextOp)
@@ -844,6 +856,7 @@  AcpiDmAscendingOp (
     void                    *Context)
 {
     ACPI_OP_WALK_INFO       *Info = Context;
+    ACPI_PARSE_OBJECT       *ParentOp;
 
 
     if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
@@ -869,6 +882,19 @@  AcpiDmAscendingOp (
 
         AcpiOsPrintf (")");
 
+        if (Op->Common.AmlOpcode == AML_NAME_OP)
+        {
+            /* Emit description comment for Name() with a predefined ACPI name */
+
+            AcpiDmPredefinedDescription (Op);
+        }
+        else
+        {
+            /* For Create* operators, attempt to emit resource tag description */
+
+            AcpiDmFieldPredefinedDescription (Op);
+        }
+
         /* Could be a nested operator, check if comma required */
 
         if (!AcpiDmCommaIfListMember (Op))
@@ -983,7 +1009,20 @@  AcpiDmAscendingOp (
          */
         if (Op->Common.Next)
         {
-            AcpiOsPrintf (")\n");
+            AcpiOsPrintf (")");
+
+            /* Emit description comment for Name() with a predefined ACPI name */
+
+            ParentOp = Op->Common.Parent;
+            if (ParentOp)
+            {
+                ParentOp = ParentOp->Common.Parent;
+                if (ParentOp && ParentOp->Asl.AmlOpcode == AML_NAME_OP)
+                {
+                    AcpiDmPredefinedDescription (ParentOp);
+                }
+            }
+            AcpiOsPrintf ("\n");
             AcpiDmIndent (Level - 1);
             AcpiOsPrintf ("{\n");
         }
diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
index 526d478..3047c5f 100644
--- a/src/acpica/source/components/dispatcher/dsfield.c
+++ b/src/acpica/source/components/dispatcher/dsfield.c
@@ -129,6 +129,18 @@ 
 
 /* Local prototypes */
 
+#ifdef ACPI_ASL_COMPILER
+#include "acdisasm.h"
+
+static ACPI_STATUS
+AcpiDsCreateExternalRegion (
+    ACPI_STATUS             LookupStatus,
+    ACPI_PARSE_OBJECT       *Op,
+    char                    *Path,
+    ACPI_WALK_STATE         *WalkState,
+    ACPI_NAMESPACE_NODE     **Node);
+#endif
+
 static ACPI_STATUS
 AcpiDsGetFieldNames (
     ACPI_CREATE_FIELD_INFO  *Info,
@@ -136,6 +148,69 @@  AcpiDsGetFieldNames (
     ACPI_PARSE_OBJECT       *Arg);
 
 
+#ifdef ACPI_ASL_COMPILER
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDsCreateExternalRegion (iASL Disassembler only)
+ *
+ * PARAMETERS:  LookupStatus    - Status from NsLookup operation
+ *              Op              - Op containing the Field definition and args
+ *              Path            - Pathname of the region
+ *  `           WalkState       - Current method state
+ *              Node            - Where the new region node is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
+ *              region node/object.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsCreateExternalRegion (
+    ACPI_STATUS             LookupStatus,
+    ACPI_PARSE_OBJECT       *Op,
+    char                    *Path,
+    ACPI_WALK_STATE         *WalkState,
+    ACPI_NAMESPACE_NODE     **Node)
+{
+    ACPI_STATUS             Status;
+    ACPI_OPERAND_OBJECT     *ObjDesc;
+
+
+    if (LookupStatus != AE_NOT_FOUND)
+    {
+        return (LookupStatus);
+    }
+
+    /*
+     * Table disassembly:
+     * OperationRegion not found. Generate an External for it, and
+     * insert the name into the namespace.
+     */
+    AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_REGION, 0);
+    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
+       ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Must create and install a region object for the new node */
+
+    ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
+    if (!ObjDesc)
+    {
+        return (AE_NO_MEMORY);
+    }
+
+    ObjDesc->Region.Node = *Node;
+    Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION);
+    return (Status);
+}
+#endif
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDsCreateBufferField
@@ -149,8 +224,8 @@  AcpiDsGetFieldNames (
  *              CreateBitFieldOp,
  *              CreateByteFieldOp,
  *              CreateWordFieldOp,
- *              CreateDWordFieldOp,
- *              CreateQWordFieldOp,
+ *              CreateDwordFieldOp,
+ *              CreateQwordFieldOp,
  *              CreateFieldOp       (all of which define a field in a buffer)
  *
  ******************************************************************************/
@@ -510,11 +585,16 @@  AcpiDsCreateField (
     /* First arg is the name of the parent OpRegion (must already exist) */
 
     Arg = Op->Common.Value.Arg;
+
     if (!RegionNode)
     {
         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
                         ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
                         ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
+#ifdef ACPI_ASL_COMPILER
+        Status = AcpiDsCreateExternalRegion (Status, Arg,
+            Arg->Common.Value.Name, WalkState, &RegionNode);
+#endif
         if (ACPI_FAILURE (Status))
         {
             ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
@@ -700,6 +780,10 @@  AcpiDsCreateBankField (
         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
                         ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
                         ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
+#ifdef ACPI_ASL_COMPILER
+        Status = AcpiDsCreateExternalRegion (Status, Arg,
+            Arg->Common.Value.Name, WalkState, &RegionNode);
+#endif
         if (ACPI_FAILURE (Status))
         {
             ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
index 5da09bd..d6ddbfa 100644
--- a/src/acpica/source/components/dispatcher/dsopcode.c
+++ b/src/acpica/source/components/dispatcher/dsopcode.c
@@ -595,18 +595,18 @@  AcpiDsEvalTableRegionOperands (
 
 
     /*
-     * This is where we evaluate the SignatureString and OemIDString
-     * and OemTableIDString of the DataTableRegion declaration
+     * This is where we evaluate the Signature string, OemId string,
+     * and OemTableId string of the Data Table Region declaration
      */
     Node =  Op->Common.Node;
 
-    /* NextOp points to SignatureString op */
+    /* NextOp points to Signature string op */
 
     NextOp = Op->Common.Value.Arg;
 
     /*
-     * Evaluate/create the SignatureString and OemIDString
-     * and OemTableIDString operands
+     * Evaluate/create the Signature string, OemId string,
+     * and OemTableId string operands
      */
     Status = AcpiDsCreateOperands (WalkState, NextOp);
     if (ACPI_FAILURE (Status))
@@ -615,8 +615,8 @@  AcpiDsEvalTableRegionOperands (
     }
 
     /*
-     * Resolve the SignatureString and OemIDString
-     * and OemTableIDString operands
+     * Resolve the Signature string, OemId string,
+     * and OemTableId string operands
      */
     Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
                 ACPI_WALK_OPERANDS, WalkState);
diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
index 1f689d6..7a4a84f 100644
--- a/src/acpica/source/components/dispatcher/dswload.c
+++ b/src/acpica/source/components/dispatcher/dswload.c
@@ -313,6 +313,20 @@  AcpiDsLoad1BeginOp (
             WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
             break;
 
+        case ACPI_TYPE_METHOD:
+
+            /*
+             * Allow scope change to root during execution of module-level
+             * code. Root is typed METHOD during this time.
+             */
+            if ((Node == AcpiGbl_RootNode) &&
+                (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
+            {
+                break;
+            }
+
+            /*lint -fallthrough */
+
         default:
 
             /* All other types are an error */
diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c
index 85a86ec..139ff95 100644
--- a/src/acpica/source/components/dispatcher/dswload2.c
+++ b/src/acpica/source/components/dispatcher/dswload2.c
@@ -315,6 +315,20 @@  AcpiDsLoad2BeginOp (
             WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
             break;
 
+        case ACPI_TYPE_METHOD:
+
+            /*
+             * Allow scope change to root during execution of module-level
+             * code. Root is typed METHOD during this time.
+             */
+            if ((Node == AcpiGbl_RootNode) &&
+                (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
+            {
+                break;
+            }
+
+            /*lint -fallthrough */
+
         default:
 
             /* All other types are an error */
diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c
index de32275..bb72a6e 100644
--- a/src/acpica/source/components/events/evgpe.c
+++ b/src/acpica/source/components/events/evgpe.c
@@ -590,6 +590,7 @@  AcpiEvAsynchExecuteGpeMethod (
     ACPI_STATUS             Status;
     ACPI_GPE_EVENT_INFO     *LocalGpeEventInfo;
     ACPI_EVALUATE_INFO      *Info;
+    ACPI_GPE_NOTIFY_INFO    *Notify;
 
 
     ACPI_FUNCTION_TRACE (EvAsynchExecuteGpeMethod);
@@ -645,10 +646,18 @@  AcpiEvAsynchExecuteGpeMethod (
          * completes. The notify handlers are NOT invoked synchronously
          * from this thread -- because handlers may in turn run other
          * control methods.
+         *
+         * June 2012: Expand implicit notify mechanism to support
+         * notifies on multiple device objects.
          */
-        Status = AcpiEvQueueNotifyRequest (
-                    LocalGpeEventInfo->Dispatch.DeviceNode,
-                    ACPI_NOTIFY_DEVICE_WAKE);
+        Notify = LocalGpeEventInfo->Dispatch.NotifyList;
+        while (ACPI_SUCCESS (Status) && Notify)
+        {
+            Status = AcpiEvQueueNotifyRequest (Notify->DeviceNode,
+                        ACPI_NOTIFY_DEVICE_WAKE);
+
+            Notify = Notify->Next;
+        }
         break;
 
     case ACPI_GPE_DISPATCH_METHOD:
diff --git a/src/acpica/source/components/events/evgpeutil.c b/src/acpica/source/components/events/evgpeutil.c
index a5ad320..38c7928 100644
--- a/src/acpica/source/components/events/evgpeutil.c
+++ b/src/acpica/source/components/events/evgpeutil.c
@@ -463,6 +463,8 @@  AcpiEvDeleteGpeHandlers (
     void                    *Context)
 {
     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
+    ACPI_GPE_NOTIFY_INFO    *Notify;
+    ACPI_GPE_NOTIFY_INFO    *Next;
     UINT32                  i;
     UINT32                  j;
 
@@ -484,10 +486,27 @@  AcpiEvDeleteGpeHandlers (
             if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
                     ACPI_GPE_DISPATCH_HANDLER)
             {
+                /* Delete an installed handler block */
+
                 ACPI_FREE (GpeEventInfo->Dispatch.Handler);
                 GpeEventInfo->Dispatch.Handler = NULL;
                 GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
             }
+            else if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
+                    ACPI_GPE_DISPATCH_NOTIFY)
+            {
+                /* Delete the implicit notification device list */
+
+                Notify = GpeEventInfo->Dispatch.NotifyList;
+                while (Notify)
+                {
+                    Next = Notify->Next;
+                    ACPI_FREE (Notify);
+                    Notify = Next;
+                }
+                GpeEventInfo->Dispatch.NotifyList = NULL;
+                GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
+            }
         }
     }
 
diff --git a/src/acpica/source/components/events/evmisc.c b/src/acpica/source/components/events/evmisc.c
index 7369daa..ae3cecd 100644
--- a/src/acpica/source/components/events/evmisc.c
+++ b/src/acpica/source/components/events/evmisc.c
@@ -183,107 +183,82 @@  AcpiEvQueueNotifyRequest (
     UINT32                  NotifyValue)
 {
     ACPI_OPERAND_OBJECT     *ObjDesc;
-    ACPI_OPERAND_OBJECT     *HandlerObj = NULL;
-    ACPI_GENERIC_STATE      *NotifyInfo;
+    ACPI_OPERAND_OBJECT     *HandlerListHead = NULL;
+    ACPI_GENERIC_STATE      *Info;
+    UINT8                   HandlerListId = 0;
     ACPI_STATUS             Status = AE_OK;
 
 
     ACPI_FUNCTION_NAME (EvQueueNotifyRequest);
 
 
-    /*
-     * For value 0x03 (Ejection Request), may need to run a device method.
-     * For value 0x02 (Device Wake), if _PRW exists, may need to run
-     *   the _PS0 method.
-     * For value 0x80 (Status Change) on the power button or sleep button,
-     *   initiate soft-off or sleep operation.
-     *
-     * For all cases, simply dispatch the notify to the handler.
-     */
-    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-        "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
-        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
-        NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
+    /* Are Notifies allowed on this object? */
 
-    /* Get the notify object attached to the NS Node */
-
-    ObjDesc = AcpiNsGetAttachedObject (Node);
-    if (ObjDesc)
+    if (!AcpiEvIsNotifyObject (Node))
     {
-        /* We have the notify object, Get the correct handler */
-
-        switch (Node->Type)
-        {
-        /* Notify is allowed only on these types */
+        return (AE_TYPE);
+    }
 
-        case ACPI_TYPE_DEVICE:
-        case ACPI_TYPE_THERMAL:
-        case ACPI_TYPE_PROCESSOR:
+    /* Get the correct notify list type (System or Device) */
 
-            if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
-            {
-                HandlerObj = ObjDesc->CommonNotify.SystemNotify;
-            }
-            else
-            {
-                HandlerObj = ObjDesc->CommonNotify.DeviceNotify;
-            }
-            break;
+    if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
+    {
+        HandlerListId = ACPI_SYSTEM_HANDLER_LIST;
+    }
+    else
+    {
+        HandlerListId = ACPI_DEVICE_HANDLER_LIST;
+    }
 
-        default:
+    /* Get the notify object attached to the namespace Node */
 
-            /* All other types are not supported */
+    ObjDesc = AcpiNsGetAttachedObject (Node);
+    if (ObjDesc)
+    {
+        /* We have an attached object, Get the correct handler list */
 
-            return (AE_TYPE);
-        }
+        HandlerListHead = ObjDesc->CommonNotify.NotifyList[HandlerListId];
     }
 
     /*
-     * If there is a handler to run, schedule the dispatcher.
-     * Check for:
-     * 1) Global system notify handler
-     * 2) Global device notify handler
-     * 3) Per-device notify handler
+     * If there is no notify handler (Global or Local)
+     * for this object, just ignore the notify
      */
-    if ((AcpiGbl_SystemNotify.Handler &&
-            (NotifyValue <= ACPI_MAX_SYS_NOTIFY)) ||
-        (AcpiGbl_DeviceNotify.Handler &&
-            (NotifyValue > ACPI_MAX_SYS_NOTIFY))  ||
-        HandlerObj)
+    if (!AcpiGbl_GlobalNotify[HandlerListId].Handler && !HandlerListHead)
     {
-        NotifyInfo = AcpiUtCreateGenericState ();
-        if (!NotifyInfo)
-        {
-            return (AE_NO_MEMORY);
-        }
+        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+            "No notify handler for Notify, ignoring (%4.4s, %X) node %p\n",
+            AcpiUtGetNodeName (Node), NotifyValue, Node));
 
-        if (!HandlerObj)
-        {
-            ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-                "Executing system notify handler for Notify (%4.4s, %X) "
-                "node %p\n",
-                AcpiUtGetNodeName (Node), NotifyValue, Node));
-        }
+        return (AE_OK);
+    }
 
-        NotifyInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
-        NotifyInfo->Notify.Node = Node;
-        NotifyInfo->Notify.Value = (UINT16) NotifyValue;
-        NotifyInfo->Notify.HandlerObj = HandlerObj;
+    /* Setup notify info and schedule the notify dispatcher */
 
-        Status = AcpiOsExecute (
-                    OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, NotifyInfo);
-        if (ACPI_FAILURE (Status))
-        {
-            AcpiUtDeleteGenericState (NotifyInfo);
-        }
-    }
-    else
+    Info = AcpiUtCreateGenericState ();
+    if (!Info)
     {
-        /* There is no notify handler (per-device or system) for this device */
+        return (AE_NO_MEMORY);
+    }
 
-        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-            "No notify handler for Notify (%4.4s, %X) node %p\n",
-            AcpiUtGetNodeName (Node), NotifyValue, Node));
+    Info->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
+
+    Info->Notify.Node = Node;
+    Info->Notify.Value = (UINT16) NotifyValue;
+    Info->Notify.HandlerListId = HandlerListId;
+    Info->Notify.HandlerListHead = HandlerListHead;
+    Info->Notify.Global = &AcpiGbl_GlobalNotify[HandlerListId];
+
+    ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+        "Dispatching Notify on [%4.4s] (%s) Value 0x%2.2X (%s) Node %p\n",
+        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type),
+        NotifyValue, AcpiUtGetNotifyName (NotifyValue), Node));
+
+    Status = AcpiOsExecute (OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch,
+        Info);
+    if (ACPI_FAILURE (Status))
+    {
+        AcpiUtDeleteGenericState (Info);
     }
 
     return (Status);
@@ -307,61 +282,37 @@  static void ACPI_SYSTEM_XFACE
 AcpiEvNotifyDispatch (
     void                    *Context)
 {
-    ACPI_GENERIC_STATE      *NotifyInfo = (ACPI_GENERIC_STATE *) Context;
-    ACPI_NOTIFY_HANDLER     GlobalHandler = NULL;
-    void                    *GlobalContext = NULL;
+    ACPI_GENERIC_STATE      *Info = (ACPI_GENERIC_STATE *) Context;
     ACPI_OPERAND_OBJECT     *HandlerObj;
 
 
     ACPI_FUNCTION_ENTRY ();
 
 
-    /*
-     * We will invoke a global notify handler if installed. This is done
-     * _before_ we invoke the per-device handler attached to the device.
-     */
-    if (NotifyInfo->Notify.Value <= ACPI_MAX_SYS_NOTIFY)
-    {
-        /* Global system notification handler */
+    /* Invoke a global notify handler if installed */
 
-        if (AcpiGbl_SystemNotify.Handler)
-        {
-            GlobalHandler = AcpiGbl_SystemNotify.Handler;
-            GlobalContext = AcpiGbl_SystemNotify.Context;
-        }
-    }
-    else
+    if (Info->Notify.Global->Handler)
     {
-        /* Global driver notification handler */
-
-        if (AcpiGbl_DeviceNotify.Handler)
-        {
-            GlobalHandler = AcpiGbl_DeviceNotify.Handler;
-            GlobalContext = AcpiGbl_DeviceNotify.Context;
-        }
+        Info->Notify.Global->Handler (Info->Notify.Node,
+            Info->Notify.Value,
+            Info->Notify.Global->Context);
     }
 
-    /* Invoke the system handler first, if present */
+    /* Now invoke the local notify handler(s) if any are installed */
 
-    if (GlobalHandler)
+    HandlerObj = Info->Notify.HandlerListHead;
+    while (HandlerObj)
     {
-        GlobalHandler (NotifyInfo->Notify.Node, NotifyInfo->Notify.Value,
-            GlobalContext);
-    }
-
-    /* Now invoke the per-device handler, if present */
-
-    HandlerObj = NotifyInfo->Notify.HandlerObj;
-    if (HandlerObj)
-    {
-        HandlerObj->Notify.Handler (NotifyInfo->Notify.Node,
-            NotifyInfo->Notify.Value,
+        HandlerObj->Notify.Handler (Info->Notify.Node,
+            Info->Notify.Value,
             HandlerObj->Notify.Context);
+
+        HandlerObj = HandlerObj->Notify.Next[Info->Notify.HandlerListId];
     }
 
     /* All done with the info object */
 
-    AcpiUtDeleteGenericState (NotifyInfo);
+    AcpiUtDeleteGenericState (Info);
 }
 
 
diff --git a/src/acpica/source/components/events/evxface.c b/src/acpica/source/components/events/evxface.c
index a6aea09..b0c5ce3 100644
--- a/src/acpica/source/components/events/evxface.c
+++ b/src/acpica/source/components/events/evxface.c
@@ -132,15 +132,21 @@ 
  *
  * PARAMETERS:  Device          - The device for which notifies will be handled
  *              HandlerType     - The type of handler:
- *                                  ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
- *                                  ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
- *                                  ACPI_ALL_NOTIFY:  both system and device
+ *                                  ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
+ *                                  ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
+ *                                  ACPI_ALL_NOTIFY:    Both System and Device
  *              Handler         - Address of the handler
  *              Context         - Value passed to the handler on each GPE
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Install a handler for notifies on an ACPI device
+ * DESCRIPTION: Install a handler for notifications on an ACPI Device,
+ *              ThermalZone, or Processor object.
+ *
+ * NOTES:       The Root namespace object may have only one handler for each
+ *              type of notify (System/Device). Device/Thermal/Processor objects
+ *              may have one device notify handler, and multiple system notify
+ *              handlers.
  *
  ******************************************************************************/
 
@@ -151,10 +157,11 @@  AcpiInstallNotifyHandler (
     ACPI_NOTIFY_HANDLER     Handler,
     void                    *Context)
 {
+    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
     ACPI_OPERAND_OBJECT     *ObjDesc;
-    ACPI_OPERAND_OBJECT     *NotifyObj;
-    ACPI_NAMESPACE_NODE     *Node;
+    ACPI_OPERAND_OBJECT     *HandlerObj;
     ACPI_STATUS             Status;
+    UINT32                  i;
 
 
     ACPI_FUNCTION_TRACE (AcpiInstallNotifyHandler);
@@ -162,8 +169,7 @@  AcpiInstallNotifyHandler (
 
     /* Parameter validation */
 
-    if ((!Device)  ||
-        (!Handler) ||
+    if ((!Device) || (!Handler) || (!HandlerType) ||
         (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
     {
         return_ACPI_STATUS (AE_BAD_PARAMETER);
@@ -175,135 +181,124 @@  AcpiInstallNotifyHandler (
         return_ACPI_STATUS (Status);
     }
 
-    /* Convert and validate the device handle */
-
-    Node = AcpiNsValidateHandle (Device);
-    if (!Node)
-    {
-        Status = AE_BAD_PARAMETER;
-        goto UnlockAndExit;
-    }
-
     /*
      * Root Object:
      * Registering a notify handler on the root object indicates that the
      * caller wishes to receive notifications for all objects. Note that
-     * only one <external> global handler can be regsitered (per notify type).
+     * only one global handler can be registered per notify type.
+     * Ensure that a handler is not already installed.
      */
     if (Device == ACPI_ROOT_OBJECT)
     {
-        /* Make sure the handler is not already installed */
-
-        if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
-                AcpiGbl_SystemNotify.Handler)       ||
-            ((HandlerType & ACPI_DEVICE_NOTIFY) &&
-                AcpiGbl_DeviceNotify.Handler))
-        {
-            Status = AE_ALREADY_EXISTS;
-            goto UnlockAndExit;
-        }
-
-        if (HandlerType & ACPI_SYSTEM_NOTIFY)
-        {
-            AcpiGbl_SystemNotify.Node    = Node;
-            AcpiGbl_SystemNotify.Handler = Handler;
-            AcpiGbl_SystemNotify.Context = Context;
-        }
-
-        if (HandlerType & ACPI_DEVICE_NOTIFY)
+        for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
         {
-            AcpiGbl_DeviceNotify.Node    = Node;
-            AcpiGbl_DeviceNotify.Handler = Handler;
-            AcpiGbl_DeviceNotify.Context = Context;
+            if (HandlerType & (i+1))
+            {
+                if (AcpiGbl_GlobalNotify[i].Handler)
+                {
+                    Status = AE_ALREADY_EXISTS;
+                    goto UnlockAndExit;
+                }
+
+                AcpiGbl_GlobalNotify[i].Handler = Handler;
+                AcpiGbl_GlobalNotify[i].Context = Context;
+            }
         }
 
-        /* Global notify handler installed */
+        goto UnlockAndExit; /* Global notify handler installed, all done */
     }
 
     /*
      * All Other Objects:
-     * Caller will only receive notifications specific to the target object.
-     * Note that only certain object types can receive notifications.
+     * Caller will only receive notifications specific to the target
+     * object. Note that only certain object types are allowed to
+     * receive notifications.
      */
-    else
+
+    /* Are Notifies allowed on this object? */
+
+    if (!AcpiEvIsNotifyObject (Node))
+    {
+        Status = AE_TYPE;
+        goto UnlockAndExit;
+    }
+
+    /* Check for an existing internal object, might not exist */
+
+    ObjDesc = AcpiNsGetAttachedObject (Node);
+    if (!ObjDesc)
     {
-        /* Notifies allowed on this object? */
+        /* Create a new object */
 
-        if (!AcpiEvIsNotifyObject (Node))
+        ObjDesc = AcpiUtCreateInternalObject (Node->Type);
+        if (!ObjDesc)
         {
-            Status = AE_TYPE;
+            Status = AE_NO_MEMORY;
             goto UnlockAndExit;
         }
 
-        /* Check for an existing internal object */
+        /* Attach new object to the Node, remove local reference */
 
-        ObjDesc = AcpiNsGetAttachedObject (Node);
-        if (ObjDesc)
+        Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
+        AcpiUtRemoveReference (ObjDesc);
+        if (ACPI_FAILURE (Status))
         {
-            /* Object exists - make sure there's no handler */
-
-            if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
-                    ObjDesc->CommonNotify.SystemNotify)   ||
-                ((HandlerType & ACPI_DEVICE_NOTIFY) &&
-                    ObjDesc->CommonNotify.DeviceNotify))
-            {
-                Status = AE_ALREADY_EXISTS;
-                goto UnlockAndExit;
-            }
+            goto UnlockAndExit;
         }
-        else
-        {
-            /* Create a new object */
-
-            ObjDesc = AcpiUtCreateInternalObject (Node->Type);
-            if (!ObjDesc)
-            {
-                Status = AE_NO_MEMORY;
-                goto UnlockAndExit;
-            }
-
-            /* Attach new object to the Node */
-
-            Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
+    }
 
-            /* Remove local reference to the object */
+    /* Ensure that the handler is not already installed in the lists */
 
-            AcpiUtRemoveReference (ObjDesc);
-            if (ACPI_FAILURE (Status))
+    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
+    {
+        if (HandlerType & (i+1))
+        {
+            HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
+            while (HandlerObj)
             {
-                goto UnlockAndExit;
+                if (HandlerObj->Notify.Handler == Handler)
+                {
+                    Status = AE_ALREADY_EXISTS;
+                    goto UnlockAndExit;
+                }
+
+                HandlerObj = HandlerObj->Notify.Next[i];
             }
         }
+    }
 
-        /* Install the handler */
+    /* Create and populate a new notify handler object */
 
-        NotifyObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
-        if (!NotifyObj)
-        {
-            Status = AE_NO_MEMORY;
-            goto UnlockAndExit;
-        }
+    HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
+    if (!HandlerObj)
+    {
+        Status = AE_NO_MEMORY;
+        goto UnlockAndExit;
+    }
 
-        NotifyObj->Notify.Node    = Node;
-        NotifyObj->Notify.Handler = Handler;
-        NotifyObj->Notify.Context = Context;
+    HandlerObj->Notify.Node = Node;
+    HandlerObj->Notify.HandlerType = HandlerType;
+    HandlerObj->Notify.Handler = Handler;
+    HandlerObj->Notify.Context = Context;
 
-        if (HandlerType & ACPI_SYSTEM_NOTIFY)
-        {
-            ObjDesc->CommonNotify.SystemNotify = NotifyObj;
-        }
+    /* Install the handler at the list head(s) */
 
-        if (HandlerType & ACPI_DEVICE_NOTIFY)
+    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
+    {
+        if (HandlerType & (i+1))
         {
-            ObjDesc->CommonNotify.DeviceNotify = NotifyObj;
+            HandlerObj->Notify.Next[i] =
+                ObjDesc->CommonNotify.NotifyList[i];
+
+            ObjDesc->CommonNotify.NotifyList[i] = HandlerObj;
         }
+    }
 
-        if (HandlerType == ACPI_ALL_NOTIFY)
-        {
-            /* Extra ref if installed in both */
+    /* Add an extra reference if handler was installed in both lists */
 
-            AcpiUtAddReference (NotifyObj);
-        }
+    if (HandlerType == ACPI_ALL_NOTIFY)
+    {
+        AcpiUtAddReference (HandlerObj);
     }
 
 
@@ -319,11 +314,11 @@  ACPI_EXPORT_SYMBOL (AcpiInstallNotifyHandler)
  *
  * FUNCTION:    AcpiRemoveNotifyHandler
  *
- * PARAMETERS:  Device          - The device for which notifies will be handled
+ * PARAMETERS:  Device          - The device for which the handler is installed
  *              HandlerType     - The type of handler:
- *                                  ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
- *                                  ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
- *                                  ACPI_ALL_NOTIFY:  both system and device
+ *                                  ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
+ *                                  ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
+ *                                  ACPI_ALL_NOTIFY:    Both System and Device
  *              Handler         - Address of the handler
  *
  * RETURN:      Status
@@ -338,10 +333,12 @@  AcpiRemoveNotifyHandler (
     UINT32                  HandlerType,
     ACPI_NOTIFY_HANDLER     Handler)
 {
-    ACPI_OPERAND_OBJECT     *NotifyObj;
+    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Device);
     ACPI_OPERAND_OBJECT     *ObjDesc;
-    ACPI_NAMESPACE_NODE     *Node;
+    ACPI_OPERAND_OBJECT     *HandlerObj;
+    ACPI_OPERAND_OBJECT     *PreviousHandlerObj;
     ACPI_STATUS             Status;
+    UINT32                  i;
 
 
     ACPI_FUNCTION_TRACE (AcpiRemoveNotifyHandler);
@@ -349,122 +346,103 @@  AcpiRemoveNotifyHandler (
 
     /* Parameter validation */
 
-    if ((!Device)  ||
-        (!Handler) ||
+    if ((!Device) || (!Handler) || (!HandlerType) ||
         (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
     {
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
 
+    /* Make sure all deferred notify tasks are completed */
+
+    AcpiOsWaitEventsComplete ();
+
     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
     if (ACPI_FAILURE (Status))
     {
         return_ACPI_STATUS (Status);
     }
 
-    /* Convert and validate the device handle */
-
-    Node = AcpiNsValidateHandle (Device);
-    if (!Node)
-    {
-        Status = AE_BAD_PARAMETER;
-        goto UnlockAndExit;
-    }
-
-    /* Root Object */
+    /* Root Object. Global handlers are removed here */
 
     if (Device == ACPI_ROOT_OBJECT)
     {
-        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-            "Removing notify handler for namespace root object\n"));
-
-        if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
-              !AcpiGbl_SystemNotify.Handler)        ||
-            ((HandlerType & ACPI_DEVICE_NOTIFY) &&
-              !AcpiGbl_DeviceNotify.Handler))
-        {
-            Status = AE_NOT_EXIST;
-            goto UnlockAndExit;
-        }
-
-        if (HandlerType & ACPI_SYSTEM_NOTIFY)
+        for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
         {
-            AcpiGbl_SystemNotify.Node    = NULL;
-            AcpiGbl_SystemNotify.Handler = NULL;
-            AcpiGbl_SystemNotify.Context = NULL;
+            if (HandlerType & (i+1))
+            {
+                if (!AcpiGbl_GlobalNotify[i].Handler ||
+                    (AcpiGbl_GlobalNotify[i].Handler != Handler))
+                {
+                    Status = AE_NOT_EXIST;
+                    goto UnlockAndExit;
+                }
+
+                ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+                    "Removing global notify handler\n"));
+
+                AcpiGbl_GlobalNotify[i].Handler = NULL;
+                AcpiGbl_GlobalNotify[i].Context = NULL;
+            }
         }
 
-        if (HandlerType & ACPI_DEVICE_NOTIFY)
-        {
-            AcpiGbl_DeviceNotify.Node    = NULL;
-            AcpiGbl_DeviceNotify.Handler = NULL;
-            AcpiGbl_DeviceNotify.Context = NULL;
-        }
+        goto UnlockAndExit;
     }
 
-    /* All Other Objects */
+    /* All other objects: Are Notifies allowed on this object? */
 
-    else
+    if (!AcpiEvIsNotifyObject (Node))
     {
-        /* Notifies allowed on this object? */
+        Status = AE_TYPE;
+        goto UnlockAndExit;
+    }
 
-        if (!AcpiEvIsNotifyObject (Node))
-        {
-            Status = AE_TYPE;
-            goto UnlockAndExit;
-        }
+    /* Must have an existing internal object */
+
+    ObjDesc = AcpiNsGetAttachedObject (Node);
+    if (!ObjDesc)
+    {
+        Status = AE_NOT_EXIST;
+        goto UnlockAndExit;
+    }
 
-        /* Check for an existing internal object */
+    /* Internal object exists. Find the handler and remove it */
 
-        ObjDesc = AcpiNsGetAttachedObject (Node);
-        if (!ObjDesc)
+    for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
+    {
+        if (HandlerType & (i+1))
         {
-            Status = AE_NOT_EXIST;
-            goto UnlockAndExit;
-        }
+            HandlerObj = ObjDesc->CommonNotify.NotifyList[i];
+            PreviousHandlerObj = NULL;
 
-        /* Object exists - make sure there's an existing handler */
+            /* Attempt to find the handler in the handler list */
 
-        if (HandlerType & ACPI_SYSTEM_NOTIFY)
-        {
-            NotifyObj = ObjDesc->CommonNotify.SystemNotify;
-            if (!NotifyObj)
+            while (HandlerObj &&
+                  (HandlerObj->Notify.Handler != Handler))
             {
-                Status = AE_NOT_EXIST;
-                goto UnlockAndExit;
+                PreviousHandlerObj = HandlerObj;
+                HandlerObj = HandlerObj->Notify.Next[i];
             }
 
-            if (NotifyObj->Notify.Handler != Handler)
+            if (!HandlerObj)
             {
-                Status = AE_BAD_PARAMETER;
+                Status = AE_NOT_EXIST;
                 goto UnlockAndExit;
             }
 
-            /* Remove the handler */
+            /* Remove the handler object from the list */
 
-            ObjDesc->CommonNotify.SystemNotify = NULL;
-            AcpiUtRemoveReference (NotifyObj);
-        }
-
-        if (HandlerType & ACPI_DEVICE_NOTIFY)
-        {
-            NotifyObj = ObjDesc->CommonNotify.DeviceNotify;
-            if (!NotifyObj)
+            if (PreviousHandlerObj) /* Handler is not at the list head */
             {
-                Status = AE_NOT_EXIST;
-                goto UnlockAndExit;
+                PreviousHandlerObj->Notify.Next[i] =
+                    HandlerObj->Notify.Next[i];
             }
-
-            if (NotifyObj->Notify.Handler != Handler)
+            else /* Handler is at the list head */
             {
-                Status = AE_BAD_PARAMETER;
-                goto UnlockAndExit;
+                ObjDesc->CommonNotify.NotifyList[i] =
+                    HandlerObj->Notify.Next[i];
             }
 
-            /* Remove the handler */
-
-            ObjDesc->CommonNotify.DeviceNotify = NULL;
-            AcpiUtRemoveReference (NotifyObj);
+            AcpiUtRemoveReference (HandlerObj);
         }
     }
 
@@ -894,6 +872,10 @@  AcpiRemoveGpeHandler (
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
 
+    /* Make sure all deferred GPE tasks are completed */
+
+    AcpiOsWaitEventsComplete ();
+
     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
     if (ACPI_FAILURE (Status))
     {
diff --git a/src/acpica/source/components/events/evxfgpe.c b/src/acpica/source/components/events/evxfgpe.c
index 7018513..29e1d68 100644
--- a/src/acpica/source/components/events/evxfgpe.c
+++ b/src/acpica/source/components/events/evxfgpe.c
@@ -155,7 +155,7 @@  AcpiUpdateAllGpes (
     ACPI_STATUS             Status;
 
 
-    ACPI_FUNCTION_TRACE (AcpiUpdateGpes);
+    ACPI_FUNCTION_TRACE (AcpiUpdateAllGpes);
 
 
     Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
@@ -367,9 +367,11 @@  AcpiSetupGpeForWake (
     ACPI_HANDLE             GpeDevice,
     UINT32                  GpeNumber)
 {
-    ACPI_STATUS             Status = AE_BAD_PARAMETER;
+    ACPI_STATUS             Status;
     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
     ACPI_NAMESPACE_NODE     *DeviceNode;
+    ACPI_GPE_NOTIFY_INFO    *Notify;
+    ACPI_GPE_NOTIFY_INFO    *NewNotify;
     ACPI_CPU_FLAGS          Flags;
 
 
@@ -405,32 +407,88 @@  AcpiSetupGpeForWake (
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
 
+    /*
+     * Allocate a new notify object up front, in case it is needed.
+     * Memory allocation while holding a spinlock is a big no-no
+     * on some hosts.
+     */
+    NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
+    if (!NewNotify)
+    {
+        return_ACPI_STATUS (AE_NO_MEMORY);
+    }
+
     Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
 
     /* Ensure that we have a valid GPE number */
 
     GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
-    if (GpeEventInfo)
+    if (!GpeEventInfo)
+    {
+        Status = AE_BAD_PARAMETER;
+        goto UnlockAndExit;
+    }
+
+    /*
+     * If there is no method or handler for this GPE, then the
+     * WakeDevice will be notified whenever this GPE fires. This is
+     * known as an "implicit notify". Note: The GPE is assumed to be
+     * level-triggered (for windows compatibility).
+     */
+    if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
+            ACPI_GPE_DISPATCH_NONE)
     {
         /*
-         * If there is no method or handler for this GPE, then the
-         * WakeDevice will be notified whenever this GPE fires (aka
-         * "implicit notify") Note: The GPE is assumed to be
-         * level-triggered (for windows compatibility).
+         * This is the first device for implicit notify on this GPE.
+         * Just set the flags here, and enter the NOTIFY block below.
          */
-        if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
-                ACPI_GPE_DISPATCH_NONE)
+        GpeEventInfo->Flags =
+            (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
+    }
+
+    /*
+     * If we already have an implicit notify on this GPE, add
+     * this device to the notify list.
+     */
+    if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
+            ACPI_GPE_DISPATCH_NOTIFY)
+    {
+        /* Ensure that the device is not already in the list */
+
+        Notify = GpeEventInfo->Dispatch.NotifyList;
+        while (Notify)
         {
-            GpeEventInfo->Flags =
-                (ACPI_GPE_DISPATCH_NOTIFY | ACPI_GPE_LEVEL_TRIGGERED);
-            GpeEventInfo->Dispatch.DeviceNode = DeviceNode;
+            if (Notify->DeviceNode == DeviceNode)
+            {
+                Status = AE_ALREADY_EXISTS;
+                goto UnlockAndExit;
+            }
+            Notify = Notify->Next;
         }
 
-        GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
-        Status = AE_OK;
+        /* Add this device to the notify list for this GPE */
+
+        NewNotify->DeviceNode = DeviceNode;
+        NewNotify->Next = GpeEventInfo->Dispatch.NotifyList;
+        GpeEventInfo->Dispatch.NotifyList = NewNotify;
+        NewNotify = NULL;
     }
 
+    /* Mark the GPE as a possible wake event */
+
+    GpeEventInfo->Flags |= ACPI_GPE_CAN_WAKE;
+    Status = AE_OK;
+
+
+UnlockAndExit:
     AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+
+    /* Delete the notify object if it was not used above */
+
+    if (NewNotify)
+    {
+        ACPI_FREE (NewNotify);
+    }
     return_ACPI_STATUS (Status);
 }
 
diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c
index 69361d5..55cef28 100644
--- a/src/acpica/source/components/executer/exconfig.c
+++ b/src/acpica/source/components/executer/exconfig.c
@@ -252,7 +252,7 @@  AcpiExLoadTableOp (
     ACPI_FUNCTION_TRACE (ExLoadTableOp);
 
 
-    /* Validate lengths for the SignatureString, OEMIDString, OEMTableID */
+    /* Validate lengths for the Signature, OemId, and OemTableId strings */
 
     if ((Operand[0]->String.Length > ACPI_NAME_SIZE) ||
         (Operand[1]->String.Length > ACPI_OEM_ID_SIZE) ||
diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
index 5aab606..b525333 100644
--- a/src/acpica/source/components/executer/exdump.c
+++ b/src/acpica/source/components/executer/exdump.c
@@ -203,8 +203,8 @@  static ACPI_EXDUMP_INFO     AcpiExDumpDevice[4] =
 {
     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice),         NULL},
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.Handler),               "Handler"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.SystemNotify),          "System Notify"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.DeviceNotify),          "Device Notify"}
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[0]),         "System Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Device.NotifyList[1]),         "Device Notify"}
 };
 
 static ACPI_EXDUMP_INFO     AcpiExDumpEvent[2] =
@@ -251,8 +251,8 @@  static ACPI_EXDUMP_INFO     AcpiExDumpPower[5] =
     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpPower),          NULL},
     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.SystemLevel),    "System Level"},
     {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (PowerResource.ResourceOrder),  "Resource Order"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.SystemNotify),   "System Notify"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.DeviceNotify),   "Device Notify"}
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[0]),  "System Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (PowerResource.NotifyList[1]),  "Device Notify"}
 };
 
 static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
@@ -261,16 +261,16 @@  static ACPI_EXDUMP_INFO     AcpiExDumpProcessor[7] =
     {ACPI_EXD_UINT8,    ACPI_EXD_OFFSET (Processor.ProcId),             "Processor ID"},
     {ACPI_EXD_UINT8 ,   ACPI_EXD_OFFSET (Processor.Length),             "Length"},
     {ACPI_EXD_ADDRESS,  ACPI_EXD_OFFSET (Processor.Address),            "Address"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.SystemNotify),       "System Notify"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.DeviceNotify),       "Device Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[0]),      "System Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.NotifyList[1]),      "Device Notify"},
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Processor.Handler),            "Handler"}
 };
 
 static ACPI_EXDUMP_INFO     AcpiExDumpThermal[4] =
 {
     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal),        NULL},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.SystemNotify),     "System Notify"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.DeviceNotify),     "Device Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[0]),    "System Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.NotifyList[1]),    "Device Notify"},
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (ThermalZone.Handler),          "Handler"}
 };
 
@@ -330,11 +330,15 @@  static ACPI_EXDUMP_INFO     AcpiExDumpAddressHandler[6] =
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (AddressSpace.Context),         "Context"}
 };
 
-static ACPI_EXDUMP_INFO     AcpiExDumpNotify[3] =
+static ACPI_EXDUMP_INFO     AcpiExDumpNotify[7] =
 {
     {ACPI_EXD_INIT,     ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify),         NULL},
     {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Node),                  "Node"},
-    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"}
+    {ACPI_EXD_UINT32,   ACPI_EXD_OFFSET (Notify.HandlerType),           "Handler Type"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Handler),               "Handler"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Context),               "Context"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[0]),               "Next System Notify"},
+    {ACPI_EXD_POINTER,  ACPI_EXD_OFFSET (Notify.Next[1]),               "Next Device Notify"}
 };
 
 
diff --git a/src/acpica/source/components/executer/exprep.c b/src/acpica/source/components/executer/exprep.c
index 0b65ab9..9b05f9d 100644
--- a/src/acpica/source/components/executer/exprep.c
+++ b/src/acpica/source/components/executer/exprep.c
@@ -490,8 +490,8 @@  AcpiExPrepCommonFieldObject (
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and
- *              connect it to the parent Node.
+ * DESCRIPTION: Construct an object of type ACPI_OPERAND_OBJECT with a
+ *              subtype of DefField and connect it to the parent Node.
  *
  ******************************************************************************/
 
diff --git a/src/acpica/source/components/executer/exresolv.c b/src/acpica/source/components/executer/exresolv.c
index 8d3893b..4b9e9b3 100644
--- a/src/acpica/source/components/executer/exresolv.c
+++ b/src/acpica/source/components/executer/exresolv.c
@@ -237,7 +237,7 @@  AcpiExResolveObjectToValue (
 
     StackDesc = *StackPtr;
 
-    /* This is an ACPI_OPERAND_OBJECT  */
+    /* This is an object of type ACPI_OPERAND_OBJECT */
 
     switch (StackDesc->Common.Type)
     {
diff --git a/src/acpica/source/components/executer/exstore.c b/src/acpica/source/components/executer/exstore.c
index 8bea79b..36fccf8 100644
--- a/src/acpica/source/components/executer/exstore.c
+++ b/src/acpica/source/components/executer/exstore.c
@@ -140,15 +140,15 @@  AcpiExStoreObjectToIndex (
  * FUNCTION:    AcpiExStore
  *
  * PARAMETERS:  *SourceDesc         - Value to be stored
- *              *DestDesc           - Where to store it.  Must be an NS node
- *                                    or an ACPI_OPERAND_OBJECT of type
+ *              *DestDesc           - Where to store it. Must be an NS node
+ *                                    or ACPI_OPERAND_OBJECT of type
  *                                    Reference;
  *              WalkState           - Current walk state
  *
  * RETURN:      Status
  *
  * DESCRIPTION: Store the value described by SourceDesc into the location
- *              described by DestDesc.  Called by various interpreter
+ *              described by DestDesc. Called by various interpreter
  *              functions to store the result of an operation into
  *              the destination operand -- not just simply the actual "Store"
  *              ASL operator.
diff --git a/src/acpica/source/components/executer/exutils.c b/src/acpica/source/components/executer/exutils.c
index 3ebcbe5..28a18ad 100644
--- a/src/acpica/source/components/executer/exutils.c
+++ b/src/acpica/source/components/executer/exutils.c
@@ -193,7 +193,7 @@  AcpiExEnterInterpreter (
  *
  * DESCRIPTION: Reacquire the interpreter execution region from within the
  *              interpreter code. Failure to enter the interpreter region is a
- *              fatal system error. Used in  conjuction with
+ *              fatal system error. Used in conjunction with
  *              RelinquishInterpreter
  *
  ******************************************************************************/
diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c
index 6fd9d66..a2e4c43 100644
--- a/src/acpica/source/components/hardware/hwsleep.c
+++ b/src/acpica/source/components/hardware/hwsleep.c
@@ -171,20 +171,6 @@  AcpiHwLegacySleep (
         return_ACPI_STATUS (Status);
     }
 
-    if (SleepState != ACPI_STATE_S5)
-    {
-        /*
-         * Disable BM arbitration. This feature is contained within an
-         * optional register (PM2 Control), so ignore a BAD_ADDRESS
-         * exception.
-         */
-        Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 1);
-        if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
-        {
-            return_ACPI_STATUS (Status);
-        }
-    }
-
     /*
      * 1) Disable/Clear all GPEs
      * 2) Enable all wakeup GPEs
@@ -452,17 +438,6 @@  AcpiHwLegacyWake (
             AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId,
             ACPI_CLEAR_STATUS);
 
-    /*
-     * Enable BM arbitration. This feature is contained within an
-     * optional register (PM2 Control), so ignore a BAD_ADDRESS
-     * exception.
-     */
-    Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 0);
-    if (ACPI_FAILURE (Status) && (Status != AE_BAD_ADDRESS))
-    {
-        return_ACPI_STATUS (Status);
-    }
-
     AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
     return_ACPI_STATUS (Status);
 }
diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
index 631b81e..dfb7112 100644
--- a/src/acpica/source/components/hardware/hwxfsleep.c
+++ b/src/acpica/source/components/hardware/hwxfsleep.c
@@ -173,6 +173,14 @@  AcpiSetFirmwareWakingVector (
     ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector);
 
 
+    /*
+     * According to the ACPI specification 2.0c and later, the 64-bit
+     * waking vector should be cleared and the 32-bit waking vector should
+     * be used, unless we want the wake-up code to be called by the BIOS in
+     * Protected Mode. Some systems (for example HP dv5-1004nr) are known
+     * to fail to resume if the 64-bit vector is used.
+     */
+
     /* Set the 32-bit vector */
 
     AcpiGbl_FACS->FirmwareWakingVector = PhysicalAddress;
diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
index e6c7cf6..8bc2591 100644
--- a/src/acpica/source/components/namespace/nspredef.c
+++ b/src/acpica/source/components/namespace/nspredef.c
@@ -753,7 +753,7 @@  AcpiNsCheckPackage (
         {
             /* Create the new outer package and populate it */
 
-            Status = AcpiNsWrapWithPackage (Data, *Elements, ReturnObjectPtr);
+            Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr);
             if (ACPI_FAILURE (Status))
             {
                 return (Status);
diff --git a/src/acpica/source/components/parser/psxface.c b/src/acpica/source/components/parser/psxface.c
index 11c5fc2..5da1b6a 100644
--- a/src/acpica/source/components/parser/psxface.c
+++ b/src/acpica/source/components/parser/psxface.c
@@ -420,8 +420,8 @@  AcpiPsExecuteMethod (
     }
 
     /*
-     * Start method evaluation with an implicit return of zero. This is done
-     * for Windows compatibility.
+     * Start method evaluation with an implicit return of zero.
+     * This is done for Windows compatibility.
      */
     if (AcpiGbl_EnableInterpreterSlack)
     {
diff --git a/src/acpica/source/components/resources/rscreate.c b/src/acpica/source/components/resources/rscreate.c
index d75ceb6..6aaf4bb 100644
--- a/src/acpica/source/components/resources/rscreate.c
+++ b/src/acpica/source/components/resources/rscreate.c
@@ -281,8 +281,8 @@  AcpiRsCreateResourceList (
  *
  * FUNCTION:    AcpiRsCreatePciRoutingTable
  *
- * PARAMETERS:  PackageObject           - Pointer to an ACPI_OPERAND_OBJECT
- *                                        package
+ * PARAMETERS:  PackageObject           - Pointer to a package containing one
+ *                                        of more ACPI_OPERAND_OBJECTs
  *              OutputBuffer            - Pointer to the user's buffer
  *
  * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
@@ -290,7 +290,7 @@  AcpiRsCreateResourceList (
  *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
  *              to the size buffer needed.
  *
- * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT  package and creates a
+ * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a
  *              linked list of PCI interrupt descriptions
  *
  * NOTE: It is the caller's responsibility to ensure that the start of the
diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
index ce3143c..a45b3d6 100644
--- a/src/acpica/source/components/resources/rsutils.c
+++ b/src/acpica/source/components/resources/rsutils.c
@@ -253,7 +253,7 @@  AcpiRsMoveData (
 
         /*
          * 16-, 32-, and 64-bit cases must use the move macros that perform
-         * endian conversion and/or accomodate hardware that cannot perform
+         * endian conversion and/or accommodate hardware that cannot perform
          * misaligned memory transfers
          */
         case ACPI_RSC_MOVE16:
diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
index fa43dbb..2c51511 100644
--- a/src/acpica/source/components/tables/tbfadt.c
+++ b/src/acpica/source/components/tables/tbfadt.c
@@ -124,12 +124,13 @@ 
 
 /* Local prototypes */
 
-static ACPI_INLINE void
+static void
 AcpiTbInitGenericAddress (
     ACPI_GENERIC_ADDRESS    *GenericAddress,
     UINT8                   SpaceId,
     UINT8                   ByteWidth,
-    UINT64                  Address);
+    UINT64                  Address,
+    char                    *RegisterName);
 
 static void
 AcpiTbConvertFadt (
@@ -263,7 +264,7 @@  static ACPI_FADT_PM_INFO    FadtPmInfoTable[] =
  *
  * PARAMETERS:  GenericAddress      - GAS struct to be initialized
  *              SpaceId             - ACPI Space ID for this register
- *              ByteWidth           - Width of this register, in bytes
+ *              ByteWidth           - Width of this register
  *              Address             - Address of the register
  *
  * RETURN:      None
@@ -274,13 +275,30 @@  static ACPI_FADT_PM_INFO    FadtPmInfoTable[] =
  *
  ******************************************************************************/
 
-static ACPI_INLINE void
+static void
 AcpiTbInitGenericAddress (
     ACPI_GENERIC_ADDRESS    *GenericAddress,
     UINT8                   SpaceId,
     UINT8                   ByteWidth,
-    UINT64                  Address)
+    UINT64                  Address,
+    char                    *RegisterName)
 {
+    UINT8                   BitWidth;
+
+
+    /* Bit width field in the GAS is only one byte long, 255 max */
+
+    BitWidth = (UINT8) (ByteWidth * 8);
+
+    if (ByteWidth > 31) /* (31*8)=248 */
+    {
+        ACPI_ERROR ((AE_INFO,
+            "%s - 32-bit FADT register is too long (%u bytes, %u bits) "
+            "to convert to GAS struct - 255 bits max, truncating",
+            RegisterName, ByteWidth, (ByteWidth * 8)));
+
+        BitWidth = 255;
+    }
 
     /*
      * The 64-bit Address field is non-aligned in the byte packed
@@ -291,7 +309,7 @@  AcpiTbInitGenericAddress (
     /* All other fields are byte-wide */
 
     GenericAddress->SpaceId = SpaceId;
-    GenericAddress->BitWidth = (UINT8) ACPI_MUL_8 (ByteWidth);
+    GenericAddress->BitWidth = BitWidth;
     GenericAddress->BitOffset = 0;
     GenericAddress->AccessWidth = 0; /* Access width ANY */
 }
@@ -392,7 +410,7 @@  AcpiTbCreateLocalFadt (
      */
     if (Length > sizeof (ACPI_TABLE_FADT))
     {
-        ACPI_WARNING ((AE_INFO,
+        ACPI_BIOS_WARNING ((AE_INFO,
             "FADT (revision %u) is longer than ACPI 5.0 version, "
             "truncating length %u to %u",
             Table->Revision, Length, (UINT32) sizeof (ACPI_TABLE_FADT)));
@@ -540,8 +558,9 @@  AcpiTbConvertFadt (
         if (Address64->Address && Address32 &&
            (Address64->Address != (UINT64) Address32))
         {
-            ACPI_ERROR ((AE_INFO,
-                "32/64X address mismatch in %s: 0x%8.8X/0x%8.8X%8.8X, using 32",
+            ACPI_BIOS_ERROR ((AE_INFO,
+                "32/64X address mismatch in FADT/%s: "
+                "0x%8.8X/0x%8.8X%8.8X, using 32",
                 FadtInfoTable[i].Name, Address32,
                 ACPI_FORMAT_UINT64 (Address64->Address)));
         }
@@ -556,7 +575,7 @@  AcpiTbConvertFadt (
              */
             AcpiTbInitGenericAddress (Address64, ACPI_ADR_SPACE_SYSTEM_IO,
                 *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length),
-                (UINT64) Address32);
+                (UINT64) Address32, FadtInfoTable[i].Name);
         }
     }
 }
@@ -600,7 +619,7 @@  AcpiTbValidateFadt (
     if (AcpiGbl_FADT.Facs &&
         (AcpiGbl_FADT.XFacs != (UINT64) AcpiGbl_FADT.Facs))
     {
-        ACPI_WARNING ((AE_INFO,
+        ACPI_BIOS_WARNING ((AE_INFO,
             "32/64X FACS address mismatch in FADT - "
             "0x%8.8X/0x%8.8X%8.8X, using 32",
             AcpiGbl_FADT.Facs, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XFacs)));
@@ -611,7 +630,7 @@  AcpiTbValidateFadt (
     if (AcpiGbl_FADT.Dsdt &&
         (AcpiGbl_FADT.XDsdt != (UINT64) AcpiGbl_FADT.Dsdt))
     {
-        ACPI_WARNING ((AE_INFO,
+        ACPI_BIOS_WARNING ((AE_INFO,
             "32/64X DSDT address mismatch in FADT - "
             "0x%8.8X/0x%8.8X%8.8X, using 32",
             AcpiGbl_FADT.Dsdt, ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XDsdt)));
@@ -647,8 +666,8 @@  AcpiTbValidateFadt (
         if (Address64->Address &&
            (Address64->BitWidth != ACPI_MUL_8 (Length)))
         {
-            ACPI_WARNING ((AE_INFO,
-                "32/64X length mismatch in %s: %u/%u",
+            ACPI_BIOS_WARNING ((AE_INFO,
+                "32/64X length mismatch in FADT/%s: %u/%u",
                 Name, ACPI_MUL_8 (Length), Address64->BitWidth));
         }
 
@@ -660,9 +679,9 @@  AcpiTbValidateFadt (
              */
             if (!Address64->Address || !Length)
             {
-                ACPI_ERROR ((AE_INFO,
-                    "Required field %s has zero address and/or length:"
-                    " 0x%8.8X%8.8X/0x%X",
+                ACPI_BIOS_ERROR ((AE_INFO,
+                    "Required FADT field %s has zero address and/or length: "
+                    "0x%8.8X%8.8X/0x%X",
                     Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
             }
         }
@@ -676,8 +695,8 @@  AcpiTbValidateFadt (
             if ((Address64->Address && !Length) ||
                 (!Address64->Address && Length))
             {
-                ACPI_WARNING ((AE_INFO,
-                    "Optional field %s has zero address or length: "
+                ACPI_BIOS_WARNING ((AE_INFO,
+                    "Optional FADT field %s has zero address or length: "
                     "0x%8.8X%8.8X/0x%X",
                     Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
             }
@@ -728,8 +747,8 @@  AcpiTbSetupFadtRegisters (
                 (FadtInfoTable[i].DefaultLength > 0) &&
                 (FadtInfoTable[i].DefaultLength != Target64->BitWidth))
             {
-                ACPI_WARNING ((AE_INFO,
-                    "Invalid length for %s: %u, using default %u",
+                ACPI_BIOS_WARNING ((AE_INFO,
+                    "Invalid length for FADT/%s: %u, using default %u",
                     FadtInfoTable[i].Name, Target64->BitWidth,
                     FadtInfoTable[i].DefaultLength));
 
@@ -772,7 +791,8 @@  AcpiTbSetupFadtRegisters (
             AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target,
                 Source64->SpaceId, Pm1RegisterByteWidth,
                 Source64->Address +
-                    (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth));
+                    (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth),
+                "PmRegisters");
         }
     }
 }
diff --git a/src/acpica/source/components/tables/tbinstal.c b/src/acpica/source/components/tables/tbinstal.c
index 00fd2a2..5e112dc 100644
--- a/src/acpica/source/components/tables/tbinstal.c
+++ b/src/acpica/source/components/tables/tbinstal.c
@@ -229,8 +229,9 @@  AcpiTbAddTable (
        (!ACPI_COMPARE_NAME (TableDesc->Pointer->Signature, ACPI_SIG_SSDT)) &&
        (ACPI_STRNCMP (TableDesc->Pointer->Signature, "OEM", 3)))
     {
-        ACPI_ERROR ((AE_INFO,
-            "Table has invalid signature [%4.4s] (0x%8.8X), must be SSDT or OEMx",
+        ACPI_BIOS_ERROR ((AE_INFO,
+            "Table has invalid signature [%4.4s] (0x%8.8X), "
+            "must be SSDT or OEMx",
             AcpiUtValidAcpiName (*(UINT32 *) TableDesc->Pointer->Signature) ?
                 TableDesc->Pointer->Signature : "????",
             *(UINT32 *) TableDesc->Pointer->Signature));
diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
index 4ad777c..4f0b75d 100644
--- a/src/acpica/source/components/tables/tbutils.c
+++ b/src/acpica/source/components/tables/tbutils.c
@@ -359,8 +359,9 @@  AcpiTbVerifyChecksum (
 
     if (Checksum)
     {
-        ACPI_WARNING ((AE_INFO,
-            "Incorrect checksum in table [%4.4s] - 0x%2.2X, should be 0x%2.2X",
+        ACPI_BIOS_WARNING ((AE_INFO,
+            "Incorrect checksum in table [%4.4s] - 0x%2.2X, "
+            "should be 0x%2.2X",
             Table->Signature, Table->Checksum,
             (UINT8) (Table->Checksum - Checksum)));
 
@@ -428,8 +429,9 @@  AcpiTbCheckDsdtHeader (
     if (AcpiGbl_OriginalDsdtHeader.Length != AcpiGbl_DSDT->Length ||
         AcpiGbl_OriginalDsdtHeader.Checksum != AcpiGbl_DSDT->Checksum)
     {
-        ACPI_ERROR ((AE_INFO,
-            "The DSDT has been corrupted or replaced - old, new headers below"));
+        ACPI_BIOS_ERROR ((AE_INFO,
+            "The DSDT has been corrupted or replaced - "
+            "old, new headers below"));
         AcpiTbPrintTableHeader (0, &AcpiGbl_OriginalDsdtHeader);
         AcpiTbPrintTableHeader (0, AcpiGbl_DSDT);
 
@@ -537,7 +539,7 @@  AcpiTbInstallTable (
     if (Signature &&
         !ACPI_COMPARE_NAME (Table->Signature, Signature))
     {
-        ACPI_ERROR ((AE_INFO,
+        ACPI_BIOS_ERROR ((AE_INFO,
             "Invalid signature 0x%X for ACPI table, expected [%s]",
             *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));
         goto UnmapAndExit;
@@ -656,7 +658,7 @@  AcpiTbGetRootTableEntry (
         {
             /* Will truncate 64-bit address to 32 bits, issue warning */
 
-            ACPI_WARNING ((AE_INFO,
+            ACPI_BIOS_WARNING ((AE_INFO,
                 "64-bit Physical Address in XSDT is too large (0x%8.8X%8.8X),"
                 " truncating",
                 ACPI_FORMAT_UINT64 (Address64)));
@@ -758,7 +760,8 @@  AcpiTbParseRootTable (
 
     if (Length < sizeof (ACPI_TABLE_HEADER))
     {
-        ACPI_ERROR ((AE_INFO, "Invalid length 0x%X in RSDT/XSDT", Length));
+        ACPI_BIOS_ERROR ((AE_INFO,
+            "Invalid table length 0x%X in RSDT/XSDT", Length));
         return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);
     }
 
diff --git a/src/acpica/source/components/tables/tbxface.c b/src/acpica/source/components/tables/tbxface.c
index 860dc2e..b91cce1 100644
--- a/src/acpica/source/components/tables/tbxface.c
+++ b/src/acpica/source/components/tables/tbxface.c
@@ -1,7 +1,6 @@ 
 /******************************************************************************
  *
- * Module Name: tbxface - Public interfaces to the ACPI subsystem
- *                         ACPI table oriented interfaces
+ * Module Name: tbxface - ACPI table oriented external interfaces
  *
  *****************************************************************************/
 
@@ -118,18 +117,11 @@ 
 
 #include "acpi.h"
 #include "accommon.h"
-#include "acnamesp.h"
 #include "actables.h"
 
 #define _COMPONENT          ACPI_TABLES
         ACPI_MODULE_NAME    ("tbxface")
 
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiTbLoadNamespace (
-    void);
-
 
 /*******************************************************************************
  *
@@ -530,155 +522,6 @@  ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex)
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiTbLoadNamespace
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
- *              the RSDT/XSDT.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-AcpiTbLoadNamespace (
-    void)
-{
-    ACPI_STATUS             Status;
-    UINT32                  i;
-    ACPI_TABLE_HEADER       *NewDsdt;
-
-
-    ACPI_FUNCTION_TRACE (TbLoadNamespace);
-
-
-    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
-
-    /*
-     * Load the namespace. The DSDT is required, but any SSDT and
-     * PSDT tables are optional. Verify the DSDT.
-     */
-    if (!AcpiGbl_RootTableList.CurrentTableCount ||
-        !ACPI_COMPARE_NAME (
-            &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
-            ACPI_SIG_DSDT) ||
-         ACPI_FAILURE (AcpiTbVerifyTable (
-            &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
-    {
-        Status = AE_NO_ACPI_TABLES;
-        goto UnlockAndExit;
-    }
-
-    /*
-     * Save the DSDT pointer for simple access. This is the mapped memory
-     * address. We must take care here because the address of the .Tables
-     * array can change dynamically as tables are loaded at run-time. Note:
-     * .Pointer field is not validated until after call to AcpiTbVerifyTable.
-     */
-    AcpiGbl_DSDT = AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer;
-
-    /*
-     * Optionally copy the entire DSDT to local memory (instead of simply
-     * mapping it.) There are some BIOSs that corrupt or replace the original
-     * DSDT, creating the need for this option. Default is FALSE, do not copy
-     * the DSDT.
-     */
-    if (AcpiGbl_CopyDsdtLocally)
-    {
-        NewDsdt = AcpiTbCopyDsdt (ACPI_TABLE_INDEX_DSDT);
-        if (NewDsdt)
-        {
-            AcpiGbl_DSDT = NewDsdt;
-        }
-    }
-
-    /*
-     * Save the original DSDT header for detection of table corruption
-     * and/or replacement of the DSDT from outside the OS.
-     */
-    ACPI_MEMCPY (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
-        sizeof (ACPI_TABLE_HEADER));
-
-    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
-
-    /* Load and parse tables */
-
-    Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
-    if (ACPI_FAILURE (Status))
-    {
-        return_ACPI_STATUS (Status);
-    }
-
-    /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
-
-    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
-    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
-    {
-        if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
-                    ACPI_SIG_SSDT) &&
-             !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
-                    ACPI_SIG_PSDT)) ||
-             ACPI_FAILURE (AcpiTbVerifyTable (
-                &AcpiGbl_RootTableList.Tables[i])))
-        {
-            continue;
-        }
-
-        /* Ignore errors while loading tables, get as many as possible */
-
-        (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
-        (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
-        (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
-    }
-
-    ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
-
-UnlockAndExit:
-    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
-    return_ACPI_STATUS (Status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiLoadTables
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiLoadTables (
-    void)
-{
-    ACPI_STATUS             Status;
-
-
-    ACPI_FUNCTION_TRACE (AcpiLoadTables);
-
-
-    /* Load the namespace from the tables */
-
-    Status = AcpiTbLoadNamespace ();
-    if (ACPI_FAILURE (Status))
-    {
-        ACPI_EXCEPTION ((AE_INFO, Status,
-            "While loading namespace from ACPI tables"));
-    }
-
-    return_ACPI_STATUS (Status);
-}
-
-ACPI_EXPORT_SYMBOL (AcpiLoadTables)
-
-
-/*******************************************************************************
- *
  * FUNCTION:    AcpiInstallTableHandler
  *
  * PARAMETERS:  Handler         - Table event handler
diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
index e85c1fd..d00db5f 100644
--- a/src/acpica/source/components/tables/tbxfroot.c
+++ b/src/acpica/source/components/tables/tbxfroot.c
@@ -306,7 +306,7 @@  AcpiFindRootPointer (
 
     /* A valid RSDP was not found */
 
-    ACPI_ERROR ((AE_INFO, "A valid RSDP was not found"));
+    ACPI_BIOS_ERROR ((AE_INFO, "A valid RSDP was not found"));
     return_ACPI_STATUS (AE_NOT_FOUND);
 }
 
diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c
index b36aa45..a88c581 100644
--- a/src/acpica/source/components/utilities/utdecode.c
+++ b/src/acpica/source/components/utilities/utdecode.c
@@ -123,47 +123,6 @@ 
         ACPI_MODULE_NAME    ("utdecode")
 
 
-/*******************************************************************************
- *
- * FUNCTION:    AcpiFormatException
- *
- * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
- *
- * RETURN:      A string containing the exception text. A valid pointer is
- *              always returned.
- *
- * DESCRIPTION: This function translates an ACPI exception into an ASCII string
- *              It is here instead of utxface.c so it is always present.
- *
- ******************************************************************************/
-
-const char *
-AcpiFormatException (
-    ACPI_STATUS             Status)
-{
-    const char              *Exception = NULL;
-
-
-    ACPI_FUNCTION_ENTRY ();
-
-
-    Exception = AcpiUtValidateException (Status);
-    if (!Exception)
-    {
-        /* Exception code was not recognized */
-
-        ACPI_ERROR ((AE_INFO,
-            "Unknown exception code: 0x%8.8X", Status));
-
-        Exception = "UNKNOWN_STATUS_CODE";
-    }
-
-    return (ACPI_CAST_PTR (const char, Exception));
-}
-
-ACPI_EXPORT_SYMBOL (AcpiFormatException)
-
-
 /*
  * Properties of the ACPI Object Types, both internal and external.
  * The table is indexed by values of ACPI_OBJECT_TYPE
@@ -252,16 +211,17 @@  AcpiUtHexToAsciiChar (
 
 const char        *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
 {
-    "SystemMemory",
-    "SystemIO",
-    "PCI_Config",
-    "EmbeddedControl",
-    "SMBus",
-    "SystemCMOS",
-    "PCIBARTarget",
-    "IPMI",
-    "GeneralPurposeIo",
-    "GenericSerialBus"
+    "SystemMemory",     /* 0x00 */
+    "SystemIO",         /* 0x01 */
+    "PCI_Config",       /* 0x02 */
+    "EmbeddedControl",  /* 0x03 */
+    "SMBus",            /* 0x04 */
+    "SystemCMOS",       /* 0x05 */
+    "PCIBARTarget",     /* 0x06 */
+    "IPMI",             /* 0x07 */
+    "GeneralPurposeIo", /* 0x08 */
+    "GenericSerialBus", /* 0x09 */
+    "PCC"               /* 0x0A */
 };
 
 
diff --git a/src/acpica/source/components/utilities/utdelete.c b/src/acpica/source/components/utilities/utdelete.c
index 3130e6d..b64a585 100644
--- a/src/acpica/source/components/utilities/utdelete.c
+++ b/src/acpica/source/components/utilities/utdelete.c
@@ -239,7 +239,7 @@  AcpiUtDeleteInternalObj (
     case ACPI_TYPE_PROCESSOR:
     case ACPI_TYPE_THERMAL:
 
-        /* Walk the notify handler list for this object */
+        /* Walk the address handler list for this object */
 
         HandlerDesc = Object->CommonNotify.Handler;
         while (HandlerDesc)
@@ -595,6 +595,7 @@  AcpiUtUpdateObjectReference (
     ACPI_STATUS             Status = AE_OK;
     ACPI_GENERIC_STATE      *StateList = NULL;
     ACPI_OPERAND_OBJECT     *NextObject = NULL;
+    ACPI_OPERAND_OBJECT     *PrevObject;
     ACPI_GENERIC_STATE      *State;
     UINT32                  i;
 
@@ -624,10 +625,20 @@  AcpiUtUpdateObjectReference (
         case ACPI_TYPE_POWER:
         case ACPI_TYPE_THERMAL:
 
-            /* Update the notify objects for these types (if present) */
-
-            AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
-            AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
+            /*
+             * Update the notify objects for these types (if present)
+             * Two lists, system and device notify handlers.
+             */
+            for (i = 0; i < ACPI_NUM_NOTIFY_TYPES; i++)
+            {
+                PrevObject = Object->CommonNotify.NotifyList[i];
+                while (PrevObject)
+                {
+                    NextObject = PrevObject->Notify.Next[i];
+                    AcpiUtUpdateRefCount (PrevObject, Action);
+                    PrevObject = NextObject;
+                }
+            }
             break;
 
         case ACPI_TYPE_PACKAGE:
diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
index 8ebbaec..98b1e48 100644
--- a/src/acpica/source/components/utilities/utglobal.c
+++ b/src/acpica/source/components/utilities/utglobal.c
@@ -283,8 +283,9 @@  ACPI_FIXED_EVENT_INFO       AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Init ACPICA globals.  All globals that require specific
- *              initialization should be initialized here!
+ * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
+ *              initialization should be initialized here. This allows for
+ *              a warm restart.
  *
  ******************************************************************************/
 
@@ -359,8 +360,8 @@  AcpiUtInitGlobals (
 
     /* Global handlers */
 
-    AcpiGbl_SystemNotify.Handler        = NULL;
-    AcpiGbl_DeviceNotify.Handler        = NULL;
+    AcpiGbl_GlobalNotify[0].Handler     = NULL;
+    AcpiGbl_GlobalNotify[1].Handler     = NULL;
     AcpiGbl_ExceptionHandler            = NULL;
     AcpiGbl_InitHandler                 = NULL;
     AcpiGbl_TableHandler                = NULL;
diff --git a/src/acpica/source/components/utilities/utmisc.c b/src/acpica/source/components/utilities/utmisc.c
index 44dd533..7318f68 100644
--- a/src/acpica/source/components/utilities/utmisc.c
+++ b/src/acpica/source/components/utilities/utmisc.c
@@ -125,84 +125,41 @@ 
         ACPI_MODULE_NAME    ("utmisc")
 
 
+#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
 /*******************************************************************************
  *
- * FUNCTION:    AcpiUtValidateException
+ * FUNCTION:    UtConvertBackslashes
  *
- * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
+ * PARAMETERS:  Pathname        - File pathname string to be converted
  *
- * RETURN:      A string containing the exception text. NULL if exception is
- *              not valid.
+ * RETURN:      Modifies the input Pathname
  *
- * DESCRIPTION: This function validates and translates an ACPI exception into
- *              an ASCII string.
+ * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
+ *              the entire input file pathname string.
  *
  ******************************************************************************/
 
-const char *
-AcpiUtValidateException (
-    ACPI_STATUS             Status)
+void
+UtConvertBackslashes (
+    char                    *Pathname)
 {
-    UINT32                  SubStatus;
-    const char              *Exception = NULL;
-
-
-    ACPI_FUNCTION_ENTRY ();
-
 
-    /*
-     * Status is composed of two parts, a "type" and an actual code
-     */
-    SubStatus = (Status & ~AE_CODE_MASK);
-
-    switch (Status & AE_CODE_MASK)
+    if (!Pathname)
     {
-    case AE_CODE_ENVIRONMENTAL:
-
-        if (SubStatus <= AE_CODE_ENV_MAX)
-        {
-            Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
-        }
-        break;
-
-    case AE_CODE_PROGRAMMER:
-
-        if (SubStatus <= AE_CODE_PGM_MAX)
-        {
-            Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus];
-        }
-        break;
-
-    case AE_CODE_ACPI_TABLES:
-
-        if (SubStatus <= AE_CODE_TBL_MAX)
-        {
-            Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus];
-        }
-        break;
-
-    case AE_CODE_AML:
-
-        if (SubStatus <= AE_CODE_AML_MAX)
-        {
-            Exception = AcpiGbl_ExceptionNames_Aml [SubStatus];
-        }
-        break;
-
-    case AE_CODE_CONTROL:
+        return;
+    }
 
-        if (SubStatus <= AE_CODE_CTRL_MAX)
+    while (*Pathname)
+    {
+        if (*Pathname == '\\')
         {
-            Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus];
+            *Pathname = '/';
         }
-        break;
 
-    default:
-        break;
+        Pathname++;
     }
-
-    return (ACPI_CAST_PTR (const char, Exception));
 }
+#endif
 
 
 /*******************************************************************************
@@ -1367,5 +1324,3 @@  AcpiUtWalkPackageTree (
 
     return_ACPI_STATUS (AE_AML_INTERNAL);
 }
-
-
diff --git a/src/acpica/source/components/utilities/utobject.c b/src/acpica/source/components/utilities/utobject.c
index ade2980..4914159 100644
--- a/src/acpica/source/components/utilities/utobject.c
+++ b/src/acpica/source/components/utilities/utobject.c
@@ -438,7 +438,7 @@  AcpiUtCreateStringObject (
  *
  * RETURN:      TRUE if object is valid, FALSE otherwise
  *
- * DESCRIPTION: Validate a pointer to be an ACPI_OPERAND_OBJECT
+ * DESCRIPTION: Validate a pointer to be of type ACPI_OPERAND_OBJECT
  *
  ******************************************************************************/
 
@@ -464,7 +464,7 @@  AcpiUtValidInternalObject (
     {
     case ACPI_DESC_TYPE_OPERAND:
 
-        /* The object appears to be a valid ACPI_OPERAND_OBJECT  */
+        /* The object appears to be a valid ACPI_OPERAND_OBJECT */
 
         return (TRUE);
 
@@ -545,7 +545,7 @@  AcpiUtDeleteObjectDesc (
     ACPI_FUNCTION_TRACE_PTR (UtDeleteObjectDesc, Object);
 
 
-    /* Object must be an ACPI_OPERAND_OBJECT  */
+    /* Object must be of type ACPI_OPERAND_OBJECT */
 
     if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
     {
diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
index 69df740..3835b47 100644
--- a/src/acpica/source/components/utilities/utresrc.c
+++ b/src/acpica/source/components/utilities/utresrc.c
@@ -1,6 +1,6 @@ 
 /*******************************************************************************
  *
- * Module Name: utresrc - Resource managment utilities
+ * Module Name: utresrc - Resource management utilities
  *
  ******************************************************************************/
 
@@ -129,7 +129,7 @@ 
 
 /*
  * Strings used to decode resource descriptors.
- * Used by both the disasssembler and the debugger resource dump routines
+ * Used by both the disassembler and the debugger resource dump routines
  */
 const char                      *AcpiGbl_BmDecode[] =
 {
diff --git a/src/acpica/source/components/utilities/uttrack.c b/src/acpica/source/components/utilities/uttrack.c
index 7f2311a..3d73fc5 100644
--- a/src/acpica/source/components/utilities/uttrack.c
+++ b/src/acpica/source/components/utilities/uttrack.c
@@ -705,21 +705,21 @@  AcpiUtDumpAllocations (
                     switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor))
                     {
                     case ACPI_DESC_TYPE_OPERAND:
-                        if (Element->Size == sizeof (ACPI_DESC_TYPE_OPERAND))
+                        if (Element->Size == sizeof (ACPI_OPERAND_OBJECT))
                         {
                             DescriptorType = ACPI_DESC_TYPE_OPERAND;
                         }
                         break;
 
                     case ACPI_DESC_TYPE_PARSER:
-                        if (Element->Size == sizeof (ACPI_DESC_TYPE_PARSER))
+                        if (Element->Size == sizeof (ACPI_PARSE_OBJECT))
                         {
                             DescriptorType = ACPI_DESC_TYPE_PARSER;
                         }
                         break;
 
                     case ACPI_DESC_TYPE_NAMED:
-                        if (Element->Size == sizeof (ACPI_DESC_TYPE_NAMED))
+                        if (Element->Size == sizeof (ACPI_NAMESPACE_NODE))
                         {
                             DescriptorType = ACPI_DESC_TYPE_NAMED;
                         }
diff --git a/src/acpica/source/components/utilities/utxferror.c b/src/acpica/source/components/utilities/utxferror.c
index 8a98a89..c0961a2 100644
--- a/src/acpica/source/components/utilities/utxferror.c
+++ b/src/acpica/source/components/utilities/utxferror.c
@@ -159,6 +159,9 @@  extern FILE                 *AcpiGbl_OutputFile;
 #define ACPI_MSG_WARNING        "ACPI Warning: "
 #define ACPI_MSG_INFO           "ACPI: "
 
+#define ACPI_MSG_BIOS_ERROR     "ACPI Firmware Error: "
+#define ACPI_MSG_BIOS_WARNING   "ACPI Firmware Warning: "
+
 /*
  * Common message suffix
  */
@@ -324,6 +327,84 @@  AcpiInfo (
 ACPI_EXPORT_SYMBOL (AcpiInfo)
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiBiosError
+ *
+ * PARAMETERS:  ModuleName          - Caller's module name (for error output)
+ *              LineNumber          - Caller's line number (for error output)
+ *              Format              - Printf format string + additional args
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Print "ACPI Firmware Error" message with module/line/version
+ *              info
+ *
+ ******************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiBiosError (
+    const char              *ModuleName,
+    UINT32                  LineNumber,
+    const char              *Format,
+    ...)
+{
+    va_list                 ArgList;
+
+
+    ACPI_MSG_REDIRECT_BEGIN;
+    AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
+
+    va_start (ArgList, Format);
+    AcpiOsVprintf (Format, ArgList);
+    ACPI_MSG_SUFFIX;
+    va_end (ArgList);
+
+    ACPI_MSG_REDIRECT_END;
+}
+
+ACPI_EXPORT_SYMBOL (AcpiBiosError)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiBiosWarning
+ *
+ * PARAMETERS:  ModuleName          - Caller's module name (for error output)
+ *              LineNumber          - Caller's line number (for error output)
+ *              Format              - Printf format string + additional args
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Print "ACPI Firmware Warning" message with module/line/version
+ *              info
+ *
+ ******************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiBiosWarning (
+    const char              *ModuleName,
+    UINT32                  LineNumber,
+    const char              *Format,
+    ...)
+{
+    va_list                 ArgList;
+
+
+    ACPI_MSG_REDIRECT_BEGIN;
+    AcpiOsPrintf (ACPI_MSG_BIOS_WARNING);
+
+    va_start (ArgList, Format);
+    AcpiOsVprintf (Format, ArgList);
+    ACPI_MSG_SUFFIX;
+    va_end (ArgList);
+
+    ACPI_MSG_REDIRECT_END;
+}
+
+ACPI_EXPORT_SYMBOL (AcpiBiosWarning)
+
+
 /*
  * The remainder of this module contains internal error functions that may
  * be configured out.
diff --git a/src/acpica/source/include/acdebug.h b/src/acpica/source/include/acdebug.h
index 4a9ecf0..45cfb26 100644
--- a/src/acpica/source/include/acdebug.h
+++ b/src/acpica/source/include/acdebug.h
@@ -184,8 +184,7 @@  AcpiDbDisplayTemplate (
 
 void
 AcpiDbUnloadAcpiTable (
-    char                    *TableArg,
-    char                    *InstanceArg);
+    char                    *Name);
 
 void
 AcpiDbSendNotify (
@@ -477,7 +476,7 @@  AcpiDbLocalNsLookup (
     char                    *Name);
 
 void
-AcpiDbUInt32ToHexString (
+AcpiDbUint32ToHexString (
     UINT32                  Value,
     char                    *Buffer);
 
diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
index 9e8f2e3..056e8ea 100644
--- a/src/acpica/source/include/acdisasm.h
+++ b/src/acpica/source/include/acdisasm.h
@@ -591,6 +591,14 @@  AcpiDmMethodFlags (
     ACPI_PARSE_OBJECT       *Op);
 
 void
+AcpiDmPredefinedDescription (
+    ACPI_PARSE_OBJECT       *Op);
+
+void
+AcpiDmFieldPredefinedDescription (
+    ACPI_PARSE_OBJECT       *Op);
+
+void
 AcpiDmFieldFlags (
     ACPI_PARSE_OBJECT       *Op);
 
diff --git a/src/acpica/source/include/acexcep.h b/src/acpica/source/include/acexcep.h
index 7129954..ccc6f71 100644
--- a/src/acpica/source/include/acexcep.h
+++ b/src/acpica/source/include/acexcep.h
@@ -125,6 +125,7 @@ 
 #define AE_CODE_ACPI_TABLES             0x2000
 #define AE_CODE_AML                     0x3000
 #define AE_CODE_CONTROL                 0x4000
+#define AE_CODE_MAX                     0x4000
 #define AE_CODE_MASK                    0xF000
 
 
@@ -260,7 +261,7 @@ 
 
 /* Exception strings for AcpiFormatException */
 
-#ifdef DEFINE_ACPI_GLOBALS
+#ifdef ACPI_DEFINE_EXCEPTION_TABLE
 
 /*
  * String versions of the exception codes above
@@ -379,6 +380,6 @@  char const   *AcpiGbl_ExceptionNames_Ctrl[] =
     "AE_CTRL_PARSE_PENDING"
 };
 
-#endif /* ACPI GLOBALS */
+#endif /* EXCEPTION_TABLE */
 
 #endif /* __ACEXCEP_H__ */
diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
index b27ee3a..b96b658 100644
--- a/src/acpica/source/include/acglobal.h
+++ b/src/acpica/source/include/acglobal.h
@@ -326,8 +326,7 @@  ACPI_EXTERN ACPI_CACHE_T               *AcpiGbl_OperandCache;
 
 /* Global handlers */
 
-ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  AcpiGbl_DeviceNotify;
-ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  AcpiGbl_SystemNotify;
+ACPI_EXTERN ACPI_GLOBAL_NOTIFY_HANDLER  AcpiGbl_GlobalNotify[2];
 ACPI_EXTERN ACPI_EXCEPTION_HANDLER      AcpiGbl_ExceptionHandler;
 ACPI_EXTERN ACPI_INIT_HANDLER           AcpiGbl_InitHandler;
 ACPI_EXTERN ACPI_TABLE_HANDLER          AcpiGbl_TableHandler;
@@ -360,17 +359,8 @@  ACPI_EXTERN UINT8                       AcpiGbl_OsiData;
 ACPI_EXTERN ACPI_INTERFACE_INFO        *AcpiGbl_SupportedInterfaces;
 ACPI_EXTERN ACPI_ADDRESS_RANGE         *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
 
-
 #ifndef DEFINE_ACPI_GLOBALS
 
-/* Exception codes */
-
-extern char const                       *AcpiGbl_ExceptionNames_Env[];
-extern char const                       *AcpiGbl_ExceptionNames_Pgm[];
-extern char const                       *AcpiGbl_ExceptionNames_Tbl[];
-extern char const                       *AcpiGbl_ExceptionNames_Aml[];
-extern char const                       *AcpiGbl_ExceptionNames_Ctrl[];
-
 /* Other miscellaneous */
 
 extern BOOLEAN                          AcpiGbl_Shutdown;
@@ -552,4 +542,14 @@  ACPI_EXTERN UINT32                      AcpiGbl_SizeOfAcpiObjects;
 
 #endif /* ACPI_DEBUGGER */
 
+
+/*****************************************************************************
+ *
+ * Info/help support
+ *
+ ****************************************************************************/
+
+extern const AH_PREDEFINED_NAME     AslPredefinedInfo[];
+
+
 #endif /* __ACGLOBAL_H__ */
diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
index f9065af..00d933e 100644
--- a/src/acpica/source/include/aclocal.h
+++ b/src/acpica/source/include/aclocal.h
@@ -534,6 +534,15 @@  typedef struct acpi_gpe_handler_info
 
 } ACPI_GPE_HANDLER_INFO;
 
+/* Notify info for implicit notify, multiple device objects */
+
+typedef struct acpi_gpe_notify_info
+{
+    ACPI_NAMESPACE_NODE             *DeviceNode;    /* Device to be notified */
+    struct acpi_gpe_notify_info     *Next;
+
+} ACPI_GPE_NOTIFY_INFO;
+
 /*
  * GPE dispatch info. At any time, the GPE can have at most one type
  * of dispatch - Method, Handler, or Implicit Notify.
@@ -541,8 +550,8 @@  typedef struct acpi_gpe_handler_info
 typedef union acpi_gpe_dispatch_info
 {
     ACPI_NAMESPACE_NODE             *MethodNode;    /* Method node for this GPE level */
-    struct acpi_gpe_handler_info    *Handler;       /* Installed GPE handler */
-    ACPI_NAMESPACE_NODE             *DeviceNode;    /* Parent _PRW device for implicit notify */
+    ACPI_GPE_HANDLER_INFO           *Handler;       /* Installed GPE handler */
+    ACPI_GPE_NOTIFY_INFO            *NotifyList;    /* List of _PRW devices for implicit notifies */
 
 } ACPI_GPE_DISPATCH_INFO;
 
@@ -552,7 +561,7 @@  typedef union acpi_gpe_dispatch_info
  */
 typedef struct acpi_gpe_event_info
 {
-    union acpi_gpe_dispatch_info    Dispatch;       /* Either Method or Handler */
+    union acpi_gpe_dispatch_info    Dispatch;       /* Either Method, Handler, or NotifyList */
     struct acpi_gpe_register_info   *RegisterInfo;  /* Backpointer to register info */
     UINT8                           Flags;          /* Misc info about this GPE */
     UINT8                           GpeNumber;      /* This GPE */
@@ -788,6 +797,15 @@  ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
     struct acpi_walk_state          *WalkState);
 
 
+/* Global handlers for AML Notifies */
+
+typedef struct acpi_global_notify_handler
+{
+    ACPI_NOTIFY_HANDLER             Handler;
+    void                            *Context;
+
+} ACPI_GLOBAL_NOTIFY_HANDLER;
+
 /*
  * Notify info - used to pass info to the deferred notify
  * handler/dispatcher.
@@ -795,8 +813,10 @@  ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
 typedef struct acpi_notify_info
 {
     ACPI_STATE_COMMON
+    UINT8                           HandlerListId;
     ACPI_NAMESPACE_NODE             *Node;
-    union acpi_operand_object       *HandlerObj;
+    union acpi_operand_object       *HandlerListHead;
+    ACPI_GLOBAL_NOTIFY_HANDLER      *Global;
 
 } ACPI_NOTIFY_INFO;
 
@@ -1021,6 +1041,7 @@  typedef struct acpi_parse_state
 #define ACPI_PARSEOP_IGNORE             0x01
 #define ACPI_PARSEOP_PARAMLIST          0x02
 #define ACPI_PARSEOP_EMPTY_TERMLIST     0x04
+#define ACPI_PARSEOP_PREDEF_CHECKED     0x08
 #define ACPI_PARSEOP_SPECIAL            0x10
 
 
@@ -1372,4 +1393,20 @@  typedef struct acpi_debug_mem_block
 #define ACPI_NUM_MEM_LISTS              2
 
 
+/*****************************************************************************
+ *
+ * Info/help support
+ *
+ ****************************************************************************/
+
+typedef struct ah_predefined_name
+{
+    char            *Name;
+    char            *Description;
+#ifndef ACPI_ASL_COMPILER
+    char            *Action;
+#endif
+
+} AH_PREDEFINED_NAME;
+
 #endif /* __ACLOCAL_H__ */
diff --git a/src/acpica/source/include/acmacros.h b/src/acpica/source/include/acmacros.h
index 5451d84..3cf0ac0 100644
--- a/src/acpica/source/include/acmacros.h
+++ b/src/acpica/source/include/acmacros.h
@@ -346,8 +346,8 @@ 
 #define ACPI_INSERT_BITS(Target, Mask, Source)          Target = ((Target & (~(Mask))) | (Source & Mask))
 
 /*
- * An ACPI_NAMESPACE_NODE can appear in some contexts
- * where a pointer to an ACPI_OPERAND_OBJECT can also
+ * An object of type ACPI_NAMESPACE_NODE can appear in some contexts
+ * where a pointer to an object of type ACPI_OPERAND_OBJECT can also
  * appear. This macro is used to distinguish them.
  *
  * The "Descriptor" field is the first field in both structures.
diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
index 009232a..9014d4f 100644
--- a/src/acpica/source/include/acobject.h
+++ b/src/acpica/source/include/acobject.h
@@ -166,7 +166,7 @@ 
 
 #define AOPOBJ_AML_CONSTANT         0x01    /* Integer is an AML constant */
 #define AOPOBJ_STATIC_POINTER       0x02    /* Data is part of an ACPI table, don't delete */
-#define AOPOBJ_DATA_VALID           0x04    /* Object is intialized and data is valid */
+#define AOPOBJ_DATA_VALID           0x04    /* Object is initialized and data is valid */
 #define AOPOBJ_OBJECT_INITIALIZED   0x08    /* Region is initialized, _REG was run */
 #define AOPOBJ_SETUP_COMPLETE       0x10    /* Region setup is complete */
 #define AOPOBJ_INVALID              0x20    /* Host OS won't allow a Region address */
@@ -195,8 +195,8 @@  typedef struct acpi_object_integer
 
 
 /*
- * Note: The String and Buffer object must be identical through the Pointer
- * and length elements.  There is code that depends on this.
+ * Note: The String and Buffer object must be identical through the
+ * pointer and length elements. There is code that depends on this.
  *
  * Fields common to both Strings and Buffers
  */
@@ -318,8 +318,7 @@  typedef struct acpi_object_method
  * Common fields for objects that support ASL notifications
  */
 #define ACPI_COMMON_NOTIFY_INFO \
-    union acpi_operand_object       *SystemNotify;      /* Handler for system notifies */\
-    union acpi_operand_object       *DeviceNotify;      /* Handler for driver notifies */\
+    union acpi_operand_object       *NotifyList[2];     /* Handlers for system/device notifies */\
     union acpi_operand_object       *Handler;           /* Handler for Address space */
 
 
@@ -461,8 +460,10 @@  typedef struct acpi_object_notify_handler
 {
     ACPI_OBJECT_COMMON_HEADER
     ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
-    ACPI_NOTIFY_HANDLER             Handler;
+    UINT32                          HandlerType;        /* Type: Device/System/Both */
+    ACPI_NOTIFY_HANDLER             Handler;            /* Handler address */
     void                            *Context;
+    union acpi_operand_object       *Next[2];           /* Device and System handler lists */
 
 } ACPI_OBJECT_NOTIFY_HANDLER;
 
@@ -476,7 +477,7 @@  typedef struct acpi_object_addr_handler
     ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
     void                            *Context;
     ACPI_ADR_SPACE_SETUP            Setup;
-    union acpi_operand_object       *RegionList;        /* regions using this handler */
+    union acpi_operand_object       *RegionList;        /* Regions using this handler */
     union acpi_operand_object       *Next;
 
 } ACPI_OBJECT_ADDR_HANDLER;
diff --git a/src/acpica/source/include/acoutput.h b/src/acpica/source/include/acoutput.h
index 12f7851..cbdbd8f 100644
--- a/src/acpica/source/include/acoutput.h
+++ b/src/acpica/source/include/acoutput.h
@@ -289,6 +289,8 @@ 
 #define ACPI_WARNING(plist)             AcpiWarning plist
 #define ACPI_EXCEPTION(plist)           AcpiException plist
 #define ACPI_ERROR(plist)               AcpiError plist
+#define ACPI_BIOS_WARNING(plist)        AcpiBiosWarning plist
+#define ACPI_BIOS_ERROR(plist)          AcpiBiosError plist
 #define ACPI_DEBUG_OBJECT(obj,l,i)      AcpiExDoDebugObject(obj,l,i)
 
 #else
@@ -299,6 +301,8 @@ 
 #define ACPI_WARNING(plist)
 #define ACPI_EXCEPTION(plist)
 #define ACPI_ERROR(plist)
+#define ACPI_BIOS_WARNING(plist)
+#define ACPI_BIOS_ERROR(plist)
 #define ACPI_DEBUG_OBJECT(obj,l,i)
 
 #endif /* ACPI_NO_ERROR_MESSAGES */
diff --git a/src/acpica/source/include/acpiosxf.h b/src/acpica/source/include/acpiosxf.h
index d6d205f..48d8aa4 100644
--- a/src/acpica/source/include/acpiosxf.h
+++ b/src/acpica/source/include/acpiosxf.h
@@ -348,7 +348,7 @@  AcpiOsExecute (
 
 void
 AcpiOsWaitEventsComplete (
-    void                    *Context);
+    void);
 
 void
 AcpiOsSleep (
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 2d4a5f8..036d817 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -120,7 +120,7 @@ 
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20120320
+#define ACPI_CA_VERSION                 0x20120711
 
 #include "acconfig.h"
 #include &qu