diff mbox

[1/3] ACPICA: Update to version 20170531

Message ID 20170601103735.4857-2-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King June 1, 2017, 10:37 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

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

https://lists.acpica.org/pipermail/devel/2017-May/001186.html

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/acpica/Makefile.am                             |   2 +
 src/acpica/source/common/acfileio.c                |   2 -
 src/acpica/source/common/adfile.c                  |  10 -
 src/acpica/source/common/adisasm.c                 |   8 +-
 src/acpica/source/common/adwalk.c                  | 105 ++-
 src/acpica/source/common/ahids.c                   |   1 +
 src/acpica/source/common/ahpredef.c                |   6 +
 src/acpica/source/common/ahtable.c                 |   3 +
 src/acpica/source/common/ahuuids.c                 |   4 +
 src/acpica/source/common/dmextern.c                | 520 ++++++++++--
 src/acpica/source/common/dmrestag.c                |  36 +-
 src/acpica/source/common/dmswitch.c                | 679 +++++++++++++++
 src/acpica/source/common/dmtable.c                 |  79 ++
 src/acpica/source/common/dmtbdump.c                | 350 ++++++++
 src/acpica/source/common/dmtbinfo.c                | 325 +++++++-
 src/acpica/source/compiler/Makefile.am             |   1 +
 src/acpica/source/compiler/aslascii.c              |   5 +-
 src/acpica/source/compiler/aslcompile.c            |   2 +-
 src/acpica/source/compiler/aslcompiler.h           |  20 +
 src/acpica/source/compiler/aslcompiler.l           |   5 +
 src/acpica/source/compiler/asldefine.h             |   4 +-
 src/acpica/source/compiler/aslexternal.c           |  11 +-
 src/acpica/source/compiler/aslglobal.h             |   1 -
 src/acpica/source/compiler/aslhelpers.y            |   9 +
 src/acpica/source/compiler/aslload.c               |  90 +-
 src/acpica/source/compiler/aslmain.c               |  41 +-
 src/acpica/source/compiler/aslmap.c                |   5 +
 src/acpica/source/compiler/asloffset.c             |   1 -
 src/acpica/source/compiler/aslparser.y             |   2 +-
 src/acpica/source/compiler/aslresource.c           |  25 +
 src/acpica/source/compiler/aslresources.y          |  94 +++
 src/acpica/source/compiler/aslrestype2s.c          | 917 ++++++++++++++++++++-
 src/acpica/source/compiler/aslrules.y              |  16 +-
 src/acpica/source/compiler/aslstartup.c            |  11 +-
 src/acpica/source/compiler/aslsupport.l            |  15 +-
 src/acpica/source/compiler/asltokens.y             |   5 +
 src/acpica/source/compiler/asltree.c               |  19 +-
 src/acpica/source/compiler/asltypes.y              |   6 +
 src/acpica/source/compiler/aslutils.c              |   6 +-
 src/acpica/source/compiler/aslxref.c               |   9 +-
 src/acpica/source/compiler/cvcompiler.c            |  53 +-
 src/acpica/source/compiler/cvdisasm.c              |  16 +-
 src/acpica/source/compiler/cvparser.c              |   7 +-
 src/acpica/source/compiler/dtcompiler.h            |  11 +
 src/acpica/source/compiler/dtfield.c               |  30 +
 src/acpica/source/compiler/dttable1.c              | 228 +++++
 src/acpica/source/compiler/dttable2.c              | 134 +++
 src/acpica/source/compiler/dttemplate.h            | 175 +++-
 src/acpica/source/compiler/dtutils.c               |  12 +
 src/acpica/source/compiler/fwts_iasl_interface.c   |   4 +-
 src/acpica/source/components/debugger/dbexec.c     |  12 +
 src/acpica/source/components/debugger/dbobject.c   |   6 +-
 src/acpica/source/components/debugger/dbxface.c    |   2 +-
 .../source/components/disassembler/dmbuffer.c      |   4 +-
 .../source/components/disassembler/dmdeferred.c    |   6 +-
 .../source/components/disassembler/dmopcode.c      | 424 +---------
 .../source/components/disassembler/dmresrc.c       |  17 +-
 .../source/components/disassembler/dmresrcl2.c     | 466 +++++++++++
 src/acpica/source/components/disassembler/dmwalk.c |  25 +-
 src/acpica/source/components/dispatcher/dsargs.c   |   5 +-
 src/acpica/source/components/dispatcher/dsdebug.c  |   1 +
 src/acpica/source/components/dispatcher/dsmethod.c |  14 +-
 src/acpica/source/components/dispatcher/dsopcode.c |   7 +-
 src/acpica/source/components/dispatcher/dsutils.c  |   6 -
 src/acpica/source/components/dispatcher/dswexec.c  |   3 +-
 src/acpica/source/components/dispatcher/dswload.c  |  38 +-
 src/acpica/source/components/dispatcher/dswload2.c |  18 +
 src/acpica/source/components/events/evxfevnt.c     |  21 +
 src/acpica/source/components/executer/exdebug.c    |   4 +-
 src/acpica/source/components/executer/exdump.c     |  27 +-
 src/acpica/source/components/executer/exoparg1.c   |  26 +-
 src/acpica/source/components/executer/exresolv.c   |  24 +-
 src/acpica/source/components/namespace/nsaccess.c  |  27 +
 src/acpica/source/components/namespace/nsnames.c   |   4 -
 src/acpica/source/components/namespace/nsutils.c   |   2 +-
 src/acpica/source/components/namespace/nsxfeval.c  |  41 +-
 src/acpica/source/components/parser/psobject.c     |  15 +
 src/acpica/source/components/parser/psopcode.c     |   2 +-
 src/acpica/source/components/parser/psparse.c      |  14 +-
 src/acpica/source/components/resources/rscalc.c    | 112 +++
 src/acpica/source/components/resources/rsdump.c    |  47 ++
 .../source/components/resources/rsdumpinfo.c       |  68 ++
 src/acpica/source/components/resources/rsinfo.c    |  28 +-
 src/acpica/source/components/resources/rsmisc.c    |   5 +-
 src/acpica/source/components/resources/rsserial.c  | 347 ++++++++
 src/acpica/source/components/tables/tbfadt.c       |   4 +-
 src/acpica/source/components/tables/tbutils.c      |   6 +-
 src/acpica/source/components/utilities/utdecode.c  |   5 +-
 src/acpica/source/components/utilities/utownerid.c |  12 +-
 .../source/components/utilities/utresdecode.c      | 461 +++++++++++
 src/acpica/source/components/utilities/utresrc.c   | 314 +------
 src/acpica/source/include/acapps.h                 |   2 +-
 src/acpica/source/include/acdisasm.h               | 105 ++-
 src/acpica/source/include/acglobal.h               |   3 +
 src/acpica/source/include/aclocal.h                |  17 +-
 src/acpica/source/include/acopcode.h               |   2 +-
 src/acpica/source/include/acpixf.h                 |   2 +-
 src/acpica/source/include/acpredef.h               |  14 +
 src/acpica/source/include/acresrc.h                |  14 +-
 src/acpica/source/include/acrestyp.h               | 103 ++-
 src/acpica/source/include/actbl1.h                 | 292 ++++++-
 src/acpica/source/include/actbl2.h                 |  67 +-
 src/acpica/source/include/actbl3.h                 |  91 +-
 src/acpica/source/include/actypes.h                |  67 +-
 src/acpica/source/include/acutils.h                |   1 +
 src/acpica/source/include/acuuid.h                 |   5 +
 src/acpica/source/include/amlcode.h                |  61 +-
 src/acpica/source/include/amlresrc.h               | 118 +++
 src/acpica/source/include/platform/acgcc.h         |  10 +
 .../source/os_specific/service_layers/osunixxf.c   |  12 +-
 src/acpica/source/tools/acpiexec/aecommon.h        |  12 +-
 src/acpica/source/tools/acpiexec/aeexception.c     | 441 ++++++++++
 src/acpica/source/tools/acpiexec/aehandlers.c      | 214 +----
 113 files changed, 7079 insertions(+), 1364 deletions(-)
 create mode 100644 src/acpica/source/common/dmswitch.c
 create mode 100644 src/acpica/source/components/utilities/utresdecode.c
 create mode 100644 src/acpica/source/tools/acpiexec/aeexception.c

Comments

Alex Hung June 1, 2017, 6:31 p.m. UTC | #1
On 2017-06-01 03:37 AM, Colin King wrote:
> From: Colin Ian King<colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/pipermail/devel/2017-May/001186.html
> 
> Signed-off-by: Colin Ian King<colin.king@canonical.com>

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu June 9, 2017, 9:25 a.m. UTC | #2
On 06/01/2017 06:37 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
> 
> https://lists.acpica.org/pipermail/devel/2017-May/001186.html
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/acpica/Makefile.am                             |   2 +
>   src/acpica/source/common/acfileio.c                |   2 -
>   src/acpica/source/common/adfile.c                  |  10 -
>   src/acpica/source/common/adisasm.c                 |   8 +-
>   src/acpica/source/common/adwalk.c                  | 105 ++-
>   src/acpica/source/common/ahids.c                   |   1 +
>   src/acpica/source/common/ahpredef.c                |   6 +
>   src/acpica/source/common/ahtable.c                 |   3 +
>   src/acpica/source/common/ahuuids.c                 |   4 +
>   src/acpica/source/common/dmextern.c                | 520 ++++++++++--
>   src/acpica/source/common/dmrestag.c                |  36 +-
>   src/acpica/source/common/dmswitch.c                | 679 +++++++++++++++
>   src/acpica/source/common/dmtable.c                 |  79 ++
>   src/acpica/source/common/dmtbdump.c                | 350 ++++++++
>   src/acpica/source/common/dmtbinfo.c                | 325 +++++++-
>   src/acpica/source/compiler/Makefile.am             |   1 +
>   src/acpica/source/compiler/aslascii.c              |   5 +-
>   src/acpica/source/compiler/aslcompile.c            |   2 +-
>   src/acpica/source/compiler/aslcompiler.h           |  20 +
>   src/acpica/source/compiler/aslcompiler.l           |   5 +
>   src/acpica/source/compiler/asldefine.h             |   4 +-
>   src/acpica/source/compiler/aslexternal.c           |  11 +-
>   src/acpica/source/compiler/aslglobal.h             |   1 -
>   src/acpica/source/compiler/aslhelpers.y            |   9 +
>   src/acpica/source/compiler/aslload.c               |  90 +-
>   src/acpica/source/compiler/aslmain.c               |  41 +-
>   src/acpica/source/compiler/aslmap.c                |   5 +
>   src/acpica/source/compiler/asloffset.c             |   1 -
>   src/acpica/source/compiler/aslparser.y             |   2 +-
>   src/acpica/source/compiler/aslresource.c           |  25 +
>   src/acpica/source/compiler/aslresources.y          |  94 +++
>   src/acpica/source/compiler/aslrestype2s.c          | 917 ++++++++++++++++++++-
>   src/acpica/source/compiler/aslrules.y              |  16 +-
>   src/acpica/source/compiler/aslstartup.c            |  11 +-
>   src/acpica/source/compiler/aslsupport.l            |  15 +-
>   src/acpica/source/compiler/asltokens.y             |   5 +
>   src/acpica/source/compiler/asltree.c               |  19 +-
>   src/acpica/source/compiler/asltypes.y              |   6 +
>   src/acpica/source/compiler/aslutils.c              |   6 +-
>   src/acpica/source/compiler/aslxref.c               |   9 +-
>   src/acpica/source/compiler/cvcompiler.c            |  53 +-
>   src/acpica/source/compiler/cvdisasm.c              |  16 +-
>   src/acpica/source/compiler/cvparser.c              |   7 +-
>   src/acpica/source/compiler/dtcompiler.h            |  11 +
>   src/acpica/source/compiler/dtfield.c               |  30 +
>   src/acpica/source/compiler/dttable1.c              | 228 +++++
>   src/acpica/source/compiler/dttable2.c              | 134 +++
>   src/acpica/source/compiler/dttemplate.h            | 175 +++-
>   src/acpica/source/compiler/dtutils.c               |  12 +
>   src/acpica/source/compiler/fwts_iasl_interface.c   |   4 +-
>   src/acpica/source/components/debugger/dbexec.c     |  12 +
>   src/acpica/source/components/debugger/dbobject.c   |   6 +-
>   src/acpica/source/components/debugger/dbxface.c    |   2 +-
>   .../source/components/disassembler/dmbuffer.c      |   4 +-
>   .../source/components/disassembler/dmdeferred.c    |   6 +-
>   .../source/components/disassembler/dmopcode.c      | 424 +---------
>   .../source/components/disassembler/dmresrc.c       |  17 +-
>   .../source/components/disassembler/dmresrcl2.c     | 466 +++++++++++
>   src/acpica/source/components/disassembler/dmwalk.c |  25 +-
>   src/acpica/source/components/dispatcher/dsargs.c   |   5 +-
>   src/acpica/source/components/dispatcher/dsdebug.c  |   1 +
>   src/acpica/source/components/dispatcher/dsmethod.c |  14 +-
>   src/acpica/source/components/dispatcher/dsopcode.c |   7 +-
>   src/acpica/source/components/dispatcher/dsutils.c  |   6 -
>   src/acpica/source/components/dispatcher/dswexec.c  |   3 +-
>   src/acpica/source/components/dispatcher/dswload.c  |  38 +-
>   src/acpica/source/components/dispatcher/dswload2.c |  18 +
>   src/acpica/source/components/events/evxfevnt.c     |  21 +
>   src/acpica/source/components/executer/exdebug.c    |   4 +-
>   src/acpica/source/components/executer/exdump.c     |  27 +-
>   src/acpica/source/components/executer/exoparg1.c   |  26 +-
>   src/acpica/source/components/executer/exresolv.c   |  24 +-
>   src/acpica/source/components/namespace/nsaccess.c  |  27 +
>   src/acpica/source/components/namespace/nsnames.c   |   4 -
>   src/acpica/source/components/namespace/nsutils.c   |   2 +-
>   src/acpica/source/components/namespace/nsxfeval.c  |  41 +-
>   src/acpica/source/components/parser/psobject.c     |  15 +
>   src/acpica/source/components/parser/psopcode.c     |   2 +-
>   src/acpica/source/components/parser/psparse.c      |  14 +-
>   src/acpica/source/components/resources/rscalc.c    | 112 +++
>   src/acpica/source/components/resources/rsdump.c    |  47 ++
>   .../source/components/resources/rsdumpinfo.c       |  68 ++
>   src/acpica/source/components/resources/rsinfo.c    |  28 +-
>   src/acpica/source/components/resources/rsmisc.c    |   5 +-
>   src/acpica/source/components/resources/rsserial.c  | 347 ++++++++
>   src/acpica/source/components/tables/tbfadt.c       |   4 +-
>   src/acpica/source/components/tables/tbutils.c      |   6 +-
>   src/acpica/source/components/utilities/utdecode.c  |   5 +-
>   src/acpica/source/components/utilities/utownerid.c |  12 +-
>   .../source/components/utilities/utresdecode.c      | 461 +++++++++++
>   src/acpica/source/components/utilities/utresrc.c   | 314 +------
>   src/acpica/source/include/acapps.h                 |   2 +-
>   src/acpica/source/include/acdisasm.h               | 105 ++-
>   src/acpica/source/include/acglobal.h               |   3 +
>   src/acpica/source/include/aclocal.h                |  17 +-
>   src/acpica/source/include/acopcode.h               |   2 +-
>   src/acpica/source/include/acpixf.h                 |   2 +-
>   src/acpica/source/include/acpredef.h               |  14 +
>   src/acpica/source/include/acresrc.h                |  14 +-
>   src/acpica/source/include/acrestyp.h               | 103 ++-
>   src/acpica/source/include/actbl1.h                 | 292 ++++++-
>   src/acpica/source/include/actbl2.h                 |  67 +-
>   src/acpica/source/include/actbl3.h                 |  91 +-
>   src/acpica/source/include/actypes.h                |  67 +-
>   src/acpica/source/include/acutils.h                |   1 +
>   src/acpica/source/include/acuuid.h                 |   5 +
>   src/acpica/source/include/amlcode.h                |  61 +-
>   src/acpica/source/include/amlresrc.h               | 118 +++
>   src/acpica/source/include/platform/acgcc.h         |  10 +
>   .../source/os_specific/service_layers/osunixxf.c   |  12 +-
>   src/acpica/source/tools/acpiexec/aecommon.h        |  12 +-
>   src/acpica/source/tools/acpiexec/aeexception.c     | 441 ++++++++++
>   src/acpica/source/tools/acpiexec/aehandlers.c      | 214 +----
>   113 files changed, 7079 insertions(+), 1364 deletions(-)
>   create mode 100644 src/acpica/source/common/dmswitch.c
>   create mode 100644 src/acpica/source/components/utilities/utresdecode.c
>   create mode 100644 src/acpica/source/tools/acpiexec/aeexception.c
> 
> diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
> index 84cb0753..4b7ef1da 100644
> --- a/src/acpica/Makefile.am
> +++ b/src/acpica/Makefile.am
> @@ -248,6 +248,7 @@ libfwtsacpica_la_SOURCES =				\
>   	source/components/utilities/utmutex.c		\
>   	source/components/utilities/utnonansi.c		\
>   	source/components/utilities/utobject.c		\
> +	source/components/utilities/utresdecode.c	\
>   	source/components/utilities/utresrc.c		\
>   	source/components/utilities/utstate.c		\
>   	source/components/utilities/utstrtoul64.c	\
> @@ -272,6 +273,7 @@ libfwtsacpica_la_SOURCES =				\
>   	source/common/ahuuids.c				\
>   	source/tools/acpiexec/aeinitfile.c		\
>   	source/tools/acpiexec/aehandlers.c		\
> +	source/tools/acpiexec/aeexception.c		\
>   	source/tools/acpiexec/aeregion.c		\
>   	source/os_specific/service_layers/osgendbg.c
>   
> diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
> index ecd9f604..a334d541 100644
> --- a/src/acpica/source/common/acfileio.c
> +++ b/src/acpica/source/common/acfileio.c
> @@ -531,8 +531,6 @@ AcValidateTableHeader (
>   
>       if (!AcpiUtValidNameseg (TableHeader.Signature))
>       {
> -        fprintf (stderr, "Invalid table signature: 0x%8.8X\n",
> -            *ACPI_CAST_PTR (UINT32, TableHeader.Signature));
>           return (AE_BAD_SIGNATURE);
>       }
>   
> diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
> index 5fff07d3..ac96156d 100644
> --- a/src/acpica/source/common/adfile.c
> +++ b/src/acpica/source/common/adfile.c
> @@ -316,11 +316,6 @@ FlGenerateFilename (
>        */
>       NewFilename = UtStringCacheCalloc ((ACPI_SIZE)
>           strlen (InputFilename) + strlen (Suffix) + 2);
> -    if (!NewFilename)
> -    {
> -        return (NULL);
> -    }
> -
>       strcpy (NewFilename, InputFilename);
>   
>       /* Try to find the last dot in the filename */
> @@ -364,11 +359,6 @@ FlStrdup (
>   
>   
>       NewString = UtStringCacheCalloc ((ACPI_SIZE) strlen (String) + 1);
> -    if (!NewString)
> -    {
> -        return (NULL);
> -    }
> -
>       strcpy (NewString, String);
>       return (NewString);
>   }
> diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
> index 23260c7f..c0d44cdf 100644
> --- a/src/acpica/source/common/adisasm.c
> +++ b/src/acpica/source/common/adisasm.c
> @@ -537,7 +537,7 @@ AdDisassembleOneTable (
>        * the entire tree with the new information (namely, the
>        * number of arguments per method)
>        */
> -    if (AcpiDmGetExternalMethodCount ())
> +    if (AcpiDmGetUnresolvedExternalMethodCount ())
>       {
>           Status = AdReparseOneTable (Table, File, OwnerId);
>           if (ACPI_FAILURE (Status))
> @@ -553,7 +553,7 @@ AdDisassembleOneTable (
>        * 1) Convert fixed-offset references to resource descriptors
>        *    to symbolic references (Note: modifies namespace)
>        */
> -    AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
> +    AcpiDmConvertParseObjects (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
>   
>       /* Optional displays */
>   
> @@ -616,7 +616,7 @@ AdReparseOneTable (
>       fprintf (stderr,
>           "\nFound %u external control methods, "
>           "reparsing with new information\n",
> -        AcpiDmGetExternalMethodCount ());
> +        AcpiDmGetUnresolvedExternalMethodCount ());
>   
>       /* Reparse, rebuild namespace */
>   
> @@ -642,7 +642,7 @@ AdReparseOneTable (
>   
>       /* New namespace, add the external definitions first */
>   
> -    AcpiDmAddExternalsToNamespace ();
> +    AcpiDmAddExternalListToNamespace ();
>   
>       /* For -ca option: clear the list of comment addresses. */
>   
> diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
> index e1205e3b..887835cb 100644
> --- a/src/acpica/source/common/adwalk.c
> +++ b/src/acpica/source/common/adwalk.c
> @@ -208,11 +208,16 @@ AcpiDmInspectPossibleArgs (
>       ACPI_PARSE_OBJECT       *Op);
>   
>   static ACPI_STATUS
> -AcpiDmResourceDescendingOp (
> +AcpiDmCommonDescendingOp (
>       ACPI_PARSE_OBJECT       *Op,
>       UINT32                  Level,
>       void                    *Context);
>   
> +static ACPI_STATUS
> +AcpiDmProcessResourceDescriptors (
> +    ACPI_PARSE_OBJECT       *Op,
> +    UINT32                  Level,
> +    void                    *Context);
>   
>   /*******************************************************************************
>    *
> @@ -395,21 +400,21 @@ AcpiDmCrossReferenceNamespace (
>   
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiDmConvertResourceIndexes
> + * FUNCTION:    AcpiDmConvertParseObjects
>    *
>    * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
>    *              NamespaceRoot       - Root of the internal namespace
>    *
>    * RETURN:      None
>    *
> - * DESCRIPTION: Convert fixed-offset references to resource descriptors to
> - *              symbolic references. Should only be called after namespace has
> - *              been cross referenced.
> + * DESCRIPTION: Begin parse tree walk to perform conversions needed for
> + *              disassembly. These include resource descriptors and switch/case
> + *              operations.
>    *
>    ******************************************************************************/
>   
>   void
> -AcpiDmConvertResourceIndexes (
> +AcpiDmConvertParseObjects (
>       ACPI_PARSE_OBJECT       *ParseTreeRoot,
>       ACPI_NAMESPACE_NODE     *NamespaceRoot)
>   {
> @@ -443,9 +448,14 @@ AcpiDmConvertResourceIndexes (
>       Info.Level = 0;
>       Info.WalkState = WalkState;
>   
> -    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
> +    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmCommonDescendingOp,
>           AcpiDmCommonAscendingOp, &Info);
>       ACPI_FREE (WalkState);
> +
> +    if (AcpiGbl_TempListHead) {
> +        AcpiDmClearTempList();
> +    }
> +
>       return;
>   }
>   
> @@ -737,7 +747,6 @@ AcpiDmLoadDescendingOp (
>   
>       WalkState = Info->WalkState;
>       OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
> -    ObjectType = OpInfo->ObjectType;
>       ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
>   
>       /* Only interested in operators that create new names */
> @@ -754,7 +763,7 @@ AcpiDmLoadDescendingOp (
>       {
>           /* For all named operators, get the new name */
>   
> -        Path = (char *) Op->Named.Path;
> +        Path = Op->Named.Path;
>   
>           if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
>           {
> @@ -875,7 +884,6 @@ AcpiDmXrefDescendingOp (
>   
>       WalkState = Info->WalkState;
>       OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
> -    ObjectType = OpInfo->ObjectType;
>       ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
>   
>       if ((!(OpInfo->Flags & AML_NAMED)) &&
> @@ -885,25 +893,6 @@ AcpiDmXrefDescendingOp (
>       {
>           goto Exit;
>       }
> -    else if (Op->Common.Parent &&
> -             Op->Common.Parent->Common.AmlOpcode == AML_EXTERNAL_OP)
> -    {
> -        /* External() NamePath */
> -
> -        Path = Op->Common.Value.String;
> -        ObjectType = (ACPI_OBJECT_TYPE) Op->Common.Next->Common.Value.Integer;
> -        if (ObjectType == ACPI_TYPE_METHOD)
> -        {
> -            ParamCount = (UINT32)
> -                Op->Common.Next->Common.Next->Common.Value.Integer;
> -        }
> -
> -        Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE;
> -        AcpiDmAddOpToExternalList (Op, Path,
> -            (UINT8) ObjectType, ParamCount, Flags);
> -
> -        goto Exit;
> -    }
>   
>       /* Get the NamePath from the appropriate place */
>   
> @@ -924,9 +913,10 @@ AcpiDmXrefDescendingOp (
>                   Path = NextOp->Common.Value.String;
>               }
>           }
> -        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
> +        else if (Op->Common.AmlOpcode == AML_SCOPE_OP ||
> +                 Op->Common.AmlOpcode == AML_EXTERNAL_OP)
>           {
> -            Path = (char *) Op->Named.Path;
> +            Path = Op->Named.Path;
>           }
>       }
>       else if (OpInfo->Flags & AML_CREATE)
> @@ -1060,21 +1050,59 @@ Exit:
>       return (AE_OK);
>   }
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmCommonDescendingOp
> + *
> + * PARAMETERS:  ASL_WALK_CALLBACK
> + *
> + * RETURN:      ACPI_STATUS
> + *
> + * DESCRIPTION: Perform parse tree preprocessing before main disassembly walk.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDmCommonDescendingOp (
> +    ACPI_PARSE_OBJECT       *Op,
> +    UINT32                  Level,
> +    void                    *Context)
> +{
> +    ACPI_STATUS             Status;
> +
> +    /* Resource descriptor conversion */
> +
> +    Status = AcpiDmProcessResourceDescriptors (Op, Level, Context);
> +
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +
> +    /* Switch/Case conversion */
> +
> +    Status = AcpiDmProcessSwitch (Op);
> +
> +    return (AE_OK);
> +}
> +
>   
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiDmResourceDescendingOp
> + * FUNCTION:    AcpiDmProcessResourceDescriptors
>    *
>    * PARAMETERS:  ASL_WALK_CALLBACK
>    *
> - * RETURN:      None
> + * RETURN:      ACPI_STATUS
>    *
> - * DESCRIPTION: Process one parse op during symbolic resource index conversion.
> + * DESCRIPTION: Convert fixed-offset references to resource descriptors to
> + *              symbolic references. Should only be called after namespace has
> + *              been cross referenced.
>    *
>    ******************************************************************************/
>   
>   static ACPI_STATUS
> -AcpiDmResourceDescendingOp (
> +AcpiDmProcessResourceDescriptors (
>       ACPI_PARSE_OBJECT       *Op,
>       UINT32                  Level,
>       void                    *Context)
> @@ -1085,7 +1113,6 @@ AcpiDmResourceDescendingOp (
>       ACPI_OBJECT_TYPE        ObjectType;
>       ACPI_STATUS             Status;
>   
> -
>       WalkState = Info->WalkState;
>       OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
>   
> @@ -1111,10 +1138,10 @@ AcpiDmResourceDescendingOp (
>        * If so, convert the reference into a symbolic reference.
>        */
>       AcpiDmCheckResourceReference (Op, WalkState);
> +
>       return (AE_OK);
>   }
>   
> -
>   /*******************************************************************************
>    *
>    * FUNCTION:    AcpiDmCommonAscendingOp
> @@ -1135,14 +1162,11 @@ AcpiDmCommonAscendingOp (
>       void                    *Context)
>   {
>       ACPI_OP_WALK_INFO       *Info = Context;
> -    const ACPI_OPCODE_INFO  *OpInfo;
>       ACPI_OBJECT_TYPE        ObjectType;
>   
>   
>       /* Close scope if necessary */
>   
> -    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
> -    ObjectType = OpInfo->ObjectType;
>       ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
>   
>       if (AcpiNsOpensScope (ObjectType))
> @@ -1153,7 +1177,6 @@ AcpiDmCommonAscendingOp (
>       return (AE_OK);
>   }
>   
> -
>   /*******************************************************************************
>    *
>    * FUNCTION:    AcpiDmInspectPossibleArgs
> diff --git a/src/acpica/source/common/ahids.c b/src/acpica/source/common/ahids.c
> index 3f3bae30..701d9f40 100644
> --- a/src/acpica/source/common/ahids.c
> +++ b/src/acpica/source/common/ahids.c
> @@ -187,6 +187,7 @@ const AH_DEVICE_ID  AslDeviceIds[] =
>       {"ACPI0011",    "Generic Buttons Device"},
>       {"ACPI0012",    "NVDIMM Root Device"},
>       {"ACPI0013",    "Generic Event Device"},
> +    {"ACPI0014",    "Wireless Power Calibration Device"},
>       {"ADMA0F28",    "Intel Audio DMA"},
>       {"AMCR0F28",    "Intel Audio Machine Driver"},
>       {"ATK4001",     "Asus Radio Control Button"},
> diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c
> index 41e19f68..edcfa2f0 100644
> --- a/src/acpica/source/common/ahpredef.c
> +++ b/src/acpica/source/common/ahpredef.c
> @@ -254,6 +254,7 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
>       AH_PREDEF ("_FPS",    "Fan Performance States", "Returns a list of supported fan performance states"),
>       AH_PREDEF ("_FSL",    "Fan Set Level", "Control method that sets the fan device's speed level (performance state)"),
>       AH_PREDEF ("_FST",    "Fan Status", "Returns current status information for a fan device"),
> +    AH_PREDEF ("_FUN",    "Function Number", "Resource descriptor field"),
>       AH_PREDEF ("_GAI",    "Get Averaging Interval", "Returns the power meter averaging interval"),
>       AH_PREDEF ("_GCP",    "Get Capabilities", "Get device time capabilities"),
>       AH_PREDEF ("_GHL",    "Get Hardware Limit", "Returns the hardware limit enforced by the power meter"),
> @@ -270,6 +271,7 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
>       AH_PREDEF ("_GWS",    "Get Wake Status", "Return status of wake alarms"),
>       AH_PREDEF ("_HE_",    "High-Edge", "Interrupt triggering, Resource Descriptor field"),
>       AH_PREDEF ("_HID",    "Hardware ID", "Returns a device's Plug and Play Hardware ID"),
> +    AH_PREDEF ("_HMA",    "Heterogeneous Memory Attributes", "Returns a list of HMAT structures."),
>       AH_PREDEF ("_HOT",    "Hot Temperature", "Returns the critical temperature for sleep (entry to S4)"),
>       AH_PREDEF ("_HPP",    "Hot Plug Parameters", "Returns a list of hot-plug information for a PCI device"),
>       AH_PREDEF ("_HPX",    "Hot Plug Parameter Extensions", "Returns a list of hot-plug information for a PCI device. Supersedes _HPP"),
> @@ -287,6 +289,9 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
>       AH_PREDEF ("_LL_",    "Low Level", "Interrupt polarity, Resource Descriptor field"),
>       AH_PREDEF ("_LPD",    "Low Power Dependencies", "Returns a list of dependencies for low power idle entry"),
>       AH_PREDEF ("_LPI",    "Low Power Idle States", "Returns a list of supported low power idle states"),
> +    AH_PREDEF ("_LSI",    "Label Storage Information", "Returns information about the Label Storage Area associated with the NVDIMM object."),
> +    AH_PREDEF ("_LSR",    "Label Storage Read", "Returns label data from the Label Storage Area of the NVDIMM object."),
> +    AH_PREDEF ("_LSW",    "Label Storage Write", "Writes label data in to the Label Storage Area of the NVDIMM object."),
>       AH_PREDEF ("_MAF",    "Maximum Address Fixed", "Resource Descriptor field"),
>       AH_PREDEF ("_MAT",    "Multiple APIC Table Entry", "Returns a list of MADT APIC structure entries"),
>       AH_PREDEF ("_MAX",    "Maximum Base Address", "Resource Descriptor field"),
> @@ -439,6 +444,7 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
>       AH_PREDEF ("_UPC",    "USB Port Capabilities", "Returns a list of USB port capabilities"),
>       AH_PREDEF ("_UPD",    "User Presence Detect", "Returns user detection information"),
>       AH_PREDEF ("_UPP",    "User Presence Polling", "Returns the recommended user presence polling interval"),
> +    AH_PREDEF ("_VAL",    "Pin Configuration Value", "Resource Descriptor field"),
>       AH_PREDEF ("_VEN",    "Vendor Data", "Resource Descriptor field"),
>       AH_PREDEF ("_VPO",    "Video Post Options", "Returns the implemented video post options"),
>       AH_PREDEF ("_Wxx",    "Wake Event", "Method executed as a result of a wake event"),
> diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
> index 42a7944f..38c1ea20 100644
> --- a/src/acpica/source/common/ahtable.c
> +++ b/src/acpica/source/common/ahtable.c
> @@ -218,6 +218,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
>       {ACPI_SIG_FPDT, "Firmware Performance Data Table"},
>       {ACPI_SIG_GTDT, "Generic Timer Description Table"},
>       {ACPI_SIG_HEST, "Hardware Error Source Table"},
> +    {ACPI_SIG_HMAT, "Heterogeneous Memory Attributes Table"},
>       {ACPI_SIG_HPET, "High Precision Event Timer table"},
>       {ACPI_SIG_IORT, "IO Remapping Table"},
>       {ACPI_SIG_IVRS, "I/O Virtualization Reporting Structure"},
> @@ -232,6 +233,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
>       {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"},
>       {ACPI_SIG_PCCT, "Platform Communications Channel Table"},
>       {ACPI_SIG_PMTT, "Platform Memory Topology Table"},
> +    {ACPI_SIG_PPTT, "Processor Properties Topology Table"},
>       {ACPI_SIG_RASF, "RAS Features Table"},
>       {ACPI_RSDP_NAME,"Root System Description Pointer"},
>       {ACPI_SIG_RSDT, "Root System Description Table"},
> @@ -253,6 +255,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
>       {ACPI_SIG_WDDT, "Watchdog Description Table"},
>       {ACPI_SIG_WDRT, "Watchdog Resource Table"},
>       {ACPI_SIG_WPBT, "Windows Platform Binary Table"},
> +    {ACPI_SIG_WSMT, "Windows SMM Security Migrations Table"},
>       {ACPI_SIG_XENV, "Xen Environment table"},
>       {ACPI_SIG_XSDT, "Extended System Description Table"},
>       {NULL,          NULL}
> diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c
> index f2b62443..6e018a30 100644
> --- a/src/acpica/source/common/ahuuids.c
> +++ b/src/acpica/source/common/ahuuids.c
> @@ -186,6 +186,10 @@ const AH_UUID  Gbl_AcpiUuids[] =
>       {"Persistent Virtual Disk",     UUID_PERSISTENT_VIRTUAL_DISK},
>       {"Persistent Virtual CD",       UUID_PERSISTENT_VIRTUAL_CD},
>   
> +    {"[Processor Properties]",      NULL},
> +    {"Cache Properties",            UUID_CACHE_PROPERTIES},
> +    {"Physical Package Property",   UUID_PHYSICAL_PROPERTY},
> +
>       {"[Miscellaneous]",             NULL},
>       {"Platform-wide Capabilities",  UUID_PLATFORM_CAPABILITIES},
>       {"Dynamic Enumeration",         UUID_DYNAMIC_ENUMERATION},
> diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
> index 818d2adc..6ae3c379 100644
> --- a/src/acpica/source/common/dmextern.c
> +++ b/src/acpica/source/common/dmextern.c
> @@ -199,6 +199,9 @@ static const char           *AcpiGbl_DmTypeNames[] =
>   
>   #define METHOD_SEPARATORS           " \t,()\n"
>   
> +static const char          *ExternalConflictMessage =
> +    "    // Conflicts with a later declaration";
> +
>   
>   /* Local prototypes */
>   
> @@ -211,6 +214,16 @@ AcpiDmNormalizeParentPrefix (
>       ACPI_PARSE_OBJECT       *Op,
>       char                    *Path);
>   
> +static ACPI_STATUS
> +AcpiDmGetExternalAndInternalPath (
> +    ACPI_NAMESPACE_NODE     *Node,
> +    char                    **ExternalPath,
> +    char                    **InternalPath);
> +
> +static ACPI_STATUS
> +AcpiDmRemoveRootPrefix (
> +    char                    **Path);
> +
>   static void
>   AcpiDmAddPathToExternalList (
>       char                    *Path,
> @@ -226,6 +239,21 @@ AcpiDmCreateNewExternal (
>       UINT32                  Value,
>       UINT16                  Flags);
>   
> +static void
> +AcpiDmCheckForExternalConflict (
> +    char                    *Path);
> +
> +static ACPI_STATUS
> +AcpiDmResolveExternal (
> +    char                    *Path,
> +    UINT8                   Type,
> +    ACPI_NAMESPACE_NODE     **Node);
> +
> +
> +static void
> +AcpiDmConflictingDeclaration (
> +    char                    *Path);
> +
>   
>   /*******************************************************************************
>    *
> @@ -582,7 +610,7 @@ AcpiDmGetExternalsFromFile (
>       {
>           /* Add the external(s) to the namespace */
>   
> -        AcpiDmAddExternalsToNamespace ();
> +        AcpiDmAddExternalListToNamespace ();
>   
>           AcpiOsPrintf ("%s: Imported %u external method definitions\n",
>               Gbl_ExternalRefFilename, ImportCount);
> @@ -698,6 +726,86 @@ AcpiDmAddOpToExternalList (
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiDmGetExternalAndInternalPath
> + *
> + * PARAMETERS:  Node                - Namespace node for object to be added
> + *              ExternalPath        - Will contain the external path of the node
> + *              InternalPath        - Will contain the internal path of the node
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Get the External and Internal path from the given node.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDmGetExternalAndInternalPath (
> +    ACPI_NAMESPACE_NODE     *Node,
> +    char                    **ExternalPath,
> +    char                    **InternalPath)
> +{
> +    ACPI_STATUS             Status;
> +
> +
> +    if (!Node)
> +    {
> +        return (AE_BAD_PARAMETER);
> +    }
> +
> +    /* Get the full external and internal pathnames to the node */
> +
> +    *ExternalPath = AcpiNsGetExternalPathname (Node);
> +    if (!*ExternalPath)
> +    {
> +        return (AE_BAD_PATHNAME);
> +    }
> +
> +    Status = AcpiNsInternalizeName (*ExternalPath, InternalPath);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        ACPI_FREE (*ExternalPath);
> +        return (Status);
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmRemoveRootPrefix
> + *
> + * PARAMETERS:  Path                - Remove Root prefix from this Path
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Remove the root prefix character '\' from Path.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDmRemoveRootPrefix (
> +    char                    **Path)
> +{
> +    char                    *InputPath = *Path;
> +
> +
> +    if ((*InputPath == AML_ROOT_PREFIX) && (InputPath[1]))
> +    {
> +        if (!memmove(InputPath, InputPath+1, strlen(InputPath)))
> +        {
> +            return (AE_ERROR);
> +        }
> +
> +        *Path = InputPath;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiDmAddNodeToExternalList
>    *
>    * PARAMETERS:  Node                - Namespace node for object to be added
> @@ -727,46 +835,27 @@ AcpiDmAddNodeToExternalList (
>   {
>       char                    *ExternalPath;
>       char                    *InternalPath;
> -    char                    *Temp;
>       ACPI_STATUS             Status;
>   
>   
>       ACPI_FUNCTION_TRACE (DmAddNodeToExternalList);
>   
> -
> -    if (!Node)
> -    {
> -        return_VOID;
> -    }
> -
>       /* Get the full external and internal pathnames to the node */
>   
> -    ExternalPath = AcpiNsGetExternalPathname (Node);
> -    if (!ExternalPath)
> -    {
> -        return_VOID;
> -    }
> -
> -    Status = AcpiNsInternalizeName (ExternalPath, &InternalPath);
> +    Status = AcpiDmGetExternalAndInternalPath (Node, &ExternalPath, &InternalPath);
>       if (ACPI_FAILURE (Status))
>       {
> -        ACPI_FREE (ExternalPath);
>           return_VOID;
>       }
>   
>       /* Remove the root backslash */
>   
> -    if ((*ExternalPath == AML_ROOT_PREFIX) && (ExternalPath[1]))
> +    Status = AcpiDmRemoveRootPrefix (&ExternalPath);
> +    if (ACPI_FAILURE (Status))
>       {
> -        Temp = ACPI_ALLOCATE_ZEROED (strlen (ExternalPath) + 1);
> -        if (!Temp)
> -        {
> -            return_VOID;
> -        }
> -
> -        strcpy (Temp, &ExternalPath[1]);
>           ACPI_FREE (ExternalPath);
> -        ExternalPath = Temp;
> +        ACPI_FREE (InternalPath);
> +        return_VOID;
>       }
>   
>       /* Create the new External() declaration node */
> @@ -1013,68 +1102,171 @@ AcpiDmCreateNewExternal (
>   
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiDmAddExternalsToNamespace
> + * FUNCTION:    AcpiDmResolveExternal
>    *
> - * PARAMETERS:  None
> + * PARAMETERS:  Path               - Path of the external
> + *              Type               - Type of the external
> + *              Node               - Input node for AcpiNsLookup
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Resolve the external within the namespace by AcpiNsLookup.
> + *              If the returned node is an external and has the same type
> + *              we assume that it was either an existing external or a
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiDmResolveExternal (
> +    char                    *Path,
> +    UINT8                   Type,
> +    ACPI_NAMESPACE_NODE     **Node)
> +{
> +    ACPI_STATUS             Status;
> +
> +
> +    Status = AcpiNsLookup (NULL, Path, Type,
> +        ACPI_IMODE_LOAD_PASS1,
> +        ACPI_NS_ERROR_IF_FOUND | ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
> +        NULL, Node);
> +
> +    if (!Node)
> +    {
> +        ACPI_EXCEPTION ((AE_INFO, Status,
> +            "while adding external to namespace [%s]", Path));
> +    }
> +
> +    /* Note the asl code "external(a) external(a)" is acceptable ASL */
> +
> +    else if ((*Node)->Type == Type &&
> +        (*Node)->Flags & ANOBJ_IS_EXTERNAL)
> +    {
> +        return (AE_OK);
> +    }
> +    else
> +    {
> +        ACPI_EXCEPTION ((AE_INFO, AE_ERROR,
> +            "[%s] has conflicting declarations", Path));
> +    }
> +
> +    return (AE_ERROR);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmCreateSubobjectForExternal
> + *
> + * PARAMETERS:  Type                  - Type of the external
> + *              Node                  - Namespace node from AcpiNsLookup
> + *              ParamCount            - Value to be used for Method
>    *
>    * RETURN:      None
>    *
> - * DESCRIPTION: Add all externals to the namespace. Allows externals to be
> + * DESCRIPTION: Add one external to the namespace. Allows external to be
>    *              "resolved".
>    *
>    ******************************************************************************/
>   
>   void
> -AcpiDmAddExternalsToNamespace (
> -    void)
> +AcpiDmCreateSubobjectForExternal (
> +    UINT8                   Type,
> +    ACPI_NAMESPACE_NODE     **Node,
> +    UINT32                  ParamCount)
>   {
> -    ACPI_STATUS             Status;
> -    ACPI_NAMESPACE_NODE     *Node;
>       ACPI_OPERAND_OBJECT     *ObjDesc;
> -    ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
>   
>   
> -    while (External)
> +    switch (Type)
>       {
> -        /* Add the external name (object) into the namespace */
> +    case ACPI_TYPE_METHOD:
>   
> -        Status = AcpiNsLookup (NULL, External->InternalPath, External->Type,
> -            ACPI_IMODE_LOAD_PASS1,
> -            ACPI_NS_ERROR_IF_FOUND | ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
> -            NULL, &Node);
> +        /* For methods, we need to save the argument count */
>   
> -        if (ACPI_FAILURE (Status))
> -        {
> -            ACPI_EXCEPTION ((AE_INFO, Status,
> -                "while adding external to namespace [%s]",
> -                External->Path));
> -        }
> +        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> +        ObjDesc->Method.ParamCount = (UINT8) ParamCount;
> +        (*Node)->Object = ObjDesc;
> +        break;
>   
> -        else switch (External->Type)
> -        {
> -        case ACPI_TYPE_METHOD:
> +    case ACPI_TYPE_REGION:
>   
> -            /* For methods, we need to save the argument count */
> +        /* Regions require a region sub-object */
>   
> -            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
> -            ObjDesc->Method.ParamCount = (UINT8) External->Value;
> -            Node->Object = ObjDesc;
> -            break;
> +        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> +        ObjDesc->Region.Node = *Node;
> +        (*Node)->Object = ObjDesc;
> +        break;
>   
> -        case ACPI_TYPE_REGION:
> +    default:
>   
> -            /* Regions require a region sub-object */
> +        break;
> +    }
> +}
>   
> -            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
> -            ObjDesc->Region.Node = Node;
> -            Node->Object = ObjDesc;
> -            break;
>   
> -        default:
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmAddOneExternalToNamespace
> + *
> + * PARAMETERS:  Path                   - External parse object
> + *              Type                   - Type of parse object
> + *              ParamCount             - External method parameter count
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Add one external to the namespace by resolvign the external
> + *              (by performing a namespace lookup) and annotating the resulting
> + *              namespace node with the approperiate information if the type
> + *              is ACPI_TYPE_REGION or ACPI_TYPE_METHOD.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmAddOneExternalToNamespace (
> +    char                    *Path,
> +    UINT8                   Type,
> +    UINT32                  ParamCount)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_NAMESPACE_NODE     *Node;
>   
> -            break;
> -        }
>   
> +    Status = AcpiDmResolveExternal (Path, Type, &Node);
> +
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return;
> +    }
> +
> +    AcpiDmCreateSubobjectForExternal (Type, &Node, ParamCount);
> +
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmAddExternalListToNamespace
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Add all externals within AcpiGbl_ExternalList to the namespace.
> + *              Allows externals to be "resolved".
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmAddExternalListToNamespace (
> +    void)
> +{
> +    ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
> +
> +
> +    while (External)
> +    {
> +        AcpiDmAddOneExternalToNamespace (External->InternalPath,
> +            External->Type, External->Value);
>           External = External->Next;
>       }
>   }
> @@ -1082,23 +1274,28 @@ AcpiDmAddExternalsToNamespace (
>   
>   /*******************************************************************************
>    *
> - * FUNCTION:    AcpiDmGetExternalMethodCount
> + * FUNCTION:    AcpiDmGetUnresolvedExternalMethodCount
>    *
>    * PARAMETERS:  None
>    *
> - * RETURN:      The number of control method externals in the external list
> + * RETURN:      The number of unresolved control method externals in the
> + *              external list
>    *
> - * DESCRIPTION: Return the number of method externals that have been generated.
> - *              If any control method externals have been found, we must
> - *              re-parse the entire definition block with the new information
> - *              (number of arguments for the methods.) This is limitation of
> - *              AML, we don't know the number of arguments from the control
> - *              method invocation itself.
> + * DESCRIPTION: Return the number of unresolved external methods that have been
> + *              generated. If any unresolved control method externals have been
> + *              found, we must re-parse the entire definition block with the new
> + *              information (number of arguments for the methods.)
> + *              This is limitation of AML, we don't know the number of arguments
> + *              from the control method invocation itself.
> + *
> + *              Note: resolved external control methods are external control
> + *              methods encoded with the AML_EXTERNAL_OP bytecode within the
> + *              AML being disassembled.
>    *
>    ******************************************************************************/
>   
>   UINT32
> -AcpiDmGetExternalMethodCount (
> +AcpiDmGetUnresolvedExternalMethodCount (
>       void)
>   {
>       ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
> @@ -1107,7 +1304,8 @@ AcpiDmGetExternalMethodCount (
>   
>       while (External)
>       {
> -        if (External->Type == ACPI_TYPE_METHOD)
> +        if (External->Type == ACPI_TYPE_METHOD &&
> +            !(External->Flags & ACPI_EXT_ORIGIN_FROM_OPCODE))
>           {
>               Count++;
>           }
> @@ -1251,6 +1449,11 @@ AcpiDmEmitExternals (
>                   }
>               }
>   
> +            if (AcpiGbl_ExternalList->Flags &= ACPI_EXT_CONFLICTING_DECLARATION)
> +            {
> +                AcpiOsPrintf ("%s", ExternalConflictMessage);
> +                AcpiDmConflictingDeclaration (AcpiGbl_ExternalList->Path);
> +            }
>               AcpiOsPrintf ("\n");
>           }
>   
> @@ -1273,6 +1476,106 @@ AcpiDmEmitExternals (
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiDmMarkExternalConflict
> + *
> + * PARAMETERS:  Path          - Namepath to search
> + *
> + * RETURN:      ExternalList
> + *
> + * DESCRIPTION: Search the AcpiGbl_ExternalList for a matching path
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmMarkExternalConflict (
> +    ACPI_NAMESPACE_NODE     *Node)
> +{
> +    ACPI_EXTERNAL_LIST      *ExternalList = AcpiGbl_ExternalList;
> +    char                    *ExternalPath;
> +    char                    *InternalPath;
> +    char                    *Temp;
> +    ACPI_STATUS             Status;
> +
> +
> +    ACPI_FUNCTION_TRACE (DmMarkExternalConflict);
> +
> +
> +    if (Node->Flags & ANOBJ_IS_EXTERNAL)
> +    {
> +        return_VOID;
> +    }
> +
> +    /* Get the full external and internal pathnames to the node */
> +
> +    Status = AcpiDmGetExternalAndInternalPath (Node,
> +        &ExternalPath, &InternalPath);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return_VOID;
> +    }
> +
> +    /* Remove the root backslash */
> +
> +    Status = AcpiDmRemoveRootPrefix (&InternalPath);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        ACPI_FREE (InternalPath);
> +        ACPI_FREE (ExternalPath);
> +        return_VOID;
> +    }
> +
> +    while (ExternalList)
> +    {
> +        Temp = ExternalList->InternalPath;
> +        if ((*ExternalList->InternalPath == AML_ROOT_PREFIX) &&
> +            (ExternalList->InternalPath[1]))
> +        {
> +            Temp++;
> +        }
> +
> +        if (!strcmp (ExternalList->InternalPath, InternalPath))
> +        {
> +            ExternalList->Flags |= ACPI_EXT_CONFLICTING_DECLARATION;
> +        }
> +        ExternalList = ExternalList->Next;
> +    }
> +
> +    ACPI_FREE (InternalPath);
> +    ACPI_FREE (ExternalPath);
> +
> +    return_VOID;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmConflictingDeclaration
> + *
> + * PARAMETERS:  Path                - Path with conflicting declaration
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Emit a warning when printing conflicting ASL external
> + *              declarations.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmConflictingDeclaration (
> +    char                    *Path)
> +{
> +    fprintf (stderr,
> +        " Warning - Emitting ASL code \"External (%s)\"\n"
> +        "           This is a conflicting declaration with some "
> +        "other declaration within the ASL code.\n"
> +        "           This external declaration may need to be "
> +        "deleted in order to recompile the dsl file.\n\n",
> +        Path);
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiDmEmitExternal
>    *
>    * PARAMETERS:  Op                  External Parse Object
> @@ -1280,7 +1583,8 @@ AcpiDmEmitExternals (
>    * RETURN:      None
>    *
>    * DESCRIPTION: Emit an External() ASL statement for the current External
> - *              parse object
> + *              parse object. Note: External Ops are named types so the
> + *              namepath is contained within NameOp->Name.Path.
>    *
>    ******************************************************************************/
>   
> @@ -1290,14 +1594,76 @@ AcpiDmEmitExternal (
>       ACPI_PARSE_OBJECT       *TypeOp)
>   {
>       AcpiOsPrintf ("External (");
> -    AcpiDmNamestring (NameOp->Common.Value.Name);
> -    AcpiOsPrintf ("%s)\n",
> +    AcpiDmNamestring (NameOp->Named.Path);
> +    AcpiOsPrintf ("%s)",
>           AcpiDmGetObjectTypeName ((ACPI_OBJECT_TYPE) TypeOp->Common.Value.Integer));
> +    AcpiDmCheckForExternalConflict (NameOp->Named.Path);
> +    AcpiOsPrintf ("\n");
>   }
>   
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiDmCheckForExternalConflict
> + *
> + * PARAMETERS:  Path                - Path to check
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Search the External List to see if the input Path has a
> + *              conflicting declaration.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmCheckForExternalConflict (
> +    char                    *Path)
> +{
> +    ACPI_EXTERNAL_LIST      *ExternalList = AcpiGbl_ExternalList;
> +    char                    *ListItemPath;
> +    char                    *InputPath;
> +
> +
> +    if (!Path)
> +    {
> +        return;
> +    }
> +
> +    /* Move past the root prefix '\' */
> +
> +    InputPath = Path;
> +    if ((*InputPath == AML_ROOT_PREFIX) && InputPath[1])
> +    {
> +        InputPath++;
> +    }
> +
> +    while (ExternalList)
> +    {
> +        ListItemPath = ExternalList->Path;
> +        if (ListItemPath)
> +        {
> +            /* Move past the root prefix '\' */
> +
> +            if ((*ListItemPath == AML_ROOT_PREFIX) &&
> +                ListItemPath[1])
> +            {
> +                ListItemPath++;
> +            }
> +
> +            if (!strcmp (ListItemPath, InputPath) &&
> +                (ExternalList->Flags & ACPI_EXT_CONFLICTING_DECLARATION))
> +            {
> +                AcpiOsPrintf ("%s", ExternalConflictMessage);
> +                AcpiDmConflictingDeclaration (Path);
> +
> +                return;
> +            }
> +        }
> +        ExternalList = ExternalList->Next;
> +    }
> +}
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiDmUnresolvedWarning
>    *
>    * PARAMETERS:  Type                - Where to output the warning.
> @@ -1311,7 +1677,7 @@ AcpiDmEmitExternal (
>    *
>    ******************************************************************************/
>   
> -#if 0
> +/*
>   Summary of the external control method problem:
>   
>   When the -e option is used with disassembly, the various SSDTs are simply
> @@ -1380,7 +1746,7 @@ disassembler, otherwise it does not know how to handle the method invocations.
>   In other words, if ABCD and EFGH are actually external control methods
>   appearing in an SSDT, the disassembler does not know what to do unless
>   the owning SSDT has been loaded via the -e option.
> -#endif
> +*/
>   
>   static char             ExternalWarningPart1[600];
>   static char             ExternalWarningPart2[400];
> diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
> index 7753388a..5ba0f6b4 100644
> --- a/src/acpica/source/common/dmrestag.c
> +++ b/src/acpica/source/common/dmrestag.c
> @@ -424,6 +424,34 @@ static const ACPI_RESOURCE_TAG      AcpiDmUartSerialBusTags[] =
>       {0,             NULL}
>   };
>   
> +/* Subtype tables for PinFunction descriptor */
> +
> +static const ACPI_RESOURCE_TAG      AcpiDmPinFunctionTags[] =
> +{
> +    {( 4 * 8),      ACPI_RESTAG_INTERRUPTSHARE},
> +    {( 6 * 8),      ACPI_RESTAG_PINCONFIG},
> +    {( 7 * 8),      ACPI_RESTAG_FUNCTION},
> +    {0,             NULL}
> +};
> +
> +/* Subtype tables for PinConfig descriptor */
> +
> +static const ACPI_RESOURCE_TAG      AcpiDmPinConfigTags[] =
> +{
> +    {( 4 * 8),      ACPI_RESTAG_INTERRUPTSHARE},
> +    {( 6 * 8),      ACPI_RESTAG_PINCONFIG_TYPE},
> +    {( 7 * 8),      ACPI_RESTAG_PINCONFIG_VALUE},
> +    {0,             NULL}
> +};
> +
> +/* Subtype tables for PinGroupFunction descriptor */
> +
> +static const ACPI_RESOURCE_TAG      AcpiDmPinGroupFunctionTags[] =
> +{
> +    {( 6 * 8),      ACPI_RESTAG_FUNCTION},
> +    {0,             NULL}
> +};
> +
>   /* Subtype tables for Address descriptor type-specific flags */
>   
>   static const ACPI_RESOURCE_TAG      AcpiDmMemoryFlagTags[] =
> @@ -488,8 +516,12 @@ static const ACPI_RESOURCE_TAG      *AcpiGbl_ResourceTags[] =
>       AcpiDmAddress64Tags,            /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
>       AcpiDmExtendedAddressTags,      /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
>       NULL,                           /* 0x0C, ACPI_RESOURCE_NAME_GPIO - Use Subtype table below */
> -    NULL,                           /* 0x0D, Reserved */
> -    NULL                            /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */
> +    AcpiDmPinFunctionTags,          /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
> +    NULL,                           /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */
> +    AcpiDmPinConfigTags,            /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
> +    NULL,                           /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
> +    AcpiDmPinGroupFunctionTags,     /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
> +    AcpiDmPinConfigTags,            /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG - Same as PinConfig */
>   };
>   
>   /* GPIO Subtypes */
> diff --git a/src/acpica/source/common/dmswitch.c b/src/acpica/source/common/dmswitch.c
> new file mode 100644
> index 00000000..1641cbf9
> --- /dev/null
> +++ b/src/acpica/source/common/dmswitch.c
> @@ -0,0 +1,679 @@
> +/******************************************************************************
> + *
> + * Module Name: adwalk - Disassembler routines for switch statements
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * following license:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acparser.h"
> +#include "amlcode.h"
> +#include "acdisasm.h"
> +#include "acdispat.h"
> +#include "acnamesp.h"
> +#include "acapps.h"
> +
> +
> +#define _COMPONENT          ACPI_CA_DISASSEMBLER
> +        ACPI_MODULE_NAME    ("dmswitch")
> +
> +static BOOLEAN
> +AcpiDmIsSwitchBlock (
> +    ACPI_PARSE_OBJECT       *Op,
> +    char                    **Temp);
> +
> +static BOOLEAN
> +AcpiDmIsCaseBlock (
> +    ACPI_PARSE_OBJECT       *Op);
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmProcessSwitch
> + *
> + * PARAMETERS:  Op              - Object to be examined
> + *
> + * RETURN:      ACPI_STATUS
> + *
> + * DESCRIPTION: Walk function to create a list of all temporary (_T_) objects.
> + *              If a While loop is found that can be converted to a Switch, do
> + *              the conversion, remove the temporary name from the list, and
> + *              mark the parse op with an IGNORE flag.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiDmProcessSwitch (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +    char                    *Temp = NULL;
> +    ACPI_PARSE_OBJECT_LIST  *NewTemp;
> +    ACPI_PARSE_OBJECT_LIST  *Current;
> +    ACPI_PARSE_OBJECT_LIST  *Previous;
> +    BOOLEAN                 FoundTemp = FALSE;
> +
> +
> +    switch (Op->Common.AmlOpcode)
> +    {
> +    case AML_NAME_OP:
> +
> +        Temp = (char *) (&Op->Named.Name);
> +
> +        if (!strncmp(Temp, "_T_", 3))
> +        {
> +            /* Allocate and init a new Temp List node */
> +
> +            NewTemp = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PARSE_OBJECT_LIST));
> +            if (!NewTemp)
> +            {
> +                return (AE_NO_MEMORY);
> +            }
> +
> +            if (AcpiGbl_TempListHead)
> +            {
> +                Current = AcpiGbl_TempListHead;
> +                AcpiGbl_TempListHead = NewTemp;
> +                AcpiGbl_TempListHead->Op = Op;
> +                AcpiGbl_TempListHead->Next = Current;
> +            }
> +            else
> +            {
> +                AcpiGbl_TempListHead = NewTemp;
> +                AcpiGbl_TempListHead->Op = Op;
> +                AcpiGbl_TempListHead->Next = NULL;
> +            }
> +        }
> +        break;
> +
> +    case AML_WHILE_OP:
> +
> +        if (!AcpiDmIsSwitchBlock (Op, &Temp))
> +        {
> +            break;
> +        }
> +
> +        /* Found a Switch */
> +
> +        Op->Common.DisasmOpcode = ACPI_DASM_SWITCH;
> +
> +        Previous = Current = AcpiGbl_TempListHead;
> +        while (Current)
> +        {
> +            /* Note, if we get here Temp is not NULL */
> +
> +            if (!strncmp(Temp, (char *) (&Current->Op->Named.Name), 4))
> +            {
> +                /* Match found. Ignore disassembly */
> +
> +                Current->Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> +
> +                /* Remove from list */
> +
> +                if (Current == AcpiGbl_TempListHead)
> +                {
> +                    AcpiGbl_TempListHead = Current->Next;
> +                }
> +                else
> +                {
> +                    Previous->Next = Current->Next;
> +                }
> +
> +                Current->Op = NULL;
> +                Current->Next = NULL;
> +                ACPI_FREE (Current);
> +                FoundTemp = TRUE;
> +                break;
> +            }
> +
> +            Previous = Current;
> +            Current = Current->Next;
> +        }
> +
> +        if (!FoundTemp)
> +        {
> +            fprintf (stderr,
> +                "Warning: Declaration for temp name %.4s not found\n", Temp);
> +        }
> +        break;
> +
> +    default:
> +        break;
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmClearTempList
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Removes any remaining temporary objects from global list and
> + *              frees
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmClearTempList (
> +    void)
> +{
> +    ACPI_PARSE_OBJECT_LIST      *Current;
> +
> +
> +    while (AcpiGbl_TempListHead)
> +    {
> +        Current = AcpiGbl_TempListHead;
> +        AcpiGbl_TempListHead = AcpiGbl_TempListHead->Next;
> +        Current->Op = NULL;
> +        Current->Next = NULL;
> +        ACPI_FREE (Current);
> +    }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmIsSwitchBlock
> + *
> + * PARAMETERS:  Op              - While Object
> + *
> + * RETURN:      TRUE if While block can be converted to a Switch/Case block
> + *
> + * DESCRIPTION: Determines if While block is a Switch/Case statement. Modifies
> + *              parse tree to allow for Switch/Case disassembly during walk.
> + *
> + * EXAMPLE: Example of parse tree to be converted
> + *
> + *    While
> + *        One
> + *        Store
> + *            ByteConst
> + *             -NamePath-
> + *        If
> + *            LEqual
> + *                -NamePath-
> + *                Zero
> + *            Return
> + *                One
> + *        Else
> + *            Return
> + *                WordConst
> + *        Break
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +AcpiDmIsSwitchBlock (
> +    ACPI_PARSE_OBJECT       *Op,
> +    char                    **Temp)
> +{
> +    ACPI_PARSE_OBJECT       *OneOp;
> +    ACPI_PARSE_OBJECT       *StoreOp;
> +    ACPI_PARSE_OBJECT       *NamePathOp;
> +    ACPI_PARSE_OBJECT       *PredicateOp;
> +    ACPI_PARSE_OBJECT       *CurrentOp;
> +    ACPI_PARSE_OBJECT       *TempOp;
> +
> +
> +    /* Check for One Op Predicate */
> +
> +    OneOp = AcpiPsGetArg (Op, 0);
> +    if (!OneOp || (OneOp->Common.AmlOpcode != AML_ONE_OP))
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Check for Store Op */
> +
> +    StoreOp = OneOp->Common.Next;
> +    if (!StoreOp || (StoreOp->Common.AmlOpcode != AML_STORE_OP))
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Check for Name Op with _T_ string */
> +
> +    NamePathOp = AcpiPsGetArg (StoreOp, 1);
> +    if (!NamePathOp ||
> +        (NamePathOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
> +    {
> +        return (FALSE);
> +    }
> +
> +    if (strncmp ((char *) (NamePathOp->Common.Value.Name), "_T_", 3))
> +    {
> +        return (FALSE);
> +    }
> +
> +    *Temp = (char *) (NamePathOp->Common.Value.Name);
> +
> +    /* This is a Switch/Case control block */
> +
> +    /* Ignore the One Op Predicate */
> +
> +    OneOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> +
> +    /* Ignore the Store Op, but not the children */
> +
> +    StoreOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
> +
> +    /*
> +     * First arg of Store Op is the Switch condition.
> +     * Mark it as a Switch predicate and as a parameter list for paren
> +     * closing and correct indentation.
> +     */
> +    PredicateOp = AcpiPsGetArg (StoreOp, 0);
> +    PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
> +    PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
> +
> +    /* Ignore the Name Op */
> +
> +    NamePathOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
> +
> +    /* Remaining opcodes are the Case statements (If/ElseIf's) */
> +
> +    CurrentOp = StoreOp->Common.Next;
> +    while (AcpiDmIsCaseBlock (CurrentOp))
> +    {
> +        /* Block is a Case structure */
> +
> +        if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> +        {
> +            /* ElseIf */
> +
> +            CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
> +            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +        }
> +
> +        /* If */
> +
> +        CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
> +
> +        /*
> +         * Mark the parse tree for Case disassembly. There are two
> +         * types of Case statements. The first type of statement begins with
> +         * an LEqual. The second starts with an LNot and uses a Match statement
> +         * on a Package of constants.
> +         */
> +        TempOp = AcpiPsGetArg (CurrentOp, 0);
> +        switch (TempOp->Common.AmlOpcode)
> +        {
> +        case (AML_LOGICAL_EQUAL_OP):
> +
> +            /* Ignore just the LEqual Op */
> +
> +            TempOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
> +
> +            /* Ignore the NamePath Op */
> +
> +            TempOp = AcpiPsGetArg (TempOp, 0);
> +            TempOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
> +
> +            /*
> +             * Second arg of LEqual will be the Case predicate.
> +             * Mark it as a predicate and also as a parameter list for paren
> +             * closing and correct indentation.
> +             */
> +            PredicateOp = TempOp->Common.Next;
> +            PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
> +            PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
> +            break;
> +
> +        case (AML_LOGICAL_NOT_OP):
> +
> +            /*
> +             * The Package will be the predicate of the Case statement.
> +             * It's under:
> +             *            LNOT
> +             *                LEQUAL
> +             *                    MATCH
> +             *                        PACKAGE
> +             */
> +
> +            /* Get the LEqual Op from LNot */
> +
> +            TempOp = AcpiPsGetArg (TempOp, 0);
> +
> +            /* Get the Match Op from LEqual */
> +
> +            TempOp = AcpiPsGetArg (TempOp, 0);
> +
> +            /* Get the Package Op from Match */
> +
> +            PredicateOp = AcpiPsGetArg (TempOp, 0);
> +
> +            /* Mark as parameter list for paren closing */
> +
> +            PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
> +
> +            /*
> +             * The Package list would be too deeply indented if we
> +             * chose to simply ignore the all the parent opcodes, so
> +             * we rearrange the parse tree instead.
> +             */
> +
> +            /*
> +             * Save the second arg of the If/Else Op which is the
> +             * block code of code for this Case statement.
> +             */
> +            TempOp = AcpiPsGetArg (CurrentOp, 1);
> +
> +            /*
> +             * Move the Package Op to the child (predicate) of the
> +             * Case statement.
> +             */
> +            CurrentOp->Common.Value.Arg = PredicateOp;
> +            PredicateOp->Common.Parent = CurrentOp;
> +
> +            /* Add the block code */
> +
> +            PredicateOp->Common.Next = TempOp;
> +            break;
> +
> +        default:
> +
> +            /* Should never get here */
> +            break;
> +        }
> +
> +        /* Advance to next Case block */
> +
> +        CurrentOp = CurrentOp->Common.Next;
> +    }
> +
> +    /* If CurrentOp is now an Else, then this is a Default block */
> +
> +    if (CurrentOp && CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> +    {
> +        CurrentOp->Common.DisasmOpcode = ACPI_DASM_DEFAULT;
> +    }
> +
> +    /*
> +     * From the first If advance to the Break op. It's possible to
> +     * have an Else (Default) op here when there is only one Case
> +     * statement, so check for it.
> +     */
> +    CurrentOp = StoreOp->Common.Next->Common.Next;
> +    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> +    {
> +        CurrentOp = CurrentOp->Common.Next;
> +    }
> +
> +    /* Ignore the Break Op */
> +
> +    CurrentOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> +    return (TRUE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmIsCaseBlock
> + *
> + * PARAMETERS:  Op              - Object to test
> + *
> + * RETURN:      TRUE if Object is beginning of a Case block.
> + *
> + * DESCRIPTION: Determines if an Object is the beginning of a Case block for a
> + *              Switch/Case statement. Parse tree must be one of the following
> + *              forms:
> + *
> + *              Else (Optional)
> + *                  If
> + *                      LEqual
> + *                          -NamePath- _T_x
> + *
> + *              Else (Optional)
> + *                  If
> + *                      LNot
> + *                          LEqual
> + *                              Match
> + *                                  Package
> + *                                      ByteConst
> + *                                      -NamePath- _T_x
> + *
> + ******************************************************************************/
> +
> +static BOOLEAN
> +AcpiDmIsCaseBlock (
> +    ACPI_PARSE_OBJECT       *Op)
> +{
> +    ACPI_PARSE_OBJECT       *CurrentOp;
> +
> +
> +    if (!Op)
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Look for an If or ElseIf */
> +
> +    CurrentOp = Op;
> +    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> +    {
> +        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +        if (!CurrentOp)
> +        {
> +            return (FALSE);
> +        }
> +    }
> +
> +    if (!CurrentOp || CurrentOp->Common.AmlOpcode != AML_IF_OP)
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Child must be LEqual or LNot */
> +
> +    CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +    if (!CurrentOp)
> +    {
> +        return (FALSE);
> +    }
> +
> +    switch (CurrentOp->Common.AmlOpcode)
> +    {
> +    case (AML_LOGICAL_EQUAL_OP):
> +
> +        /* Next child must be NamePath with string _T_ */
> +
> +        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +        if (!CurrentOp || !CurrentOp->Common.Value.Name ||
> +            strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
> +        {
> +            return (FALSE);
> +        }
> +        break;
> +
> +    case (AML_LOGICAL_NOT_OP):
> +
> +        /* Child of LNot must be LEqual op */
> +
> +        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +        if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_LOGICAL_EQUAL_OP))
> +        {
> +            return (FALSE);
> +        }
> +
> +        /* Child of LNot must be Match op */
> +
> +        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +        if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_MATCH_OP))
> +        {
> +            return (FALSE);
> +        }
> +
> +        /* First child of Match must be Package op */
> +
> +        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> +        if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_PACKAGE_OP))
> +        {
> +            return (FALSE);
> +        }
> +
> +        /* Third child of Match must be NamePath with string _T_ */
> +
> +        CurrentOp = AcpiPsGetArg (CurrentOp->Common.Parent, 2);
> +        if (!CurrentOp || !CurrentOp->Common.Value.Name ||
> +            strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
> +        {
> +            return (FALSE);
> +        }
> +        break;
> +
> +    default:
> +
> +        return (FALSE);
> +    }
> +
> +    return (TRUE);
> +}
> diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
> index 4befd14d..b85bb0c3 100644
> --- a/src/acpica/source/common/dmtable.c
> +++ b/src/acpica/source/common/dmtable.c
> @@ -298,6 +298,7 @@ static const char           *AcpiDmHestSubnames[] =
>       "PCI Express/PCI-X Bridge AER",
>       "Generic Hardware Error Source",
>       "Generic Hardware Error Source V2",
> +    "IA-32 Deferred Machine Check",
>       "Unknown Subtable Type"         /* Reserved */
>   };
>   
> @@ -314,9 +315,18 @@ static const char           *AcpiDmHestNotifySubnames[] =
>       "SEA",                          /* ACPI 6.1 */
>       "SEI",                          /* ACPI 6.1 */
>       "GSIV",                         /* ACPI 6.1 */
> +    "Software Delegated Exception", /* ACPI 6.2 */
>       "Unknown Notify Type"           /* Reserved */
>   };
>   
> +static const char           *AcpiDmHmatSubnames[] =
> +{
> +    "Memory Subystem Address Range",
> +    "System Locality Latency and Bandwidth Information",
> +    "Memory Side Cache Information",
> +    "Unknown Structure Type"         /* Reserved */
> +};
> +
>   static const char           *AcpiDmMadtSubnames[] =
>   {
>       "Processor Local APIC",             /* ACPI_MADT_TYPE_LOCAL_APIC */
> @@ -355,6 +365,8 @@ static const char           *AcpiDmPcctSubnames[] =
>       "Generic Communications Subspace",  /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
>       "HW-Reduced Comm Subspace",         /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
>       "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
> +    "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
> +    "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
>       "Unknown Subtable Type"             /* Reserved */
>   };
>   
> @@ -366,12 +378,21 @@ static const char           *AcpiDmPmttSubnames[] =
>       "Unknown Subtable Type"         /* Reserved */
>   };
>   
> +static const char           *AcpiDmPpttSubnames[] =
> +{
> +    "Processor Hierarchy Node",     /* ACPI_PPTT_TYPE_PROCESSOR */
> +    "Cache Type",                   /* ACPI_PPTT_TYPE_CACHE */
> +    "ID",                           /* ACPI_PMTT_TYPE_ID  */
> +    "Unknown Subtable Type"         /* Reserved */
> +};
> +
>   static const char           *AcpiDmSratSubnames[] =
>   {
>       "Processor Local APIC/SAPIC Affinity",
>       "Memory Affinity",
>       "Processor Local x2APIC Affinity",
>       "GICC Affinity",
> +    "GIC ITS Affinity",             /* Acpi 6.2 */
>       "Unknown Subtable Type"         /* Reserved */
>   };
>   
> @@ -452,6 +473,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>       {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
>       {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
>       {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
> +    {ACPI_SIG_HMAT, NULL,                   AcpiDmDumpHmat, DtCompileHmat,  TemplateHmat},
>       {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
>       {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
>       {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
> @@ -466,6 +488,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>       {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
>       {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
>       {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
> +    {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
>       {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
>       {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
>       {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
> @@ -485,6 +508,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
>       {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
>       {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
>       {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
> +    {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt,    NULL,           NULL,           TemplateWsmt},
>       {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
>       {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
>       {NULL,          NULL,                   NULL,           NULL,           NULL}
> @@ -891,6 +915,7 @@ AcpiDmDumpTable (
>           case ACPI_DMT_MADT:
>           case ACPI_DMT_PCCT:
>           case ACPI_DMT_PMTT:
> +        case ACPI_DMT_PPTT:
>           case ACPI_DMT_SRAT:
>           case ACPI_DMT_ASF:
>           case ACPI_DMT_HESTNTYP:
> @@ -907,6 +932,7 @@ AcpiDmDumpTable (
>           case ACPI_DMT_UINT16:
>           case ACPI_DMT_DMAR:
>           case ACPI_DMT_HEST:
> +        case ACPI_DMT_HMAT:
>           case ACPI_DMT_NFIT:
>   
>               ByteLength = 2;
> @@ -1088,6 +1114,31 @@ AcpiDmDumpTable (
>               AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
>               break;
>   
> +        case ACPI_DMT_FLAGS4_0:
> +
> +            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
> +            break;
> +
> +        case ACPI_DMT_FLAGS4_4:
> +
> +            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
> +            break;
> +
> +        case ACPI_DMT_FLAGS4_8:
> +
> +            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
> +            break;
> +
> +        case ACPI_DMT_FLAGS4_12:
> +
> +            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
> +            break;
> +
> +        case ACPI_DMT_FLAGS16_16:
> +
> +            AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
> +            break;
> +
>           /* Integer Data Types */
>   
>           case ACPI_DMT_UINT8:
> @@ -1409,6 +1460,20 @@ AcpiDmDumpTable (
>                   AcpiDmHestNotifySubnames[Temp8]);
>               break;
>   
> +        case ACPI_DMT_HMAT:
> +
> +            /* HMAT subtable types */
> +
> +            Temp16 = *Target;
> +            if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
> +            {
> +                Temp16 = ACPI_HMAT_TYPE_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT16_FORMAT, *Target,
> +                AcpiDmHmatSubnames[Temp16]);
> +            break;
> +
>           case ACPI_DMT_IORTMEM:
>   
>               AcpiOsPrintf (STRING_FORMAT,
> @@ -1480,6 +1545,20 @@ AcpiDmDumpTable (
>                   AcpiDmPmttSubnames[Temp8]);
>               break;
>   
> +        case ACPI_DMT_PPTT:
> +
> +            /* PPTT subtable types */
> +
> +            Temp8 = *Target;
> +            if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
> +            {
> +                Temp8 = ACPI_PPTT_TYPE_RESERVED;
> +            }
> +
> +            AcpiOsPrintf (UINT8_FORMAT, *Target,
> +                AcpiDmPpttSubnames[Temp8]);
> +            break;
> +
>           case ACPI_DMT_UNICODE:
>   
>               if (ByteLength == 0)
> diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c
> index e9339a8b..9441ca49 100644
> --- a/src/acpica/source/common/dmtbdump.c
> +++ b/src/acpica/source/common/dmtbdump.c
> @@ -1730,6 +1730,14 @@ AcpiDmDumpHest (
>               SubTableLength = sizeof (ACPI_HEST_GENERIC_V2);
>               break;
>   
> +        case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
> +
> +            InfoTable = AcpiDmTableInfoHest11;
> +            SubTableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
> +            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
> +                SubTable))->NumHardwareBanks;
> +            break;
> +
>           default:
>   
>               /* Cannot continue on unknown type - no length */
> @@ -1784,6 +1792,203 @@ AcpiDmDumpHest (
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiDmDumpHmat
> + *
> + * PARAMETERS:  Table               - A HMAT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a HMAT.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmDumpHmat (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_HMAT_STRUCTURE     *HmatStruct;
> +    ACPI_HMAT_LOCALITY      *HmatLocality;
> +    ACPI_HMAT_CACHE         *HmatCache;
> +    UINT32                  Offset;
> +    UINT32                  SubTableOffset;
> +    UINT32                  Length;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    UINT32                  i, j;
> +
> +
> +    /* Main table */
> +
> +    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return;
> +    }
> +    Offset = sizeof (ACPI_TABLE_HMAT);
> +
> +    while (Offset < Table->Length)
> +    {
> +        AcpiOsPrintf ("\n");
> +        SubTableOffset = 0;
> +
> +        /* Dump HMAT structure header */
> +
> +        HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
> +        if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
> +        {
> +            AcpiOsPrintf ("Invalid HMAT structure length\n");
> +            return;
> +        }
> +        Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
> +            HmatStruct->Length, AcpiDmTableInfoHmatHdr);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        switch (HmatStruct->Type)
> +        {
> +        case ACPI_HMAT_TYPE_ADDRESS_RANGE:
> +
> +            InfoTable = AcpiDmTableInfoHmat0;
> +            Length = sizeof (ACPI_HMAT_ADDRESS_RANGE);
> +            break;
> +
> +        case ACPI_HMAT_TYPE_LOCALITY:
> +
> +            InfoTable = AcpiDmTableInfoHmat1;
> +            Length = sizeof (ACPI_HMAT_LOCALITY);
> +            break;
> +
> +        case ACPI_HMAT_TYPE_CACHE:
> +
> +            InfoTable = AcpiDmTableInfoHmat2;
> +            Length = sizeof (ACPI_HMAT_CACHE);
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
> +                HmatStruct->Type);
> +
> +            /* Attempt to continue */
> +
> +            goto NextSubTable;
> +        }
> +
> +        /* Dump HMAT structure body */
> +
> +        if (HmatStruct->Length < Length)
> +        {
> +            AcpiOsPrintf ("Invalid HMAT structure length\n");
> +            return;
> +        }
> +        Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
> +            HmatStruct->Length, InfoTable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        /* Dump HMAT structure additionals */
> +
> +        switch (HmatStruct->Type)
> +        {
> +        case ACPI_HMAT_TYPE_LOCALITY:
> +
> +            HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
> +            SubTableOffset = sizeof (ACPI_HMAT_LOCALITY);
> +
> +            /* Dump initiator proximity domains */
> +
> +            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
> +                (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
> +            {
> +                AcpiOsPrintf ("Invalid initiator proximity domain number\n");
> +                return;
> +            }
> +            for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
> +            {
> +                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
> +                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
> +                    4, AcpiDmTableInfoHmat1a);
> +                SubTableOffset += 4;
> +            }
> +
> +            /* Dump target proximity domains */
> +
> +            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
> +                (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
> +            {
> +                AcpiOsPrintf ("Invalid target proximity domain number\n");
> +                return;
> +            }
> +            for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
> +            {
> +                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
> +                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
> +                    4, AcpiDmTableInfoHmat1b);
> +                SubTableOffset += 4;
> +            }
> +
> +            /* Dump latency/bandwidth entris */
> +
> +            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
> +                (UINT32)(HmatLocality->NumberOfInitiatorPDs *
> +                         HmatLocality->NumberOfTargetPDs * 2))
> +            {
> +                AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
> +                return;
> +            }
> +            for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
> +            {
> +                for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
> +                {
> +                    Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
> +                        ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
> +                        2, AcpiDmTableInfoHmat1c);
> +                    SubTableOffset += 2;
> +                }
> +            }
> +            break;
> +
> +        case ACPI_HMAT_TYPE_CACHE:
> +
> +            HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
> +            SubTableOffset = sizeof (ACPI_HMAT_CACHE);
> +
> +            /* Dump SMBIOS handles */
> +
> +            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
> +                (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
> +            {
> +                AcpiOsPrintf ("Invalid SMBIOS handle number\n");
> +                return;
> +            }
> +            for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
> +            {
> +                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
> +                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
> +                    2, AcpiDmTableInfoHmat2a);
> +                SubTableOffset += 2;
> +            }
> +            break;
> +
> +        default:
> +
> +            break;
> +        }
> +
> +NextSubTable:
> +        /* Point to next HMAT structure subtable */
> +
> +        Offset += (HmatStruct->Length);
> +    }
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiDmDumpIort
>    *
>    * PARAMETERS:  Table               - A IORT table
> @@ -3010,6 +3215,16 @@ AcpiDmDumpPcct (
>               InfoTable = AcpiDmTableInfoPcct2;
>               break;
>   
> +        case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct3;
> +            break;
> +
> +        case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct4;
> +            break;
> +
>           default:
>   
>               AcpiOsPrintf (
> @@ -3242,6 +3457,136 @@ AcpiDmDumpPmtt (
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiDmDumpPptt
> + *
> + * PARAMETERS:  Table               - A PMTT table
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Format the contents of a PPTT. This table type consists
> + *              of an open-ended number of subtables.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmDumpPptt (
> +    ACPI_TABLE_HEADER       *Table)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_SUBTABLE_HEADER    *SubTable;
> +    ACPI_PPTT_PROCESSOR     *PpttProcessor;
> +    UINT8                   Length;
> +    UINT8                   SubTableOffset;
> +    UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    UINT32                  i;
> +
> +
> +    /* There is no main table (other than the standard ACPI header) */
> +
> +    /* Subtables */
> +
> +    Offset = sizeof (ACPI_TABLE_HEADER);
> +    while (Offset < Table->Length)
> +    {
> +        AcpiOsPrintf ("\n");
> +
> +        /* Common subtable header */
> +
> +        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
> +        if (SubTable->Length < sizeof (ACPI_SUBTABLE_HEADER))
> +        {
> +            AcpiOsPrintf ("Invalid subtable length\n");
> +            return;
> +        }
> +        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
> +            SubTable->Length, AcpiDmTableInfoPpttHdr);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +
> +        switch (SubTable->Type)
> +        {
> +        case ACPI_PPTT_TYPE_PROCESSOR:
> +
> +            InfoTable = AcpiDmTableInfoPptt0;
> +            Length = sizeof (ACPI_PPTT_PROCESSOR);
> +            break;
> +
> +        case ACPI_PPTT_TYPE_CACHE:
> +
> +            InfoTable = AcpiDmTableInfoPptt1;
> +            Length = sizeof (ACPI_PPTT_CACHE);
> +            break;
> +
> +        case ACPI_PPTT_TYPE_ID:
> +
> +            InfoTable = AcpiDmTableInfoPptt2;
> +            Length = sizeof (ACPI_PPTT_ID);
> +            break;
> +
> +        default:
> +
> +            AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
> +                SubTable->Type);
> +
> +            /* Attempt to continue */
> +
> +            goto NextSubTable;
> +        }
> +
> +        if (SubTable->Length < Length)
> +        {
> +            AcpiOsPrintf ("Invalid subtable length\n");
> +            return;
> +        }
> +        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
> +            SubTable->Length, InfoTable);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return;
> +        }
> +        SubTableOffset = Length;
> +
> +        switch (SubTable->Type)
> +        {
> +        case ACPI_PPTT_TYPE_PROCESSOR:
> +
> +            PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, SubTable);
> +
> +            /* Dump SMBIOS handles */
> +
> +            if ((UINT8)(SubTable->Length - SubTableOffset) <
> +                (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
> +            {
> +                AcpiOsPrintf ("Invalid private resource number\n");
> +                return;
> +            }
> +            for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
> +            {
> +                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
> +                    ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTableOffset),
> +                    4, AcpiDmTableInfoPptt0a);
> +                SubTableOffset += 4;
> +            }
> +            break;
> +
> +        default:
> +
> +            break;
> +        }
> +
> +NextSubTable:
> +        /* Point to next subtable */
> +
> +        Offset += SubTable->Length;
> +    }
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiDmDumpS3pt
>    *
>    * PARAMETERS:  Table               - A S3PT table
> @@ -3498,6 +3843,11 @@ AcpiDmDumpSrat (
>               InfoTable = AcpiDmTableInfoSrat3;
>               break;
>   
> +        case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
> +
> +            InfoTable = AcpiDmTableInfoSrat4;
> +            break;
> +
>           default:
>               AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
>                   SubTable->Type);
> diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
> index 4d272678..692763fd 100644
> --- a/src/acpica/source/common/dmtbinfo.c
> +++ b/src/acpica/source/common/dmtbinfo.c
> @@ -204,6 +204,7 @@
>   #define ACPI_GTDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_GTDT,f)
>   #define ACPI_HEST_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_HEST,f)
>   #define ACPI_HPET_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_HPET,f)
> +#define ACPI_HMAT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_HMAT,f)
>   #define ACPI_IORT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_IORT,f)
>   #define ACPI_IVRS_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_IVRS,f)
>   #define ACPI_MADT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_MADT,f)
> @@ -230,6 +231,7 @@
>   #define ACPI_WDDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDDT,f)
>   #define ACPI_WDRT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDRT,f)
>   #define ACPI_WPBT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WPBT,f)
> +#define ACPI_WSMT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WSMT,f)
>   #define ACPI_XENV_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_XENV,f)
>   
>   /* Subtables */
> @@ -273,8 +275,13 @@
>   #define ACPI_HEST8_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_AER_BRIDGE,f)
>   #define ACPI_HEST9_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_GENERIC,f)
>   #define ACPI_HEST10_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_HEST_GENERIC_V2,f)
> +#define ACPI_HEST11_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_HEST_IA_DEFERRED_CHECK,f)
>   #define ACPI_HESTN_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_NOTIFY,f)
>   #define ACPI_HESTB_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_IA_ERROR_BANK,f)
> +#define ACPI_HMAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_ADDRESS_RANGE,f)
> +#define ACPI_HMAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_LOCALITY,f)
> +#define ACPI_HMAT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_CACHE,f)
> +#define ACPI_HMATH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_STRUCTURE,f)
>   #define ACPI_IORT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ITS_GROUP,f)
>   #define ACPI_IORT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT,f)
>   #define ACPI_IORT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ROOT_COMPLEX,f)
> @@ -329,11 +336,17 @@
>   #define ACPI_PCCT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f)
>   #define ACPI_PCCT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f)
>   #define ACPI_PCCT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
> +#define ACPI_PCCT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f)
> +#define ACPI_PCCT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f)
>   #define ACPI_PMTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_SOCKET,f)
>   #define ACPI_PMTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_CONTROLLER,f)
>   #define ACPI_PMTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f)
>   #define ACPI_PMTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_PHYSICAL_COMPONENT,f)
>   #define ACPI_PMTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_HEADER,f)
> +#define ACPI_PPTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
> +#define ACPI_PPTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_PROCESSOR,f)
> +#define ACPI_PPTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE,f)
> +#define ACPI_PPTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_ID,f)
>   #define ACPI_S3PTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
>   #define ACPI_S3PT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
>   #define ACPI_S3PT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
> @@ -343,6 +356,7 @@
>   #define ACPI_SRAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_MEM_AFFINITY,f)
>   #define ACPI_SRAT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f)
>   #define ACPI_SRAT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_GICC_AFFINITY,f)
> +#define ACPI_SRAT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_GIC_ITS_AFFINITY,f)
>   #define ACPI_TCPA_CLIENT_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_CLIENT,f)
>   #define ACPI_TCPA_SERVER_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f)
>   #define ACPI_VRTC0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f)
> @@ -355,11 +369,14 @@
>   
>   /* Flags */
>   
> +#define ACPI_BGRT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_BGRT,f,o)
>   #define ACPI_DRTM_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_DRTM,f,o)
>   #define ACPI_DRTM1a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_DRTM_RESOURCE,f,o)
>   #define ACPI_FADT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_FADT,f,o)
>   #define ACPI_FACS_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_FACS,f,o)
>   #define ACPI_HPET_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_HPET,f,o)
> +#define ACPI_PPTT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_PROCESSOR,f,o)
> +#define ACPI_PPTT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE,f,o)
>   #define ACPI_SRAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_CPU_AFFINITY,f,o)
>   #define ACPI_SRAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_MEM_AFFINITY,f,o)
>   #define ACPI_SRAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f,o)
> @@ -367,6 +384,9 @@
>   #define ACPI_GTDT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_GTDT,f,o)
>   #define ACPI_GTDT0a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_GTDT_TIMER_ENTRY,f,o)
>   #define ACPI_GTDT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_GTDT_WATCHDOG,f,o)
> +#define ACPI_HMAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HMAT_ADDRESS_RANGE,f,o)
> +#define ACPI_HMAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HMAT_LOCALITY,f,o)
> +#define ACPI_HMAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HMAT_CACHE,f,o)
>   #define ACPI_IORT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU,f,o)
>   #define ACPI_IORT3a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_GSI,f,o)
>   #define ACPI_IORT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_V3,f,o)
> @@ -392,13 +412,17 @@
>   #define ACPI_PCCT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_PCCT,f,o)
>   #define ACPI_PCCT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED,f,o)
>   #define ACPI_PCCT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f,o)
> +#define ACPI_PCCT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f,o)
> +#define ACPI_PCCT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f,o)
>   #define ACPI_PMTTH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PMTT_HEADER,f,o)
>   #define ACPI_WDDT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_WDDT,f,o)
> +#define ACPI_WSMT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_WSMT,f,o)
>   #define ACPI_EINJ0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_WHEA_HEADER,f,o)
>   #define ACPI_ERST0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_WHEA_HEADER,f,o)
>   #define ACPI_HEST0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HEST_IA_MACHINE_CHECK,f,o)
>   #define ACPI_HEST1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HEST_IA_CORRECTED,f,o)
>   #define ACPI_HEST6_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HEST_AER_ROOT,f,o)
> +#define ACPI_HEST11_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_HEST_IA_DEFERRED_CHECK,f,o)
>   
>   /*
>    * Required terminator for all tables below
> @@ -780,7 +804,10 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoBert[] =
>   ACPI_DMTABLE_INFO           AcpiDmTableInfoBgrt[] =
>   {
>       {ACPI_DMT_UINT16,   ACPI_BGRT_OFFSET (Version),                 "Version", 0},
> -    {ACPI_DMT_UINT8,    ACPI_BGRT_OFFSET (Status),                  "Status", 0},
> +    {ACPI_DMT_UINT8,    ACPI_BGRT_OFFSET (Status),                  "Status (decoded below)", DT_FLAG},
> +    {ACPI_DMT_FLAG0,    ACPI_BGRT_FLAG_OFFSET (Status, 0),          "Displayed", 0},
> +    {ACPI_DMT_FLAGS1,   ACPI_BGRT_FLAG_OFFSET (Status, 0),          "Orientation Offset", 0},
> +
>       {ACPI_DMT_UINT8,    ACPI_BGRT_OFFSET (ImageType),               "Image Type", 0},
>       {ACPI_DMT_UINT64,   ACPI_BGRT_OFFSET (ImageAddress),            "Image Address", 0},
>       {ACPI_DMT_UINT32,   ACPI_BGRT_OFFSET (ImageOffsetX),            "Image OffsetX", 0},
> @@ -1349,6 +1376,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHest[] =
>       {ACPI_DMT_UINT16,   ACPI_HEST6_OFFSET (Aer.Reserved1),              "Reserved", 0}, \
>       {ACPI_DMT_UINT8,    ACPI_HEST6_OFFSET (Aer.Flags),                  "Flags (decoded below)", DT_FLAG}, \
>       {ACPI_DMT_FLAG0,    ACPI_HEST6_FLAG_OFFSET (Aer.Flags,0),           "Firmware First", 0}, \
> +    {ACPI_DMT_FLAG0,    ACPI_HEST6_FLAG_OFFSET (Aer.Flags,0),           "Global", 0}, \
>       {ACPI_DMT_UINT8,    ACPI_HEST6_OFFSET (Aer.Enabled),                "Enabled", 0}, \
>       {ACPI_DMT_UINT32,   ACPI_HEST6_OFFSET (Aer.RecordsToPreallocate),   "Records To Preallocate", 0}, \
>       {ACPI_DMT_UINT32,   ACPI_HEST6_OFFSET (Aer.MaxSectionsPerRecord),   "Max Sections Per Record", 0}, \
> @@ -1373,6 +1401,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHest0[] =
>       {ACPI_DMT_UINT16,   ACPI_HEST0_OFFSET (Reserved1),              "Reserved1", 0},
>       {ACPI_DMT_UINT8,    ACPI_HEST0_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
>       {ACPI_DMT_FLAG0,    ACPI_HEST0_FLAG_OFFSET (Flags,0),           "Firmware First", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_HEST0_FLAG_OFFSET (Flags,0),           "GHES Assist", 0},
>   
>       {ACPI_DMT_UINT8,    ACPI_HEST0_OFFSET (Enabled),                "Enabled", 0},
>       {ACPI_DMT_UINT32,   ACPI_HEST0_OFFSET (RecordsToPreallocate),   "Records To Preallocate", 0},
> @@ -1392,6 +1421,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHest1[] =
>       {ACPI_DMT_UINT16,   ACPI_HEST1_OFFSET (Reserved1),              "Reserved1", 0},
>       {ACPI_DMT_UINT8,    ACPI_HEST1_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
>       {ACPI_DMT_FLAG0,    ACPI_HEST1_FLAG_OFFSET (Flags,0),           "Firmware First", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_HEST1_FLAG_OFFSET (Flags,0),           "GHES Assist", 0},
>   
>       {ACPI_DMT_UINT8,    ACPI_HEST1_OFFSET (Enabled),                "Enabled", 0},
>       {ACPI_DMT_UINT32,   ACPI_HEST1_OFFSET (RecordsToPreallocate),   "Records To Preallocate", 0},
> @@ -1482,6 +1512,27 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHest10[] =
>       ACPI_DMT_TERMINATOR
>   };
>   
> +/* 11: IA32 Deferred Machine Check */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHest11[] =
> +{
> +    ACPI_DM_HEST_HEADER,
> +    {ACPI_DMT_UINT16,   ACPI_HEST11_OFFSET (Reserved1),             "Reserved1", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HEST11_OFFSET (Flags),                 "Flags (decoded below)", DT_FLAG},
> +    {ACPI_DMT_FLAG0,    ACPI_HEST11_FLAG_OFFSET (Flags,0),          "Firmware First", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_HEST11_FLAG_OFFSET (Flags,0),          "GHES Assist", 0},
> +
> +    {ACPI_DMT_UINT8,    ACPI_HEST11_OFFSET (Enabled),               "Enabled", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HEST11_OFFSET (RecordsToPreallocate),  "Records To Preallocate", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HEST11_OFFSET (MaxSectionsPerRecord),  "Max Sections Per Record", 0},
> +    {ACPI_DMT_HESTNTFY, ACPI_HEST11_OFFSET (Notify),                "Notify", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HEST11_OFFSET (NumHardwareBanks),      "Num Hardware Banks", 0},
> +    {ACPI_DMT_UINT24,   ACPI_HEST11_OFFSET (Reserved2[0]),          "Reserved2", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Notification Structure */
> +
>   ACPI_DMTABLE_INFO           AcpiDmTableInfoHestNotify[] =
>   {
>       {ACPI_DMT_HESTNTYP, ACPI_HESTN_OFFSET (Type),                   "Notify Type", 0},
> @@ -1537,6 +1588,105 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoHpet[] =
>   
>   /*******************************************************************************
>    *
> + * HMAT - Heterogeneous Memory Attributes Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_HMAT_OFFSET (Reserved),                "Reserved", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* Common HMAT structure header (one per Subtable) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmatHdr[] =
> +{
> +    {ACPI_DMT_HMAT,     ACPI_HMATH_OFFSET (Type),                   "Structure Type", 0},
> +    {ACPI_DMT_UINT16,   ACPI_HMATH_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMATH_OFFSET (Length),                 "Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* HMAT subtables */
> +
> +/* 0x00: Memory Subsystem Address Range */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat0[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_HMAT0_OFFSET (Flags),                  "Flags (decoded below)", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_HMAT0_FLAG_OFFSET (Flags,0),           "Processor Proximity Domain Valid", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_HMAT0_FLAG_OFFSET (Flags,0),           "Memory Proximity Domain Valid", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_HMAT0_FLAG_OFFSET (Flags,0),           "Reservation Hint", 0},
> +    {ACPI_DMT_UINT16,   ACPI_HMAT0_OFFSET (Reserved1),              "Reserved1", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMAT0_OFFSET (ProcessorPD),            "Processor Proximity Domain", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMAT0_OFFSET (MemoryPD),               "Memory Proximity Domain", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMAT0_OFFSET (Reserved2),              "Reserved2", 0},
> +    {ACPI_DMT_UINT64,   ACPI_HMAT0_OFFSET (PhysicalAddressBase),    "Physical Address Range Base", 0},
> +    {ACPI_DMT_UINT64,   ACPI_HMAT0_OFFSET (PhysicalAddressLength),  "Physical Address Range Size", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x01: System Locality Latency and Bandwidth Information */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1[] =
> +{
> +    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Flags),                  "Flags (decoded below)", 0},
> +    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},
> +    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (DataType),               "Data Type", 0},
> +    {ACPI_DMT_UINT16,   ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfInitiatorPDs),   "Initiator Proximity Domains #", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfTargetPDs),      "Target Proximity Domains #", 0},
> +    {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (Reserved2),              "Reserved2", 0},
> +    {ACPI_DMT_UINT64,   ACPI_HMAT1_OFFSET (EntryBaseUnit),          "Entry Base Unit", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1a[] =
> +{
> +    {ACPI_DMT_UINT32,   0,                                          "Initiator Proximity Domain List", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1b[] =
> +{
> +    {ACPI_DMT_UINT32,   0,                                          "Target Proximity Domain List", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1c[] =
> +{
> +    {ACPI_DMT_UINT16,   0,                                          "Entry", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0x02: Memory Side Cache Information */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat2[] =
> +{
> +    {ACPI_DMT_UINT32,       ACPI_HMAT2_OFFSET (MemoryPD),               "Memory Proximity Domain", 0},
> +    {ACPI_DMT_UINT32,       ACPI_HMAT2_OFFSET (Reserved1),              "Reserved1", 0},
> +    {ACPI_DMT_UINT64,       ACPI_HMAT2_OFFSET (CacheSize),              "Memory Side Cache Size", 0},
> +    {ACPI_DMT_UINT32,       ACPI_HMAT2_OFFSET (CacheAttributes),        "Cache Attributes (decoded below)", 0},
> +    {ACPI_DMT_FLAGS4_0,     ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Total Cache Levels", 0},
> +    {ACPI_DMT_FLAGS4_4,     ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Cache Level", 0},
> +    {ACPI_DMT_FLAGS4_8,     ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Cache Associativity", 0},
> +    {ACPI_DMT_FLAGS4_12,    ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Write Policy", 0},
> +    {ACPI_DMT_FLAGS16_16,   ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Cache Line Size", 0},
> +    {ACPI_DMT_UINT16,       ACPI_HMAT2_OFFSET (Reserved2),              "Reserved2", 0},
> +    {ACPI_DMT_UINT16,       ACPI_HMAT2_OFFSET (NumberOfSMBIOSHandles),  "SMBIOS Handle #", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat2a[] =
> +{
> +    {ACPI_DMT_UINT16,   0,                                          "SMBIOS Handle", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
> +/*******************************************************************************
> + *
>    * IORT - IO Remapping Table
>    *
>    ******************************************************************************/
> @@ -2406,7 +2556,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit6a[] =
>   ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct[] =
>   {
>       {ACPI_DMT_UINT32,   ACPI_PCCT_OFFSET (Flags),                   "Flags (decoded below)", DT_FLAG},
> -    {ACPI_DMT_FLAG0,    ACPI_PCCT_FLAG_OFFSET (Flags,0),            "Doorbell", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_PCCT_FLAG_OFFSET (Flags,0),            "Platform", 0},
>       {ACPI_DMT_UINT64,   ACPI_PCCT_OFFSET (Reserved),                "Reserved", 0},
>       ACPI_DMT_TERMINATOR
>   };
> @@ -2440,7 +2590,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct0[] =
>   
>   ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct1[] =
>   {
> -    {ACPI_DMT_UINT32,   ACPI_PCCT1_OFFSET (DoorbellInterrupt),      "Doorbell Interrupt", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT1_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
>       {ACPI_DMT_UINT8,    ACPI_PCCT1_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
>       {ACPI_DMT_FLAG0,    ACPI_PCCT1_FLAG_OFFSET (Flags,0),           "Polarity", 0},
>       {ACPI_DMT_FLAG1,    ACPI_PCCT1_FLAG_OFFSET (Flags,0),           "Mode", 0},
> @@ -2460,7 +2610,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct1[] =
>   
>   ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct2[] =
>   {
> -    {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (DoorbellInterrupt),      "Doorbell Interrupt", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
>       {ACPI_DMT_UINT8,    ACPI_PCCT2_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
>       {ACPI_DMT_FLAG0,    ACPI_PCCT2_FLAG_OFFSET (Flags,0),           "Polarity", 0},
>       {ACPI_DMT_FLAG1,    ACPI_PCCT2_FLAG_OFFSET (Flags,0),           "Mode", 0},
> @@ -2473,12 +2623,73 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct2[] =
>       {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (Latency),                "Command Latency", 0},
>       {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (MaxAccessRate),          "Maximum Access Rate", 0},
>       {ACPI_DMT_UINT16,   ACPI_PCCT2_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
> -    {ACPI_DMT_GAS,      ACPI_PCCT2_OFFSET (DoorbellAckRegister),    "Doorbell ACK Register", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT2_OFFSET (PlatformAckRegister),    "Platform ACK Register", 0},
>       {ACPI_DMT_UINT64,   ACPI_PCCT2_OFFSET (AckPreserveMask),        "ACK Preserve Mask", 0},
>       {ACPI_DMT_UINT64,   ACPI_PCCT2_OFFSET (AckWriteMask),           "ACK Write Mask", 0},
>       ACPI_DMT_TERMINATOR
>   };
>   
> +/* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct3[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PCCT3_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
> +    {ACPI_DMT_FLAG0,    ACPI_PCCT3_FLAG_OFFSET (Flags,0),           "Polarity", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_PCCT3_FLAG_OFFSET (Flags,0),           "Mode", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PCCT3_OFFSET (Reserved1),              "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (BaseAddress),            "Base Address", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (Length),                 "Address Length", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (PreserveMask),           "Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (WriteMask),              "Write Mask", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (Latency),                "Command Latency", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (MaxAccessRate),          "Maximum Access Rate", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (PlatformAckRegister),    "Platform ACK Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (AckPreserveMask),        "ACK Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (AckSetMask),             "ACK Set Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (Reserved2),              "Reserved", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (CmdUpdateRegister),      "Command Update Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (CmdUpdatePreserveMask),  "Command Update Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (CmdUpdateSetMask),       "Command Update Set Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct4[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PCCT4_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
> +    {ACPI_DMT_FLAG0,    ACPI_PCCT4_FLAG_OFFSET (Flags,0),           "Polarity", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_PCCT4_FLAG_OFFSET (Flags,0),           "Mode", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PCCT4_OFFSET (Reserved1),              "Reserved", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (BaseAddress),            "Base Address", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (Length),                 "Address Length", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (PreserveMask),           "Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (WriteMask),              "Write Mask", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (Latency),                "Command Latency", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (MaxAccessRate),          "Maximum Access Rate", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (PlatformAckRegister),    "Platform ACK Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (AckPreserveMask),        "ACK Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (AckSetMask),             "ACK Set Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (Reserved2),              "Reserved", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (CmdUpdateRegister),      "Command Update Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (CmdUpdatePreserveMask),  "Command Update Preserve Mask", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (CmdUpdateSetMask),       "Command Update Set Mask", 0},
> +    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
> +    ACPI_DMT_TERMINATOR
> +};
>   
>   /*******************************************************************************
>    *
> @@ -2555,6 +2766,82 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
>   
>   /*******************************************************************************
>    *
> + * PPTT - Processor Properties Topology Table (ACPI 6.2)
> + *
> + ******************************************************************************/
> +
> +/* Main table consists of only the standard ACPI header - subtables follow */
> +
> +/* Common Subtable header (one per Subtable) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPpttHdr[] =
> +{
> +    {ACPI_DMT_PPTT,     ACPI_PPTTH_OFFSET (Type),                   "Subtable Type", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PPTTH_OFFSET (Length),                 "Length", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 0: Processor hierarchy node */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt0[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PPTT0_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (Flags),                  "Flags", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_PPTT0_FLAG_OFFSET (Flags,0),           "Physical package", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_PPTT0_FLAG_OFFSET (Flags,0),           "ACPI Processor ID valid", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (Parent),                 "Parent", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (AcpiProcessorId),        "ACPI Processor ID", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (NumberOfPrivResources),  "Private Resource Number", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt0a[] =
> +{
> +    {ACPI_DMT_UINT32,   0,                                          "Private Resource", DT_OPTIONAL},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 1: Cache type */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PPTT1_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Flags),                  "Flags", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Size valid", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Number of Sets valid", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Associativity valid", 0},
> +    {ACPI_DMT_FLAG3,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Allocation Type valid", 0},
> +    {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
> +    {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
> +    {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PPTT1_OFFSET (Associativity),          "Associativity", 0},
> +    {ACPI_DMT_UINT8,    ACPI_PPTT1_OFFSET (Attributes),             "Attributes", 0},
> +    {ACPI_DMT_FLAGS0,   ACPI_PPTT1_OFFSET (Attributes),             "Allocation Type", 0},
> +    {ACPI_DMT_FLAGS2,   ACPI_PPTT1_OFFSET (Attributes),             "Cache Type", 0},
> +    {ACPI_DMT_FLAG4,    ACPI_PPTT1_OFFSET (Attributes),             "Write Policy", 0},
> +    {ACPI_DMT_UINT16,   ACPI_PPTT1_OFFSET (LineSize),               "Line Size", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/* 2: ID */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt2[] =
> +{
> +    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_PPTT2_OFFSET (VendorId),               "VENDOR_ID", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PPTT2_OFFSET (Level1Id),               "LEVEL_1_ID", 0},
> +    {ACPI_DMT_UINT64,   ACPI_PPTT2_OFFSET (Level2Id),               "LEVEL_2_ID", 0},
> +    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (MajorRev),               "MAJOR_REV", 0},
> +    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (MinorRev),               "MINOR_REV", 0},
> +    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (SpinRev),                "SPIN_REV", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +/*******************************************************************************
> + *
>    * RASF -  RAS Feature table
>    *
>    ******************************************************************************/
> @@ -2779,7 +3066,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat2[] =
>       ACPI_DMT_TERMINATOR
>   };
>   
> -/* : GICC Affinity (ACPI 5.1) */
> +/* 3: GICC Affinity (ACPI 5.1) */
>   
>   ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat3[] =
>   {
> @@ -2791,6 +3078,16 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat3[] =
>       ACPI_DMT_TERMINATOR
>   };
>   
> +/* 4: GCC ITS Affinity (ACPI 6.2) */
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat4[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_SRAT4_OFFSET (ProximityDomain),        "Proximity Domain", 0},
> +    {ACPI_DMT_UINT16,   ACPI_SRAT4_OFFSET (Reserved),               "Reserved", 0},
> +    {ACPI_DMT_UINT32,   ACPI_SRAT4_OFFSET (ItsId),                  "ITS ID", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
>   
>   /*******************************************************************************
>    *
> @@ -3058,6 +3355,22 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoWpbt0[] =
>   
>   /*******************************************************************************
>    *
> + * WSMT - Windows SMM Security Migrations Table
> + *
> + ******************************************************************************/
> +
> +ACPI_DMTABLE_INFO           AcpiDmTableInfoWsmt[] =
> +{
> +    {ACPI_DMT_UINT32,   ACPI_WSMT_OFFSET (ProtectionFlags),         "Protection Flags", 0},
> +    {ACPI_DMT_FLAG0,    ACPI_WSMT_FLAG_OFFSET (ProtectionFlags,0),  "FIXED_COMM_BUFFERS", 0},
> +    {ACPI_DMT_FLAG1,    ACPI_WSMT_FLAG_OFFSET (ProtectionFlags,0),  "COMM_BUFFER_NESTED_PTR_PROTECTION", 0},
> +    {ACPI_DMT_FLAG2,    ACPI_WSMT_FLAG_OFFSET (ProtectionFlags,0),  "SYSTEM_RESOURCE_PROTECTION", 0},
> +    ACPI_DMT_TERMINATOR
> +};
> +
> +
> +/*******************************************************************************
> + *
>    * XENV -  Xen Environment table (ACPI 6.0)
>    *
>    ******************************************************************************/
> diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
> index ba5fe773..382fc07d 100644
> --- a/src/acpica/source/compiler/Makefile.am
> +++ b/src/acpica/source/compiler/Makefile.am
> @@ -235,6 +235,7 @@ libfwtsiasl_la_SOURCES = 			\
>   	../common/cmfsize.c			\
>   	../common/dmextern.c 			\
>   	../common/dmrestag.c 			\
> +	../common/dmswitch.c			\
>   	../common/dmtable.c 			\
>   	../common/dmtables.c			\
>   	../common/dmtbinfo.c 			\
> diff --git a/src/acpica/source/compiler/aslascii.c b/src/acpica/source/compiler/aslascii.c
> index afaee56f..18bcd28f 100644
> --- a/src/acpica/source/compiler/aslascii.c
> +++ b/src/acpica/source/compiler/aslascii.c
> @@ -194,7 +194,7 @@ FlIsFileAsciiSource (
>       BOOLEAN                 DisplayErrors)
>   {
>       UINT8                   Byte;
> -    ACPI_SIZE               BadBytes = 0;
> +    UINT32                  BadBytes = 0;
>       BOOLEAN                 OpeningComment = FALSE;
>       ASL_FILE_STATUS         Status;
>       FILE                    *Handle;
> @@ -285,6 +285,9 @@ FlIsFileAsciiSource (
>   
>       if (BadBytes)
>       {
> +        fprintf (stderr,
> +            "File appears to be binary: found %u non-ASCII characters, disassembling\n",
> +            BadBytes);
>           if (DisplayErrors)
>           {
>               AcpiOsPrintf (
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 9c2a244a..181fc364 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -568,7 +568,7 @@ AslCompilerSignon (
>   
>       /* Running compiler or disassembler? */
>   
> -    if (Gbl_DisasmFlag)
> +    if (AcpiGbl_DisasmFlag)
>       {
>           UtilityName = AML_DISASSEMBLER_NAME;
>       }
> diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
> index 4c6ba020..07a7d512 100644
> --- a/src/acpica/source/compiler/aslcompiler.h
> +++ b/src/acpica/source/compiler/aslcompiler.h
> @@ -1398,6 +1398,26 @@ ASL_RESOURCE_NODE *
>   RsDoUartSerialBusDescriptor (
>       ASL_RESOURCE_INFO       *Info);
>   
> +ASL_RESOURCE_NODE *
> +RsDoPinFunctionDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinConfigDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinGroupDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinGroupFunctionDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinGroupConfigDescriptor (
> +    ASL_RESOURCE_INFO       *Info);
> +
>   /*
>    * aslrestype2d - DWord address descriptors
>    */
> diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
> index a9d595ab..4b36058b 100644
> --- a/src/acpica/source/compiler/aslcompiler.l
> +++ b/src/acpica/source/compiler/aslcompiler.l
> @@ -455,6 +455,11 @@ NamePathTail                [.]{NameSeg}
>   "Memory24"                  { count (1); return (PARSEOP_MEMORY24); }
>   "Memory32"                  { count (1); return (PARSEOP_MEMORY32); }
>   "Memory32Fixed"             { count (1); return (PARSEOP_MEMORY32FIXED); }
> +"PinConfig"                 { count (1); return (PARSEOP_PINCONFIG); }
> +"PinFunction"               { count (1); return (PARSEOP_PINFUNCTION); }
> +"PinGroup"                  { count (1); return (PARSEOP_PINGROUP); }
> +"PinGroupConfig"            { count (1); return (PARSEOP_PINGROUPCONFIG); }
> +"PinGroupFunction"          { count (1); return (PARSEOP_PINGROUPFUNCTION); }
>   "QWordIO"                   { count (1); return (PARSEOP_QWORDIO); }
>   "QWordMemory"               { count (1); return (PARSEOP_QWORDMEMORY); }
>   "QWordSpace"                { count (1); return (PARSEOP_QWORDSPACE); }
> diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h
> index 3333562b..2b6d73d6 100644
> --- a/src/acpica/source/compiler/asldefine.h
> +++ b/src/acpica/source/compiler/asldefine.h
> @@ -161,8 +161,8 @@
>   #define ASL_INVOCATION_NAME         "iasl"
>   #define ASL_CREATOR_ID              "INTL"
>   #define ASL_DEFINE                  "__IASL__"
> -
> -#define ASL_COMPLIANCE              "Supports ACPI Specification Revision 6.1"
> +#define ASL_PREFIX                  "iASL: "
> +#define ASL_COMPLIANCE              "Supports ACPI Specification Revision 6.2"
>   
>   
>   /* Configuration constants */
> diff --git a/src/acpica/source/compiler/aslexternal.c b/src/acpica/source/compiler/aslexternal.c
> index 20fcc9ec..67a95e56 100644
> --- a/src/acpica/source/compiler/aslexternal.c
> +++ b/src/acpica/source/compiler/aslexternal.c
> @@ -435,6 +435,7 @@ ExMoveExternals (
>       ACPI_PARSE_OBJECT       *Next;
>       char                    *ExternalName;
>       ACPI_OBJECT_TYPE        ObjType;
> +    ACPI_STATUS             Status;
>       UINT32                  i;
>   
>   
> @@ -473,8 +474,16 @@ ExMoveExternals (
>           {
>               Next->Asl.ParseOpcode = PARSEOP_NAMESTRING;
>           }
> +
>           Next->Asl.ExternalName = ExternalName;
> -        UtInternalizeName (ExternalName, &Next->Asl.Value.String);
> +        Status = UtInternalizeName (ExternalName, &Next->Asl.Value.String);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
> +                Next, "Could not internalize namestring");
> +            return;
> +        }
> +
>           Next->Asl.AmlLength = strlen (Next->Asl.Value.String);
>   
>           Next = Next->Asl.Next;
> diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
> index a4955527..16b798c1 100644
> --- a/src/acpica/source/compiler/aslglobal.h
> +++ b/src/acpica/source/compiler/aslglobal.h
> @@ -275,7 +275,6 @@ ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_VerboseErrors, TRUE);
>   ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_NoErrors, FALSE);
>   ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_WarningsAsErrors, FALSE);
>   ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_NoResourceChecking, FALSE);
> -ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_DisasmFlag, FALSE);
>   ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_IntegerOptimizationFlag, TRUE);
>   ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_ReferenceOptimizationFlag, TRUE);
>   ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_DisplayRemarks, TRUE);
> diff --git a/src/acpica/source/compiler/aslhelpers.y b/src/acpica/source/compiler/aslhelpers.y
> index f9965060..f200bf2b 100644
> --- a/src/acpica/source/compiler/aslhelpers.y
> +++ b/src/acpica/source/compiler/aslhelpers.y
> @@ -330,6 +330,15 @@ OptionalResourceType
>       | ',' ResourceTypeKeyword       {$$ = $2;}
>       ;
>   
> +/* Same as above except default is producer */
> +OptionalProducerResourceType
> +    :                               {$$ = TrCreateLeafNode (
> +                                        PARSEOP_RESOURCETYPE_PRODUCER);}
> +    | ','                           {$$ = TrCreateLeafNode (
> +                                        PARSEOP_RESOURCETYPE_PRODUCER);}
> +    | ',' ResourceTypeKeyword       {$$ = $2;}
> +    ;
> +
>   OptionalSlaveMode
>       : ','                           {$$ = NULL;}
>       | ',' SlaveModeKeyword          {$$ = $2;}
> diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c
> index dfe4ca4d..bd564b33 100644
> --- a/src/acpica/source/compiler/aslload.c
> +++ b/src/acpica/source/compiler/aslload.c
> @@ -315,13 +315,20 @@ LdLoadFieldElements (
>                           Child->Asl.Value.String);
>                       return (Status);
>                   }
> -
> -                /*
> -                 * The name already exists in this scope
> -                 * But continue processing the elements
> -                 */
> -                AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
> -                    Child->Asl.Value.String);
> +                else if (Status == AE_ALREADY_EXISTS &&
> +                    (Node->Flags & ANOBJ_IS_EXTERNAL))
> +                {
> +                    Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD;
> +                }
> +                else
> +                {
> +                    /*
> +                     * The name already exists in this scope
> +                     * But continue processing the elements
> +                     */
> +                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
> +                        Child->Asl.Value.String);
> +                }
>               }
>               else
>               {
> @@ -458,12 +465,30 @@ LdNamespace1Begin (
>       ACPI_PARSE_OBJECT       *Arg;
>       UINT32                  i;
>       BOOLEAN                 ForceNewScope = FALSE;
> +    ACPI_OWNER_ID           OwnerId = 0;
>   
>   
>       ACPI_FUNCTION_NAME (LdNamespace1Begin);
>       ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
>           Op, Op->Asl.ParseOpName));
>   
> +    if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
> +    {
> +        /*
> +         * Allocate an OwnerId for this block. This helps identify the owners
> +         * of each namespace node. This is used in determining whether if
> +         * certain external declarations cause redefinition errors.
> +         */
> +        Status = AcpiUtAllocateOwnerId (&OwnerId);
> +        WalkState->OwnerId = OwnerId;
> +        if (ACPI_FAILURE (Status))
> +        {
> +            AslCoreSubsystemError (Op, Status,
> +                "Failure to allocate owner ID to this definition block.", FALSE);
> +            return_ACPI_STATUS (Status);
> +        }
> +    }
> +
>       /*
>        * We are only interested in opcodes that have an associated name
>        * (or multiple names)
> @@ -778,7 +803,9 @@ LdNamespace1Begin (
>               {
>                   /*
>                    * Allow one create on an object or segment that was
> -                 * previously declared External
> +                 * previously declared External only if WalkState->OwnerId and
> +                 * Node->OwnerId are found in different tables (meaning that
> +                 * they have differnt OwnerIds).
>                    */
>                   Node->Flags &= ~ANOBJ_IS_EXTERNAL;
>                   Node->Type = (UINT8) ObjectType;
> @@ -795,6 +822,12 @@ LdNamespace1Begin (
>                   }
>   
>                   Status = AE_OK;
> +
> +                if (Node->OwnerId == WalkState->OwnerId)
> +                {
> +                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
> +                        Op->Asl.ExternalName);
> +                }
>               }
>               else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
>                        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
> @@ -802,15 +835,52 @@ LdNamespace1Begin (
>                   /*
>                    * Allow externals in same scope as the definition of the
>                    * actual object. Similar to C. Allows multiple definition
> -                 * blocks that refer to each other in the same file.
> +                 * blocks that refer to each other in the same file. However,
> +                 * do not allow name declaration and an external declaration
> +                 * within the same table. This is considered a re-declaration.
>                    */
>                   Status = AE_OK;
> +
> +                if (Node->OwnerId == WalkState->OwnerId)
> +                {
> +                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
> +                        Op->Asl.ExternalName);
> +                }
>               }
>               else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
>                        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
>                        (ObjectType == ACPI_TYPE_ANY))
>               {
> -                /* Allow update of externals of unknown type. */
> +                /*
> +                 * Allow update of externals of unknown type.
> +                 * In the case that multiple definition blocks are being
> +                 * parsed, updating the OwnerId allows enables subsequent calls
> +                 * of this method to understand which table the most recent
> +                 * external declaration was seen. Without this OwnerId update,
> +                 * code like the following is allowed to compile:
> +                 *
> +                 * DefinitionBlock("externtest.aml", "DSDT", 0x02, "Intel", "Many", 0x00000001)
> +                 * {
> +                 *     External(ERRS,methodobj)
> +                 *     Method (MAIN)
> +                 *     {
> +                 *         Name(NUM2, 0)
> +                 *         ERRS(1,2,3)
> +                 *     }
> +                 * }
> +                 *
> +                 * DefinitionBlock("externtest.aml", "SSDT", 0x02, "Intel", "Many", 0x00000001)
> +                 * {
> +                 *     if (0)
> +                 *     {
> +                 *         External(ERRS,methodobj)
> +                 *     }
> +                 *     Method (ERRS,3)
> +                 *     {}
> +                 *
> +                 * }
> +                 */
> +                Node->OwnerId = WalkState->OwnerId;
>   
>                   if (AcpiNsOpensScope (ActualObjectType))
>                   {
> diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
> index a282b0c4..10251fb2 100644
> --- a/src/acpica/source/compiler/aslmain.c
> +++ b/src/acpica/source/compiler/aslmain.c
> @@ -207,6 +207,9 @@ main (
>       int                     ReturnStatus = 0;
>   
>   
> +    signal (SIGINT, AslSignalHandler);
> +    signal (SIGSEGV, AslSignalHandler);
> +
>       /*
>        * Big-endian machines are not currently supported. ACPI tables must
>        * be little-endian, and support for big-endian machines needs to
> @@ -224,7 +227,6 @@ main (
>   
>       /* Initialize preprocessor and compiler before command line processing */
>   
> -    signal (SIGINT, AslSignalHandler);
>       AcpiGbl_ExternalFileList = NULL;
>       AcpiDbgLevel = 0;
>       PrInitializePreprocessor ();
> @@ -254,6 +256,7 @@ main (
>           }
>       }
>   
> +
>       /* Process each pathname/filename in the list, with possible wildcards */
>   
>       while (argv[Index2])
> @@ -301,8 +304,10 @@ CleanupAndExit:
>    *
>    * RETURN:      None
>    *
> - * DESCRIPTION: Control-C handler. Delete any intermediate files and any
> - *              output files that may be left in an indeterminate state.
> + * DESCRIPTION: Signal interrupt handler. Delete any intermediate files and
> + *              any output files that may be left in an indeterminate state.
> + *              Currently handles SIGINT (control-c) and SIGSEGV (segmentation
> + *              fault).
>    *
>    *****************************************************************************/
>   
> @@ -314,11 +319,34 @@ AslSignalHandler (
>   
>   
>       signal (Sig, SIG_IGN);
> -    printf ("Aborting\n\n");
> +    fflush (stdout);
> +    fflush (stderr);
> +
> +    switch (Sig)
> +    {
> +    case SIGINT:
> +
> +        printf ("\n" ASL_PREFIX "<Control-C>\n");
> +        break;
>   
> -    /* Close all open files */
> +    case SIGSEGV:
>   
> -    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .pre file is same as source file */
> +        /* Even on a seg fault, we will try to delete any partial files */
> +
> +        printf (ASL_PREFIX "Segmentation Fault\n");
> +        break;
> +
> +    default:
> +
> +        printf (ASL_PREFIX "Unknown interrupt signal (%u), ignoring\n", Sig);
> +        return;
> +    }
> +
> +    /*
> +     * Close all open files
> +     * Note: the .pre file is the same as the input source file
> +     */
> +    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
>   
>       for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
>       {
> @@ -332,6 +360,7 @@ AslSignalHandler (
>           FlDeleteFile (i);
>       }
>   
> +    printf (ASL_PREFIX "Terminating\n");
>       exit (0);
>   }
>   
> diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
> index f3c04797..aed87661 100644
> --- a/src/acpica/source/compiler/aslmap.c
> +++ b/src/acpica/source/compiler/aslmap.c
> @@ -451,6 +451,11 @@ const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
>   /* PARITYTYPE_NONE */           OP_TABLE_ENTRY (AML_BYTE_OP,                0,                              0,                  0),
>   /* PARITYTYPE_ODD */            OP_TABLE_ENTRY (AML_BYTE_OP,                2,                              0,                  0),
>   /* PARITYTYPE_SPACE */          OP_TABLE_ENTRY (AML_BYTE_OP,                4,                              0,                  0),
> +/* PINCONFIG */                 OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
> +/* PINFUNCTION */               OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
> +/* PINGROUP */                  OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
> +/* PINGROUPCONFIG */            OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
> +/* PINGROUPFUNCTION */          OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
>   /* PIN_NOPULL */                OP_TABLE_ENTRY (AML_BYTE_OP,                3,                              0,                  0),
>   /* PIN_PULLDEFAULT */           OP_TABLE_ENTRY (AML_BYTE_OP,                0,                              0,                  0),
>   /* PIN_PULLDOWN */              OP_TABLE_ENTRY (AML_BYTE_OP,                2,                              0,                  0),
> diff --git a/src/acpica/source/compiler/asloffset.c b/src/acpica/source/compiler/asloffset.c
> index e3fdf1c9..0964d4fe 100644
> --- a/src/acpica/source/compiler/asloffset.c
> +++ b/src/acpica/source/compiler/asloffset.c
> @@ -250,7 +250,6 @@ LsAmlOffsetWalk (
>           }
>   
>           Length = Op->Asl.FinalAmlLength;
> -        NamepathOffset = Gbl_CurrentAmlOffset + Length;
>   
>           /* Get to the NameSeg/NamePath Op (and length of the name) */
>   
> diff --git a/src/acpica/source/compiler/aslparser.y b/src/acpica/source/compiler/aslparser.y
> index 72043ae0..6426cebe 100644
> --- a/src/acpica/source/compiler/aslparser.y
> +++ b/src/acpica/source/compiler/aslparser.y
> @@ -208,7 +208,7 @@ AslLocalAllocate (
>    * These shift/reduce conflicts are expected. There should be zero
>    * reduce/reduce conflicts.
>    */
> -%expect 102
> +%expect 118
>   
>   /*! [Begin] no source code translation */
>   
> diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
> index f12795a5..42931452 100644
> --- a/src/acpica/source/compiler/aslresource.c
> +++ b/src/acpica/source/compiler/aslresource.c
> @@ -990,6 +990,31 @@ RsDoOneResourceDescriptor (
>           Rnode = RsDoUartSerialBusDescriptor (Info);
>           break;
>   
> +    case PARSEOP_PINCONFIG:
> +
> +        Rnode = RsDoPinConfigDescriptor (Info);
> +        break;
> +
> +    case PARSEOP_PINFUNCTION:
> +
> +        Rnode = RsDoPinFunctionDescriptor (Info);
> +        break;
> +
> +    case PARSEOP_PINGROUP:
> +
> +        Rnode = RsDoPinGroupDescriptor (Info);
> +        break;
> +
> +    case PARSEOP_PINGROUPFUNCTION:
> +
> +        Rnode = RsDoPinGroupFunctionDescriptor (Info);
> +        break;
> +
> +    case PARSEOP_PINGROUPCONFIG:
> +
> +        Rnode = RsDoPinGroupConfigDescriptor (Info);
> +        break;
> +
>       case PARSEOP_DEFAULT_ARG:
>   
>           /* Just ignore any of these, they are used as fillers/placeholders */
> diff --git a/src/acpica/source/compiler/aslresources.y b/src/acpica/source/compiler/aslresources.y
> index d14fdd45..fc70940c 100644
> --- a/src/acpica/source/compiler/aslresources.y
> +++ b/src/acpica/source/compiler/aslresources.y
> @@ -211,6 +211,11 @@ ResourceMacroTerm
>       | Memory24Term                  {}
>       | Memory32FixedTerm             {}
>       | Memory32Term                  {}
> +    | PinConfigTerm                 {}
> +    | PinFunctionTerm               {}
> +    | PinGroupTerm                  {}
> +    | PinGroupConfigTerm            {}
> +    | PinGroupFunctionTerm          {}
>       | QWordIOTerm                   {}
>       | QWordMemoryTerm               {}
>       | QWordSpaceTerm                {}
> @@ -605,6 +610,95 @@ Memory32Term
>           error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
>       ;
>   
> +PinConfigTerm
> +    : PARSEOP_PINCONFIG
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINCONFIG);}
> +        OptionalShareType_First     /* 04: SharedType */
> +        ',' ByteConstExpr           /* 06: PinConfigType */
> +        ',' DWordConstExpr          /* 08: PinConfigValue */
> +        ',' StringData              /* 10: ResourceSource */
> +        OptionalByteConstExpr       /* 11: ResourceSourceIndex */
> +        OptionalResourceType        /* 12: ResourceType */
> +        OptionalNameString          /* 13: DescriptorName */
> +        OptionalBuffer_Last         /* 14: VendorData */
> +        PARSEOP_CLOSE_PAREN '{'
> +            DWordList '}'           {$$ = TrLinkChildren ($<n>3,9,
> +                                        $4,$6,$8,$10,$11,$12,$13,$14,$17);}
> +    | PARSEOP_PINCONFIG
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +    ;
> +
> +PinFunctionTerm
> +    : PARSEOP_PINFUNCTION
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINFUNCTION);}
> +        OptionalShareType_First     /* 04: SharedType */
> +        ',' PinConfigByte           /* 06: PinConfig */
> +        ',' WordConstExpr           /* 08: FunctionNumber */
> +        ',' StringData              /* 10: ResourceSource */
> +        OptionalByteConstExpr       /* 11: ResourceSourceIndex */
> +        OptionalResourceType        /* 12: ResourceType */
> +        OptionalNameString          /* 13: DescriptorName */
> +        OptionalBuffer_Last         /* 14: VendorData */
> +        PARSEOP_CLOSE_PAREN '{'
> +            DWordList '}'           {$$ = TrLinkChildren ($<n>3,9,
> +                                        $4,$6,$8,$10,$11,$12,$13,$14,$17);}
> +    | PARSEOP_PINFUNCTION
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +    ;
> +
> +PinGroupTerm
> +    : PARSEOP_PINGROUP
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINGROUP);}
> +        StringData                  /* 04: ResourceLabel */
> +        OptionalProducerResourceType /* 05: ResourceType */
> +        OptionalNameString          /* 06: DescriptorName */
> +        OptionalBuffer_Last         /* 07: VendorData */
> +        PARSEOP_CLOSE_PAREN '{'
> +            DWordList '}'           {$$ = TrLinkChildren ($<n>3,5,$4,$5,$6,$7,$10);}
> +    | PARSEOP_PINGROUP
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +    ;
> +
> +PinGroupConfigTerm
> +    : PARSEOP_PINGROUPCONFIG
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINGROUPCONFIG);}
> +        OptionalShareType_First     /* 04: SharedType */
> +        ',' ByteConstExpr           /* 06: PinConfigType */
> +        ',' DWordConstExpr          /* 08: PinConfigValue */
> +        ',' StringData              /* 10: ResourceSource */
> +        OptionalByteConstExpr       /* 11: ResourceSourceIndex */
> +        ',' StringData              /* 13: ResourceSourceLabel */
> +        OptionalResourceType        /* 14: ResourceType */
> +        OptionalNameString          /* 15: DescriptorName */
> +        OptionalBuffer_Last         /* 16: VendorData */
> +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,9,
> +                                        $4,$6,$8,$10,$11,$13,$14,$15,$16);}
> +    | PARSEOP_PINGROUPCONFIG
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +    ;
> +
> +PinGroupFunctionTerm
> +    : PARSEOP_PINGROUPFUNCTION
> +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINGROUPFUNCTION);}
> +        OptionalShareType_First     /* 04: SharedType */
> +        ',' WordConstExpr           /* 06: FunctionNumber */
> +        ',' StringData              /* 08: ResourceSource */
> +        OptionalByteConstExpr       /* 09: ResourceSourceIndex */
> +        ',' StringData              /* 11: ResourceSourceLabel */
> +        OptionalResourceType        /* 12: ResourceType */
> +        OptionalNameString          /* 13: DescriptorName */
> +        OptionalBuffer_Last         /* 14: VendorData */
> +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,8,
> +                                        $4,$6,$8,$9,$11,$12,$13,$14);}
> +    | PARSEOP_PINGROUPFUNCTION
> +        PARSEOP_OPEN_PAREN
> +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
> +    ;
> +
>   QWordIOTerm
>       : PARSEOP_QWORDIO
>           PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDIO);}
> diff --git a/src/acpica/source/compiler/aslrestype2s.c b/src/acpica/source/compiler/aslrestype2s.c
> index ccaac7c9..243d1a3f 100644
> --- a/src/acpica/source/compiler/aslrestype2s.c
> +++ b/src/acpica/source/compiler/aslrestype2s.c
> @@ -163,7 +163,8 @@ RsGetBufferDataLength (
>   
>   static UINT16
>   RsGetInterruptDataLength (
> -    ACPI_PARSE_OBJECT       *InitializerOp);
> +    ACPI_PARSE_OBJECT       *InitializerOp,
> +    UINT32                  StartIndex);
>   
>   static BOOLEAN
>   RsGetVendorData (
> @@ -171,6 +172,11 @@ RsGetVendorData (
>       UINT8                   *VendorData,
>       ACPI_SIZE               DescriptorOffset);
>   
> +static UINT16
> +RsGetStringDataLengthAt (
> +    ACPI_PARSE_OBJECT       *InitializerOp,
> +    UINT32                  StartIndex);
> +
>   /*
>    * This module contains descriptors for serial buses and GPIO:
>    *
> @@ -179,6 +185,11 @@ RsGetVendorData (
>    * I2cSerialBus
>    * SpiSerialBus
>    * UartSerialBus
> + * PinFunction
> + * PinConfig
> + * PinGroup
> + * PinGroupFunction
> + * PinGroupConfig
>    */
>   
>   
> @@ -238,6 +249,7 @@ RsGetBufferDataLength (
>    *
>    * PARAMETERS:  InitializerOp       - Current parse op, start of the resource
>    *                                    descriptor
> + *              StartIndex          - Start index of interrupt/pin list
>    *
>    * RETURN:      Length of the interrupt data list
>    *
> @@ -248,7 +260,8 @@ RsGetBufferDataLength (
>   
>   static UINT16
>   RsGetInterruptDataLength (
> -    ACPI_PARSE_OBJECT       *InitializerOp)
> +    ACPI_PARSE_OBJECT       *InitializerOp,
> +    UINT32                  StartIndex)
>   {
>       UINT16                  InterruptLength;
>       UINT32                  i;
> @@ -261,9 +274,9 @@ RsGetInterruptDataLength (
>       {
>           InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
>   
> -        /* Interrupt list starts at offset 10 (Gpio descriptors) */
> +        /* Interrupt list starts at offset StartIndex (Gpio descriptors) */
>   
> -        if (i >= 10)
> +        if (i >= StartIndex)
>           {
>               InterruptLength += 2;
>           }
> @@ -373,6 +386,43 @@ RsGetVendorData (
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    RsGetStringDataLengthAt
> + *
> + * PARAMETERS:  InitializerOp     - Start of a subtree of init nodes
> + *              StartIndex        - Starting index of the string node
> + *
> + * RETURN:      Valid string length if a string node is found at given
> + *               StartIndex or 0 otherwise.
> + *
> + * DESCRIPTION: In a list of peer nodes, find the first one at given index
> + *              that contains a string and return length.
> + *
> + ******************************************************************************/
> +
> +static UINT16
> +RsGetStringDataLengthAt (
> +    ACPI_PARSE_OBJECT       *InitializerOp,
> +    UINT32                  StartIndex)
> +{
> +    UINT32 i;
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        if (i == StartIndex &&
> +            InitializerOp->Asl.ParseOpcode == PARSEOP_STRING_LITERAL)
> +        {
> +            return ((UINT16) (strlen (InitializerOp->Asl.Value.String) + 1));
> +        }
> +
> +        InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
> +    }
> +
> +    return (0);
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    RsDoGpioIntDescriptor
>    *
>    * PARAMETERS:  Info                - Parse Op and resource template offset
> @@ -414,7 +464,7 @@ RsDoGpioIntDescriptor (
>        */
>       ResSourceLength = RsGetStringDataLength (InitializerOp);
>       VendorLength = RsGetBufferDataLength (InitializerOp);
> -    InterruptLength = RsGetInterruptDataLength (InitializerOp);
> +    InterruptLength = RsGetInterruptDataLength (InitializerOp, 10);
>   
>       DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) +
>           ResSourceLength + VendorLength + InterruptLength;
> @@ -623,7 +673,7 @@ RsDoGpioIoDescriptor (
>        */
>       ResSourceLength = RsGetStringDataLength (InitializerOp);
>       VendorLength = RsGetBufferDataLength (InitializerOp);
> -    InterruptLength = RsGetInterruptDataLength (InitializerOp);
> +    InterruptLength = RsGetInterruptDataLength (InitializerOp, 10);
>       PinList = InterruptList;
>   
>       DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) +
> @@ -1336,3 +1386,858 @@ RsDoUartSerialBusDescriptor (
>       MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
>       return (Rnode);
>   }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoPinFunctionDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "PinFunction" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinFunctionDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    char                    *ResourceSource = NULL;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  *PinList = NULL;
> +    UINT16                  ResSourceLength;
> +    UINT16                  VendorLength;
> +    UINT16                  PinListLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  PinCount = 0;
> +    UINT32                  i;
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Resource Source string
> +     * 2) Vendor Data buffer
> +     * 3) PIN (interrupt) list
> +     */
> +    ResSourceLength = RsGetStringDataLength (InitializerOp);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +    PinListLength = RsGetInterruptDataLength (InitializerOp, 8);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_FUNCTION) +
> +        ResSourceLength + VendorLength + PinListLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->PinFunction.ResourceLength = DescriptorSize;
> +    Descriptor->PinFunction.DescriptorType = ACPI_RESOURCE_NAME_PIN_FUNCTION;
> +    Descriptor->PinFunction.RevisionId = AML_RESOURCE_PIN_FUNCTION_REVISION;
> +
> +    /* Build pointers to optional areas */
> +
> +    PinList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_PIN_FUNCTION));
> +    ResourceSource = ACPI_ADD_PTR (char, PinList, PinListLength);
> +    VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength);
> +
> +    /* Setup offsets within the descriptor */
> +
> +    Descriptor->PinFunction.PinTableOffset = (UINT16)
> +        ACPI_PTR_DIFF (PinList, Descriptor);
> +
> +    Descriptor->PinFunction.ResSourceOffset = (UINT16)
> +        ACPI_PTR_DIFF (ResourceSource, Descriptor);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        switch (i)
> +        {
> +        case 0: /* Share Type [Flags] (_SHR) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinFunction.Flags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.Flags), 0);
> +            break;
> +
> +        case 1: /* Pin Config [BYTE] (_PPI) */
> +
> +            Descriptor->PinFunction.PinConfig = (UINT8) InitializerOp->Asl.Value.Integer;
> +            RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.PinConfig));
> +            break;
> +
> +        case 2: /* Function Number [WORD] (_FUN) */
> +
> +            Descriptor->PinFunction.FunctionNumber = (UINT16) InitializerOp->Asl.Value.Integer;
> +            RsCreateDwordField (InitializerOp, ACPI_RESTAG_FUNCTION,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.FunctionNumber));
> +            break;
> +
> +        case 3: /* ResSource [Optional Field - STRING] */
> +
> +            if (ResSourceLength)
> +            {
> +                /* Copy string to the descriptor */
> +
> +                strcpy (ResourceSource, InitializerOp->Asl.Value.String);
> +            }
> +            break;
> +
> +        case 4: /* Resource Index */
> +
> +            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> +            {
> +                Descriptor->PinFunction.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> +            }
> +            break;
> +
> +        case 5: /* Resource Usage (consumer/producer) */
> +
> +            /* Assumed to be consumer */
> +
> +            break;
> +
> +        case 6: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +            /*
> +             * Always set the VendorOffset even if there is no Vendor Data.
> +             * This field is required in order to calculate the length
> +             * of the ResourceSource at runtime.
> +             */
> +            Descriptor->PinFunction.VendorOffset = (UINT16)
> +                ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> +            if (RsGetVendorData (InitializerOp, VendorData,
> +                (CurrentByteOffset + Descriptor->PinFunction.VendorOffset)))
> +            {
> +                Descriptor->PinFunction.VendorLength = VendorLength;
> +            }
> +            break;
> +
> +        default:
> +            /*
> +             * PINs come through here, repeatedly. Each PIN must be a WORD.
> +             * NOTE: there is no "length" field for this, so from ACPI spec:
> +             *  The number of pins in the table can be calculated from:
> +             *  PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
> +             *  (implies resource source must immediately follow the pin list.)
> +             *  Name: _PIN
> +             */
> +            *PinList = (UINT16) InitializerOp->Asl.Value.Integer;
> +            PinList++;
> +            PinCount++;
> +
> +            /* Case 8: First pin number in list */
> +
> +            if (i == 8)
> +            {
> +                if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> +                {
> +                    /* Must be at least one interrupt */
> +
> +                    AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
> +                        InitializerOp, NULL);
> +                }
> +
> +                /* Check now for duplicates in list */
> +
> +                RsCheckListForDuplicates (InitializerOp);
> +
> +                /* Create a named field at the start of the list */
> +
> +                RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
> +                    CurrentByteOffset + Descriptor->PinFunction.PinTableOffset);
> +            }
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoPinConfigDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "PinConfig" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinConfigDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    char                    *ResourceSource = NULL;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  *PinList = NULL;
> +    UINT16                  ResSourceLength;
> +    UINT16                  VendorLength;
> +    UINT16                  PinListLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  PinCount = 0;
> +    UINT32                  i;
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Resource Source string
> +     * 2) Vendor Data buffer
> +     * 3) PIN (interrupt) list
> +     */
> +    ResSourceLength = RsGetStringDataLength (InitializerOp);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +    PinListLength = RsGetInterruptDataLength (InitializerOp, 8);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_CONFIG) +
> +        ResSourceLength + VendorLength + PinListLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->PinConfig.ResourceLength = DescriptorSize;
> +    Descriptor->PinConfig.DescriptorType = ACPI_RESOURCE_NAME_PIN_CONFIG;
> +    Descriptor->PinConfig.RevisionId = AML_RESOURCE_PIN_CONFIG_REVISION;
> +
> +    /* Build pointers to optional areas */
> +
> +    PinList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_PIN_CONFIG));
> +    ResourceSource = ACPI_ADD_PTR (char, PinList, PinListLength);
> +    VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength);
> +
> +    /* Setup offsets within the descriptor */
> +
> +    Descriptor->PinConfig.PinTableOffset = (UINT16)
> +        ACPI_PTR_DIFF (PinList, Descriptor);
> +
> +    Descriptor->PinConfig.ResSourceOffset = (UINT16)
> +        ACPI_PTR_DIFF (ResourceSource, Descriptor);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        BOOLEAN isValid;
> +
> +        switch (i)
> +        {
> +        case 0: /* Share Type [Flags] (_SHR) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinConfig.Flags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.Flags), 0);
> +            break;
> +
> +        case 1: /* Pin Config Type [BYTE] (_TYP) */
> +
> +            isValid = InitializerOp->Asl.Value.Integer <= 0x0d;
> +            if (!isValid)
> +            {
> +                isValid = InitializerOp->Asl.Value.Integer >= 0x80 &&
> +                          InitializerOp->Asl.Value.Integer <= 0xff;
> +            }
> +            if (!isValid)
> +            {
> +                    AslError (ASL_ERROR, ASL_MSG_RANGE, InitializerOp, NULL);
> +            }
> +
> +            Descriptor->PinConfig.PinConfigType = (UINT8) InitializerOp->Asl.Value.Integer;
> +            RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG_TYPE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.PinConfigType));
> +
> +            break;
> +
> +        case 2: /* Pin Config Value [DWORD] (_VAL) */
> +
> +            Descriptor->PinConfig.PinConfigValue = (UINT32) InitializerOp->Asl.Value.Integer;
> +            RsCreateDwordField (InitializerOp, ACPI_RESTAG_PINCONFIG_VALUE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.PinConfigValue));
> +            break;
> +
> +        case 3: /* ResSource [Optional Field - STRING] */
> +
> +            if (ResSourceLength)
> +            {
> +                /* Copy string to the descriptor */
> +
> +                strcpy (ResourceSource, InitializerOp->Asl.Value.String);
> +            }
> +            break;
> +
> +        case 4: /* Resource Index */
> +
> +            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> +            {
> +                Descriptor->PinConfig.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> +            }
> +            break;
> +
> +        case 5: /* Resource Usage (consumer/producer) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinConfig.Flags, InitializerOp, 1, 1);
> +
> +            break;
> +
> +        case 6: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +            /*
> +             * Always set the VendorOffset even if there is no Vendor Data.
> +             * This field is required in order to calculate the length
> +             * of the ResourceSource at runtime.
> +             */
> +            Descriptor->PinConfig.VendorOffset = (UINT16)
> +                ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> +            if (RsGetVendorData (InitializerOp, VendorData,
> +                (CurrentByteOffset + Descriptor->PinConfig.VendorOffset)))
> +            {
> +                Descriptor->PinConfig.VendorLength = VendorLength;
> +            }
> +            break;
> +
> +        default:
> +            /*
> +             * PINs come through here, repeatedly. Each PIN must be a WORD.
> +             * NOTE: there is no "length" field for this, so from ACPI spec:
> +             *  The number of pins in the table can be calculated from:
> +             *  PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
> +             *  (implies resource source must immediately follow the pin list.)
> +             *  Name: _PIN
> +             */
> +            *PinList = (UINT16) InitializerOp->Asl.Value.Integer;
> +            PinList++;
> +            PinCount++;
> +
> +            /* Case 8: First pin number in list */
> +
> +            if (i == 8)
> +            {
> +                if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> +                {
> +                    /* Must be at least one interrupt */
> +
> +                    AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
> +                        InitializerOp, NULL);
> +                }
> +
> +                /* Check now for duplicates in list */
> +
> +                RsCheckListForDuplicates (InitializerOp);
> +
> +                /* Create a named field at the start of the list */
> +
> +                RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
> +                    CurrentByteOffset + Descriptor->PinConfig.PinTableOffset);
> +            }
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoPinGroupDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "PinGroup" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinGroupDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  *PinList = NULL;
> +    char                    *Label = NULL;
> +    UINT16                  LabelLength;
> +    UINT16                  VendorLength;
> +    UINT16                  PinListLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  PinCount = 0;
> +    UINT32                  i;
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Label
> +     * 2) Vendor Data buffer
> +     * 3) PIN (interrupt) list
> +     */
> +    LabelLength = RsGetStringDataLength (InitializerOp);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +    PinListLength = RsGetInterruptDataLength (InitializerOp, 4);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP) +
> +        LabelLength + VendorLength + PinListLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->PinGroup.ResourceLength = DescriptorSize;
> +    Descriptor->PinGroup.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP;
> +    Descriptor->PinGroup.RevisionId = AML_RESOURCE_PIN_GROUP_REVISION;
> +
> +    /* Build pointers to optional areas */
> +
> +    PinList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_PIN_GROUP));
> +    Label = ACPI_ADD_PTR (char, PinList, PinListLength);
> +    VendorData = ACPI_ADD_PTR (UINT8, Label, LabelLength);
> +
> +    /* Setup offsets within the descriptor */
> +
> +    Descriptor->PinGroup.PinTableOffset = (UINT16) ACPI_PTR_DIFF (PinList, Descriptor);
> +    Descriptor->PinGroup.LabelOffset = (UINT16) ACPI_PTR_DIFF (Label, Descriptor);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        switch (i)
> +        {
> +        case 0: /* Resource Label */
> +
> +            if (LabelLength < 2)
> +            {
> +                AslError(ASL_WARNING, ASL_MSG_NULL_STRING, InitializerOp, NULL);
> +            }
> +            strcpy (Label, InitializerOp->Asl.Value.String);
> +
> +            break;
> +
> +        case 1: /* Resource Usage (consumer/producer) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinGroup.Flags, InitializerOp, 0, 0);
> +
> +            break;
> +
> +        case 2: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 3: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +            /*
> +             * Always set the VendorOffset even if there is no Vendor Data.
> +             * This field is required in order to calculate the length
> +             * of the ResourceSource at runtime.
> +             */
> +            Descriptor->PinGroup.VendorOffset = (UINT16)
> +                ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> +            if (RsGetVendorData (InitializerOp, VendorData,
> +                (CurrentByteOffset + Descriptor->PinGroup.VendorOffset)))
> +            {
> +                Descriptor->PinGroup.VendorLength = VendorLength;
> +            }
> +            break;
> +
> +        default:
> +            /*
> +             * PINs come through here, repeatedly. Each PIN must be a WORD.
> +             * NOTE: there is no "length" field for this, so from ACPI spec:
> +             *  The number of pins in the table can be calculated from:
> +             *  PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
> +             *  (implies resource source must immediately follow the pin list.)
> +             *  Name: _PIN
> +             */
> +            *PinList = (UINT16) InitializerOp->Asl.Value.Integer;
> +            PinList++;
> +            PinCount++;
> +
> +            /* Case 3: First pin number in list */
> +
> +            if (i == 4)
> +            {
> +                if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> +                {
> +                    /* Must be at least one interrupt */
> +
> +                    AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
> +                        InitializerOp, NULL);
> +                }
> +
> +                /* Check now for duplicates in list */
> +
> +                RsCheckListForDuplicates (InitializerOp);
> +
> +                /* Create a named field at the start of the list */
> +
> +                RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
> +                    CurrentByteOffset + Descriptor->PinGroup.PinTableOffset);
> +            }
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoPinGroupFunctionDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "PinGroupFunction" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinGroupFunctionDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    char                    *ResourceSource = NULL;
> +    char                    *ResourceSourceLabel = NULL;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  ResSourceLength;
> +    UINT16                  ResSourceLabelLength;
> +    UINT16                  VendorLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  i;
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Resource Source string
> +     * 2) Resource Source Label string
> +     * 3) Vendor Data buffer
> +     */
> +    ResSourceLength = RsGetStringDataLengthAt (InitializerOp, 2);
> +    ResSourceLabelLength = RsGetStringDataLengthAt (InitializerOp, 4);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_FUNCTION) +
> +        ResSourceLength + ResSourceLabelLength + VendorLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->PinGroupFunction.ResourceLength = DescriptorSize;
> +    Descriptor->PinGroupFunction.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION;
> +    Descriptor->PinGroupFunction.RevisionId = AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION;
> +
> +    /* Build pointers to optional areas */
> +
> +    ResourceSource = ACPI_ADD_PTR (char, Descriptor, sizeof (AML_RESOURCE_PIN_GROUP_FUNCTION));
> +    ResourceSourceLabel = ACPI_ADD_PTR (char, ResourceSource, ResSourceLength);
> +    VendorData = ACPI_ADD_PTR (UINT8, ResourceSourceLabel, ResSourceLabelLength);
> +
> +    /* Setup offsets within the descriptor */
> +
> +    Descriptor->PinGroupFunction.ResSourceOffset = (UINT16)
> +        ACPI_PTR_DIFF (ResourceSource, Descriptor);
> +    Descriptor->PinGroupFunction.ResSourceLabelOffset = (UINT16)
> +        ACPI_PTR_DIFF (ResourceSourceLabel, Descriptor);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        switch (i)
> +        {
> +        case 0: /* Share Type [Flags] (_SHR) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinGroupFunction.Flags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupFunction.Flags), 0);
> +            break;
> +
> +        case 1: /* Function Number [WORD] */
> +
> +            Descriptor->PinGroupFunction.FunctionNumber = (UINT16) InitializerOp->Asl.Value.Integer;
> +            RsCreateDwordField (InitializerOp, ACPI_RESTAG_FUNCTION,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupFunction.FunctionNumber));
> +            break;
> +
> +        case 2: /* ResourceSource [STRING] */
> +
> +            strcpy (ResourceSource, InitializerOp->Asl.Value.String);
> +            break;
> +
> +        case 3: /* Resource Index */
> +
> +            Descriptor->PinGroupFunction.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> +            break;
> +
> +        case 4: /* ResourceSourceLabel [STRING] */
> +
> +            if (ResSourceLabelLength < 2)
> +            {
> +                AslError(ASL_WARNING, ASL_MSG_NULL_STRING, InitializerOp, NULL);
> +            }
> +
> +            strcpy (ResourceSourceLabel, InitializerOp->Asl.Value.String);
> +            break;
> +
> +        case 5: /* Resource Usage (consumer/producer) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinGroupFunction.Flags, InitializerOp, 1, 1);
> +
> +            break;
> +
> +        case 6: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +            /*
> +             * Always set the VendorOffset even if there is no Vendor Data.
> +             * This field is required in order to calculate the length
> +             * of the ResourceSource at runtime.
> +             */
> +            Descriptor->PinGroupFunction.VendorOffset = (UINT16)
> +                ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> +            if (RsGetVendorData (InitializerOp, VendorData,
> +                (CurrentByteOffset + Descriptor->PinGroupFunction.VendorOffset)))
> +            {
> +                Descriptor->PinGroupFunction.VendorLength = VendorLength;
> +            }
> +            break;
> +
> +        default:
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    RsDoPinGroupConfigDescriptor
> + *
> + * PARAMETERS:  Info                - Parse Op and resource template offset
> + *
> + * RETURN:      Completed resource node
> + *
> + * DESCRIPTION: Construct a long "PinGroupConfig" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoPinGroupConfigDescriptor (
> +    ASL_RESOURCE_INFO       *Info)
> +{
> +    AML_RESOURCE            *Descriptor;
> +    ACPI_PARSE_OBJECT       *InitializerOp;
> +    ASL_RESOURCE_NODE       *Rnode;
> +    char                    *ResourceSource = NULL;
> +    char                    *ResourceSourceLabel = NULL;
> +    UINT8                   *VendorData = NULL;
> +    UINT16                  ResSourceLength;
> +    UINT16                  ResSourceLabelLength;
> +    UINT16                  VendorLength;
> +    UINT16                  DescriptorSize;
> +    UINT32                  CurrentByteOffset;
> +    UINT32                  i;
> +
> +    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
> +    CurrentByteOffset = Info->CurrentByteOffset;
> +
> +    /*
> +     * Calculate lengths for fields that have variable length:
> +     * 1) Resource Source string
> +     * 2) Resource Source Label string
> +     * 3) Vendor Data buffer
> +     */
> +    ResSourceLength = RsGetStringDataLengthAt (InitializerOp, 3);
> +    ResSourceLabelLength = RsGetStringDataLengthAt (InitializerOp, 5);
> +    VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> +    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_CONFIG) +
> +        ResSourceLength + ResSourceLabelLength + VendorLength;
> +
> +    /* Allocate the local resource node and initialize */
> +
> +    Rnode = RsAllocateResourceNode (DescriptorSize +
> +        sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> +    Descriptor = Rnode->Buffer;
> +    Descriptor->PinGroupConfig.ResourceLength = DescriptorSize;
> +    Descriptor->PinGroupConfig.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG;
> +    Descriptor->PinGroupConfig.RevisionId = AML_RESOURCE_PIN_GROUP_CONFIG_REVISION;
> +
> +    /* Build pointers to optional areas */
> +
> +    ResourceSource = ACPI_ADD_PTR (char, Descriptor, sizeof (AML_RESOURCE_PIN_GROUP_CONFIG));
> +    ResourceSourceLabel = ACPI_ADD_PTR (char, ResourceSource, ResSourceLength);
> +    VendorData = ACPI_ADD_PTR (UINT8, ResourceSourceLabel, ResSourceLabelLength);
> +
> +    /* Setup offsets within the descriptor */
> +
> +    Descriptor->PinGroupConfig.ResSourceOffset = (UINT16)
> +        ACPI_PTR_DIFF (ResourceSource, Descriptor);
> +    Descriptor->PinGroupConfig.ResSourceLabelOffset = (UINT16)
> +        ACPI_PTR_DIFF (ResourceSourceLabel, Descriptor);
> +
> +    /* Process all child initialization nodes */
> +
> +    for (i = 0; InitializerOp; i++)
> +    {
> +        BOOLEAN isValid;
> +
> +        switch (i)
> +        {
> +        case 0: /* Share Type [Flags] (_SHR) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinGroupConfig.Flags, InitializerOp, 0, 0);
> +            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.Flags), 0);
> +            break;
> +
> +        case 1: /* Pin Config Type [BYTE] (_TYP) */
> +
> +            isValid = InitializerOp->Asl.Value.Integer <= 0x0d;
> +            if (!isValid)
> +            {
> +                isValid = InitializerOp->Asl.Value.Integer >= 0x80 &&
> +                          InitializerOp->Asl.Value.Integer <= 0xff;
> +            }
> +            if (!isValid)
> +            {
> +                    AslError (ASL_ERROR, ASL_MSG_RANGE, InitializerOp, NULL);
> +            }
> +
> +            Descriptor->PinGroupConfig.PinConfigType = (UINT8) InitializerOp->Asl.Value.Integer;
> +            RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG_TYPE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.PinConfigType));
> +
> +            break;
> +
> +        case 2: /* Pin Config Value [DWORD] (_VAL) */
> +
> +            Descriptor->PinGroupConfig.PinConfigValue = (UINT32) InitializerOp->Asl.Value.Integer;
> +            RsCreateDwordField (InitializerOp, ACPI_RESTAG_PINCONFIG_VALUE,
> +                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.PinConfigValue));
> +            break;
> +
> +        case 3: /* ResourceSource [STRING] */
> +
> +            /* Copy string to the descriptor */
> +
> +            strcpy (ResourceSource, InitializerOp->Asl.Value.String);
> +            break;
> +
> +        case 4: /* Resource Index */
> +
> +            Descriptor->PinGroupConfig.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> +            break;
> +
> +        case 5: /* ResourceSourceLabel [STRING] */
> +
> +            if (ResSourceLabelLength < 2)
> +            {
> +                AslError(ASL_WARNING, ASL_MSG_NULL_STRING, InitializerOp, NULL);
> +            }
> +
> +            strcpy (ResourceSourceLabel, InitializerOp->Asl.Value.String);
> +            break;
> +
> +        case 6: /* Resource Usage (consumer/producer) */
> +
> +            RsSetFlagBits16 (&Descriptor->PinGroupConfig.Flags, InitializerOp, 1, 1);
> +
> +            break;
> +
> +        case 7: /* Resource Tag (Descriptor Name) */
> +
> +            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
> +            break;
> +
> +        case 8: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +            /*
> +             * Always set the VendorOffset even if there is no Vendor Data.
> +             * This field is required in order to calculate the length
> +             * of the ResourceSource at runtime.
> +             */
> +            Descriptor->PinGroupConfig.VendorOffset = (UINT16)
> +                ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> +            if (RsGetVendorData (InitializerOp, VendorData,
> +                (CurrentByteOffset + Descriptor->PinGroupConfig.VendorOffset)))
> +            {
> +                Descriptor->PinGroupConfig.VendorLength = VendorLength;
> +            }
> +            break;
> +
> +        default:
> +            break;
> +        }
> +
> +        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> +    }
> +
> +    return (Rnode);
> +}
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index ae4d3714..d09852c7 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -269,11 +269,9 @@ TermArg
>       : SimpleName                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
>       | Type2Opcode                   {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
>       | DataObject                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
> -/*
>       | PARSEOP_OPEN_PAREN
>           TermArg
> -        PARSEOP_CLOSE_PAREN         {}
> -*/
> +        PARSEOP_CLOSE_PAREN         {$$ = TrSetNodeFlags ($2, NODE_IS_TERM_ARG);}
>       ;
>   
>   /*
> @@ -395,7 +393,7 @@ Object
>       : CompilerDirective             {}
>       | NamedObject                   {}
>       | NameSpaceModifier             {}
> -//    | StructureTerm                 {}
> +/*    | StructureTerm                 {} */
>       ;
>   
>   PackageList
> @@ -644,7 +642,7 @@ NamedObject
>   NameSpaceModifier
>       : AliasTerm                     {}
>       | NameTerm                      {}
> -//    | NameTermAslPlus               {}
> +/*    | NameTermAslPlus               {} */
>       | ScopeTerm                     {}
>       ;
>   
> @@ -751,8 +749,8 @@ Type2IntegerOpcode                  /* "Type3" opcodes */
>       | FromBCDTerm                   {}
>       | IncTerm                       {}
>       | IndexTerm                     {}
> -//    | StructureIndexTerm            {}
> -//    | StructurePointerTerm          {}
> +/*    | StructureIndexTerm            {} */
> +/*    | StructurePointerTerm          {} */
>       | LAndTerm                      {}
>       | LEqualTerm                    {}
>       | LGreaterTerm                  {}
> @@ -827,8 +825,8 @@ Type6Opcode
>       | DerefOfTerm                   {}
>       | IndexTerm                     {}
>       | IndexExpTerm                  {}
> -//    | StructureIndexTerm            {}
> -//    | StructurePointerTerm          {}
> +/*    | StructureIndexTerm            {} */
> +/*    | StructurePointerTerm          {} */
>       | MethodInvocationTerm          {}
>       ;
>   
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index bef4c769..2f037bf8 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -316,6 +316,11 @@ AslDetectSourceFileType (
>           Type = ASL_INPUT_TYPE_BINARY_ACPI_TABLE;
>           goto Cleanup;
>       }
> +    else
> +    {
> +        fprintf (stderr,
> +            "Binary file does not contain a valid ACPI table\n");
> +    }
>   
>       Type = ASL_INPUT_TYPE_BINARY;
>   
> @@ -456,7 +461,7 @@ AslDoOneFile (
>       /*
>        * AML Disassembly (Optional)
>        */
> -    if (Gbl_DisasmFlag)
> +    if (AcpiGbl_DisasmFlag)
>       {
>           Status = AslDoDisassembly ();
>           if (Status != AE_CTRL_CONTINUE)
> @@ -581,7 +586,7 @@ AslDoOneFile (
>           CvDbgPrint ("OUTPUTFILENAME: %s\n", Gbl_OutputFilenamePrefix);
>               Gbl_Files[ASL_FILE_INPUT].Filename =
>                   Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
> -
> +            AcpiGbl_DisasmFlag = TRUE;
>               fprintf (stderr, "\n");
>               AslDoDisassembly ();
>   
> @@ -601,7 +606,7 @@ AslDoOneFile (
>   
>           FlCloseFile (ASL_FILE_INPUT);
>           Gbl_DoCompile = FALSE;
> -        Gbl_DisasmFlag = TRUE;
> +        AcpiGbl_DisasmFlag = TRUE;
>           Status = AslDoDisassembly ();
>           return (Status);
>   
> diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
> index 13054067..42cee752 100644
> --- a/src/acpica/source/compiler/aslsupport.l
> +++ b/src/acpica/source/compiler/aslsupport.l
> @@ -697,15 +697,19 @@ AslDoCommentType2 (
>   
>   
>       AslInsertLineBuffer ('/');
> -    AslInsertLineBuffer ('*');
>   
>       if (Gbl_CaptureComments && CurrentState.CaptureComments)
>       {
> +        AslInsertLineBuffer ('*');
>           *StringBuffer = '/';
>           ++StringBuffer;
>           *StringBuffer = '*';
>           ++StringBuffer;
>       }
> +    else
> +    {
> +        AslInsertLineBuffer ('/');
> +    }
>   
>       while (((c = input ()) != '\n') && (c != EOF))
>       {
> @@ -1006,15 +1010,6 @@ CompletedString:
>       *StringBuffer = 0;
>   
>       CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
> -    if (!CleanString)
> -    {
> -        AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
> -            Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> -            Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> -            Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> -        return (FALSE);
> -    }
> -
>       strcpy (CleanString, MsgBuffer);
>       AslCompilerlval.s = CleanString;
>       return (TRUE);
> diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
> index ba0803f8..e6e9006d 100644
> --- a/src/acpica/source/compiler/asltokens.y
> +++ b/src/acpica/source/compiler/asltokens.y
> @@ -389,6 +389,11 @@ NoEcho('
>   %token <i> PARSEOP_PARITYTYPE_NONE
>   %token <i> PARSEOP_PARITYTYPE_ODD
>   %token <i> PARSEOP_PARITYTYPE_SPACE
> +%token <i> PARSEOP_PINCONFIG
> +%token <i> PARSEOP_PINFUNCTION
> +%token <i> PARSEOP_PINGROUP
> +%token <i> PARSEOP_PINGROUPCONFIG
> +%token <i> PARSEOP_PINGROUPFUNCTION
>   %token <i> PARSEOP_PIN_NOPULL
>   %token <i> PARSEOP_PIN_PULLDEFAULT
>   %token <i> PARSEOP_PIN_PULLDOWN
> diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c
> index 0f31296e..b80a4226 100644
> --- a/src/acpica/source/compiler/asltree.c
> +++ b/src/acpica/source/compiler/asltree.c
> @@ -295,17 +295,14 @@ TrAllocateNode (
>           }
>   
>           Gbl_CommentState.Latest_Parse_Node = Op;
> -        if (Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName)
> -        {
> -            CvDbgPrint ("trallocatenode=Set latest parse node to this node.\n");
> -            CvDbgPrint ("           Op->Asl.ParseOpName = %s\n",
> -                Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName);
> -            CvDbgPrint ("           Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode);
> +        CvDbgPrint ("trallocatenode=Set latest parse node to this node.\n");
> +        CvDbgPrint ("           Op->Asl.ParseOpName = %s\n",
> +            Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName);
> +        CvDbgPrint ("           Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode);
>   
> -            if (Op->Asl.FileChanged)
> -            {
> -                CvDbgPrint("    file has been changed!\n");
> -            }
> +        if (Op->Asl.FileChanged)
> +        {
> +            CvDbgPrint("    file has been changed!\n");
>           }
>   
>           /*
> @@ -1660,7 +1657,7 @@ TrLinkChildNode (
>        * turn on capture comments as it signifies that we are done parsing
>        * a method call.
>        */
> -    if (Gbl_CaptureComments)
> +    if (Gbl_CaptureComments && Op1)
>       {
>           if (Op1->Asl.ParseOpcode == PARSEOP_METHODCALL)
>           {
> diff --git a/src/acpica/source/compiler/asltypes.y b/src/acpica/source/compiler/asltypes.y
> index 7f0680ef..6886a0dc 100644
> --- a/src/acpica/source/compiler/asltypes.y
> +++ b/src/acpica/source/compiler/asltypes.y
> @@ -432,6 +432,11 @@ NoEcho('
>   %type <n> Memory32Term
>   %type <n> NameSeg
>   %type <n> NameString
> +%type <n> PinConfigTerm
> +%type <n> PinFunctionTerm
> +%type <n> PinGroupTerm
> +%type <n> PinGroupConfigTerm
> +%type <n> PinGroupFunctionTerm
>   %type <n> QWordIOTerm
>   %type <n> QWordMemoryTerm
>   %type <n> QWordSpaceTerm
> @@ -487,6 +492,7 @@ NoEcho('
>   %type <n> OptionalReference
>   %type <n> OptionalResourceType
>   %type <n> OptionalResourceType_First
> +%type <n> OptionalProducerResourceType
>   %type <n> OptionalReturnArg
>   %type <n> OptionalSerializeRuleKeyword
>   %type <n> OptionalShareType
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 202cf38d..fd91baeb 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -635,7 +635,7 @@ UtCheckIntegerRange (
>    *
>    * PARAMETERS:  Length              - Size of buffer requested
>    *
> - * RETURN:      Pointer to the buffer. Aborts on allocation failure
> + * RETURN:      Pointer to the buffer. Aborts compiler on allocation failure
>    *
>    * DESCRIPTION: Allocate a string buffer. Bypass the local
>    *              dynamic memory manager for performance reasons (This has a
> @@ -833,10 +833,6 @@ UtInternalizeName (
>       /* We need a segment to store the internal name */
>   
>       Info.InternalName = UtStringCacheCalloc (Info.Length);
> -    if (!Info.InternalName)
> -    {
> -        return (AE_NO_MEMORY);
> -    }
>   
>       /* Build the name */
>   
> diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
> index ec1ce21b..62933ec1 100644
> --- a/src/acpica/source/compiler/aslxref.c
> +++ b/src/acpica/source/compiler/aslxref.c
> @@ -621,7 +621,8 @@ XfNamespaceLocateBegin (
>           (!(OpInfo->Flags & AML_CREATE)) &&
>           (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
>           (Op->Asl.ParseOpcode != PARSEOP_NAMESEG)    &&
> -        (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
> +        (Op->Asl.ParseOpcode != PARSEOP_METHODCALL) &&
> +        (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
>       {
>           return_ACPI_STATUS (AE_OK);
>       }
> @@ -644,7 +645,8 @@ XfNamespaceLocateBegin (
>       Flags = ACPI_NS_SEARCH_PARENT;
>       if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
>           (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
> -        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
> +        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) ||
> +        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
>       {
>           /*
>            * These are name references, do not push the scope stack
> @@ -1183,7 +1185,8 @@ XfNamespaceLocateEnd (
>   
>       if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
>           (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
> -        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
> +        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) ||
> +        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
>       {
>           return_ACPI_STATUS (AE_OK);
>       }
> diff --git a/src/acpica/source/compiler/cvcompiler.c b/src/acpica/source/compiler/cvcompiler.c
> index e8366ce5..fab9fb94 100644
> --- a/src/acpica/source/compiler/cvcompiler.c
> +++ b/src/acpica/source/compiler/cvcompiler.c
> @@ -191,6 +191,7 @@ CvProcessComment (
>           *StringBuffer = (char) c1;
>           ++StringBuffer;
>           *StringBuffer = 0;
> +
>           CvDbgPrint ("Multi-line comment\n");
>           CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
>           strcpy (CommentString, MsgBuffer);
> @@ -198,17 +199,15 @@ CvProcessComment (
>           CvDbgPrint ("CommentString: %s\n", CommentString);
>   
>           /*
> -         * Determine whether if this comment spans multiple lines.
> -         * If so, break apart the comment by line so that it can be
> -         * properly indented.
> +         * Determine whether if this comment spans multiple lines. If so,
> +         * break apart the comment by storing each line in a different node
> +         * within the comment list. This allows the disassembler to
> +         * properly indent a multi-line comment.
>            */
> -        if (strchr (CommentString, '\n') != NULL)
> +        LineToken = strtok (CommentString, "\n");
> +
> +        if (LineToken)
>           {
> -            /*
> -             * Get the first token. The for loop pads subsequent lines
> -             * for comments similar to the style of this comment.
> -             */
> -            LineToken = strtok (CommentString, "\n");
>               FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1);
>               strcpy (FinalLineToken, LineToken);
>   
> @@ -263,7 +262,10 @@ CvProcessComment (
>               * if this is not a regular comment, pad with extra spaces that appeared
>               * in the original source input to retain the original spacing.
>               */
> -            FinalCommentString = UtStringCacheCalloc (strlen (CommentString) + CurrentState.SpacesBefore + 1);
> +            FinalCommentString =
> +                UtStringCacheCalloc (strlen (CommentString) +
> +                CurrentState.SpacesBefore + 1);
> +
>               for (i=0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) &&
>                   (i < CurrentState.SpacesBefore); ++i)
>               {
> @@ -333,7 +335,9 @@ CvProcessCommentType2 (
>            * [ (spaces) (comment)  ( * /) ('\0') ]
>            *
>            */
> -        FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore + strlen (CommentString) + 3 + 1);
> +        FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore +
> +            strlen (CommentString) + 3 + 1);
> +
>           for (i=0; (CurrentState.CommentType!=1) && (i<CurrentState.SpacesBefore); ++i)
>           {
>               FinalCommentString[i] = ' ';
> @@ -556,6 +560,12 @@ CgWriteOneAmlComment(
>       UINT8 CommentOption = InputOption;
>       UINT8 CommentOpcode = (UINT8)AML_COMMENT_OP;
>   
> +
> +    if (!CommentToPrint)
> +    {
> +        return;
> +    }
> +
>       CgLocalWriteAmlData (Op, &CommentOpcode, 1);
>       CgLocalWriteAmlData (Op, &CommentOption, 1);
>   
> @@ -603,8 +613,12 @@ CgWriteAmlComment(
>   
>           NewFilename =
>               FlGenerateFilename (Op->Asl.Filename, FILE_SUFFIX_DISASSEMBLY);
> -        CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
> -            NewFilename, Op->Asl.ParseOpName);
> +        if (NewFilename)
> +        {
> +            CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
> +                NewFilename, Op->Asl.ParseOpName);
> +        }
> +
>           CgWriteOneAmlComment(Op, NewFilename, FILENAME_COMMENT);
>   
>           if (Op->Asl.ParentFilename &&
> @@ -688,17 +702,16 @@ CgWriteAmlComment(
>    *
>    ******************************************************************************/
>   
> -ACPI_COMMENT_NODE*
> +ACPI_COMMENT_NODE *
>   CvCommentNodeCalloc (
>       void)
>   {
>      ACPI_COMMENT_NODE        *NewCommentNode;
>   
>   
> -   NewCommentNode =
> -       (ACPI_COMMENT_NODE*) UtLocalCalloc (sizeof(ACPI_COMMENT_NODE));
> +   NewCommentNode = UtLocalCalloc (sizeof (ACPI_COMMENT_NODE));
>      NewCommentNode->Next = NULL;
> -   return NewCommentNode;
> +   return (NewCommentNode);
>   }
>   
>   
> @@ -907,10 +920,12 @@ CvAppendInlineComment (
>       {
>           return ToAdd;
>       }
> -    if (ToAdd)
> +    if (!ToAdd)
>       {
> -        Size = strlen (ToAdd);
> +        return InlineComment;
>       }
> +
> +    Size = strlen (ToAdd);
>       Size += strlen (InlineComment);
>       Str = UtStringCacheCalloc (Size+1);
>       strcpy (Str, InlineComment);
> diff --git a/src/acpica/source/compiler/cvdisasm.c b/src/acpica/source/compiler/cvdisasm.c
> index e75ee0ab..6e9b73f0 100644
> --- a/src/acpica/source/compiler/cvdisasm.c
> +++ b/src/acpica/source/compiler/cvdisasm.c
> @@ -314,6 +314,7 @@ CvPrintOneCommentType (
>   
>       if (*CommentToPrint)
>       {
> +        CommentExists = TRUE;
>           AcpiOsPrintf ("%s", *CommentToPrint);
>           *CommentToPrint = NULL;
>       }
> @@ -495,6 +496,7 @@ CvSwitchFiles(
>   {
>       char                    *Filename = Op->Common.CvFilename;
>       ACPI_FILE_NODE          *FNode;
> +    ACPI_FILE_NODE          *Current;
>   
>       CvDbgPrint ("Switching from %s to %s\n", AcpiGbl_CurrentFilename, Filename);
>       FNode = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot);
> @@ -509,23 +511,23 @@ CvSwitchFiles(
>           AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0, NULL, MsgBuffer);
>           AslAbort ();
>       }
> +    Current = FNode;
>   
>       /*
>        * If the previous file is a descendent of the current file,
>        * make sure that Include statements from the current file
>        * to the previous have been emitted.
>        */
> -    while (FNode &&
> -           FNode->Parent &&
> -           AcpiUtStricmp (FNode->Filename, AcpiGbl_CurrentFilename))
> +    while (Current &&
> +           Current->Parent &&
> +           AcpiUtStricmp (Current->Filename, AcpiGbl_CurrentFilename))
>       {
> -        CvPrintInclude (FNode, Level);
> -        FNode = FNode->Parent;
> +        CvPrintInclude (Current, Level);
> +        Current = Current->Parent;
>       }
>   
> -    /* Redirect output to the Op->Common.CvFilename */
> +    /* Redirect output to Op->Common.CvFilename */
>   
> -    FNode = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot);
>       AcpiOsRedirectOutput (FNode->File);
>       AcpiGbl_CurrentFilename = FNode->Filename;
>   }
> diff --git a/src/acpica/source/compiler/cvparser.c b/src/acpica/source/compiler/cvparser.c
> index cdb165dc..060e8aed 100644
> --- a/src/acpica/source/compiler/cvparser.c
> +++ b/src/acpica/source/compiler/cvparser.c
> @@ -215,7 +215,7 @@ CvIsFilename (
>   
>       for(i = 0; i<Length; ++i)
>       {
> -        if (!isprint (Filename[i]))
> +        if (!isprint ((int) Filename[i]))
>           {
>               return FALSE;
>           }
> @@ -440,6 +440,11 @@ CvFilenameExists(
>       ACPI_FILE_NODE          *Current = Head;
>   
>   
> +    if (!Filename)
> +    {
> +        return (NULL);
> +    }
> +
>       while (Current)
>       {
>           if (!AcpiUtStricmp (Current->Filename, Filename))
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 9a6f08ee..61b40b4a 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -578,6 +578,10 @@ DtCompileHest (
>       void                    **PFieldList);
>   
>   ACPI_STATUS
> +DtCompileHmat (
> +    void                    **PFieldList);
> +
> +ACPI_STATUS
>   DtCompileIort (
>       void                    **PFieldList);
>   
> @@ -618,6 +622,10 @@ DtCompilePmtt (
>       void                    **PFieldList);
>   
>   ACPI_STATUS
> +DtCompilePptt (
> +    void                    **PFieldList);
> +
> +ACPI_STATUS
>   DtCompilePcct (
>       void                    **PFieldList);
>   
> @@ -698,6 +706,7 @@ extern const unsigned char  TemplateFadt[];
>   extern const unsigned char  TemplateFpdt[];
>   extern const unsigned char  TemplateGtdt[];
>   extern const unsigned char  TemplateHest[];
> +extern const unsigned char  TemplateHmat[];
>   extern const unsigned char  TemplateHpet[];
>   extern const unsigned char  TemplateIort[];
>   extern const unsigned char  TemplateIvrs[];
> @@ -712,6 +721,7 @@ extern const unsigned char  TemplateMtmr[];
>   extern const unsigned char  TemplateNfit[];
>   extern const unsigned char  TemplatePcct[];
>   extern const unsigned char  TemplatePmtt[];
> +extern const unsigned char  TemplatePptt[];
>   extern const unsigned char  TemplateRasf[];
>   extern const unsigned char  TemplateRsdt[];
>   extern const unsigned char  TemplateS3pt[];
> @@ -731,6 +741,7 @@ extern const unsigned char  TemplateWdat[];
>   extern const unsigned char  TemplateWddt[];
>   extern const unsigned char  TemplateWdrt[];
>   extern const unsigned char  TemplateWpbt[];
> +extern const unsigned char  TemplateWsmt[];
>   extern const unsigned char  TemplateXenv[];
>   extern const unsigned char  TemplateXsdt[];
>   
> diff --git a/src/acpica/source/compiler/dtfield.c b/src/acpica/source/compiler/dtfield.c
> index 33afa3bf..13e8b638 100644
> --- a/src/acpica/source/compiler/dtfield.c
> +++ b/src/acpica/source/compiler/dtfield.c
> @@ -679,6 +679,36 @@ DtCompileFlag (
>           BitLength = 2;
>           break;
>   
> +    case ACPI_DMT_FLAGS4_0:
> +
> +        BitPosition = 0;
> +        BitLength = 4;
> +        break;
> +
> +    case ACPI_DMT_FLAGS4_4:
> +
> +        BitPosition = 4;
> +        BitLength = 4;
> +        break;
> +
> +    case ACPI_DMT_FLAGS4_8:
> +
> +        BitPosition = 8;
> +        BitLength = 4;
> +        break;
> +
> +    case ACPI_DMT_FLAGS4_12:
> +
> +        BitPosition = 12;
> +        BitLength = 4;
> +        break;
> +
> +    case ACPI_DMT_FLAGS16_16:
> +
> +        BitPosition = 16;
> +        BitLength = 16;
> +        break;
> +
>       default:
>   
>           DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode");
> diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c
> index c25f4b0e..bdf0419c 100644
> --- a/src/acpica/source/compiler/dttable1.c
> +++ b/src/acpica/source/compiler/dttable1.c
> @@ -1249,6 +1249,16 @@ DtCompileHest (
>               InfoTable = AcpiDmTableInfoHest9;
>               break;
>   
> +        case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
> +
> +            InfoTable = AcpiDmTableInfoHest10;
> +            break;
> +
> +        case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
> +
> +            InfoTable = AcpiDmTableInfoHest11;
> +            break;
> +
>           default:
>   
>               /* Cannot continue on unknown type */
> @@ -1283,6 +1293,12 @@ DtCompileHest (
>                   Subtable->Buffer))->NumHardwareBanks;
>               break;
>   
> +        case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
> +
> +            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
> +                Subtable->Buffer))->NumHardwareBanks;
> +            break;
> +
>           default:
>   
>               break;
> @@ -1308,6 +1324,218 @@ DtCompileHest (
>   
>   /******************************************************************************
>    *
> + * FUNCTION:    DtCompileHmat
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile HMAT.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompileHmat (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    DT_FIELD                *SubtableStart;
> +    DT_FIELD                *EntryStart;
> +    ACPI_HMAT_STRUCTURE     *HmatStruct;
> +    ACPI_HMAT_LOCALITY      *HmatLocality;
> +    ACPI_HMAT_CACHE         *HmatCache;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    UINT32                  IntPDNumber;
> +    UINT32                  TgtPDNumber;
> +    UINT64                  EntryNumber;
> +    UINT16                  SMBIOSHandleNumber;
> +
> +
> +    ParentTable = DtPeekSubtable ();
> +
> +    Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat,
> +        &Subtable, TRUE);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return (Status);
> +    }
> +    DtInsertSubtable (ParentTable, Subtable);
> +
> +    while (*PFieldList)
> +    {
> +        /* Compile HMAT structure header */
> +
> +        SubtableStart = *PFieldList;
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr,
> +            &Subtable, TRUE);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +        DtInsertSubtable (ParentTable, Subtable);
> +
> +        HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer);
> +        HmatStruct->Length = Subtable->Length;
> +
> +        /* Compile HMAT structure body */
> +
> +        switch (HmatStruct->Type)
> +        {
> +        case ACPI_HMAT_TYPE_ADDRESS_RANGE:
> +
> +            InfoTable = AcpiDmTableInfoHmat0;
> +            break;
> +
> +        case ACPI_HMAT_TYPE_LOCALITY:
> +
> +            InfoTable = AcpiDmTableInfoHmat1;
> +            break;
> +
> +        case ACPI_HMAT_TYPE_CACHE:
> +
> +            InfoTable = AcpiDmTableInfoHmat2;
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT");
> +            return (AE_ERROR);
> +        }
> +
> +        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +        DtInsertSubtable (ParentTable, Subtable);
> +        HmatStruct->Length += Subtable->Length;
> +
> +        /* Compile HMAT structure additionals */
> +
> +        switch (HmatStruct->Type)
> +        {
> +        case ACPI_HMAT_TYPE_LOCALITY:
> +
> +            HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY,
> +                Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
> +
> +            /* Compile initiator proximity domain list */
> +
> +            IntPDNumber = 0;
> +            while (*PFieldList)
> +            {
> +                Status = DtCompileTable (PFieldList,
> +                    AcpiDmTableInfoHmat1a, &Subtable, TRUE);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                if (!Subtable)
> +                {
> +                    break;
> +                }
> +                DtInsertSubtable (ParentTable, Subtable);
> +                HmatStruct->Length += Subtable->Length;
> +                IntPDNumber++;
> +            }
> +            HmatLocality->NumberOfInitiatorPDs = IntPDNumber;
> +
> +            /* Compile target proximity domain list */
> +
> +            TgtPDNumber = 0;
> +            while (*PFieldList)
> +            {
> +                Status = DtCompileTable (PFieldList,
> +                    AcpiDmTableInfoHmat1b, &Subtable, TRUE);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                if (!Subtable)
> +                {
> +                    break;
> +                }
> +                DtInsertSubtable (ParentTable, Subtable);
> +                HmatStruct->Length += Subtable->Length;
> +                TgtPDNumber++;
> +            }
> +            HmatLocality->NumberOfTargetPDs = TgtPDNumber;
> +
> +            /* Save start of the entries for reporting errors */
> +
> +            EntryStart = *PFieldList;
> +
> +            /* Compile latency/bandwidth entries */
> +
> +            EntryNumber = 0;
> +            while (*PFieldList)
> +            {
> +                Status = DtCompileTable (PFieldList,
> +                    AcpiDmTableInfoHmat1c, &Subtable, TRUE);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                if (!Subtable)
> +                {
> +                    break;
> +                }
> +                DtInsertSubtable (ParentTable, Subtable);
> +                HmatStruct->Length += Subtable->Length;
> +                EntryNumber++;
> +            }
> +
> +            /* Validate number of entries */
> +
> +            if (EntryNumber !=
> +                ((UINT64)IntPDNumber * (UINT64)TgtPDNumber))
> +            {
> +                DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT");
> +                return (AE_ERROR);
> +            }
> +            break;
> +
> +        case ACPI_HMAT_TYPE_CACHE:
> +
> +            /* Compile SMBIOS handles */
> +
> +            HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE,
> +                Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
> +            SMBIOSHandleNumber = 0;
> +            while (*PFieldList)
> +            {
> +                Status = DtCompileTable (PFieldList,
> +                    AcpiDmTableInfoHmat2a, &Subtable, TRUE);
> +                if (ACPI_FAILURE (Status))
> +                {
> +                    return (Status);
> +                }
> +                if (!Subtable)
> +                {
> +                    break;
> +                }
> +                DtInsertSubtable (ParentTable, Subtable);
> +                HmatStruct->Length += Subtable->Length;
> +                SMBIOSHandleNumber++;
> +            }
> +            HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber;
> +            break;
> +
> +        default:
> +
> +            break;
> +        }
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/******************************************************************************
> + *
>    * FUNCTION:    DtCompileIort
>    *
>    * PARAMETERS:  List                - Current field list pointer
> diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c
> index e1d0e8bf..356a7d0d 100644
> --- a/src/acpica/source/compiler/dttable2.c
> +++ b/src/acpica/source/compiler/dttable2.c
> @@ -871,6 +871,16 @@ DtCompilePcct (
>               InfoTable = AcpiDmTableInfoPcct2;
>               break;
>   
> +        case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct3;
> +            break;
> +
> +        case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
> +
> +            InfoTable = AcpiDmTableInfoPcct4;
> +            break;
> +
>           default:
>   
>               DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
> @@ -1037,6 +1047,125 @@ DtCompilePmtt (
>   
>   /******************************************************************************
>    *
> + * FUNCTION:    DtCompilePptt
> + *
> + * PARAMETERS:  List                - Current field list pointer
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: Compile PPTT.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +DtCompilePptt (
> +    void                    **List)
> +{
> +    ACPI_STATUS             Status;
> +    ACPI_SUBTABLE_HEADER    *PpttHeader;
> +    ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
> +    DT_SUBTABLE             *Subtable;
> +    DT_SUBTABLE             *ParentTable;
> +    ACPI_DMTABLE_INFO       *InfoTable;
> +    DT_FIELD                **PFieldList = (DT_FIELD **) List;
> +    DT_FIELD                *SubtableStart;
> +
> +
> +    ParentTable = DtPeekSubtable ();
> +    while (*PFieldList)
> +    {
> +        SubtableStart = *PFieldList;
> +
> +        /* Compile PPTT subtable header */
> +
> +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
> +            &Subtable, TRUE);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +        DtInsertSubtable (ParentTable, Subtable);
> +        PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
> +        PpttHeader->Length = (UINT8)(Subtable->Length);
> +
> +        switch (PpttHeader->Type)
> +        {
> +        case ACPI_PPTT_TYPE_PROCESSOR:
> +
> +            InfoTable = AcpiDmTableInfoPptt0;
> +            break;
> +
> +        case ACPI_PPTT_TYPE_CACHE:
> +
> +            InfoTable = AcpiDmTableInfoPptt1;
> +            break;
> +
> +        case ACPI_PPTT_TYPE_ID:
> +
> +            InfoTable = AcpiDmTableInfoPptt2;
> +            break;
> +
> +        default:
> +
> +            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
> +            return (AE_ERROR);
> +        }
> +
> +        /* Compile PPTT subtable body */
> +
> +        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            return (Status);
> +        }
> +        DtInsertSubtable (ParentTable, Subtable);
> +        PpttHeader->Length += (UINT8)(Subtable->Length);
> +
> +        /* Compile PPTT subtable additionals */
> +
> +        switch (PpttHeader->Type)
> +        {
> +        case ACPI_PPTT_TYPE_PROCESSOR:
> +
> +            PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
> +                Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
> +            if (PpttProcessor)
> +            {
> +                /* Compile initiator proximity domain list */
> +
> +                PpttProcessor->NumberOfPrivResources = 0;
> +                while (*PFieldList)
> +                {
> +                    Status = DtCompileTable (PFieldList,
> +                        AcpiDmTableInfoPptt0a, &Subtable, TRUE);
> +                    if (ACPI_FAILURE (Status))
> +                    {
> +                        return (Status);
> +                    }
> +                    if (!Subtable)
> +                    {
> +                        break;
> +                    }
> +
> +                    DtInsertSubtable (ParentTable, Subtable);
> +                    PpttHeader->Length += (UINT8)(Subtable->Length);
> +                    PpttProcessor->NumberOfPrivResources++;
> +                }
> +            }
> +            break;
> +
> +        default:
> +
> +            break;
> +        }
> +    }
> +
> +    return (AE_OK);
> +}
> +
> +
> +/******************************************************************************
> + *
>    * FUNCTION:    DtCompileRsdt
>    *
>    * PARAMETERS:  List                - Current field list pointer
> @@ -1324,6 +1453,11 @@ DtCompileSrat (
>               InfoTable = AcpiDmTableInfoSrat3;
>               break;
>   
> +        case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
> +
> +            InfoTable = AcpiDmTableInfoSrat4;
> +            break;
> +
>           default:
>   
>               DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
> diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
> index 701e70f4..bb4dded4 100644
> --- a/src/acpica/source/compiler/dttemplate.h
> +++ b/src/acpica/source/compiler/dttemplate.h
> @@ -577,11 +577,11 @@ const unsigned char TemplateGtdt[] =
>   
>   const unsigned char TemplateHest[] =
>   {
> -    0x48,0x45,0x53,0x54,0xD4,0x01,0x00,0x00,  /* 00000000    "HEST...." */
> -    0x01,0x20,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ". INTEL " */
> -    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> +    0x48,0x45,0x53,0x54,0x7C,0x02,0x00,0x00,  /* 00000000    "HEST|..." */
> +    0x01,0x97,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>       0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x28,0x05,0x10,0x20,0x04,0x00,0x00,0x00,  /* 00000020    "(.. ...." */
> +    0x03,0x03,0x17,0x20,0x04,0x00,0x00,0x00,  /* 00000020    "... ...." */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,  /* 00000028    "........" */
>       0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> @@ -596,7 +596,7 @@ const unsigned char TemplateHest[] =
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
>       0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x01,  /* 00000088    "........" */
>       0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000090    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
> +    0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A8    "........" */
>       0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,  /* 000000B0    "........" */
> @@ -635,7 +635,52 @@ const unsigned char TemplateHest[] =
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B8    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C0    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C8    "........" */
> -    0x00,0x10,0x00,0x00                       /* 000001D0    "...."     */
> +    0x00,0x10,0x00,0x00,0x0A,0x00,0x03,0x00,  /* 000001D0    "........" */
> +    0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,  /* 000001D8    "........" */
> +    0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,  /* 000001E0    "........" */
> +    0x00,0x40,0x00,0x04,0x00,0x00,0x00,0x00,  /* 000001E8    ".@......" */
> +    0x00,0x00,0x00,0x00,0x04,0x1C,0x00,0x00,  /* 000001F0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001F8    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000208    "........" */
> +    0x00,0x10,0x00,0x00,0x00,0x40,0x00,0x04,  /* 00000210    ".....@.." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000218    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000220    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000228    "........" */
> +    0x0B,0x00,0x01,0x00,0x00,0x00,0x00,0x01,  /* 00000230    "........" */
> +    0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000238    "........" */
> +    0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000240    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000248    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000250    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000258    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000260    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000268    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000270    "........" */
> +    0x00,0x00,0x00,0x00                       /* 00000278    "...."     */
> +};
> +
> +const unsigned char TemplateHmat[] =
> +{
> +    0x48,0x4D,0x41,0x54,0x9C,0x00,0x00,0x00,  /* 00000000    "HMAT...." */
> +    0x00,0x54,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".TINTEL " */
> +    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> +    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x03,0x03,0x17,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,  /* 00000028    "....(..." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
> +    0x01,0x00,0x00,0x00,0x2A,0x00,0x00,0x00,  /* 00000050    "....*..." */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000058    "........" */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
> +    0x00,0x00,0x02,0x00,0x00,0x00,0x22,0x00,  /* 00000078    "......"." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> +    0x01,0x00,0x00,0x00                       /* 00000098    "...."     */
>   };
>   
>   const unsigned char TemplateHpet[] =
> @@ -958,39 +1003,80 @@ const unsigned char TemplateMtmr[] =
>   
>   const unsigned char TemplatePcct[] =
>   {
> -    0x50,0x43,0x43,0x54,0x06,0x01,0x00,0x00,  /* 00000000    "PCCT...." */
> -    0x01,0xE3,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> -    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> -    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x18,0x03,0x16,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
> +    0x50,0x43,0x43,0x54,0x4e,0x02,0x00,0x00,  /* 00000000    "PCCTN..." */
> +    0x01,0x47,0x49,0x4e,0x54,0x45,0x4c,0x20,  /* 00000008    ".GINTEL " */
> +    0x54,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,  /* 00000010    "Template" */
> +    0x01,0x00,0x00,0x00,0x49,0x4e,0x54,0x4c,  /* 00000018    "....INTL" */
> +    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
> -    0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
> +    0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
>       0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,  /* 00000038    "........" */
>       0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000040    """""""""" */
>       0x01,0x32,0x00,0x03,0x33,0x33,0x33,0x33,  /* 00000048    ".2..3333" */
>       0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,  /* 00000050    "3333DDDD" */
>       0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x55,  /* 00000058    "DDDDUUUU" */
>       0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,  /* 00000060    "UUUUffff" */
> -    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3E,  /* 00000068    "wwww...>" */
> +    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3e,  /* 00000068    "wwww...>" */
>       0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000070    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000080    ".......2" */
>       0x00,0x03,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000088    "..DDDDDD" */
>       0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000090    "DDDDDDDD" */
>       0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 00000098    "DDUUUUUU" */
> -    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000A0    "UUffffww" */
> -    0x77,0x77,0x88,0x88,0x02,0x5A,0x01,0x00,  /* 000000A8    "ww...Z.." */
> -    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
> -    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
> -    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000C0    ".....2.." */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000C8    "DDDDDDDD" */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000D0    "DDDDDDDD" */
> -    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000D8    "UUUUUUUU" */
> -    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000E0    "ffffwwww" */
> -    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000E8    "...2..33" */
> -    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000F0    "333333DD" */
> -    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000F8    "DDDDDDUU" */
> -    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000100    "UUUUUU"   */
> +    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000a0    "UUffffww" */
> +    0x77,0x77,0x88,0x88,0x02,0x5a,0x01,0x00,  /* 000000a8    "ww...Z.." */
> +    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000b0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000b8    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000c0    ".....2.." */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000c8    "DDDDDDDD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000d0    "DDDDDDDD" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000d8    "UUUUUUUU" */
> +    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000e0    "ffffwwww" */
> +    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000e8    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000f0    "333333DD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000f8    "DDDDDDUU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xa4,  /* 00000100    "UUUUUU.." */
> +    0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
> +    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000118    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000120    "333333DD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 00000128    "DDDDDDUU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x66,  /* 00000130    "UUUUUUff" */
> +    0x66,0x66,0x77,0x77,0x77,0x77,0x88,0x88,  /* 00000138    "ffwwww.." */
> +    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000140    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x99,0x99,  /* 00000148    "333333.." */
> +    0x99,0x99,0x99,0x99,0x99,0x99,0x00,0x00,  /* 00000150    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000160    ".......2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000168    "..333333" */
> +    0x33,0x33,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000170    "33""""""" */
> +    0x22,0x22,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000178    """.2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000180    "33333333" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000188    "333333DD" */
> +    0x44,0x44,0x44,0x44,0x44,0x44,0x01,0x32,  /* 00000190    "DDDDDD.2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000198    "..333333" */
> +    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001a0    "33UUUUUU" */
> +    0x55,0x55,0x04,0xa4,0x01,0x00,0x00,0x00,  /* 000001a8    "UU......" */
> +    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001b0    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001b8    ".......2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001c0    "..333333" */
> +    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001c8    "33DDDDDD" */
> +    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001d0    "DDUUUUUU" */
> +    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001d8    "UUffffww" */
> +    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001e0    "ww.....2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001e8    "..333333" */
> +    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001f0    "33......" */
> +    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001f8    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
> +    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000208    "...2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,  /* 00000210    "333333""" */
> +    0x22,0x22,0x22,0x22,0x22,0x22,0x01,0x32,  /* 00000218    """"""".2" */
> +    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000220    "..333333" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000228    "33333333" */
> +    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000230    "33DDDDDD" */
> +    0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000238    "DD.2..33" */
> +    0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000240    "333333UU" */
> +    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000248    "UUUUUU|   */
>   };
>   
>   const unsigned char TemplatePmtt[] =
> @@ -1020,6 +1106,25 @@ const unsigned char TemplatePmtt[] =
>       0x00,0x00,0x00,0x00                       /* 000000B0    "...."     */
>   };
>   
> +const unsigned char TemplatePptt[] =
> +{
> +    0x50,0x50,0x54,0x54,0x72,0x00,0x00,0x00,  /* 00000000    "PPTTr..." */
> +    0x01,0x86,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> +    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x03,0x03,0x17,0x20,0x00,0x18,0x00,0x00,  /* 00000020    "... ...." */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
> +    0x00,0x00,0x00,0x00,0x01,0x18,0x00,0x00,  /* 00000038    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
> +    0x00,0x00,0x00,0x00,0x02,0x1E,0x00,0x00,  /* 00000050    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
> +    0x00,0x00                                 /* 00000070    ".."       */
> +};
> +
>   const unsigned char TemplateRasf[] =
>   {
>       0x52,0x41,0x53,0x46,0x30,0x00,0x00,0x00,  /* 00000000    "RASF0..." */
> @@ -1213,11 +1318,11 @@ const unsigned char TemplateSpmi[] =
>   
>   const unsigned char TemplateSrat[] =
>   {
> -    0x53,0x52,0x41,0x54,0x92,0x00,0x00,0x00,  /* 00000000    "SRAT...." */
> -    0x03,0x50,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".PINTEL " */
> +    0x53,0x52,0x41,0x54,0x9E,0x00,0x00,0x00,  /* 00000000    "SRAT...." */
> +    0x03,0x55,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".UINTEL " */
>       0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
>       0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> -    0x24,0x07,0x14,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "$.. ...." */
> +    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
>       0x00,0x10,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
> @@ -1231,7 +1336,8 @@ const unsigned char TemplateSrat[] =
>       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
>       0x03,0x12,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
>       0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
> -    0x00,0x00                                 /* 00000090    ".."       */
> +    0x00,0x00,0x04,0x0C,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
> +    0x00,0x00,0x01,0x00,0x00,0x00             /* 00000098    "......"   */
>   };
>   
>   const unsigned char TemplateStao[] =
> @@ -1379,6 +1485,15 @@ const unsigned char TemplateWpbt[] =
>       0x72,0x00,0x74,0x00,0x68,0x00,0x00,0x00   /* 00000090    "r.t.h..." */
>   };
>   
> +const unsigned char TemplateWsmt[] =
> +{
> +    0x57,0x53,0x4D,0x54,0x28,0x00,0x00,0x00,  /* 00000000    "WSMT(..." */
> +    0x00,0x08,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
> +    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
> +    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
> +    0x19,0x01,0x17,0x20,0x05,0x00,0x00,0x00   /* 00000020    "... ...." */
> +};
> +
>   const unsigned char TemplateXenv[] =
>   {
>       0x58,0x45,0x4E,0x56,0x39,0x00,0x00,0x00,  /* 00000000    "XENV9..." */
> diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
> index 7fbc7d56..88072175 100644
> --- a/src/acpica/source/compiler/dtutils.c
> +++ b/src/acpica/source/compiler/dtutils.c
> @@ -371,6 +371,11 @@ DtGetFieldType (
>       case ACPI_DMT_FLAGS1:
>       case ACPI_DMT_FLAGS2:
>       case ACPI_DMT_FLAGS4:
> +    case ACPI_DMT_FLAGS4_0:
> +    case ACPI_DMT_FLAGS4_4:
> +    case ACPI_DMT_FLAGS4_8:
> +    case ACPI_DMT_FLAGS4_12:
> +    case ACPI_DMT_FLAGS16_16:
>   
>           Type = DT_FIELD_TYPE_FLAG;
>           break;
> @@ -512,6 +517,11 @@ DtGetFieldLength (
>       case ACPI_DMT_FLAGS1:
>       case ACPI_DMT_FLAGS2:
>       case ACPI_DMT_FLAGS4:
> +    case ACPI_DMT_FLAGS4_0:
> +    case ACPI_DMT_FLAGS4_4:
> +    case ACPI_DMT_FLAGS4_8:
> +    case ACPI_DMT_FLAGS4_12:
> +    case ACPI_DMT_FLAGS16_16:
>       case ACPI_DMT_LABEL:
>       case ACPI_DMT_EXTRA_TEXT:
>   
> @@ -527,6 +537,7 @@ DtGetFieldLength (
>       case ACPI_DMT_MADT:
>       case ACPI_DMT_PCCT:
>       case ACPI_DMT_PMTT:
> +    case ACPI_DMT_PPTT:
>       case ACPI_DMT_SRAT:
>       case ACPI_DMT_ASF:
>       case ACPI_DMT_HESTNTYP:
> @@ -543,6 +554,7 @@ DtGetFieldLength (
>       case ACPI_DMT_UINT16:
>       case ACPI_DMT_DMAR:
>       case ACPI_DMT_HEST:
> +    case ACPI_DMT_HMAT:
>       case ACPI_DMT_NFIT:
>       case ACPI_DMT_PCI_PATH:
>   
> diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c
> index 1020512b..5fa7d1d1 100644
> --- a/src/acpica/source/compiler/fwts_iasl_interface.c
> +++ b/src/acpica/source/compiler/fwts_iasl_interface.c
> @@ -95,7 +95,7 @@ int fwts_iasl_disassemble_aml(
>   		/* Setup ACPICA disassembler globals */
>   		Gbl_WarningLevel = ASL_WARNING3;
>   		Gbl_IgnoreErrors = TRUE;
> -		Gbl_DisasmFlag = TRUE;
> +		AcpiGbl_DisasmFlag = TRUE;
>   		Gbl_DoCompile = FALSE;
>   		Gbl_OutputFilenamePrefix = (char*)outputfile;
>   		Gbl_UseDefaultAmlFilename = FALSE;
> @@ -233,7 +233,7 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde
>   		(void)close(stderr_fds[0]);
>   
>   		/* Setup ACPICA compiler globals */
> -		Gbl_DisasmFlag = FALSE;
> +		AcpiGbl_DisasmFlag = FALSE;
>   		Gbl_DoCompile = TRUE;
>   		Gbl_PreprocessFlag = TRUE;
>   		Gbl_UseDefaultAmlFilename = FALSE;
> diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
> index 83af8896..0a00be81 100644
> --- a/src/acpica/source/components/debugger/dbexec.c
> +++ b/src/acpica/source/components/debugger/dbexec.c
> @@ -314,6 +314,18 @@ AcpiDbExecuteMethod (
>   
>       if (ACPI_FAILURE (Status))
>       {
> +        if ((Status == AE_ABORT_METHOD) || AcpiGbl_AbortMethod)
> +        {
> +            /* Clear the abort and fall back to the debugger prompt */
> +
> +            ACPI_EXCEPTION ((AE_INFO, Status,
> +                "Aborting top-level method"));
> +
> +            AcpiGbl_AbortMethod = FALSE;
> +            Status = AE_OK;
> +            goto Cleanup;
> +        }
> +
>           ACPI_EXCEPTION ((AE_INFO, Status,
>               "while executing %s from debugger", Info->Pathname));
>   
> diff --git a/src/acpica/source/components/debugger/dbobject.c b/src/acpica/source/components/debugger/dbobject.c
> index 81f6b6e8..66906ef8 100644
> --- a/src/acpica/source/components/debugger/dbobject.c
> +++ b/src/acpica/source/components/debugger/dbobject.c
> @@ -588,7 +588,7 @@ AcpiDbDecodeLocals (
>   
>       if (DisplayLocals)
>       {
> -        AcpiOsPrintf ("\nInitialized Local Variables for method [%4.4s]:\n",
> +        AcpiOsPrintf ("\nInitialized Local Variables for Method [%4.4s]:\n",
>               AcpiUtGetNodeName (Node));
>   
>           for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
> @@ -604,7 +604,7 @@ AcpiDbDecodeLocals (
>       else
>       {
>           AcpiOsPrintf (
> -            "No Local Variables are initialized for method [%4.4s]\n",
> +            "No Local Variables are initialized for Method [%4.4s]\n",
>               AcpiUtGetNodeName (Node));
>       }
>   }
> @@ -667,7 +667,7 @@ AcpiDbDecodeArguments (
>           AcpiOsPrintf (
>               "Initialized Arguments for Method [%4.4s]:  "
>               "(%X arguments defined for method invocation)\n",
> -            AcpiUtGetNodeName (Node), ObjDesc->Method.ParamCount);
> +            AcpiUtGetNodeName (Node), Node->Object->Method.ParamCount);
>   
>           for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
>           {
> diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c
> index 02c4e5db..bfa7d7c7 100644
> --- a/src/acpica/source/components/debugger/dbxface.c
> +++ b/src/acpica/source/components/debugger/dbxface.c
> @@ -379,7 +379,7 @@ AcpiDbSingleStep (
>           if ((AcpiGbl_DbOutputToFile)        ||
>               (AcpiDbgLevel & ACPI_LV_PARSE))
>           {
> -            AcpiOsPrintf ("\n[AmlDebug] Next AML Opcode to execute:\n");
> +            AcpiOsPrintf ("\nAML Debug: Next AML Opcode to execute:\n");
>           }
>   
>           /*
> diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c
> index 75cc0963..27ea16b4 100644
> --- a/src/acpica/source/components/disassembler/dmbuffer.c
> +++ b/src/acpica/source/components/disassembler/dmbuffer.c
> @@ -261,7 +261,7 @@ AcpiDmDisasmByteList (
>   
>           /* Dump the ASCII equivalents within a comment */
>   
> -        AcpiOsPrintf ("  /* ");
> +        AcpiOsPrintf ("  // ");
>           for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
>           {
>               CurrentIndex = i + j;
> @@ -283,7 +283,7 @@ AcpiDmDisasmByteList (
>   
>           /* Finished with this line */
>   
> -        AcpiOsPrintf (" */\n");
> +        AcpiOsPrintf ("\n");
>       }
>   }
>   
> diff --git a/src/acpica/source/components/disassembler/dmdeferred.c b/src/acpica/source/components/disassembler/dmdeferred.c
> index 8123e252..0368b0a6 100644
> --- a/src/acpica/source/components/disassembler/dmdeferred.c
> +++ b/src/acpica/source/components/disassembler/dmdeferred.c
> @@ -190,7 +190,7 @@ AcpiDmParseDeferredOps (
>       ACPI_STATUS             Status;
>   
>   
> -    ACPI_FUNCTION_ENTRY ();
> +    ACPI_FUNCTION_TRACE (DmParseDeferredOps);
>   
>   
>       /* Traverse the entire parse tree */
> @@ -217,7 +217,7 @@ AcpiDmParseDeferredOps (
>                   Op, Op->Named.Data, Op->Named.Length);
>               if (ACPI_FAILURE (Status))
>               {
> -                return (Status);
> +                return_ACPI_STATUS (Status);
>               }
>               break;
>   
> @@ -245,7 +245,7 @@ AcpiDmParseDeferredOps (
>           Op = AcpiPsGetDepthNext (Root, Op);
>       }
>   
> -    return (AE_OK);
> +    return_ACPI_STATUS (AE_OK);
>   }
>   
>   
> diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
> index af1f9644..8d9b532a 100644
> --- a/src/acpica/source/components/disassembler/dmopcode.c
> +++ b/src/acpica/source/components/disassembler/dmopcode.c
> @@ -177,15 +177,6 @@ static void
>   AcpiDmPromoteSubtree (
>       ACPI_PARSE_OBJECT       *StartOp);
>   
> -static BOOLEAN
> -AcpiDmIsSwitchBlock (
> -    ACPI_PARSE_OBJECT       *Op,
> -    char                    *Temp);
> -
> -static BOOLEAN
> -AcpiDmIsCaseBlock (
> -    ACPI_PARSE_OBJECT       *Op);
> -
>   /*******************************************************************************
>    *
>    * FUNCTION:    AcpiDmDisplayTargetPathname
> @@ -1127,9 +1118,7 @@ AcpiDmDisassembleOneOp (
>   
>           if (AcpiGbl_DmEmitExternalOpcodes)
>           {
> -            AcpiDmEmitExternal (AcpiPsGetArg(Op, 0),
> -                AcpiPsGetArg(Op, 1));
> -            break;
> +            AcpiDmEmitExternal (Op, AcpiPsGetArg(Op, 0));
>           }
>   
>           break;
> @@ -1367,414 +1356,3 @@ AcpiDmPromoteSubtree (
>           Op = Op->Common.Next;
>       }
>   }
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiDmIsTempName
> - *
> - * PARAMETERS:  Op              - Object to be examined
> - *
> - * RETURN:      TRUE if object is a temporary (_T_x) name for a matching While
> - *              loop that can be converted to a Switch.
> - *
> - * DESCRIPTION: _T_X objects are only used for Switch statements. If a temporary
> - *              name exists, search the siblings for a matching While (One) loop
> - *              that can be converted to a Switch. Return TRUE if a match was
> - *              found, FALSE otherwise.
> - *
> - ******************************************************************************/
> -
> -BOOLEAN
> -AcpiDmIsTempName (
> -    ACPI_PARSE_OBJECT       *Op)
> -{
> -    ACPI_PARSE_OBJECT       *CurrentOp;
> -    char                    *Temp;
> -
> -    if (Op->Common.AmlOpcode != AML_NAME_OP)
> -    {
> -        return (FALSE);
> -    }
> -
> -    Temp = (char *)(Op->Common.Aml);
> -    ++Temp;
> -
> -    if (strncmp(Temp, "_T_", 3))
> -    {
> -        return (FALSE);
> -    }
> -
> -    CurrentOp = Op->Common.Next;
> -    while (CurrentOp)
> -    {
> -        if (CurrentOp->Common.AmlOpcode == AML_WHILE_OP &&
> -            AcpiDmIsSwitchBlock(CurrentOp, Temp))
> -        {
> -            Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> -            CurrentOp->Common.DisasmOpcode = ACPI_DASM_SWITCH;
> -
> -            return (TRUE);
> -        }
> -        CurrentOp = CurrentOp->Common.Next;
> -    }
> -
> -    return (FALSE);
> -}
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiDmIsSwitchBlock
> - *
> - * PARAMETERS:  Op              - While Object
> - *
> - * RETURN:      TRUE if While block can be converted to a Switch/Case block
> - *
> - * DESCRIPTION: Determines if While block is a Switch/Case statement. Modifies
> - *              parse tree to allow for Switch/Case disassembly during walk.
> - *
> - * EXAMPLE: Example of parse tree to be converted
> - *
> - *    While
> - *        One
> - *        Store
> - *            ByteConst
> - *             -NamePath-
> - *        If
> - *            LEqual
> - *                -NamePath-
> - *                Zero
> - *            Return
> - *                One
> - *        Else
> - *            Return
> - *                WordConst
> - *        Break
> - *
> - ******************************************************************************/
> -
> -static BOOLEAN
> -AcpiDmIsSwitchBlock (
> -    ACPI_PARSE_OBJECT       *Op,
> -    char                    *Temp)
> -{
> -    ACPI_PARSE_OBJECT       *OneOp;
> -    ACPI_PARSE_OBJECT       *StoreOp;
> -    ACPI_PARSE_OBJECT       *NamePathOp;
> -    ACPI_PARSE_OBJECT       *PredicateOp;
> -    ACPI_PARSE_OBJECT       *CurrentOp;
> -    ACPI_PARSE_OBJECT       *TempOp;
> -
> -    /* Check for One Op Predicate */
> -
> -    OneOp = AcpiPsGetArg (Op, 0);
> -    if (!OneOp || (OneOp->Common.AmlOpcode != AML_ONE_OP))
> -    {
> -        return (FALSE);
> -    }
> -
> -    /* Check for Store Op */
> -
> -    StoreOp = OneOp->Common.Next;
> -    if (!StoreOp || (StoreOp->Common.AmlOpcode != AML_STORE_OP))
> -    {
> -        return (FALSE);
> -    }
> -
> -    /* Check for Name Op with _T_ string */
> -
> -    NamePathOp = AcpiPsGetArg (StoreOp, 1);
> -    if (!NamePathOp || (NamePathOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
> -    {
> -        return (FALSE);
> -    }
> -
> -    if (strncmp((char *)(NamePathOp->Common.Aml), Temp, 4))
> -    {
> -        return (FALSE);
> -    }
> -
> -    /* This is a Switch/Case control block */
> -
> -    /* Ignore the One Op Predicate */
> -
> -    OneOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> -
> -    /* Ignore the Store Op, but not the children */
> -
> -    StoreOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
> -
> -    /*
> -     * First arg of Store Op is the Switch condition.
> -     * Mark it as a Switch predicate and as a parameter list for paren
> -     * closing and correct indentation.
> -     */
> -    PredicateOp = AcpiPsGetArg (StoreOp, 0);
> -    PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
> -    PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
> -
> -    /* Ignore the Name Op */
> -
> -    NamePathOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
> -
> -    /* Remaining opcodes are the Case statements (If/ElseIf's) */
> -
> -    CurrentOp = StoreOp->Common.Next;
> -    while (AcpiDmIsCaseBlock (CurrentOp))
> -    {
> -        /* Block is a Case structure */
> -
> -        if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> -        {
> -            /* ElseIf */
> -
> -            CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
> -            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -        }
> -
> -        /* If */
> -
> -        CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
> -
> -        /*
> -         * Mark the parse tree for Case disassembly. There are two
> -         * types of Case statements. The first type of statement begins with
> -         * an LEqual. The second starts with an LNot and uses a Match statement
> -         * on a Package of constants.
> -         */
> -        TempOp = AcpiPsGetArg (CurrentOp, 0);
> -        switch (TempOp->Common.AmlOpcode)
> -        {
> -            case (AML_LOGICAL_EQUAL_OP):
> -
> -                /* Ignore just the LEqual Op */
> -
> -                TempOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
> -
> -                /* Ignore the NamePath Op */
> -
> -                TempOp = AcpiPsGetArg (TempOp, 0);
> -                TempOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
> -
> -                /*
> -                 * Second arg of LEqual will be the Case predicate.
> -                 * Mark it as a predicate and also as a parameter list for paren
> -                 * closing and correct indentation.
> -                 */
> -                PredicateOp = TempOp->Common.Next;
> -                PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
> -                PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
> -
> -                break;
> -
> -            case (AML_LOGICAL_NOT_OP):
> -
> -                /*
> -                 * The Package will be the predicate of the Case statement.
> -                 * It's under:
> -                 *            LNOT
> -                 *                LEQUAL
> -                 *                    MATCH
> -                 *                        PACKAGE
> -                 */
> -
> -                /* Get the LEqual Op from LNot */
> -
> -                TempOp = AcpiPsGetArg (TempOp, 0);
> -
> -                /* Get the Match Op from LEqual */
> -
> -                TempOp = AcpiPsGetArg (TempOp, 0);
> -
> -                /* Get the Package Op from Match */
> -
> -                PredicateOp = AcpiPsGetArg (TempOp, 0);
> -
> -                /* Mark as parameter list for paren closing */
> -
> -                PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
> -
> -                /*
> -                 * The Package list would be too deeply indented if we
> -                 * chose to simply ignore the all the parent opcodes, so
> -                 * we rearrange the parse tree instead.
> -                 */
> -
> -                /*
> -                 * Save the second arg of the If/Else Op which is the
> -                 * block code of code for this Case statement.
> -                 */
> -                TempOp = AcpiPsGetArg (CurrentOp, 1);
> -
> -                /*
> -                 * Move the Package Op to the child (predicate) of the
> -                 * Case statement.
> -                 */
> -                CurrentOp->Common.Value.Arg = PredicateOp;
> -                PredicateOp->Common.Parent = CurrentOp;
> -
> -                /* Add the block code */
> -
> -                PredicateOp->Common.Next = TempOp;
> -
> -                break;
> -
> -            default:
> -
> -                /* Should never get here */
> -
> -                break;
> -        }
> -
> -        /* Advance to next Case block */
> -
> -        CurrentOp = CurrentOp->Common.Next;
> -    }
> -
> -    /* If CurrentOp is now an Else, then this is a Default block */
> -
> -    if (CurrentOp && CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> -    {
> -        CurrentOp->Common.DisasmOpcode = ACPI_DASM_DEFAULT;
> -    }
> -
> -    /*
> -     * From the first If advance to the Break op. It's possible to
> -     * have an Else (Default) op here when there is only one Case
> -     * statement, so check for it.
> -     */
> -    CurrentOp = StoreOp->Common.Next->Common.Next;
> -    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> -    {
> -        CurrentOp = CurrentOp->Common.Next;
> -    }
> -
> -    /* Ignore the Break Op */
> -
> -    CurrentOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
> -
> -    return (TRUE);
> -}
> -
> -/*******************************************************************************
> - *
> - * FUNCTION:    AcpiDmIsCaseBlock
> - *
> - * PARAMETERS:  Op              - Object to test
> - *
> - * RETURN:      TRUE if Object is beginning of a Case block.
> - *
> - * DESCRIPTION: Determines if an Object is the beginning of a Case block for a
> - *              Switch/Case statement. Parse tree must be one of the following
> - *              forms:
> - *
> - *              Else (Optional)
> - *                  If
> - *                      LEqual
> - *                          -NamePath- _T_x
> - *
> - *              Else (Optional)
> - *                  If
> - *                      LNot
> - *                          LEqual
> - *                              Match
> - *                                  Package
> - *                                      ByteConst
> - *                                      -NamePath- _T_x
> - *
> - ******************************************************************************/
> -
> -static BOOLEAN
> -AcpiDmIsCaseBlock (
> -    ACPI_PARSE_OBJECT       *Op)
> -{
> -    ACPI_PARSE_OBJECT       *CurrentOp;
> -
> -    if (!Op)
> -    {
> -        return (FALSE);
> -    }
> -
> -    /* Look for an If or ElseIf */
> -
> -    CurrentOp = Op;
> -    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
> -    {
> -        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -        if (!CurrentOp)
> -        {
> -            return (FALSE);
> -        }
> -    }
> -
> -    if (!CurrentOp || CurrentOp->Common.AmlOpcode != AML_IF_OP)
> -    {
> -        return (FALSE);
> -    }
> -
> -    /* Child must be LEqual or LNot */
> -
> -    CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -    if (!CurrentOp)
> -    {
> -        return (FALSE);
> -    }
> -
> -    switch (CurrentOp->Common.AmlOpcode)
> -    {
> -        case (AML_LOGICAL_EQUAL_OP):
> -
> -            /* Next child must be NamePath with string _T_ */
> -
> -            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -            if (!CurrentOp || !CurrentOp->Common.Value.Name ||
> -                strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
> -            {
> -                return (FALSE);
> -            }
> -
> -            break;
> -
> -        case (AML_LOGICAL_NOT_OP):
> -
> -            /* Child of LNot must be LEqual op */
> -
> -            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -            if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_LOGICAL_EQUAL_OP))
> -            {
> -                return (FALSE);
> -            }
> -
> -            /* Child of LNot must be Match op */
> -
> -            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -            if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_MATCH_OP))
> -            {
> -                return (FALSE);
> -            }
> -
> -            /* First child of Match must be Package op */
> -
> -            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
> -            if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_PACKAGE_OP))
> -            {
> -                return (FALSE);
> -            }
> -
> -            /* Third child of Match must be NamePath with string _T_ */
> -
> -            CurrentOp = AcpiPsGetArg (CurrentOp->Common.Parent, 2);
> -            if (!CurrentOp || !CurrentOp->Common.Value.Name ||
> -                strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
> -            {
> -                return (FALSE);
> -            }
> -
> -            break;
> -
> -        default:
> -
> -            return (FALSE);
> -    }
> -
> -    return (TRUE);
> -}
> diff --git a/src/acpica/source/components/disassembler/dmresrc.c b/src/acpica/source/components/disassembler/dmresrc.c
> index bd8aa2dc..3c24855f 100644
> --- a/src/acpica/source/components/disassembler/dmresrc.c
> +++ b/src/acpica/source/components/disassembler/dmresrc.c
> @@ -197,8 +197,12 @@ static ACPI_RESOURCE_HANDLER    AcpiGbl_DmResourceDispatch [] =
>       AcpiDmQwordDescriptor,          /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
>       AcpiDmExtendedDescriptor,       /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
>       AcpiDmGpioDescriptor,           /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
> -    NULL,                           /* 0x0D, Reserved */
> -    AcpiDmSerialBusDescriptor       /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
> +    AcpiDmPinFunctionDescriptor,    /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
> +    AcpiDmSerialBusDescriptor,      /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
> +    AcpiDmPinConfigDescriptor,      /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
> +    AcpiDmPinGroupDescriptor,       /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
> +    AcpiDmPinGroupFunctionDescriptor, /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
> +    AcpiDmPinGroupConfigDescriptor, /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
>   };
>   
>   
> @@ -540,6 +544,15 @@ AcpiDmIsResourceTemplate (
>        * intialization byte list. Because the resource macros will create
>        * a buffer of the exact required length (buffer length will be equal
>        * to the actual length).
> +     *
> +     * NOTE (April 2017): Resource templates with this issue have been
> +     * seen in the field. We still don't want to attempt to disassemble
> +     * a buffer like this to a resource template because this output
> +     * would not match the original input buffer (it would be shorter
> +     * than the original when the disassembled code is recompiled).
> +     * Basically, a buffer like this appears to be hand crafted in the
> +     * first place, so just emitting a buffer object instead of a
> +     * resource template more closely resembles the original ASL code.
>        */
>       if (DeclaredBufferLength != BufferLength)
>       {
> diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
> index 0c2c3360..68737545 100644
> --- a/src/acpica/source/components/disassembler/dmresrcl2.c
> +++ b/src/acpica/source/components/disassembler/dmresrcl2.c
> @@ -515,6 +515,112 @@ AcpiDmGpioDescriptor (
>       }
>   }
>   
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPinFunctionDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a PinFunction descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPinFunctionDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    UINT16                  *PinList;
> +    UINT8                   *VendorData;
> +    char                    *DeviceName = NULL;
> +    UINT32                  PinCount;
> +    UINT32                  i;
> +
> +    AcpiDmIndent (Level);
> +    AcpiOsPrintf ("PinFunction (%s, ",
> +        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinFunction.Flags)]);
> +
> +    if (Resource->PinFunction.PinConfig <= 3)
> +    {
> +        AcpiOsPrintf ("%s, ",
> +            AcpiGbl_PpcDecode[Resource->PinFunction.PinConfig]);
> +    }
> +    else
> +    {
> +        AcpiOsPrintf ("0x%2.2X, ", Resource->PinFunction.PinConfig);
> +    }
> +
> +    /* FunctionNumber */
> +
> +    AcpiOsPrintf ("0x%4.4X, ", Resource->PinFunction.FunctionNumber);
> +
> +    if (Resource->PinFunction.ResSourceOffset)
> +    {
> +        DeviceName = ACPI_ADD_PTR (char,
> +            Resource, Resource->PinFunction.ResSourceOffset),
> +        AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
> +    }
> +
> +    AcpiOsPrintf (", ");
> +    AcpiOsPrintf ("0x%2.2X,\n", Resource->PinFunction.ResSourceIndex);
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    /* Always ResourceConsumer */
> +    AcpiOsPrintf ("%s, ", AcpiGbl_ConsumeDecode [ACPI_CONSUMER]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    AcpiOsPrintf (",");
> +
> +    /* Dump the vendor data */
> +
> +    if (Resource->PinFunction.VendorLength)
> +    {
> +        AcpiOsPrintf ("\n");
> +        AcpiDmIndent (Level + 1);
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            Resource->PinFunction.VendorOffset);
> +
> +        AcpiDmDumpRawDataBuffer (VendorData,
> +            Resource->PinFunction.VendorLength, Level);
> +    }
> +
> +    AcpiOsPrintf (")\n");
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    /* Dump the interrupt list */
> +
> +    AcpiOsPrintf ("{   // Pin list\n");
> +
> +    PinCount = ((UINT32) (Resource->PinFunction.ResSourceOffset -
> +        Resource->PinFunction.PinTableOffset)) /
> +        sizeof (UINT16);
> +
> +    PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
> +        Resource->PinFunction.PinTableOffset);
> +
> +    for (i = 0; i < PinCount; i++)
> +    {
> +        AcpiDmIndent (Level + 2);
> +        AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
> +            ((i + 1) < PinCount) ? "," : "");
> +    }
> +
> +    AcpiDmIndent (Level + 1);
> +    AcpiOsPrintf ("}\n");
> +}
> +
>   
>   /*******************************************************************************
>    *
> @@ -848,3 +954,363 @@ AcpiDmSerialBusDescriptor (
>       SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
>           Info, Resource, Length, Level);
>   }
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPinConfig
> + *
> + * PARAMETERS:  PinConfigType       - Pin configuration type
> + *              PinConfigValue      - Pin configuration value
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Pretty prints PinConfig type and value.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmPinConfig(
> +    UINT8                   PinConfigType,
> +    UINT32                  PinConfigValue)
> +{
> +    if (PinConfigType <= 13)
> +    {
> +        AcpiOsPrintf ("0x%2.2X /* %s */, ", PinConfigType,
> +            AcpiGbl_PtypDecode[PinConfigType]);
> +    }
> +    else
> +    {
> +        AcpiOsPrintf ("0x%2.2X, /* Vendor Defined */ ", PinConfigType);
> +    }
> +
> +    /* PinConfigValue */
> +
> +    AcpiOsPrintf ("0x%4.4X,\n", PinConfigValue);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPinConfigDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a PinConfig descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPinConfigDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    UINT16                  *PinList;
> +    UINT8                   *VendorData;
> +    char                    *DeviceName = NULL;
> +    UINT32                  PinCount;
> +    UINT32                  i;
> +
> +    AcpiDmIndent (Level);
> +    AcpiOsPrintf ("PinConfig (%s, ",
> +        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinConfig.Flags)]);
> +
> +    AcpiDmPinConfig (Resource->PinConfig.PinConfigType,
> +        Resource->PinConfig.PinConfigValue);
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    if (Resource->PinConfig.ResSourceOffset)
> +    {
> +        DeviceName = ACPI_ADD_PTR (char,
> +            Resource, Resource->PinConfig.ResSourceOffset),
> +        AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
> +    }
> +
> +    AcpiOsPrintf (", ");
> +    AcpiOsPrintf ("0x%2.2X, ", Resource->PinConfig.ResSourceIndex);
> +
> +    AcpiOsPrintf ("%s, ",
> +        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinConfig.Flags, 1)]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    AcpiOsPrintf (",");
> +
> +    /* Dump the vendor data */
> +
> +    if (Resource->PinConfig.VendorLength)
> +    {
> +        AcpiOsPrintf ("\n");
> +        AcpiDmIndent (Level + 1);
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            Resource->PinConfig.VendorOffset);
> +
> +        AcpiDmDumpRawDataBuffer (VendorData,
> +            Resource->PinConfig.VendorLength, Level);
> +    }
> +
> +    AcpiOsPrintf (")\n");
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    /* Dump the interrupt list */
> +
> +    AcpiOsPrintf ("{   // Pin list\n");
> +
> +    PinCount = ((UINT32) (Resource->PinConfig.ResSourceOffset -
> +        Resource->PinConfig.PinTableOffset)) /
> +        sizeof (UINT16);
> +
> +    PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
> +        Resource->PinConfig.PinTableOffset);
> +
> +    for (i = 0; i < PinCount; i++)
> +    {
> +        AcpiDmIndent (Level + 2);
> +        AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
> +            ((i + 1) < PinCount) ? "," : "");
> +    }
> +
> +    AcpiDmIndent (Level + 1);
> +    AcpiOsPrintf ("}\n");
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPinGroupDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a PinGroup descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPinGroupDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    char                    *Label;
> +    UINT16                  *PinList;
> +    UINT8                   *VendorData;
> +    UINT32                  PinCount;
> +    UINT32                  i;
> +
> +    AcpiDmIndent (Level);
> +    /* Always producer */
> +    AcpiOsPrintf ("PinGroup (");
> +
> +    Label = ACPI_ADD_PTR (char,
> +        Resource, Resource->PinGroup.LabelOffset),
> +    AcpiUtPrintString (Label, ACPI_UINT16_MAX);
> +
> +    AcpiOsPrintf (", ");
> +
> +    AcpiOsPrintf ("%s, ",
> +        AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroup.Flags)]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    AcpiOsPrintf (",");
> +
> +    /* Dump the vendor data */
> +
> +    if (Resource->PinGroup.VendorLength)
> +    {
> +        AcpiOsPrintf ("\n");
> +        AcpiDmIndent (Level + 1);
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            Resource->PinGroup.VendorOffset);
> +
> +        AcpiDmDumpRawDataBuffer (VendorData,
> +            Resource->PinGroup.VendorLength, Level);
> +    }
> +
> +    AcpiOsPrintf (")\n");
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    /* Dump the interrupt list */
> +
> +    AcpiOsPrintf ("{   // Pin list\n");
> +
> +    PinCount = (Resource->PinGroup.LabelOffset -
> +        Resource->PinGroup.PinTableOffset) / sizeof (UINT16);
> +
> +    PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
> +        Resource->PinGroup.PinTableOffset);
> +
> +    for (i = 0; i < PinCount; i++)
> +    {
> +        AcpiDmIndent (Level + 2);
> +        AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
> +            ((i + 1) < PinCount) ? "," : "");
> +    }
> +
> +    AcpiDmIndent (Level + 1);
> +    AcpiOsPrintf ("}\n");
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPinGroupFunctionDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a PinGroupFunction descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPinGroupFunctionDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    UINT8                   *VendorData;
> +    char                    *DeviceName = NULL;
> +    char                    *Label = NULL;
> +
> +    AcpiDmIndent (Level);
> +    AcpiOsPrintf ("PinGroupFunction (%s, ",
> +        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupFunction.Flags)]);
> +
> +    /* FunctionNumber */
> +
> +    AcpiOsPrintf ("0x%4.4X, ", Resource->PinGroupFunction.FunctionNumber);
> +
> +    DeviceName = ACPI_ADD_PTR (char,
> +        Resource, Resource->PinGroupFunction.ResSourceOffset),
> +    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
> +
> +    AcpiOsPrintf (", ");
> +    AcpiOsPrintf ("0x%2.2X,\n", Resource->PinGroupFunction.ResSourceIndex);
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    Label = ACPI_ADD_PTR (char, Resource,
> +        Resource->PinGroupFunction.ResSourceLabelOffset);
> +    AcpiUtPrintString (Label, ACPI_UINT16_MAX);
> +
> +    AcpiOsPrintf (", ");
> +
> +    AcpiOsPrintf ("%s, ",
> +        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupFunction.Flags, 1)]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    AcpiOsPrintf (",");
> +
> +    /* Dump the vendor data */
> +
> +    if (Resource->PinGroupFunction.VendorLength)
> +    {
> +        AcpiOsPrintf ("\n");
> +        AcpiDmIndent (Level + 1);
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            Resource->PinGroupFunction.VendorOffset);
> +
> +        AcpiDmDumpRawDataBuffer (VendorData,
> +            Resource->PinGroupFunction.VendorLength, Level);
> +    }
> +
> +    AcpiOsPrintf (")\n");
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPinGroupConfigDescriptor
> + *
> + * PARAMETERS:  Info                - Extra resource info
> + *              Resource            - Pointer to the resource descriptor
> + *              Length              - Length of the descriptor in bytes
> + *              Level               - Current source code indentation level
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Decode a PinGroupConfig descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmPinGroupConfigDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level)
> +{
> +    UINT8                   *VendorData;
> +    char                    *DeviceName = NULL;
> +    char                    *Label = NULL;
> +
> +    AcpiDmIndent (Level);
> +    AcpiOsPrintf ("PinGroupConfig (%s, ",
> +        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupConfig.Flags)]);
> +
> +    AcpiDmPinConfig(Resource->PinGroupConfig.PinConfigType,
> +        Resource->PinGroupConfig.PinConfigValue);
> +
> +    AcpiDmIndent (Level + 1);
> +
> +    DeviceName = ACPI_ADD_PTR (char,
> +        Resource, Resource->PinGroupConfig.ResSourceOffset),
> +    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
> +
> +    AcpiOsPrintf (", ");
> +    AcpiOsPrintf ("0x%2.2X, ", Resource->PinGroupConfig.ResSourceIndex);
> +
> +    Label = ACPI_ADD_PTR (char, Resource,
> +        Resource->PinGroupConfig.ResSourceLabelOffset);
> +    AcpiUtPrintString (Label, ACPI_UINT16_MAX);
> +
> +    AcpiOsPrintf (", ");
> +
> +    AcpiOsPrintf ("%s, ",
> +        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupConfig.Flags, 1)]);
> +
> +    /* Insert a descriptor name */
> +
> +    AcpiDmDescriptorName ();
> +
> +    AcpiOsPrintf (",");
> +
> +    /* Dump the vendor data */
> +
> +    if (Resource->PinGroupConfig.VendorLength)
> +    {
> +        AcpiOsPrintf ("\n");
> +        AcpiDmIndent (Level + 1);
> +        VendorData = ACPI_ADD_PTR (UINT8, Resource,
> +            Resource->PinGroupConfig.VendorOffset);
> +
> +        AcpiDmDumpRawDataBuffer (VendorData,
> +            Resource->PinGroupConfig.VendorLength, Level);
> +    }
> +
> +    AcpiOsPrintf (")\n");
> +}
> diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
> index 77d24a18..750e6398 100644
> --- a/src/acpica/source/components/disassembler/dmwalk.c
> +++ b/src/acpica/source/components/disassembler/dmwalk.c
> @@ -161,8 +161,6 @@
>           ACPI_MODULE_NAME    ("dmwalk")
>   
>   
> -#define DB_FULL_OP_INFO     "[%4.4s] @%5.5X #%4.4X:  "
> -
>   /* Stub for non-compiler code */
>   
>   #ifndef ACPI_ASL_COMPILER
> @@ -584,13 +582,6 @@ AcpiDmDescendingOp (
>           return (AE_CTRL_DEPTH);
>       }
>   
> -    if (AcpiDmIsTempName(Op))
> -    {
> -        /* Ignore compiler generated temporary names */
> -
> -        return (AE_CTRL_DEPTH);
> -    }
> -
>       if (Op->Common.DisasmOpcode == ACPI_DASM_IGNORE_SINGLE)
>       {
>           /* Ignore this op, but not it's children */
> @@ -642,10 +633,16 @@ AcpiDmDescendingOp (
>                   Info->WalkState->ParserState.AmlStart);
>               if (AcpiGbl_DmOpt_Verbose)
>               {
> -                AcpiOsPrintf (DB_FULL_OP_INFO,
> -                    (Info->WalkState->MethodNode ?
> -                        Info->WalkState->MethodNode->Name.Ascii : "   "),
> -                    AmlOffset, (UINT32) Op->Common.AmlOpcode);
> +                if (AcpiGbl_CmSingleStep)
> +                {
> +                    AcpiOsPrintf ("%5.5X/%4.4X: ",
> +                        AmlOffset, (UINT32) Op->Common.AmlOpcode);
> +                }
> +                else
> +                {
> +                    AcpiOsPrintf ("AML Offset %5.5X, Opcode %4.4X: ",
> +                        AmlOffset, (UINT32) Op->Common.AmlOpcode);
> +                }
>               }
>           }
>   
> @@ -782,7 +779,7 @@ AcpiDmDescendingOp (
>                   Name = AcpiPsGetName (Op);
>                   if (Op->Named.Path)
>                   {
> -                    AcpiDmNamestring ((char *) Op->Named.Path);
> +                    AcpiDmNamestring (Op->Named.Path);
>                   }
>                   else
>                   {
> diff --git a/src/acpica/source/components/dispatcher/dsargs.c b/src/acpica/source/components/dispatcher/dsargs.c
> index 6a79c7cb..504005b3 100644
> --- a/src/acpica/source/components/dispatcher/dsargs.c
> +++ b/src/acpica/source/components/dispatcher/dsargs.c
> @@ -197,7 +197,7 @@ AcpiDsExecuteArguments (
>       ACPI_WALK_STATE         *WalkState;
>   
>   
> -    ACPI_FUNCTION_TRACE (DsExecuteArguments);
> +    ACPI_FUNCTION_TRACE_PTR (DsExecuteArguments, AmlStart);
>   
>   
>       /* Allocate a new parser op to be the root of the parsed tree */
> @@ -474,7 +474,8 @@ AcpiDsGetPackageArguments (
>           return_ACPI_STATUS (AE_AML_INTERNAL);
>       }
>   
> -    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));
> +    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Argument Init, AML Ptr: %p\n",
> +        ObjDesc->Package.AmlStart));
>   
>       /* Execute the AML code for the TermArg arguments */
>   
> diff --git a/src/acpica/source/components/dispatcher/dsdebug.c b/src/acpica/source/components/dispatcher/dsdebug.c
> index ceb6b8a5..4a0696a3 100644
> --- a/src/acpica/source/components/dispatcher/dsdebug.c
> +++ b/src/acpica/source/components/dispatcher/dsdebug.c
> @@ -320,6 +320,7 @@ AcpiDsDumpMethodStack (
>                   Op->Common.Next = NULL;
>   
>   #ifdef ACPI_DISASSEMBLER
> +                AcpiOsPrintf ("Failed at ");
>                   AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX);
>   #endif
>                   Op->Common.Next = Next;
> diff --git a/src/acpica/source/components/dispatcher/dsmethod.c b/src/acpica/source/components/dispatcher/dsmethod.c
> index d3588f5a..79dff2c7 100644
> --- a/src/acpica/source/components/dispatcher/dsmethod.c
> +++ b/src/acpica/source/components/dispatcher/dsmethod.c
> @@ -333,6 +333,7 @@ AcpiDsMethodError (
>       ACPI_WALK_STATE         *WalkState)
>   {
>       UINT32                  AmlOffset;
> +    ACPI_NAME               Name = 0;
>   
>   
>       ACPI_FUNCTION_ENTRY ();
> @@ -361,9 +362,16 @@ AcpiDsMethodError (
>           AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->Aml,
>               WalkState->ParserState.AmlStart);
>   
> -        Status = AcpiGbl_ExceptionHandler (Status,
> -            WalkState->MethodNode ?
> -                WalkState->MethodNode->Name.Integer : 0,
> +        if (WalkState->MethodNode)
> +        {
> +            Name = WalkState->MethodNode->Name.Integer;
> +        }
> +        else if (WalkState->DeferredNode)
> +        {
> +            Name = WalkState->DeferredNode->Name.Integer;
> +        }
> +
> +        Status = AcpiGbl_ExceptionHandler (Status, Name,
>               WalkState->Opcode, AmlOffset, NULL);
>           AcpiExEnterInterpreter ();
>       }
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index 6a4f5bf2..3ceec94b 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -353,10 +353,9 @@ AcpiDsInitBufferField (
>           (8 * (UINT32) BufferDesc->Buffer.Length))
>       {
>           ACPI_ERROR ((AE_INFO,
> -            "Field [%4.4s] at %u exceeds Buffer [%4.4s] size %u (bits)",
> -            AcpiUtGetNodeName (ResultDesc),
> -            BitOffset + BitCount,
> -            AcpiUtGetNodeName (BufferDesc->Buffer.Node),
> +            "Field [%4.4s] at bit offset/length %u/%u "
> +            "exceeds size of target Buffer (%u bits)",
> +            AcpiUtGetNodeName (ResultDesc), BitOffset, BitCount,
>               8 * (UINT32) BufferDesc->Buffer.Length));
>           Status = AE_AML_BUFFER_LIMIT;
>           goto Cleanup;
> diff --git a/src/acpica/source/components/dispatcher/dsutils.c b/src/acpica/source/components/dispatcher/dsutils.c
> index 77dff895..4688e16e 100644
> --- a/src/acpica/source/components/dispatcher/dsutils.c
> +++ b/src/acpica/source/components/dispatcher/dsutils.c
> @@ -791,12 +791,6 @@ AcpiDsCreateOperand (
>           if ((OpInfo->Flags & AML_HAS_RETVAL) ||
>               (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
>           {
> -            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
> -                "Argument previously created, already stacked\n"));
> -
> -            AcpiDbDisplayArgumentObject (
> -                WalkState->Operands [WalkState->NumOperands - 1], WalkState);
> -
>               /*
>                * Use value that was already previously returned
>                * by the evaluation of this argument
> diff --git a/src/acpica/source/components/dispatcher/dswexec.c b/src/acpica/source/components/dispatcher/dswexec.c
> index 4df14713..dfdfeaa0 100644
> --- a/src/acpica/source/components/dispatcher/dswexec.c
> +++ b/src/acpica/source/components/dispatcher/dswexec.c
> @@ -723,7 +723,8 @@ AcpiDsExecEndOp (
>           case AML_TYPE_CREATE_OBJECT:
>   
>               ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
> -                "Executing CreateObject (Buffer/Package) Op=%p\n", Op));
> +                "Executing CreateObject (Buffer/Package) Op=%p AMLPtr=%p\n",
> +                Op, Op->Named.Data));
>   
>               switch (Op->Common.Parent->Common.AmlOpcode)
>               {
> diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
> index f3f99ea1..8793c0ed 100644
> --- a/src/acpica/source/components/dispatcher/dswload.c
> +++ b/src/acpica/source/components/dispatcher/dswload.c
> @@ -518,7 +518,7 @@ AcpiDsLoad1BeginOp (
>       /* Initialize the op */
>   
>   #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
> -    Op->Named.Path = ACPI_CAST_PTR (UINT8, Path);
> +    Op->Named.Path = Path;
>   #endif
>   
>       if (Node)
> @@ -558,6 +558,10 @@ AcpiDsLoad1EndOp (
>       ACPI_OBJECT_TYPE        ObjectType;
>       ACPI_STATUS             Status = AE_OK;
>   
> +#ifdef ACPI_ASL_COMPILER
> +    UINT8                   ParamCount;
> +#endif
> +
>   
>       ACPI_FUNCTION_TRACE (DsLoad1EndOp);
>   
> @@ -642,6 +646,37 @@ AcpiDsLoad1EndOp (
>           }
>       }
>   
> +#ifdef ACPI_ASL_COMPILER
> +    /*
> +     * For external opcode, get the object type from the argument and
> +     * get the parameter count from the argument's next.
> +     */
> +    if (AcpiGbl_DisasmFlag &&
> +        Op->Common.Node &&
> +        Op->Common.AmlOpcode == AML_EXTERNAL_OP)
> +    {
> +        /*
> +         * Note, if this external is not a method
> +         * Op->Common.Value.Arg->Common.Next->Common.Value.Integer == 0
> +         * Therefore, ParamCount will be 0.
> +         */
> +        ParamCount = (UINT8) Op->Common.Value.Arg->Common.Next->Common.Value.Integer;
> +        ObjectType = (UINT8) Op->Common.Value.Arg->Common.Value.Integer;
> +        Op->Common.Node->Flags |= ANOBJ_IS_EXTERNAL;
> +        Op->Common.Node->Type = (UINT8) ObjectType;
> +
> +        AcpiDmCreateSubobjectForExternal ((UINT8)ObjectType,
> +            &Op->Common.Node, ParamCount);
> +
> +        /*
> +         * Add the external to the external list because we may be
> +         * emitting code based off of the items within the external list.
> +         */
> +        AcpiDmAddOpToExternalList (Op, Op->Named.Path, (UINT8)ObjectType, ParamCount,
> +           ACPI_EXT_ORIGIN_FROM_OPCODE | ACPI_EXT_RESOLVED_REFERENCE);
> +    }
> +#endif
> +
>       /*
>        * If we are executing a method, do not create any namespace objects
>        * during the load phase, only during execution.
> @@ -689,6 +724,7 @@ AcpiDsLoad1EndOp (
>       /* Pop the scope stack (only if loading a table) */
>   
>       if (!WalkState->MethodNode &&
> +        Op->Common.AmlOpcode != AML_EXTERNAL_OP &&
>           AcpiNsOpensScope (ObjectType))
>       {
>           ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n",
> diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c
> index 46870830..184f6aa3 100644
> --- a/src/acpica/source/components/dispatcher/dswload2.c
> +++ b/src/acpica/source/components/dispatcher/dswload2.c
> @@ -428,6 +428,24 @@ AcpiDsLoad2BeginOp (
>               }
>           }
>   
> +#ifdef ACPI_ASL_COMPILER
> +
> +        /*
> +         * Do not open a scope for AML_EXTERNAL_OP
> +         * AcpiNsLookup can open a new scope based on the object type
> +         * of this op. AML_EXTERNAL_OP is a declaration rather than a
> +         * definition. In the case that this external is a method object,
> +         * AcpiNsLookup will open a new scope. However, an AML_EXTERNAL_OP
> +         * associated with the ACPI_TYPE_METHOD is a declaration, rather than
> +         * a definition. Flags is set to avoid opening a scope for any
> +         * AML_EXTERNAL_OP.
> +         */
> +        if (WalkState->Opcode == AML_EXTERNAL_OP)
> +        {
> +            Flags |= ACPI_NS_DONT_OPEN_SCOPE;
> +        }
> +#endif
> +
>           /* Add new entry or lookup existing entry */
>   
>           Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
> diff --git a/src/acpica/source/components/events/evxfevnt.c b/src/acpica/source/components/events/evxfevnt.c
> index f781f3e0..04662736 100644
> --- a/src/acpica/source/components/events/evxfevnt.c
> +++ b/src/acpica/source/components/events/evxfevnt.c
> @@ -306,6 +306,13 @@ AcpiEnableEvent (
>       ACPI_FUNCTION_TRACE (AcpiEnableEvent);
>   
>   
> +    /* If Hardware Reduced flag is set, there are no fixed events */
> +
> +    if (AcpiGbl_ReducedHardware)
> +    {
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
>       /* Decode the Fixed Event */
>   
>       if (Event > ACPI_EVENT_MAX)
> @@ -372,6 +379,13 @@ AcpiDisableEvent (
>       ACPI_FUNCTION_TRACE (AcpiDisableEvent);
>   
>   
> +    /* If Hardware Reduced flag is set, there are no fixed events */
> +
> +    if (AcpiGbl_ReducedHardware)
> +    {
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
>       /* Decode the Fixed Event */
>   
>       if (Event > ACPI_EVENT_MAX)
> @@ -433,6 +447,13 @@ AcpiClearEvent (
>       ACPI_FUNCTION_TRACE (AcpiClearEvent);
>   
>   
> +    /* If Hardware Reduced flag is set, there are no fixed events */
> +
> +    if (AcpiGbl_ReducedHardware)
> +    {
> +        return_ACPI_STATUS (AE_OK);
> +    }
> +
>       /* Decode the Fixed Event */
>   
>       if (Event > ACPI_EVENT_MAX)
> diff --git a/src/acpica/source/components/executer/exdebug.c b/src/acpica/source/components/executer/exdebug.c
> index cdc67871..155f2c0d 100644
> --- a/src/acpica/source/components/executer/exdebug.c
> +++ b/src/acpica/source/components/executer/exdebug.c
> @@ -237,11 +237,11 @@ AcpiExDoDebugObject (
>               Timer = ((UINT32) AcpiOsGetTimer () / 10);
>               Timer &= 0x03FFFFFF;
>   
> -            AcpiOsPrintf ("[ACPI Debug T=0x%8.8X] %*s", Timer, Level, " ");
> +            AcpiOsPrintf ("ACPI Debug: T=0x%8.8X %*s", Timer, Level, " ");
>           }
>           else
>           {
> -            AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
> +            AcpiOsPrintf ("ACPI Debug: %*s", Level, " ");
>           }
>       }
>   
> diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
> index 82b34038..2b23881f 100644
> --- a/src/acpica/source/components/executer/exdump.c
> +++ b/src/acpica/source/components/executer/exdump.c
> @@ -775,12 +775,13 @@ AcpiExDumpOperand (
>   
>       if (Depth > 0)
>       {
> -        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
> -            Depth, " ", Depth, ObjDesc));
> +        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
> +            Depth, " ", Depth, ObjDesc, ObjDesc->Common.ReferenceCount));
>       }
>       else
>       {
> -        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
> +        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Refs=%u ",
> +            ObjDesc, ObjDesc->Common.ReferenceCount));
>       }
>   
>       /* Decode object type */
> @@ -818,8 +819,10 @@ AcpiExDumpOperand (
>   
>           case ACPI_REFCLASS_NAME:
>   
> -            AcpiOsPrintf ("- [%4.4s]\n",
> -                ObjDesc->Reference.Node->Name.Ascii);
> +            AcpiUtRepairName (ObjDesc->Reference.Node->Name.Ascii);
> +            AcpiOsPrintf ("- [%4.4s] (Node %p)\n",
> +                ObjDesc->Reference.Node->Name.Ascii,
> +                ObjDesc->Reference.Node);
>               break;
>   
>           case ACPI_REFCLASS_ARG:
> @@ -1158,12 +1161,15 @@ AcpiExDumpReferenceObj (
>               &RetBuf, TRUE);
>           if (ACPI_FAILURE (Status))
>           {
> -            AcpiOsPrintf (" Could not convert name to pathname\n");
> +            AcpiOsPrintf (" Could not convert name to pathname: %s\n",
> +                AcpiFormatException (Status));
>           }
>           else
>           {
> -           AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
> -           ACPI_FREE (RetBuf.Pointer);
> +            AcpiOsPrintf ("%s: %s\n",
> +                AcpiUtGetTypeName (ObjDesc->Reference.Node->Type),
> +                (char *) RetBuf.Pointer);
> +            ACPI_FREE (RetBuf.Pointer);
>           }
>       }
>       else if (ObjDesc->Reference.Object)
> @@ -1281,9 +1287,8 @@ AcpiExDumpPackageObj (
>   
>       case ACPI_TYPE_LOCAL_REFERENCE:
>   
> -        AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
> -            AcpiUtGetReferenceName (ObjDesc),
> -            ObjDesc->Reference.Class);
> +        AcpiOsPrintf ("[Object Reference] Class [%s]",
> +            AcpiUtGetReferenceName (ObjDesc));
>           AcpiExDumpReferenceObj (ObjDesc);
>           break;
>   
> diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
> index a0efb25e..5d59276b 100644
> --- a/src/acpica/source/components/executer/exoparg1.c
> +++ b/src/acpica/source/components/executer/exoparg1.c
> @@ -959,7 +959,7 @@ AcpiExOpcode_1A_0T_1R (
>           if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
>           {
>               TempDesc = AcpiNsGetAttachedObject (
> -                           (ACPI_NAMESPACE_NODE *) Operand[0]);
> +                (ACPI_NAMESPACE_NODE *) Operand[0]);
>               if (TempDesc &&
>                    ((TempDesc->Common.Type == ACPI_TYPE_STRING) ||
>                     (TempDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)))
> @@ -1072,11 +1072,27 @@ AcpiExOpcode_1A_0T_1R (
>                * This is a DerefOf (ObjectReference)
>                * Get the actual object from the Node (This is the dereference).
>                * This case may only happen when a LocalX or ArgX is
> -             * dereferenced above.
> +             * dereferenced above, or for references to device and
> +             * thermal objects.
>                */
> -            ReturnDesc = AcpiNsGetAttachedObject (
> -                (ACPI_NAMESPACE_NODE *) Operand[0]);
> -            AcpiUtAddReference (ReturnDesc);
> +            switch (((ACPI_NAMESPACE_NODE *) Operand[0])->Type)
> +            {
> +            case ACPI_TYPE_DEVICE:
> +            case ACPI_TYPE_THERMAL:
> +
> +                /* These types have no node subobject, return the NS node */
> +
> +                ReturnDesc = Operand[0];
> +                break;
> +
> +            default:
> +                /* For most types, get the object attached to the node */
> +
> +                ReturnDesc = AcpiNsGetAttachedObject (
> +                    (ACPI_NAMESPACE_NODE *) Operand[0]);
> +                AcpiUtAddReference (ReturnDesc);
> +                break;
> +            }
>           }
>           else
>           {
> diff --git a/src/acpica/source/components/executer/exresolv.c b/src/acpica/source/components/executer/exresolv.c
> index d0c8c8a8..64771922 100644
> --- a/src/acpica/source/components/executer/exresolv.c
> +++ b/src/acpica/source/components/executer/exresolv.c
> @@ -493,12 +493,26 @@ AcpiExResolveMultiple (
>                   (ACPI_NAMESPACE_NODE *) ObjDesc);
>           }
>   
> -        if (!ObjDesc)
> +        switch (Type)
>           {
> -            ACPI_ERROR ((AE_INFO,
> -                "[%4.4s] Node is unresolved or uninitialized",
> -                AcpiUtGetNodeName (Node)));
> -            return_ACPI_STATUS (AE_AML_UNINITIALIZED_NODE);
> +        case ACPI_TYPE_DEVICE:
> +        case ACPI_TYPE_THERMAL:
> +
> +            /* These types have no attached subobject */
> +            break;
> +
> +        default:
> +
> +            /* All other types require a subobject */
> +
> +            if (!ObjDesc)
> +            {
> +                ACPI_ERROR ((AE_INFO,
> +                    "[%4.4s] Node is unresolved or uninitialized",
> +                    AcpiUtGetNodeName (Node)));
> +                return_ACPI_STATUS (AE_AML_UNINITIALIZED_NODE);
> +            }
> +            break;
>           }
>           break;
>   
> diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
> index 40101575..1404eabf 100644
> --- a/src/acpica/source/components/namespace/nsaccess.c
> +++ b/src/acpica/source/components/namespace/nsaccess.c
> @@ -155,6 +155,9 @@
>   #include "acnamesp.h"
>   #include "acdispat.h"
>   
> +#ifdef ACPI_ASL_COMPILER
> +    #include "acdisasm.h"
> +#endif
>   
>   #define _COMPONENT          ACPI_NAMESPACE
>           ACPI_MODULE_NAME    ("nsaccess")
> @@ -710,6 +713,30 @@ AcpiNsLookup (
>                       CurrentNode));
>               }
>   
> +#ifdef ACPI_ASL_COMPILER
> +            /*
> +             * If this ACPI name already exists within the namespace as an
> +             * external declaration, then mark the external as a conflicting
> +             * declaration and proceed to process the current node as if it did
> +             * not exist in the namespace. If this node is not processed as
> +             * normal, then it could cause improper namespace resolution
> +             * by failing to open a new scope.
> +             */
> +            if (AcpiGbl_DisasmFlag &&
> +                (Status == AE_ALREADY_EXISTS) &&
> +                ((ThisNode->Flags & ANOBJ_IS_EXTERNAL) ||
> +                    (WalkState && WalkState->Opcode == AML_EXTERNAL_OP)))
> +            {
> +                ThisNode->Flags &= ~ANOBJ_IS_EXTERNAL;
> +                ThisNode->Type = (UINT8)ThisSearchType;
> +                if (WalkState->Opcode != AML_EXTERNAL_OP)
> +                {
> +                    AcpiDmMarkExternalConflict (ThisNode);
> +                }
> +                break;
> +            }
> +#endif
> +
>               *ReturnNode = ThisNode;
>               return_ACPI_STATUS (Status);
>           }
> diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
> index 1dc53610..f68fbc1e 100644
> --- a/src/acpica/source/components/namespace/nsnames.c
> +++ b/src/acpica/source/components/namespace/nsnames.c
> @@ -324,10 +324,6 @@ AcpiNsHandleToPathname (
>   
>       (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer,
>           RequiredSize, NoTrailing);
> -    if (ACPI_FAILURE (Status))
> -    {
> -        return_ACPI_STATUS (Status);
> -    }
>   
>       ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n",
>           (char *) Buffer->Pointer, (UINT32) RequiredSize));
> diff --git a/src/acpica/source/components/namespace/nsutils.c b/src/acpica/source/components/namespace/nsutils.c
> index 3ab7a0eb..2b6f6fb8 100644
> --- a/src/acpica/source/components/namespace/nsutils.c
> +++ b/src/acpica/source/components/namespace/nsutils.c
> @@ -206,7 +206,7 @@ AcpiNsPrintNodePathname (
>               AcpiOsPrintf ("%s ", Message);
>           }
>   
> -        AcpiOsPrintf ("[%s] (Node %p)", (char *) Buffer.Pointer, Node);
> +        AcpiOsPrintf ("%s", (char *) Buffer.Pointer);
>           ACPI_FREE (Buffer.Pointer);
>       }
>   }
> diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
> index 4dd8ff1d..ab3ad598 100644
> --- a/src/acpica/source/components/namespace/nsxfeval.c
> +++ b/src/acpica/source/components/namespace/nsxfeval.c
> @@ -199,6 +199,8 @@ AcpiEvaluateObjectTyped (
>   {
>       ACPI_STATUS             Status;
>       BOOLEAN                 FreeBufferOnError = FALSE;
> +    ACPI_HANDLE             TargetHandle;
> +    char                    *FullPathname;
>   
>   
>       ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped);
> @@ -216,41 +218,56 @@ AcpiEvaluateObjectTyped (
>           FreeBufferOnError = TRUE;
>       }
>   
> +    Status = AcpiGetHandle (Handle, Pathname, &TargetHandle);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return_ACPI_STATUS (Status);
> +    }
> +
> +    FullPathname = AcpiNsGetExternalPathname (TargetHandle);
> +    if (!FullPathname)
> +    {
> +        return_ACPI_STATUS (AE_NO_MEMORY);
> +    }
> +
>       /* Evaluate the object */
>   
> -    Status = AcpiEvaluateObject (Handle, Pathname,
> -        ExternalParams, ReturnBuffer);
> +    Status = AcpiEvaluateObject (TargetHandle, NULL, ExternalParams,
> +        ReturnBuffer);
>       if (ACPI_FAILURE (Status))
>       {
> -        return_ACPI_STATUS (Status);
> +        goto Exit;
>       }
>   
> -    /* Type ANY means "don't care" */
> +    /* Type ANY means "don't care about return value type" */
>   
>       if (ReturnType == ACPI_TYPE_ANY)
>       {
> -        return_ACPI_STATUS (AE_OK);
> +        goto Exit;
>       }
>   
>       if (ReturnBuffer->Length == 0)
>       {
>           /* Error because caller specifically asked for a return value */
>   
> -        ACPI_ERROR ((AE_INFO, "No return value"));
> -        return_ACPI_STATUS (AE_NULL_OBJECT);
> +        ACPI_ERROR ((AE_INFO, "%s did not return any object",
> +            FullPathname));
> +        Status = AE_NULL_OBJECT;
> +        goto Exit;
>       }
>   
>       /* Examine the object type returned from EvaluateObject */
>   
>       if (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type == ReturnType)
>       {
> -        return_ACPI_STATUS (AE_OK);
> +        goto Exit;
>       }
>   
>       /* Return object type does not match requested type */
>   
>       ACPI_ERROR ((AE_INFO,
> -        "Incorrect return type [%s] requested [%s]",
> +        "Incorrect return type from %s - received [%s], requested [%s]",
> +        FullPathname,
>           AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type),
>           AcpiUtGetTypeName (ReturnType)));
>   
> @@ -268,7 +285,11 @@ AcpiEvaluateObjectTyped (
>       }
>   
>       ReturnBuffer->Length = 0;
> -    return_ACPI_STATUS (AE_TYPE);
> +    Status = AE_TYPE;
> +
> +Exit:
> +    ACPI_FREE (FullPathname);
> +    return_ACPI_STATUS (Status);
>   }
>   
>   ACPI_EXPORT_SYMBOL (AcpiEvaluateObjectTyped)
> diff --git a/src/acpica/source/components/parser/psobject.c b/src/acpica/source/components/parser/psobject.c
> index 8d2448bd..5d59492a 100644
> --- a/src/acpica/source/components/parser/psobject.c
> +++ b/src/acpica/source/components/parser/psobject.c
> @@ -237,12 +237,23 @@ AcpiPsGetAmlOpcode (
>                   WalkState->Opcode,
>                   (UINT32) (AmlOffset + sizeof (ACPI_TABLE_HEADER)));
>   
> +            ACPI_ERROR ((AE_INFO,
> +                "Aborting disassembly, AML byte code is corrupt"));
> +
>               /* Dump the context surrounding the invalid opcode */
>   
>               AcpiUtDumpBuffer (((UINT8 *) WalkState->ParserState.Aml - 16),
>                   48, DB_BYTE_DISPLAY,
>                   (AmlOffset + sizeof (ACPI_TABLE_HEADER) - 16));
>               AcpiOsPrintf (" */\n");
> +
> +            /*
> +             * Just abort the disassembly, cannot continue because the
> +             * parser is essentially lost. The disassembler can then
> +             * randomly fail because an ill-constructed parse tree
> +             * can result.
> +             */
> +            return_ACPI_STATUS (AE_AML_BAD_OPCODE);
>   #endif
>           }
>   
> @@ -458,6 +469,10 @@ AcpiPsCreateOp (
>       {
>           return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
>       }
> +    if (ACPI_FAILURE (Status))
> +    {
> +        return_ACPI_STATUS (Status);
> +    }
>   
>       /* Create Op structure and append to parent's argument list */
>   
> diff --git a/src/acpica/source/components/parser/psopcode.c b/src/acpica/source/components/parser/psopcode.c
> index 2ad29f19..97a32544 100644
> --- a/src/acpica/source/components/parser/psopcode.c
> +++ b/src/acpica/source/components/parser/psopcode.c
> @@ -445,7 +445,7 @@ const ACPI_OPCODE_INFO    AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
>   
>   /* ACPI 6.0 opcodes */
>   
> -/* 81 */ ACPI_OP ("External",           ARGP_EXTERNAL_OP,          ARGI_EXTERNAL_OP,           ACPI_TYPE_ANY,               AML_CLASS_EXECUTE,/* ? */  AML_TYPE_EXEC_3A_0T_0R,   AML_FLAGS_EXEC_3A_0T_0R),
> +/* 81 */ ACPI_OP ("External",           ARGP_EXTERNAL_OP,          ARGI_EXTERNAL_OP,           ACPI_TYPE_ANY,               AML_CLASS_NAMED_OBJECT,    AML_TYPE_NAMED_SIMPLE,    AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
>   /* 82 */ ACPI_OP ("Comment",            ARGP_COMMENT_OP,           ARGI_COMMENT_OP,            ACPI_TYPE_STRING,            AML_CLASS_ARGUMENT,        AML_TYPE_LITERAL,         AML_CONSTANT)
>   
>   /*! [End] no source code translation !*/
> diff --git a/src/acpica/source/components/parser/psparse.c b/src/acpica/source/components/parser/psparse.c
> index 1a3a5345..854f0547 100644
> --- a/src/acpica/source/components/parser/psparse.c
> +++ b/src/acpica/source/components/parser/psparse.c
> @@ -164,6 +164,7 @@
>   #include "acdispat.h"
>   #include "amlcode.h"
>   #include "acinterp.h"
> +#include "acnamesp.h"
>   
>   #define _COMPONENT          ACPI_PARSER
>           ACPI_MODULE_NAME    ("psparse")
> @@ -664,8 +665,17 @@ AcpiPsParseAml (
>               /* Either the method parse or actual execution failed */
>   
>               AcpiExExitInterpreter ();
> -            ACPI_ERROR_METHOD ("Method parse/execution failed",
> -                WalkState->MethodNode, NULL, Status);
> +            if (Status == AE_ABORT_METHOD)
> +            {
> +                AcpiNsPrintNodePathname (
> +                    WalkState->MethodNode, "Method aborted:");
> +                AcpiOsPrintf ("\n");
> +            }
> +            else
> +            {
> +                ACPI_ERROR_METHOD ("Method parse/execution failed",
> +                    WalkState->MethodNode, NULL, Status);
> +            }
>               AcpiExEnterInterpreter ();
>   
>               /* Check for possible multi-thread reentrancy problem */
> diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
> index 2c3d09eb..492dde47 100644
> --- a/src/acpica/source/components/resources/rscalc.c
> +++ b/src/acpica/source/components/resources/rscalc.c
> @@ -471,6 +471,15 @@ AcpiRsGetAmlLength (
>   
>               break;
>   
> +        case ACPI_RESOURCE_TYPE_PIN_FUNCTION:
> +
> +            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
> +                (Resource->Data.PinFunction.PinTableLength * 2) +
> +                Resource->Data.PinFunction.ResourceSource.StringLength +
> +                Resource->Data.PinFunction.VendorLength);
> +
> +            break;
> +
>   
>           case ACPI_RESOURCE_TYPE_SERIAL_BUS:
>   
> @@ -483,6 +492,42 @@ AcpiRsGetAmlLength (
>   
>               break;
>   
> +        case ACPI_RESOURCE_TYPE_PIN_CONFIG:
> +
> +            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
> +                (Resource->Data.PinConfig.PinTableLength * 2) +
> +                Resource->Data.PinConfig.ResourceSource.StringLength +
> +                Resource->Data.PinConfig.VendorLength);
> +
> +            break;
> +
> +        case ACPI_RESOURCE_TYPE_PIN_GROUP:
> +
> +            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
> +                (Resource->Data.PinGroup.PinTableLength * 2) +
> +                Resource->Data.PinGroup.ResourceLabel.StringLength +
> +                Resource->Data.PinGroup.VendorLength);
> +
> +            break;
> +
> +        case ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION:
> +
> +            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
> +                Resource->Data.PinGroupFunction.ResourceSource.StringLength +
> +                Resource->Data.PinGroupFunction.ResourceSourceLabel.StringLength +
> +                Resource->Data.PinGroupFunction.VendorLength);
> +
> +            break;
> +
> +        case ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG:
> +
> +            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
> +                Resource->Data.PinGroupConfig.ResourceSource.StringLength +
> +                Resource->Data.PinGroupConfig.ResourceSourceLabel.StringLength +
> +                Resource->Data.PinGroupConfig.VendorLength);
> +
> +            break;
> +
>           default:
>   
>               break;
> @@ -668,6 +713,26 @@ AcpiRsGetListLength (
>               }
>               break;
>   
> +        case ACPI_RESOURCE_NAME_PIN_FUNCTION:
> +
> +            /* Vendor data is optional */
> +
> +            if (AmlResource->PinFunction.VendorLength)
> +            {
> +                ExtraStructBytes +=
> +                    AmlResource->PinFunction.VendorOffset -
> +                    AmlResource->PinFunction.PinTableOffset +
> +                    AmlResource->PinFunction.VendorLength;
> +            }
> +            else
> +            {
> +                ExtraStructBytes +=
> +                    AmlResource->LargeHeader.ResourceLength +
> +                    sizeof (AML_RESOURCE_LARGE_HEADER) -
> +                    AmlResource->PinFunction.PinTableOffset;
> +            }
> +            break;
> +
>           case ACPI_RESOURCE_NAME_SERIAL_BUS:
>   
>               MinimumAmlResourceLength = AcpiGbl_ResourceAmlSerialBusSizes[
> @@ -677,6 +742,53 @@ AcpiRsGetListLength (
>                   MinimumAmlResourceLength;
>               break;
>   
> +        case ACPI_RESOURCE_NAME_PIN_CONFIG:
> +
> +            /* Vendor data is optional */
> +
> +            if (AmlResource->PinConfig.VendorLength)
> +            {
> +                ExtraStructBytes +=
> +                    AmlResource->PinConfig.VendorOffset -
> +                    AmlResource->PinConfig.PinTableOffset +
> +                    AmlResource->PinConfig.VendorLength;
> +            }
> +            else
> +            {
> +                ExtraStructBytes +=
> +                    AmlResource->LargeHeader.ResourceLength +
> +                    sizeof (AML_RESOURCE_LARGE_HEADER) -
> +                    AmlResource->PinConfig.PinTableOffset;
> +            }
> +            break;
> +
> +        case ACPI_RESOURCE_NAME_PIN_GROUP:
> +
> +            ExtraStructBytes +=
> +                AmlResource->PinGroup.VendorOffset -
> +                AmlResource->PinGroup.PinTableOffset +
> +                AmlResource->PinGroup.VendorLength;
> +
> +            break;
> +
> +        case ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION:
> +
> +            ExtraStructBytes +=
> +                AmlResource->PinGroupFunction.VendorOffset -
> +                AmlResource->PinGroupFunction.ResSourceOffset +
> +                AmlResource->PinGroupFunction.VendorLength;
> +
> +            break;
> +
> +        case ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG:
> +
> +            ExtraStructBytes +=
> +                AmlResource->PinGroupConfig.VendorOffset -
> +                AmlResource->PinGroupConfig.ResSourceOffset +
> +                AmlResource->PinGroupConfig.VendorLength;
> +
> +            break;
> +
>           default:
>   
>               break;
> diff --git a/src/acpica/source/components/resources/rsdump.c b/src/acpica/source/components/resources/rsdump.c
> index 9a980781..7cafdcf9 100644
> --- a/src/acpica/source/components/resources/rsdump.c
> +++ b/src/acpica/source/components/resources/rsdump.c
> @@ -216,6 +216,11 @@ AcpiRsDumpResourceSource (
>       ACPI_RESOURCE_SOURCE    *ResourceSource);
>   
>   static void
> +AcpiRsDumpResourceLabel (
> +    char                   *Title,
> +    ACPI_RESOURCE_LABEL    *ResourceLabel);
> +
> +static void
>   AcpiRsDumpAddressCommon (
>       ACPI_RESOURCE_DATA      *Resource);
>   
> @@ -531,6 +536,22 @@ AcpiRsDumpDescriptor (
>                   ACPI_RESOURCE_SOURCE, Target));
>               break;
>   
> +        case ACPI_RSD_LABEL:
> +            /*
> +             * ResourceLabel
> +             */
> +            AcpiRsDumpResourceLabel ("Resource Label", ACPI_CAST_PTR (
> +                ACPI_RESOURCE_LABEL, Target));
> +            break;
> +
> +        case ACPI_RSD_SOURCE_LABEL:
> +            /*
> +             * ResourceSourceLabel
> +             */
> +            AcpiRsDumpResourceLabel ("Resource Source Label", ACPI_CAST_PTR (
> +                ACPI_RESOURCE_LABEL, Target));
> +            break;
> +
>           default:
>   
>               AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
> @@ -580,6 +601,32 @@ AcpiRsDumpResourceSource (
>   
>   /*******************************************************************************
>    *
> + * FUNCTION:    AcpiRsDumpResourceLabel
> + *
> + * PARAMETERS:  Title              - Title of the dumped resource field
> + *              ResourceLabel      - Pointer to a Resource Label struct
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Common routine for dumping the ResourceLabel
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiRsDumpResourceLabel (
> +    char                   *Title,
> +    ACPI_RESOURCE_LABEL    *ResourceLabel)
> +{
> +    ACPI_FUNCTION_ENTRY ();
> +
> +    AcpiRsOutString (Title,
> +        ResourceLabel->StringPtr ?
> +            ResourceLabel->StringPtr : "[Not Specified]");
> +}
> +
> +
> +/*******************************************************************************
> + *
>    * FUNCTION:    AcpiRsDumpAddressCommon
>    *
>    * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
> diff --git a/src/acpica/source/components/resources/rsdumpinfo.c b/src/acpica/source/components/resources/rsdumpinfo.c
> index ba0f37dd..cd9ae4d3 100644
> --- a/src/acpica/source/components/resources/rsdumpinfo.c
> +++ b/src/acpica/source/components/resources/rsdumpinfo.c
> @@ -360,6 +360,74 @@ ACPI_RSDUMP_INFO        AcpiRsDumpGpio[16] =
>       {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Gpio.VendorData),                 "VendorData",               NULL},
>   };
>   
> +ACPI_RSDUMP_INFO        AcpiRsDumpPinFunction[10] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinFunction),        "PinFunction",              NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinFunction.RevisionId),           "RevisionId",               NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinFunction.PinConfig),            "PinConfig",                AcpiGbl_PpcDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinFunction.Sharable),             "Sharing",                  AcpiGbl_ShrDecode},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinFunction.FunctionNumber),       "FunctionNumber",           NULL},
> +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinFunction.ResourceSource),       "ResourceSource",           NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinFunction.PinTableLength),       "PinTableLength",           NULL},
> +    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (PinFunction.PinTable),             "PinTable",                 NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinFunction.VendorLength),         "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinFunction.VendorData),          "VendorData",               NULL},
> +};
> +
> +ACPI_RSDUMP_INFO        AcpiRsDumpPinConfig[11] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinConfig),          "PinConfig",                NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinConfig.RevisionId),             "RevisionId",               NULL},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinConfig.ProducerConsumer),       "ProducerConsumer",         AcpiGbl_ConsumeDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinConfig.Sharable),               "Sharing",                  AcpiGbl_ShrDecode},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinConfig.PinConfigType),          "PinConfigType",            NULL},
> +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (PinConfig.PinConfigValue),         "PinConfigValue",           NULL},
> +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinConfig.ResourceSource),         "ResourceSource",           NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinConfig.PinTableLength),         "PinTableLength",           NULL},
> +    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (PinConfig.PinTable),               "PinTable",                 NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinConfig.VendorLength),           "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinConfig.VendorData),            "VendorData",               NULL},
> +};
> +
> +ACPI_RSDUMP_INFO        AcpiRsDumpPinGroup[8] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinGroup),           "PinGroup",                 NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroup.RevisionId),              "RevisionId",               NULL},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroup.ProducerConsumer),        "ProducerConsumer",         AcpiGbl_ConsumeDecode},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroup.PinTableLength),          "PinTableLength",           NULL},
> +    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (PinGroup.PinTable),                "PinTable",                 NULL},
> +    {ACPI_RSD_LABEL,    ACPI_RSD_OFFSET (PinGroup.ResourceLabel),           "ResourceLabel",            NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroup.VendorLength),            "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinGroup.VendorData),             "VendorData",               NULL},
> +};
> +
> +ACPI_RSDUMP_INFO        AcpiRsDumpPinGroupFunction[9] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinGroupFunction),   "PinGroupFunction",         NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroupFunction.RevisionId),      "RevisionId",               NULL},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupFunction.ProducerConsumer), "ProducerConsumer",        AcpiGbl_ConsumeDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupFunction.Sharable),        "Sharing",                  AcpiGbl_ShrDecode},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroupFunction.FunctionNumber),  "FunctionNumber",           NULL},
> +    {ACPI_RSD_SOURCE_LABEL, ACPI_RSD_OFFSET (PinGroupFunction.ResourceSourceLabel), "ResourceSourceLabel", NULL},
> +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinGroupFunction.ResourceSource),  "ResourceSource",           NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroupFunction.VendorLength),    "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinGroupFunction.VendorData),     "VendorData",               NULL},
> +};
> +
> +ACPI_RSDUMP_INFO        AcpiRsDumpPinGroupConfig[10] =
> +{
> +    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinGroupConfig),     "PinGroupConfig",           NULL},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroupConfig.RevisionId),        "RevisionId",               NULL},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupConfig.ProducerConsumer),  "ProducerConsumer",         AcpiGbl_ConsumeDecode},
> +    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupConfig.Sharable),          "Sharing",                  AcpiGbl_ShrDecode},
> +    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroupConfig.PinConfigType),     "PinConfigType",            NULL},
> +    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (PinGroupConfig.PinConfigValue),    "PinConfigValue",           NULL},
> +    {ACPI_RSD_SOURCE_LABEL, ACPI_RSD_OFFSET (PinGroupConfig.ResourceSourceLabel), "ResourceSourceLabel", NULL},
> +    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinGroupConfig.ResourceSource),    "ResourceSource",           NULL},
> +    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroupConfig.VendorLength),      "VendorLength",             NULL},
> +    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinGroupConfig.VendorData),       "VendorData",               NULL},
> +};
> +
>   ACPI_RSDUMP_INFO        AcpiRsDumpFixedDma[4] =
>   {
>       {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedDma),           "FixedDma",                 NULL},
> diff --git a/src/acpica/source/components/resources/rsinfo.c b/src/acpica/source/components/resources/rsinfo.c
> index 499aff65..58189129 100644
> --- a/src/acpica/source/components/resources/rsinfo.c
> +++ b/src/acpica/source/components/resources/rsinfo.c
> @@ -192,6 +192,11 @@ ACPI_RSCONVERT_INFO         *AcpiGbl_SetResourceDispatch[] =
>       AcpiRsConvertGpio,              /* 0x11, ACPI_RESOURCE_TYPE_GPIO */
>       AcpiRsConvertFixedDma,          /* 0x12, ACPI_RESOURCE_TYPE_FIXED_DMA */
>       NULL,                           /* 0x13, ACPI_RESOURCE_TYPE_SERIAL_BUS - Use subtype table below */
> +    AcpiRsConvertPinFunction,       /* 0x14, ACPI_RESOURCE_TYPE_PIN_FUNCTION */
> +    AcpiRsConvertPinConfig,         /* 0x15, ACPI_RESOURCE_TYPE_PIN_CONFIG */
> +    AcpiRsConvertPinGroup,          /* 0x16, ACPI_RESOURCE_TYPE_PIN_GROUP */
> +    AcpiRsConvertPinGroupFunction,  /* 0x17, ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
> +    AcpiRsConvertPinGroupConfig,    /* 0x18, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
>   };
>   
>   /* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
> @@ -232,8 +237,12 @@ ACPI_RSCONVERT_INFO         *AcpiGbl_GetResourceDispatch[] =
>       AcpiRsConvertAddress64,         /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
>       AcpiRsConvertExtAddress64,      /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
>       AcpiRsConvertGpio,              /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
> -    NULL,                           /* 0x0D, Reserved */
> +    AcpiRsConvertPinFunction,       /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
>       NULL,                           /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use subtype table below */
> +    AcpiRsConvertPinConfig,         /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
> +    AcpiRsConvertPinGroup,          /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
> +    AcpiRsConvertPinGroupFunction,  /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
> +    AcpiRsConvertPinGroupConfig,    /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
>   };
>   
>   /* Subtype table for SerialBus -- I2C, SPI, and UART */
> @@ -273,6 +282,11 @@ ACPI_RSDUMP_INFO            *AcpiGbl_DumpResourceDispatch[] =
>       AcpiRsDumpGpio,                 /* ACPI_RESOURCE_TYPE_GPIO */
>       AcpiRsDumpFixedDma,             /* ACPI_RESOURCE_TYPE_FIXED_DMA */
>       NULL,                           /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
> +    AcpiRsDumpPinFunction,          /* ACPI_RESOURCE_TYPE_PIN_FUNCTION */
> +    AcpiRsDumpPinConfig,            /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
> +    AcpiRsDumpPinGroup,             /* ACPI_RESOURCE_TYPE_PIN_GROUP */
> +    AcpiRsDumpPinGroupFunction,     /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
> +    AcpiRsDumpPinGroupConfig,       /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
>   };
>   
>   ACPI_RSDUMP_INFO            *AcpiGbl_DumpSerialBusDispatch[] =
> @@ -312,6 +326,11 @@ const UINT8                 AcpiGbl_AmlResourceSizes[] =
>       sizeof (AML_RESOURCE_GPIO),             /* ACPI_RESOURCE_TYPE_GPIO */
>       sizeof (AML_RESOURCE_FIXED_DMA),        /* ACPI_RESOURCE_TYPE_FIXED_DMA */
>       sizeof (AML_RESOURCE_COMMON_SERIALBUS), /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
> +    sizeof (AML_RESOURCE_PIN_FUNCTION),     /* ACPI_RESOURCE_TYPE_PIN_FUNCTION */
> +    sizeof (AML_RESOURCE_PIN_CONFIG),       /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
> +    sizeof (AML_RESOURCE_PIN_GROUP),        /* ACPI_RESOURCE_TYPE_PIN_GROUP */
> +    sizeof (AML_RESOURCE_PIN_GROUP_FUNCTION), /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
> +    sizeof (AML_RESOURCE_PIN_GROUP_CONFIG), /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
>   };
>   
>   
> @@ -351,7 +370,12 @@ const UINT8                 AcpiGbl_ResourceStructSizes[] =
>       ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS64),
>       ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_ADDRESS64),
>       ACPI_RS_SIZE (ACPI_RESOURCE_GPIO),
> -    ACPI_RS_SIZE (ACPI_RESOURCE_COMMON_SERIALBUS)
> +    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_FUNCTION),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_COMMON_SERIALBUS),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_CONFIG),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_FUNCTION),
> +    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_CONFIG),
>   };
>   
>   const UINT8                 AcpiGbl_AmlResourceSerialBusSizes[] =
> diff --git a/src/acpica/source/components/resources/rsmisc.c b/src/acpica/source/components/resources/rsmisc.c
> index 6a5dfd78..16db6fae 100644
> --- a/src/acpica/source/components/resources/rsmisc.c
> +++ b/src/acpica/source/components/resources/rsmisc.c
> @@ -705,10 +705,7 @@ AcpiRsConvertResourceToAml (
>   
>               /* Set vendor offset only if there is vendor data */
>   
> -            if (Resource->Data.Gpio.VendorLength)
> -            {
> -                ACPI_SET16 (Target, AmlLength);
> -            }
> +            ACPI_SET16 (Target, AmlLength);
>   
>               AcpiRsSetResourceLength (AmlLength, Aml);
>               break;
> diff --git a/src/acpica/source/components/resources/rsserial.c b/src/acpica/source/components/resources/rsserial.c
> index 30ddf522..5395382d 100644
> --- a/src/acpica/source/components/resources/rsserial.c
> +++ b/src/acpica/source/components/resources/rsserial.c
> @@ -254,6 +254,78 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertGpio[18] =
>                           0},
>   };
>   
> +/*******************************************************************************
> + *
> + * AcpiRsConvertPinfunction
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertPinFunction[13] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_FUNCTION,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_FUNCTION),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinFunction)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_FUNCTION,
> +                        sizeof (AML_RESOURCE_PIN_FUNCTION),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinFunction.RevisionId),
> +                        AML_OFFSET (PinFunction.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinFunction.Sharable),
> +                        AML_OFFSET (PinFunction.Flags),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinFunction.PinConfig),
> +                        AML_OFFSET (PinFunction.PinConfig),
> +                        1},
> +
> +    {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.PinFunction.FunctionNumber),
> +                        AML_OFFSET (PinFunction.FunctionNumber),
> +                        2},
> +
> +    /* Pin Table */
> +
> +    /*
> +     * It is OK to use GPIO operations here because none of them refer GPIO
> +     * structures directly but instead use offsets given here.
> +     */
> +
> +    {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.PinFunction.PinTableLength),
> +                        AML_OFFSET (PinFunction.PinTableOffset),
> +                        AML_OFFSET (PinFunction.ResSourceOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.PinFunction.PinTable),
> +                        AML_OFFSET (PinFunction.PinTableOffset),
> +                        0},
> +
> +    /* Resource Source */
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinFunction.ResourceSource.Index),
> +                        AML_OFFSET (PinFunction.ResSourceIndex),
> +                        1},
> +
> +    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinFunction.ResourceSource.StringLength),
> +                        AML_OFFSET (PinFunction.ResSourceOffset),
> +                        AML_OFFSET (PinFunction.VendorOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinFunction.ResourceSource.StringPtr),
> +                        AML_OFFSET (PinFunction.ResSourceOffset),
> +                        0},
> +
> +    /* Vendor Data */
> +
> +    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinFunction.VendorLength),
> +                        AML_OFFSET (PinFunction.VendorLength),
> +                        1},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinFunction.VendorData),
> +                        AML_OFFSET (PinFunction.VendorOffset),
> +                        0},
> +};
> +
>   
>   /*******************************************************************************
>    *
> @@ -545,3 +617,278 @@ ACPI_RSCONVERT_INFO     AcpiRsConvertUartSerialBus[23] =
>                           AML_OFFSET (UartSerialBus.DefaultBaudRate),
>                           1},
>   };
> +
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertPinConfig
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertPinConfig[14] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_CONFIG,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_CONFIG),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinConfig)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_CONFIG,
> +                        sizeof (AML_RESOURCE_PIN_CONFIG),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinConfig.RevisionId),
> +                        AML_OFFSET (PinConfig.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinConfig.Sharable),
> +                        AML_OFFSET (PinConfig.Flags),
> +                        0},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinConfig.ProducerConsumer),
> +                        AML_OFFSET (PinConfig.Flags),
> +                        1},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinConfig.PinConfigType),
> +                        AML_OFFSET (PinConfig.PinConfigType),
> +                        1},
> +
> +    {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.PinConfig.PinConfigValue),
> +                        AML_OFFSET (PinConfig.PinConfigValue),
> +                        1},
> +
> +    /* Pin Table */
> +
> +    /*
> +     * It is OK to use GPIO operations here because none of them refer GPIO
> +     * structures directly but instead use offsets given here.
> +     */
> +
> +    {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.PinConfig.PinTableLength),
> +                        AML_OFFSET (PinConfig.PinTableOffset),
> +                        AML_OFFSET (PinConfig.ResSourceOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.PinConfig.PinTable),
> +                        AML_OFFSET (PinConfig.PinTableOffset),
> +                        0},
> +
> +    /* Resource Source */
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinConfig.ResourceSource.Index),
> +                        AML_OFFSET (PinConfig.ResSourceIndex),
> +                        1},
> +
> +    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinConfig.ResourceSource.StringLength),
> +                        AML_OFFSET (PinConfig.ResSourceOffset),
> +                        AML_OFFSET (PinConfig.VendorOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinConfig.ResourceSource.StringPtr),
> +                        AML_OFFSET (PinConfig.ResSourceOffset),
> +                        0},
> +
> +    /* Vendor Data */
> +
> +    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinConfig.VendorLength),
> +                        AML_OFFSET (PinConfig.VendorLength),
> +                        1},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinConfig.VendorData),
> +                        AML_OFFSET (PinConfig.VendorOffset),
> +                        0},
> +};
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertPinGroup
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertPinGroup[10] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_GROUP,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinGroup)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_GROUP,
> +                        sizeof (AML_RESOURCE_PIN_GROUP),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroup.RevisionId),
> +                        AML_OFFSET (PinGroup.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroup.ProducerConsumer),
> +                        AML_OFFSET (PinGroup.Flags),
> +                        0},
> +
> +    /* Pin Table */
> +
> +    /*
> +     * It is OK to use GPIO operations here because none of them refer GPIO
> +     * structures directly but instead use offsets given here.
> +     */
> +
> +    {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.PinGroup.PinTableLength),
> +                        AML_OFFSET (PinGroup.PinTableOffset),
> +                        AML_OFFSET (PinGroup.LabelOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.PinGroup.PinTable),
> +                        AML_OFFSET (PinGroup.PinTableOffset),
> +                        0},
> +
> +    /* Resource Label */
> +
> +    {ACPI_RSC_COUNT_GPIO_RES, ACPI_RS_OFFSET (Data.PinGroup.ResourceLabel.StringLength),
> +                        AML_OFFSET (PinGroup.LabelOffset),
> +                        AML_OFFSET (PinGroup.VendorOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET (Data.PinGroup.ResourceLabel.StringPtr),
> +                        AML_OFFSET (PinGroup.LabelOffset),
> +                        0},
> +
> +    /* Vendor Data */
> +
> +    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinGroup.VendorLength),
> +                        AML_OFFSET (PinGroup.VendorLength),
> +                        1},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroup.VendorData),
> +                        AML_OFFSET (PinGroup.VendorOffset),
> +                        0},
> +};
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertPinGroupFunction
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertPinGroupFunction[13] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_FUNCTION),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinGroupFunction)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION,
> +                        sizeof (AML_RESOURCE_PIN_GROUP_FUNCTION),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupFunction.RevisionId),
> +                        AML_OFFSET (PinGroupFunction.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupFunction.Sharable),
> +                        AML_OFFSET (PinGroupFunction.Flags),
> +                        0},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupFunction.ProducerConsumer),
> +                        AML_OFFSET (PinGroupFunction.Flags),
> +                        1},
> +
> +    {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.PinGroupFunction.FunctionNumber),
> +                        AML_OFFSET (PinGroupFunction.FunctionNumber),
> +                        1},
> +
> +    /* Resource Source */
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSource.Index),
> +                        AML_OFFSET (PinGroupFunction.ResSourceIndex),
> +                        1},
> +
> +    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSource.StringLength),
> +                        AML_OFFSET (PinGroupFunction.ResSourceOffset),
> +                        AML_OFFSET (PinGroupFunction.ResSourceLabelOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSource.StringPtr),
> +                        AML_OFFSET (PinGroupFunction.ResSourceOffset),
> +                        0},
> +
> +    /* Resource Source Label */
> +
> +    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSourceLabel.StringLength),
> +                        AML_OFFSET (PinGroupFunction.ResSourceLabelOffset),
> +                        AML_OFFSET (PinGroupFunction.VendorOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSourceLabel.StringPtr),
> +                        AML_OFFSET (PinGroupFunction.ResSourceLabelOffset),
> +                        0},
> +
> +    /* Vendor Data */
> +
> +    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinGroupFunction.VendorLength),
> +                        AML_OFFSET (PinGroupFunction.VendorLength),
> +                        1},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupFunction.VendorData),
> +                        AML_OFFSET (PinGroupFunction.VendorOffset),
> +                        0},
> +};
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertPinGroupConfig
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO     AcpiRsConvertPinGroupConfig[14] =
> +{
> +    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG,
> +                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_CONFIG),
> +                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinGroupConfig)},
> +
> +    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG,
> +                        sizeof (AML_RESOURCE_PIN_GROUP_CONFIG),
> +                        0},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupConfig.RevisionId),
> +                        AML_OFFSET (PinGroupConfig.RevisionId),
> +                        1},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupConfig.Sharable),
> +                        AML_OFFSET (PinGroupConfig.Flags),
> +                        0},
> +
> +    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupConfig.ProducerConsumer),
> +                        AML_OFFSET (PinGroupConfig.Flags),
> +                        1},
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupConfig.PinConfigType),
> +                        AML_OFFSET (PinGroupConfig.PinConfigType),
> +                        1},
> +
> +    {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.PinGroupConfig.PinConfigValue),
> +                        AML_OFFSET (PinGroupConfig.PinConfigValue),
> +                        1},
> +
> +    /* Resource Source */
> +
> +    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSource.Index),
> +                        AML_OFFSET (PinGroupConfig.ResSourceIndex),
> +                        1},
> +
> +    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSource.StringLength),
> +                        AML_OFFSET (PinGroupConfig.ResSourceOffset),
> +                        AML_OFFSET (PinGroupConfig.ResSourceLabelOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSource.StringPtr),
> +                        AML_OFFSET (PinGroupConfig.ResSourceOffset),
> +                        0},
> +
> +    /* Resource Source Label */
> +
> +    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSourceLabel.StringLength),
> +                        AML_OFFSET (PinGroupConfig.ResSourceLabelOffset),
> +                        AML_OFFSET (PinGroupConfig.VendorOffset)},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSourceLabel.StringPtr),
> +                        AML_OFFSET (PinGroupConfig.ResSourceLabelOffset),
> +                        0},
> +
> +    /* Vendor Data */
> +
> +    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinGroupConfig.VendorLength),
> +                        AML_OFFSET (PinGroupConfig.VendorLength),
> +                        1},
> +
> +    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupConfig.VendorData),
> +                        AML_OFFSET (PinGroupConfig.VendorOffset),
> +                        0},
> +};
> diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
> index 42d40a4a..3e4e5229 100644
> --- a/src/acpica/source/components/tables/tbfadt.c
> +++ b/src/acpica/source/components/tables/tbfadt.c
> @@ -597,8 +597,8 @@ AcpiTbCreateLocalFadt (
>    * The 64-bit X fields are optional extensions to the original 32-bit FADT
>    * V1.0 fields. Even if they are present in the FADT, they are optional and
>    * are unused if the BIOS sets them to zero. Therefore, we must copy/expand
> - * 32-bit V1.0 fields to the 64-bit X fields if the the 64-bit X field is
> - * originally zero.
> + * 32-bit V1.0 fields to the 64-bit X fields if the 64-bit X field is originally
> + * zero.
>    *
>    * For ACPI 1.0 FADTs (that contain no 64-bit addresses), all 32-bit address
>    * fields are expanded to the corresponding 64-bit X fields in the internal
> diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
> index 046add5f..c7e0ee75 100644
> --- a/src/acpica/source/components/tables/tbutils.c
> +++ b/src/acpica/source/components/tables/tbutils.c
> @@ -257,9 +257,9 @@ AcpiTbCheckDsdtHeader (
>    *
>    * FUNCTION:    AcpiTbCopyDsdt
>    *
> - * PARAMETERS:  TableDesc           - Installed table to copy
> + * PARAMETERS:  TableIndex          - Index of installed table to copy
>    *
> - * RETURN:      None
> + * RETURN:      The copied DSDT
>    *
>    * DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory.
>    *              Some very bad BIOSs are known to either corrupt the DSDT or
> @@ -368,7 +368,7 @@ AcpiTbGetRootTableEntry (
>    *
>    * FUNCTION:    AcpiTbParseRootTable
>    *
> - * PARAMETERS:  Rsdp                    - Pointer to the RSDP
> + * PARAMETERS:  RsdpAddress         - Pointer to the RSDP
>    *
>    * RETURN:      Status
>    *
> diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c
> index a0abe49c..7cb171bc 100644
> --- a/src/acpica/source/components/utilities/utdecode.c
> +++ b/src/acpica/source/components/utilities/utdecode.c
> @@ -629,8 +629,9 @@ static const char           *AcpiGbl_GenericNotify[ACPI_GENERIC_NOTIFY_MAX + 1]
>       /* 09 */ "Device PLD Check",
>       /* 0A */ "Reserved",
>       /* 0B */ "System Locality Update",
> -    /* 0C */ "Shutdown Request", /* Reserved in ACPI 6.0 */
> -    /* 0D */ "System Resource Affinity Update"
> +    /* 0C */ "Reserved (was previously Shutdown Request)",  /* Reserved in ACPI 6.0 */
> +    /* 0D */ "System Resource Affinity Update",
> +    /* 0E */ "Heterogeneous Memory Attributes Update"       /* ACPI 6.2 */
>   };
>   
>   static const char           *AcpiGbl_DeviceNotify[5] =
> diff --git a/src/acpica/source/components/utilities/utownerid.c b/src/acpica/source/components/utilities/utownerid.c
> index fba1d7ad..a54513f6 100644
> --- a/src/acpica/source/components/utilities/utownerid.c
> +++ b/src/acpica/source/components/utilities/utownerid.c
> @@ -225,14 +225,20 @@ AcpiUtAllocateOwnerId (
>                   break;
>               }
>   
> -            if (!(AcpiGbl_OwnerIdMask[j] & (1 << k)))
> +            /*
> +             * Note: the UINT32 cast ensures that 1 is stored as a unsigned
> +             * integer. Omitting the cast may result in 1 being stored as an
> +             * int. Some compilers or runtime error detection may flag this as
> +             * an error.
> +             */
> +            if (!(AcpiGbl_OwnerIdMask[j] & ((UINT32) 1 << k)))
>               {
>                   /*
>                    * Found a free ID. The actual ID is the bit index plus one,
>                    * making zero an invalid Owner ID. Save this as the last ID
>                    * allocated and update the global ID mask.
>                    */
> -                AcpiGbl_OwnerIdMask[j] |= (1 << k);
> +                AcpiGbl_OwnerIdMask[j] |= ((UINT32) 1 << k);
>   
>                   AcpiGbl_LastOwnerIdIndex = (UINT8) j;
>                   AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1);
> @@ -328,7 +334,7 @@ AcpiUtReleaseOwnerId (
>       /* Decode ID to index/offset pair */
>   
>       Index = ACPI_DIV_32 (OwnerId);
> -    Bit = 1 << ACPI_MOD_32 (OwnerId);
> +    Bit = (UINT32) 1 << ACPI_MOD_32 (OwnerId);
>   
>       /* Free the owner ID only if it is valid */
>   
> diff --git a/src/acpica/source/components/utilities/utresdecode.c b/src/acpica/source/components/utilities/utresdecode.c
> new file mode 100644
> index 00000000..10d84874
> --- /dev/null
> +++ b/src/acpica/source/components/utilities/utresdecode.c
> @@ -0,0 +1,461 @@
> +/*******************************************************************************
> + *
> + * Module Name: utresdecode - Resource descriptor keyword strings
> + *
> + ******************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * following license:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acresrc.h"
> +
> +
> +#define _COMPONENT          ACPI_UTILITIES
> +        ACPI_MODULE_NAME    ("utresdecode")
> +
> +
> +#if defined (ACPI_DEBUG_OUTPUT) || \
> +    defined (ACPI_DISASSEMBLER) || \
> +    defined (ACPI_DEBUGGER)
> +
> +/*
> + * Strings used to decode resource descriptors.
> + * Used by both the disassembler and the debugger resource dump routines
> + */
> +const char                      *AcpiGbl_BmDecode[] =
> +{
> +    "NotBusMaster",
> +    "BusMaster"
> +};
> +
> +const char                      *AcpiGbl_ConfigDecode[] =
> +{
> +    "0 - Good Configuration",
> +    "1 - Acceptable Configuration",
> +    "2 - Suboptimal Configuration",
> +    "3 - ***Invalid Configuration***",
> +};
> +
> +const char                      *AcpiGbl_ConsumeDecode[] =
> +{
> +    "ResourceProducer",
> +    "ResourceConsumer"
> +};
> +
> +const char                      *AcpiGbl_DecDecode[] =
> +{
> +    "PosDecode",
> +    "SubDecode"
> +};
> +
> +const char                      *AcpiGbl_HeDecode[] =
> +{
> +    "Level",
> +    "Edge"
> +};
> +
> +const char                      *AcpiGbl_IoDecode[] =
> +{
> +    "Decode10",
> +    "Decode16"
> +};
> +
> +const char                      *AcpiGbl_LlDecode[] =
> +{
> +    "ActiveHigh",
> +    "ActiveLow",
> +    "ActiveBoth",
> +    "Reserved"
> +};
> +
> +const char                      *AcpiGbl_MaxDecode[] =
> +{
> +    "MaxNotFixed",
> +    "MaxFixed"
> +};
> +
> +const char                      *AcpiGbl_MemDecode[] =
> +{
> +    "NonCacheable",
> +    "Cacheable",
> +    "WriteCombining",
> +    "Prefetchable"
> +};
> +
> +const char                      *AcpiGbl_MinDecode[] =
> +{
> +    "MinNotFixed",
> +    "MinFixed"
> +};
> +
> +const char                      *AcpiGbl_MtpDecode[] =
> +{
> +    "AddressRangeMemory",
> +    "AddressRangeReserved",
> +    "AddressRangeACPI",
> +    "AddressRangeNVS"
> +};
> +
> +const char                      *AcpiGbl_RngDecode[] =
> +{
> +    "InvalidRanges",
> +    "NonISAOnlyRanges",
> +    "ISAOnlyRanges",
> +    "EntireRange"
> +};
> +
> +const char                      *AcpiGbl_RwDecode[] =
> +{
> +    "ReadOnly",
> +    "ReadWrite"
> +};
> +
> +const char                      *AcpiGbl_ShrDecode[] =
> +{
> +    "Exclusive",
> +    "Shared",
> +    "ExclusiveAndWake",         /* ACPI 5.0 */
> +    "SharedAndWake"             /* ACPI 5.0 */
> +};
> +
> +const char                      *AcpiGbl_SizDecode[] =
> +{
> +    "Transfer8",
> +    "Transfer8_16",
> +    "Transfer16",
> +    "InvalidSize"
> +};
> +
> +const char                      *AcpiGbl_TrsDecode[] =
> +{
> +    "DenseTranslation",
> +    "SparseTranslation"
> +};
> +
> +const char                      *AcpiGbl_TtpDecode[] =
> +{
> +    "TypeStatic",
> +    "TypeTranslation"
> +};
> +
> +const char                      *AcpiGbl_TypDecode[] =
> +{
> +    "Compatibility",
> +    "TypeA",
> +    "TypeB",
> +    "TypeF"
> +};
> +
> +const char                      *AcpiGbl_PpcDecode[] =
> +{
> +    "PullDefault",
> +    "PullUp",
> +    "PullDown",
> +    "PullNone"
> +};
> +
> +const char                      *AcpiGbl_IorDecode[] =
> +{
> +    "IoRestrictionNone",
> +    "IoRestrictionInputOnly",
> +    "IoRestrictionOutputOnly",
> +    "IoRestrictionNoneAndPreserve"
> +};
> +
> +const char                      *AcpiGbl_DtsDecode[] =
> +{
> +    "Width8bit",
> +    "Width16bit",
> +    "Width32bit",
> +    "Width64bit",
> +    "Width128bit",
> +    "Width256bit",
> +};
> +
> +/* GPIO connection type */
> +
> +const char                      *AcpiGbl_CtDecode[] =
> +{
> +    "Interrupt",
> +    "I/O"
> +};
> +
> +/* Serial bus type */
> +
> +const char                      *AcpiGbl_SbtDecode[] =
> +{
> +    "/* UNKNOWN serial bus type */",
> +    "I2C",
> +    "SPI",
> +    "UART"
> +};
> +
> +/* I2C serial bus access mode */
> +
> +const char                      *AcpiGbl_AmDecode[] =
> +{
> +    "AddressingMode7Bit",
> +    "AddressingMode10Bit"
> +};
> +
> +/* I2C serial bus slave mode */
> +
> +const char                      *AcpiGbl_SmDecode[] =
> +{
> +    "ControllerInitiated",
> +    "DeviceInitiated"
> +};
> +
> +/* SPI serial bus wire mode */
> +
> +const char                      *AcpiGbl_WmDecode[] =
> +{
> +    "FourWireMode",
> +    "ThreeWireMode"
> +};
> +
> +/* SPI serial clock phase */
> +
> +const char                      *AcpiGbl_CphDecode[] =
> +{
> +    "ClockPhaseFirst",
> +    "ClockPhaseSecond"
> +};
> +
> +/* SPI serial bus clock polarity */
> +
> +const char                      *AcpiGbl_CpoDecode[] =
> +{
> +    "ClockPolarityLow",
> +    "ClockPolarityHigh"
> +};
> +
> +/* SPI serial bus device polarity */
> +
> +const char                      *AcpiGbl_DpDecode[] =
> +{
> +    "PolarityLow",
> +    "PolarityHigh"
> +};
> +
> +/* UART serial bus endian */
> +
> +const char                      *AcpiGbl_EdDecode[] =
> +{
> +    "LittleEndian",
> +    "BigEndian"
> +};
> +
> +/* UART serial bus bits per byte */
> +
> +const char                      *AcpiGbl_BpbDecode[] =
> +{
> +    "DataBitsFive",
> +    "DataBitsSix",
> +    "DataBitsSeven",
> +    "DataBitsEight",
> +    "DataBitsNine",
> +    "/* UNKNOWN Bits per byte */",
> +    "/* UNKNOWN Bits per byte */",
> +    "/* UNKNOWN Bits per byte */"
> +};
> +
> +/* UART serial bus stop bits */
> +
> +const char                      *AcpiGbl_SbDecode[] =
> +{
> +    "StopBitsZero",
> +    "StopBitsOne",
> +    "StopBitsOnePlusHalf",
> +    "StopBitsTwo"
> +};
> +
> +/* UART serial bus flow control */
> +
> +const char                      *AcpiGbl_FcDecode[] =
> +{
> +    "FlowControlNone",
> +    "FlowControlHardware",
> +    "FlowControlXON",
> +    "/* UNKNOWN flow control keyword */"
> +};
> +
> +/* UART serial bus parity type */
> +
> +const char                      *AcpiGbl_PtDecode[] =
> +{
> +    "ParityTypeNone",
> +    "ParityTypeEven",
> +    "ParityTypeOdd",
> +    "ParityTypeMark",
> +    "ParityTypeSpace",
> +    "/* UNKNOWN parity keyword */",
> +    "/* UNKNOWN parity keyword */",
> +    "/* UNKNOWN parity keyword */"
> +};
> +
> +/* PinConfig type */
> +
> +const char                      *AcpiGbl_PtypDecode[] =
> +{
> +    "Default",
> +    "Bias Pull-up",
> +    "Bias Pull-down",
> +    "Bias Default",
> +    "Bias Disable",
> +    "Bias High Impedance",
> +    "Bias Bus Hold",
> +    "Drive Open Drain",
> +    "Drive Open Source",
> +    "Drive Push Pull",
> +    "Drive Strength",
> +    "Slew Rate",
> +    "Input Debounce",
> +    "Input Schmitt Trigger",
> +};
> +
> +#endif
> diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
> index 978711a5..8131cde2 100644
> --- a/src/acpica/source/components/utilities/utresrc.c
> +++ b/src/acpica/source/components/utilities/utresrc.c
> @@ -158,287 +158,6 @@
>           ACPI_MODULE_NAME    ("utresrc")
>   
>   
> -#if defined(ACPI_DEBUG_OUTPUT) || defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
> -
> -/*
> - * Strings used to decode resource descriptors.
> - * Used by both the disassembler and the debugger resource dump routines
> - */
> -const char                      *AcpiGbl_BmDecode[] =
> -{
> -    "NotBusMaster",
> -    "BusMaster"
> -};
> -
> -const char                      *AcpiGbl_ConfigDecode[] =
> -{
> -    "0 - Good Configuration",
> -    "1 - Acceptable Configuration",
> -    "2 - Suboptimal Configuration",
> -    "3 - ***Invalid Configuration***",
> -};
> -
> -const char                      *AcpiGbl_ConsumeDecode[] =
> -{
> -    "ResourceProducer",
> -    "ResourceConsumer"
> -};
> -
> -const char                      *AcpiGbl_DecDecode[] =
> -{
> -    "PosDecode",
> -    "SubDecode"
> -};
> -
> -const char                      *AcpiGbl_HeDecode[] =
> -{
> -    "Level",
> -    "Edge"
> -};
> -
> -const char                      *AcpiGbl_IoDecode[] =
> -{
> -    "Decode10",
> -    "Decode16"
> -};
> -
> -const char                      *AcpiGbl_LlDecode[] =
> -{
> -    "ActiveHigh",
> -    "ActiveLow",
> -    "ActiveBoth",
> -    "Reserved"
> -};
> -
> -const char                      *AcpiGbl_MaxDecode[] =
> -{
> -    "MaxNotFixed",
> -    "MaxFixed"
> -};
> -
> -const char                      *AcpiGbl_MemDecode[] =
> -{
> -    "NonCacheable",
> -    "Cacheable",
> -    "WriteCombining",
> -    "Prefetchable"
> -};
> -
> -const char                      *AcpiGbl_MinDecode[] =
> -{
> -    "MinNotFixed",
> -    "MinFixed"
> -};
> -
> -const char                      *AcpiGbl_MtpDecode[] =
> -{
> -    "AddressRangeMemory",
> -    "AddressRangeReserved",
> -    "AddressRangeACPI",
> -    "AddressRangeNVS"
> -};
> -
> -const char                      *AcpiGbl_RngDecode[] =
> -{
> -    "InvalidRanges",
> -    "NonISAOnlyRanges",
> -    "ISAOnlyRanges",
> -    "EntireRange"
> -};
> -
> -const char                      *AcpiGbl_RwDecode[] =
> -{
> -    "ReadOnly",
> -    "ReadWrite"
> -};
> -
> -const char                      *AcpiGbl_ShrDecode[] =
> -{
> -    "Exclusive",
> -    "Shared",
> -    "ExclusiveAndWake",         /* ACPI 5.0 */
> -    "SharedAndWake"             /* ACPI 5.0 */
> -};
> -
> -const char                      *AcpiGbl_SizDecode[] =
> -{
> -    "Transfer8",
> -    "Transfer8_16",
> -    "Transfer16",
> -    "InvalidSize"
> -};
> -
> -const char                      *AcpiGbl_TrsDecode[] =
> -{
> -    "DenseTranslation",
> -    "SparseTranslation"
> -};
> -
> -const char                      *AcpiGbl_TtpDecode[] =
> -{
> -    "TypeStatic",
> -    "TypeTranslation"
> -};
> -
> -const char                      *AcpiGbl_TypDecode[] =
> -{
> -    "Compatibility",
> -    "TypeA",
> -    "TypeB",
> -    "TypeF"
> -};
> -
> -const char                      *AcpiGbl_PpcDecode[] =
> -{
> -    "PullDefault",
> -    "PullUp",
> -    "PullDown",
> -    "PullNone"
> -};
> -
> -const char                      *AcpiGbl_IorDecode[] =
> -{
> -    "IoRestrictionNone",
> -    "IoRestrictionInputOnly",
> -    "IoRestrictionOutputOnly",
> -    "IoRestrictionNoneAndPreserve"
> -};
> -
> -const char                      *AcpiGbl_DtsDecode[] =
> -{
> -    "Width8bit",
> -    "Width16bit",
> -    "Width32bit",
> -    "Width64bit",
> -    "Width128bit",
> -    "Width256bit",
> -};
> -
> -/* GPIO connection type */
> -
> -const char                      *AcpiGbl_CtDecode[] =
> -{
> -    "Interrupt",
> -    "I/O"
> -};
> -
> -/* Serial bus type */
> -
> -const char                      *AcpiGbl_SbtDecode[] =
> -{
> -    "/* UNKNOWN serial bus type */",
> -    "I2C",
> -    "SPI",
> -    "UART"
> -};
> -
> -/* I2C serial bus access mode */
> -
> -const char                      *AcpiGbl_AmDecode[] =
> -{
> -    "AddressingMode7Bit",
> -    "AddressingMode10Bit"
> -};
> -
> -/* I2C serial bus slave mode */
> -
> -const char                      *AcpiGbl_SmDecode[] =
> -{
> -    "ControllerInitiated",
> -    "DeviceInitiated"
> -};
> -
> -/* SPI serial bus wire mode */
> -
> -const char                      *AcpiGbl_WmDecode[] =
> -{
> -    "FourWireMode",
> -    "ThreeWireMode"
> -};
> -
> -/* SPI serial clock phase */
> -
> -const char                      *AcpiGbl_CphDecode[] =
> -{
> -    "ClockPhaseFirst",
> -    "ClockPhaseSecond"
> -};
> -
> -/* SPI serial bus clock polarity */
> -
> -const char                      *AcpiGbl_CpoDecode[] =
> -{
> -    "ClockPolarityLow",
> -    "ClockPolarityHigh"
> -};
> -
> -/* SPI serial bus device polarity */
> -
> -const char                      *AcpiGbl_DpDecode[] =
> -{
> -    "PolarityLow",
> -    "PolarityHigh"
> -};
> -
> -/* UART serial bus endian */
> -
> -const char                      *AcpiGbl_EdDecode[] =
> -{
> -    "LittleEndian",
> -    "BigEndian"
> -};
> -
> -/* UART serial bus bits per byte */
> -
> -const char                      *AcpiGbl_BpbDecode[] =
> -{
> -    "DataBitsFive",
> -    "DataBitsSix",
> -    "DataBitsSeven",
> -    "DataBitsEight",
> -    "DataBitsNine",
> -    "/* UNKNOWN Bits per byte */",
> -    "/* UNKNOWN Bits per byte */",
> -    "/* UNKNOWN Bits per byte */"
> -};
> -
> -/* UART serial bus stop bits */
> -
> -const char                      *AcpiGbl_SbDecode[] =
> -{
> -    "StopBitsZero",
> -    "StopBitsOne",
> -    "StopBitsOnePlusHalf",
> -    "StopBitsTwo"
> -};
> -
> -/* UART serial bus flow control */
> -
> -const char                      *AcpiGbl_FcDecode[] =
> -{
> -    "FlowControlNone",
> -    "FlowControlHardware",
> -    "FlowControlXON",
> -    "/* UNKNOWN flow control keyword */"
> -};
> -
> -/* UART serial bus parity type */
> -
> -const char                      *AcpiGbl_PtDecode[] =
> -{
> -    "ParityTypeNone",
> -    "ParityTypeEven",
> -    "ParityTypeOdd",
> -    "ParityTypeMark",
> -    "ParityTypeSpace",
> -    "/* UNKNOWN parity keyword */",
> -    "/* UNKNOWN parity keyword */",
> -    "/* UNKNOWN parity keyword */"
> -};
> -
> -#endif
> -
> -
>   /*
>    * Base sizes of the raw AML resource descriptors, indexed by resource type.
>    * Zero indicates a reserved (and therefore invalid) resource type.
> @@ -479,8 +198,12 @@ const UINT8                 AcpiGbl_ResourceAmlSizes[] =
>       ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
>       ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64),
>       ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO),
> -    0,
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_FUNCTION),
>       ACPI_AML_SIZE_LARGE (AML_RESOURCE_COMMON_SERIALBUS),
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_CONFIG),
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP),
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_FUNCTION),
> +    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_CONFIG),
>   };
>   
>   const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
> @@ -534,8 +257,12 @@ static const UINT8          AcpiGbl_ResourceTypes[] =
>       ACPI_VARIABLE_LENGTH,           /* 0A Qword* address */
>       ACPI_FIXED_LENGTH,              /* 0B Extended* address */
>       ACPI_VARIABLE_LENGTH,           /* 0C Gpio* */
> -    0,
> -    ACPI_VARIABLE_LENGTH            /* 0E *SerialBus */
> +    ACPI_VARIABLE_LENGTH,           /* 0D PinFunction */
> +    ACPI_VARIABLE_LENGTH,           /* 0E *SerialBus */
> +    ACPI_VARIABLE_LENGTH,           /* 0F PinConfig */
> +    ACPI_VARIABLE_LENGTH,           /* 10 PinGroup */
> +    ACPI_VARIABLE_LENGTH,           /* 11 PinGroupFunction */
> +    ACPI_VARIABLE_LENGTH,           /* 12 PinGroupConfig */
>   };
>   
>   
> @@ -580,7 +307,7 @@ AcpiUtWalkAmlResources (
>        * The absolute minimum resource template is one EndTag descriptor.
>        * However, we will treat a lone EndTag as just a simple buffer.
>        */
> -    if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
> +    if (AmlLength <= sizeof (AML_RESOURCE_END_TAG))
>       {
>           return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
>       }
> @@ -613,8 +340,8 @@ AcpiUtWalkAmlResources (
>   
>           if (UserFunction)
>           {
> -            Status = UserFunction (Aml, Length, Offset,
> -                ResourceIndex, Context);
> +            Status = UserFunction (
> +                Aml, Length, Offset, ResourceIndex, Context);
>               if (ACPI_FAILURE (Status))
>               {
>                   return_ACPI_STATUS (Status);
> @@ -651,15 +378,10 @@ AcpiUtWalkAmlResources (
>                   *Context = Aml;
>               }
>   
> -            /* Check if buffer is defined to be longer than the resource length */
> -
> -            if (AmlLength > (Offset + Length))
> -            {
> -                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
> -            }
> -
> -            /* Normal exit */
> -
> +            /*
> +             * Normal exit. Note: We allow the buffer to be larger than
> +             * the resource template, as long as the END_TAG exists.
> +             */
>               return_ACPI_STATUS (AE_OK);
>           }
>   
> diff --git a/src/acpica/source/include/acapps.h b/src/acpica/source/include/acapps.h
> index 6ceb0f23..6ef98550 100644
> --- a/src/acpica/source/include/acapps.h
> +++ b/src/acpica/source/include/acapps.h
> @@ -294,7 +294,7 @@ AcpiDmFinishNamespaceLoad (
>       ACPI_OWNER_ID           OwnerId);
>   
>   void
> -AcpiDmConvertResourceIndexes (
> +AcpiDmConvertParseObjects (
>       ACPI_PARSE_OBJECT       *ParseTreeRoot,
>       ACPI_NAMESPACE_NODE     *NamespaceRoot);
>   
> diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
> index 01b0829d..5beec2d4 100644
> --- a/src/acpica/source/include/acdisasm.h
> +++ b/src/acpica/source/include/acdisasm.h
> @@ -207,6 +207,11 @@ typedef enum
>       ACPI_DMT_FLAGS1,
>       ACPI_DMT_FLAGS2,
>       ACPI_DMT_FLAGS4,
> +    ACPI_DMT_FLAGS4_0,
> +    ACPI_DMT_FLAGS4_4,
> +    ACPI_DMT_FLAGS4_8,
> +    ACPI_DMT_FLAGS4_12,
> +    ACPI_DMT_FLAGS16_16,
>       ACPI_DMT_UINT8,
>       ACPI_DMT_UINT16,
>       ACPI_DMT_UINT24,
> @@ -257,6 +262,7 @@ typedef enum
>       ACPI_DMT_HEST,
>       ACPI_DMT_HESTNTFY,
>       ACPI_DMT_HESTNTYP,
> +    ACPI_DMT_HMAT,
>       ACPI_DMT_IORTMEM,
>       ACPI_DMT_IVRS,
>       ACPI_DMT_LPIT,
> @@ -264,6 +270,7 @@ typedef enum
>       ACPI_DMT_NFIT,
>       ACPI_DMT_PCCT,
>       ACPI_DMT_PMTT,
> +    ACPI_DMT_PPTT,
>       ACPI_DMT_SLIC,
>       ACPI_DMT_SRAT,
>   
> @@ -412,12 +419,22 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest7[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest8[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest9[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest10[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest11[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHestNotify[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHestBank[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHpet[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoLpitHdr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoLpit0[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoLpit1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat0[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1b[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1c[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat2a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmatHdr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort0[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort0a[];
> @@ -495,6 +512,13 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcctHdr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct0[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct1[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct3[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct4[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0a[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt2[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPpttHdr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRasf[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRsdp1[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRsdp2[];
> @@ -513,6 +537,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat0[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat1[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat2[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat3[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat4[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoStao[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoStaoStr[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTcpaHdr[];
> @@ -529,6 +554,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWddt[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdrt[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWpbt[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWpbt0[];
> +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWsmt[];
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoXenv[];
>   
>   extern ACPI_DMTABLE_INFO        AcpiDmTableInfoGeneric[][2];
> @@ -641,6 +667,10 @@ AcpiDmDumpHest (
>       ACPI_TABLE_HEADER       *Table);
>   
>   void
> +AcpiDmDumpHmat (
> +    ACPI_TABLE_HEADER       *Table);
> +
> +void
>   AcpiDmDumpIort (
>       ACPI_TABLE_HEADER       *Table);
>   
> @@ -684,6 +714,10 @@ void
>   AcpiDmDumpPmtt (
>       ACPI_TABLE_HEADER       *Table);
>   
> +void
> +AcpiDmDumpPptt (
> +    ACPI_TABLE_HEADER       *Table);
> +
>   UINT32
>   AcpiDmDumpRsdp (
>       ACPI_TABLE_HEADER       *Table);
> @@ -759,10 +793,6 @@ AcpiDmDisassembleOneOp (
>       ACPI_OP_WALK_INFO       *Info,
>       ACPI_PARSE_OBJECT       *Op);
>   
> -BOOLEAN
> -AcpiDmIsTempName (
> -    ACPI_PARSE_OBJECT       *Op);
> -
>   UINT32
>   AcpiDmListType (
>       ACPI_PARSE_OBJECT       *Op);
> @@ -888,6 +918,12 @@ AcpiDmAddOpToExternalList (
>       UINT16                  Flags);
>   
>   void
> +AcpiDmCreateSubobjectForExternal (
> +    UINT8                   Type,
> +    ACPI_NAMESPACE_NODE     **Node,
> +    UINT32                  Value);
> +
> +void
>   AcpiDmAddNodeToExternalList (
>       ACPI_NAMESPACE_NODE     *Node,
>       UINT8                   Type,
> @@ -895,11 +931,17 @@ AcpiDmAddNodeToExternalList (
>       UINT16                  Flags);
>   
>   void
> -AcpiDmAddExternalsToNamespace (
> +AcpiDmAddExternalListToNamespace (
>       void);
>   
> +void
> +AcpiDmAddOneExternalToNamespace (
> +    char                    *Path,
> +    UINT8                   Type,
> +    UINT32                  Value);
> +
>   UINT32
> -AcpiDmGetExternalMethodCount (
> +AcpiDmGetUnresolvedExternalMethodCount (
>       void);
>   
>   void
> @@ -923,6 +965,11 @@ void
>   AcpiDmGetExternalsFromFile (
>       void);
>   
> +void
> +AcpiDmMarkExternalConflict (
> +    ACPI_NAMESPACE_NODE     *Node);
> +
> +
>   /*
>    * dmresrc
>    */
> @@ -1048,6 +1095,41 @@ AcpiDmGpioDescriptor (
>       UINT32                  Level);
>   
>   void
> +AcpiDmPinFunctionDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
> +void
> +AcpiDmPinConfigDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
> +void
> +AcpiDmPinGroupDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
> +void
> +AcpiDmPinGroupFunctionDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
> +void
> +AcpiDmPinGroupConfigDescriptor (
> +    ACPI_OP_WALK_INFO       *Info,
> +    AML_RESOURCE            *Resource,
> +    UINT32                  Length,
> +    UINT32                  Level);
> +
> +void
>   AcpiDmSerialBusDescriptor (
>       ACPI_OP_WALK_INFO       *Info,
>       AML_RESOURCE            *Resource,
> @@ -1171,6 +1253,17 @@ AcpiDmCloseOperator (
>   /*
>    * dmtables
>    */
> +ACPI_STATUS
> +AcpiDmProcessSwitch (
> +    ACPI_PARSE_OBJECT       *Op);
> +
> +void
> +AcpiDmClearTempList(
> +    void);
> +
> +/*
> + * dmtables
> + */
>   void
>   AdDisassemblerHeader (
>       char                    *Filename,
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index edb696a9..686dcd81 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -427,6 +427,7 @@ ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_ForceAmlDisassembly, FALSE);
>   ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DmOpt_Verbose, TRUE);
>   ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DmEmitExternalOpcodes, FALSE);
>   ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DoDisassemblerOptimizations, TRUE);
> +ACPI_INIT_GLOBAL (ACPI_PARSE_OBJECT_LIST,   *AcpiGbl_TempListHead, NULL);
>   
>   ACPI_GLOBAL (BOOLEAN,                   AcpiGbl_DmOpt_Disasm);
>   ACPI_GLOBAL (BOOLEAN,                   AcpiGbl_DmOpt_Listing);
> @@ -480,6 +481,8 @@ ACPI_GLOBAL (const char,                *AcpiGbl_PldVerticalPositionList[]);
>   ACPI_GLOBAL (const char,                *AcpiGbl_PldHorizontalPositionList[]);
>   ACPI_GLOBAL (const char,                *AcpiGbl_PldShapeList[]);
>   
> +ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DisasmFlag, FALSE);
> +
>   #endif
>   
>   /*
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index 92eb49a6..1d94a591 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -1136,7 +1136,7 @@ typedef struct acpi_parse_obj_common
>   typedef struct acpi_parse_obj_named
>   {
>       ACPI_PARSE_COMMON
> -    UINT8                           *Path;
> +    char                            *Path;
>       UINT8                           *Data;          /* AML body or bytelist data */
>       UINT32                          Length;         /* AML length */
>       UINT32                          Name;           /* 4-byte name or zero if no name */
> @@ -1444,8 +1444,13 @@ typedef struct acpi_port_info
>   #define ACPI_RESOURCE_NAME_ADDRESS64            0x8A
>   #define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64   0x8B
>   #define ACPI_RESOURCE_NAME_GPIO                 0x8C
> +#define ACPI_RESOURCE_NAME_PIN_FUNCTION         0x8D
>   #define ACPI_RESOURCE_NAME_SERIAL_BUS           0x8E
> -#define ACPI_RESOURCE_NAME_LARGE_MAX            0x8E
> +#define ACPI_RESOURCE_NAME_PIN_CONFIG           0x8F
> +#define ACPI_RESOURCE_NAME_PIN_GROUP            0x90
> +#define ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION   0x91
> +#define ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG     0x92
> +#define ACPI_RESOURCE_NAME_LARGE_MAX            0x92
>   
>   
>   /*****************************************************************************
> @@ -1482,6 +1487,7 @@ typedef struct acpi_external_list
>   #define ACPI_EXT_INTERNAL_PATH_ALLOCATED    0x04    /* Deallocate internal path on completion */
>   #define ACPI_EXT_EXTERNAL_EMITTED           0x08    /* External() statement has been emitted */
>   #define ACPI_EXT_ORIGIN_FROM_OPCODE         0x10    /* External came from a External() opcode */
> +#define ACPI_EXT_CONFLICTING_DECLARATION    0x20    /* External has a conflicting declaration within AML */
>   
>   
>   typedef struct acpi_external_file
> @@ -1492,6 +1498,13 @@ typedef struct acpi_external_file
>   } ACPI_EXTERNAL_FILE;
>   
>   
> +typedef struct acpi_parse_object_list
> +{
> +    ACPI_PARSE_OBJECT               *Op;
> +    struct acpi_parse_object_list   *Next;
> +
> +} ACPI_PARSE_OBJECT_LIST;
> +
>   /*****************************************************************************
>    *
>    * Debugger
> diff --git a/src/acpica/source/include/acopcode.h b/src/acpica/source/include/acopcode.h
> index b0cc4b1e..3ce2772b 100644
> --- a/src/acpica/source/include/acopcode.h
> +++ b/src/acpica/source/include/acopcode.h
> @@ -221,7 +221,7 @@
>   #define ARGP_DWORD_OP                   ARGP_LIST1 (ARGP_DWORDDATA)
>   #define ARGP_ELSE_OP                    ARGP_LIST2 (ARGP_PKGLENGTH,  ARGP_TERMLIST)
>   #define ARGP_EVENT_OP                   ARGP_LIST1 (ARGP_NAME)
> -#define ARGP_EXTERNAL_OP                ARGP_LIST3 (ARGP_NAMESTRING, ARGP_BYTEDATA,      ARGP_BYTEDATA)
> +#define ARGP_EXTERNAL_OP                ARGP_LIST3 (ARGP_NAME,       ARGP_BYTEDATA,      ARGP_BYTEDATA)
>   #define ARGP_FATAL_OP                   ARGP_LIST3 (ARGP_BYTEDATA,   ARGP_DWORDDATA,     ARGP_TERMARG)
>   #define ARGP_FIELD_OP                   ARGP_LIST4 (ARGP_PKGLENGTH,  ARGP_NAMESTRING,    ARGP_BYTEDATA,  ARGP_FIELDLIST)
>   #define ARGP_FIND_SET_LEFT_BIT_OP       ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 55a0bded..934e6683 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -154,7 +154,7 @@
>   
>   /* Current ACPICA subsystem version in YYYYMMDD format */
>   
> -#define ACPI_CA_VERSION                 0x20170303
> +#define ACPI_CA_VERSION                 0x20170531
>   
>   #include "acconfig.h"
>   #include "actypes.h"
> diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
> index 5adc110d..95a18a47 100644
> --- a/src/acpica/source/include/acpredef.h
> +++ b/src/acpica/source/include/acpredef.h
> @@ -682,6 +682,9 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
>       {{"_HID",   METHOD_0ARGS,
>                   METHOD_RETURNS (ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING)}},
>   
> +    {{"_HMA",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_BUFFER)}},
> +
>       {{"_HOT",   METHOD_0ARGS,
>                   METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
>   
> @@ -726,6 +729,17 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
>                       PACKAGE_INFO (ACPI_PTYPE2_VAR_VAR, ACPI_RTYPE_INTEGER, 3,
>                       ACPI_RTYPE_INTEGER | ACPI_RTYPE_BUFFER | ACPI_RTYPE_STRING, 10,0),
>   
> +    {{"_LSI",   METHOD_0ARGS,
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}},
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 3,0,0,0),
> +
> +    {{"_LSR",   METHOD_2ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER),
> +                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}},
> +                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 1, ACPI_RTYPE_BUFFER, 1,0),
> +
> +    {{"_LSW",   METHOD_3ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_BUFFER),
> +                METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
> +
>       {{"_MAT",   METHOD_0ARGS,
>                   METHOD_RETURNS (ACPI_RTYPE_BUFFER)}},
>   
> diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
> index e6458e54..ca5aad02 100644
> --- a/src/acpica/source/include/acresrc.h
> +++ b/src/acpica/source/include/acresrc.h
> @@ -264,7 +264,9 @@ typedef enum
>       ACPI_RSD_UINT16,
>       ACPI_RSD_UINT32,
>       ACPI_RSD_UINT64,
> -    ACPI_RSD_WORDLIST
> +    ACPI_RSD_WORDLIST,
> +    ACPI_RSD_LABEL,
> +    ACPI_RSD_SOURCE_LABEL,
>   
>   } ACPI_RSDUMP_OPCODES;
>   
> @@ -496,6 +498,11 @@ extern ACPI_RSCONVERT_INFO      AcpiRsConvertFixedDma[];
>   extern ACPI_RSCONVERT_INFO      AcpiRsConvertI2cSerialBus[];
>   extern ACPI_RSCONVERT_INFO      AcpiRsConvertSpiSerialBus[];
>   extern ACPI_RSCONVERT_INFO      AcpiRsConvertUartSerialBus[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinFunction[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinConfig[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinGroup[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinGroupFunction[];
> +extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinGroupConfig[];
>   
>   /* These resources require separate get/set tables */
>   
> @@ -540,12 +547,17 @@ extern ACPI_RSDUMP_INFO         AcpiRsDumpExtAddress64[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpExtIrq[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpGenericReg[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpGpio[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpPinFunction[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpFixedDma[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpCommonSerialBus[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpI2cSerialBus[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpSpiSerialBus[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpUartSerialBus[];
>   extern ACPI_RSDUMP_INFO         AcpiRsDumpGeneralFlags[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpPinConfig[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpPinGroup[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpPinGroupFunction[];
> +extern ACPI_RSDUMP_INFO         AcpiRsDumpPinGroupConfig[];
>   #endif
>   
>   #endif  /* __ACRESRC_H__ */
> diff --git a/src/acpica/source/include/acrestyp.h b/src/acpica/source/include/acrestyp.h
> index 7df5a63f..0057722c 100644
> --- a/src/acpica/source/include/acrestyp.h
> +++ b/src/acpica/source/include/acrestyp.h
> @@ -435,6 +435,13 @@ typedef union acpi_resource_attribute
>   
>   } ACPI_RESOURCE_ATTRIBUTE;
>   
> +typedef struct acpi_resource_label
> +{
> +    UINT16                          StringLength;
> +    char                            *StringPtr;
> +
> +} ACPI_RESOURCE_LABEL;
> +
>   typedef struct acpi_resource_source
>   {
>       UINT8                           Index;
> @@ -725,6 +732,90 @@ typedef struct acpi_resource_uart_serialbus
>   #define ACPI_UART_CLEAR_TO_SEND                 (1<<6)
>   #define ACPI_UART_REQUEST_TO_SEND               (1<<7)
>   
> +typedef struct acpi_resource_pin_function
> +{
> +    UINT8                           RevisionId;
> +    UINT8                           PinConfig;
> +    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
> +    UINT16                          FunctionNumber;
> +    UINT16                          PinTableLength;
> +    UINT16                          VendorLength;
> +    ACPI_RESOURCE_SOURCE            ResourceSource;
> +    UINT16                          *PinTable;
> +    UINT8                           *VendorData;
> +
> +} ACPI_RESOURCE_PIN_FUNCTION;
> +
> +typedef struct acpi_resource_pin_config
> +{
> +    UINT8                           RevisionId;
> +    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
> +    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
> +    UINT8                           PinConfigType;
> +    UINT32                          PinConfigValue;
> +    UINT16                          PinTableLength;
> +    UINT16                          VendorLength;
> +    ACPI_RESOURCE_SOURCE            ResourceSource;
> +    UINT16                          *PinTable;
> +    UINT8                           *VendorData;
> +
> +} ACPI_RESOURCE_PIN_CONFIG;
> +
> +/* Values for PinConfigType field above */
> +
> +#define ACPI_PIN_CONFIG_DEFAULT                 0
> +#define ACPI_PIN_CONFIG_BIAS_PULL_UP            1
> +#define ACPI_PIN_CONFIG_BIAS_PULL_DOWN          2
> +#define ACPI_PIN_CONFIG_BIAS_DEFAULT            3
> +#define ACPI_PIN_CONFIG_BIAS_DISABLE            4
> +#define ACPI_PIN_CONFIG_BIAS_HIGH_IMPEDANCE     5
> +#define ACPI_PIN_CONFIG_BIAS_BUS_HOLD           6
> +#define ACPI_PIN_CONFIG_DRIVE_OPEN_DRAIN        7
> +#define ACPI_PIN_CONFIG_DRIVE_OPEN_SOURCE       8
> +#define ACPI_PIN_CONFIG_DRIVE_PUSH_PULL         9
> +#define ACPI_PIN_CONFIG_DRIVE_STRENGTH          10
> +#define ACPI_PIN_CONFIG_SLEW_RATE               11
> +#define ACPI_PIN_CONFIG_INPUT_DEBOUNCE          12
> +#define ACPI_PIN_CONFIG_INPUT_SCHMITT_TRIGGER   13
> +
> +typedef struct acpi_resource_pin_group
> +{
> +    UINT8                           RevisionId;
> +    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
> +    UINT16                          PinTableLength;
> +    UINT16                          VendorLength;
> +    UINT16                          *PinTable;
> +    ACPI_RESOURCE_LABEL             ResourceLabel;
> +    UINT8                           *VendorData;
> +
> +} ACPI_RESOURCE_PIN_GROUP;
> +
> +typedef struct acpi_resource_pin_group_function
> +{
> +    UINT8                           RevisionId;
> +    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
> +    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
> +    UINT16                          FunctionNumber;
> +    UINT16                          VendorLength;
> +    ACPI_RESOURCE_SOURCE            ResourceSource;
> +    ACPI_RESOURCE_LABEL             ResourceSourceLabel;
> +    UINT8                           *VendorData;
> +
> +} ACPI_RESOURCE_PIN_GROUP_FUNCTION;
> +
> +typedef struct acpi_resource_pin_group_config
> +{
> +    UINT8                           RevisionId;
> +    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
> +    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
> +    UINT8                           PinConfigType;      /* For values, see PinConfigType above */
> +    UINT32                          PinConfigValue;
> +    UINT16                          VendorLength;
> +    ACPI_RESOURCE_SOURCE            ResourceSource;
> +    ACPI_RESOURCE_LABEL             ResourceSourceLabel;
> +    UINT8                           *VendorData;
> +
> +} ACPI_RESOURCE_PIN_GROUP_CONFIG;
>   
>   /* ACPI_RESOURCE_TYPEs */
>   
> @@ -748,7 +839,12 @@ typedef struct acpi_resource_uart_serialbus
>   #define ACPI_RESOURCE_TYPE_GPIO                 17  /* ACPI 5.0 */
>   #define ACPI_RESOURCE_TYPE_FIXED_DMA            18  /* ACPI 5.0 */
>   #define ACPI_RESOURCE_TYPE_SERIAL_BUS           19  /* ACPI 5.0 */
> -#define ACPI_RESOURCE_TYPE_MAX                  19
> +#define ACPI_RESOURCE_TYPE_PIN_FUNCTION         20  /* ACPI 6.2 */
> +#define ACPI_RESOURCE_TYPE_PIN_CONFIG           21  /* ACPI 6.2 */
> +#define ACPI_RESOURCE_TYPE_PIN_GROUP            22  /* ACPI 6.2 */
> +#define ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION   23  /* ACPI 6.2 */
> +#define ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG     24  /* ACPI 6.2 */
> +#define ACPI_RESOURCE_TYPE_MAX                  24
>   
>   /* Master union for resource descriptors */
>   
> @@ -777,6 +873,11 @@ typedef union acpi_resource_data
>       ACPI_RESOURCE_SPI_SERIALBUS             SpiSerialBus;
>       ACPI_RESOURCE_UART_SERIALBUS            UartSerialBus;
>       ACPI_RESOURCE_COMMON_SERIALBUS          CommonSerialBus;
> +    ACPI_RESOURCE_PIN_FUNCTION              PinFunction;
> +    ACPI_RESOURCE_PIN_CONFIG                PinConfig;
> +    ACPI_RESOURCE_PIN_GROUP                 PinGroup;
> +    ACPI_RESOURCE_PIN_GROUP_FUNCTION        PinGroupFunction;
> +    ACPI_RESOURCE_PIN_GROUP_CONFIG          PinGroupConfig;
>   
>       /* Common fields */
>   
> diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
> index b7119fa6..da6b561a 100644
> --- a/src/acpica/source/include/actbl1.h
> +++ b/src/acpica/source/include/actbl1.h
> @@ -175,9 +175,11 @@
>   #define ACPI_SIG_ECDT           "ECDT"      /* Embedded Controller Boot Resources Table */
>   #define ACPI_SIG_EINJ           "EINJ"      /* Error Injection table */
>   #define ACPI_SIG_ERST           "ERST"      /* Error Record Serialization Table */
> +#define ACPI_SIG_HMAT           "HMAT"      /* Heterogeneous Memory Attributes Table */
>   #define ACPI_SIG_HEST           "HEST"      /* Hardware Error Source Table */
>   #define ACPI_SIG_MADT           "APIC"      /* Multiple APIC Description Table */
>   #define ACPI_SIG_MSCT           "MSCT"      /* Maximum System Characteristics Table */
> +#define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
>   #define ACPI_SIG_SBST           "SBST"      /* Smart Battery Specification Table */
>   #define ACPI_SIG_SLIT           "SLIT"      /* System Locality Distance Information Table */
>   #define ACPI_SIG_SRAT           "SRAT"      /* System Resource Affinity Table */
> @@ -600,7 +602,8 @@ enum AcpiHestTypes
>       ACPI_HEST_TYPE_AER_BRIDGE           = 8,
>       ACPI_HEST_TYPE_GENERIC_ERROR        = 9,
>       ACPI_HEST_TYPE_GENERIC_ERROR_V2     = 10,
> -    ACPI_HEST_TYPE_RESERVED             = 11    /* 11 and greater are reserved */
> +    ACPI_HEST_TYPE_IA32_DEFERRED_CHECK  = 11,
> +    ACPI_HEST_TYPE_RESERVED             = 12    /* 12 and greater are reserved */
>   };
>   
>   
> @@ -652,6 +655,7 @@ typedef struct acpi_hest_aer_common
>   
>   #define ACPI_HEST_FIRMWARE_FIRST        (1)
>   #define ACPI_HEST_GLOBAL                (1<<1)
> +#define ACPI_HEST_GHES_ASSIST           (1<<2)
>   
>   /*
>    * Macros to access the bus/segment numbers in Bus field above:
> @@ -682,18 +686,19 @@ typedef struct acpi_hest_notify
>   
>   enum AcpiHestNotifyTypes
>   {
> -    ACPI_HEST_NOTIFY_POLLED     = 0,
> -    ACPI_HEST_NOTIFY_EXTERNAL   = 1,
> -    ACPI_HEST_NOTIFY_LOCAL      = 2,
> -    ACPI_HEST_NOTIFY_SCI        = 3,
> -    ACPI_HEST_NOTIFY_NMI        = 4,
> -    ACPI_HEST_NOTIFY_CMCI       = 5,    /* ACPI 5.0 */
> -    ACPI_HEST_NOTIFY_MCE        = 6,    /* ACPI 5.0 */
> -    ACPI_HEST_NOTIFY_GPIO       = 7,    /* ACPI 6.0 */
> -    ACPI_HEST_NOTIFY_SEA        = 8,    /* ACPI 6.1 */
> -    ACPI_HEST_NOTIFY_SEI        = 9,    /* ACPI 6.1 */
> -    ACPI_HEST_NOTIFY_GSIV       = 10,   /* ACPI 6.1 */
> -    ACPI_HEST_NOTIFY_RESERVED   = 11    /* 11 and greater are reserved */
> +    ACPI_HEST_NOTIFY_POLLED             = 0,
> +    ACPI_HEST_NOTIFY_EXTERNAL           = 1,
> +    ACPI_HEST_NOTIFY_LOCAL              = 2,
> +    ACPI_HEST_NOTIFY_SCI                = 3,
> +    ACPI_HEST_NOTIFY_NMI                = 4,
> +    ACPI_HEST_NOTIFY_CMCI               = 5,    /* ACPI 5.0 */
> +    ACPI_HEST_NOTIFY_MCE                = 6,    /* ACPI 5.0 */
> +    ACPI_HEST_NOTIFY_GPIO               = 7,    /* ACPI 6.0 */
> +    ACPI_HEST_NOTIFY_SEA                = 8,    /* ACPI 6.1 */
> +    ACPI_HEST_NOTIFY_SEI                = 9,    /* ACPI 6.1 */
> +    ACPI_HEST_NOTIFY_GSIV               = 10,   /* ACPI 6.1 */
> +    ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED = 11,   /* ACPI 6.2 */
> +    ACPI_HEST_NOTIFY_RESERVED           = 12    /* 12 and greater are reserved */
>   };
>   
>   /* Values for ConfigWriteEnable bitfield above */
> @@ -716,7 +721,7 @@ typedef struct acpi_hest_ia_machine_check
>   {
>       ACPI_HEST_HEADER        Header;
>       UINT16                  Reserved1;
> -    UINT8                   Flags;
> +    UINT8                   Flags;              /* See flags ACPI_HEST_GLOBAL, etc. above */
>       UINT8                   Enabled;
>       UINT32                  RecordsToPreallocate;
>       UINT32                  MaxSectionsPerRecord;
> @@ -734,7 +739,7 @@ typedef struct acpi_hest_ia_corrected
>   {
>       ACPI_HEST_HEADER        Header;
>       UINT16                  Reserved1;
> -    UINT8                   Flags;
> +    UINT8                   Flags;              /* See flags ACPI_HEST_GLOBAL, etc. above */
>       UINT8                   Enabled;
>       UINT32                  RecordsToPreallocate;
>       UINT32                  MaxSectionsPerRecord;
> @@ -899,6 +904,155 @@ typedef struct acpi_hest_generic_data_v300
>   #define ACPI_HEST_GEN_VALID_TIMESTAMP       (1<<2)
>   
>   
> +/* 11: IA32 Deferred Machine Check Exception (ACPI 6.2) */
> +
> +typedef struct acpi_hest_ia_deferred_check
> +{
> +    ACPI_HEST_HEADER        Header;
> +    UINT16                  Reserved1;
> +    UINT8                   Flags;              /* See flags ACPI_HEST_GLOBAL, etc. above */
> +    UINT8                   Enabled;
> +    UINT32                  RecordsToPreallocate;
> +    UINT32                  MaxSectionsPerRecord;
> +    ACPI_HEST_NOTIFY        Notify;
> +    UINT8                   NumHardwareBanks;
> +    UINT8                   Reserved2[3];
> +
> +} ACPI_HEST_IA_DEFERRED_CHECK;
> +
> +
> +/*******************************************************************************
> + *
> + * HMAT - Heterogeneous Memory Attributes Table (ACPI 6.2)
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_hmat
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +    UINT32                  Reserved;
> +
> +} ACPI_TABLE_HMAT;
> +
> +
> +/* Values for HMAT structure types */
> +
> +enum AcpiHmatType
> +{
> +    ACPI_HMAT_TYPE_ADDRESS_RANGE        = 0,   /* Memory subystem address range */
> +    ACPI_HMAT_TYPE_LOCALITY             = 1,   /* System locality latency and bandwidth information */
> +    ACPI_HMAT_TYPE_CACHE                = 2,   /* Memory side cache information */
> +    ACPI_HMAT_TYPE_RESERVED             = 3    /* 3 and greater are reserved */
> +};
> +
> +typedef struct acpi_hmat_structure
> +{
> +    UINT16                  Type;
> +    UINT16                  Reserved;
> +    UINT32                  Length;
> +
> +} ACPI_HMAT_STRUCTURE;
> +
> +
> +/*
> + * HMAT Structures, correspond to Type in ACPI_HMAT_STRUCTURE
> + */
> +
> +/* 0: Memory subystem address range */
> +
> +typedef struct acpi_hmat_address_range
> +{
> +    ACPI_HMAT_STRUCTURE     Header;
> +    UINT16                  Flags;
> +    UINT16                  Reserved1;
> +    UINT32                  ProcessorPD;            /* Processor proximity domain */
> +    UINT32                  MemoryPD;               /* Memory proximity domain */
> +    UINT32                  Reserved2;
> +    UINT64                  PhysicalAddressBase;    /* Physical address range base */
> +    UINT64                  PhysicalAddressLength;  /* Physical address range length */
> +
> +} ACPI_HMAT_ADDRESS_RANGE;
> +
> +/* Masks for Flags field above */
> +
> +#define ACPI_HMAT_PROCESSOR_PD_VALID    (1)     /* 1: ProcessorPD field is valid */
> +#define ACPI_HMAT_MEMORY_PD_VALID       (1<<1)  /* 1: MemoryPD field is valid */
> +#define ACPI_HMAT_RESERVATION_HINT      (1<<2)  /* 1: Reservation hint */
> +
> +
> +/* 1: System locality latency and bandwidth information */
> +
> +typedef struct acpi_hmat_locality
> +{
> +    ACPI_HMAT_STRUCTURE     Header;
> +    UINT8                   Flags;
> +    UINT8                   DataType;
> +    UINT16                  Reserved1;
> +    UINT32                  NumberOfInitiatorPDs;
> +    UINT32                  NumberOfTargetPDs;
> +    UINT32                  Reserved2;
> +    UINT64                  EntryBaseUnit;
> +
> +} ACPI_HMAT_LOCALITY;
> +
> +/* Masks for Flags field above */
> +
> +#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)
> +
> +/* Values for Memory Hierarchy flag */
> +
> +#define ACPI_HMAT_MEMORY            0
> +#define ACPI_HMAT_LAST_LEVEL_CACHE  1
> +#define ACPI_HMAT_1ST_LEVEL_CACHE   2
> +#define ACPI_HMAT_2ND_LEVEL_CACHE   3
> +#define ACPI_HMAT_3RD_LEVEL_CACHE   4
> +
> +/* Values for DataType field above */
> +
> +#define ACPI_HMAT_ACCESS_LATENCY    0
> +#define ACPI_HMAT_READ_LATENCY      1
> +#define ACPI_HMAT_WRITE_LATENCY     2
> +#define ACPI_HMAT_ACCESS_BANDWIDTH  3
> +#define ACPI_HMAT_READ_BANDWIDTH    4
> +#define ACPI_HMAT_WRITE_BANDWIDTH   5
> +
> +
> +/* 2: Memory side cache information */
> +
> +typedef struct acpi_hmat_cache
> +{
> +    ACPI_HMAT_STRUCTURE     Header;
> +    UINT32                  MemoryPD;
> +    UINT32                  Reserved1;
> +    UINT64                  CacheSize;
> +    UINT32                  CacheAttributes;
> +    UINT16                  Reserved2;
> +    UINT16                  NumberOfSMBIOSHandles;
> +
> +} ACPI_HMAT_CACHE;
> +
> +/* Masks for CacheAttributes field above */
> +
> +#define ACPI_HMAT_TOTAL_CACHE_LEVEL     (0x0000000F)
> +#define ACPI_HMAT_CACHE_LEVEL           (0x000000F0)
> +#define ACPI_HMAT_CACHE_ASSOCIATIVITY   (0x00000F00)
> +#define ACPI_HMAT_WRITE_POLICY          (0x0000F000)
> +#define ACPI_HMAT_CACHE_LINE_SIZE       (0xFFFF0000)
> +
> +/* Values for cache associativity flag */
> +
> +#define ACPI_HMAT_CA_NONE                     (0)
> +#define ACPI_HMAT_CA_DIRECT_MAPPED            (1)
> +#define ACPI_HMAT_CA_COMPLEX_CACHE_INDEXING   (2)
> +
> +/* Values for write policy flag */
> +
> +#define ACPI_HMAT_CP_NONE   (0)
> +#define ACPI_HMAT_CP_WB     (1)
> +#define ACPI_HMAT_CP_WT     (2)
> +
> +
>   /*******************************************************************************
>    *
>    * MADT - Multiple APIC Description Table
> @@ -920,8 +1074,8 @@ typedef struct acpi_table_madt
>   
>   /* Values for PCATCompat flag */
>   
> -#define ACPI_MADT_DUAL_PIC          0
> -#define ACPI_MADT_MULTIPLE_APIC     1
> +#define ACPI_MADT_DUAL_PIC          1
> +#define ACPI_MADT_MULTIPLE_APIC     0
>   
>   
>   /* Values for MADT subtable type in ACPI_SUBTABLE_HEADER */
> @@ -1448,6 +1602,95 @@ typedef struct acpi_nfit_flush_address
>   
>   /*******************************************************************************
>    *
> + * PPTT - Processor Properties Topology Table (ACPI 6.2)
> + *        Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_pptt
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +
> +} ACPI_TABLE_PPTT;
> +
> +/* Values for Type field above */
> +
> +enum AcpiPpttType
> +{
> +    ACPI_PPTT_TYPE_PROCESSOR            = 0,
> +    ACPI_PPTT_TYPE_CACHE                = 1,
> +    ACPI_PPTT_TYPE_ID                   = 2,
> +    ACPI_PPTT_TYPE_RESERVED             = 3
> +};
> +
> +
> +/* 0: Processor Hierarchy Node Structure */
> +
> +typedef struct acpi_pptt_processor {
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  Reserved;
> +    UINT32                  Flags;
> +    UINT32                  Parent;
> +    UINT32                  AcpiProcessorId;
> +    UINT32                  NumberOfPrivResources;
> +
> +} ACPI_PPTT_PROCESSOR;
> +
> +/* Flags */
> +
> +#define ACPI_PPTT_PHYSICAL_PACKAGE          (1)     /* Physical package */
> +#define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID   (2)     /* ACPI Processor ID valid */
> +
> +
> +/* 1: Cache Type Structure */
> +
> +typedef struct acpi_pptt_cache {
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  Reserved;
> +    UINT32                  Flags;
> +    UINT32                  NextLevelOfCache;
> +    UINT32                  Size;
> +    UINT32                  NumberOfSets;
> +    UINT8                   Associativity;
> +    UINT8                   Attributes;
> +    UINT16                  LineSize;
> +
> +} ACPI_PPTT_CACHE;
> +
> +/* Flags */
> +
> +#define ACPI_PPTT_SIZE_PROPERTY_VALID       (1)     /* Physical property valid */
> +#define ACPI_PPTT_NUMBER_OF_SETS_VALID      (1<<1)  /* Number of sets valid */
> +#define ACPI_PPTT_ASSOCIATIVITY_VALID       (1<<2)  /* Associativity valid */
> +#define ACPI_PPTT_ALLOCATION_TYPE_VALID     (1<<3)  /* Allocation type valid */
> +#define ACPI_PPTT_CACHE_TYPE_VALID          (1<<4)  /* Cache type valid */
> +#define ACPI_PPTT_WRITE_POLICY_VALID        (1<<5)  /* Write policy valid */
> +#define ACPI_PPTT_LINE_SIZE_VALID           (1<<6)  /* Line size valid */
> +
> +/* Masks for Attributes */
> +
> +#define ACPI_PPTT_MASK_ALLOCATION_TYPE      (0x03)  /* Allocation type */
> +#define ACPI_PPTT_MASK_CACHE_TYPE           (0x0C)  /* Cache type */
> +#define ACPI_PPTT_MASK_WRITE_POLICY         (0x10)  /* Write policy */
> +
> +
> +/* 2: ID Structure */
> +
> +typedef struct acpi_pptt_id {
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT16                  Reserved;
> +    UINT32                  VendorId;
> +    UINT64                  Level1Id;
> +    UINT64                  Level2Id;
> +    UINT16                  MajorRev;
> +    UINT16                  MinorRev;
> +    UINT16                  SpinRev;
> +
> +} ACPI_PPTT_ID;
> +
> +
> +/*******************************************************************************
> + *
>    * SBST - Smart Battery Specification Table
>    *        Version 1
>    *
> @@ -1502,7 +1745,8 @@ enum AcpiSratType
>       ACPI_SRAT_TYPE_MEMORY_AFFINITY      = 1,
>       ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY  = 2,
>       ACPI_SRAT_TYPE_GICC_AFFINITY        = 3,
> -    ACPI_SRAT_TYPE_RESERVED             = 4     /* 4 and greater are reserved */
> +    ACPI_SRAT_TYPE_GIC_ITS_AFFINITY     = 4,    /* ACPI 6.2 */
> +    ACPI_SRAT_TYPE_RESERVED             = 5     /* 5 and greater are reserved */
>   };
>   
>   /*
> @@ -1586,6 +1830,18 @@ typedef struct acpi_srat_gicc_affinity
>   #define ACPI_SRAT_GICC_ENABLED     (1)         /* 00: Use affinity structure */
>   
>   
> +/* 4: GCC ITS Affinity (ACPI 6.2) */
> +
> +typedef struct acpi_srat_gic_its_affinity
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT32                  ProximityDomain;
> +    UINT16                  Reserved;
> +    UINT32                  ItsId;
> +
> +} ACPI_SRAT_GIC_ITS_AFFINITY;
> +
> +
>   /* Reset to default packing */
>   
>   #pragma pack()
> diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
> index 4655b1b4..80495d8f 100644
> --- a/src/acpica/source/include/actbl2.h
> +++ b/src/acpica/source/include/actbl2.h
> @@ -197,6 +197,7 @@
>   #define ACPI_SIG_WDAT           "WDAT"      /* Watchdog Action Table */
>   #define ACPI_SIG_WDDT           "WDDT"      /* Watchdog Timer Description Table */
>   #define ACPI_SIG_WDRT           "WDRT"      /* Watchdog Resource Table */
> +#define ACPI_SIG_WSMT           "WSMT"      /* Windows SMM Security Migrations Table */
>   #define ACPI_SIG_XXXX           "XXXX"      /* Intermediate AML header for ASL/ASL+ converter */
>   
>   #ifdef ACPI_UNDEFINED_TABLES
> @@ -1521,7 +1522,8 @@ enum AcpiSpmiInterfaceTypes
>    *        Version 2
>    *
>    * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
> - * December 19, 2014
> + * Version 1.2, Revision 8
> + * February 27, 2017
>    *
>    * NOTE: There are two versions of the table with the same signature --
>    * the client version and the server version. The common PlatformClass
> @@ -1592,7 +1594,8 @@ typedef struct acpi_table_tcpa_server
>    *        Version 4
>    *
>    * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
> - * December 19, 2014
> + * Version 1.2, Revision 8
> + * February 27, 2017
>    *
>    ******************************************************************************/
>   
> @@ -1615,6 +1618,42 @@ typedef struct acpi_table_tpm2
>   #define ACPI_TPM2_MEMORY_MAPPED                     6
>   #define ACPI_TPM2_COMMAND_BUFFER                    7
>   #define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD  8
> +#define ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC       11  /* V1.2 Rev 8 */
> +
> +
> +/* Trailer appears after any StartMethod subtables */
> +
> +typedef struct acpi_tpm2_trailer
> +{
> +    UINT32                  MinimumLogLength;   /* Minimum length for the event log area */
> +    UINT64                  LogAddress;         /* Address of the event log area */
> +
> +} ACPI_TPM2_TRAILER;
> +
> +
> +/*
> + * Subtables (StartMethod-specific)
> + */
> +
> +/* 11: Start Method for ARM SMC (V1.2 Rev 8) */
> +
> +typedef struct acpi_tpm2_arm_smc
> +{
> +    UINT32                  GlobalInterrupt;
> +    UINT8                   InterruptFlags;
> +    UINT8                   OperationFlags;
> +    UINT16                  Reserved;
> +    UINT32                  FunctionId;
> +
> +} ACPI_TPM2_ARM_SMC;
> +
> +/* Values for InterruptFlags above */
> +
> +#define ACPI_TPM2_INTERRUPT_SUPPORT     (1)
> +
> +/* Values for OperationFlags above */
> +
> +#define ACPI_TPM2_IDLE_SUPPORT          (1)
>   
>   
>   /*******************************************************************************
> @@ -1834,6 +1873,30 @@ typedef struct acpi_table_wdrt
>   } ACPI_TABLE_WDRT;
>   
>   
> +/*******************************************************************************
> + *
> + * WSMT - Windows SMM Security Migrations Table
> + *        Version 1
> + *
> + * Conforms to "Windows SMM Security Migrations Table",
> + * Version 1.0, April 18, 2016
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_wsmt
> +{
> +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
> +    UINT32                  ProtectionFlags;
> +
> +} ACPI_TABLE_WSMT;
> +
> +/* Flags for ProtectionFlags field above */
> +
> +#define ACPI_WSMT_FIXED_COMM_BUFFERS                (1)
> +#define ACPI_WSMT_COMM_BUFFER_NESTED_PTR_PROTECTION (2)
> +#define ACPI_WSMT_SYSTEM_RESOURCE_PROTECTION        (4)
> +
> +
>   /* Reset to default packing */
>   
>   #pragma pack()
> diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h
> index cb9910d7..80b6ae1c 100644
> --- a/src/acpica/source/include/actbl3.h
> +++ b/src/acpica/source/include/actbl3.h
> @@ -229,6 +229,11 @@ typedef struct acpi_table_bgrt
>   
>   } ACPI_TABLE_BGRT;
>   
> +/* Flags for Status field above */
> +
> +#define ACPI_BGRT_DISPLAYED                 (1)
> +#define ACPI_BGRT_ORIENTATION_OFFSET        (3 << 1)
> +
>   
>   /*******************************************************************************
>    *
> @@ -651,7 +656,7 @@ typedef struct acpi_mpst_shared
>   /*******************************************************************************
>    *
>    * PCCT - Platform Communications Channel Table (ACPI 5.0)
> - *        Version 1
> + *        Version 2 (ACPI 6.2)
>    *
>    ******************************************************************************/
>   
> @@ -674,7 +679,9 @@ enum AcpiPcctType
>       ACPI_PCCT_TYPE_GENERIC_SUBSPACE             = 0,
>       ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE          = 1,
>       ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2    = 2,    /* ACPI 6.1 */
> -    ACPI_PCCT_TYPE_RESERVED                     = 3     /* 3 and greater are reserved */
> +    ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE      = 3,    /* ACPI 6.2 */
> +    ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE       = 4,    /* ACPI 6.2 */
> +    ACPI_PCCT_TYPE_RESERVED                     = 5     /* 5 and greater are reserved */
>   };
>   
>   /*
> @@ -704,7 +711,7 @@ typedef struct acpi_pcct_subspace
>   typedef struct acpi_pcct_hw_reduced
>   {
>       ACPI_SUBTABLE_HEADER    Header;
> -    UINT32                  DoorbellInterrupt;
> +    UINT32                  PlatformInterrupt;
>       UINT8                   Flags;
>       UINT8                   Reserved;
>       UINT64                  BaseAddress;
> @@ -724,7 +731,7 @@ typedef struct acpi_pcct_hw_reduced
>   typedef struct acpi_pcct_hw_reduced_type2
>   {
>       ACPI_SUBTABLE_HEADER    Header;
> -    UINT32                  DoorbellInterrupt;
> +    UINT32                  PlatformInterrupt;
>       UINT8                   Flags;
>       UINT8                   Reserved;
>       UINT64                  BaseAddress;
> @@ -735,13 +742,75 @@ typedef struct acpi_pcct_hw_reduced_type2
>       UINT32                  Latency;
>       UINT32                  MaxAccessRate;
>       UINT16                  MinTurnaroundTime;
> -    ACPI_GENERIC_ADDRESS    DoorbellAckRegister;
> +    ACPI_GENERIC_ADDRESS    PlatformAckRegister;
>       UINT64                  AckPreserveMask;
>       UINT64                  AckWriteMask;
>   
>   } ACPI_PCCT_HW_REDUCED_TYPE2;
>   
>   
> +/* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */
> +
> +typedef struct acpi_pcct_ext_pcc_master
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT32                  PlatformInterrupt;
> +    UINT8                   Flags;
> +    UINT8                   Reserved1;
> +    UINT64                  BaseAddress;
> +    UINT32                  Length;
> +    ACPI_GENERIC_ADDRESS    DoorbellRegister;
> +    UINT64                  PreserveMask;
> +    UINT64                  WriteMask;
> +    UINT32                  Latency;
> +    UINT32                  MaxAccessRate;
> +    UINT32                  MinTurnaroundTime;
> +    ACPI_GENERIC_ADDRESS    PlatformAckRegister;
> +    UINT64                  AckPreserveMask;
> +    UINT64                  AckSetMask;
> +    UINT64                  Reserved2;
> +    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
> +    UINT64                  CmdCompleteMask;
> +    ACPI_GENERIC_ADDRESS    CmdUpdateRegister;
> +    UINT64                  CmdUpdatePreserveMask;
> +    UINT64                  CmdUpdateSetMask;
> +    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
> +    UINT64                  ErrorStatusMask;
> +
> +} ACPI_PCCT_EXT_PCC_MASTER;
> +
> +
> +/* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */
> +
> +typedef struct acpi_pcct_ext_pcc_slave
> +{
> +    ACPI_SUBTABLE_HEADER    Header;
> +    UINT32                  PlatformInterrupt;
> +    UINT8                   Flags;
> +    UINT8                   Reserved1;
> +    UINT64                  BaseAddress;
> +    UINT32                  Length;
> +    ACPI_GENERIC_ADDRESS    DoorbellRegister;
> +    UINT64                  PreserveMask;
> +    UINT64                  WriteMask;
> +    UINT32                  Latency;
> +    UINT32                  MaxAccessRate;
> +    UINT32                  MinTurnaroundTime;
> +    ACPI_GENERIC_ADDRESS    PlatformAckRegister;
> +    UINT64                  AckPreserveMask;
> +    UINT64                  AckSetMask;
> +    UINT64                  Reserved2;
> +    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
> +    UINT64                  CmdCompleteMask;
> +    ACPI_GENERIC_ADDRESS    CmdUpdateRegister;
> +    UINT64                  CmdUpdatePreserveMask;
> +    UINT64                  CmdUpdateSetMask;
> +    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
> +    UINT64                  ErrorStatusMask;
> +
> +} ACPI_PCCT_EXT_PCC_SLAVE;
> +
> +
>   /* Values for doorbell flags above */
>   
>   #define ACPI_PCCT_INTERRUPT_POLARITY    (1)
> @@ -763,6 +832,18 @@ typedef struct acpi_pcct_shared_memory
>   } ACPI_PCCT_SHARED_MEMORY;
>   
>   
> +/* Extended PCC Subspace Shared Memory Region (ACPI 6.2) */
> +
> +typedef struct acpi_pcct_ext_pcc_shared_memory
> +{
> +    UINT32                  Signature;
> +    UINT32                  Flags;
> +    UINT32                  Length;
> +    UINT32                  Command;
> +
> +} ACPI_PCCT_EXT_PCC_SHARED_MEMORY;
> +
> +
>   /*******************************************************************************
>    *
>    * PMTT - Platform Memory Topology Table (ACPI 5.0)
> diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
> index 787ceeea..843adec7 100644
> --- a/src/acpica/source/include/actypes.h
> +++ b/src/acpica/source/include/actypes.h
> @@ -155,9 +155,9 @@
>   /* acpisrc:StructDefs -- for acpisrc conversion */
>   
>   /*
> - * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent header
> - * and must be either 32 or 64. 16-bit ACPICA is no longer supported, as of
> - * 12/2006.
> + * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent
> + * header and must be either 32 or 64. 16-bit ACPICA is no longer
> + * supported, as of 12/2006.
>    */
>   #ifndef ACPI_MACHINE_WIDTH
>   #error ACPI_MACHINE_WIDTH not defined
> @@ -196,9 +196,9 @@
>    * INT64        64-bit (8 byte) signed value
>    *
>    * COMPILER_DEPENDENT_UINT64/INT64 - These types are defined in the
> - * compiler-dependent header(s) and were introduced because there is no common
> - * 64-bit integer type across the various compilation models, as shown in
> - * the table below.
> + * compiler-dependent header(s) and were introduced because there is no
> + * common 64-bit integer type across the various compilation models, as
> + * shown in the table below.
>    *
>    * Datatype  LP64 ILP64 LLP64 ILP32 LP32 16bit
>    * char      8    8     8     8     8    8
> @@ -215,10 +215,10 @@
>    * 2) These types represent the native word size of the target mode of the
>    * processor, and may be 16-bit, 32-bit, or 64-bit as required. They are
>    * usually used for memory allocation, efficient loop counters, and array
> - * indexes. The types are similar to the size_t type in the C library and are
> - * required because there is no C type that consistently represents the native
> - * data width. ACPI_SIZE is needed because there is no guarantee that a
> - * kernel-level C library is present.
> + * indexes. The types are similar to the size_t type in the C library and
> + * are required because there is no C type that consistently represents the
> + * native data width. ACPI_SIZE is needed because there is no guarantee
> + * that a kernel-level C library is present.
>    *
>    * ACPI_SIZE        16/32/64-bit unsigned value
>    * ACPI_NATIVE_INT  16/32/64-bit signed value
> @@ -279,9 +279,10 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
>   
>   /*
>    * In the case of the Itanium Processor Family (IPF), the hardware does not
> - * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED flag
> - * to indicate that special precautions must be taken to avoid alignment faults.
> - * (IA64 or ia64 is currently used by existing compilers to indicate IPF.)
> + * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED
> + * flag to indicate that special precautions must be taken to avoid alignment
> + * faults. (IA64 or ia64 is currently used by existing compilers to indicate
> + * IPF.)
>    *
>    * Note: EM64T and other X86-64 processors support misaligned transfers,
>    * so there is no need to define this flag.
> @@ -422,8 +423,8 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
>   #endif
>   
>   /*
> - * Some compilers complain about unused variables. Sometimes we don't want to
> - * use all the variables (for example, _AcpiModuleName). This allows us
> + * Some compilers complain about unused variables. Sometimes we don't want
> + * to use all the variables (for example, _AcpiModuleName). This allows us
>    * to tell the compiler in a per-variable manner that a variable
>    * is unused
>    */
> @@ -432,8 +433,9 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
>   #endif
>   
>   /*
> - * All ACPICA external functions that are available to the rest of the kernel
> - * are tagged with thes macros which can be defined as appropriate for the host.
> + * All ACPICA external functions that are available to the rest of the
> + * kernel are tagged with these macros which can be defined as appropriate
> + * for the host.
>    *
>    * Notes:
>    * ACPI_EXPORT_SYMBOL_INIT is used for initialization and termination
> @@ -498,7 +500,8 @@ typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
>   
>   /******************************************************************************
>    *
> - * ACPI Specification constants (Do not change unless the specification changes)
> + * ACPI Specification constants (Do not change unless the specification
> + * changes)
>    *
>    *****************************************************************************/
>   
> @@ -604,10 +607,10 @@ typedef UINT8                           ACPI_OWNER_ID;
>   #define ACPI_DO_NOT_WAIT                0
>   
>   /*
> - * Obsolete: Acpi integer width. In ACPI version 1 (1996), integers are 32 bits.
> - * In ACPI version 2 (2000) and later, integers are 64 bits. Note that this
> - * pertains to the ACPI integer type only, not to other integers used in the
> - * implementation of the ACPICA subsystem.
> + * Obsolete: Acpi integer width. In ACPI version 1 (1996), integers are
> + * 32 bits. In ACPI version 2 (2000) and later, integers are max 64 bits.
> + * Note that this pertains to the ACPI integer type only, not to other
> + * integers used in the implementation of the ACPICA subsystem.
>    *
>    * 01/2010: This type is obsolete and has been removed from the entire ACPICA
>    * code base. It remains here for compatibility with device drivers that use
> @@ -749,8 +752,9 @@ typedef UINT64                          ACPI_INTEGER;
>   #define ACPI_NOTIFY_LOCALITY_UPDATE     (UINT8) 0x0B
>   #define ACPI_NOTIFY_SHUTDOWN_REQUEST    (UINT8) 0x0C
>   #define ACPI_NOTIFY_AFFINITY_UPDATE     (UINT8) 0x0D
> +#define ACPI_NOTIFY_MEMORY_UPDATE       (UINT8) 0x0E
>   
> -#define ACPI_GENERIC_NOTIFY_MAX         0x0D
> +#define ACPI_GENERIC_NOTIFY_MAX         0x0E
>   #define ACPI_SPECIFIC_NOTIFY_MAX        0x84
>   
>   /*
> @@ -787,10 +791,11 @@ typedef UINT32                          ACPI_OBJECT_TYPE;
>   
>   /*
>    * These are object types that do not map directly to the ACPI
> - * ObjectType() operator. They are used for various internal purposes only.
> - * If new predefined ACPI_TYPEs are added (via the ACPI specification), these
> - * internal types must move upwards. (There is code that depends on these
> - * values being contiguous with the external types above.)
> + * ObjectType() operator. They are used for various internal purposes
> + * only. If new predefined ACPI_TYPEs are added (via the ACPI
> + * specification), these internal types must move upwards. (There
> + * is code that depends on these values being contiguous with the
> + * external types above.)
>    */
>   #define ACPI_TYPE_LOCAL_REGION_FIELD    0x11
>   #define ACPI_TYPE_LOCAL_BANK_FIELD      0x12
> @@ -891,7 +896,7 @@ typedef UINT32                          ACPI_EVENT_STATUS;
>    *   |  | | |  +-- Type of dispatch:to method, handler, notify, or none
>    *   |  | | +----- Interrupt type: edge or level triggered
>    *   |  | +------- Is a Wake GPE
> - *   |  +--------- Is GPE masked by the software GPE masking machanism
> + *   |  +--------- Is GPE masked by the software GPE masking mechanism
>    *   +------------ <Reserved>
>    */
>   #define ACPI_GPE_DISPATCH_NONE          (UINT8) 0x00
> @@ -1037,8 +1042,8 @@ typedef struct acpi_sleep_functions
>    */
>   
>   /*
> - * Note: Type == ACPI_TYPE_ANY (0) is used to indicate a NULL package element
> - * or an unresolved named reference.
> + * Note: Type == ACPI_TYPE_ANY (0) is used to indicate a NULL package
> + * element or an unresolved named reference.
>    */
>   typedef union acpi_object
>   {
> @@ -1361,7 +1366,7 @@ typedef struct acpi_pnp_device_id_list
>   
>   /*
>    * Structure returned from AcpiGetObjectInfo.
> - * Optimized for both 32- and 64-bit builds
> + * Optimized for both 32-bit and 64-bit builds.
>    */
>   typedef struct acpi_device_info
>   {
> diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
> index 30ce8257..46588a40 100644
> --- a/src/acpica/source/include/acutils.h
> +++ b/src/acpica/source/include/acutils.h
> @@ -194,6 +194,7 @@ extern const char                       *AcpiGbl_BpbDecode[];
>   extern const char                       *AcpiGbl_SbDecode[];
>   extern const char                       *AcpiGbl_FcDecode[];
>   extern const char                       *AcpiGbl_PtDecode[];
> +extern const char                       *AcpiGbl_PtypDecode[];
>   #endif
>   
>   /*
> diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h
> index 407fcb67..ff0f0126 100644
> --- a/src/acpica/source/include/acuuid.h
> +++ b/src/acpica/source/include/acuuid.h
> @@ -186,6 +186,11 @@
>   #define UUID_PERSISTENT_VIRTUAL_DISK    "5cea02c9-4d07-69d3-269f-4496fbe096f9"
>   #define UUID_PERSISTENT_VIRTUAL_CD      "08018188-42cd-bb48-100f-5387d53ded3d"
>   
> +/* Processor Properties (ACPI 6.2) */
> +
> +#define UUID_CACHE_PROPERTIES           "6DC63E77-257E-4E78-A973-A21F2796898D"
> +#define UUID_PHYSICAL_PROPERTY          "DDE4D59A-AA42-4349-B407-EA40F57D9FB7"
> +
>   /* Miscellaneous */
>   
>   #define UUID_PLATFORM_CAPABILITIES      "0811b06e-4a27-44f9-8d60-3cbbc22e7b48"
> diff --git a/src/acpica/source/include/amlcode.h b/src/acpica/source/include/amlcode.h
> index 4576c7d9..9236eedb 100644
> --- a/src/acpica/source/include/amlcode.h
> +++ b/src/acpica/source/include/amlcode.h
> @@ -427,6 +427,11 @@
>    *      #A is the number of required arguments
>    *      #T is the number of target operands
>    *      #R indicates whether there is a return value
> + *
> + * These types are used for the top-level dispatch of the AML
> + * opcode. They group similar operators that can share common
> + * front-end code before dispatch to the final code that implements
> + * the operator.
>    */
>   
>   /*
> @@ -468,42 +473,42 @@
>    * The opcode Type is used in a dispatch table, do not change
>    * or add anything new without updating the table.
>    */
> -#define AML_TYPE_EXEC_0A_0T_1R      0x00
> -#define AML_TYPE_EXEC_1A_0T_0R      0x01 /* Monadic1  */
> -#define AML_TYPE_EXEC_1A_0T_1R      0x02 /* Monadic2  */
> -#define AML_TYPE_EXEC_1A_1T_0R      0x03
> -#define AML_TYPE_EXEC_1A_1T_1R      0x04 /* Monadic2R */
> -#define AML_TYPE_EXEC_2A_0T_0R      0x05 /* Dyadic1   */
> -#define AML_TYPE_EXEC_2A_0T_1R      0x06 /* Dyadic2   */
> -#define AML_TYPE_EXEC_2A_1T_1R      0x07 /* Dyadic2R  */
> -#define AML_TYPE_EXEC_2A_2T_1R      0x08
> -#define AML_TYPE_EXEC_3A_0T_0R      0x09
> -#define AML_TYPE_EXEC_3A_1T_1R      0x0A
> -#define AML_TYPE_EXEC_6A_0T_1R      0x0B
> +#define AML_TYPE_EXEC_0A_0T_1R      0x00 /* 0 Args, 0 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_1A_0T_0R      0x01 /* 1 Args, 0 Target, 0 RetVal */
> +#define AML_TYPE_EXEC_1A_0T_1R      0x02 /* 1 Args, 0 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_1A_1T_0R      0x03 /* 1 Args, 1 Target, 0 RetVal */
> +#define AML_TYPE_EXEC_1A_1T_1R      0x04 /* 1 Args, 1 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_2A_0T_0R      0x05 /* 2 Args, 0 Target, 0 RetVal */
> +#define AML_TYPE_EXEC_2A_0T_1R      0x06 /* 2 Args, 0 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_2A_1T_1R      0x07 /* 2 Args, 1 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_2A_2T_1R      0x08 /* 2 Args, 2 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_3A_0T_0R      0x09 /* 3 Args, 0 Target, 0 RetVal */
> +#define AML_TYPE_EXEC_3A_1T_1R      0x0A /* 3 Args, 1 Target, 1 RetVal */
> +#define AML_TYPE_EXEC_6A_0T_1R      0x0B /* 6 Args, 0 Target, 1 RetVal */
>   /* End of types used in dispatch table */
>   
> -#define AML_TYPE_LITERAL            0x0B
> -#define AML_TYPE_CONSTANT           0x0C
> -#define AML_TYPE_METHOD_ARGUMENT    0x0D
> -#define AML_TYPE_LOCAL_VARIABLE     0x0E
> -#define AML_TYPE_DATA_TERM          0x0F
> +#define AML_TYPE_LITERAL            0x0C
> +#define AML_TYPE_CONSTANT           0x0D
> +#define AML_TYPE_METHOD_ARGUMENT    0x0E
> +#define AML_TYPE_LOCAL_VARIABLE     0x0F
> +#define AML_TYPE_DATA_TERM          0x10
>   
>   /* Generic for an op that returns a value */
>   
> -#define AML_TYPE_METHOD_CALL        0x10
> +#define AML_TYPE_METHOD_CALL        0x11
>   
>   /* Miscellaneous types */
>   
> -#define AML_TYPE_CREATE_FIELD       0x11
> -#define AML_TYPE_CREATE_OBJECT      0x12
> -#define AML_TYPE_CONTROL            0x13
> -#define AML_TYPE_NAMED_NO_OBJ       0x14
> -#define AML_TYPE_NAMED_FIELD        0x15
> -#define AML_TYPE_NAMED_SIMPLE       0x16
> -#define AML_TYPE_NAMED_COMPLEX      0x17
> -#define AML_TYPE_RETURN             0x18
> -#define AML_TYPE_UNDEFINED          0x19
> -#define AML_TYPE_BOGUS              0x1A
> +#define AML_TYPE_CREATE_FIELD       0x12
> +#define AML_TYPE_CREATE_OBJECT      0x13
> +#define AML_TYPE_CONTROL            0x14
> +#define AML_TYPE_NAMED_NO_OBJ       0x15
> +#define AML_TYPE_NAMED_FIELD        0x16
> +#define AML_TYPE_NAMED_SIMPLE       0x17
> +#define AML_TYPE_NAMED_COMPLEX      0x18
> +#define AML_TYPE_RETURN             0x19
> +#define AML_TYPE_UNDEFINED          0x1A
> +#define AML_TYPE_BOGUS              0x1B
>   
>   /* AML Package Length encodings */
>   
> diff --git a/src/acpica/source/include/amlresrc.h b/src/acpica/source/include/amlresrc.h
> index aee0a052..5f0bcc4b 100644
> --- a/src/acpica/source/include/amlresrc.h
> +++ b/src/acpica/source/include/amlresrc.h
> @@ -174,6 +174,7 @@
>   #define ACPI_RESTAG_DRIVESTRENGTH               "_DRS"
>   #define ACPI_RESTAG_ENDIANNESS                  "_END"
>   #define ACPI_RESTAG_FLOWCONTROL                 "_FLC"
> +#define ACPI_RESTAG_FUNCTION                    "_FUN"
>   #define ACPI_RESTAG_GRANULARITY                 "_GRA"
>   #define ACPI_RESTAG_INTERRUPT                   "_INT"
>   #define ACPI_RESTAG_INTERRUPTLEVEL              "_LL_"  /* ActiveLo(1), ActiveHi(0) */
> @@ -193,6 +194,8 @@
>   #define ACPI_RESTAG_PHASE                       "_PHA"
>   #define ACPI_RESTAG_PIN                         "_PIN"
>   #define ACPI_RESTAG_PINCONFIG                   "_PPI"
> +#define ACPI_RESTAG_PINCONFIG_TYPE              "_TYP"
> +#define ACPI_RESTAG_PINCONFIG_VALUE             "_VAL"
>   #define ACPI_RESTAG_POLARITY                    "_POL"
>   #define ACPI_RESTAG_REGISTERBITOFFSET           "_RBO"
>   #define ACPI_RESTAG_REGISTERBITWIDTH            "_RBW"
> @@ -636,6 +639,116 @@ typedef struct aml_resource_uart_serialbus
>   #define AML_RESOURCE_UART_TYPE_REVISION         1       /* ACPI 5.0 */
>   #define AML_RESOURCE_UART_MIN_DATA_LEN          10
>   
> +typedef struct aml_resource_pin_function
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    UINT8                           RevisionId;
> +    UINT16                          Flags;
> +    UINT8                           PinConfig;
> +    UINT16                          FunctionNumber;
> +    UINT16                          PinTableOffset;
> +    UINT8                           ResSourceIndex;
> +    UINT16                          ResSourceOffset;
> +    UINT16                          VendorOffset;
> +    UINT16                          VendorLength;
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) PIN list (Words)
> +     * 2) Resource Source String
> +     * 3) Vendor Data bytes
> +     */
> +
> +} AML_RESOURCE_PIN_FUNCTION;
> +
> +#define AML_RESOURCE_PIN_FUNCTION_REVISION      1       /* ACPI 6.2 */
> +
> +typedef struct aml_resource_pin_config
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    UINT8                           RevisionId;
> +    UINT16                          Flags;
> +    UINT8                           PinConfigType;
> +    UINT32                          PinConfigValue;
> +    UINT16                          PinTableOffset;
> +    UINT8                           ResSourceIndex;
> +    UINT16                          ResSourceOffset;
> +    UINT16                          VendorOffset;
> +    UINT16                          VendorLength;
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) PIN list (Words)
> +     * 2) Resource Source String
> +     * 3) Vendor Data bytes
> +     */
> +
> +} AML_RESOURCE_PIN_CONFIG;
> +
> +#define AML_RESOURCE_PIN_CONFIG_REVISION      1       /* ACPI 6.2 */
> +
> +typedef struct aml_resource_pin_group
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    UINT8                           RevisionId;
> +    UINT16                          Flags;
> +    UINT16                          PinTableOffset;
> +    UINT16                          LabelOffset;
> +    UINT16                          VendorOffset;
> +    UINT16                          VendorLength;
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) PIN list (Words)
> +     * 2) Resource Label String
> +     * 3) Vendor Data bytes
> +     */
> +
> +} AML_RESOURCE_PIN_GROUP;
> +
> +#define AML_RESOURCE_PIN_GROUP_REVISION      1       /* ACPI 6.2 */
> +
> +typedef struct aml_resource_pin_group_function
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    UINT8                           RevisionId;
> +    UINT16                          Flags;
> +    UINT16                          FunctionNumber;
> +    UINT8                           ResSourceIndex;
> +    UINT16                          ResSourceOffset;
> +    UINT16                          ResSourceLabelOffset;
> +    UINT16                          VendorOffset;
> +    UINT16                          VendorLength;
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) Resource Source String
> +     * 2) Resource Source Label String
> +     * 3) Vendor Data bytes
> +     */
> +
> +} AML_RESOURCE_PIN_GROUP_FUNCTION;
> +
> +#define AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION    1       /* ACPI 6.2 */
> +
> +typedef struct aml_resource_pin_group_config
> +{
> +    AML_RESOURCE_LARGE_HEADER_COMMON
> +    UINT8                           RevisionId;
> +    UINT16                          Flags;
> +    UINT8                           PinConfigType;
> +    UINT32                          PinConfigValue;
> +    UINT8                           ResSourceIndex;
> +    UINT16                          ResSourceOffset;
> +    UINT16                          ResSourceLabelOffset;
> +    UINT16                          VendorOffset;
> +    UINT16                          VendorLength;
> +    /*
> +     * Optional fields follow immediately:
> +     * 1) Resource Source String
> +     * 2) Resource Source Label String
> +     * 3) Vendor Data bytes
> +     */
> +
> +} AML_RESOURCE_PIN_GROUP_CONFIG;
> +
> +#define AML_RESOURCE_PIN_GROUP_CONFIG_REVISION    1       /* ACPI 6.2 */
>   
>   /* restore default alignment */
>   
> @@ -680,6 +793,11 @@ typedef union aml_resource
>       AML_RESOURCE_SPI_SERIALBUS              SpiSerialBus;
>       AML_RESOURCE_UART_SERIALBUS             UartSerialBus;
>       AML_RESOURCE_COMMON_SERIALBUS           CommonSerialBus;
> +    AML_RESOURCE_PIN_FUNCTION               PinFunction;
> +    AML_RESOURCE_PIN_CONFIG                 PinConfig;
> +    AML_RESOURCE_PIN_GROUP                  PinGroup;
> +    AML_RESOURCE_PIN_GROUP_FUNCTION         PinGroupFunction;
> +    AML_RESOURCE_PIN_GROUP_CONFIG           PinGroupConfig;
>   
>       /* Utility overlays */
>   
> diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
> index d831cbf7..da719a7d 100644
> --- a/src/acpica/source/include/platform/acgcc.h
> +++ b/src/acpica/source/include/platform/acgcc.h
> @@ -156,7 +156,17 @@
>    * Use compiler specific <stdarg.h> is a good practice for even when
>    * -nostdinc is specified (i.e., ACPI_USE_STANDARD_HEADERS undefined.
>    */
> +#ifndef va_arg
> +#ifdef ACPI_USE_BUILTIN_STDARG
> +typedef __builtin_va_list       va_list;
> +#define va_start(v, l)          __builtin_va_start(v, l)
> +#define va_end(v)               __builtin_va_end(v)
> +#define va_arg(v, l)            __builtin_va_arg(v, l)
> +#define va_copy(d, s)           __builtin_va_copy(d, s)
> +#else
>   #include <stdarg.h>
> +#endif
> +#endif
>   
>   #define ACPI_INLINE             __inline__
>   
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index 53427ffb..73e45e87 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -984,9 +984,9 @@ AcpiOsWaitSemaphore (
>   {
>       ACPI_STATUS         Status = AE_OK;
>       sem_t               *Sem = (sem_t *) Handle;
> +    int                 RetVal;
>   #ifndef ACPI_USE_ALTERNATE_TIMEOUT
>       struct timespec     Time;
> -    int                 RetVal;
>   #endif
>   
>   
> @@ -1016,12 +1016,17 @@ AcpiOsWaitSemaphore (
>   
>       case ACPI_WAIT_FOREVER:
>   
> -        if (sem_wait (Sem))
> +        while (((RetVal = sem_wait (Sem)) == -1) && (errno == EINTR))
> +        {
> +            continue;   /* Restart if interrupted */
> +        }
> +        if (RetVal != 0)
>           {
>               Status = (AE_TIME);
>           }
>           break;
>   
> +
>       /* Wait with MsecTimeout */
>   
>       default:
> @@ -1075,7 +1080,8 @@ AcpiOsWaitSemaphore (
>   
>           while (((RetVal = sem_timedwait (Sem, &Time)) == -1) && (errno == EINTR))
>           {
> -            continue;
> +            continue;   /* Restart if interrupted */
> +
>           }
>   
>           if (RetVal != 0)
> diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
> index c773e96f..b4864610 100644
> --- a/src/acpica/source/tools/acpiexec/aecommon.h
> +++ b/src/acpica/source/tools/acpiexec/aecommon.h
> @@ -204,11 +204,21 @@ extern ACPI_CONNECTION_INFO AeMyContext;
>   #define OSD_PRINT(lvl,fp)               TEST_OUTPUT_LEVEL(lvl) {\
>                                               AcpiOsPrintf PARAM_LIST(fp);}
>   
> +#define AE_PREFIX                       "ACPI Exec: "
> +
>   void ACPI_SYSTEM_XFACE
> -AeCtrlCHandler (
> +AeSignalHandler (
>       int                     Sig);
>   
>   ACPI_STATUS
> +AeExceptionHandler (
> +    ACPI_STATUS             AmlStatus,
> +    ACPI_NAME               Name,
> +    UINT16                  Opcode,
> +    UINT32                  AmlOffset,
> +    void                    *Context);
> +
> +ACPI_STATUS
>   AeBuildLocalTables (
>       ACPI_NEW_TABLE_DESC     *TableList);
>   
> diff --git a/src/acpica/source/tools/acpiexec/aeexception.c b/src/acpica/source/tools/acpiexec/aeexception.c
> new file mode 100644
> index 00000000..a5a3293a
> --- /dev/null
> +++ b/src/acpica/source/tools/acpiexec/aeexception.c
> @@ -0,0 +1,441 @@
> +/******************************************************************************
> + *
> + * Module Name: aeexception - Exception and signal handlers
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * following license:
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Alternatively, you may choose to be licensed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + *****************************************************************************/
> +
> +#include "aecommon.h"
> +
> +#define _COMPONENT          ACPI_TOOLS
> +        ACPI_MODULE_NAME    ("aeexception")
> +
> +
> +/* Local prototypes */
> +
> +static void
> +AeDisplayMethodCallStack (
> +    void);
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AeExceptionHandler
> + *
> + * PARAMETERS:  Standard exception handler parameters
> + *
> + * RETURN:      Status
> + *
> + * DESCRIPTION: System exception handler for AcpiExec utility. Called from
> + *              the core ACPICA code after any exception during method
> + *              execution.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +AeExceptionHandler (
> +    ACPI_STATUS             AmlStatus,
> +    ACPI_NAME               Name,
> +    UINT16                  Opcode,
> +    UINT32                  AmlOffset,
> +    void                    *Context)
> +{
> +    ACPI_STATUS             NewAmlStatus = AmlStatus;
> +    ACPI_STATUS             Status;
> +    ACPI_BUFFER             ReturnObj;
> +    ACPI_OBJECT_LIST        ArgList;
> +    ACPI_OBJECT             Arg[3];
> +    const char              *Exception;
> +    ACPI_HANDLE             ErrHandle;
> +
> +
> +    Exception = AcpiFormatException (AmlStatus);
> +    AcpiOsPrintf (AE_PREFIX
> +        "Exception %s during execution\n", Exception);
> +    if (Name)
> +    {
> +        AcpiOsPrintf (AE_PREFIX
> +            "Evaluating Method or Node: [%4.4s]",
> +            (char *) &Name);
> +    }
> +
> +    AcpiOsPrintf ("\n" AE_PREFIX
> +        "AML Opcode [%s], Method Offset ~%5.5X\n",
> +        AcpiPsGetOpcodeName (Opcode), AmlOffset);
> +
> +    /* Invoke the _ERR method if present */
> +
> +    Status = AcpiGetHandle (NULL, "\\_ERR", &ErrHandle);
> +    if (ACPI_FAILURE (Status))
> +    {
> +        goto Cleanup;
> +    }
> +
> +    /* Setup parameter object */
> +
> +    ArgList.Count = 3;
> +    ArgList.Pointer = Arg;
> +
> +    Arg[0].Type = ACPI_TYPE_INTEGER;
> +    Arg[0].Integer.Value = AmlStatus;
> +
> +    Arg[1].Type = ACPI_TYPE_STRING;
> +    Arg[1].String.Pointer = ACPI_CAST_PTR (char, Exception);
> +    Arg[1].String.Length = strlen (Exception);
> +
> +    Arg[2].Type = ACPI_TYPE_INTEGER;
> +    Arg[2].Integer.Value = AcpiOsGetThreadId();
> +
> +    /* Setup return buffer */
> +
> +    ReturnObj.Pointer = NULL;
> +    ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
> +
> +    Status = AcpiEvaluateObject (ErrHandle, NULL, &ArgList, &ReturnObj);
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        if (ReturnObj.Pointer)
> +        {
> +            /* Override original status */
> +
> +            NewAmlStatus = (ACPI_STATUS)
> +                ((ACPI_OBJECT *) ReturnObj.Pointer)->Integer.Value;
> +
> +            /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
> +
> +            AcpiOsFree (ReturnObj.Pointer);
> +        }
> +    }
> +    else if (Status != AE_NOT_FOUND)
> +    {
> +        AcpiOsPrintf (AE_PREFIX
> +            "Could not execute _ERR method, %s\n",
> +            AcpiFormatException (Status));
> +    }
> +
> +Cleanup:
> +
> +    /* Global overrides */
> +
> +    if (AcpiGbl_IgnoreErrors)
> +    {
> +        NewAmlStatus = AE_OK;
> +    }
> +    else if (AmlStatus == AE_AML_INTERNAL)
> +    {
> +        NewAmlStatus = AE_AML_INTERNAL;
> +        AcpiOsPrintf (AE_PREFIX
> +            "Cannot override status %s\n\n",
> +            AcpiFormatException (NewAmlStatus));
> +    }
> +    else if (NewAmlStatus != AmlStatus)
> +    {
> +        AcpiOsPrintf (AE_PREFIX
> +            "Exception override, new status %s\n\n",
> +            AcpiFormatException (NewAmlStatus));
> +    }
> +
> +    return (NewAmlStatus);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AeSignalHandler
> + *
> + * PARAMETERS:  Sig
> + *
> + * RETURN:      none
> + *
> + * DESCRIPTION: Master signal handler. Currently handles SIGINT (ctrl-c),
> + *              and SIGSEGV (Segment violation).
> + *
> + *****************************************************************************/
> +
> +void ACPI_SYSTEM_XFACE
> +AeSignalHandler (
> +    int                     Sig)
> +{
> +
> +    fflush(stdout);
> +    AcpiOsPrintf ("\n" AE_PREFIX);
> +
> +    switch (Sig)
> +    {
> +    case SIGINT:
> +        signal(Sig, SIG_IGN);
> +        AcpiOsPrintf ("<Control-C>\n");
> +
> +        /* Abort the application if there are no methods executing */
> +
> +        if (!AcpiGbl_MethodExecuting)
> +        {
> +            break;
> +        }
> +
> +        /*
> +         * Abort the method(s). This will also dump the method call
> +         * stack so there is no need to do it here. The application
> +         * will then drop back into the debugger interface.
> +         */
> +        AcpiGbl_AbortMethod = TRUE;
> +        AcpiOsPrintf (AE_PREFIX "Control Method Call Stack:\n");
> +        signal (SIGINT, AeSignalHandler);
> +        return;
> +
> +    case SIGSEGV:
> +        AcpiOsPrintf ("Segmentation Fault\n");
> +        AeDisplayMethodCallStack ();
> +        break;
> +
> +    default:
> +        AcpiOsPrintf ("Unknown Signal, %X\n", Sig);
> +        break;
> +    }
> +
> +    /* Terminate application -- cleanup then exit */
> +
> +    AcpiOsPrintf (AE_PREFIX "Terminating\n");
> +    (void) AcpiOsTerminate ();
> +    exit (0);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION:    AeDisplayMethodCallStack
> + *
> + * PARAMETERS:  None
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Display current method call stack, if possible.
> + *
> + * NOTE:        Currently only called from a SIGSEGV, so AcpiExec is about
> + *              to terminate.
> + *
> + *****************************************************************************/
> +
> +static void
> +AeDisplayMethodCallStack (
> +    void)
> +{
> +    ACPI_WALK_STATE         *WalkState;
> +    ACPI_THREAD_STATE       *ThreadList = AcpiGbl_CurrentWalkList;
> +    char                    *FullPathname = NULL;
> +
> +
> +    if (!AcpiGbl_MethodExecuting)
> +    {
> +        AcpiOsPrintf (AE_PREFIX "No method is executing\n");
> +        return;
> +    }
> +
> +    /*
> +     * Try to find the currently executing control method(s)
> +     *
> +     * Note: The following code may fault if the data structures are
> +     * in an indeterminate state when the interrupt occurs. However,
> +     * in practice, this works quite well and can provide very
> +     * valuable information.
> +     *
> +     * 1) Walk the global thread list
> +     */
> +    while (ThreadList &&
> +        (ThreadList->DescriptorType == ACPI_DESC_TYPE_STATE_THREAD))
> +    {
> +        /* 2) Walk the walk state list for this thread */
> +
> +        WalkState = ThreadList->WalkStateList;
> +        while (WalkState &&
> +            (WalkState->DescriptorType == ACPI_DESC_TYPE_WALK))
> +        {
> +            /* An executing control method */
> +
> +            if (WalkState->MethodNode)
> +            {
> +                FullPathname = AcpiNsGetExternalPathname (
> +                    WalkState->MethodNode);
> +
> +                AcpiOsPrintf (AE_PREFIX
> +                    "Executing Method: %s\n", FullPathname);
> +            }
> +
> +            /* Execution of a deferred opcode/node */
> +
> +            if (WalkState->DeferredNode)
> +            {
> +                FullPathname = AcpiNsGetExternalPathname (
> +                    WalkState->DeferredNode);
> +
> +                AcpiOsPrintf (AE_PREFIX
> +                    "Evaluating deferred node: %s\n", FullPathname);
> +            }
> +
> +            /* Get the currently executing AML opcode */
> +
> +            if ((WalkState->Opcode != AML_INT_METHODCALL_OP) &&
> +                FullPathname)
> +            {
> +                AcpiOsPrintf (AE_PREFIX
> +                    "Current AML Opcode in %s: [%s]-0x%4.4X at %p\n",
> +                    FullPathname, AcpiPsGetOpcodeName (WalkState->Opcode),
> +                    WalkState->Opcode, WalkState->Aml);
> +            }
> +
> +            if (FullPathname)
> +            {
> +                ACPI_FREE (FullPathname);
> +                FullPathname = NULL;
> +            }
> +
> +            WalkState = WalkState->Next;
> +        }
> +
> +        ThreadList = ThreadList->Next;
> +    }
> +}
> diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
> index 5f32b6af..b2854195 100644
> --- a/src/acpica/source/tools/acpiexec/aehandlers.c
> +++ b/src/acpica/source/tools/acpiexec/aehandlers.c
> @@ -182,14 +182,6 @@ AeDeviceNotifyHandler (
>       void                    *Context);
>   
>   static ACPI_STATUS
> -AeExceptionHandler (
> -    ACPI_STATUS             AmlStatus,
> -    ACPI_NAME               Name,
> -    UINT16                  Opcode,
> -    UINT32                  AmlOffset,
> -    void                    *Context);
> -
> -static ACPI_STATUS
>   AeTableHandler (
>       UINT32                  Event,
>       void                    *Table,
> @@ -230,50 +222,11 @@ static char                *TableEvents[] =
>   #endif /* !ACPI_REDUCED_HARDWARE */
>   
>   
> -static UINT32               SigintCount = 0;
>   static AE_DEBUG_REGIONS     AeRegions;
>   
>   
>   /******************************************************************************
>    *
> - * FUNCTION:    AeCtrlCHandler
> - *
> - * PARAMETERS:  Sig
> - *
> - * RETURN:      none
> - *
> - * DESCRIPTION: Control-C handler. Abort running control method if any.
> - *
> - *****************************************************************************/
> -
> -void ACPI_SYSTEM_XFACE
> -AeCtrlCHandler (
> -    int                     Sig)
> -{
> -
> -    signal (SIGINT, SIG_IGN);
> -    SigintCount++;
> -
> -    AcpiOsPrintf ("Caught a ctrl-c (#%u)\n\n", SigintCount);
> -
> -    if (AcpiGbl_MethodExecuting)
> -    {
> -        AcpiGbl_AbortMethod = TRUE;
> -        signal (SIGINT, AeCtrlCHandler);
> -
> -        if (SigintCount < 10)
> -        {
> -            return;
> -        }
> -    }
> -
> -    (void) AcpiOsTerminate ();
> -    exit (0);
> -}
> -
> -
> -/******************************************************************************
> - *
>    * FUNCTION:    AeNotifyHandler(s)
>    *
>    * PARAMETERS:  Standard notify handler parameters
> @@ -325,28 +278,34 @@ AeCommonNotifyHandler (
>   #if 0
>       case 0:
>   
> -        printf ("[AcpiExec] Method Error 0x%X: Results not equal\n", Value);
> +        printf (AE_PREFIX
> +            "Method Error 0x%X: Results not equal\n", Value);
>           if (AcpiGbl_DebugFile)
>           {
> -            AcpiOsPrintf ("[AcpiExec] Method Error: Results not equal\n");
> +            AcpiOsPrintf (AE_PREFIX
> +                "Method Error: Results not equal\n");
>           }
>           break;
>   
>       case 1:
>   
> -        printf ("[AcpiExec] Method Error: Incorrect numeric result\n");
> +        printf (AE_PREFIX
> +            "Method Error: Incorrect numeric result\n");
>           if (AcpiGbl_DebugFile)
>           {
> -            AcpiOsPrintf ("[AcpiExec] Method Error: Incorrect numeric result\n");
> +            AcpiOsPrintf (AE_PREFIX
> +                "Method Error: Incorrect numeric result\n");
>           }
>           break;
>   
>       case 2:
>   
> -        printf ("[AcpiExec] Method Error: An operand was overwritten\n");
> +        printf (AE_PREFIX
> +            "Method Error: An operand was overwritten\n");
>           if (AcpiGbl_DebugFile)
>           {
> -            AcpiOsPrintf ("[AcpiExec] Method Error: An operand was overwritten\n");
> +            AcpiOsPrintf (AE_PREFIX
> +                "Method Error: An operand was overwritten\n");
>           }
>           break;
>   
> @@ -354,12 +313,14 @@ AeCommonNotifyHandler (
>   
>       default:
>   
> -        printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +        printf (AE_PREFIX
> +            "Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
>               HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
>               AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
>           if (AcpiGbl_DebugFile)
>           {
> -            AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
> +            AcpiOsPrintf (AE_PREFIX
> +                "Handler %u: Received a %s notify, Value 0x%2.2X\n",
>                   HandlerId, Type, Value);
>           }
>   
> @@ -390,12 +351,14 @@ AeSystemNotifyHandler (
>       void                        *Context)
>   {
>   
> -    printf ("[AcpiExec] Global:    Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +    printf (AE_PREFIX
> +        "Global:    Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
>           AcpiUtGetNodeName (Device), Device, Value,
>           AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
>       if (AcpiGbl_DebugFile)
>       {
> -        AcpiOsPrintf ("[AcpiExec] Global:    Received a System Notify, Value 0x%2.2X\n", Value);
> +        AcpiOsPrintf (AE_PREFIX
> +            "Global:    Received a System Notify, Value 0x%2.2X\n", Value);
>       }
>   
>       (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -423,12 +386,14 @@ AeDeviceNotifyHandler (
>       void                        *Context)
>   {
>   
> -    printf ("[AcpiExec] Global:    Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
> +    printf (AE_PREFIX
> +        "Global:    Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
>           AcpiUtGetNodeName (Device), Device, Value,
>           AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
>       if (AcpiGbl_DebugFile)
>       {
> -        AcpiOsPrintf ("[AcpiExec] Global:    Received a Device Notify, Value 0x%2.2X\n", Value);
> +        AcpiOsPrintf (AE_PREFIX
> +            "Global:    Received a Device Notify, Value 0x%2.2X\n", Value);
>       }
>   
>       (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
> @@ -437,108 +402,6 @@ AeDeviceNotifyHandler (
>   
>   /******************************************************************************
>    *
> - * FUNCTION:    AeExceptionHandler
> - *
> - * PARAMETERS:  Standard exception handler parameters
> - *
> - * RETURN:      Status
> - *
> - * DESCRIPTION: System exception handler for AcpiExec utility.
> - *
> - *****************************************************************************/
> -
> -static ACPI_STATUS
> -AeExceptionHandler (
> -    ACPI_STATUS             AmlStatus,
> -    ACPI_NAME               Name,
> -    UINT16                  Opcode,
> -    UINT32                  AmlOffset,
> -    void                    *Context)
> -{
> -    ACPI_STATUS             NewAmlStatus = AmlStatus;
> -    ACPI_STATUS             Status;
> -    ACPI_BUFFER             ReturnObj;
> -    ACPI_OBJECT_LIST        ArgList;
> -    ACPI_OBJECT             Arg[3];
> -    const char              *Exception;
> -
> -
> -    Exception = AcpiFormatException (AmlStatus);
> -    AcpiOsPrintf ("[AcpiExec] Exception %s during execution ", Exception);
> -    if (Name)
> -    {
> -        AcpiOsPrintf ("of method [%4.4s]", (char *) &Name);
> -    }
> -    else
> -    {
> -        AcpiOsPrintf ("at module level (table load)");
> -    }
> -
> -    AcpiOsPrintf (" Opcode [%s] @%X\n", AcpiPsGetOpcodeName (Opcode), AmlOffset);
> -
> -    /*
> -     * Invoke the _ERR method if present
> -     *
> -     * Setup parameter object
> -     */
> -    ArgList.Count = 3;
> -    ArgList.Pointer = Arg;
> -
> -    Arg[0].Type = ACPI_TYPE_INTEGER;
> -    Arg[0].Integer.Value = AmlStatus;
> -
> -    Arg[1].Type = ACPI_TYPE_STRING;
> -    Arg[1].String.Pointer = ACPI_CAST_PTR (char, Exception);
> -    Arg[1].String.Length = strlen (Exception);
> -
> -    Arg[2].Type = ACPI_TYPE_INTEGER;
> -    Arg[2].Integer.Value = AcpiOsGetThreadId();
> -
> -    /* Setup return buffer */
> -
> -    ReturnObj.Pointer = NULL;
> -    ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
> -
> -    Status = AcpiEvaluateObject (NULL, "\\_ERR", &ArgList, &ReturnObj);
> -    if (ACPI_SUCCESS (Status))
> -    {
> -        if (ReturnObj.Pointer)
> -        {
> -            /* Override original status */
> -
> -            NewAmlStatus = (ACPI_STATUS)
> -                ((ACPI_OBJECT *) ReturnObj.Pointer)->Integer.Value;
> -
> -            /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
> -
> -            AcpiOsFree (ReturnObj.Pointer);
> -        }
> -    }
> -    else if (Status != AE_NOT_FOUND)
> -    {
> -        AcpiOsPrintf ("[AcpiExec] Could not execute _ERR method, %s\n",
> -            AcpiFormatException (Status));
> -    }
> -
> -    /* Global override */
> -
> -    if (AcpiGbl_IgnoreErrors)
> -    {
> -        NewAmlStatus = AE_OK;
> -    }
> -
> -    if (NewAmlStatus != AmlStatus)
> -    {
> -        AcpiOsPrintf ("[AcpiExec] Exception override, new status %s\n\n",
> -            AcpiFormatException (NewAmlStatus));
> -    }
> -
> -    return (NewAmlStatus);
> -}
> -
> -
> -/******************************************************************************
> - *
>    * FUNCTION:    AeTableHandler
>    *
>    * PARAMETERS:  Table handler
> @@ -571,8 +434,9 @@ AeTableHandler (
>       Status = AcpiUpdateAllGpes ();
>       ACPI_CHECK_OK (AcpiUpdateAllGpes, Status);
>   
> -    printf ("[AcpiExec] Table Event %s, [%4.4s] %p\n",
> -        TableEvents[Event], ((ACPI_TABLE_HEADER *) Table)->Signature, Table);
> +    printf (AE_PREFIX "Table Event %s, [%4.4s] %p\n",
> +        TableEvents[Event],
> +        ((ACPI_TABLE_HEADER *) Table)->Signature, Table);
>   #endif /* !ACPI_REDUCED_HARDWARE */
>   
>       return (AE_OK);
> @@ -596,7 +460,8 @@ AeGpeHandler (
>       ACPI_NAMESPACE_NODE     *DeviceNode = (ACPI_NAMESPACE_NODE *) GpeDevice;
>   
>   
> -    AcpiOsPrintf ("[AcpiExec] GPE Handler received GPE %02X (GPE block %4.4s)\n",
> +    AcpiOsPrintf (AE_PREFIX
> +        "GPE Handler received GPE %02X (GPE block %4.4s)\n",
>           GpeNumber, GpeDevice ? DeviceNode->Name.Ascii : "FADT");
>   
>       return (ACPI_REENABLE_GPE);
> @@ -639,8 +504,8 @@ AeGlobalEventHandler (
>           break;
>       }
>   
> -    AcpiOsPrintf (
> -        "[AcpiExec] Global Event Handler received: Type %s Number %.2X Dev %p\n",
> +    AcpiOsPrintf (AE_PREFIX
> +        "Global Event Handler received: Type %s Number %.2X Dev %p\n",
>           TypeName, EventNumber, Device);
>   }
>   
> @@ -662,7 +527,8 @@ AeAttachedDataHandler (
>       ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
>   
>   
> -    AcpiOsPrintf ("Received an attached data deletion (1) on %4.4s\n",
> +    AcpiOsPrintf (AE_PREFIX
> +        "Received an attached data deletion (1) on %4.4s\n",
>           Node->Name.Ascii);
>   }
>   
> @@ -684,7 +550,8 @@ AeAttachedDataHandler2 (
>       ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
>   
>   
> -    AcpiOsPrintf ("Received an attached data deletion (2) on %4.4s\n",
> +    AcpiOsPrintf (AE_PREFIX
> +        "Received an attached data deletion (2) on %4.4s\n",
>           Node->Name.Ascii);
>   }
>   
> @@ -734,7 +601,8 @@ AeSciHandler (
>       void                    *Context)
>   {
>   
> -    AcpiOsPrintf ("[AcpiExec] Received an SCI at handler\n");
> +    AcpiOsPrintf (AE_PREFIX
> +        "Received an SCI at handler\n");
>       return (0);
>   }
>   
> @@ -926,16 +794,16 @@ AeInstallEarlyHandlers (
>   
>       /* Install global notify handlers */
>   
> -    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
> -        AeSystemNotifyHandler, NULL);
> +    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT,
> +        ACPI_SYSTEM_NOTIFY, AeSystemNotifyHandler, NULL);
>       if (ACPI_FAILURE (Status))
>       {
>           printf ("Could not install a global system notify handler, %s\n",
>               AcpiFormatException (Status));
>       }
>   
> -    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
> -        AeDeviceNotifyHandler, NULL);
> +    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT,
> +        ACPI_DEVICE_NOTIFY, AeDeviceNotifyHandler, NULL);
>       if (ACPI_FAILURE (Status))
>       {
>           printf ("Could not install a global notify handler, %s\n",
> 

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

Patch

diff --git a/src/acpica/Makefile.am b/src/acpica/Makefile.am
index 84cb0753..4b7ef1da 100644
--- a/src/acpica/Makefile.am
+++ b/src/acpica/Makefile.am
@@ -248,6 +248,7 @@  libfwtsacpica_la_SOURCES =				\
 	source/components/utilities/utmutex.c		\
 	source/components/utilities/utnonansi.c		\
 	source/components/utilities/utobject.c		\
+	source/components/utilities/utresdecode.c	\
 	source/components/utilities/utresrc.c		\
 	source/components/utilities/utstate.c		\
 	source/components/utilities/utstrtoul64.c	\
@@ -272,6 +273,7 @@  libfwtsacpica_la_SOURCES =				\
 	source/common/ahuuids.c				\
 	source/tools/acpiexec/aeinitfile.c		\
 	source/tools/acpiexec/aehandlers.c		\
+	source/tools/acpiexec/aeexception.c		\
 	source/tools/acpiexec/aeregion.c		\
 	source/os_specific/service_layers/osgendbg.c
 
diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
index ecd9f604..a334d541 100644
--- a/src/acpica/source/common/acfileio.c
+++ b/src/acpica/source/common/acfileio.c
@@ -531,8 +531,6 @@  AcValidateTableHeader (
 
     if (!AcpiUtValidNameseg (TableHeader.Signature))
     {
-        fprintf (stderr, "Invalid table signature: 0x%8.8X\n",
-            *ACPI_CAST_PTR (UINT32, TableHeader.Signature));
         return (AE_BAD_SIGNATURE);
     }
 
diff --git a/src/acpica/source/common/adfile.c b/src/acpica/source/common/adfile.c
index 5fff07d3..ac96156d 100644
--- a/src/acpica/source/common/adfile.c
+++ b/src/acpica/source/common/adfile.c
@@ -316,11 +316,6 @@  FlGenerateFilename (
      */
     NewFilename = UtStringCacheCalloc ((ACPI_SIZE)
         strlen (InputFilename) + strlen (Suffix) + 2);
-    if (!NewFilename)
-    {
-        return (NULL);
-    }
-
     strcpy (NewFilename, InputFilename);
 
     /* Try to find the last dot in the filename */
@@ -364,11 +359,6 @@  FlStrdup (
 
 
     NewString = UtStringCacheCalloc ((ACPI_SIZE) strlen (String) + 1);
-    if (!NewString)
-    {
-        return (NULL);
-    }
-
     strcpy (NewString, String);
     return (NewString);
 }
diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
index 23260c7f..c0d44cdf 100644
--- a/src/acpica/source/common/adisasm.c
+++ b/src/acpica/source/common/adisasm.c
@@ -537,7 +537,7 @@  AdDisassembleOneTable (
      * the entire tree with the new information (namely, the
      * number of arguments per method)
      */
-    if (AcpiDmGetExternalMethodCount ())
+    if (AcpiDmGetUnresolvedExternalMethodCount ())
     {
         Status = AdReparseOneTable (Table, File, OwnerId);
         if (ACPI_FAILURE (Status))
@@ -553,7 +553,7 @@  AdDisassembleOneTable (
      * 1) Convert fixed-offset references to resource descriptors
      *    to symbolic references (Note: modifies namespace)
      */
-    AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
+    AcpiDmConvertParseObjects (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
 
     /* Optional displays */
 
@@ -616,7 +616,7 @@  AdReparseOneTable (
     fprintf (stderr,
         "\nFound %u external control methods, "
         "reparsing with new information\n",
-        AcpiDmGetExternalMethodCount ());
+        AcpiDmGetUnresolvedExternalMethodCount ());
 
     /* Reparse, rebuild namespace */
 
@@ -642,7 +642,7 @@  AdReparseOneTable (
 
     /* New namespace, add the external definitions first */
 
-    AcpiDmAddExternalsToNamespace ();
+    AcpiDmAddExternalListToNamespace ();
 
     /* For -ca option: clear the list of comment addresses. */
 
diff --git a/src/acpica/source/common/adwalk.c b/src/acpica/source/common/adwalk.c
index e1205e3b..887835cb 100644
--- a/src/acpica/source/common/adwalk.c
+++ b/src/acpica/source/common/adwalk.c
@@ -208,11 +208,16 @@  AcpiDmInspectPossibleArgs (
     ACPI_PARSE_OBJECT       *Op);
 
 static ACPI_STATUS
-AcpiDmResourceDescendingOp (
+AcpiDmCommonDescendingOp (
     ACPI_PARSE_OBJECT       *Op,
     UINT32                  Level,
     void                    *Context);
 
+static ACPI_STATUS
+AcpiDmProcessResourceDescriptors (
+    ACPI_PARSE_OBJECT       *Op,
+    UINT32                  Level,
+    void                    *Context);
 
 /*******************************************************************************
  *
@@ -395,21 +400,21 @@  AcpiDmCrossReferenceNamespace (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDmConvertResourceIndexes
+ * FUNCTION:    AcpiDmConvertParseObjects
  *
  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
  *              NamespaceRoot       - Root of the internal namespace
  *
  * RETURN:      None
  *
- * DESCRIPTION: Convert fixed-offset references to resource descriptors to
- *              symbolic references. Should only be called after namespace has
- *              been cross referenced.
+ * DESCRIPTION: Begin parse tree walk to perform conversions needed for
+ *              disassembly. These include resource descriptors and switch/case
+ *              operations.
  *
  ******************************************************************************/
 
 void
-AcpiDmConvertResourceIndexes (
+AcpiDmConvertParseObjects (
     ACPI_PARSE_OBJECT       *ParseTreeRoot,
     ACPI_NAMESPACE_NODE     *NamespaceRoot)
 {
@@ -443,9 +448,14 @@  AcpiDmConvertResourceIndexes (
     Info.Level = 0;
     Info.WalkState = WalkState;
 
-    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
+    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmCommonDescendingOp,
         AcpiDmCommonAscendingOp, &Info);
     ACPI_FREE (WalkState);
+
+    if (AcpiGbl_TempListHead) {
+        AcpiDmClearTempList();
+    }
+
     return;
 }
 
@@ -737,7 +747,6 @@  AcpiDmLoadDescendingOp (
 
     WalkState = Info->WalkState;
     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
-    ObjectType = OpInfo->ObjectType;
     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
 
     /* Only interested in operators that create new names */
@@ -754,7 +763,7 @@  AcpiDmLoadDescendingOp (
     {
         /* For all named operators, get the new name */
 
-        Path = (char *) Op->Named.Path;
+        Path = Op->Named.Path;
 
         if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
         {
@@ -875,7 +884,6 @@  AcpiDmXrefDescendingOp (
 
     WalkState = Info->WalkState;
     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
-    ObjectType = OpInfo->ObjectType;
     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
 
     if ((!(OpInfo->Flags & AML_NAMED)) &&
@@ -885,25 +893,6 @@  AcpiDmXrefDescendingOp (
     {
         goto Exit;
     }
-    else if (Op->Common.Parent &&
-             Op->Common.Parent->Common.AmlOpcode == AML_EXTERNAL_OP)
-    {
-        /* External() NamePath */
-
-        Path = Op->Common.Value.String;
-        ObjectType = (ACPI_OBJECT_TYPE) Op->Common.Next->Common.Value.Integer;
-        if (ObjectType == ACPI_TYPE_METHOD)
-        {
-            ParamCount = (UINT32)
-                Op->Common.Next->Common.Next->Common.Value.Integer;
-        }
-
-        Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE;
-        AcpiDmAddOpToExternalList (Op, Path,
-            (UINT8) ObjectType, ParamCount, Flags);
-
-        goto Exit;
-    }
 
     /* Get the NamePath from the appropriate place */
 
@@ -924,9 +913,10 @@  AcpiDmXrefDescendingOp (
                 Path = NextOp->Common.Value.String;
             }
         }
-        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
+        else if (Op->Common.AmlOpcode == AML_SCOPE_OP ||
+                 Op->Common.AmlOpcode == AML_EXTERNAL_OP)
         {
-            Path = (char *) Op->Named.Path;
+            Path = Op->Named.Path;
         }
     }
     else if (OpInfo->Flags & AML_CREATE)
@@ -1060,21 +1050,59 @@  Exit:
     return (AE_OK);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmCommonDescendingOp
+ *
+ * PARAMETERS:  ASL_WALK_CALLBACK
+ *
+ * RETURN:      ACPI_STATUS
+ *
+ * DESCRIPTION: Perform parse tree preprocessing before main disassembly walk.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmCommonDescendingOp (
+    ACPI_PARSE_OBJECT       *Op,
+    UINT32                  Level,
+    void                    *Context)
+{
+    ACPI_STATUS             Status;
+
+    /* Resource descriptor conversion */
+
+    Status = AcpiDmProcessResourceDescriptors (Op, Level, Context);
+
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Switch/Case conversion */
+
+    Status = AcpiDmProcessSwitch (Op);
+
+    return (AE_OK);
+}
+
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDmResourceDescendingOp
+ * FUNCTION:    AcpiDmProcessResourceDescriptors
  *
  * PARAMETERS:  ASL_WALK_CALLBACK
  *
- * RETURN:      None
+ * RETURN:      ACPI_STATUS
  *
- * DESCRIPTION: Process one parse op during symbolic resource index conversion.
+ * DESCRIPTION: Convert fixed-offset references to resource descriptors to
+ *              symbolic references. Should only be called after namespace has
+ *              been cross referenced.
  *
  ******************************************************************************/
 
 static ACPI_STATUS
-AcpiDmResourceDescendingOp (
+AcpiDmProcessResourceDescriptors (
     ACPI_PARSE_OBJECT       *Op,
     UINT32                  Level,
     void                    *Context)
@@ -1085,7 +1113,6 @@  AcpiDmResourceDescendingOp (
     ACPI_OBJECT_TYPE        ObjectType;
     ACPI_STATUS             Status;
 
-
     WalkState = Info->WalkState;
     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
 
@@ -1111,10 +1138,10 @@  AcpiDmResourceDescendingOp (
      * If so, convert the reference into a symbolic reference.
      */
     AcpiDmCheckResourceReference (Op, WalkState);
+
     return (AE_OK);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmCommonAscendingOp
@@ -1135,14 +1162,11 @@  AcpiDmCommonAscendingOp (
     void                    *Context)
 {
     ACPI_OP_WALK_INFO       *Info = Context;
-    const ACPI_OPCODE_INFO  *OpInfo;
     ACPI_OBJECT_TYPE        ObjectType;
 
 
     /* Close scope if necessary */
 
-    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
-    ObjectType = OpInfo->ObjectType;
     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
 
     if (AcpiNsOpensScope (ObjectType))
@@ -1153,7 +1177,6 @@  AcpiDmCommonAscendingOp (
     return (AE_OK);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmInspectPossibleArgs
diff --git a/src/acpica/source/common/ahids.c b/src/acpica/source/common/ahids.c
index 3f3bae30..701d9f40 100644
--- a/src/acpica/source/common/ahids.c
+++ b/src/acpica/source/common/ahids.c
@@ -187,6 +187,7 @@  const AH_DEVICE_ID  AslDeviceIds[] =
     {"ACPI0011",    "Generic Buttons Device"},
     {"ACPI0012",    "NVDIMM Root Device"},
     {"ACPI0013",    "Generic Event Device"},
+    {"ACPI0014",    "Wireless Power Calibration Device"},
     {"ADMA0F28",    "Intel Audio DMA"},
     {"AMCR0F28",    "Intel Audio Machine Driver"},
     {"ATK4001",     "Asus Radio Control Button"},
diff --git a/src/acpica/source/common/ahpredef.c b/src/acpica/source/common/ahpredef.c
index 41e19f68..edcfa2f0 100644
--- a/src/acpica/source/common/ahpredef.c
+++ b/src/acpica/source/common/ahpredef.c
@@ -254,6 +254,7 @@  const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
     AH_PREDEF ("_FPS",    "Fan Performance States", "Returns a list of supported fan performance states"),
     AH_PREDEF ("_FSL",    "Fan Set Level", "Control method that sets the fan device's speed level (performance state)"),
     AH_PREDEF ("_FST",    "Fan Status", "Returns current status information for a fan device"),
+    AH_PREDEF ("_FUN",    "Function Number", "Resource descriptor field"),
     AH_PREDEF ("_GAI",    "Get Averaging Interval", "Returns the power meter averaging interval"),
     AH_PREDEF ("_GCP",    "Get Capabilities", "Get device time capabilities"),
     AH_PREDEF ("_GHL",    "Get Hardware Limit", "Returns the hardware limit enforced by the power meter"),
@@ -270,6 +271,7 @@  const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
     AH_PREDEF ("_GWS",    "Get Wake Status", "Return status of wake alarms"),
     AH_PREDEF ("_HE_",    "High-Edge", "Interrupt triggering, Resource Descriptor field"),
     AH_PREDEF ("_HID",    "Hardware ID", "Returns a device's Plug and Play Hardware ID"),
+    AH_PREDEF ("_HMA",    "Heterogeneous Memory Attributes", "Returns a list of HMAT structures."),
     AH_PREDEF ("_HOT",    "Hot Temperature", "Returns the critical temperature for sleep (entry to S4)"),
     AH_PREDEF ("_HPP",    "Hot Plug Parameters", "Returns a list of hot-plug information for a PCI device"),
     AH_PREDEF ("_HPX",    "Hot Plug Parameter Extensions", "Returns a list of hot-plug information for a PCI device. Supersedes _HPP"),
@@ -287,6 +289,9 @@  const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
     AH_PREDEF ("_LL_",    "Low Level", "Interrupt polarity, Resource Descriptor field"),
     AH_PREDEF ("_LPD",    "Low Power Dependencies", "Returns a list of dependencies for low power idle entry"),
     AH_PREDEF ("_LPI",    "Low Power Idle States", "Returns a list of supported low power idle states"),
+    AH_PREDEF ("_LSI",    "Label Storage Information", "Returns information about the Label Storage Area associated with the NVDIMM object."),
+    AH_PREDEF ("_LSR",    "Label Storage Read", "Returns label data from the Label Storage Area of the NVDIMM object."),
+    AH_PREDEF ("_LSW",    "Label Storage Write", "Writes label data in to the Label Storage Area of the NVDIMM object."),
     AH_PREDEF ("_MAF",    "Maximum Address Fixed", "Resource Descriptor field"),
     AH_PREDEF ("_MAT",    "Multiple APIC Table Entry", "Returns a list of MADT APIC structure entries"),
     AH_PREDEF ("_MAX",    "Maximum Base Address", "Resource Descriptor field"),
@@ -439,6 +444,7 @@  const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
     AH_PREDEF ("_UPC",    "USB Port Capabilities", "Returns a list of USB port capabilities"),
     AH_PREDEF ("_UPD",    "User Presence Detect", "Returns user detection information"),
     AH_PREDEF ("_UPP",    "User Presence Polling", "Returns the recommended user presence polling interval"),
+    AH_PREDEF ("_VAL",    "Pin Configuration Value", "Resource Descriptor field"),
     AH_PREDEF ("_VEN",    "Vendor Data", "Resource Descriptor field"),
     AH_PREDEF ("_VPO",    "Video Post Options", "Returns the implemented video post options"),
     AH_PREDEF ("_Wxx",    "Wake Event", "Method executed as a result of a wake event"),
diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c
index 42a7944f..38c1ea20 100644
--- a/src/acpica/source/common/ahtable.c
+++ b/src/acpica/source/common/ahtable.c
@@ -218,6 +218,7 @@  const AH_TABLE      Gbl_AcpiSupportedTables[] =
     {ACPI_SIG_FPDT, "Firmware Performance Data Table"},
     {ACPI_SIG_GTDT, "Generic Timer Description Table"},
     {ACPI_SIG_HEST, "Hardware Error Source Table"},
+    {ACPI_SIG_HMAT, "Heterogeneous Memory Attributes Table"},
     {ACPI_SIG_HPET, "High Precision Event Timer table"},
     {ACPI_SIG_IORT, "IO Remapping Table"},
     {ACPI_SIG_IVRS, "I/O Virtualization Reporting Structure"},
@@ -232,6 +233,7 @@  const AH_TABLE      Gbl_AcpiSupportedTables[] =
     {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"},
     {ACPI_SIG_PCCT, "Platform Communications Channel Table"},
     {ACPI_SIG_PMTT, "Platform Memory Topology Table"},
+    {ACPI_SIG_PPTT, "Processor Properties Topology Table"},
     {ACPI_SIG_RASF, "RAS Features Table"},
     {ACPI_RSDP_NAME,"Root System Description Pointer"},
     {ACPI_SIG_RSDT, "Root System Description Table"},
@@ -253,6 +255,7 @@  const AH_TABLE      Gbl_AcpiSupportedTables[] =
     {ACPI_SIG_WDDT, "Watchdog Description Table"},
     {ACPI_SIG_WDRT, "Watchdog Resource Table"},
     {ACPI_SIG_WPBT, "Windows Platform Binary Table"},
+    {ACPI_SIG_WSMT, "Windows SMM Security Migrations Table"},
     {ACPI_SIG_XENV, "Xen Environment table"},
     {ACPI_SIG_XSDT, "Extended System Description Table"},
     {NULL,          NULL}
diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c
index f2b62443..6e018a30 100644
--- a/src/acpica/source/common/ahuuids.c
+++ b/src/acpica/source/common/ahuuids.c
@@ -186,6 +186,10 @@  const AH_UUID  Gbl_AcpiUuids[] =
     {"Persistent Virtual Disk",     UUID_PERSISTENT_VIRTUAL_DISK},
     {"Persistent Virtual CD",       UUID_PERSISTENT_VIRTUAL_CD},
 
+    {"[Processor Properties]",      NULL},
+    {"Cache Properties",            UUID_CACHE_PROPERTIES},
+    {"Physical Package Property",   UUID_PHYSICAL_PROPERTY},
+
     {"[Miscellaneous]",             NULL},
     {"Platform-wide Capabilities",  UUID_PLATFORM_CAPABILITIES},
     {"Dynamic Enumeration",         UUID_DYNAMIC_ENUMERATION},
diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
index 818d2adc..6ae3c379 100644
--- a/src/acpica/source/common/dmextern.c
+++ b/src/acpica/source/common/dmextern.c
@@ -199,6 +199,9 @@  static const char           *AcpiGbl_DmTypeNames[] =
 
 #define METHOD_SEPARATORS           " \t,()\n"
 
+static const char          *ExternalConflictMessage =
+    "    // Conflicts with a later declaration";
+
 
 /* Local prototypes */
 
@@ -211,6 +214,16 @@  AcpiDmNormalizeParentPrefix (
     ACPI_PARSE_OBJECT       *Op,
     char                    *Path);
 
+static ACPI_STATUS
+AcpiDmGetExternalAndInternalPath (
+    ACPI_NAMESPACE_NODE     *Node,
+    char                    **ExternalPath,
+    char                    **InternalPath);
+
+static ACPI_STATUS
+AcpiDmRemoveRootPrefix (
+    char                    **Path);
+
 static void
 AcpiDmAddPathToExternalList (
     char                    *Path,
@@ -226,6 +239,21 @@  AcpiDmCreateNewExternal (
     UINT32                  Value,
     UINT16                  Flags);
 
+static void
+AcpiDmCheckForExternalConflict (
+    char                    *Path);
+
+static ACPI_STATUS
+AcpiDmResolveExternal (
+    char                    *Path,
+    UINT8                   Type,
+    ACPI_NAMESPACE_NODE     **Node);
+
+
+static void
+AcpiDmConflictingDeclaration (
+    char                    *Path);
+
 
 /*******************************************************************************
  *
@@ -582,7 +610,7 @@  AcpiDmGetExternalsFromFile (
     {
         /* Add the external(s) to the namespace */
 
-        AcpiDmAddExternalsToNamespace ();
+        AcpiDmAddExternalListToNamespace ();
 
         AcpiOsPrintf ("%s: Imported %u external method definitions\n",
             Gbl_ExternalRefFilename, ImportCount);
@@ -698,6 +726,86 @@  AcpiDmAddOpToExternalList (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiDmGetExternalAndInternalPath
+ *
+ * PARAMETERS:  Node                - Namespace node for object to be added
+ *              ExternalPath        - Will contain the external path of the node
+ *              InternalPath        - Will contain the internal path of the node
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Get the External and Internal path from the given node.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmGetExternalAndInternalPath (
+    ACPI_NAMESPACE_NODE     *Node,
+    char                    **ExternalPath,
+    char                    **InternalPath)
+{
+    ACPI_STATUS             Status;
+
+
+    if (!Node)
+    {
+        return (AE_BAD_PARAMETER);
+    }
+
+    /* Get the full external and internal pathnames to the node */
+
+    *ExternalPath = AcpiNsGetExternalPathname (Node);
+    if (!*ExternalPath)
+    {
+        return (AE_BAD_PATHNAME);
+    }
+
+    Status = AcpiNsInternalizeName (*ExternalPath, InternalPath);
+    if (ACPI_FAILURE (Status))
+    {
+        ACPI_FREE (*ExternalPath);
+        return (Status);
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmRemoveRootPrefix
+ *
+ * PARAMETERS:  Path                - Remove Root prefix from this Path
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Remove the root prefix character '\' from Path.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmRemoveRootPrefix (
+    char                    **Path)
+{
+    char                    *InputPath = *Path;
+
+
+    if ((*InputPath == AML_ROOT_PREFIX) && (InputPath[1]))
+    {
+        if (!memmove(InputPath, InputPath+1, strlen(InputPath)))
+        {
+            return (AE_ERROR);
+        }
+
+        *Path = InputPath;
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiDmAddNodeToExternalList
  *
  * PARAMETERS:  Node                - Namespace node for object to be added
@@ -727,46 +835,27 @@  AcpiDmAddNodeToExternalList (
 {
     char                    *ExternalPath;
     char                    *InternalPath;
-    char                    *Temp;
     ACPI_STATUS             Status;
 
 
     ACPI_FUNCTION_TRACE (DmAddNodeToExternalList);
 
-
-    if (!Node)
-    {
-        return_VOID;
-    }
-
     /* Get the full external and internal pathnames to the node */
 
-    ExternalPath = AcpiNsGetExternalPathname (Node);
-    if (!ExternalPath)
-    {
-        return_VOID;
-    }
-
-    Status = AcpiNsInternalizeName (ExternalPath, &InternalPath);
+    Status = AcpiDmGetExternalAndInternalPath (Node, &ExternalPath, &InternalPath);
     if (ACPI_FAILURE (Status))
     {
-        ACPI_FREE (ExternalPath);
         return_VOID;
     }
 
     /* Remove the root backslash */
 
-    if ((*ExternalPath == AML_ROOT_PREFIX) && (ExternalPath[1]))
+    Status = AcpiDmRemoveRootPrefix (&ExternalPath);
+    if (ACPI_FAILURE (Status))
     {
-        Temp = ACPI_ALLOCATE_ZEROED (strlen (ExternalPath) + 1);
-        if (!Temp)
-        {
-            return_VOID;
-        }
-
-        strcpy (Temp, &ExternalPath[1]);
         ACPI_FREE (ExternalPath);
-        ExternalPath = Temp;
+        ACPI_FREE (InternalPath);
+        return_VOID;
     }
 
     /* Create the new External() declaration node */
@@ -1013,68 +1102,171 @@  AcpiDmCreateNewExternal (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDmAddExternalsToNamespace
+ * FUNCTION:    AcpiDmResolveExternal
  *
- * PARAMETERS:  None
+ * PARAMETERS:  Path               - Path of the external
+ *              Type               - Type of the external
+ *              Node               - Input node for AcpiNsLookup
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Resolve the external within the namespace by AcpiNsLookup.
+ *              If the returned node is an external and has the same type
+ *              we assume that it was either an existing external or a
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmResolveExternal (
+    char                    *Path,
+    UINT8                   Type,
+    ACPI_NAMESPACE_NODE     **Node)
+{
+    ACPI_STATUS             Status;
+
+
+    Status = AcpiNsLookup (NULL, Path, Type,
+        ACPI_IMODE_LOAD_PASS1,
+        ACPI_NS_ERROR_IF_FOUND | ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
+        NULL, Node);
+
+    if (!Node)
+    {
+        ACPI_EXCEPTION ((AE_INFO, Status,
+            "while adding external to namespace [%s]", Path));
+    }
+
+    /* Note the asl code "external(a) external(a)" is acceptable ASL */
+
+    else if ((*Node)->Type == Type &&
+        (*Node)->Flags & ANOBJ_IS_EXTERNAL)
+    {
+        return (AE_OK);
+    }
+    else
+    {
+        ACPI_EXCEPTION ((AE_INFO, AE_ERROR,
+            "[%s] has conflicting declarations", Path));
+    }
+
+    return (AE_ERROR);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmCreateSubobjectForExternal
+ *
+ * PARAMETERS:  Type                  - Type of the external
+ *              Node                  - Namespace node from AcpiNsLookup
+ *              ParamCount            - Value to be used for Method
  *
  * RETURN:      None
  *
- * DESCRIPTION: Add all externals to the namespace. Allows externals to be
+ * DESCRIPTION: Add one external to the namespace. Allows external to be
  *              "resolved".
  *
  ******************************************************************************/
 
 void
-AcpiDmAddExternalsToNamespace (
-    void)
+AcpiDmCreateSubobjectForExternal (
+    UINT8                   Type,
+    ACPI_NAMESPACE_NODE     **Node,
+    UINT32                  ParamCount)
 {
-    ACPI_STATUS             Status;
-    ACPI_NAMESPACE_NODE     *Node;
     ACPI_OPERAND_OBJECT     *ObjDesc;
-    ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
 
 
-    while (External)
+    switch (Type)
     {
-        /* Add the external name (object) into the namespace */
+    case ACPI_TYPE_METHOD:
 
-        Status = AcpiNsLookup (NULL, External->InternalPath, External->Type,
-            ACPI_IMODE_LOAD_PASS1,
-            ACPI_NS_ERROR_IF_FOUND | ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
-            NULL, &Node);
+        /* For methods, we need to save the argument count */
 
-        if (ACPI_FAILURE (Status))
-        {
-            ACPI_EXCEPTION ((AE_INFO, Status,
-                "while adding external to namespace [%s]",
-                External->Path));
-        }
+        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
+        ObjDesc->Method.ParamCount = (UINT8) ParamCount;
+        (*Node)->Object = ObjDesc;
+        break;
 
-        else switch (External->Type)
-        {
-        case ACPI_TYPE_METHOD:
+    case ACPI_TYPE_REGION:
 
-            /* For methods, we need to save the argument count */
+        /* Regions require a region sub-object */
 
-            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
-            ObjDesc->Method.ParamCount = (UINT8) External->Value;
-            Node->Object = ObjDesc;
-            break;
+        ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
+        ObjDesc->Region.Node = *Node;
+        (*Node)->Object = ObjDesc;
+        break;
 
-        case ACPI_TYPE_REGION:
+    default:
 
-            /* Regions require a region sub-object */
+        break;
+    }
+}
 
-            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
-            ObjDesc->Region.Node = Node;
-            Node->Object = ObjDesc;
-            break;
 
-        default:
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmAddOneExternalToNamespace
+ *
+ * PARAMETERS:  Path                   - External parse object
+ *              Type                   - Type of parse object
+ *              ParamCount             - External method parameter count
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Add one external to the namespace by resolvign the external
+ *              (by performing a namespace lookup) and annotating the resulting
+ *              namespace node with the approperiate information if the type
+ *              is ACPI_TYPE_REGION or ACPI_TYPE_METHOD.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmAddOneExternalToNamespace (
+    char                    *Path,
+    UINT8                   Type,
+    UINT32                  ParamCount)
+{
+    ACPI_STATUS             Status;
+    ACPI_NAMESPACE_NODE     *Node;
 
-            break;
-        }
 
+    Status = AcpiDmResolveExternal (Path, Type, &Node);
+
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+
+    AcpiDmCreateSubobjectForExternal (Type, &Node, ParamCount);
+
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmAddExternalListToNamespace
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Add all externals within AcpiGbl_ExternalList to the namespace.
+ *              Allows externals to be "resolved".
+ *
+ ******************************************************************************/
+
+void
+AcpiDmAddExternalListToNamespace (
+    void)
+{
+    ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
+
+
+    while (External)
+    {
+        AcpiDmAddOneExternalToNamespace (External->InternalPath,
+            External->Type, External->Value);
         External = External->Next;
     }
 }
@@ -1082,23 +1274,28 @@  AcpiDmAddExternalsToNamespace (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDmGetExternalMethodCount
+ * FUNCTION:    AcpiDmGetUnresolvedExternalMethodCount
  *
  * PARAMETERS:  None
  *
- * RETURN:      The number of control method externals in the external list
+ * RETURN:      The number of unresolved control method externals in the
+ *              external list
  *
- * DESCRIPTION: Return the number of method externals that have been generated.
- *              If any control method externals have been found, we must
- *              re-parse the entire definition block with the new information
- *              (number of arguments for the methods.) This is limitation of
- *              AML, we don't know the number of arguments from the control
- *              method invocation itself.
+ * DESCRIPTION: Return the number of unresolved external methods that have been
+ *              generated. If any unresolved control method externals have been
+ *              found, we must re-parse the entire definition block with the new
+ *              information (number of arguments for the methods.)
+ *              This is limitation of AML, we don't know the number of arguments
+ *              from the control method invocation itself.
+ *
+ *              Note: resolved external control methods are external control
+ *              methods encoded with the AML_EXTERNAL_OP bytecode within the
+ *              AML being disassembled.
  *
  ******************************************************************************/
 
 UINT32
-AcpiDmGetExternalMethodCount (
+AcpiDmGetUnresolvedExternalMethodCount (
     void)
 {
     ACPI_EXTERNAL_LIST      *External = AcpiGbl_ExternalList;
@@ -1107,7 +1304,8 @@  AcpiDmGetExternalMethodCount (
 
     while (External)
     {
-        if (External->Type == ACPI_TYPE_METHOD)
+        if (External->Type == ACPI_TYPE_METHOD &&
+            !(External->Flags & ACPI_EXT_ORIGIN_FROM_OPCODE))
         {
             Count++;
         }
@@ -1251,6 +1449,11 @@  AcpiDmEmitExternals (
                 }
             }
 
+            if (AcpiGbl_ExternalList->Flags &= ACPI_EXT_CONFLICTING_DECLARATION)
+            {
+                AcpiOsPrintf ("%s", ExternalConflictMessage);
+                AcpiDmConflictingDeclaration (AcpiGbl_ExternalList->Path);
+            }
             AcpiOsPrintf ("\n");
         }
 
@@ -1273,6 +1476,106 @@  AcpiDmEmitExternals (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiDmMarkExternalConflict
+ *
+ * PARAMETERS:  Path          - Namepath to search
+ *
+ * RETURN:      ExternalList
+ *
+ * DESCRIPTION: Search the AcpiGbl_ExternalList for a matching path
+ *
+ ******************************************************************************/
+
+void
+AcpiDmMarkExternalConflict (
+    ACPI_NAMESPACE_NODE     *Node)
+{
+    ACPI_EXTERNAL_LIST      *ExternalList = AcpiGbl_ExternalList;
+    char                    *ExternalPath;
+    char                    *InternalPath;
+    char                    *Temp;
+    ACPI_STATUS             Status;
+
+
+    ACPI_FUNCTION_TRACE (DmMarkExternalConflict);
+
+
+    if (Node->Flags & ANOBJ_IS_EXTERNAL)
+    {
+        return_VOID;
+    }
+
+    /* Get the full external and internal pathnames to the node */
+
+    Status = AcpiDmGetExternalAndInternalPath (Node,
+        &ExternalPath, &InternalPath);
+    if (ACPI_FAILURE (Status))
+    {
+        return_VOID;
+    }
+
+    /* Remove the root backslash */
+
+    Status = AcpiDmRemoveRootPrefix (&InternalPath);
+    if (ACPI_FAILURE (Status))
+    {
+        ACPI_FREE (InternalPath);
+        ACPI_FREE (ExternalPath);
+        return_VOID;
+    }
+
+    while (ExternalList)
+    {
+        Temp = ExternalList->InternalPath;
+        if ((*ExternalList->InternalPath == AML_ROOT_PREFIX) &&
+            (ExternalList->InternalPath[1]))
+        {
+            Temp++;
+        }
+
+        if (!strcmp (ExternalList->InternalPath, InternalPath))
+        {
+            ExternalList->Flags |= ACPI_EXT_CONFLICTING_DECLARATION;
+        }
+        ExternalList = ExternalList->Next;
+    }
+
+    ACPI_FREE (InternalPath);
+    ACPI_FREE (ExternalPath);
+
+    return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmConflictingDeclaration
+ *
+ * PARAMETERS:  Path                - Path with conflicting declaration
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Emit a warning when printing conflicting ASL external
+ *              declarations.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmConflictingDeclaration (
+    char                    *Path)
+{
+    fprintf (stderr,
+        " Warning - Emitting ASL code \"External (%s)\"\n"
+        "           This is a conflicting declaration with some "
+        "other declaration within the ASL code.\n"
+        "           This external declaration may need to be "
+        "deleted in order to recompile the dsl file.\n\n",
+        Path);
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiDmEmitExternal
  *
  * PARAMETERS:  Op                  External Parse Object
@@ -1280,7 +1583,8 @@  AcpiDmEmitExternals (
  * RETURN:      None
  *
  * DESCRIPTION: Emit an External() ASL statement for the current External
- *              parse object
+ *              parse object. Note: External Ops are named types so the
+ *              namepath is contained within NameOp->Name.Path.
  *
  ******************************************************************************/
 
@@ -1290,14 +1594,76 @@  AcpiDmEmitExternal (
     ACPI_PARSE_OBJECT       *TypeOp)
 {
     AcpiOsPrintf ("External (");
-    AcpiDmNamestring (NameOp->Common.Value.Name);
-    AcpiOsPrintf ("%s)\n",
+    AcpiDmNamestring (NameOp->Named.Path);
+    AcpiOsPrintf ("%s)",
         AcpiDmGetObjectTypeName ((ACPI_OBJECT_TYPE) TypeOp->Common.Value.Integer));
+    AcpiDmCheckForExternalConflict (NameOp->Named.Path);
+    AcpiOsPrintf ("\n");
 }
 
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiDmCheckForExternalConflict
+ *
+ * PARAMETERS:  Path                - Path to check
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Search the External List to see if the input Path has a
+ *              conflicting declaration.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmCheckForExternalConflict (
+    char                    *Path)
+{
+    ACPI_EXTERNAL_LIST      *ExternalList = AcpiGbl_ExternalList;
+    char                    *ListItemPath;
+    char                    *InputPath;
+
+
+    if (!Path)
+    {
+        return;
+    }
+
+    /* Move past the root prefix '\' */
+
+    InputPath = Path;
+    if ((*InputPath == AML_ROOT_PREFIX) && InputPath[1])
+    {
+        InputPath++;
+    }
+
+    while (ExternalList)
+    {
+        ListItemPath = ExternalList->Path;
+        if (ListItemPath)
+        {
+            /* Move past the root prefix '\' */
+
+            if ((*ListItemPath == AML_ROOT_PREFIX) &&
+                ListItemPath[1])
+            {
+                ListItemPath++;
+            }
+
+            if (!strcmp (ListItemPath, InputPath) &&
+                (ExternalList->Flags & ACPI_EXT_CONFLICTING_DECLARATION))
+            {
+                AcpiOsPrintf ("%s", ExternalConflictMessage);
+                AcpiDmConflictingDeclaration (Path);
+
+                return;
+            }
+        }
+        ExternalList = ExternalList->Next;
+    }
+}
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiDmUnresolvedWarning
  *
  * PARAMETERS:  Type                - Where to output the warning.
@@ -1311,7 +1677,7 @@  AcpiDmEmitExternal (
  *
  ******************************************************************************/
 
-#if 0
+/*
 Summary of the external control method problem:
 
 When the -e option is used with disassembly, the various SSDTs are simply
@@ -1380,7 +1746,7 @@  disassembler, otherwise it does not know how to handle the method invocations.
 In other words, if ABCD and EFGH are actually external control methods
 appearing in an SSDT, the disassembler does not know what to do unless
 the owning SSDT has been loaded via the -e option.
-#endif
+*/
 
 static char             ExternalWarningPart1[600];
 static char             ExternalWarningPart2[400];
diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
index 7753388a..5ba0f6b4 100644
--- a/src/acpica/source/common/dmrestag.c
+++ b/src/acpica/source/common/dmrestag.c
@@ -424,6 +424,34 @@  static const ACPI_RESOURCE_TAG      AcpiDmUartSerialBusTags[] =
     {0,             NULL}
 };
 
+/* Subtype tables for PinFunction descriptor */
+
+static const ACPI_RESOURCE_TAG      AcpiDmPinFunctionTags[] =
+{
+    {( 4 * 8),      ACPI_RESTAG_INTERRUPTSHARE},
+    {( 6 * 8),      ACPI_RESTAG_PINCONFIG},
+    {( 7 * 8),      ACPI_RESTAG_FUNCTION},
+    {0,             NULL}
+};
+
+/* Subtype tables for PinConfig descriptor */
+
+static const ACPI_RESOURCE_TAG      AcpiDmPinConfigTags[] =
+{
+    {( 4 * 8),      ACPI_RESTAG_INTERRUPTSHARE},
+    {( 6 * 8),      ACPI_RESTAG_PINCONFIG_TYPE},
+    {( 7 * 8),      ACPI_RESTAG_PINCONFIG_VALUE},
+    {0,             NULL}
+};
+
+/* Subtype tables for PinGroupFunction descriptor */
+
+static const ACPI_RESOURCE_TAG      AcpiDmPinGroupFunctionTags[] =
+{
+    {( 6 * 8),      ACPI_RESTAG_FUNCTION},
+    {0,             NULL}
+};
+
 /* Subtype tables for Address descriptor type-specific flags */
 
 static const ACPI_RESOURCE_TAG      AcpiDmMemoryFlagTags[] =
@@ -488,8 +516,12 @@  static const ACPI_RESOURCE_TAG      *AcpiGbl_ResourceTags[] =
     AcpiDmAddress64Tags,            /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
     AcpiDmExtendedAddressTags,      /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
     NULL,                           /* 0x0C, ACPI_RESOURCE_NAME_GPIO - Use Subtype table below */
-    NULL,                           /* 0x0D, Reserved */
-    NULL                            /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */
+    AcpiDmPinFunctionTags,          /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
+    NULL,                           /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */
+    AcpiDmPinConfigTags,            /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
+    NULL,                           /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
+    AcpiDmPinGroupFunctionTags,     /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
+    AcpiDmPinConfigTags,            /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG - Same as PinConfig */
 };
 
 /* GPIO Subtypes */
diff --git a/src/acpica/source/common/dmswitch.c b/src/acpica/source/common/dmswitch.c
new file mode 100644
index 00000000..1641cbf9
--- /dev/null
+++ b/src/acpica/source/common/dmswitch.c
@@ -0,0 +1,679 @@ 
+/******************************************************************************
+ *
+ * Module Name: adwalk - Disassembler routines for switch statements
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ *****************************************************************************/
+
+#include "acpi.h"
+#include "accommon.h"
+#include "acparser.h"
+#include "amlcode.h"
+#include "acdisasm.h"
+#include "acdispat.h"
+#include "acnamesp.h"
+#include "acapps.h"
+
+
+#define _COMPONENT          ACPI_CA_DISASSEMBLER
+        ACPI_MODULE_NAME    ("dmswitch")
+
+static BOOLEAN
+AcpiDmIsSwitchBlock (
+    ACPI_PARSE_OBJECT       *Op,
+    char                    **Temp);
+
+static BOOLEAN
+AcpiDmIsCaseBlock (
+    ACPI_PARSE_OBJECT       *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmProcessSwitch
+ *
+ * PARAMETERS:  Op              - Object to be examined
+ *
+ * RETURN:      ACPI_STATUS
+ *
+ * DESCRIPTION: Walk function to create a list of all temporary (_T_) objects.
+ *              If a While loop is found that can be converted to a Switch, do
+ *              the conversion, remove the temporary name from the list, and
+ *              mark the parse op with an IGNORE flag.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDmProcessSwitch (
+    ACPI_PARSE_OBJECT       *Op)
+{
+    char                    *Temp = NULL;
+    ACPI_PARSE_OBJECT_LIST  *NewTemp;
+    ACPI_PARSE_OBJECT_LIST  *Current;
+    ACPI_PARSE_OBJECT_LIST  *Previous;
+    BOOLEAN                 FoundTemp = FALSE;
+
+
+    switch (Op->Common.AmlOpcode)
+    {
+    case AML_NAME_OP:
+
+        Temp = (char *) (&Op->Named.Name);
+
+        if (!strncmp(Temp, "_T_", 3))
+        {
+            /* Allocate and init a new Temp List node */
+
+            NewTemp = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PARSE_OBJECT_LIST));
+            if (!NewTemp)
+            {
+                return (AE_NO_MEMORY);
+            }
+
+            if (AcpiGbl_TempListHead)
+            {
+                Current = AcpiGbl_TempListHead;
+                AcpiGbl_TempListHead = NewTemp;
+                AcpiGbl_TempListHead->Op = Op;
+                AcpiGbl_TempListHead->Next = Current;
+            }
+            else
+            {
+                AcpiGbl_TempListHead = NewTemp;
+                AcpiGbl_TempListHead->Op = Op;
+                AcpiGbl_TempListHead->Next = NULL;
+            }
+        }
+        break;
+
+    case AML_WHILE_OP:
+
+        if (!AcpiDmIsSwitchBlock (Op, &Temp))
+        {
+            break;
+        }
+
+        /* Found a Switch */
+
+        Op->Common.DisasmOpcode = ACPI_DASM_SWITCH;
+
+        Previous = Current = AcpiGbl_TempListHead;
+        while (Current)
+        {
+            /* Note, if we get here Temp is not NULL */
+
+            if (!strncmp(Temp, (char *) (&Current->Op->Named.Name), 4))
+            {
+                /* Match found. Ignore disassembly */
+
+                Current->Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+                /* Remove from list */
+
+                if (Current == AcpiGbl_TempListHead)
+                {
+                    AcpiGbl_TempListHead = Current->Next;
+                }
+                else
+                {
+                    Previous->Next = Current->Next;
+                }
+
+                Current->Op = NULL;
+                Current->Next = NULL;
+                ACPI_FREE (Current);
+                FoundTemp = TRUE;
+                break;
+            }
+
+            Previous = Current;
+            Current = Current->Next;
+        }
+
+        if (!FoundTemp)
+        {
+            fprintf (stderr,
+                "Warning: Declaration for temp name %.4s not found\n", Temp);
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmClearTempList
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Removes any remaining temporary objects from global list and
+ *              frees
+ *
+ ******************************************************************************/
+
+void
+AcpiDmClearTempList (
+    void)
+{
+    ACPI_PARSE_OBJECT_LIST      *Current;
+
+
+    while (AcpiGbl_TempListHead)
+    {
+        Current = AcpiGbl_TempListHead;
+        AcpiGbl_TempListHead = AcpiGbl_TempListHead->Next;
+        Current->Op = NULL;
+        Current->Next = NULL;
+        ACPI_FREE (Current);
+    }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmIsSwitchBlock
+ *
+ * PARAMETERS:  Op              - While Object
+ *
+ * RETURN:      TRUE if While block can be converted to a Switch/Case block
+ *
+ * DESCRIPTION: Determines if While block is a Switch/Case statement. Modifies
+ *              parse tree to allow for Switch/Case disassembly during walk.
+ *
+ * EXAMPLE: Example of parse tree to be converted
+ *
+ *    While
+ *        One
+ *        Store
+ *            ByteConst
+ *             -NamePath-
+ *        If
+ *            LEqual
+ *                -NamePath-
+ *                Zero
+ *            Return
+ *                One
+ *        Else
+ *            Return
+ *                WordConst
+ *        Break
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiDmIsSwitchBlock (
+    ACPI_PARSE_OBJECT       *Op,
+    char                    **Temp)
+{
+    ACPI_PARSE_OBJECT       *OneOp;
+    ACPI_PARSE_OBJECT       *StoreOp;
+    ACPI_PARSE_OBJECT       *NamePathOp;
+    ACPI_PARSE_OBJECT       *PredicateOp;
+    ACPI_PARSE_OBJECT       *CurrentOp;
+    ACPI_PARSE_OBJECT       *TempOp;
+
+
+    /* Check for One Op Predicate */
+
+    OneOp = AcpiPsGetArg (Op, 0);
+    if (!OneOp || (OneOp->Common.AmlOpcode != AML_ONE_OP))
+    {
+        return (FALSE);
+    }
+
+    /* Check for Store Op */
+
+    StoreOp = OneOp->Common.Next;
+    if (!StoreOp || (StoreOp->Common.AmlOpcode != AML_STORE_OP))
+    {
+        return (FALSE);
+    }
+
+    /* Check for Name Op with _T_ string */
+
+    NamePathOp = AcpiPsGetArg (StoreOp, 1);
+    if (!NamePathOp ||
+        (NamePathOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
+    {
+        return (FALSE);
+    }
+
+    if (strncmp ((char *) (NamePathOp->Common.Value.Name), "_T_", 3))
+    {
+        return (FALSE);
+    }
+
+    *Temp = (char *) (NamePathOp->Common.Value.Name);
+
+    /* This is a Switch/Case control block */
+
+    /* Ignore the One Op Predicate */
+
+    OneOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+    /* Ignore the Store Op, but not the children */
+
+    StoreOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
+
+    /*
+     * First arg of Store Op is the Switch condition.
+     * Mark it as a Switch predicate and as a parameter list for paren
+     * closing and correct indentation.
+     */
+    PredicateOp = AcpiPsGetArg (StoreOp, 0);
+    PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
+    PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
+
+    /* Ignore the Name Op */
+
+    NamePathOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
+
+    /* Remaining opcodes are the Case statements (If/ElseIf's) */
+
+    CurrentOp = StoreOp->Common.Next;
+    while (AcpiDmIsCaseBlock (CurrentOp))
+    {
+        /* Block is a Case structure */
+
+        if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
+        {
+            /* ElseIf */
+
+            CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
+            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+        }
+
+        /* If */
+
+        CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
+
+        /*
+         * Mark the parse tree for Case disassembly. There are two
+         * types of Case statements. The first type of statement begins with
+         * an LEqual. The second starts with an LNot and uses a Match statement
+         * on a Package of constants.
+         */
+        TempOp = AcpiPsGetArg (CurrentOp, 0);
+        switch (TempOp->Common.AmlOpcode)
+        {
+        case (AML_LOGICAL_EQUAL_OP):
+
+            /* Ignore just the LEqual Op */
+
+            TempOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
+
+            /* Ignore the NamePath Op */
+
+            TempOp = AcpiPsGetArg (TempOp, 0);
+            TempOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
+
+            /*
+             * Second arg of LEqual will be the Case predicate.
+             * Mark it as a predicate and also as a parameter list for paren
+             * closing and correct indentation.
+             */
+            PredicateOp = TempOp->Common.Next;
+            PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
+            PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
+            break;
+
+        case (AML_LOGICAL_NOT_OP):
+
+            /*
+             * The Package will be the predicate of the Case statement.
+             * It's under:
+             *            LNOT
+             *                LEQUAL
+             *                    MATCH
+             *                        PACKAGE
+             */
+
+            /* Get the LEqual Op from LNot */
+
+            TempOp = AcpiPsGetArg (TempOp, 0);
+
+            /* Get the Match Op from LEqual */
+
+            TempOp = AcpiPsGetArg (TempOp, 0);
+
+            /* Get the Package Op from Match */
+
+            PredicateOp = AcpiPsGetArg (TempOp, 0);
+
+            /* Mark as parameter list for paren closing */
+
+            PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
+
+            /*
+             * The Package list would be too deeply indented if we
+             * chose to simply ignore the all the parent opcodes, so
+             * we rearrange the parse tree instead.
+             */
+
+            /*
+             * Save the second arg of the If/Else Op which is the
+             * block code of code for this Case statement.
+             */
+            TempOp = AcpiPsGetArg (CurrentOp, 1);
+
+            /*
+             * Move the Package Op to the child (predicate) of the
+             * Case statement.
+             */
+            CurrentOp->Common.Value.Arg = PredicateOp;
+            PredicateOp->Common.Parent = CurrentOp;
+
+            /* Add the block code */
+
+            PredicateOp->Common.Next = TempOp;
+            break;
+
+        default:
+
+            /* Should never get here */
+            break;
+        }
+
+        /* Advance to next Case block */
+
+        CurrentOp = CurrentOp->Common.Next;
+    }
+
+    /* If CurrentOp is now an Else, then this is a Default block */
+
+    if (CurrentOp && CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
+    {
+        CurrentOp->Common.DisasmOpcode = ACPI_DASM_DEFAULT;
+    }
+
+    /*
+     * From the first If advance to the Break op. It's possible to
+     * have an Else (Default) op here when there is only one Case
+     * statement, so check for it.
+     */
+    CurrentOp = StoreOp->Common.Next->Common.Next;
+    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
+    {
+        CurrentOp = CurrentOp->Common.Next;
+    }
+
+    /* Ignore the Break Op */
+
+    CurrentOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+    return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmIsCaseBlock
+ *
+ * PARAMETERS:  Op              - Object to test
+ *
+ * RETURN:      TRUE if Object is beginning of a Case block.
+ *
+ * DESCRIPTION: Determines if an Object is the beginning of a Case block for a
+ *              Switch/Case statement. Parse tree must be one of the following
+ *              forms:
+ *
+ *              Else (Optional)
+ *                  If
+ *                      LEqual
+ *                          -NamePath- _T_x
+ *
+ *              Else (Optional)
+ *                  If
+ *                      LNot
+ *                          LEqual
+ *                              Match
+ *                                  Package
+ *                                      ByteConst
+ *                                      -NamePath- _T_x
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AcpiDmIsCaseBlock (
+    ACPI_PARSE_OBJECT       *Op)
+{
+    ACPI_PARSE_OBJECT       *CurrentOp;
+
+
+    if (!Op)
+    {
+        return (FALSE);
+    }
+
+    /* Look for an If or ElseIf */
+
+    CurrentOp = Op;
+    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
+    {
+        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+        if (!CurrentOp)
+        {
+            return (FALSE);
+        }
+    }
+
+    if (!CurrentOp || CurrentOp->Common.AmlOpcode != AML_IF_OP)
+    {
+        return (FALSE);
+    }
+
+    /* Child must be LEqual or LNot */
+
+    CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+    if (!CurrentOp)
+    {
+        return (FALSE);
+    }
+
+    switch (CurrentOp->Common.AmlOpcode)
+    {
+    case (AML_LOGICAL_EQUAL_OP):
+
+        /* Next child must be NamePath with string _T_ */
+
+        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+        if (!CurrentOp || !CurrentOp->Common.Value.Name ||
+            strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
+        {
+            return (FALSE);
+        }
+        break;
+
+    case (AML_LOGICAL_NOT_OP):
+
+        /* Child of LNot must be LEqual op */
+
+        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+        if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_LOGICAL_EQUAL_OP))
+        {
+            return (FALSE);
+        }
+
+        /* Child of LNot must be Match op */
+
+        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+        if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_MATCH_OP))
+        {
+            return (FALSE);
+        }
+
+        /* First child of Match must be Package op */
+
+        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
+        if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_PACKAGE_OP))
+        {
+            return (FALSE);
+        }
+
+        /* Third child of Match must be NamePath with string _T_ */
+
+        CurrentOp = AcpiPsGetArg (CurrentOp->Common.Parent, 2);
+        if (!CurrentOp || !CurrentOp->Common.Value.Name ||
+            strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
+        {
+            return (FALSE);
+        }
+        break;
+
+    default:
+
+        return (FALSE);
+    }
+
+    return (TRUE);
+}
diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
index 4befd14d..b85bb0c3 100644
--- a/src/acpica/source/common/dmtable.c
+++ b/src/acpica/source/common/dmtable.c
@@ -298,6 +298,7 @@  static const char           *AcpiDmHestSubnames[] =
     "PCI Express/PCI-X Bridge AER",
     "Generic Hardware Error Source",
     "Generic Hardware Error Source V2",
+    "IA-32 Deferred Machine Check",
     "Unknown Subtable Type"         /* Reserved */
 };
 
@@ -314,9 +315,18 @@  static const char           *AcpiDmHestNotifySubnames[] =
     "SEA",                          /* ACPI 6.1 */
     "SEI",                          /* ACPI 6.1 */
     "GSIV",                         /* ACPI 6.1 */
+    "Software Delegated Exception", /* ACPI 6.2 */
     "Unknown Notify Type"           /* Reserved */
 };
 
+static const char           *AcpiDmHmatSubnames[] =
+{
+    "Memory Subystem Address Range",
+    "System Locality Latency and Bandwidth Information",
+    "Memory Side Cache Information",
+    "Unknown Structure Type"         /* Reserved */
+};
+
 static const char           *AcpiDmMadtSubnames[] =
 {
     "Processor Local APIC",             /* ACPI_MADT_TYPE_LOCAL_APIC */
@@ -355,6 +365,8 @@  static const char           *AcpiDmPcctSubnames[] =
     "Generic Communications Subspace",  /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
     "HW-Reduced Comm Subspace",         /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
     "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
+    "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
+    "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
     "Unknown Subtable Type"             /* Reserved */
 };
 
@@ -366,12 +378,21 @@  static const char           *AcpiDmPmttSubnames[] =
     "Unknown Subtable Type"         /* Reserved */
 };
 
+static const char           *AcpiDmPpttSubnames[] =
+{
+    "Processor Hierarchy Node",     /* ACPI_PPTT_TYPE_PROCESSOR */
+    "Cache Type",                   /* ACPI_PPTT_TYPE_CACHE */
+    "ID",                           /* ACPI_PMTT_TYPE_ID  */
+    "Unknown Subtable Type"         /* Reserved */
+};
+
 static const char           *AcpiDmSratSubnames[] =
 {
     "Processor Local APIC/SAPIC Affinity",
     "Memory Affinity",
     "Processor Local x2APIC Affinity",
     "GICC Affinity",
+    "GIC ITS Affinity",             /* Acpi 6.2 */
     "Unknown Subtable Type"         /* Reserved */
 };
 
@@ -452,6 +473,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
     {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
     {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
+    {ACPI_SIG_HMAT, NULL,                   AcpiDmDumpHmat, DtCompileHmat,  TemplateHmat},
     {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
     {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
     {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
@@ -466,6 +488,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
+    {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
     {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
@@ -485,6 +508,7 @@  const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
     {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
     {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
+    {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt,    NULL,           NULL,           TemplateWsmt},
     {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
     {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
     {NULL,          NULL,                   NULL,           NULL,           NULL}
@@ -891,6 +915,7 @@  AcpiDmDumpTable (
         case ACPI_DMT_MADT:
         case ACPI_DMT_PCCT:
         case ACPI_DMT_PMTT:
+        case ACPI_DMT_PPTT:
         case ACPI_DMT_SRAT:
         case ACPI_DMT_ASF:
         case ACPI_DMT_HESTNTYP:
@@ -907,6 +932,7 @@  AcpiDmDumpTable (
         case ACPI_DMT_UINT16:
         case ACPI_DMT_DMAR:
         case ACPI_DMT_HEST:
+        case ACPI_DMT_HMAT:
         case ACPI_DMT_NFIT:
 
             ByteLength = 2;
@@ -1088,6 +1114,31 @@  AcpiDmDumpTable (
             AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
             break;
 
+        case ACPI_DMT_FLAGS4_0:
+
+            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
+            break;
+
+        case ACPI_DMT_FLAGS4_4:
+
+            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
+            break;
+
+        case ACPI_DMT_FLAGS4_8:
+
+            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
+            break;
+
+        case ACPI_DMT_FLAGS4_12:
+
+            AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
+            break;
+
+        case ACPI_DMT_FLAGS16_16:
+
+            AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
+            break;
+
         /* Integer Data Types */
 
         case ACPI_DMT_UINT8:
@@ -1409,6 +1460,20 @@  AcpiDmDumpTable (
                 AcpiDmHestNotifySubnames[Temp8]);
             break;
 
+        case ACPI_DMT_HMAT:
+
+            /* HMAT subtable types */
+
+            Temp16 = *Target;
+            if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
+            {
+                Temp16 = ACPI_HMAT_TYPE_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT16_FORMAT, *Target,
+                AcpiDmHmatSubnames[Temp16]);
+            break;
+
         case ACPI_DMT_IORTMEM:
 
             AcpiOsPrintf (STRING_FORMAT,
@@ -1480,6 +1545,20 @@  AcpiDmDumpTable (
                 AcpiDmPmttSubnames[Temp8]);
             break;
 
+        case ACPI_DMT_PPTT:
+
+            /* PPTT subtable types */
+
+            Temp8 = *Target;
+            if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
+            {
+                Temp8 = ACPI_PPTT_TYPE_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT8_FORMAT, *Target,
+                AcpiDmPpttSubnames[Temp8]);
+            break;
+
         case ACPI_DMT_UNICODE:
 
             if (ByteLength == 0)
diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c
index e9339a8b..9441ca49 100644
--- a/src/acpica/source/common/dmtbdump.c
+++ b/src/acpica/source/common/dmtbdump.c
@@ -1730,6 +1730,14 @@  AcpiDmDumpHest (
             SubTableLength = sizeof (ACPI_HEST_GENERIC_V2);
             break;
 
+        case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
+
+            InfoTable = AcpiDmTableInfoHest11;
+            SubTableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
+            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
+                SubTable))->NumHardwareBanks;
+            break;
+
         default:
 
             /* Cannot continue on unknown type - no length */
@@ -1784,6 +1792,203 @@  AcpiDmDumpHest (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiDmDumpHmat
+ *
+ * PARAMETERS:  Table               - A HMAT table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a HMAT.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpHmat (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_HMAT_STRUCTURE     *HmatStruct;
+    ACPI_HMAT_LOCALITY      *HmatLocality;
+    ACPI_HMAT_CACHE         *HmatCache;
+    UINT32                  Offset;
+    UINT32                  SubTableOffset;
+    UINT32                  Length;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    UINT32                  i, j;
+
+
+    /* Main table */
+
+    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+    Offset = sizeof (ACPI_TABLE_HMAT);
+
+    while (Offset < Table->Length)
+    {
+        AcpiOsPrintf ("\n");
+        SubTableOffset = 0;
+
+        /* Dump HMAT structure header */
+
+        HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
+        if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
+        {
+            AcpiOsPrintf ("Invalid HMAT structure length\n");
+            return;
+        }
+        Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
+            HmatStruct->Length, AcpiDmTableInfoHmatHdr);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        switch (HmatStruct->Type)
+        {
+        case ACPI_HMAT_TYPE_ADDRESS_RANGE:
+
+            InfoTable = AcpiDmTableInfoHmat0;
+            Length = sizeof (ACPI_HMAT_ADDRESS_RANGE);
+            break;
+
+        case ACPI_HMAT_TYPE_LOCALITY:
+
+            InfoTable = AcpiDmTableInfoHmat1;
+            Length = sizeof (ACPI_HMAT_LOCALITY);
+            break;
+
+        case ACPI_HMAT_TYPE_CACHE:
+
+            InfoTable = AcpiDmTableInfoHmat2;
+            Length = sizeof (ACPI_HMAT_CACHE);
+            break;
+
+        default:
+
+            AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
+                HmatStruct->Type);
+
+            /* Attempt to continue */
+
+            goto NextSubTable;
+        }
+
+        /* Dump HMAT structure body */
+
+        if (HmatStruct->Length < Length)
+        {
+            AcpiOsPrintf ("Invalid HMAT structure length\n");
+            return;
+        }
+        Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
+            HmatStruct->Length, InfoTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        /* Dump HMAT structure additionals */
+
+        switch (HmatStruct->Type)
+        {
+        case ACPI_HMAT_TYPE_LOCALITY:
+
+            HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
+            SubTableOffset = sizeof (ACPI_HMAT_LOCALITY);
+
+            /* Dump initiator proximity domains */
+
+            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+                (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
+            {
+                AcpiOsPrintf ("Invalid initiator proximity domain number\n");
+                return;
+            }
+            for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
+            {
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
+                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                    4, AcpiDmTableInfoHmat1a);
+                SubTableOffset += 4;
+            }
+
+            /* Dump target proximity domains */
+
+            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+                (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
+            {
+                AcpiOsPrintf ("Invalid target proximity domain number\n");
+                return;
+            }
+            for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
+            {
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
+                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                    4, AcpiDmTableInfoHmat1b);
+                SubTableOffset += 4;
+            }
+
+            /* Dump latency/bandwidth entris */
+
+            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+                (UINT32)(HmatLocality->NumberOfInitiatorPDs *
+                         HmatLocality->NumberOfTargetPDs * 2))
+            {
+                AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
+                return;
+            }
+            for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
+            {
+                for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
+                {
+                    Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
+                        ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                        2, AcpiDmTableInfoHmat1c);
+                    SubTableOffset += 2;
+                }
+            }
+            break;
+
+        case ACPI_HMAT_TYPE_CACHE:
+
+            HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
+            SubTableOffset = sizeof (ACPI_HMAT_CACHE);
+
+            /* Dump SMBIOS handles */
+
+            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+                (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
+            {
+                AcpiOsPrintf ("Invalid SMBIOS handle number\n");
+                return;
+            }
+            for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
+            {
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
+                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                    2, AcpiDmTableInfoHmat2a);
+                SubTableOffset += 2;
+            }
+            break;
+
+        default:
+
+            break;
+        }
+
+NextSubTable:
+        /* Point to next HMAT structure subtable */
+
+        Offset += (HmatStruct->Length);
+    }
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiDmDumpIort
  *
  * PARAMETERS:  Table               - A IORT table
@@ -3010,6 +3215,16 @@  AcpiDmDumpPcct (
             InfoTable = AcpiDmTableInfoPcct2;
             break;
 
+        case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
+
+            InfoTable = AcpiDmTableInfoPcct3;
+            break;
+
+        case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
+
+            InfoTable = AcpiDmTableInfoPcct4;
+            break;
+
         default:
 
             AcpiOsPrintf (
@@ -3242,6 +3457,136 @@  AcpiDmDumpPmtt (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiDmDumpPptt
+ *
+ * PARAMETERS:  Table               - A PMTT table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a PPTT. This table type consists
+ *              of an open-ended number of subtables.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpPptt (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_SUBTABLE_HEADER    *SubTable;
+    ACPI_PPTT_PROCESSOR     *PpttProcessor;
+    UINT8                   Length;
+    UINT8                   SubTableOffset;
+    UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
+    ACPI_DMTABLE_INFO       *InfoTable;
+    UINT32                  i;
+
+
+    /* There is no main table (other than the standard ACPI header) */
+
+    /* Subtables */
+
+    Offset = sizeof (ACPI_TABLE_HEADER);
+    while (Offset < Table->Length)
+    {
+        AcpiOsPrintf ("\n");
+
+        /* Common subtable header */
+
+        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+        if (SubTable->Length < sizeof (ACPI_SUBTABLE_HEADER))
+        {
+            AcpiOsPrintf ("Invalid subtable length\n");
+            return;
+        }
+        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+            SubTable->Length, AcpiDmTableInfoPpttHdr);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        switch (SubTable->Type)
+        {
+        case ACPI_PPTT_TYPE_PROCESSOR:
+
+            InfoTable = AcpiDmTableInfoPptt0;
+            Length = sizeof (ACPI_PPTT_PROCESSOR);
+            break;
+
+        case ACPI_PPTT_TYPE_CACHE:
+
+            InfoTable = AcpiDmTableInfoPptt1;
+            Length = sizeof (ACPI_PPTT_CACHE);
+            break;
+
+        case ACPI_PPTT_TYPE_ID:
+
+            InfoTable = AcpiDmTableInfoPptt2;
+            Length = sizeof (ACPI_PPTT_ID);
+            break;
+
+        default:
+
+            AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
+                SubTable->Type);
+
+            /* Attempt to continue */
+
+            goto NextSubTable;
+        }
+
+        if (SubTable->Length < Length)
+        {
+            AcpiOsPrintf ("Invalid subtable length\n");
+            return;
+        }
+        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+            SubTable->Length, InfoTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+        SubTableOffset = Length;
+
+        switch (SubTable->Type)
+        {
+        case ACPI_PPTT_TYPE_PROCESSOR:
+
+            PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, SubTable);
+
+            /* Dump SMBIOS handles */
+
+            if ((UINT8)(SubTable->Length - SubTableOffset) <
+                (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
+            {
+                AcpiOsPrintf ("Invalid private resource number\n");
+                return;
+            }
+            for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
+            {
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
+                    ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTableOffset),
+                    4, AcpiDmTableInfoPptt0a);
+                SubTableOffset += 4;
+            }
+            break;
+
+        default:
+
+            break;
+        }
+
+NextSubTable:
+        /* Point to next subtable */
+
+        Offset += SubTable->Length;
+    }
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiDmDumpS3pt
  *
  * PARAMETERS:  Table               - A S3PT table
@@ -3498,6 +3843,11 @@  AcpiDmDumpSrat (
             InfoTable = AcpiDmTableInfoSrat3;
             break;
 
+        case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
+
+            InfoTable = AcpiDmTableInfoSrat4;
+            break;
+
         default:
             AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
                 SubTable->Type);
diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
index 4d272678..692763fd 100644
--- a/src/acpica/source/common/dmtbinfo.c
+++ b/src/acpica/source/common/dmtbinfo.c
@@ -204,6 +204,7 @@ 
 #define ACPI_GTDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_GTDT,f)
 #define ACPI_HEST_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_HEST,f)
 #define ACPI_HPET_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_HPET,f)
+#define ACPI_HMAT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_HMAT,f)
 #define ACPI_IORT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_IORT,f)
 #define ACPI_IVRS_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_IVRS,f)
 #define ACPI_MADT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_MADT,f)
@@ -230,6 +231,7 @@ 
 #define ACPI_WDDT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDDT,f)
 #define ACPI_WDRT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WDRT,f)
 #define ACPI_WPBT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WPBT,f)
+#define ACPI_WSMT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_WSMT,f)
 #define ACPI_XENV_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_XENV,f)
 
 /* Subtables */
@@ -273,8 +275,13 @@ 
 #define ACPI_HEST8_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_AER_BRIDGE,f)
 #define ACPI_HEST9_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_GENERIC,f)
 #define ACPI_HEST10_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_HEST_GENERIC_V2,f)
+#define ACPI_HEST11_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_HEST_IA_DEFERRED_CHECK,f)
 #define ACPI_HESTN_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_NOTIFY,f)
 #define ACPI_HESTB_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HEST_IA_ERROR_BANK,f)
+#define ACPI_HMAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_ADDRESS_RANGE,f)
+#define ACPI_HMAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_LOCALITY,f)
+#define ACPI_HMAT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_CACHE,f)
+#define ACPI_HMATH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_HMAT_STRUCTURE,f)
 #define ACPI_IORT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ITS_GROUP,f)
 #define ACPI_IORT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT,f)
 #define ACPI_IORT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_IORT_ROOT_COMPLEX,f)
@@ -329,11 +336,17 @@ 
 #define ACPI_PCCT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_SUBSPACE,f)
 #define ACPI_PCCT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED,f)
 #define ACPI_PCCT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f)
+#define ACPI_PCCT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f)
+#define ACPI_PCCT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f)
 #define ACPI_PMTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_SOCKET,f)
 #define ACPI_PMTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_CONTROLLER,f)
 #define ACPI_PMTT1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f)
 #define ACPI_PMTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_PHYSICAL_COMPONENT,f)
 #define ACPI_PMTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PMTT_HEADER,f)
+#define ACPI_PPTTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
+#define ACPI_PPTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_PROCESSOR,f)
+#define ACPI_PPTT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_CACHE,f)
+#define ACPI_PPTT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PPTT_ID,f)
 #define ACPI_S3PTH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
 #define ACPI_S3PT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
 #define ACPI_S3PT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
@@ -343,6 +356,7 @@ 
 #define ACPI_SRAT1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_MEM_AFFINITY,f)
 #define ACPI_SRAT2_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f)
 #define ACPI_SRAT3_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_GICC_AFFINITY,f)
+#define ACPI_SRAT4_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_GIC_ITS_AFFINITY,f)
 #define ACPI_TCPA_CLIENT_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_CLIENT,f)
 #define ACPI_TCPA_SERVER_OFFSET(f)      (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f)
 #define ACPI_VRTC0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f)
@@ -355,11 +369,14 @@ 
 
 /* Flags */
 
+#define ACPI_BGRT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_BGRT,f,o)
 #define ACPI_DRTM_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_DRTM,f,o)
 #define ACPI_DRTM1a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_DRTM_RESOURCE,f,o)
 #define ACPI_FADT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_FADT,f,o)
 #define ACPI_FACS_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_FACS,f,o)
 #define ACPI_HPET_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_HPET,f,o)
+#define ACPI_PPTT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_PROCESSOR,f,o)
+#define ACPI_PPTT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PPTT_CACHE,f,o)
 #define ACPI_SRAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_CPU_AFFINITY,f,o)
 #define ACPI_SRAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_MEM_AFFINITY,f,o)
 #define ACPI_SRAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SRAT_X2APIC_CPU_AFFINITY,f,o)
@@ -367,6 +384,9 @@ 
 #define ACPI_GTDT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_GTDT,f,o)
 #define ACPI_GTDT0a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_GTDT_TIMER_ENTRY,f,o)
 #define ACPI_GTDT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_GTDT_WATCHDOG,f,o)
+#define ACPI_HMAT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HMAT_ADDRESS_RANGE,f,o)
+#define ACPI_HMAT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HMAT_LOCALITY,f,o)
+#define ACPI_HMAT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HMAT_CACHE,f,o)
 #define ACPI_IORT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU,f,o)
 #define ACPI_IORT3a_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_GSI,f,o)
 #define ACPI_IORT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_IORT_SMMU_V3,f,o)
@@ -392,13 +412,17 @@ 
 #define ACPI_PCCT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_PCCT,f,o)
 #define ACPI_PCCT1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED,f,o)
 #define ACPI_PCCT2_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f,o)
+#define ACPI_PCCT3_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f,o)
+#define ACPI_PCCT4_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f,o)
 #define ACPI_PMTTH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PMTT_HEADER,f,o)
 #define ACPI_WDDT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_WDDT,f,o)
+#define ACPI_WSMT_FLAG_OFFSET(f,o)      ACPI_FLAG_OFFSET (ACPI_TABLE_WSMT,f,o)
 #define ACPI_EINJ0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_WHEA_HEADER,f,o)
 #define ACPI_ERST0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_WHEA_HEADER,f,o)
 #define ACPI_HEST0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HEST_IA_MACHINE_CHECK,f,o)
 #define ACPI_HEST1_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HEST_IA_CORRECTED,f,o)
 #define ACPI_HEST6_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_HEST_AER_ROOT,f,o)
+#define ACPI_HEST11_FLAG_OFFSET(f,o)    ACPI_FLAG_OFFSET (ACPI_HEST_IA_DEFERRED_CHECK,f,o)
 
 /*
  * Required terminator for all tables below
@@ -780,7 +804,10 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoBert[] =
 ACPI_DMTABLE_INFO           AcpiDmTableInfoBgrt[] =
 {
     {ACPI_DMT_UINT16,   ACPI_BGRT_OFFSET (Version),                 "Version", 0},
-    {ACPI_DMT_UINT8,    ACPI_BGRT_OFFSET (Status),                  "Status", 0},
+    {ACPI_DMT_UINT8,    ACPI_BGRT_OFFSET (Status),                  "Status (decoded below)", DT_FLAG},
+    {ACPI_DMT_FLAG0,    ACPI_BGRT_FLAG_OFFSET (Status, 0),          "Displayed", 0},
+    {ACPI_DMT_FLAGS1,   ACPI_BGRT_FLAG_OFFSET (Status, 0),          "Orientation Offset", 0},
+
     {ACPI_DMT_UINT8,    ACPI_BGRT_OFFSET (ImageType),               "Image Type", 0},
     {ACPI_DMT_UINT64,   ACPI_BGRT_OFFSET (ImageAddress),            "Image Address", 0},
     {ACPI_DMT_UINT32,   ACPI_BGRT_OFFSET (ImageOffsetX),            "Image OffsetX", 0},
@@ -1349,6 +1376,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoHest[] =
     {ACPI_DMT_UINT16,   ACPI_HEST6_OFFSET (Aer.Reserved1),              "Reserved", 0}, \
     {ACPI_DMT_UINT8,    ACPI_HEST6_OFFSET (Aer.Flags),                  "Flags (decoded below)", DT_FLAG}, \
     {ACPI_DMT_FLAG0,    ACPI_HEST6_FLAG_OFFSET (Aer.Flags,0),           "Firmware First", 0}, \
+    {ACPI_DMT_FLAG0,    ACPI_HEST6_FLAG_OFFSET (Aer.Flags,0),           "Global", 0}, \
     {ACPI_DMT_UINT8,    ACPI_HEST6_OFFSET (Aer.Enabled),                "Enabled", 0}, \
     {ACPI_DMT_UINT32,   ACPI_HEST6_OFFSET (Aer.RecordsToPreallocate),   "Records To Preallocate", 0}, \
     {ACPI_DMT_UINT32,   ACPI_HEST6_OFFSET (Aer.MaxSectionsPerRecord),   "Max Sections Per Record", 0}, \
@@ -1373,6 +1401,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoHest0[] =
     {ACPI_DMT_UINT16,   ACPI_HEST0_OFFSET (Reserved1),              "Reserved1", 0},
     {ACPI_DMT_UINT8,    ACPI_HEST0_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
     {ACPI_DMT_FLAG0,    ACPI_HEST0_FLAG_OFFSET (Flags,0),           "Firmware First", 0},
+    {ACPI_DMT_FLAG2,    ACPI_HEST0_FLAG_OFFSET (Flags,0),           "GHES Assist", 0},
 
     {ACPI_DMT_UINT8,    ACPI_HEST0_OFFSET (Enabled),                "Enabled", 0},
     {ACPI_DMT_UINT32,   ACPI_HEST0_OFFSET (RecordsToPreallocate),   "Records To Preallocate", 0},
@@ -1392,6 +1421,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoHest1[] =
     {ACPI_DMT_UINT16,   ACPI_HEST1_OFFSET (Reserved1),              "Reserved1", 0},
     {ACPI_DMT_UINT8,    ACPI_HEST1_OFFSET (Flags),                  "Flags (decoded below)", DT_FLAG},
     {ACPI_DMT_FLAG0,    ACPI_HEST1_FLAG_OFFSET (Flags,0),           "Firmware First", 0},
+    {ACPI_DMT_FLAG2,    ACPI_HEST1_FLAG_OFFSET (Flags,0),           "GHES Assist", 0},
 
     {ACPI_DMT_UINT8,    ACPI_HEST1_OFFSET (Enabled),                "Enabled", 0},
     {ACPI_DMT_UINT32,   ACPI_HEST1_OFFSET (RecordsToPreallocate),   "Records To Preallocate", 0},
@@ -1482,6 +1512,27 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoHest10[] =
     ACPI_DMT_TERMINATOR
 };
 
+/* 11: IA32 Deferred Machine Check */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHest11[] =
+{
+    ACPI_DM_HEST_HEADER,
+    {ACPI_DMT_UINT16,   ACPI_HEST11_OFFSET (Reserved1),             "Reserved1", 0},
+    {ACPI_DMT_UINT8,    ACPI_HEST11_OFFSET (Flags),                 "Flags (decoded below)", DT_FLAG},
+    {ACPI_DMT_FLAG0,    ACPI_HEST11_FLAG_OFFSET (Flags,0),          "Firmware First", 0},
+    {ACPI_DMT_FLAG2,    ACPI_HEST11_FLAG_OFFSET (Flags,0),          "GHES Assist", 0},
+
+    {ACPI_DMT_UINT8,    ACPI_HEST11_OFFSET (Enabled),               "Enabled", 0},
+    {ACPI_DMT_UINT32,   ACPI_HEST11_OFFSET (RecordsToPreallocate),  "Records To Preallocate", 0},
+    {ACPI_DMT_UINT32,   ACPI_HEST11_OFFSET (MaxSectionsPerRecord),  "Max Sections Per Record", 0},
+    {ACPI_DMT_HESTNTFY, ACPI_HEST11_OFFSET (Notify),                "Notify", 0},
+    {ACPI_DMT_UINT8,    ACPI_HEST11_OFFSET (NumHardwareBanks),      "Num Hardware Banks", 0},
+    {ACPI_DMT_UINT24,   ACPI_HEST11_OFFSET (Reserved2[0]),          "Reserved2", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Notification Structure */
+
 ACPI_DMTABLE_INFO           AcpiDmTableInfoHestNotify[] =
 {
     {ACPI_DMT_HESTNTYP, ACPI_HESTN_OFFSET (Type),                   "Notify Type", 0},
@@ -1537,6 +1588,105 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoHpet[] =
 
 /*******************************************************************************
  *
+ * HMAT - Heterogeneous Memory Attributes Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_HMAT_OFFSET (Reserved),                "Reserved", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Common HMAT structure header (one per Subtable) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmatHdr[] =
+{
+    {ACPI_DMT_HMAT,     ACPI_HMATH_OFFSET (Type),                   "Structure Type", 0},
+    {ACPI_DMT_UINT16,   ACPI_HMATH_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMATH_OFFSET (Length),                 "Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* HMAT subtables */
+
+/* 0x00: Memory Subsystem Address Range */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat0[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_HMAT0_OFFSET (Flags),                  "Flags (decoded below)", 0},
+    {ACPI_DMT_FLAG0,    ACPI_HMAT0_FLAG_OFFSET (Flags,0),           "Processor Proximity Domain Valid", 0},
+    {ACPI_DMT_FLAG1,    ACPI_HMAT0_FLAG_OFFSET (Flags,0),           "Memory Proximity Domain Valid", 0},
+    {ACPI_DMT_FLAG2,    ACPI_HMAT0_FLAG_OFFSET (Flags,0),           "Reservation Hint", 0},
+    {ACPI_DMT_UINT16,   ACPI_HMAT0_OFFSET (Reserved1),              "Reserved1", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMAT0_OFFSET (ProcessorPD),            "Processor Proximity Domain", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMAT0_OFFSET (MemoryPD),               "Memory Proximity Domain", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMAT0_OFFSET (Reserved2),              "Reserved2", 0},
+    {ACPI_DMT_UINT64,   ACPI_HMAT0_OFFSET (PhysicalAddressBase),    "Physical Address Range Base", 0},
+    {ACPI_DMT_UINT64,   ACPI_HMAT0_OFFSET (PhysicalAddressLength),  "Physical Address Range Size", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0x01: System Locality Latency and Bandwidth Information */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1[] =
+{
+    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (Flags),                  "Flags (decoded below)", 0},
+    {ACPI_DMT_FLAGS4_0, ACPI_HMAT1_FLAG_OFFSET (Flags,0),           "Memory Hierarchy", 0},
+    {ACPI_DMT_UINT8,    ACPI_HMAT1_OFFSET (DataType),               "Data Type", 0},
+    {ACPI_DMT_UINT16,   ACPI_HMAT1_OFFSET (Reserved1),              "Reserved1", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfInitiatorPDs),   "Initiator Proximity Domains #", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (NumberOfTargetPDs),      "Target Proximity Domains #", 0},
+    {ACPI_DMT_UINT32,   ACPI_HMAT1_OFFSET (Reserved2),              "Reserved2", 0},
+    {ACPI_DMT_UINT64,   ACPI_HMAT1_OFFSET (EntryBaseUnit),          "Entry Base Unit", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1a[] =
+{
+    {ACPI_DMT_UINT32,   0,                                          "Initiator Proximity Domain List", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1b[] =
+{
+    {ACPI_DMT_UINT32,   0,                                          "Target Proximity Domain List", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat1c[] =
+{
+    {ACPI_DMT_UINT16,   0,                                          "Entry", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0x02: Memory Side Cache Information */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat2[] =
+{
+    {ACPI_DMT_UINT32,       ACPI_HMAT2_OFFSET (MemoryPD),               "Memory Proximity Domain", 0},
+    {ACPI_DMT_UINT32,       ACPI_HMAT2_OFFSET (Reserved1),              "Reserved1", 0},
+    {ACPI_DMT_UINT64,       ACPI_HMAT2_OFFSET (CacheSize),              "Memory Side Cache Size", 0},
+    {ACPI_DMT_UINT32,       ACPI_HMAT2_OFFSET (CacheAttributes),        "Cache Attributes (decoded below)", 0},
+    {ACPI_DMT_FLAGS4_0,     ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Total Cache Levels", 0},
+    {ACPI_DMT_FLAGS4_4,     ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Cache Level", 0},
+    {ACPI_DMT_FLAGS4_8,     ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Cache Associativity", 0},
+    {ACPI_DMT_FLAGS4_12,    ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Write Policy", 0},
+    {ACPI_DMT_FLAGS16_16,   ACPI_HMAT2_FLAG_OFFSET (CacheAttributes,0), "Cache Line Size", 0},
+    {ACPI_DMT_UINT16,       ACPI_HMAT2_OFFSET (Reserved2),              "Reserved2", 0},
+    {ACPI_DMT_UINT16,       ACPI_HMAT2_OFFSET (NumberOfSMBIOSHandles),  "SMBIOS Handle #", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoHmat2a[] =
+{
+    {ACPI_DMT_UINT16,   0,                                          "SMBIOS Handle", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+
+/*******************************************************************************
+ *
  * IORT - IO Remapping Table
  *
  ******************************************************************************/
@@ -2406,7 +2556,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoNfit6a[] =
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct[] =
 {
     {ACPI_DMT_UINT32,   ACPI_PCCT_OFFSET (Flags),                   "Flags (decoded below)", DT_FLAG},
-    {ACPI_DMT_FLAG0,    ACPI_PCCT_FLAG_OFFSET (Flags,0),            "Doorbell", 0},
+    {ACPI_DMT_FLAG0,    ACPI_PCCT_FLAG_OFFSET (Flags,0),            "Platform", 0},
     {ACPI_DMT_UINT64,   ACPI_PCCT_OFFSET (Reserved),                "Reserved", 0},
     ACPI_DMT_TERMINATOR
 };
@@ -2440,7 +2590,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct0[] =
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct1[] =
 {
-    {ACPI_DMT_UINT32,   ACPI_PCCT1_OFFSET (DoorbellInterrupt),      "Doorbell Interrupt", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT1_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
     {ACPI_DMT_UINT8,    ACPI_PCCT1_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
     {ACPI_DMT_FLAG0,    ACPI_PCCT1_FLAG_OFFSET (Flags,0),           "Polarity", 0},
     {ACPI_DMT_FLAG1,    ACPI_PCCT1_FLAG_OFFSET (Flags,0),           "Mode", 0},
@@ -2460,7 +2610,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct1[] =
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct2[] =
 {
-    {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (DoorbellInterrupt),      "Doorbell Interrupt", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
     {ACPI_DMT_UINT8,    ACPI_PCCT2_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
     {ACPI_DMT_FLAG0,    ACPI_PCCT2_FLAG_OFFSET (Flags,0),           "Polarity", 0},
     {ACPI_DMT_FLAG1,    ACPI_PCCT2_FLAG_OFFSET (Flags,0),           "Mode", 0},
@@ -2473,12 +2623,73 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct2[] =
     {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (Latency),                "Command Latency", 0},
     {ACPI_DMT_UINT32,   ACPI_PCCT2_OFFSET (MaxAccessRate),          "Maximum Access Rate", 0},
     {ACPI_DMT_UINT16,   ACPI_PCCT2_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
-    {ACPI_DMT_GAS,      ACPI_PCCT2_OFFSET (DoorbellAckRegister),    "Doorbell ACK Register", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT2_OFFSET (PlatformAckRegister),    "Platform ACK Register", 0},
     {ACPI_DMT_UINT64,   ACPI_PCCT2_OFFSET (AckPreserveMask),        "ACK Preserve Mask", 0},
     {ACPI_DMT_UINT64,   ACPI_PCCT2_OFFSET (AckWriteMask),           "ACK Write Mask", 0},
     ACPI_DMT_TERMINATOR
 };
 
+/* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct3[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
+    {ACPI_DMT_UINT8,    ACPI_PCCT3_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
+    {ACPI_DMT_FLAG0,    ACPI_PCCT3_FLAG_OFFSET (Flags,0),           "Polarity", 0},
+    {ACPI_DMT_FLAG1,    ACPI_PCCT3_FLAG_OFFSET (Flags,0),           "Mode", 0},
+    {ACPI_DMT_UINT8,    ACPI_PCCT3_OFFSET (Reserved1),              "Reserved", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (BaseAddress),            "Base Address", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (Length),                 "Address Length", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (PreserveMask),           "Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (WriteMask),              "Write Mask", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (Latency),                "Command Latency", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (MaxAccessRate),          "Maximum Access Rate", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT3_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (PlatformAckRegister),    "Platform ACK Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (AckPreserveMask),        "ACK Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (AckSetMask),             "ACK Set Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (Reserved2),              "Reserved", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (CmdUpdateRegister),      "Command Update Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (CmdUpdatePreserveMask),  "Command Update Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (CmdUpdateSetMask),       "Command Update Set Mask", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT3_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT3_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct4[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (PlatformInterrupt),      "Platform Interrupt", 0},
+    {ACPI_DMT_UINT8,    ACPI_PCCT4_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
+    {ACPI_DMT_FLAG0,    ACPI_PCCT4_FLAG_OFFSET (Flags,0),           "Polarity", 0},
+    {ACPI_DMT_FLAG1,    ACPI_PCCT4_FLAG_OFFSET (Flags,0),           "Mode", 0},
+    {ACPI_DMT_UINT8,    ACPI_PCCT4_OFFSET (Reserved1),              "Reserved", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (BaseAddress),            "Base Address", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (Length),                 "Address Length", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (DoorbellRegister),       "Doorbell Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (PreserveMask),           "Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (WriteMask),              "Write Mask", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (Latency),                "Command Latency", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (MaxAccessRate),          "Maximum Access Rate", 0},
+    {ACPI_DMT_UINT32,   ACPI_PCCT4_OFFSET (MinTurnaroundTime),      "Minimum Turnaround Time", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (PlatformAckRegister),    "Platform ACK Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (AckPreserveMask),        "ACK Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (AckSetMask),             "ACK Set Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (Reserved2),              "Reserved", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (CmdCompleteRegister),    "Command Complete Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (CmdCompleteMask),        "Command Complete Check Mask", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (CmdUpdateRegister),      "Command Update Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (CmdUpdatePreserveMask),  "Command Update Preserve Mask", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (CmdUpdateSetMask),       "Command Update Set Mask", 0},
+    {ACPI_DMT_GAS,      ACPI_PCCT4_OFFSET (ErrorStatusRegister),    "Error Status Register", 0},
+    {ACPI_DMT_UINT64,   ACPI_PCCT4_OFFSET (ErrorStatusMask),        "Error Status Mask", 0},
+    ACPI_DMT_TERMINATOR
+};
 
 /*******************************************************************************
  *
@@ -2555,6 +2766,82 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
 
 /*******************************************************************************
  *
+ * PPTT - Processor Properties Topology Table (ACPI 6.2)
+ *
+ ******************************************************************************/
+
+/* Main table consists of only the standard ACPI header - subtables follow */
+
+/* Common Subtable header (one per Subtable) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPpttHdr[] =
+{
+    {ACPI_DMT_PPTT,     ACPI_PPTTH_OFFSET (Type),                   "Subtable Type", 0},
+    {ACPI_DMT_UINT8,    ACPI_PPTTH_OFFSET (Length),                 "Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 0: Processor hierarchy node */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt0[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_PPTT0_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (Flags),                  "Flags", 0},
+    {ACPI_DMT_FLAG0,    ACPI_PPTT0_FLAG_OFFSET (Flags,0),           "Physical package", 0},
+    {ACPI_DMT_FLAG1,    ACPI_PPTT0_FLAG_OFFSET (Flags,0),           "ACPI Processor ID valid", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (Parent),                 "Parent", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (AcpiProcessorId),        "ACPI Processor ID", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (NumberOfPrivResources),  "Private Resource Number", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt0a[] =
+{
+    {ACPI_DMT_UINT32,   0,                                          "Private Resource", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 1: Cache type */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_PPTT1_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Flags),                  "Flags", 0},
+    {ACPI_DMT_FLAG0,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Size valid", 0},
+    {ACPI_DMT_FLAG1,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Number of Sets valid", 0},
+    {ACPI_DMT_FLAG2,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Associativity valid", 0},
+    {ACPI_DMT_FLAG3,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Allocation Type valid", 0},
+    {ACPI_DMT_FLAG4,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Cache Type valid", 0},
+    {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Write Policy valid", 0},
+    {ACPI_DMT_FLAG5,    ACPI_PPTT1_FLAG_OFFSET (Flags,0),           "Line Size valid", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NextLevelOfCache),       "Next Level of Cache", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Size),                   "Size", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (NumberOfSets),           "Number of Sets", 0},
+    {ACPI_DMT_UINT8,    ACPI_PPTT1_OFFSET (Associativity),          "Associativity", 0},
+    {ACPI_DMT_UINT8,    ACPI_PPTT1_OFFSET (Attributes),             "Attributes", 0},
+    {ACPI_DMT_FLAGS0,   ACPI_PPTT1_OFFSET (Attributes),             "Allocation Type", 0},
+    {ACPI_DMT_FLAGS2,   ACPI_PPTT1_OFFSET (Attributes),             "Cache Type", 0},
+    {ACPI_DMT_FLAG4,    ACPI_PPTT1_OFFSET (Attributes),             "Write Policy", 0},
+    {ACPI_DMT_UINT16,   ACPI_PPTT1_OFFSET (LineSize),               "Line Size", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 2: ID */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt2[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT2_OFFSET (VendorId),               "VENDOR_ID", 0},
+    {ACPI_DMT_UINT64,   ACPI_PPTT2_OFFSET (Level1Id),               "LEVEL_1_ID", 0},
+    {ACPI_DMT_UINT64,   ACPI_PPTT2_OFFSET (Level2Id),               "LEVEL_2_ID", 0},
+    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (MajorRev),               "MAJOR_REV", 0},
+    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (MinorRev),               "MINOR_REV", 0},
+    {ACPI_DMT_UINT16,   ACPI_PPTT2_OFFSET (SpinRev),                "SPIN_REV", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/*******************************************************************************
+ *
  * RASF -  RAS Feature table
  *
  ******************************************************************************/
@@ -2779,7 +3066,7 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat2[] =
     ACPI_DMT_TERMINATOR
 };
 
-/* : GICC Affinity (ACPI 5.1) */
+/* 3: GICC Affinity (ACPI 5.1) */
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat3[] =
 {
@@ -2791,6 +3078,16 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat3[] =
     ACPI_DMT_TERMINATOR
 };
 
+/* 4: GCC ITS Affinity (ACPI 6.2) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSrat4[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_SRAT4_OFFSET (ProximityDomain),        "Proximity Domain", 0},
+    {ACPI_DMT_UINT16,   ACPI_SRAT4_OFFSET (Reserved),               "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_SRAT4_OFFSET (ItsId),                  "ITS ID", 0},
+    ACPI_DMT_TERMINATOR
+};
+
 
 /*******************************************************************************
  *
@@ -3058,6 +3355,22 @@  ACPI_DMTABLE_INFO           AcpiDmTableInfoWpbt0[] =
 
 /*******************************************************************************
  *
+ * WSMT - Windows SMM Security Migrations Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoWsmt[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_WSMT_OFFSET (ProtectionFlags),         "Protection Flags", 0},
+    {ACPI_DMT_FLAG0,    ACPI_WSMT_FLAG_OFFSET (ProtectionFlags,0),  "FIXED_COMM_BUFFERS", 0},
+    {ACPI_DMT_FLAG1,    ACPI_WSMT_FLAG_OFFSET (ProtectionFlags,0),  "COMM_BUFFER_NESTED_PTR_PROTECTION", 0},
+    {ACPI_DMT_FLAG2,    ACPI_WSMT_FLAG_OFFSET (ProtectionFlags,0),  "SYSTEM_RESOURCE_PROTECTION", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+
+/*******************************************************************************
+ *
  * XENV -  Xen Environment table (ACPI 6.0)
  *
  ******************************************************************************/
diff --git a/src/acpica/source/compiler/Makefile.am b/src/acpica/source/compiler/Makefile.am
index ba5fe773..382fc07d 100644
--- a/src/acpica/source/compiler/Makefile.am
+++ b/src/acpica/source/compiler/Makefile.am
@@ -235,6 +235,7 @@  libfwtsiasl_la_SOURCES = 			\
 	../common/cmfsize.c			\
 	../common/dmextern.c 			\
 	../common/dmrestag.c 			\
+	../common/dmswitch.c			\
 	../common/dmtable.c 			\
 	../common/dmtables.c			\
 	../common/dmtbinfo.c 			\
diff --git a/src/acpica/source/compiler/aslascii.c b/src/acpica/source/compiler/aslascii.c
index afaee56f..18bcd28f 100644
--- a/src/acpica/source/compiler/aslascii.c
+++ b/src/acpica/source/compiler/aslascii.c
@@ -194,7 +194,7 @@  FlIsFileAsciiSource (
     BOOLEAN                 DisplayErrors)
 {
     UINT8                   Byte;
-    ACPI_SIZE               BadBytes = 0;
+    UINT32                  BadBytes = 0;
     BOOLEAN                 OpeningComment = FALSE;
     ASL_FILE_STATUS         Status;
     FILE                    *Handle;
@@ -285,6 +285,9 @@  FlIsFileAsciiSource (
 
     if (BadBytes)
     {
+        fprintf (stderr,
+            "File appears to be binary: found %u non-ASCII characters, disassembling\n",
+            BadBytes);
         if (DisplayErrors)
         {
             AcpiOsPrintf (
diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
index 9c2a244a..181fc364 100644
--- a/src/acpica/source/compiler/aslcompile.c
+++ b/src/acpica/source/compiler/aslcompile.c
@@ -568,7 +568,7 @@  AslCompilerSignon (
 
     /* Running compiler or disassembler? */
 
-    if (Gbl_DisasmFlag)
+    if (AcpiGbl_DisasmFlag)
     {
         UtilityName = AML_DISASSEMBLER_NAME;
     }
diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h
index 4c6ba020..07a7d512 100644
--- a/src/acpica/source/compiler/aslcompiler.h
+++ b/src/acpica/source/compiler/aslcompiler.h
@@ -1398,6 +1398,26 @@  ASL_RESOURCE_NODE *
 RsDoUartSerialBusDescriptor (
     ASL_RESOURCE_INFO       *Info);
 
+ASL_RESOURCE_NODE *
+RsDoPinFunctionDescriptor (
+    ASL_RESOURCE_INFO       *Info);
+
+ASL_RESOURCE_NODE *
+RsDoPinConfigDescriptor (
+    ASL_RESOURCE_INFO       *Info);
+
+ASL_RESOURCE_NODE *
+RsDoPinGroupDescriptor (
+    ASL_RESOURCE_INFO       *Info);
+
+ASL_RESOURCE_NODE *
+RsDoPinGroupFunctionDescriptor (
+    ASL_RESOURCE_INFO       *Info);
+
+ASL_RESOURCE_NODE *
+RsDoPinGroupConfigDescriptor (
+    ASL_RESOURCE_INFO       *Info);
+
 /*
  * aslrestype2d - DWord address descriptors
  */
diff --git a/src/acpica/source/compiler/aslcompiler.l b/src/acpica/source/compiler/aslcompiler.l
index a9d595ab..4b36058b 100644
--- a/src/acpica/source/compiler/aslcompiler.l
+++ b/src/acpica/source/compiler/aslcompiler.l
@@ -455,6 +455,11 @@  NamePathTail                [.]{NameSeg}
 "Memory24"                  { count (1); return (PARSEOP_MEMORY24); }
 "Memory32"                  { count (1); return (PARSEOP_MEMORY32); }
 "Memory32Fixed"             { count (1); return (PARSEOP_MEMORY32FIXED); }
+"PinConfig"                 { count (1); return (PARSEOP_PINCONFIG); }
+"PinFunction"               { count (1); return (PARSEOP_PINFUNCTION); }
+"PinGroup"                  { count (1); return (PARSEOP_PINGROUP); }
+"PinGroupConfig"            { count (1); return (PARSEOP_PINGROUPCONFIG); }
+"PinGroupFunction"          { count (1); return (PARSEOP_PINGROUPFUNCTION); }
 "QWordIO"                   { count (1); return (PARSEOP_QWORDIO); }
 "QWordMemory"               { count (1); return (PARSEOP_QWORDMEMORY); }
 "QWordSpace"                { count (1); return (PARSEOP_QWORDSPACE); }
diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h
index 3333562b..2b6d73d6 100644
--- a/src/acpica/source/compiler/asldefine.h
+++ b/src/acpica/source/compiler/asldefine.h
@@ -161,8 +161,8 @@ 
 #define ASL_INVOCATION_NAME         "iasl"
 #define ASL_CREATOR_ID              "INTL"
 #define ASL_DEFINE                  "__IASL__"
-
-#define ASL_COMPLIANCE              "Supports ACPI Specification Revision 6.1"
+#define ASL_PREFIX                  "iASL: "
+#define ASL_COMPLIANCE              "Supports ACPI Specification Revision 6.2"
 
 
 /* Configuration constants */
diff --git a/src/acpica/source/compiler/aslexternal.c b/src/acpica/source/compiler/aslexternal.c
index 20fcc9ec..67a95e56 100644
--- a/src/acpica/source/compiler/aslexternal.c
+++ b/src/acpica/source/compiler/aslexternal.c
@@ -435,6 +435,7 @@  ExMoveExternals (
     ACPI_PARSE_OBJECT       *Next;
     char                    *ExternalName;
     ACPI_OBJECT_TYPE        ObjType;
+    ACPI_STATUS             Status;
     UINT32                  i;
 
 
@@ -473,8 +474,16 @@  ExMoveExternals (
         {
             Next->Asl.ParseOpcode = PARSEOP_NAMESTRING;
         }
+
         Next->Asl.ExternalName = ExternalName;
-        UtInternalizeName (ExternalName, &Next->Asl.Value.String);
+        Status = UtInternalizeName (ExternalName, &Next->Asl.Value.String);
+        if (ACPI_FAILURE (Status))
+        {
+            AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
+                Next, "Could not internalize namestring");
+            return;
+        }
+
         Next->Asl.AmlLength = strlen (Next->Asl.Value.String);
 
         Next = Next->Asl.Next;
diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h
index a4955527..16b798c1 100644
--- a/src/acpica/source/compiler/aslglobal.h
+++ b/src/acpica/source/compiler/aslglobal.h
@@ -275,7 +275,6 @@  ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_VerboseErrors, TRUE);
 ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_NoErrors, FALSE);
 ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_WarningsAsErrors, FALSE);
 ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_NoResourceChecking, FALSE);
-ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_DisasmFlag, FALSE);
 ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_IntegerOptimizationFlag, TRUE);
 ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_ReferenceOptimizationFlag, TRUE);
 ASL_EXTERN BOOLEAN                  ASL_INIT_GLOBAL (Gbl_DisplayRemarks, TRUE);
diff --git a/src/acpica/source/compiler/aslhelpers.y b/src/acpica/source/compiler/aslhelpers.y
index f9965060..f200bf2b 100644
--- a/src/acpica/source/compiler/aslhelpers.y
+++ b/src/acpica/source/compiler/aslhelpers.y
@@ -330,6 +330,15 @@  OptionalResourceType
     | ',' ResourceTypeKeyword       {$$ = $2;}
     ;
 
+/* Same as above except default is producer */
+OptionalProducerResourceType
+    :                               {$$ = TrCreateLeafNode (
+                                        PARSEOP_RESOURCETYPE_PRODUCER);}
+    | ','                           {$$ = TrCreateLeafNode (
+                                        PARSEOP_RESOURCETYPE_PRODUCER);}
+    | ',' ResourceTypeKeyword       {$$ = $2;}
+    ;
+
 OptionalSlaveMode
     : ','                           {$$ = NULL;}
     | ',' SlaveModeKeyword          {$$ = $2;}
diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c
index dfe4ca4d..bd564b33 100644
--- a/src/acpica/source/compiler/aslload.c
+++ b/src/acpica/source/compiler/aslload.c
@@ -315,13 +315,20 @@  LdLoadFieldElements (
                         Child->Asl.Value.String);
                     return (Status);
                 }
-
-                /*
-                 * The name already exists in this scope
-                 * But continue processing the elements
-                 */
-                AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
-                    Child->Asl.Value.String);
+                else if (Status == AE_ALREADY_EXISTS &&
+                    (Node->Flags & ANOBJ_IS_EXTERNAL))
+                {
+                    Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD;
+                }
+                else
+                {
+                    /*
+                     * The name already exists in this scope
+                     * But continue processing the elements
+                     */
+                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
+                        Child->Asl.Value.String);
+                }
             }
             else
             {
@@ -458,12 +465,30 @@  LdNamespace1Begin (
     ACPI_PARSE_OBJECT       *Arg;
     UINT32                  i;
     BOOLEAN                 ForceNewScope = FALSE;
+    ACPI_OWNER_ID           OwnerId = 0;
 
 
     ACPI_FUNCTION_NAME (LdNamespace1Begin);
     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
         Op, Op->Asl.ParseOpName));
 
+    if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)
+    {
+        /*
+         * Allocate an OwnerId for this block. This helps identify the owners
+         * of each namespace node. This is used in determining whether if
+         * certain external declarations cause redefinition errors.
+         */
+        Status = AcpiUtAllocateOwnerId (&OwnerId);
+        WalkState->OwnerId = OwnerId;
+        if (ACPI_FAILURE (Status))
+        {
+            AslCoreSubsystemError (Op, Status,
+                "Failure to allocate owner ID to this definition block.", FALSE);
+            return_ACPI_STATUS (Status);
+        }
+    }
+
     /*
      * We are only interested in opcodes that have an associated name
      * (or multiple names)
@@ -778,7 +803,9 @@  LdNamespace1Begin (
             {
                 /*
                  * Allow one create on an object or segment that was
-                 * previously declared External
+                 * previously declared External only if WalkState->OwnerId and
+                 * Node->OwnerId are found in different tables (meaning that
+                 * they have differnt OwnerIds).
                  */
                 Node->Flags &= ~ANOBJ_IS_EXTERNAL;
                 Node->Type = (UINT8) ObjectType;
@@ -795,6 +822,12 @@  LdNamespace1Begin (
                 }
 
                 Status = AE_OK;
+
+                if (Node->OwnerId == WalkState->OwnerId)
+                {
+                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
+                        Op->Asl.ExternalName);
+                }
             }
             else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
                      (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
@@ -802,15 +835,52 @@  LdNamespace1Begin (
                 /*
                  * Allow externals in same scope as the definition of the
                  * actual object. Similar to C. Allows multiple definition
-                 * blocks that refer to each other in the same file.
+                 * blocks that refer to each other in the same file. However,
+                 * do not allow name declaration and an external declaration
+                 * within the same table. This is considered a re-declaration.
                  */
                 Status = AE_OK;
+
+                if (Node->OwnerId == WalkState->OwnerId)
+                {
+                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
+                        Op->Asl.ExternalName);
+                }
             }
             else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
                      (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
                      (ObjectType == ACPI_TYPE_ANY))
             {
-                /* Allow update of externals of unknown type. */
+                /*
+                 * Allow update of externals of unknown type.
+                 * In the case that multiple definition blocks are being
+                 * parsed, updating the OwnerId allows enables subsequent calls
+                 * of this method to understand which table the most recent
+                 * external declaration was seen. Without this OwnerId update,
+                 * code like the following is allowed to compile:
+                 *
+                 * DefinitionBlock("externtest.aml", "DSDT", 0x02, "Intel", "Many", 0x00000001)
+                 * {
+                 *     External(ERRS,methodobj)
+                 *     Method (MAIN)
+                 *     {
+                 *         Name(NUM2, 0)
+                 *         ERRS(1,2,3)
+                 *     }
+                 * }
+                 *
+                 * DefinitionBlock("externtest.aml", "SSDT", 0x02, "Intel", "Many", 0x00000001)
+                 * {
+                 *     if (0)
+                 *     {
+                 *         External(ERRS,methodobj)
+                 *     }
+                 *     Method (ERRS,3)
+                 *     {}
+                 *
+                 * }
+                 */
+                Node->OwnerId = WalkState->OwnerId;
 
                 if (AcpiNsOpensScope (ActualObjectType))
                 {
diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c
index a282b0c4..10251fb2 100644
--- a/src/acpica/source/compiler/aslmain.c
+++ b/src/acpica/source/compiler/aslmain.c
@@ -207,6 +207,9 @@  main (
     int                     ReturnStatus = 0;
 
 
+    signal (SIGINT, AslSignalHandler);
+    signal (SIGSEGV, AslSignalHandler);
+
     /*
      * Big-endian machines are not currently supported. ACPI tables must
      * be little-endian, and support for big-endian machines needs to
@@ -224,7 +227,6 @@  main (
 
     /* Initialize preprocessor and compiler before command line processing */
 
-    signal (SIGINT, AslSignalHandler);
     AcpiGbl_ExternalFileList = NULL;
     AcpiDbgLevel = 0;
     PrInitializePreprocessor ();
@@ -254,6 +256,7 @@  main (
         }
     }
 
+
     /* Process each pathname/filename in the list, with possible wildcards */
 
     while (argv[Index2])
@@ -301,8 +304,10 @@  CleanupAndExit:
  *
  * RETURN:      None
  *
- * DESCRIPTION: Control-C handler. Delete any intermediate files and any
- *              output files that may be left in an indeterminate state.
+ * DESCRIPTION: Signal interrupt handler. Delete any intermediate files and
+ *              any output files that may be left in an indeterminate state.
+ *              Currently handles SIGINT (control-c) and SIGSEGV (segmentation
+ *              fault).
  *
  *****************************************************************************/
 
@@ -314,11 +319,34 @@  AslSignalHandler (
 
 
     signal (Sig, SIG_IGN);
-    printf ("Aborting\n\n");
+    fflush (stdout);
+    fflush (stderr);
+
+    switch (Sig)
+    {
+    case SIGINT:
+
+        printf ("\n" ASL_PREFIX "<Control-C>\n");
+        break;
 
-    /* Close all open files */
+    case SIGSEGV:
 
-    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .pre file is same as source file */
+        /* Even on a seg fault, we will try to delete any partial files */
+
+        printf (ASL_PREFIX "Segmentation Fault\n");
+        break;
+
+    default:
+
+        printf (ASL_PREFIX "Unknown interrupt signal (%u), ignoring\n", Sig);
+        return;
+    }
+
+    /*
+     * Close all open files
+     * Note: the .pre file is the same as the input source file
+     */
+    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
 
     for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
     {
@@ -332,6 +360,7 @@  AslSignalHandler (
         FlDeleteFile (i);
     }
 
+    printf (ASL_PREFIX "Terminating\n");
     exit (0);
 }
 
diff --git a/src/acpica/source/compiler/aslmap.c b/src/acpica/source/compiler/aslmap.c
index f3c04797..aed87661 100644
--- a/src/acpica/source/compiler/aslmap.c
+++ b/src/acpica/source/compiler/aslmap.c
@@ -451,6 +451,11 @@  const ASL_MAPPING_ENTRY     AslKeywordMapping [] =
 /* PARITYTYPE_NONE */           OP_TABLE_ENTRY (AML_BYTE_OP,                0,                              0,                  0),
 /* PARITYTYPE_ODD */            OP_TABLE_ENTRY (AML_BYTE_OP,                2,                              0,                  0),
 /* PARITYTYPE_SPACE */          OP_TABLE_ENTRY (AML_BYTE_OP,                4,                              0,                  0),
+/* PINCONFIG */                 OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
+/* PINFUNCTION */               OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
+/* PINGROUP */                  OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
+/* PINGROUPCONFIG */            OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
+/* PINGROUPFUNCTION */          OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP,         0,                              0,                  0),
 /* PIN_NOPULL */                OP_TABLE_ENTRY (AML_BYTE_OP,                3,                              0,                  0),
 /* PIN_PULLDEFAULT */           OP_TABLE_ENTRY (AML_BYTE_OP,                0,                              0,                  0),
 /* PIN_PULLDOWN */              OP_TABLE_ENTRY (AML_BYTE_OP,                2,                              0,                  0),
diff --git a/src/acpica/source/compiler/asloffset.c b/src/acpica/source/compiler/asloffset.c
index e3fdf1c9..0964d4fe 100644
--- a/src/acpica/source/compiler/asloffset.c
+++ b/src/acpica/source/compiler/asloffset.c
@@ -250,7 +250,6 @@  LsAmlOffsetWalk (
         }
 
         Length = Op->Asl.FinalAmlLength;
-        NamepathOffset = Gbl_CurrentAmlOffset + Length;
 
         /* Get to the NameSeg/NamePath Op (and length of the name) */
 
diff --git a/src/acpica/source/compiler/aslparser.y b/src/acpica/source/compiler/aslparser.y
index 72043ae0..6426cebe 100644
--- a/src/acpica/source/compiler/aslparser.y
+++ b/src/acpica/source/compiler/aslparser.y
@@ -208,7 +208,7 @@  AslLocalAllocate (
  * These shift/reduce conflicts are expected. There should be zero
  * reduce/reduce conflicts.
  */
-%expect 102
+%expect 118
 
 /*! [Begin] no source code translation */
 
diff --git a/src/acpica/source/compiler/aslresource.c b/src/acpica/source/compiler/aslresource.c
index f12795a5..42931452 100644
--- a/src/acpica/source/compiler/aslresource.c
+++ b/src/acpica/source/compiler/aslresource.c
@@ -990,6 +990,31 @@  RsDoOneResourceDescriptor (
         Rnode = RsDoUartSerialBusDescriptor (Info);
         break;
 
+    case PARSEOP_PINCONFIG:
+
+        Rnode = RsDoPinConfigDescriptor (Info);
+        break;
+
+    case PARSEOP_PINFUNCTION:
+
+        Rnode = RsDoPinFunctionDescriptor (Info);
+        break;
+
+    case PARSEOP_PINGROUP:
+
+        Rnode = RsDoPinGroupDescriptor (Info);
+        break;
+
+    case PARSEOP_PINGROUPFUNCTION:
+
+        Rnode = RsDoPinGroupFunctionDescriptor (Info);
+        break;
+
+    case PARSEOP_PINGROUPCONFIG:
+
+        Rnode = RsDoPinGroupConfigDescriptor (Info);
+        break;
+
     case PARSEOP_DEFAULT_ARG:
 
         /* Just ignore any of these, they are used as fillers/placeholders */
diff --git a/src/acpica/source/compiler/aslresources.y b/src/acpica/source/compiler/aslresources.y
index d14fdd45..fc70940c 100644
--- a/src/acpica/source/compiler/aslresources.y
+++ b/src/acpica/source/compiler/aslresources.y
@@ -211,6 +211,11 @@  ResourceMacroTerm
     | Memory24Term                  {}
     | Memory32FixedTerm             {}
     | Memory32Term                  {}
+    | PinConfigTerm                 {}
+    | PinFunctionTerm               {}
+    | PinGroupTerm                  {}
+    | PinGroupConfigTerm            {}
+    | PinGroupFunctionTerm          {}
     | QWordIOTerm                   {}
     | QWordMemoryTerm               {}
     | QWordSpaceTerm                {}
@@ -605,6 +610,95 @@  Memory32Term
         error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
     ;
 
+PinConfigTerm
+    : PARSEOP_PINCONFIG
+        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINCONFIG);}
+        OptionalShareType_First     /* 04: SharedType */
+        ',' ByteConstExpr           /* 06: PinConfigType */
+        ',' DWordConstExpr          /* 08: PinConfigValue */
+        ',' StringData              /* 10: ResourceSource */
+        OptionalByteConstExpr       /* 11: ResourceSourceIndex */
+        OptionalResourceType        /* 12: ResourceType */
+        OptionalNameString          /* 13: DescriptorName */
+        OptionalBuffer_Last         /* 14: VendorData */
+        PARSEOP_CLOSE_PAREN '{'
+            DWordList '}'           {$$ = TrLinkChildren ($<n>3,9,
+                                        $4,$6,$8,$10,$11,$12,$13,$14,$17);}
+    | PARSEOP_PINCONFIG
+        PARSEOP_OPEN_PAREN
+        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
+    ;
+
+PinFunctionTerm
+    : PARSEOP_PINFUNCTION
+        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINFUNCTION);}
+        OptionalShareType_First     /* 04: SharedType */
+        ',' PinConfigByte           /* 06: PinConfig */
+        ',' WordConstExpr           /* 08: FunctionNumber */
+        ',' StringData              /* 10: ResourceSource */
+        OptionalByteConstExpr       /* 11: ResourceSourceIndex */
+        OptionalResourceType        /* 12: ResourceType */
+        OptionalNameString          /* 13: DescriptorName */
+        OptionalBuffer_Last         /* 14: VendorData */
+        PARSEOP_CLOSE_PAREN '{'
+            DWordList '}'           {$$ = TrLinkChildren ($<n>3,9,
+                                        $4,$6,$8,$10,$11,$12,$13,$14,$17);}
+    | PARSEOP_PINFUNCTION
+        PARSEOP_OPEN_PAREN
+        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
+    ;
+
+PinGroupTerm
+    : PARSEOP_PINGROUP
+        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINGROUP);}
+        StringData                  /* 04: ResourceLabel */
+        OptionalProducerResourceType /* 05: ResourceType */
+        OptionalNameString          /* 06: DescriptorName */
+        OptionalBuffer_Last         /* 07: VendorData */
+        PARSEOP_CLOSE_PAREN '{'
+            DWordList '}'           {$$ = TrLinkChildren ($<n>3,5,$4,$5,$6,$7,$10);}
+    | PARSEOP_PINGROUP
+        PARSEOP_OPEN_PAREN
+        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
+    ;
+
+PinGroupConfigTerm
+    : PARSEOP_PINGROUPCONFIG
+        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINGROUPCONFIG);}
+        OptionalShareType_First     /* 04: SharedType */
+        ',' ByteConstExpr           /* 06: PinConfigType */
+        ',' DWordConstExpr          /* 08: PinConfigValue */
+        ',' StringData              /* 10: ResourceSource */
+        OptionalByteConstExpr       /* 11: ResourceSourceIndex */
+        ',' StringData              /* 13: ResourceSourceLabel */
+        OptionalResourceType        /* 14: ResourceType */
+        OptionalNameString          /* 15: DescriptorName */
+        OptionalBuffer_Last         /* 16: VendorData */
+        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,9,
+                                        $4,$6,$8,$10,$11,$13,$14,$15,$16);}
+    | PARSEOP_PINGROUPCONFIG
+        PARSEOP_OPEN_PAREN
+        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
+    ;
+
+PinGroupFunctionTerm
+    : PARSEOP_PINGROUPFUNCTION
+        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PINGROUPFUNCTION);}
+        OptionalShareType_First     /* 04: SharedType */
+        ',' WordConstExpr           /* 06: FunctionNumber */
+        ',' StringData              /* 08: ResourceSource */
+        OptionalByteConstExpr       /* 09: ResourceSourceIndex */
+        ',' StringData              /* 11: ResourceSourceLabel */
+        OptionalResourceType        /* 12: ResourceType */
+        OptionalNameString          /* 13: DescriptorName */
+        OptionalBuffer_Last         /* 14: VendorData */
+        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,8,
+                                        $4,$6,$8,$9,$11,$12,$13,$14);}
+    | PARSEOP_PINGROUPFUNCTION
+        PARSEOP_OPEN_PAREN
+        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}
+    ;
+
 QWordIOTerm
     : PARSEOP_QWORDIO
         PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDIO);}
diff --git a/src/acpica/source/compiler/aslrestype2s.c b/src/acpica/source/compiler/aslrestype2s.c
index ccaac7c9..243d1a3f 100644
--- a/src/acpica/source/compiler/aslrestype2s.c
+++ b/src/acpica/source/compiler/aslrestype2s.c
@@ -163,7 +163,8 @@  RsGetBufferDataLength (
 
 static UINT16
 RsGetInterruptDataLength (
-    ACPI_PARSE_OBJECT       *InitializerOp);
+    ACPI_PARSE_OBJECT       *InitializerOp,
+    UINT32                  StartIndex);
 
 static BOOLEAN
 RsGetVendorData (
@@ -171,6 +172,11 @@  RsGetVendorData (
     UINT8                   *VendorData,
     ACPI_SIZE               DescriptorOffset);
 
+static UINT16
+RsGetStringDataLengthAt (
+    ACPI_PARSE_OBJECT       *InitializerOp,
+    UINT32                  StartIndex);
+
 /*
  * This module contains descriptors for serial buses and GPIO:
  *
@@ -179,6 +185,11 @@  RsGetVendorData (
  * I2cSerialBus
  * SpiSerialBus
  * UartSerialBus
+ * PinFunction
+ * PinConfig
+ * PinGroup
+ * PinGroupFunction
+ * PinGroupConfig
  */
 
 
@@ -238,6 +249,7 @@  RsGetBufferDataLength (
  *
  * PARAMETERS:  InitializerOp       - Current parse op, start of the resource
  *                                    descriptor
+ *              StartIndex          - Start index of interrupt/pin list
  *
  * RETURN:      Length of the interrupt data list
  *
@@ -248,7 +260,8 @@  RsGetBufferDataLength (
 
 static UINT16
 RsGetInterruptDataLength (
-    ACPI_PARSE_OBJECT       *InitializerOp)
+    ACPI_PARSE_OBJECT       *InitializerOp,
+    UINT32                  StartIndex)
 {
     UINT16                  InterruptLength;
     UINT32                  i;
@@ -261,9 +274,9 @@  RsGetInterruptDataLength (
     {
         InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
 
-        /* Interrupt list starts at offset 10 (Gpio descriptors) */
+        /* Interrupt list starts at offset StartIndex (Gpio descriptors) */
 
-        if (i >= 10)
+        if (i >= StartIndex)
         {
             InterruptLength += 2;
         }
@@ -373,6 +386,43 @@  RsGetVendorData (
 
 /*******************************************************************************
  *
+ * FUNCTION:    RsGetStringDataLengthAt
+ *
+ * PARAMETERS:  InitializerOp     - Start of a subtree of init nodes
+ *              StartIndex        - Starting index of the string node
+ *
+ * RETURN:      Valid string length if a string node is found at given
+ *               StartIndex or 0 otherwise.
+ *
+ * DESCRIPTION: In a list of peer nodes, find the first one at given index
+ *              that contains a string and return length.
+ *
+ ******************************************************************************/
+
+static UINT16
+RsGetStringDataLengthAt (
+    ACPI_PARSE_OBJECT       *InitializerOp,
+    UINT32                  StartIndex)
+{
+    UINT32 i;
+
+    for (i = 0; InitializerOp; i++)
+    {
+        if (i == StartIndex &&
+            InitializerOp->Asl.ParseOpcode == PARSEOP_STRING_LITERAL)
+        {
+            return ((UINT16) (strlen (InitializerOp->Asl.Value.String) + 1));
+        }
+
+        InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
+    }
+
+    return (0);
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    RsDoGpioIntDescriptor
  *
  * PARAMETERS:  Info                - Parse Op and resource template offset
@@ -414,7 +464,7 @@  RsDoGpioIntDescriptor (
      */
     ResSourceLength = RsGetStringDataLength (InitializerOp);
     VendorLength = RsGetBufferDataLength (InitializerOp);
-    InterruptLength = RsGetInterruptDataLength (InitializerOp);
+    InterruptLength = RsGetInterruptDataLength (InitializerOp, 10);
 
     DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) +
         ResSourceLength + VendorLength + InterruptLength;
@@ -623,7 +673,7 @@  RsDoGpioIoDescriptor (
      */
     ResSourceLength = RsGetStringDataLength (InitializerOp);
     VendorLength = RsGetBufferDataLength (InitializerOp);
-    InterruptLength = RsGetInterruptDataLength (InitializerOp);
+    InterruptLength = RsGetInterruptDataLength (InitializerOp, 10);
     PinList = InterruptList;
 
     DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) +
@@ -1336,3 +1386,858 @@  RsDoUartSerialBusDescriptor (
     MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
     return (Rnode);
 }
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    RsDoPinFunctionDescriptor
+ *
+ * PARAMETERS:  Info                - Parse Op and resource template offset
+ *
+ * RETURN:      Completed resource node
+ *
+ * DESCRIPTION: Construct a long "PinFunction" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoPinFunctionDescriptor (
+    ASL_RESOURCE_INFO       *Info)
+{
+    AML_RESOURCE            *Descriptor;
+    ACPI_PARSE_OBJECT       *InitializerOp;
+    ASL_RESOURCE_NODE       *Rnode;
+    char                    *ResourceSource = NULL;
+    UINT8                   *VendorData = NULL;
+    UINT16                  *PinList = NULL;
+    UINT16                  ResSourceLength;
+    UINT16                  VendorLength;
+    UINT16                  PinListLength;
+    UINT16                  DescriptorSize;
+    UINT32                  CurrentByteOffset;
+    UINT32                  PinCount = 0;
+    UINT32                  i;
+
+    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+    CurrentByteOffset = Info->CurrentByteOffset;
+
+    /*
+     * Calculate lengths for fields that have variable length:
+     * 1) Resource Source string
+     * 2) Vendor Data buffer
+     * 3) PIN (interrupt) list
+     */
+    ResSourceLength = RsGetStringDataLength (InitializerOp);
+    VendorLength = RsGetBufferDataLength (InitializerOp);
+    PinListLength = RsGetInterruptDataLength (InitializerOp, 8);
+
+    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_FUNCTION) +
+        ResSourceLength + VendorLength + PinListLength;
+
+    /* Allocate the local resource node and initialize */
+
+    Rnode = RsAllocateResourceNode (DescriptorSize +
+        sizeof (AML_RESOURCE_LARGE_HEADER));
+
+    Descriptor = Rnode->Buffer;
+    Descriptor->PinFunction.ResourceLength = DescriptorSize;
+    Descriptor->PinFunction.DescriptorType = ACPI_RESOURCE_NAME_PIN_FUNCTION;
+    Descriptor->PinFunction.RevisionId = AML_RESOURCE_PIN_FUNCTION_REVISION;
+
+    /* Build pointers to optional areas */
+
+    PinList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_PIN_FUNCTION));
+    ResourceSource = ACPI_ADD_PTR (char, PinList, PinListLength);
+    VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength);
+
+    /* Setup offsets within the descriptor */
+
+    Descriptor->PinFunction.PinTableOffset = (UINT16)
+        ACPI_PTR_DIFF (PinList, Descriptor);
+
+    Descriptor->PinFunction.ResSourceOffset = (UINT16)
+        ACPI_PTR_DIFF (ResourceSource, Descriptor);
+
+    /* Process all child initialization nodes */
+
+    for (i = 0; InitializerOp; i++)
+    {
+        switch (i)
+        {
+        case 0: /* Share Type [Flags] (_SHR) */
+
+            RsSetFlagBits16 (&Descriptor->PinFunction.Flags, InitializerOp, 0, 0);
+            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.Flags), 0);
+            break;
+
+        case 1: /* Pin Config [BYTE] (_PPI) */
+
+            Descriptor->PinFunction.PinConfig = (UINT8) InitializerOp->Asl.Value.Integer;
+            RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.PinConfig));
+            break;
+
+        case 2: /* Function Number [WORD] (_FUN) */
+
+            Descriptor->PinFunction.FunctionNumber = (UINT16) InitializerOp->Asl.Value.Integer;
+            RsCreateDwordField (InitializerOp, ACPI_RESTAG_FUNCTION,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinFunction.FunctionNumber));
+            break;
+
+        case 3: /* ResSource [Optional Field - STRING] */
+
+            if (ResSourceLength)
+            {
+                /* Copy string to the descriptor */
+
+                strcpy (ResourceSource, InitializerOp->Asl.Value.String);
+            }
+            break;
+
+        case 4: /* Resource Index */
+
+            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+            {
+                Descriptor->PinFunction.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
+            }
+            break;
+
+        case 5: /* Resource Usage (consumer/producer) */
+
+            /* Assumed to be consumer */
+
+            break;
+
+        case 6: /* Resource Tag (Descriptor Name) */
+
+            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
+            break;
+
+        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
+            /*
+             * Always set the VendorOffset even if there is no Vendor Data.
+             * This field is required in order to calculate the length
+             * of the ResourceSource at runtime.
+             */
+            Descriptor->PinFunction.VendorOffset = (UINT16)
+                ACPI_PTR_DIFF (VendorData, Descriptor);
+
+            if (RsGetVendorData (InitializerOp, VendorData,
+                (CurrentByteOffset + Descriptor->PinFunction.VendorOffset)))
+            {
+                Descriptor->PinFunction.VendorLength = VendorLength;
+            }
+            break;
+
+        default:
+            /*
+             * PINs come through here, repeatedly. Each PIN must be a WORD.
+             * NOTE: there is no "length" field for this, so from ACPI spec:
+             *  The number of pins in the table can be calculated from:
+             *  PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
+             *  (implies resource source must immediately follow the pin list.)
+             *  Name: _PIN
+             */
+            *PinList = (UINT16) InitializerOp->Asl.Value.Integer;
+            PinList++;
+            PinCount++;
+
+            /* Case 8: First pin number in list */
+
+            if (i == 8)
+            {
+                if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+                {
+                    /* Must be at least one interrupt */
+
+                    AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
+                        InitializerOp, NULL);
+                }
+
+                /* Check now for duplicates in list */
+
+                RsCheckListForDuplicates (InitializerOp);
+
+                /* Create a named field at the start of the list */
+
+                RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
+                    CurrentByteOffset + Descriptor->PinFunction.PinTableOffset);
+            }
+            break;
+        }
+
+        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+    }
+
+    return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    RsDoPinConfigDescriptor
+ *
+ * PARAMETERS:  Info                - Parse Op and resource template offset
+ *
+ * RETURN:      Completed resource node
+ *
+ * DESCRIPTION: Construct a long "PinConfig" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoPinConfigDescriptor (
+    ASL_RESOURCE_INFO       *Info)
+{
+    AML_RESOURCE            *Descriptor;
+    ACPI_PARSE_OBJECT       *InitializerOp;
+    ASL_RESOURCE_NODE       *Rnode;
+    char                    *ResourceSource = NULL;
+    UINT8                   *VendorData = NULL;
+    UINT16                  *PinList = NULL;
+    UINT16                  ResSourceLength;
+    UINT16                  VendorLength;
+    UINT16                  PinListLength;
+    UINT16                  DescriptorSize;
+    UINT32                  CurrentByteOffset;
+    UINT32                  PinCount = 0;
+    UINT32                  i;
+
+    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+    CurrentByteOffset = Info->CurrentByteOffset;
+
+    /*
+     * Calculate lengths for fields that have variable length:
+     * 1) Resource Source string
+     * 2) Vendor Data buffer
+     * 3) PIN (interrupt) list
+     */
+    ResSourceLength = RsGetStringDataLength (InitializerOp);
+    VendorLength = RsGetBufferDataLength (InitializerOp);
+    PinListLength = RsGetInterruptDataLength (InitializerOp, 8);
+
+    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_CONFIG) +
+        ResSourceLength + VendorLength + PinListLength;
+
+    /* Allocate the local resource node and initialize */
+
+    Rnode = RsAllocateResourceNode (DescriptorSize +
+        sizeof (AML_RESOURCE_LARGE_HEADER));
+
+    Descriptor = Rnode->Buffer;
+    Descriptor->PinConfig.ResourceLength = DescriptorSize;
+    Descriptor->PinConfig.DescriptorType = ACPI_RESOURCE_NAME_PIN_CONFIG;
+    Descriptor->PinConfig.RevisionId = AML_RESOURCE_PIN_CONFIG_REVISION;
+
+    /* Build pointers to optional areas */
+
+    PinList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_PIN_CONFIG));
+    ResourceSource = ACPI_ADD_PTR (char, PinList, PinListLength);
+    VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength);
+
+    /* Setup offsets within the descriptor */
+
+    Descriptor->PinConfig.PinTableOffset = (UINT16)
+        ACPI_PTR_DIFF (PinList, Descriptor);
+
+    Descriptor->PinConfig.ResSourceOffset = (UINT16)
+        ACPI_PTR_DIFF (ResourceSource, Descriptor);
+
+    /* Process all child initialization nodes */
+
+    for (i = 0; InitializerOp; i++)
+    {
+        BOOLEAN isValid;
+
+        switch (i)
+        {
+        case 0: /* Share Type [Flags] (_SHR) */
+
+            RsSetFlagBits16 (&Descriptor->PinConfig.Flags, InitializerOp, 0, 0);
+            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.Flags), 0);
+            break;
+
+        case 1: /* Pin Config Type [BYTE] (_TYP) */
+
+            isValid = InitializerOp->Asl.Value.Integer <= 0x0d;
+            if (!isValid)
+            {
+                isValid = InitializerOp->Asl.Value.Integer >= 0x80 &&
+                          InitializerOp->Asl.Value.Integer <= 0xff;
+            }
+            if (!isValid)
+            {
+                    AslError (ASL_ERROR, ASL_MSG_RANGE, InitializerOp, NULL);
+            }
+
+            Descriptor->PinConfig.PinConfigType = (UINT8) InitializerOp->Asl.Value.Integer;
+            RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG_TYPE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.PinConfigType));
+
+            break;
+
+        case 2: /* Pin Config Value [DWORD] (_VAL) */
+
+            Descriptor->PinConfig.PinConfigValue = (UINT32) InitializerOp->Asl.Value.Integer;
+            RsCreateDwordField (InitializerOp, ACPI_RESTAG_PINCONFIG_VALUE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinConfig.PinConfigValue));
+            break;
+
+        case 3: /* ResSource [Optional Field - STRING] */
+
+            if (ResSourceLength)
+            {
+                /* Copy string to the descriptor */
+
+                strcpy (ResourceSource, InitializerOp->Asl.Value.String);
+            }
+            break;
+
+        case 4: /* Resource Index */
+
+            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+            {
+                Descriptor->PinConfig.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
+            }
+            break;
+
+        case 5: /* Resource Usage (consumer/producer) */
+
+            RsSetFlagBits16 (&Descriptor->PinConfig.Flags, InitializerOp, 1, 1);
+
+            break;
+
+        case 6: /* Resource Tag (Descriptor Name) */
+
+            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
+            break;
+
+        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
+            /*
+             * Always set the VendorOffset even if there is no Vendor Data.
+             * This field is required in order to calculate the length
+             * of the ResourceSource at runtime.
+             */
+            Descriptor->PinConfig.VendorOffset = (UINT16)
+                ACPI_PTR_DIFF (VendorData, Descriptor);
+
+            if (RsGetVendorData (InitializerOp, VendorData,
+                (CurrentByteOffset + Descriptor->PinConfig.VendorOffset)))
+            {
+                Descriptor->PinConfig.VendorLength = VendorLength;
+            }
+            break;
+
+        default:
+            /*
+             * PINs come through here, repeatedly. Each PIN must be a WORD.
+             * NOTE: there is no "length" field for this, so from ACPI spec:
+             *  The number of pins in the table can be calculated from:
+             *  PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
+             *  (implies resource source must immediately follow the pin list.)
+             *  Name: _PIN
+             */
+            *PinList = (UINT16) InitializerOp->Asl.Value.Integer;
+            PinList++;
+            PinCount++;
+
+            /* Case 8: First pin number in list */
+
+            if (i == 8)
+            {
+                if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+                {
+                    /* Must be at least one interrupt */
+
+                    AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
+                        InitializerOp, NULL);
+                }
+
+                /* Check now for duplicates in list */
+
+                RsCheckListForDuplicates (InitializerOp);
+
+                /* Create a named field at the start of the list */
+
+                RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
+                    CurrentByteOffset + Descriptor->PinConfig.PinTableOffset);
+            }
+            break;
+        }
+
+        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+    }
+
+    return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    RsDoPinGroupDescriptor
+ *
+ * PARAMETERS:  Info                - Parse Op and resource template offset
+ *
+ * RETURN:      Completed resource node
+ *
+ * DESCRIPTION: Construct a long "PinGroup" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoPinGroupDescriptor (
+    ASL_RESOURCE_INFO       *Info)
+{
+    AML_RESOURCE            *Descriptor;
+    ACPI_PARSE_OBJECT       *InitializerOp;
+    ASL_RESOURCE_NODE       *Rnode;
+    UINT8                   *VendorData = NULL;
+    UINT16                  *PinList = NULL;
+    char                    *Label = NULL;
+    UINT16                  LabelLength;
+    UINT16                  VendorLength;
+    UINT16                  PinListLength;
+    UINT16                  DescriptorSize;
+    UINT32                  CurrentByteOffset;
+    UINT32                  PinCount = 0;
+    UINT32                  i;
+
+    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+    CurrentByteOffset = Info->CurrentByteOffset;
+
+    /*
+     * Calculate lengths for fields that have variable length:
+     * 1) Label
+     * 2) Vendor Data buffer
+     * 3) PIN (interrupt) list
+     */
+    LabelLength = RsGetStringDataLength (InitializerOp);
+    VendorLength = RsGetBufferDataLength (InitializerOp);
+    PinListLength = RsGetInterruptDataLength (InitializerOp, 4);
+
+    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP) +
+        LabelLength + VendorLength + PinListLength;
+
+    /* Allocate the local resource node and initialize */
+
+    Rnode = RsAllocateResourceNode (DescriptorSize +
+        sizeof (AML_RESOURCE_LARGE_HEADER));
+
+    Descriptor = Rnode->Buffer;
+    Descriptor->PinGroup.ResourceLength = DescriptorSize;
+    Descriptor->PinGroup.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP;
+    Descriptor->PinGroup.RevisionId = AML_RESOURCE_PIN_GROUP_REVISION;
+
+    /* Build pointers to optional areas */
+
+    PinList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_PIN_GROUP));
+    Label = ACPI_ADD_PTR (char, PinList, PinListLength);
+    VendorData = ACPI_ADD_PTR (UINT8, Label, LabelLength);
+
+    /* Setup offsets within the descriptor */
+
+    Descriptor->PinGroup.PinTableOffset = (UINT16) ACPI_PTR_DIFF (PinList, Descriptor);
+    Descriptor->PinGroup.LabelOffset = (UINT16) ACPI_PTR_DIFF (Label, Descriptor);
+
+    /* Process all child initialization nodes */
+
+    for (i = 0; InitializerOp; i++)
+    {
+        switch (i)
+        {
+        case 0: /* Resource Label */
+
+            if (LabelLength < 2)
+            {
+                AslError(ASL_WARNING, ASL_MSG_NULL_STRING, InitializerOp, NULL);
+            }
+            strcpy (Label, InitializerOp->Asl.Value.String);
+
+            break;
+
+        case 1: /* Resource Usage (consumer/producer) */
+
+            RsSetFlagBits16 (&Descriptor->PinGroup.Flags, InitializerOp, 0, 0);
+
+            break;
+
+        case 2: /* Resource Tag (Descriptor Name) */
+
+            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
+            break;
+
+        case 3: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
+            /*
+             * Always set the VendorOffset even if there is no Vendor Data.
+             * This field is required in order to calculate the length
+             * of the ResourceSource at runtime.
+             */
+            Descriptor->PinGroup.VendorOffset = (UINT16)
+                ACPI_PTR_DIFF (VendorData, Descriptor);
+
+            if (RsGetVendorData (InitializerOp, VendorData,
+                (CurrentByteOffset + Descriptor->PinGroup.VendorOffset)))
+            {
+                Descriptor->PinGroup.VendorLength = VendorLength;
+            }
+            break;
+
+        default:
+            /*
+             * PINs come through here, repeatedly. Each PIN must be a WORD.
+             * NOTE: there is no "length" field for this, so from ACPI spec:
+             *  The number of pins in the table can be calculated from:
+             *  PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
+             *  (implies resource source must immediately follow the pin list.)
+             *  Name: _PIN
+             */
+            *PinList = (UINT16) InitializerOp->Asl.Value.Integer;
+            PinList++;
+            PinCount++;
+
+            /* Case 3: First pin number in list */
+
+            if (i == 4)
+            {
+                if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+                {
+                    /* Must be at least one interrupt */
+
+                    AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
+                        InitializerOp, NULL);
+                }
+
+                /* Check now for duplicates in list */
+
+                RsCheckListForDuplicates (InitializerOp);
+
+                /* Create a named field at the start of the list */
+
+                RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
+                    CurrentByteOffset + Descriptor->PinGroup.PinTableOffset);
+            }
+            break;
+        }
+
+        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+    }
+
+    return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    RsDoPinGroupFunctionDescriptor
+ *
+ * PARAMETERS:  Info                - Parse Op and resource template offset
+ *
+ * RETURN:      Completed resource node
+ *
+ * DESCRIPTION: Construct a long "PinGroupFunction" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoPinGroupFunctionDescriptor (
+    ASL_RESOURCE_INFO       *Info)
+{
+    AML_RESOURCE            *Descriptor;
+    ACPI_PARSE_OBJECT       *InitializerOp;
+    ASL_RESOURCE_NODE       *Rnode;
+    char                    *ResourceSource = NULL;
+    char                    *ResourceSourceLabel = NULL;
+    UINT8                   *VendorData = NULL;
+    UINT16                  ResSourceLength;
+    UINT16                  ResSourceLabelLength;
+    UINT16                  VendorLength;
+    UINT16                  DescriptorSize;
+    UINT32                  CurrentByteOffset;
+    UINT32                  i;
+
+    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+    CurrentByteOffset = Info->CurrentByteOffset;
+
+    /*
+     * Calculate lengths for fields that have variable length:
+     * 1) Resource Source string
+     * 2) Resource Source Label string
+     * 3) Vendor Data buffer
+     */
+    ResSourceLength = RsGetStringDataLengthAt (InitializerOp, 2);
+    ResSourceLabelLength = RsGetStringDataLengthAt (InitializerOp, 4);
+    VendorLength = RsGetBufferDataLength (InitializerOp);
+
+    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_FUNCTION) +
+        ResSourceLength + ResSourceLabelLength + VendorLength;
+
+    /* Allocate the local resource node and initialize */
+
+    Rnode = RsAllocateResourceNode (DescriptorSize +
+        sizeof (AML_RESOURCE_LARGE_HEADER));
+
+    Descriptor = Rnode->Buffer;
+    Descriptor->PinGroupFunction.ResourceLength = DescriptorSize;
+    Descriptor->PinGroupFunction.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION;
+    Descriptor->PinGroupFunction.RevisionId = AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION;
+
+    /* Build pointers to optional areas */
+
+    ResourceSource = ACPI_ADD_PTR (char, Descriptor, sizeof (AML_RESOURCE_PIN_GROUP_FUNCTION));
+    ResourceSourceLabel = ACPI_ADD_PTR (char, ResourceSource, ResSourceLength);
+    VendorData = ACPI_ADD_PTR (UINT8, ResourceSourceLabel, ResSourceLabelLength);
+
+    /* Setup offsets within the descriptor */
+
+    Descriptor->PinGroupFunction.ResSourceOffset = (UINT16)
+        ACPI_PTR_DIFF (ResourceSource, Descriptor);
+    Descriptor->PinGroupFunction.ResSourceLabelOffset = (UINT16)
+        ACPI_PTR_DIFF (ResourceSourceLabel, Descriptor);
+
+    /* Process all child initialization nodes */
+
+    for (i = 0; InitializerOp; i++)
+    {
+        switch (i)
+        {
+        case 0: /* Share Type [Flags] (_SHR) */
+
+            RsSetFlagBits16 (&Descriptor->PinGroupFunction.Flags, InitializerOp, 0, 0);
+            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupFunction.Flags), 0);
+            break;
+
+        case 1: /* Function Number [WORD] */
+
+            Descriptor->PinGroupFunction.FunctionNumber = (UINT16) InitializerOp->Asl.Value.Integer;
+            RsCreateDwordField (InitializerOp, ACPI_RESTAG_FUNCTION,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupFunction.FunctionNumber));
+            break;
+
+        case 2: /* ResourceSource [STRING] */
+
+            strcpy (ResourceSource, InitializerOp->Asl.Value.String);
+            break;
+
+        case 3: /* Resource Index */
+
+            Descriptor->PinGroupFunction.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
+            break;
+
+        case 4: /* ResourceSourceLabel [STRING] */
+
+            if (ResSourceLabelLength < 2)
+            {
+                AslError(ASL_WARNING, ASL_MSG_NULL_STRING, InitializerOp, NULL);
+            }
+
+            strcpy (ResourceSourceLabel, InitializerOp->Asl.Value.String);
+            break;
+
+        case 5: /* Resource Usage (consumer/producer) */
+
+            RsSetFlagBits16 (&Descriptor->PinGroupFunction.Flags, InitializerOp, 1, 1);
+
+            break;
+
+        case 6: /* Resource Tag (Descriptor Name) */
+
+            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
+            break;
+
+        case 7: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
+            /*
+             * Always set the VendorOffset even if there is no Vendor Data.
+             * This field is required in order to calculate the length
+             * of the ResourceSource at runtime.
+             */
+            Descriptor->PinGroupFunction.VendorOffset = (UINT16)
+                ACPI_PTR_DIFF (VendorData, Descriptor);
+
+            if (RsGetVendorData (InitializerOp, VendorData,
+                (CurrentByteOffset + Descriptor->PinGroupFunction.VendorOffset)))
+            {
+                Descriptor->PinGroupFunction.VendorLength = VendorLength;
+            }
+            break;
+
+        default:
+            break;
+        }
+
+        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+    }
+
+    return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    RsDoPinGroupConfigDescriptor
+ *
+ * PARAMETERS:  Info                - Parse Op and resource template offset
+ *
+ * RETURN:      Completed resource node
+ *
+ * DESCRIPTION: Construct a long "PinGroupConfig" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoPinGroupConfigDescriptor (
+    ASL_RESOURCE_INFO       *Info)
+{
+    AML_RESOURCE            *Descriptor;
+    ACPI_PARSE_OBJECT       *InitializerOp;
+    ASL_RESOURCE_NODE       *Rnode;
+    char                    *ResourceSource = NULL;
+    char                    *ResourceSourceLabel = NULL;
+    UINT8                   *VendorData = NULL;
+    UINT16                  ResSourceLength;
+    UINT16                  ResSourceLabelLength;
+    UINT16                  VendorLength;
+    UINT16                  DescriptorSize;
+    UINT32                  CurrentByteOffset;
+    UINT32                  i;
+
+    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+    CurrentByteOffset = Info->CurrentByteOffset;
+
+    /*
+     * Calculate lengths for fields that have variable length:
+     * 1) Resource Source string
+     * 2) Resource Source Label string
+     * 3) Vendor Data buffer
+     */
+    ResSourceLength = RsGetStringDataLengthAt (InitializerOp, 3);
+    ResSourceLabelLength = RsGetStringDataLengthAt (InitializerOp, 5);
+    VendorLength = RsGetBufferDataLength (InitializerOp);
+
+    DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_CONFIG) +
+        ResSourceLength + ResSourceLabelLength + VendorLength;
+
+    /* Allocate the local resource node and initialize */
+
+    Rnode = RsAllocateResourceNode (DescriptorSize +
+        sizeof (AML_RESOURCE_LARGE_HEADER));
+
+    Descriptor = Rnode->Buffer;
+    Descriptor->PinGroupConfig.ResourceLength = DescriptorSize;
+    Descriptor->PinGroupConfig.DescriptorType = ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG;
+    Descriptor->PinGroupConfig.RevisionId = AML_RESOURCE_PIN_GROUP_CONFIG_REVISION;
+
+    /* Build pointers to optional areas */
+
+    ResourceSource = ACPI_ADD_PTR (char, Descriptor, sizeof (AML_RESOURCE_PIN_GROUP_CONFIG));
+    ResourceSourceLabel = ACPI_ADD_PTR (char, ResourceSource, ResSourceLength);
+    VendorData = ACPI_ADD_PTR (UINT8, ResourceSourceLabel, ResSourceLabelLength);
+
+    /* Setup offsets within the descriptor */
+
+    Descriptor->PinGroupConfig.ResSourceOffset = (UINT16)
+        ACPI_PTR_DIFF (ResourceSource, Descriptor);
+    Descriptor->PinGroupConfig.ResSourceLabelOffset = (UINT16)
+        ACPI_PTR_DIFF (ResourceSourceLabel, Descriptor);
+
+    /* Process all child initialization nodes */
+
+    for (i = 0; InitializerOp; i++)
+    {
+        BOOLEAN isValid;
+
+        switch (i)
+        {
+        case 0: /* Share Type [Flags] (_SHR) */
+
+            RsSetFlagBits16 (&Descriptor->PinGroupConfig.Flags, InitializerOp, 0, 0);
+            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.Flags), 0);
+            break;
+
+        case 1: /* Pin Config Type [BYTE] (_TYP) */
+
+            isValid = InitializerOp->Asl.Value.Integer <= 0x0d;
+            if (!isValid)
+            {
+                isValid = InitializerOp->Asl.Value.Integer >= 0x80 &&
+                          InitializerOp->Asl.Value.Integer <= 0xff;
+            }
+            if (!isValid)
+            {
+                    AslError (ASL_ERROR, ASL_MSG_RANGE, InitializerOp, NULL);
+            }
+
+            Descriptor->PinGroupConfig.PinConfigType = (UINT8) InitializerOp->Asl.Value.Integer;
+            RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG_TYPE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.PinConfigType));
+
+            break;
+
+        case 2: /* Pin Config Value [DWORD] (_VAL) */
+
+            Descriptor->PinGroupConfig.PinConfigValue = (UINT32) InitializerOp->Asl.Value.Integer;
+            RsCreateDwordField (InitializerOp, ACPI_RESTAG_PINCONFIG_VALUE,
+                CurrentByteOffset + ASL_RESDESC_OFFSET (PinGroupConfig.PinConfigValue));
+            break;
+
+        case 3: /* ResourceSource [STRING] */
+
+            /* Copy string to the descriptor */
+
+            strcpy (ResourceSource, InitializerOp->Asl.Value.String);
+            break;
+
+        case 4: /* Resource Index */
+
+            Descriptor->PinGroupConfig.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
+            break;
+
+        case 5: /* ResourceSourceLabel [STRING] */
+
+            if (ResSourceLabelLength < 2)
+            {
+                AslError(ASL_WARNING, ASL_MSG_NULL_STRING, InitializerOp, NULL);
+            }
+
+            strcpy (ResourceSourceLabel, InitializerOp->Asl.Value.String);
+            break;
+
+        case 6: /* Resource Usage (consumer/producer) */
+
+            RsSetFlagBits16 (&Descriptor->PinGroupConfig.Flags, InitializerOp, 1, 1);
+
+            break;
+
+        case 7: /* Resource Tag (Descriptor Name) */
+
+            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
+            break;
+
+        case 8: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
+            /*
+             * Always set the VendorOffset even if there is no Vendor Data.
+             * This field is required in order to calculate the length
+             * of the ResourceSource at runtime.
+             */
+            Descriptor->PinGroupConfig.VendorOffset = (UINT16)
+                ACPI_PTR_DIFF (VendorData, Descriptor);
+
+            if (RsGetVendorData (InitializerOp, VendorData,
+                (CurrentByteOffset + Descriptor->PinGroupConfig.VendorOffset)))
+            {
+                Descriptor->PinGroupConfig.VendorLength = VendorLength;
+            }
+            break;
+
+        default:
+            break;
+        }
+
+        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+    }
+
+    return (Rnode);
+}
diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
index ae4d3714..d09852c7 100644
--- a/src/acpica/source/compiler/aslrules.y
+++ b/src/acpica/source/compiler/aslrules.y
@@ -269,11 +269,9 @@  TermArg
     : SimpleName                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
     | Type2Opcode                   {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
     | DataObject                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
-/*
     | PARSEOP_OPEN_PAREN
         TermArg
-        PARSEOP_CLOSE_PAREN         {}
-*/
+        PARSEOP_CLOSE_PAREN         {$$ = TrSetNodeFlags ($2, NODE_IS_TERM_ARG);}
     ;
 
 /*
@@ -395,7 +393,7 @@  Object
     : CompilerDirective             {}
     | NamedObject                   {}
     | NameSpaceModifier             {}
-//    | StructureTerm                 {}
+/*    | StructureTerm                 {} */
     ;
 
 PackageList
@@ -644,7 +642,7 @@  NamedObject
 NameSpaceModifier
     : AliasTerm                     {}
     | NameTerm                      {}
-//    | NameTermAslPlus               {}
+/*    | NameTermAslPlus               {} */
     | ScopeTerm                     {}
     ;
 
@@ -751,8 +749,8 @@  Type2IntegerOpcode                  /* "Type3" opcodes */
     | FromBCDTerm                   {}
     | IncTerm                       {}
     | IndexTerm                     {}
-//    | StructureIndexTerm            {}
-//    | StructurePointerTerm          {}
+/*    | StructureIndexTerm            {} */
+/*    | StructurePointerTerm          {} */
     | LAndTerm                      {}
     | LEqualTerm                    {}
     | LGreaterTerm                  {}
@@ -827,8 +825,8 @@  Type6Opcode
     | DerefOfTerm                   {}
     | IndexTerm                     {}
     | IndexExpTerm                  {}
-//    | StructureIndexTerm            {}
-//    | StructurePointerTerm          {}
+/*    | StructureIndexTerm            {} */
+/*    | StructurePointerTerm          {} */
     | MethodInvocationTerm          {}
     ;
 
diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
index bef4c769..2f037bf8 100644
--- a/src/acpica/source/compiler/aslstartup.c
+++ b/src/acpica/source/compiler/aslstartup.c
@@ -316,6 +316,11 @@  AslDetectSourceFileType (
         Type = ASL_INPUT_TYPE_BINARY_ACPI_TABLE;
         goto Cleanup;
     }
+    else
+    {
+        fprintf (stderr,
+            "Binary file does not contain a valid ACPI table\n");
+    }
 
     Type = ASL_INPUT_TYPE_BINARY;
 
@@ -456,7 +461,7 @@  AslDoOneFile (
     /*
      * AML Disassembly (Optional)
      */
-    if (Gbl_DisasmFlag)
+    if (AcpiGbl_DisasmFlag)
     {
         Status = AslDoDisassembly ();
         if (Status != AE_CTRL_CONTINUE)
@@ -581,7 +586,7 @@  AslDoOneFile (
         CvDbgPrint ("OUTPUTFILENAME: %s\n", Gbl_OutputFilenamePrefix);
             Gbl_Files[ASL_FILE_INPUT].Filename =
                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
-
+            AcpiGbl_DisasmFlag = TRUE;
             fprintf (stderr, "\n");
             AslDoDisassembly ();
 
@@ -601,7 +606,7 @@  AslDoOneFile (
 
         FlCloseFile (ASL_FILE_INPUT);
         Gbl_DoCompile = FALSE;
-        Gbl_DisasmFlag = TRUE;
+        AcpiGbl_DisasmFlag = TRUE;
         Status = AslDoDisassembly ();
         return (Status);
 
diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
index 13054067..42cee752 100644
--- a/src/acpica/source/compiler/aslsupport.l
+++ b/src/acpica/source/compiler/aslsupport.l
@@ -697,15 +697,19 @@  AslDoCommentType2 (
 
 
     AslInsertLineBuffer ('/');
-    AslInsertLineBuffer ('*');
 
     if (Gbl_CaptureComments && CurrentState.CaptureComments)
     {
+        AslInsertLineBuffer ('*');
         *StringBuffer = '/';
         ++StringBuffer;
         *StringBuffer = '*';
         ++StringBuffer;
     }
+    else
+    {
+        AslInsertLineBuffer ('/');
+    }
 
     while (((c = input ()) != '\n') && (c != EOF))
     {
@@ -1006,15 +1010,6 @@  CompletedString:
     *StringBuffer = 0;
 
     CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
-    if (!CleanString)
-    {
-        AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
-            Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
-            Gbl_CurrentLineOffset, Gbl_CurrentColumn,
-            Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
-        return (FALSE);
-    }
-
     strcpy (CleanString, MsgBuffer);
     AslCompilerlval.s = CleanString;
     return (TRUE);
diff --git a/src/acpica/source/compiler/asltokens.y b/src/acpica/source/compiler/asltokens.y
index ba0803f8..e6e9006d 100644
--- a/src/acpica/source/compiler/asltokens.y
+++ b/src/acpica/source/compiler/asltokens.y
@@ -389,6 +389,11 @@  NoEcho('
 %token <i> PARSEOP_PARITYTYPE_NONE
 %token <i> PARSEOP_PARITYTYPE_ODD
 %token <i> PARSEOP_PARITYTYPE_SPACE
+%token <i> PARSEOP_PINCONFIG
+%token <i> PARSEOP_PINFUNCTION
+%token <i> PARSEOP_PINGROUP
+%token <i> PARSEOP_PINGROUPCONFIG
+%token <i> PARSEOP_PINGROUPFUNCTION
 %token <i> PARSEOP_PIN_NOPULL
 %token <i> PARSEOP_PIN_PULLDEFAULT
 %token <i> PARSEOP_PIN_PULLDOWN
diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c
index 0f31296e..b80a4226 100644
--- a/src/acpica/source/compiler/asltree.c
+++ b/src/acpica/source/compiler/asltree.c
@@ -295,17 +295,14 @@  TrAllocateNode (
         }
 
         Gbl_CommentState.Latest_Parse_Node = Op;
-        if (Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName)
-        {
-            CvDbgPrint ("trallocatenode=Set latest parse node to this node.\n");
-            CvDbgPrint ("           Op->Asl.ParseOpName = %s\n",
-                Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName);
-            CvDbgPrint ("           Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode);
+        CvDbgPrint ("trallocatenode=Set latest parse node to this node.\n");
+        CvDbgPrint ("           Op->Asl.ParseOpName = %s\n",
+            Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName);
+        CvDbgPrint ("           Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode);
 
-            if (Op->Asl.FileChanged)
-            {
-                CvDbgPrint("    file has been changed!\n");
-            }
+        if (Op->Asl.FileChanged)
+        {
+            CvDbgPrint("    file has been changed!\n");
         }
 
         /*
@@ -1660,7 +1657,7 @@  TrLinkChildNode (
      * turn on capture comments as it signifies that we are done parsing
      * a method call.
      */
-    if (Gbl_CaptureComments)
+    if (Gbl_CaptureComments && Op1)
     {
         if (Op1->Asl.ParseOpcode == PARSEOP_METHODCALL)
         {
diff --git a/src/acpica/source/compiler/asltypes.y b/src/acpica/source/compiler/asltypes.y
index 7f0680ef..6886a0dc 100644
--- a/src/acpica/source/compiler/asltypes.y
+++ b/src/acpica/source/compiler/asltypes.y
@@ -432,6 +432,11 @@  NoEcho('
 %type <n> Memory32Term
 %type <n> NameSeg
 %type <n> NameString
+%type <n> PinConfigTerm
+%type <n> PinFunctionTerm
+%type <n> PinGroupTerm
+%type <n> PinGroupConfigTerm
+%type <n> PinGroupFunctionTerm
 %type <n> QWordIOTerm
 %type <n> QWordMemoryTerm
 %type <n> QWordSpaceTerm
@@ -487,6 +492,7 @@  NoEcho('
 %type <n> OptionalReference
 %type <n> OptionalResourceType
 %type <n> OptionalResourceType_First
+%type <n> OptionalProducerResourceType
 %type <n> OptionalReturnArg
 %type <n> OptionalSerializeRuleKeyword
 %type <n> OptionalShareType
diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
index 202cf38d..fd91baeb 100644
--- a/src/acpica/source/compiler/aslutils.c
+++ b/src/acpica/source/compiler/aslutils.c
@@ -635,7 +635,7 @@  UtCheckIntegerRange (
  *
  * PARAMETERS:  Length              - Size of buffer requested
  *
- * RETURN:      Pointer to the buffer. Aborts on allocation failure
+ * RETURN:      Pointer to the buffer. Aborts compiler on allocation failure
  *
  * DESCRIPTION: Allocate a string buffer. Bypass the local
  *              dynamic memory manager for performance reasons (This has a
@@ -833,10 +833,6 @@  UtInternalizeName (
     /* We need a segment to store the internal name */
 
     Info.InternalName = UtStringCacheCalloc (Info.Length);
-    if (!Info.InternalName)
-    {
-        return (AE_NO_MEMORY);
-    }
 
     /* Build the name */
 
diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
index ec1ce21b..62933ec1 100644
--- a/src/acpica/source/compiler/aslxref.c
+++ b/src/acpica/source/compiler/aslxref.c
@@ -621,7 +621,8 @@  XfNamespaceLocateBegin (
         (!(OpInfo->Flags & AML_CREATE)) &&
         (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
         (Op->Asl.ParseOpcode != PARSEOP_NAMESEG)    &&
-        (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
+        (Op->Asl.ParseOpcode != PARSEOP_METHODCALL) &&
+        (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
     {
         return_ACPI_STATUS (AE_OK);
     }
@@ -644,7 +645,8 @@  XfNamespaceLocateBegin (
     Flags = ACPI_NS_SEARCH_PARENT;
     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
-        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
+        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) ||
+        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
     {
         /*
          * These are name references, do not push the scope stack
@@ -1183,7 +1185,8 @@  XfNamespaceLocateEnd (
 
     if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
         (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)    ||
-        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
+        (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) ||
+        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
     {
         return_ACPI_STATUS (AE_OK);
     }
diff --git a/src/acpica/source/compiler/cvcompiler.c b/src/acpica/source/compiler/cvcompiler.c
index e8366ce5..fab9fb94 100644
--- a/src/acpica/source/compiler/cvcompiler.c
+++ b/src/acpica/source/compiler/cvcompiler.c
@@ -191,6 +191,7 @@  CvProcessComment (
         *StringBuffer = (char) c1;
         ++StringBuffer;
         *StringBuffer = 0;
+
         CvDbgPrint ("Multi-line comment\n");
         CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
         strcpy (CommentString, MsgBuffer);
@@ -198,17 +199,15 @@  CvProcessComment (
         CvDbgPrint ("CommentString: %s\n", CommentString);
 
         /*
-         * Determine whether if this comment spans multiple lines.
-         * If so, break apart the comment by line so that it can be
-         * properly indented.
+         * Determine whether if this comment spans multiple lines. If so,
+         * break apart the comment by storing each line in a different node
+         * within the comment list. This allows the disassembler to
+         * properly indent a multi-line comment.
          */
-        if (strchr (CommentString, '\n') != NULL)
+        LineToken = strtok (CommentString, "\n");
+
+        if (LineToken)
         {
-            /*
-             * Get the first token. The for loop pads subsequent lines
-             * for comments similar to the style of this comment.
-             */
-            LineToken = strtok (CommentString, "\n");
             FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1);
             strcpy (FinalLineToken, LineToken);
 
@@ -263,7 +262,10 @@  CvProcessComment (
             * if this is not a regular comment, pad with extra spaces that appeared
             * in the original source input to retain the original spacing.
             */
-            FinalCommentString = UtStringCacheCalloc (strlen (CommentString) + CurrentState.SpacesBefore + 1);
+            FinalCommentString =
+                UtStringCacheCalloc (strlen (CommentString) +
+                CurrentState.SpacesBefore + 1);
+
             for (i=0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) &&
                 (i < CurrentState.SpacesBefore); ++i)
             {
@@ -333,7 +335,9 @@  CvProcessCommentType2 (
          * [ (spaces) (comment)  ( * /) ('\0') ]
          *
          */
-        FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore + strlen (CommentString) + 3 + 1);
+        FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore +
+            strlen (CommentString) + 3 + 1);
+
         for (i=0; (CurrentState.CommentType!=1) && (i<CurrentState.SpacesBefore); ++i)
         {
             FinalCommentString[i] = ' ';
@@ -556,6 +560,12 @@  CgWriteOneAmlComment(
     UINT8 CommentOption = InputOption;
     UINT8 CommentOpcode = (UINT8)AML_COMMENT_OP;
 
+
+    if (!CommentToPrint)
+    {
+        return;
+    }
+
     CgLocalWriteAmlData (Op, &CommentOpcode, 1);
     CgLocalWriteAmlData (Op, &CommentOption, 1);
 
@@ -603,8 +613,12 @@  CgWriteAmlComment(
 
         NewFilename =
             FlGenerateFilename (Op->Asl.Filename, FILE_SUFFIX_DISASSEMBLY);
-        CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
-            NewFilename, Op->Asl.ParseOpName);
+        if (NewFilename)
+        {
+            CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
+                NewFilename, Op->Asl.ParseOpName);
+        }
+
         CgWriteOneAmlComment(Op, NewFilename, FILENAME_COMMENT);
 
         if (Op->Asl.ParentFilename &&
@@ -688,17 +702,16 @@  CgWriteAmlComment(
  *
  ******************************************************************************/
 
-ACPI_COMMENT_NODE*
+ACPI_COMMENT_NODE *
 CvCommentNodeCalloc (
     void)
 {
    ACPI_COMMENT_NODE        *NewCommentNode;
 
 
-   NewCommentNode =
-       (ACPI_COMMENT_NODE*) UtLocalCalloc (sizeof(ACPI_COMMENT_NODE));
+   NewCommentNode = UtLocalCalloc (sizeof (ACPI_COMMENT_NODE));
    NewCommentNode->Next = NULL;
-   return NewCommentNode;
+   return (NewCommentNode);
 }
 
 
@@ -907,10 +920,12 @@  CvAppendInlineComment (
     {
         return ToAdd;
     }
-    if (ToAdd)
+    if (!ToAdd)
     {
-        Size = strlen (ToAdd);
+        return InlineComment;
     }
+
+    Size = strlen (ToAdd);
     Size += strlen (InlineComment);
     Str = UtStringCacheCalloc (Size+1);
     strcpy (Str, InlineComment);
diff --git a/src/acpica/source/compiler/cvdisasm.c b/src/acpica/source/compiler/cvdisasm.c
index e75ee0ab..6e9b73f0 100644
--- a/src/acpica/source/compiler/cvdisasm.c
+++ b/src/acpica/source/compiler/cvdisasm.c
@@ -314,6 +314,7 @@  CvPrintOneCommentType (
 
     if (*CommentToPrint)
     {
+        CommentExists = TRUE;
         AcpiOsPrintf ("%s", *CommentToPrint);
         *CommentToPrint = NULL;
     }
@@ -495,6 +496,7 @@  CvSwitchFiles(
 {
     char                    *Filename = Op->Common.CvFilename;
     ACPI_FILE_NODE          *FNode;
+    ACPI_FILE_NODE          *Current;
 
     CvDbgPrint ("Switching from %s to %s\n", AcpiGbl_CurrentFilename, Filename);
     FNode = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot);
@@ -509,23 +511,23 @@  CvSwitchFiles(
         AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0, NULL, MsgBuffer);
         AslAbort ();
     }
+    Current = FNode;
 
     /*
      * If the previous file is a descendent of the current file,
      * make sure that Include statements from the current file
      * to the previous have been emitted.
      */
-    while (FNode &&
-           FNode->Parent &&
-           AcpiUtStricmp (FNode->Filename, AcpiGbl_CurrentFilename))
+    while (Current &&
+           Current->Parent &&
+           AcpiUtStricmp (Current->Filename, AcpiGbl_CurrentFilename))
     {
-        CvPrintInclude (FNode, Level);
-        FNode = FNode->Parent;
+        CvPrintInclude (Current, Level);
+        Current = Current->Parent;
     }
 
-    /* Redirect output to the Op->Common.CvFilename */
+    /* Redirect output to Op->Common.CvFilename */
 
-    FNode = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot);
     AcpiOsRedirectOutput (FNode->File);
     AcpiGbl_CurrentFilename = FNode->Filename;
 }
diff --git a/src/acpica/source/compiler/cvparser.c b/src/acpica/source/compiler/cvparser.c
index cdb165dc..060e8aed 100644
--- a/src/acpica/source/compiler/cvparser.c
+++ b/src/acpica/source/compiler/cvparser.c
@@ -215,7 +215,7 @@  CvIsFilename (
 
     for(i = 0; i<Length; ++i)
     {
-        if (!isprint (Filename[i]))
+        if (!isprint ((int) Filename[i]))
         {
             return FALSE;
         }
@@ -440,6 +440,11 @@  CvFilenameExists(
     ACPI_FILE_NODE          *Current = Head;
 
 
+    if (!Filename)
+    {
+        return (NULL);
+    }
+
     while (Current)
     {
         if (!AcpiUtStricmp (Current->Filename, Filename))
diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
index 9a6f08ee..61b40b4a 100644
--- a/src/acpica/source/compiler/dtcompiler.h
+++ b/src/acpica/source/compiler/dtcompiler.h
@@ -578,6 +578,10 @@  DtCompileHest (
     void                    **PFieldList);
 
 ACPI_STATUS
+DtCompileHmat (
+    void                    **PFieldList);
+
+ACPI_STATUS
 DtCompileIort (
     void                    **PFieldList);
 
@@ -618,6 +622,10 @@  DtCompilePmtt (
     void                    **PFieldList);
 
 ACPI_STATUS
+DtCompilePptt (
+    void                    **PFieldList);
+
+ACPI_STATUS
 DtCompilePcct (
     void                    **PFieldList);
 
@@ -698,6 +706,7 @@  extern const unsigned char  TemplateFadt[];
 extern const unsigned char  TemplateFpdt[];
 extern const unsigned char  TemplateGtdt[];
 extern const unsigned char  TemplateHest[];
+extern const unsigned char  TemplateHmat[];
 extern const unsigned char  TemplateHpet[];
 extern const unsigned char  TemplateIort[];
 extern const unsigned char  TemplateIvrs[];
@@ -712,6 +721,7 @@  extern const unsigned char  TemplateMtmr[];
 extern const unsigned char  TemplateNfit[];
 extern const unsigned char  TemplatePcct[];
 extern const unsigned char  TemplatePmtt[];
+extern const unsigned char  TemplatePptt[];
 extern const unsigned char  TemplateRasf[];
 extern const unsigned char  TemplateRsdt[];
 extern const unsigned char  TemplateS3pt[];
@@ -731,6 +741,7 @@  extern const unsigned char  TemplateWdat[];
 extern const unsigned char  TemplateWddt[];
 extern const unsigned char  TemplateWdrt[];
 extern const unsigned char  TemplateWpbt[];
+extern const unsigned char  TemplateWsmt[];
 extern const unsigned char  TemplateXenv[];
 extern const unsigned char  TemplateXsdt[];
 
diff --git a/src/acpica/source/compiler/dtfield.c b/src/acpica/source/compiler/dtfield.c
index 33afa3bf..13e8b638 100644
--- a/src/acpica/source/compiler/dtfield.c
+++ b/src/acpica/source/compiler/dtfield.c
@@ -679,6 +679,36 @@  DtCompileFlag (
         BitLength = 2;
         break;
 
+    case ACPI_DMT_FLAGS4_0:
+
+        BitPosition = 0;
+        BitLength = 4;
+        break;
+
+    case ACPI_DMT_FLAGS4_4:
+
+        BitPosition = 4;
+        BitLength = 4;
+        break;
+
+    case ACPI_DMT_FLAGS4_8:
+
+        BitPosition = 8;
+        BitLength = 4;
+        break;
+
+    case ACPI_DMT_FLAGS4_12:
+
+        BitPosition = 12;
+        BitLength = 4;
+        break;
+
+    case ACPI_DMT_FLAGS16_16:
+
+        BitPosition = 16;
+        BitLength = 16;
+        break;
+
     default:
 
         DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode");
diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c
index c25f4b0e..bdf0419c 100644
--- a/src/acpica/source/compiler/dttable1.c
+++ b/src/acpica/source/compiler/dttable1.c
@@ -1249,6 +1249,16 @@  DtCompileHest (
             InfoTable = AcpiDmTableInfoHest9;
             break;
 
+        case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
+
+            InfoTable = AcpiDmTableInfoHest10;
+            break;
+
+        case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
+
+            InfoTable = AcpiDmTableInfoHest11;
+            break;
+
         default:
 
             /* Cannot continue on unknown type */
@@ -1283,6 +1293,12 @@  DtCompileHest (
                 Subtable->Buffer))->NumHardwareBanks;
             break;
 
+        case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
+
+            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
+                Subtable->Buffer))->NumHardwareBanks;
+            break;
+
         default:
 
             break;
@@ -1308,6 +1324,218 @@  DtCompileHest (
 
 /******************************************************************************
  *
+ * FUNCTION:    DtCompileHmat
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile HMAT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileHmat (
+    void                    **List)
+{
+    ACPI_STATUS             Status;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    DT_FIELD                *SubtableStart;
+    DT_FIELD                *EntryStart;
+    ACPI_HMAT_STRUCTURE     *HmatStruct;
+    ACPI_HMAT_LOCALITY      *HmatLocality;
+    ACPI_HMAT_CACHE         *HmatCache;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    UINT32                  IntPDNumber;
+    UINT32                  TgtPDNumber;
+    UINT64                  EntryNumber;
+    UINT16                  SMBIOSHandleNumber;
+
+
+    ParentTable = DtPeekSubtable ();
+
+    Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat,
+        &Subtable, TRUE);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+    DtInsertSubtable (ParentTable, Subtable);
+
+    while (*PFieldList)
+    {
+        /* Compile HMAT structure header */
+
+        SubtableStart = *PFieldList;
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr,
+            &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+        DtInsertSubtable (ParentTable, Subtable);
+
+        HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer);
+        HmatStruct->Length = Subtable->Length;
+
+        /* Compile HMAT structure body */
+
+        switch (HmatStruct->Type)
+        {
+        case ACPI_HMAT_TYPE_ADDRESS_RANGE:
+
+            InfoTable = AcpiDmTableInfoHmat0;
+            break;
+
+        case ACPI_HMAT_TYPE_LOCALITY:
+
+            InfoTable = AcpiDmTableInfoHmat1;
+            break;
+
+        case ACPI_HMAT_TYPE_CACHE:
+
+            InfoTable = AcpiDmTableInfoHmat2;
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT");
+            return (AE_ERROR);
+        }
+
+        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+        DtInsertSubtable (ParentTable, Subtable);
+        HmatStruct->Length += Subtable->Length;
+
+        /* Compile HMAT structure additionals */
+
+        switch (HmatStruct->Type)
+        {
+        case ACPI_HMAT_TYPE_LOCALITY:
+
+            HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY,
+                Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
+
+            /* Compile initiator proximity domain list */
+
+            IntPDNumber = 0;
+            while (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList,
+                    AcpiDmTableInfoHmat1a, &Subtable, TRUE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                if (!Subtable)
+                {
+                    break;
+                }
+                DtInsertSubtable (ParentTable, Subtable);
+                HmatStruct->Length += Subtable->Length;
+                IntPDNumber++;
+            }
+            HmatLocality->NumberOfInitiatorPDs = IntPDNumber;
+
+            /* Compile target proximity domain list */
+
+            TgtPDNumber = 0;
+            while (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList,
+                    AcpiDmTableInfoHmat1b, &Subtable, TRUE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                if (!Subtable)
+                {
+                    break;
+                }
+                DtInsertSubtable (ParentTable, Subtable);
+                HmatStruct->Length += Subtable->Length;
+                TgtPDNumber++;
+            }
+            HmatLocality->NumberOfTargetPDs = TgtPDNumber;
+
+            /* Save start of the entries for reporting errors */
+
+            EntryStart = *PFieldList;
+
+            /* Compile latency/bandwidth entries */
+
+            EntryNumber = 0;
+            while (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList,
+                    AcpiDmTableInfoHmat1c, &Subtable, TRUE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                if (!Subtable)
+                {
+                    break;
+                }
+                DtInsertSubtable (ParentTable, Subtable);
+                HmatStruct->Length += Subtable->Length;
+                EntryNumber++;
+            }
+
+            /* Validate number of entries */
+
+            if (EntryNumber !=
+                ((UINT64)IntPDNumber * (UINT64)TgtPDNumber))
+            {
+                DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT");
+                return (AE_ERROR);
+            }
+            break;
+
+        case ACPI_HMAT_TYPE_CACHE:
+
+            /* Compile SMBIOS handles */
+
+            HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE,
+                Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
+            SMBIOSHandleNumber = 0;
+            while (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList,
+                    AcpiDmTableInfoHmat2a, &Subtable, TRUE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+                if (!Subtable)
+                {
+                    break;
+                }
+                DtInsertSubtable (ParentTable, Subtable);
+                HmatStruct->Length += Subtable->Length;
+                SMBIOSHandleNumber++;
+            }
+            HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber;
+            break;
+
+        default:
+
+            break;
+        }
+    }
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
  * FUNCTION:    DtCompileIort
  *
  * PARAMETERS:  List                - Current field list pointer
diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c
index e1d0e8bf..356a7d0d 100644
--- a/src/acpica/source/compiler/dttable2.c
+++ b/src/acpica/source/compiler/dttable2.c
@@ -871,6 +871,16 @@  DtCompilePcct (
             InfoTable = AcpiDmTableInfoPcct2;
             break;
 
+        case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
+
+            InfoTable = AcpiDmTableInfoPcct3;
+            break;
+
+        case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
+
+            InfoTable = AcpiDmTableInfoPcct4;
+            break;
+
         default:
 
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
@@ -1037,6 +1047,125 @@  DtCompilePmtt (
 
 /******************************************************************************
  *
+ * FUNCTION:    DtCompilePptt
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile PPTT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompilePptt (
+    void                    **List)
+{
+    ACPI_STATUS             Status;
+    ACPI_SUBTABLE_HEADER    *PpttHeader;
+    ACPI_PPTT_PROCESSOR     *PpttProcessor = NULL;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    DT_FIELD                *SubtableStart;
+
+
+    ParentTable = DtPeekSubtable ();
+    while (*PFieldList)
+    {
+        SubtableStart = *PFieldList;
+
+        /* Compile PPTT subtable header */
+
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPpttHdr,
+            &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+        DtInsertSubtable (ParentTable, Subtable);
+        PpttHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
+        PpttHeader->Length = (UINT8)(Subtable->Length);
+
+        switch (PpttHeader->Type)
+        {
+        case ACPI_PPTT_TYPE_PROCESSOR:
+
+            InfoTable = AcpiDmTableInfoPptt0;
+            break;
+
+        case ACPI_PPTT_TYPE_CACHE:
+
+            InfoTable = AcpiDmTableInfoPptt1;
+            break;
+
+        case ACPI_PPTT_TYPE_ID:
+
+            InfoTable = AcpiDmTableInfoPptt2;
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PPTT");
+            return (AE_ERROR);
+        }
+
+        /* Compile PPTT subtable body */
+
+        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+        DtInsertSubtable (ParentTable, Subtable);
+        PpttHeader->Length += (UINT8)(Subtable->Length);
+
+        /* Compile PPTT subtable additionals */
+
+        switch (PpttHeader->Type)
+        {
+        case ACPI_PPTT_TYPE_PROCESSOR:
+
+            PpttProcessor = ACPI_SUB_PTR (ACPI_PPTT_PROCESSOR,
+                Subtable->Buffer, sizeof (ACPI_SUBTABLE_HEADER));
+            if (PpttProcessor)
+            {
+                /* Compile initiator proximity domain list */
+
+                PpttProcessor->NumberOfPrivResources = 0;
+                while (*PFieldList)
+                {
+                    Status = DtCompileTable (PFieldList,
+                        AcpiDmTableInfoPptt0a, &Subtable, TRUE);
+                    if (ACPI_FAILURE (Status))
+                    {
+                        return (Status);
+                    }
+                    if (!Subtable)
+                    {
+                        break;
+                    }
+
+                    DtInsertSubtable (ParentTable, Subtable);
+                    PpttHeader->Length += (UINT8)(Subtable->Length);
+                    PpttProcessor->NumberOfPrivResources++;
+                }
+            }
+            break;
+
+        default:
+
+            break;
+        }
+    }
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
  * FUNCTION:    DtCompileRsdt
  *
  * PARAMETERS:  List                - Current field list pointer
@@ -1324,6 +1453,11 @@  DtCompileSrat (
             InfoTable = AcpiDmTableInfoSrat3;
             break;
 
+        case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
+
+            InfoTable = AcpiDmTableInfoSrat4;
+            break;
+
         default:
 
             DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
index 701e70f4..bb4dded4 100644
--- a/src/acpica/source/compiler/dttemplate.h
+++ b/src/acpica/source/compiler/dttemplate.h
@@ -577,11 +577,11 @@  const unsigned char TemplateGtdt[] =
 
 const unsigned char TemplateHest[] =
 {
-    0x48,0x45,0x53,0x54,0xD4,0x01,0x00,0x00,  /* 00000000    "HEST...." */
-    0x01,0x20,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ". INTEL " */
-    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
+    0x48,0x45,0x53,0x54,0x7C,0x02,0x00,0x00,  /* 00000000    "HEST|..." */
+    0x01,0x97,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x28,0x05,0x10,0x20,0x04,0x00,0x00,0x00,  /* 00000020    "(.. ...." */
+    0x03,0x03,0x17,0x20,0x04,0x00,0x00,0x00,  /* 00000020    "... ...." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,  /* 00000028    "........" */
     0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
@@ -596,7 +596,7 @@  const unsigned char TemplateHest[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
     0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x01,  /* 00000088    "........" */
     0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000090    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
+    0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000098    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000A8    "........" */
     0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,  /* 000000B0    "........" */
@@ -635,7 +635,52 @@  const unsigned char TemplateHest[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C8    "........" */
-    0x00,0x10,0x00,0x00                       /* 000001D0    "...."     */
+    0x00,0x10,0x00,0x00,0x0A,0x00,0x03,0x00,  /* 000001D0    "........" */
+    0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,  /* 000001D8    "........" */
+    0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,  /* 000001E0    "........" */
+    0x00,0x40,0x00,0x04,0x00,0x00,0x00,0x00,  /* 000001E8    ".@......" */
+    0x00,0x00,0x00,0x00,0x04,0x1C,0x00,0x00,  /* 000001F0    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001F8    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000208    "........" */
+    0x00,0x10,0x00,0x00,0x00,0x40,0x00,0x04,  /* 00000210    ".....@.." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000218    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000220    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000228    "........" */
+    0x0B,0x00,0x01,0x00,0x00,0x00,0x00,0x01,  /* 00000230    "........" */
+    0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000238    "........" */
+    0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000240    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000248    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000250    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000258    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000260    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000268    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000270    "........" */
+    0x00,0x00,0x00,0x00                       /* 00000278    "...."     */
+};
+
+const unsigned char TemplateHmat[] =
+{
+    0x48,0x4D,0x41,0x54,0x9C,0x00,0x00,0x00,  /* 00000000    "HMAT...." */
+    0x00,0x54,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".TINTEL " */
+    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
+    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x03,0x03,0x17,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
+    0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,  /* 00000028    "....(..." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
+    0x01,0x00,0x00,0x00,0x2A,0x00,0x00,0x00,  /* 00000050    "....*..." */
+    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000058    "........" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000070    "........" */
+    0x00,0x00,0x02,0x00,0x00,0x00,0x22,0x00,  /* 00000078    "......"." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
+    0x01,0x00,0x00,0x00                       /* 00000098    "...."     */
 };
 
 const unsigned char TemplateHpet[] =
@@ -958,39 +1003,80 @@  const unsigned char TemplateMtmr[] =
 
 const unsigned char TemplatePcct[] =
 {
-    0x50,0x43,0x43,0x54,0x06,0x01,0x00,0x00,  /* 00000000    "PCCT...." */
-    0x01,0xE3,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
-    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
-    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x18,0x03,0x16,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
+    0x50,0x43,0x43,0x54,0x4e,0x02,0x00,0x00,  /* 00000000    "PCCTN..." */
+    0x01,0x47,0x49,0x4e,0x54,0x45,0x4c,0x20,  /* 00000008    ".GINTEL " */
+    0x54,0x65,0x6d,0x70,0x6c,0x61,0x74,0x65,  /* 00000010    "Template" */
+    0x01,0x00,0x00,0x00,0x49,0x4e,0x54,0x4c,  /* 00000018    "....INTL" */
+    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
-    0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
+    0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000030    ".>......" */
     0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,  /* 00000038    "........" */
     0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000040    """""""""" */
     0x01,0x32,0x00,0x03,0x33,0x33,0x33,0x33,  /* 00000048    ".2..3333" */
     0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,  /* 00000050    "3333DDDD" */
     0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x55,  /* 00000058    "DDDDUUUU" */
     0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,  /* 00000060    "UUUUffff" */
-    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3E,  /* 00000068    "wwww...>" */
+    0x77,0x77,0x77,0x77,0x88,0x88,0x01,0x3e,  /* 00000068    "wwww...>" */
     0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000070    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000080    ".......2" */
     0x00,0x03,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000088    "..DDDDDD" */
     0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000090    "DDDDDDDD" */
     0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 00000098    "DDUUUUUU" */
-    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000A0    "UUffffww" */
-    0x77,0x77,0x88,0x88,0x02,0x5A,0x01,0x00,  /* 000000A8    "ww...Z.." */
-    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000B0    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000B8    "........" */
-    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000C0    ".....2.." */
-    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000C8    "DDDDDDDD" */
-    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000D0    "DDDDDDDD" */
-    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000D8    "UUUUUUUU" */
-    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000E0    "ffffwwww" */
-    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000E8    "...2..33" */
-    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000F0    "333333DD" */
-    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000F8    "DDDDDDUU" */
-    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000100    "UUUUUU"   */
+    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000000a0    "UUffffww" */
+    0x77,0x77,0x88,0x88,0x02,0x5a,0x01,0x00,  /* 000000a8    "ww...Z.." */
+    0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 000000b0    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000b8    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x32,0x00,0x03,  /* 000000c0    ".....2.." */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000c8    "DDDDDDDD" */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000000d0    "DDDDDDDD" */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000000d8    "UUUUUUUU" */
+    0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,  /* 000000e0    "ffffwwww" */
+    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 000000e8    "...2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 000000f0    "333333DD" */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 000000f8    "DDDDDDUU" */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x03,0xa4,  /* 00000100    "UUUUUU.." */
+    0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000108    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000110    "........" */
+    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000118    "...2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000120    "333333DD" */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,  /* 00000128    "DDDDDDUU" */
+    0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x66,  /* 00000130    "UUUUUUff" */
+    0x66,0x66,0x77,0x77,0x77,0x77,0x88,0x88,  /* 00000138    "ffwwww.." */
+    0x88,0x88,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000140    "...2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x99,0x99,  /* 00000148    "333333.." */
+    0x99,0x99,0x99,0x99,0x99,0x99,0x00,0x00,  /* 00000150    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 00000160    ".......2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000168    "..333333" */
+    0x33,0x33,0x22,0x22,0x22,0x22,0x22,0x22,  /* 00000170    "33""""""" */
+    0x22,0x22,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000178    """.2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000180    "33333333" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,  /* 00000188    "333333DD" */
+    0x44,0x44,0x44,0x44,0x44,0x44,0x01,0x32,  /* 00000190    "DDDDDD.2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000198    "..333333" */
+    0x33,0x33,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001a0    "33UUUUUU" */
+    0x55,0x55,0x04,0xa4,0x01,0x00,0x00,0x00,  /* 000001a8    "UU......" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001b0    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x32,  /* 000001b8    ".......2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001c0    "..333333" */
+    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 000001c8    "33DDDDDD" */
+    0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,  /* 000001d0    "DDUUUUUU" */
+    0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x77,  /* 000001d8    "UUffffww" */
+    0x77,0x77,0x88,0x88,0x88,0x88,0x01,0x32,  /* 000001e0    "ww.....2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 000001e8    "..333333" */
+    0x33,0x33,0x99,0x99,0x99,0x99,0x99,0x99,  /* 000001f0    "33......" */
+    0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001f8    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000200    "........" */
+    0x00,0x00,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000208    "...2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,  /* 00000210    "333333""" */
+    0x22,0x22,0x22,0x22,0x22,0x22,0x01,0x32,  /* 00000218    """"""".2" */
+    0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000220    "..333333" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,  /* 00000228    "33333333" */
+    0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,  /* 00000230    "33DDDDDD" */
+    0x44,0x44,0x01,0x32,0x00,0x03,0x33,0x33,  /* 00000238    "DD.2..33" */
+    0x33,0x33,0x33,0x33,0x33,0x33,0x55,0x55,  /* 00000240    "333333UU" */
+    0x55,0x55,0x55,0x55,0x55,0x55             /* 00000248    "UUUUUU|   */
 };
 
 const unsigned char TemplatePmtt[] =
@@ -1020,6 +1106,25 @@  const unsigned char TemplatePmtt[] =
     0x00,0x00,0x00,0x00                       /* 000000B0    "...."     */
 };
 
+const unsigned char TemplatePptt[] =
+{
+    0x50,0x50,0x54,0x54,0x72,0x00,0x00,0x00,  /* 00000000    "PPTTr..." */
+    0x01,0x86,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
+    0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x03,0x03,0x17,0x20,0x00,0x18,0x00,0x00,  /* 00000020    "... ...." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
+    0x00,0x00,0x00,0x00,0x01,0x18,0x00,0x00,  /* 00000038    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000048    "........" */
+    0x00,0x00,0x00,0x00,0x02,0x1E,0x00,0x00,  /* 00000050    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000060    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
+    0x00,0x00                                 /* 00000070    ".."       */
+};
+
 const unsigned char TemplateRasf[] =
 {
     0x52,0x41,0x53,0x46,0x30,0x00,0x00,0x00,  /* 00000000    "RASF0..." */
@@ -1213,11 +1318,11 @@  const unsigned char TemplateSpmi[] =
 
 const unsigned char TemplateSrat[] =
 {
-    0x53,0x52,0x41,0x54,0x92,0x00,0x00,0x00,  /* 00000000    "SRAT...." */
-    0x03,0x50,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".PINTEL " */
+    0x53,0x52,0x41,0x54,0x9E,0x00,0x00,0x00,  /* 00000000    "SRAT...." */
+    0x03,0x55,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".UINTEL " */
     0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x24,0x07,0x14,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "$.. ...." */
+    0x03,0x03,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "... ...." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
     0x00,0x10,0x00,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
@@ -1231,7 +1336,8 @@  const unsigned char TemplateSrat[] =
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
     0x03,0x12,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
     0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,  /* 00000088    "........" */
-    0x00,0x00                                 /* 00000090    ".."       */
+    0x00,0x00,0x04,0x0C,0x00,0x00,0x00,0x00,  /* 00000090    "........" */
+    0x00,0x00,0x01,0x00,0x00,0x00             /* 00000098    "......"   */
 };
 
 const unsigned char TemplateStao[] =
@@ -1379,6 +1485,15 @@  const unsigned char TemplateWpbt[] =
     0x72,0x00,0x74,0x00,0x68,0x00,0x00,0x00   /* 00000090    "r.t.h..." */
 };
 
+const unsigned char TemplateWsmt[] =
+{
+    0x57,0x53,0x4D,0x54,0x28,0x00,0x00,0x00,  /* 00000000    "WSMT(..." */
+    0x00,0x08,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
+    0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
+    0x19,0x01,0x17,0x20,0x05,0x00,0x00,0x00   /* 00000020    "... ...." */
+};
+
 const unsigned char TemplateXenv[] =
 {
     0x58,0x45,0x4E,0x56,0x39,0x00,0x00,0x00,  /* 00000000    "XENV9..." */
diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
index 7fbc7d56..88072175 100644
--- a/src/acpica/source/compiler/dtutils.c
+++ b/src/acpica/source/compiler/dtutils.c
@@ -371,6 +371,11 @@  DtGetFieldType (
     case ACPI_DMT_FLAGS1:
     case ACPI_DMT_FLAGS2:
     case ACPI_DMT_FLAGS4:
+    case ACPI_DMT_FLAGS4_0:
+    case ACPI_DMT_FLAGS4_4:
+    case ACPI_DMT_FLAGS4_8:
+    case ACPI_DMT_FLAGS4_12:
+    case ACPI_DMT_FLAGS16_16:
 
         Type = DT_FIELD_TYPE_FLAG;
         break;
@@ -512,6 +517,11 @@  DtGetFieldLength (
     case ACPI_DMT_FLAGS1:
     case ACPI_DMT_FLAGS2:
     case ACPI_DMT_FLAGS4:
+    case ACPI_DMT_FLAGS4_0:
+    case ACPI_DMT_FLAGS4_4:
+    case ACPI_DMT_FLAGS4_8:
+    case ACPI_DMT_FLAGS4_12:
+    case ACPI_DMT_FLAGS16_16:
     case ACPI_DMT_LABEL:
     case ACPI_DMT_EXTRA_TEXT:
 
@@ -527,6 +537,7 @@  DtGetFieldLength (
     case ACPI_DMT_MADT:
     case ACPI_DMT_PCCT:
     case ACPI_DMT_PMTT:
+    case ACPI_DMT_PPTT:
     case ACPI_DMT_SRAT:
     case ACPI_DMT_ASF:
     case ACPI_DMT_HESTNTYP:
@@ -543,6 +554,7 @@  DtGetFieldLength (
     case ACPI_DMT_UINT16:
     case ACPI_DMT_DMAR:
     case ACPI_DMT_HEST:
+    case ACPI_DMT_HMAT:
     case ACPI_DMT_NFIT:
     case ACPI_DMT_PCI_PATH:
 
diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c
index 1020512b..5fa7d1d1 100644
--- a/src/acpica/source/compiler/fwts_iasl_interface.c
+++ b/src/acpica/source/compiler/fwts_iasl_interface.c
@@ -95,7 +95,7 @@  int fwts_iasl_disassemble_aml(
 		/* Setup ACPICA disassembler globals */
 		Gbl_WarningLevel = ASL_WARNING3;
 		Gbl_IgnoreErrors = TRUE;
-		Gbl_DisasmFlag = TRUE;
+		AcpiGbl_DisasmFlag = TRUE;
 		Gbl_DoCompile = FALSE;
 		Gbl_OutputFilenamePrefix = (char*)outputfile;
 		Gbl_UseDefaultAmlFilename = FALSE;
@@ -233,7 +233,7 @@  int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde
 		(void)close(stderr_fds[0]);
 
 		/* Setup ACPICA compiler globals */
-		Gbl_DisasmFlag = FALSE;
+		AcpiGbl_DisasmFlag = FALSE;
 		Gbl_DoCompile = TRUE;
 		Gbl_PreprocessFlag = TRUE;
 		Gbl_UseDefaultAmlFilename = FALSE;
diff --git a/src/acpica/source/components/debugger/dbexec.c b/src/acpica/source/components/debugger/dbexec.c
index 83af8896..0a00be81 100644
--- a/src/acpica/source/components/debugger/dbexec.c
+++ b/src/acpica/source/components/debugger/dbexec.c
@@ -314,6 +314,18 @@  AcpiDbExecuteMethod (
 
     if (ACPI_FAILURE (Status))
     {
+        if ((Status == AE_ABORT_METHOD) || AcpiGbl_AbortMethod)
+        {
+            /* Clear the abort and fall back to the debugger prompt */
+
+            ACPI_EXCEPTION ((AE_INFO, Status,
+                "Aborting top-level method"));
+
+            AcpiGbl_AbortMethod = FALSE;
+            Status = AE_OK;
+            goto Cleanup;
+        }
+
         ACPI_EXCEPTION ((AE_INFO, Status,
             "while executing %s from debugger", Info->Pathname));
 
diff --git a/src/acpica/source/components/debugger/dbobject.c b/src/acpica/source/components/debugger/dbobject.c
index 81f6b6e8..66906ef8 100644
--- a/src/acpica/source/components/debugger/dbobject.c
+++ b/src/acpica/source/components/debugger/dbobject.c
@@ -588,7 +588,7 @@  AcpiDbDecodeLocals (
 
     if (DisplayLocals)
     {
-        AcpiOsPrintf ("\nInitialized Local Variables for method [%4.4s]:\n",
+        AcpiOsPrintf ("\nInitialized Local Variables for Method [%4.4s]:\n",
             AcpiUtGetNodeName (Node));
 
         for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
@@ -604,7 +604,7 @@  AcpiDbDecodeLocals (
     else
     {
         AcpiOsPrintf (
-            "No Local Variables are initialized for method [%4.4s]\n",
+            "No Local Variables are initialized for Method [%4.4s]\n",
             AcpiUtGetNodeName (Node));
     }
 }
@@ -667,7 +667,7 @@  AcpiDbDecodeArguments (
         AcpiOsPrintf (
             "Initialized Arguments for Method [%4.4s]:  "
             "(%X arguments defined for method invocation)\n",
-            AcpiUtGetNodeName (Node), ObjDesc->Method.ParamCount);
+            AcpiUtGetNodeName (Node), Node->Object->Method.ParamCount);
 
         for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
         {
diff --git a/src/acpica/source/components/debugger/dbxface.c b/src/acpica/source/components/debugger/dbxface.c
index 02c4e5db..bfa7d7c7 100644
--- a/src/acpica/source/components/debugger/dbxface.c
+++ b/src/acpica/source/components/debugger/dbxface.c
@@ -379,7 +379,7 @@  AcpiDbSingleStep (
         if ((AcpiGbl_DbOutputToFile)        ||
             (AcpiDbgLevel & ACPI_LV_PARSE))
         {
-            AcpiOsPrintf ("\n[AmlDebug] Next AML Opcode to execute:\n");
+            AcpiOsPrintf ("\nAML Debug: Next AML Opcode to execute:\n");
         }
 
         /*
diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c
index 75cc0963..27ea16b4 100644
--- a/src/acpica/source/components/disassembler/dmbuffer.c
+++ b/src/acpica/source/components/disassembler/dmbuffer.c
@@ -261,7 +261,7 @@  AcpiDmDisasmByteList (
 
         /* Dump the ASCII equivalents within a comment */
 
-        AcpiOsPrintf ("  /* ");
+        AcpiOsPrintf ("  // ");
         for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
         {
             CurrentIndex = i + j;
@@ -283,7 +283,7 @@  AcpiDmDisasmByteList (
 
         /* Finished with this line */
 
-        AcpiOsPrintf (" */\n");
+        AcpiOsPrintf ("\n");
     }
 }
 
diff --git a/src/acpica/source/components/disassembler/dmdeferred.c b/src/acpica/source/components/disassembler/dmdeferred.c
index 8123e252..0368b0a6 100644
--- a/src/acpica/source/components/disassembler/dmdeferred.c
+++ b/src/acpica/source/components/disassembler/dmdeferred.c
@@ -190,7 +190,7 @@  AcpiDmParseDeferredOps (
     ACPI_STATUS             Status;
 
 
-    ACPI_FUNCTION_ENTRY ();
+    ACPI_FUNCTION_TRACE (DmParseDeferredOps);
 
 
     /* Traverse the entire parse tree */
@@ -217,7 +217,7 @@  AcpiDmParseDeferredOps (
                 Op, Op->Named.Data, Op->Named.Length);
             if (ACPI_FAILURE (Status))
             {
-                return (Status);
+                return_ACPI_STATUS (Status);
             }
             break;
 
@@ -245,7 +245,7 @@  AcpiDmParseDeferredOps (
         Op = AcpiPsGetDepthNext (Root, Op);
     }
 
-    return (AE_OK);
+    return_ACPI_STATUS (AE_OK);
 }
 
 
diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
index af1f9644..8d9b532a 100644
--- a/src/acpica/source/components/disassembler/dmopcode.c
+++ b/src/acpica/source/components/disassembler/dmopcode.c
@@ -177,15 +177,6 @@  static void
 AcpiDmPromoteSubtree (
     ACPI_PARSE_OBJECT       *StartOp);
 
-static BOOLEAN
-AcpiDmIsSwitchBlock (
-    ACPI_PARSE_OBJECT       *Op,
-    char                    *Temp);
-
-static BOOLEAN
-AcpiDmIsCaseBlock (
-    ACPI_PARSE_OBJECT       *Op);
-
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmDisplayTargetPathname
@@ -1127,9 +1118,7 @@  AcpiDmDisassembleOneOp (
 
         if (AcpiGbl_DmEmitExternalOpcodes)
         {
-            AcpiDmEmitExternal (AcpiPsGetArg(Op, 0),
-                AcpiPsGetArg(Op, 1));
-            break;
+            AcpiDmEmitExternal (Op, AcpiPsGetArg(Op, 0));
         }
 
         break;
@@ -1367,414 +1356,3 @@  AcpiDmPromoteSubtree (
         Op = Op->Common.Next;
     }
 }
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDmIsTempName
- *
- * PARAMETERS:  Op              - Object to be examined
- *
- * RETURN:      TRUE if object is a temporary (_T_x) name for a matching While
- *              loop that can be converted to a Switch.
- *
- * DESCRIPTION: _T_X objects are only used for Switch statements. If a temporary
- *              name exists, search the siblings for a matching While (One) loop
- *              that can be converted to a Switch. Return TRUE if a match was
- *              found, FALSE otherwise.
- *
- ******************************************************************************/
-
-BOOLEAN
-AcpiDmIsTempName (
-    ACPI_PARSE_OBJECT       *Op)
-{
-    ACPI_PARSE_OBJECT       *CurrentOp;
-    char                    *Temp;
-
-    if (Op->Common.AmlOpcode != AML_NAME_OP)
-    {
-        return (FALSE);
-    }
-
-    Temp = (char *)(Op->Common.Aml);
-    ++Temp;
-
-    if (strncmp(Temp, "_T_", 3))
-    {
-        return (FALSE);
-    }
-
-    CurrentOp = Op->Common.Next;
-    while (CurrentOp)
-    {
-        if (CurrentOp->Common.AmlOpcode == AML_WHILE_OP &&
-            AcpiDmIsSwitchBlock(CurrentOp, Temp))
-        {
-            Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
-            CurrentOp->Common.DisasmOpcode = ACPI_DASM_SWITCH;
-
-            return (TRUE);
-        }
-        CurrentOp = CurrentOp->Common.Next;
-    }
-
-    return (FALSE);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDmIsSwitchBlock
- *
- * PARAMETERS:  Op              - While Object
- *
- * RETURN:      TRUE if While block can be converted to a Switch/Case block
- *
- * DESCRIPTION: Determines if While block is a Switch/Case statement. Modifies
- *              parse tree to allow for Switch/Case disassembly during walk.
- *
- * EXAMPLE: Example of parse tree to be converted
- *
- *    While
- *        One
- *        Store
- *            ByteConst
- *             -NamePath-
- *        If
- *            LEqual
- *                -NamePath-
- *                Zero
- *            Return
- *                One
- *        Else
- *            Return
- *                WordConst
- *        Break
- *
- ******************************************************************************/
-
-static BOOLEAN
-AcpiDmIsSwitchBlock (
-    ACPI_PARSE_OBJECT       *Op,
-    char                    *Temp)
-{
-    ACPI_PARSE_OBJECT       *OneOp;
-    ACPI_PARSE_OBJECT       *StoreOp;
-    ACPI_PARSE_OBJECT       *NamePathOp;
-    ACPI_PARSE_OBJECT       *PredicateOp;
-    ACPI_PARSE_OBJECT       *CurrentOp;
-    ACPI_PARSE_OBJECT       *TempOp;
-
-    /* Check for One Op Predicate */
-
-    OneOp = AcpiPsGetArg (Op, 0);
-    if (!OneOp || (OneOp->Common.AmlOpcode != AML_ONE_OP))
-    {
-        return (FALSE);
-    }
-
-    /* Check for Store Op */
-
-    StoreOp = OneOp->Common.Next;
-    if (!StoreOp || (StoreOp->Common.AmlOpcode != AML_STORE_OP))
-    {
-        return (FALSE);
-    }
-
-    /* Check for Name Op with _T_ string */
-
-    NamePathOp = AcpiPsGetArg (StoreOp, 1);
-    if (!NamePathOp || (NamePathOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
-    {
-        return (FALSE);
-    }
-
-    if (strncmp((char *)(NamePathOp->Common.Aml), Temp, 4))
-    {
-        return (FALSE);
-    }
-
-    /* This is a Switch/Case control block */
-
-    /* Ignore the One Op Predicate */
-
-    OneOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
-
-    /* Ignore the Store Op, but not the children */
-
-    StoreOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
-
-    /*
-     * First arg of Store Op is the Switch condition.
-     * Mark it as a Switch predicate and as a parameter list for paren
-     * closing and correct indentation.
-     */
-    PredicateOp = AcpiPsGetArg (StoreOp, 0);
-    PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
-    PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
-
-    /* Ignore the Name Op */
-
-    NamePathOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
-
-    /* Remaining opcodes are the Case statements (If/ElseIf's) */
-
-    CurrentOp = StoreOp->Common.Next;
-    while (AcpiDmIsCaseBlock (CurrentOp))
-    {
-        /* Block is a Case structure */
-
-        if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
-        {
-            /* ElseIf */
-
-            CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
-            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-        }
-
-        /* If */
-
-        CurrentOp->Common.DisasmOpcode = ACPI_DASM_CASE;
-
-        /*
-         * Mark the parse tree for Case disassembly. There are two
-         * types of Case statements. The first type of statement begins with
-         * an LEqual. The second starts with an LNot and uses a Match statement
-         * on a Package of constants.
-         */
-        TempOp = AcpiPsGetArg (CurrentOp, 0);
-        switch (TempOp->Common.AmlOpcode)
-        {
-            case (AML_LOGICAL_EQUAL_OP):
-
-                /* Ignore just the LEqual Op */
-
-                TempOp->Common.DisasmOpcode = ACPI_DASM_IGNORE_SINGLE;
-
-                /* Ignore the NamePath Op */
-
-                TempOp = AcpiPsGetArg (TempOp, 0);
-                TempOp->Common.DisasmFlags = ACPI_PARSEOP_IGNORE;
-
-                /*
-                 * Second arg of LEqual will be the Case predicate.
-                 * Mark it as a predicate and also as a parameter list for paren
-                 * closing and correct indentation.
-                 */
-                PredicateOp = TempOp->Common.Next;
-                PredicateOp->Common.DisasmOpcode = ACPI_DASM_SWITCH_PREDICATE;
-                PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
-
-                break;
-
-            case (AML_LOGICAL_NOT_OP):
-
-                /*
-                 * The Package will be the predicate of the Case statement.
-                 * It's under:
-                 *            LNOT
-                 *                LEQUAL
-                 *                    MATCH
-                 *                        PACKAGE
-                 */
-
-                /* Get the LEqual Op from LNot */
-
-                TempOp = AcpiPsGetArg (TempOp, 0);
-
-                /* Get the Match Op from LEqual */
-
-                TempOp = AcpiPsGetArg (TempOp, 0);
-
-                /* Get the Package Op from Match */
-
-                PredicateOp = AcpiPsGetArg (TempOp, 0);
-
-                /* Mark as parameter list for paren closing */
-
-                PredicateOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST;
-
-                /*
-                 * The Package list would be too deeply indented if we
-                 * chose to simply ignore the all the parent opcodes, so
-                 * we rearrange the parse tree instead.
-                 */
-
-                /*
-                 * Save the second arg of the If/Else Op which is the
-                 * block code of code for this Case statement.
-                 */
-                TempOp = AcpiPsGetArg (CurrentOp, 1);
-
-                /*
-                 * Move the Package Op to the child (predicate) of the
-                 * Case statement.
-                 */
-                CurrentOp->Common.Value.Arg = PredicateOp;
-                PredicateOp->Common.Parent = CurrentOp;
-
-                /* Add the block code */
-
-                PredicateOp->Common.Next = TempOp;
-
-                break;
-
-            default:
-
-                /* Should never get here */
-
-                break;
-        }
-
-        /* Advance to next Case block */
-
-        CurrentOp = CurrentOp->Common.Next;
-    }
-
-    /* If CurrentOp is now an Else, then this is a Default block */
-
-    if (CurrentOp && CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
-    {
-        CurrentOp->Common.DisasmOpcode = ACPI_DASM_DEFAULT;
-    }
-
-    /*
-     * From the first If advance to the Break op. It's possible to
-     * have an Else (Default) op here when there is only one Case
-     * statement, so check for it.
-     */
-    CurrentOp = StoreOp->Common.Next->Common.Next;
-    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
-    {
-        CurrentOp = CurrentOp->Common.Next;
-    }
-
-    /* Ignore the Break Op */
-
-    CurrentOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
-
-    return (TRUE);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDmIsCaseBlock
- *
- * PARAMETERS:  Op              - Object to test
- *
- * RETURN:      TRUE if Object is beginning of a Case block.
- *
- * DESCRIPTION: Determines if an Object is the beginning of a Case block for a
- *              Switch/Case statement. Parse tree must be one of the following
- *              forms:
- *
- *              Else (Optional)
- *                  If
- *                      LEqual
- *                          -NamePath- _T_x
- *
- *              Else (Optional)
- *                  If
- *                      LNot
- *                          LEqual
- *                              Match
- *                                  Package
- *                                      ByteConst
- *                                      -NamePath- _T_x
- *
- ******************************************************************************/
-
-static BOOLEAN
-AcpiDmIsCaseBlock (
-    ACPI_PARSE_OBJECT       *Op)
-{
-    ACPI_PARSE_OBJECT       *CurrentOp;
-
-    if (!Op)
-    {
-        return (FALSE);
-    }
-
-    /* Look for an If or ElseIf */
-
-    CurrentOp = Op;
-    if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
-    {
-        CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-        if (!CurrentOp)
-        {
-            return (FALSE);
-        }
-    }
-
-    if (!CurrentOp || CurrentOp->Common.AmlOpcode != AML_IF_OP)
-    {
-        return (FALSE);
-    }
-
-    /* Child must be LEqual or LNot */
-
-    CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-    if (!CurrentOp)
-    {
-        return (FALSE);
-    }
-
-    switch (CurrentOp->Common.AmlOpcode)
-    {
-        case (AML_LOGICAL_EQUAL_OP):
-
-            /* Next child must be NamePath with string _T_ */
-
-            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-            if (!CurrentOp || !CurrentOp->Common.Value.Name ||
-                strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
-            {
-                return (FALSE);
-            }
-
-            break;
-
-        case (AML_LOGICAL_NOT_OP):
-
-            /* Child of LNot must be LEqual op */
-
-            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-            if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_LOGICAL_EQUAL_OP))
-            {
-                return (FALSE);
-            }
-
-            /* Child of LNot must be Match op */
-
-            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-            if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_MATCH_OP))
-            {
-                return (FALSE);
-            }
-
-            /* First child of Match must be Package op */
-
-            CurrentOp = AcpiPsGetArg (CurrentOp, 0);
-            if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_PACKAGE_OP))
-            {
-                return (FALSE);
-            }
-
-            /* Third child of Match must be NamePath with string _T_ */
-
-            CurrentOp = AcpiPsGetArg (CurrentOp->Common.Parent, 2);
-            if (!CurrentOp || !CurrentOp->Common.Value.Name ||
-                strncmp(CurrentOp->Common.Value.Name, "_T_", 3))
-            {
-                return (FALSE);
-            }
-
-            break;
-
-        default:
-
-            return (FALSE);
-    }
-
-    return (TRUE);
-}
diff --git a/src/acpica/source/components/disassembler/dmresrc.c b/src/acpica/source/components/disassembler/dmresrc.c
index bd8aa2dc..3c24855f 100644
--- a/src/acpica/source/components/disassembler/dmresrc.c
+++ b/src/acpica/source/components/disassembler/dmresrc.c
@@ -197,8 +197,12 @@  static ACPI_RESOURCE_HANDLER    AcpiGbl_DmResourceDispatch [] =
     AcpiDmQwordDescriptor,          /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
     AcpiDmExtendedDescriptor,       /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
     AcpiDmGpioDescriptor,           /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
-    NULL,                           /* 0x0D, Reserved */
-    AcpiDmSerialBusDescriptor       /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
+    AcpiDmPinFunctionDescriptor,    /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
+    AcpiDmSerialBusDescriptor,      /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
+    AcpiDmPinConfigDescriptor,      /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
+    AcpiDmPinGroupDescriptor,       /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
+    AcpiDmPinGroupFunctionDescriptor, /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
+    AcpiDmPinGroupConfigDescriptor, /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
 };
 
 
@@ -540,6 +544,15 @@  AcpiDmIsResourceTemplate (
      * intialization byte list. Because the resource macros will create
      * a buffer of the exact required length (buffer length will be equal
      * to the actual length).
+     *
+     * NOTE (April 2017): Resource templates with this issue have been
+     * seen in the field. We still don't want to attempt to disassemble
+     * a buffer like this to a resource template because this output
+     * would not match the original input buffer (it would be shorter
+     * than the original when the disassembled code is recompiled).
+     * Basically, a buffer like this appears to be hand crafted in the
+     * first place, so just emitting a buffer object instead of a
+     * resource template more closely resembles the original ASL code.
      */
     if (DeclaredBufferLength != BufferLength)
     {
diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
index 0c2c3360..68737545 100644
--- a/src/acpica/source/components/disassembler/dmresrcl2.c
+++ b/src/acpica/source/components/disassembler/dmresrcl2.c
@@ -515,6 +515,112 @@  AcpiDmGpioDescriptor (
     }
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmPinFunctionDescriptor
+ *
+ * PARAMETERS:  Info                - Extra resource info
+ *              Resource            - Pointer to the resource descriptor
+ *              Length              - Length of the descriptor in bytes
+ *              Level               - Current source code indentation level
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decode a PinFunction descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmPinFunctionDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level)
+{
+    UINT16                  *PinList;
+    UINT8                   *VendorData;
+    char                    *DeviceName = NULL;
+    UINT32                  PinCount;
+    UINT32                  i;
+
+    AcpiDmIndent (Level);
+    AcpiOsPrintf ("PinFunction (%s, ",
+        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinFunction.Flags)]);
+
+    if (Resource->PinFunction.PinConfig <= 3)
+    {
+        AcpiOsPrintf ("%s, ",
+            AcpiGbl_PpcDecode[Resource->PinFunction.PinConfig]);
+    }
+    else
+    {
+        AcpiOsPrintf ("0x%2.2X, ", Resource->PinFunction.PinConfig);
+    }
+
+    /* FunctionNumber */
+
+    AcpiOsPrintf ("0x%4.4X, ", Resource->PinFunction.FunctionNumber);
+
+    if (Resource->PinFunction.ResSourceOffset)
+    {
+        DeviceName = ACPI_ADD_PTR (char,
+            Resource, Resource->PinFunction.ResSourceOffset),
+        AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
+    }
+
+    AcpiOsPrintf (", ");
+    AcpiOsPrintf ("0x%2.2X,\n", Resource->PinFunction.ResSourceIndex);
+
+    AcpiDmIndent (Level + 1);
+
+    /* Always ResourceConsumer */
+    AcpiOsPrintf ("%s, ", AcpiGbl_ConsumeDecode [ACPI_CONSUMER]);
+
+    /* Insert a descriptor name */
+
+    AcpiDmDescriptorName ();
+
+    AcpiOsPrintf (",");
+
+    /* Dump the vendor data */
+
+    if (Resource->PinFunction.VendorLength)
+    {
+        AcpiOsPrintf ("\n");
+        AcpiDmIndent (Level + 1);
+        VendorData = ACPI_ADD_PTR (UINT8, Resource,
+            Resource->PinFunction.VendorOffset);
+
+        AcpiDmDumpRawDataBuffer (VendorData,
+            Resource->PinFunction.VendorLength, Level);
+    }
+
+    AcpiOsPrintf (")\n");
+
+    AcpiDmIndent (Level + 1);
+
+    /* Dump the interrupt list */
+
+    AcpiOsPrintf ("{   // Pin list\n");
+
+    PinCount = ((UINT32) (Resource->PinFunction.ResSourceOffset -
+        Resource->PinFunction.PinTableOffset)) /
+        sizeof (UINT16);
+
+    PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
+        Resource->PinFunction.PinTableOffset);
+
+    for (i = 0; i < PinCount; i++)
+    {
+        AcpiDmIndent (Level + 2);
+        AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
+            ((i + 1) < PinCount) ? "," : "");
+    }
+
+    AcpiDmIndent (Level + 1);
+    AcpiOsPrintf ("}\n");
+}
+
 
 /*******************************************************************************
  *
@@ -848,3 +954,363 @@  AcpiDmSerialBusDescriptor (
     SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
         Info, Resource, Length, Level);
 }
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmPinConfig
+ *
+ * PARAMETERS:  PinConfigType       - Pin configuration type
+ *              PinConfigValue      - Pin configuration value
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Pretty prints PinConfig type and value.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmPinConfig(
+    UINT8                   PinConfigType,
+    UINT32                  PinConfigValue)
+{
+    if (PinConfigType <= 13)
+    {
+        AcpiOsPrintf ("0x%2.2X /* %s */, ", PinConfigType,
+            AcpiGbl_PtypDecode[PinConfigType]);
+    }
+    else
+    {
+        AcpiOsPrintf ("0x%2.2X, /* Vendor Defined */ ", PinConfigType);
+    }
+
+    /* PinConfigValue */
+
+    AcpiOsPrintf ("0x%4.4X,\n", PinConfigValue);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmPinConfigDescriptor
+ *
+ * PARAMETERS:  Info                - Extra resource info
+ *              Resource            - Pointer to the resource descriptor
+ *              Length              - Length of the descriptor in bytes
+ *              Level               - Current source code indentation level
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decode a PinConfig descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmPinConfigDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level)
+{
+    UINT16                  *PinList;
+    UINT8                   *VendorData;
+    char                    *DeviceName = NULL;
+    UINT32                  PinCount;
+    UINT32                  i;
+
+    AcpiDmIndent (Level);
+    AcpiOsPrintf ("PinConfig (%s, ",
+        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinConfig.Flags)]);
+
+    AcpiDmPinConfig (Resource->PinConfig.PinConfigType,
+        Resource->PinConfig.PinConfigValue);
+
+    AcpiDmIndent (Level + 1);
+
+    if (Resource->PinConfig.ResSourceOffset)
+    {
+        DeviceName = ACPI_ADD_PTR (char,
+            Resource, Resource->PinConfig.ResSourceOffset),
+        AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
+    }
+
+    AcpiOsPrintf (", ");
+    AcpiOsPrintf ("0x%2.2X, ", Resource->PinConfig.ResSourceIndex);
+
+    AcpiOsPrintf ("%s, ",
+        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinConfig.Flags, 1)]);
+
+    /* Insert a descriptor name */
+
+    AcpiDmDescriptorName ();
+
+    AcpiOsPrintf (",");
+
+    /* Dump the vendor data */
+
+    if (Resource->PinConfig.VendorLength)
+    {
+        AcpiOsPrintf ("\n");
+        AcpiDmIndent (Level + 1);
+        VendorData = ACPI_ADD_PTR (UINT8, Resource,
+            Resource->PinConfig.VendorOffset);
+
+        AcpiDmDumpRawDataBuffer (VendorData,
+            Resource->PinConfig.VendorLength, Level);
+    }
+
+    AcpiOsPrintf (")\n");
+
+    AcpiDmIndent (Level + 1);
+
+    /* Dump the interrupt list */
+
+    AcpiOsPrintf ("{   // Pin list\n");
+
+    PinCount = ((UINT32) (Resource->PinConfig.ResSourceOffset -
+        Resource->PinConfig.PinTableOffset)) /
+        sizeof (UINT16);
+
+    PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
+        Resource->PinConfig.PinTableOffset);
+
+    for (i = 0; i < PinCount; i++)
+    {
+        AcpiDmIndent (Level + 2);
+        AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
+            ((i + 1) < PinCount) ? "," : "");
+    }
+
+    AcpiDmIndent (Level + 1);
+    AcpiOsPrintf ("}\n");
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmPinGroupDescriptor
+ *
+ * PARAMETERS:  Info                - Extra resource info
+ *              Resource            - Pointer to the resource descriptor
+ *              Length              - Length of the descriptor in bytes
+ *              Level               - Current source code indentation level
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decode a PinGroup descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmPinGroupDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level)
+{
+    char                    *Label;
+    UINT16                  *PinList;
+    UINT8                   *VendorData;
+    UINT32                  PinCount;
+    UINT32                  i;
+
+    AcpiDmIndent (Level);
+    /* Always producer */
+    AcpiOsPrintf ("PinGroup (");
+
+    Label = ACPI_ADD_PTR (char,
+        Resource, Resource->PinGroup.LabelOffset),
+    AcpiUtPrintString (Label, ACPI_UINT16_MAX);
+
+    AcpiOsPrintf (", ");
+
+    AcpiOsPrintf ("%s, ",
+        AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroup.Flags)]);
+
+    /* Insert a descriptor name */
+
+    AcpiDmDescriptorName ();
+
+    AcpiOsPrintf (",");
+
+    /* Dump the vendor data */
+
+    if (Resource->PinGroup.VendorLength)
+    {
+        AcpiOsPrintf ("\n");
+        AcpiDmIndent (Level + 1);
+        VendorData = ACPI_ADD_PTR (UINT8, Resource,
+            Resource->PinGroup.VendorOffset);
+
+        AcpiDmDumpRawDataBuffer (VendorData,
+            Resource->PinGroup.VendorLength, Level);
+    }
+
+    AcpiOsPrintf (")\n");
+
+    AcpiDmIndent (Level + 1);
+
+    /* Dump the interrupt list */
+
+    AcpiOsPrintf ("{   // Pin list\n");
+
+    PinCount = (Resource->PinGroup.LabelOffset -
+        Resource->PinGroup.PinTableOffset) / sizeof (UINT16);
+
+    PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
+        Resource->PinGroup.PinTableOffset);
+
+    for (i = 0; i < PinCount; i++)
+    {
+        AcpiDmIndent (Level + 2);
+        AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
+            ((i + 1) < PinCount) ? "," : "");
+    }
+
+    AcpiDmIndent (Level + 1);
+    AcpiOsPrintf ("}\n");
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmPinGroupFunctionDescriptor
+ *
+ * PARAMETERS:  Info                - Extra resource info
+ *              Resource            - Pointer to the resource descriptor
+ *              Length              - Length of the descriptor in bytes
+ *              Level               - Current source code indentation level
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decode a PinGroupFunction descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmPinGroupFunctionDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level)
+{
+    UINT8                   *VendorData;
+    char                    *DeviceName = NULL;
+    char                    *Label = NULL;
+
+    AcpiDmIndent (Level);
+    AcpiOsPrintf ("PinGroupFunction (%s, ",
+        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupFunction.Flags)]);
+
+    /* FunctionNumber */
+
+    AcpiOsPrintf ("0x%4.4X, ", Resource->PinGroupFunction.FunctionNumber);
+
+    DeviceName = ACPI_ADD_PTR (char,
+        Resource, Resource->PinGroupFunction.ResSourceOffset),
+    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
+
+    AcpiOsPrintf (", ");
+    AcpiOsPrintf ("0x%2.2X,\n", Resource->PinGroupFunction.ResSourceIndex);
+
+    AcpiDmIndent (Level + 1);
+
+    Label = ACPI_ADD_PTR (char, Resource,
+        Resource->PinGroupFunction.ResSourceLabelOffset);
+    AcpiUtPrintString (Label, ACPI_UINT16_MAX);
+
+    AcpiOsPrintf (", ");
+
+    AcpiOsPrintf ("%s, ",
+        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupFunction.Flags, 1)]);
+
+    /* Insert a descriptor name */
+
+    AcpiDmDescriptorName ();
+
+    AcpiOsPrintf (",");
+
+    /* Dump the vendor data */
+
+    if (Resource->PinGroupFunction.VendorLength)
+    {
+        AcpiOsPrintf ("\n");
+        AcpiDmIndent (Level + 1);
+        VendorData = ACPI_ADD_PTR (UINT8, Resource,
+            Resource->PinGroupFunction.VendorOffset);
+
+        AcpiDmDumpRawDataBuffer (VendorData,
+            Resource->PinGroupFunction.VendorLength, Level);
+    }
+
+    AcpiOsPrintf (")\n");
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmPinGroupConfigDescriptor
+ *
+ * PARAMETERS:  Info                - Extra resource info
+ *              Resource            - Pointer to the resource descriptor
+ *              Length              - Length of the descriptor in bytes
+ *              Level               - Current source code indentation level
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decode a PinGroupConfig descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmPinGroupConfigDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level)
+{
+    UINT8                   *VendorData;
+    char                    *DeviceName = NULL;
+    char                    *Label = NULL;
+
+    AcpiDmIndent (Level);
+    AcpiOsPrintf ("PinGroupConfig (%s, ",
+        AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupConfig.Flags)]);
+
+    AcpiDmPinConfig(Resource->PinGroupConfig.PinConfigType,
+        Resource->PinGroupConfig.PinConfigValue);
+
+    AcpiDmIndent (Level + 1);
+
+    DeviceName = ACPI_ADD_PTR (char,
+        Resource, Resource->PinGroupConfig.ResSourceOffset),
+    AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
+
+    AcpiOsPrintf (", ");
+    AcpiOsPrintf ("0x%2.2X, ", Resource->PinGroupConfig.ResSourceIndex);
+
+    Label = ACPI_ADD_PTR (char, Resource,
+        Resource->PinGroupConfig.ResSourceLabelOffset);
+    AcpiUtPrintString (Label, ACPI_UINT16_MAX);
+
+    AcpiOsPrintf (", ");
+
+    AcpiOsPrintf ("%s, ",
+        AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupConfig.Flags, 1)]);
+
+    /* Insert a descriptor name */
+
+    AcpiDmDescriptorName ();
+
+    AcpiOsPrintf (",");
+
+    /* Dump the vendor data */
+
+    if (Resource->PinGroupConfig.VendorLength)
+    {
+        AcpiOsPrintf ("\n");
+        AcpiDmIndent (Level + 1);
+        VendorData = ACPI_ADD_PTR (UINT8, Resource,
+            Resource->PinGroupConfig.VendorOffset);
+
+        AcpiDmDumpRawDataBuffer (VendorData,
+            Resource->PinGroupConfig.VendorLength, Level);
+    }
+
+    AcpiOsPrintf (")\n");
+}
diff --git a/src/acpica/source/components/disassembler/dmwalk.c b/src/acpica/source/components/disassembler/dmwalk.c
index 77d24a18..750e6398 100644
--- a/src/acpica/source/components/disassembler/dmwalk.c
+++ b/src/acpica/source/components/disassembler/dmwalk.c
@@ -161,8 +161,6 @@ 
         ACPI_MODULE_NAME    ("dmwalk")
 
 
-#define DB_FULL_OP_INFO     "[%4.4s] @%5.5X #%4.4X:  "
-
 /* Stub for non-compiler code */
 
 #ifndef ACPI_ASL_COMPILER
@@ -584,13 +582,6 @@  AcpiDmDescendingOp (
         return (AE_CTRL_DEPTH);
     }
 
-    if (AcpiDmIsTempName(Op))
-    {
-        /* Ignore compiler generated temporary names */
-
-        return (AE_CTRL_DEPTH);
-    }
-
     if (Op->Common.DisasmOpcode == ACPI_DASM_IGNORE_SINGLE)
     {
         /* Ignore this op, but not it's children */
@@ -642,10 +633,16 @@  AcpiDmDescendingOp (
                 Info->WalkState->ParserState.AmlStart);
             if (AcpiGbl_DmOpt_Verbose)
             {
-                AcpiOsPrintf (DB_FULL_OP_INFO,
-                    (Info->WalkState->MethodNode ?
-                        Info->WalkState->MethodNode->Name.Ascii : "   "),
-                    AmlOffset, (UINT32) Op->Common.AmlOpcode);
+                if (AcpiGbl_CmSingleStep)
+                {
+                    AcpiOsPrintf ("%5.5X/%4.4X: ",
+                        AmlOffset, (UINT32) Op->Common.AmlOpcode);
+                }
+                else
+                {
+                    AcpiOsPrintf ("AML Offset %5.5X, Opcode %4.4X: ",
+                        AmlOffset, (UINT32) Op->Common.AmlOpcode);
+                }
             }
         }
 
@@ -782,7 +779,7 @@  AcpiDmDescendingOp (
                 Name = AcpiPsGetName (Op);
                 if (Op->Named.Path)
                 {
-                    AcpiDmNamestring ((char *) Op->Named.Path);
+                    AcpiDmNamestring (Op->Named.Path);
                 }
                 else
                 {
diff --git a/src/acpica/source/components/dispatcher/dsargs.c b/src/acpica/source/components/dispatcher/dsargs.c
index 6a79c7cb..504005b3 100644
--- a/src/acpica/source/components/dispatcher/dsargs.c
+++ b/src/acpica/source/components/dispatcher/dsargs.c
@@ -197,7 +197,7 @@  AcpiDsExecuteArguments (
     ACPI_WALK_STATE         *WalkState;
 
 
-    ACPI_FUNCTION_TRACE (DsExecuteArguments);
+    ACPI_FUNCTION_TRACE_PTR (DsExecuteArguments, AmlStart);
 
 
     /* Allocate a new parser op to be the root of the parsed tree */
@@ -474,7 +474,8 @@  AcpiDsGetPackageArguments (
         return_ACPI_STATUS (AE_AML_INTERNAL);
     }
 
-    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));
+    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Argument Init, AML Ptr: %p\n",
+        ObjDesc->Package.AmlStart));
 
     /* Execute the AML code for the TermArg arguments */
 
diff --git a/src/acpica/source/components/dispatcher/dsdebug.c b/src/acpica/source/components/dispatcher/dsdebug.c
index ceb6b8a5..4a0696a3 100644
--- a/src/acpica/source/components/dispatcher/dsdebug.c
+++ b/src/acpica/source/components/dispatcher/dsdebug.c
@@ -320,6 +320,7 @@  AcpiDsDumpMethodStack (
                 Op->Common.Next = NULL;
 
 #ifdef ACPI_DISASSEMBLER
+                AcpiOsPrintf ("Failed at ");
                 AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX);
 #endif
                 Op->Common.Next = Next;
diff --git a/src/acpica/source/components/dispatcher/dsmethod.c b/src/acpica/source/components/dispatcher/dsmethod.c
index d3588f5a..79dff2c7 100644
--- a/src/acpica/source/components/dispatcher/dsmethod.c
+++ b/src/acpica/source/components/dispatcher/dsmethod.c
@@ -333,6 +333,7 @@  AcpiDsMethodError (
     ACPI_WALK_STATE         *WalkState)
 {
     UINT32                  AmlOffset;
+    ACPI_NAME               Name = 0;
 
 
     ACPI_FUNCTION_ENTRY ();
@@ -361,9 +362,16 @@  AcpiDsMethodError (
         AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->Aml,
             WalkState->ParserState.AmlStart);
 
-        Status = AcpiGbl_ExceptionHandler (Status,
-            WalkState->MethodNode ?
-                WalkState->MethodNode->Name.Integer : 0,
+        if (WalkState->MethodNode)
+        {
+            Name = WalkState->MethodNode->Name.Integer;
+        }
+        else if (WalkState->DeferredNode)
+        {
+            Name = WalkState->DeferredNode->Name.Integer;
+        }
+
+        Status = AcpiGbl_ExceptionHandler (Status, Name,
             WalkState->Opcode, AmlOffset, NULL);
         AcpiExEnterInterpreter ();
     }
diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
index 6a4f5bf2..3ceec94b 100644
--- a/src/acpica/source/components/dispatcher/dsopcode.c
+++ b/src/acpica/source/components/dispatcher/dsopcode.c
@@ -353,10 +353,9 @@  AcpiDsInitBufferField (
         (8 * (UINT32) BufferDesc->Buffer.Length))
     {
         ACPI_ERROR ((AE_INFO,
-            "Field [%4.4s] at %u exceeds Buffer [%4.4s] size %u (bits)",
-            AcpiUtGetNodeName (ResultDesc),
-            BitOffset + BitCount,
-            AcpiUtGetNodeName (BufferDesc->Buffer.Node),
+            "Field [%4.4s] at bit offset/length %u/%u "
+            "exceeds size of target Buffer (%u bits)",
+            AcpiUtGetNodeName (ResultDesc), BitOffset, BitCount,
             8 * (UINT32) BufferDesc->Buffer.Length));
         Status = AE_AML_BUFFER_LIMIT;
         goto Cleanup;
diff --git a/src/acpica/source/components/dispatcher/dsutils.c b/src/acpica/source/components/dispatcher/dsutils.c
index 77dff895..4688e16e 100644
--- a/src/acpica/source/components/dispatcher/dsutils.c
+++ b/src/acpica/source/components/dispatcher/dsutils.c
@@ -791,12 +791,6 @@  AcpiDsCreateOperand (
         if ((OpInfo->Flags & AML_HAS_RETVAL) ||
             (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
         {
-            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
-                "Argument previously created, already stacked\n"));
-
-            AcpiDbDisplayArgumentObject (
-                WalkState->Operands [WalkState->NumOperands - 1], WalkState);
-
             /*
              * Use value that was already previously returned
              * by the evaluation of this argument
diff --git a/src/acpica/source/components/dispatcher/dswexec.c b/src/acpica/source/components/dispatcher/dswexec.c
index 4df14713..dfdfeaa0 100644
--- a/src/acpica/source/components/dispatcher/dswexec.c
+++ b/src/acpica/source/components/dispatcher/dswexec.c
@@ -723,7 +723,8 @@  AcpiDsExecEndOp (
         case AML_TYPE_CREATE_OBJECT:
 
             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
-                "Executing CreateObject (Buffer/Package) Op=%p\n", Op));
+                "Executing CreateObject (Buffer/Package) Op=%p AMLPtr=%p\n",
+                Op, Op->Named.Data));
 
             switch (Op->Common.Parent->Common.AmlOpcode)
             {
diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
index f3f99ea1..8793c0ed 100644
--- a/src/acpica/source/components/dispatcher/dswload.c
+++ b/src/acpica/source/components/dispatcher/dswload.c
@@ -518,7 +518,7 @@  AcpiDsLoad1BeginOp (
     /* Initialize the op */
 
 #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
-    Op->Named.Path = ACPI_CAST_PTR (UINT8, Path);
+    Op->Named.Path = Path;
 #endif
 
     if (Node)
@@ -558,6 +558,10 @@  AcpiDsLoad1EndOp (
     ACPI_OBJECT_TYPE        ObjectType;
     ACPI_STATUS             Status = AE_OK;
 
+#ifdef ACPI_ASL_COMPILER
+    UINT8                   ParamCount;
+#endif
+
 
     ACPI_FUNCTION_TRACE (DsLoad1EndOp);
 
@@ -642,6 +646,37 @@  AcpiDsLoad1EndOp (
         }
     }
 
+#ifdef ACPI_ASL_COMPILER
+    /*
+     * For external opcode, get the object type from the argument and
+     * get the parameter count from the argument's next.
+     */
+    if (AcpiGbl_DisasmFlag &&
+        Op->Common.Node &&
+        Op->Common.AmlOpcode == AML_EXTERNAL_OP)
+    {
+        /*
+         * Note, if this external is not a method
+         * Op->Common.Value.Arg->Common.Next->Common.Value.Integer == 0
+         * Therefore, ParamCount will be 0.
+         */
+        ParamCount = (UINT8) Op->Common.Value.Arg->Common.Next->Common.Value.Integer;
+        ObjectType = (UINT8) Op->Common.Value.Arg->Common.Value.Integer;
+        Op->Common.Node->Flags |= ANOBJ_IS_EXTERNAL;
+        Op->Common.Node->Type = (UINT8) ObjectType;
+
+        AcpiDmCreateSubobjectForExternal ((UINT8)ObjectType,
+            &Op->Common.Node, ParamCount);
+
+        /*
+         * Add the external to the external list because we may be
+         * emitting code based off of the items within the external list.
+         */
+        AcpiDmAddOpToExternalList (Op, Op->Named.Path, (UINT8)ObjectType, ParamCount,
+           ACPI_EXT_ORIGIN_FROM_OPCODE | ACPI_EXT_RESOLVED_REFERENCE);
+    }
+#endif
+
     /*
      * If we are executing a method, do not create any namespace objects
      * during the load phase, only during execution.
@@ -689,6 +724,7 @@  AcpiDsLoad1EndOp (
     /* Pop the scope stack (only if loading a table) */
 
     if (!WalkState->MethodNode &&
+        Op->Common.AmlOpcode != AML_EXTERNAL_OP &&
         AcpiNsOpensScope (ObjectType))
     {
         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n",
diff --git a/src/acpica/source/components/dispatcher/dswload2.c b/src/acpica/source/components/dispatcher/dswload2.c
index 46870830..184f6aa3 100644
--- a/src/acpica/source/components/dispatcher/dswload2.c
+++ b/src/acpica/source/components/dispatcher/dswload2.c
@@ -428,6 +428,24 @@  AcpiDsLoad2BeginOp (
             }
         }
 
+#ifdef ACPI_ASL_COMPILER
+
+        /*
+         * Do not open a scope for AML_EXTERNAL_OP
+         * AcpiNsLookup can open a new scope based on the object type
+         * of this op. AML_EXTERNAL_OP is a declaration rather than a
+         * definition. In the case that this external is a method object,
+         * AcpiNsLookup will open a new scope. However, an AML_EXTERNAL_OP
+         * associated with the ACPI_TYPE_METHOD is a declaration, rather than
+         * a definition. Flags is set to avoid opening a scope for any
+         * AML_EXTERNAL_OP.
+         */
+        if (WalkState->Opcode == AML_EXTERNAL_OP)
+        {
+            Flags |= ACPI_NS_DONT_OPEN_SCOPE;
+        }
+#endif
+
         /* Add new entry or lookup existing entry */
 
         Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
diff --git a/src/acpica/source/components/events/evxfevnt.c b/src/acpica/source/components/events/evxfevnt.c
index f781f3e0..04662736 100644
--- a/src/acpica/source/components/events/evxfevnt.c
+++ b/src/acpica/source/components/events/evxfevnt.c
@@ -306,6 +306,13 @@  AcpiEnableEvent (
     ACPI_FUNCTION_TRACE (AcpiEnableEvent);
 
 
+    /* If Hardware Reduced flag is set, there are no fixed events */
+
+    if (AcpiGbl_ReducedHardware)
+    {
+        return_ACPI_STATUS (AE_OK);
+    }
+
     /* Decode the Fixed Event */
 
     if (Event > ACPI_EVENT_MAX)
@@ -372,6 +379,13 @@  AcpiDisableEvent (
     ACPI_FUNCTION_TRACE (AcpiDisableEvent);
 
 
+    /* If Hardware Reduced flag is set, there are no fixed events */
+
+    if (AcpiGbl_ReducedHardware)
+    {
+        return_ACPI_STATUS (AE_OK);
+    }
+
     /* Decode the Fixed Event */
 
     if (Event > ACPI_EVENT_MAX)
@@ -433,6 +447,13 @@  AcpiClearEvent (
     ACPI_FUNCTION_TRACE (AcpiClearEvent);
 
 
+    /* If Hardware Reduced flag is set, there are no fixed events */
+
+    if (AcpiGbl_ReducedHardware)
+    {
+        return_ACPI_STATUS (AE_OK);
+    }
+
     /* Decode the Fixed Event */
 
     if (Event > ACPI_EVENT_MAX)
diff --git a/src/acpica/source/components/executer/exdebug.c b/src/acpica/source/components/executer/exdebug.c
index cdc67871..155f2c0d 100644
--- a/src/acpica/source/components/executer/exdebug.c
+++ b/src/acpica/source/components/executer/exdebug.c
@@ -237,11 +237,11 @@  AcpiExDoDebugObject (
             Timer = ((UINT32) AcpiOsGetTimer () / 10);
             Timer &= 0x03FFFFFF;
 
-            AcpiOsPrintf ("[ACPI Debug T=0x%8.8X] %*s", Timer, Level, " ");
+            AcpiOsPrintf ("ACPI Debug: T=0x%8.8X %*s", Timer, Level, " ");
         }
         else
         {
-            AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
+            AcpiOsPrintf ("ACPI Debug: %*s", Level, " ");
         }
     }
 
diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
index 82b34038..2b23881f 100644
--- a/src/acpica/source/components/executer/exdump.c
+++ b/src/acpica/source/components/executer/exdump.c
@@ -775,12 +775,13 @@  AcpiExDumpOperand (
 
     if (Depth > 0)
     {
-        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
-            Depth, " ", Depth, ObjDesc));
+        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
+            Depth, " ", Depth, ObjDesc, ObjDesc->Common.ReferenceCount));
     }
     else
     {
-        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
+        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Refs=%u ",
+            ObjDesc, ObjDesc->Common.ReferenceCount));
     }
 
     /* Decode object type */
@@ -818,8 +819,10 @@  AcpiExDumpOperand (
 
         case ACPI_REFCLASS_NAME:
 
-            AcpiOsPrintf ("- [%4.4s]\n",
-                ObjDesc->Reference.Node->Name.Ascii);
+            AcpiUtRepairName (ObjDesc->Reference.Node->Name.Ascii);
+            AcpiOsPrintf ("- [%4.4s] (Node %p)\n",
+                ObjDesc->Reference.Node->Name.Ascii,
+                ObjDesc->Reference.Node);
             break;
 
         case ACPI_REFCLASS_ARG:
@@ -1158,12 +1161,15 @@  AcpiExDumpReferenceObj (
             &RetBuf, TRUE);
         if (ACPI_FAILURE (Status))
         {
-            AcpiOsPrintf (" Could not convert name to pathname\n");
+            AcpiOsPrintf (" Could not convert name to pathname: %s\n",
+                AcpiFormatException (Status));
         }
         else
         {
-           AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
-           ACPI_FREE (RetBuf.Pointer);
+            AcpiOsPrintf ("%s: %s\n",
+                AcpiUtGetTypeName (ObjDesc->Reference.Node->Type),
+                (char *) RetBuf.Pointer);
+            ACPI_FREE (RetBuf.Pointer);
         }
     }
     else if (ObjDesc->Reference.Object)
@@ -1281,9 +1287,8 @@  AcpiExDumpPackageObj (
 
     case ACPI_TYPE_LOCAL_REFERENCE:
 
-        AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X",
-            AcpiUtGetReferenceName (ObjDesc),
-            ObjDesc->Reference.Class);
+        AcpiOsPrintf ("[Object Reference] Class [%s]",
+            AcpiUtGetReferenceName (ObjDesc));
         AcpiExDumpReferenceObj (ObjDesc);
         break;
 
diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
index a0efb25e..5d59276b 100644
--- a/src/acpica/source/components/executer/exoparg1.c
+++ b/src/acpica/source/components/executer/exoparg1.c
@@ -959,7 +959,7 @@  AcpiExOpcode_1A_0T_1R (
         if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
         {
             TempDesc = AcpiNsGetAttachedObject (
-                           (ACPI_NAMESPACE_NODE *) Operand[0]);
+                (ACPI_NAMESPACE_NODE *) Operand[0]);
             if (TempDesc &&
                  ((TempDesc->Common.Type == ACPI_TYPE_STRING) ||
                   (TempDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)))
@@ -1072,11 +1072,27 @@  AcpiExOpcode_1A_0T_1R (
              * This is a DerefOf (ObjectReference)
              * Get the actual object from the Node (This is the dereference).
              * This case may only happen when a LocalX or ArgX is
-             * dereferenced above.
+             * dereferenced above, or for references to device and
+             * thermal objects.
              */
-            ReturnDesc = AcpiNsGetAttachedObject (
-                (ACPI_NAMESPACE_NODE *) Operand[0]);
-            AcpiUtAddReference (ReturnDesc);
+            switch (((ACPI_NAMESPACE_NODE *) Operand[0])->Type)
+            {
+            case ACPI_TYPE_DEVICE:
+            case ACPI_TYPE_THERMAL:
+
+                /* These types have no node subobject, return the NS node */
+
+                ReturnDesc = Operand[0];
+                break;
+
+            default:
+                /* For most types, get the object attached to the node */
+
+                ReturnDesc = AcpiNsGetAttachedObject (
+                    (ACPI_NAMESPACE_NODE *) Operand[0]);
+                AcpiUtAddReference (ReturnDesc);
+                break;
+            }
         }
         else
         {
diff --git a/src/acpica/source/components/executer/exresolv.c b/src/acpica/source/components/executer/exresolv.c
index d0c8c8a8..64771922 100644
--- a/src/acpica/source/components/executer/exresolv.c
+++ b/src/acpica/source/components/executer/exresolv.c
@@ -493,12 +493,26 @@  AcpiExResolveMultiple (
                 (ACPI_NAMESPACE_NODE *) ObjDesc);
         }
 
-        if (!ObjDesc)
+        switch (Type)
         {
-            ACPI_ERROR ((AE_INFO,
-                "[%4.4s] Node is unresolved or uninitialized",
-                AcpiUtGetNodeName (Node)));
-            return_ACPI_STATUS (AE_AML_UNINITIALIZED_NODE);
+        case ACPI_TYPE_DEVICE:
+        case ACPI_TYPE_THERMAL:
+
+            /* These types have no attached subobject */
+            break;
+
+        default:
+
+            /* All other types require a subobject */
+
+            if (!ObjDesc)
+            {
+                ACPI_ERROR ((AE_INFO,
+                    "[%4.4s] Node is unresolved or uninitialized",
+                    AcpiUtGetNodeName (Node)));
+                return_ACPI_STATUS (AE_AML_UNINITIALIZED_NODE);
+            }
+            break;
         }
         break;
 
diff --git a/src/acpica/source/components/namespace/nsaccess.c b/src/acpica/source/components/namespace/nsaccess.c
index 40101575..1404eabf 100644
--- a/src/acpica/source/components/namespace/nsaccess.c
+++ b/src/acpica/source/components/namespace/nsaccess.c
@@ -155,6 +155,9 @@ 
 #include "acnamesp.h"
 #include "acdispat.h"
 
+#ifdef ACPI_ASL_COMPILER
+    #include "acdisasm.h"
+#endif
 
 #define _COMPONENT          ACPI_NAMESPACE
         ACPI_MODULE_NAME    ("nsaccess")
@@ -710,6 +713,30 @@  AcpiNsLookup (
                     CurrentNode));
             }
 
+#ifdef ACPI_ASL_COMPILER
+            /*
+             * If this ACPI name already exists within the namespace as an
+             * external declaration, then mark the external as a conflicting
+             * declaration and proceed to process the current node as if it did
+             * not exist in the namespace. If this node is not processed as
+             * normal, then it could cause improper namespace resolution
+             * by failing to open a new scope.
+             */
+            if (AcpiGbl_DisasmFlag &&
+                (Status == AE_ALREADY_EXISTS) &&
+                ((ThisNode->Flags & ANOBJ_IS_EXTERNAL) ||
+                    (WalkState && WalkState->Opcode == AML_EXTERNAL_OP)))
+            {
+                ThisNode->Flags &= ~ANOBJ_IS_EXTERNAL;
+                ThisNode->Type = (UINT8)ThisSearchType;
+                if (WalkState->Opcode != AML_EXTERNAL_OP)
+                {
+                    AcpiDmMarkExternalConflict (ThisNode);
+                }
+                break;
+            }
+#endif
+
             *ReturnNode = ThisNode;
             return_ACPI_STATUS (Status);
         }
diff --git a/src/acpica/source/components/namespace/nsnames.c b/src/acpica/source/components/namespace/nsnames.c
index 1dc53610..f68fbc1e 100644
--- a/src/acpica/source/components/namespace/nsnames.c
+++ b/src/acpica/source/components/namespace/nsnames.c
@@ -324,10 +324,6 @@  AcpiNsHandleToPathname (
 
     (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer,
         RequiredSize, NoTrailing);
-    if (ACPI_FAILURE (Status))
-    {
-        return_ACPI_STATUS (Status);
-    }
 
     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n",
         (char *) Buffer->Pointer, (UINT32) RequiredSize));
diff --git a/src/acpica/source/components/namespace/nsutils.c b/src/acpica/source/components/namespace/nsutils.c
index 3ab7a0eb..2b6f6fb8 100644
--- a/src/acpica/source/components/namespace/nsutils.c
+++ b/src/acpica/source/components/namespace/nsutils.c
@@ -206,7 +206,7 @@  AcpiNsPrintNodePathname (
             AcpiOsPrintf ("%s ", Message);
         }
 
-        AcpiOsPrintf ("[%s] (Node %p)", (char *) Buffer.Pointer, Node);
+        AcpiOsPrintf ("%s", (char *) Buffer.Pointer);
         ACPI_FREE (Buffer.Pointer);
     }
 }
diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
index 4dd8ff1d..ab3ad598 100644
--- a/src/acpica/source/components/namespace/nsxfeval.c
+++ b/src/acpica/source/components/namespace/nsxfeval.c
@@ -199,6 +199,8 @@  AcpiEvaluateObjectTyped (
 {
     ACPI_STATUS             Status;
     BOOLEAN                 FreeBufferOnError = FALSE;
+    ACPI_HANDLE             TargetHandle;
+    char                    *FullPathname;
 
 
     ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped);
@@ -216,41 +218,56 @@  AcpiEvaluateObjectTyped (
         FreeBufferOnError = TRUE;
     }
 
+    Status = AcpiGetHandle (Handle, Pathname, &TargetHandle);
+    if (ACPI_FAILURE (Status))
+    {
+        return_ACPI_STATUS (Status);
+    }
+
+    FullPathname = AcpiNsGetExternalPathname (TargetHandle);
+    if (!FullPathname)
+    {
+        return_ACPI_STATUS (AE_NO_MEMORY);
+    }
+
     /* Evaluate the object */
 
-    Status = AcpiEvaluateObject (Handle, Pathname,
-        ExternalParams, ReturnBuffer);
+    Status = AcpiEvaluateObject (TargetHandle, NULL, ExternalParams,
+        ReturnBuffer);
     if (ACPI_FAILURE (Status))
     {
-        return_ACPI_STATUS (Status);
+        goto Exit;
     }
 
-    /* Type ANY means "don't care" */
+    /* Type ANY means "don't care about return value type" */
 
     if (ReturnType == ACPI_TYPE_ANY)
     {
-        return_ACPI_STATUS (AE_OK);
+        goto Exit;
     }
 
     if (ReturnBuffer->Length == 0)
     {
         /* Error because caller specifically asked for a return value */
 
-        ACPI_ERROR ((AE_INFO, "No return value"));
-        return_ACPI_STATUS (AE_NULL_OBJECT);
+        ACPI_ERROR ((AE_INFO, "%s did not return any object",
+            FullPathname));
+        Status = AE_NULL_OBJECT;
+        goto Exit;
     }
 
     /* Examine the object type returned from EvaluateObject */
 
     if (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type == ReturnType)
     {
-        return_ACPI_STATUS (AE_OK);
+        goto Exit;
     }
 
     /* Return object type does not match requested type */
 
     ACPI_ERROR ((AE_INFO,
-        "Incorrect return type [%s] requested [%s]",
+        "Incorrect return type from %s - received [%s], requested [%s]",
+        FullPathname,
         AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type),
         AcpiUtGetTypeName (ReturnType)));
 
@@ -268,7 +285,11 @@  AcpiEvaluateObjectTyped (
     }
 
     ReturnBuffer->Length = 0;
-    return_ACPI_STATUS (AE_TYPE);
+    Status = AE_TYPE;
+
+Exit:
+    ACPI_FREE (FullPathname);
+    return_ACPI_STATUS (Status);
 }
 
 ACPI_EXPORT_SYMBOL (AcpiEvaluateObjectTyped)
diff --git a/src/acpica/source/components/parser/psobject.c b/src/acpica/source/components/parser/psobject.c
index 8d2448bd..5d59492a 100644
--- a/src/acpica/source/components/parser/psobject.c
+++ b/src/acpica/source/components/parser/psobject.c
@@ -237,12 +237,23 @@  AcpiPsGetAmlOpcode (
                 WalkState->Opcode,
                 (UINT32) (AmlOffset + sizeof (ACPI_TABLE_HEADER)));
 
+            ACPI_ERROR ((AE_INFO,
+                "Aborting disassembly, AML byte code is corrupt"));
+
             /* Dump the context surrounding the invalid opcode */
 
             AcpiUtDumpBuffer (((UINT8 *) WalkState->ParserState.Aml - 16),
                 48, DB_BYTE_DISPLAY,
                 (AmlOffset + sizeof (ACPI_TABLE_HEADER) - 16));
             AcpiOsPrintf (" */\n");
+
+            /*
+             * Just abort the disassembly, cannot continue because the
+             * parser is essentially lost. The disassembler can then
+             * randomly fail because an ill-constructed parse tree
+             * can result.
+             */
+            return_ACPI_STATUS (AE_AML_BAD_OPCODE);
 #endif
         }
 
@@ -458,6 +469,10 @@  AcpiPsCreateOp (
     {
         return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
     }
+    if (ACPI_FAILURE (Status))
+    {
+        return_ACPI_STATUS (Status);
+    }
 
     /* Create Op structure and append to parent's argument list */
 
diff --git a/src/acpica/source/components/parser/psopcode.c b/src/acpica/source/components/parser/psopcode.c
index 2ad29f19..97a32544 100644
--- a/src/acpica/source/components/parser/psopcode.c
+++ b/src/acpica/source/components/parser/psopcode.c
@@ -445,7 +445,7 @@  const ACPI_OPCODE_INFO    AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
 
 /* ACPI 6.0 opcodes */
 
-/* 81 */ ACPI_OP ("External",           ARGP_EXTERNAL_OP,          ARGI_EXTERNAL_OP,           ACPI_TYPE_ANY,               AML_CLASS_EXECUTE,/* ? */  AML_TYPE_EXEC_3A_0T_0R,   AML_FLAGS_EXEC_3A_0T_0R),
+/* 81 */ ACPI_OP ("External",           ARGP_EXTERNAL_OP,          ARGI_EXTERNAL_OP,           ACPI_TYPE_ANY,               AML_CLASS_NAMED_OBJECT,    AML_TYPE_NAMED_SIMPLE,    AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
 /* 82 */ ACPI_OP ("Comment",            ARGP_COMMENT_OP,           ARGI_COMMENT_OP,            ACPI_TYPE_STRING,            AML_CLASS_ARGUMENT,        AML_TYPE_LITERAL,         AML_CONSTANT)
 
 /*! [End] no source code translation !*/
diff --git a/src/acpica/source/components/parser/psparse.c b/src/acpica/source/components/parser/psparse.c
index 1a3a5345..854f0547 100644
--- a/src/acpica/source/components/parser/psparse.c
+++ b/src/acpica/source/components/parser/psparse.c
@@ -164,6 +164,7 @@ 
 #include "acdispat.h"
 #include "amlcode.h"
 #include "acinterp.h"
+#include "acnamesp.h"
 
 #define _COMPONENT          ACPI_PARSER
         ACPI_MODULE_NAME    ("psparse")
@@ -664,8 +665,17 @@  AcpiPsParseAml (
             /* Either the method parse or actual execution failed */
 
             AcpiExExitInterpreter ();
-            ACPI_ERROR_METHOD ("Method parse/execution failed",
-                WalkState->MethodNode, NULL, Status);
+            if (Status == AE_ABORT_METHOD)
+            {
+                AcpiNsPrintNodePathname (
+                    WalkState->MethodNode, "Method aborted:");
+                AcpiOsPrintf ("\n");
+            }
+            else
+            {
+                ACPI_ERROR_METHOD ("Method parse/execution failed",
+                    WalkState->MethodNode, NULL, Status);
+            }
             AcpiExEnterInterpreter ();
 
             /* Check for possible multi-thread reentrancy problem */
diff --git a/src/acpica/source/components/resources/rscalc.c b/src/acpica/source/components/resources/rscalc.c
index 2c3d09eb..492dde47 100644
--- a/src/acpica/source/components/resources/rscalc.c
+++ b/src/acpica/source/components/resources/rscalc.c
@@ -471,6 +471,15 @@  AcpiRsGetAmlLength (
 
             break;
 
+        case ACPI_RESOURCE_TYPE_PIN_FUNCTION:
+
+            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
+                (Resource->Data.PinFunction.PinTableLength * 2) +
+                Resource->Data.PinFunction.ResourceSource.StringLength +
+                Resource->Data.PinFunction.VendorLength);
+
+            break;
+
 
         case ACPI_RESOURCE_TYPE_SERIAL_BUS:
 
@@ -483,6 +492,42 @@  AcpiRsGetAmlLength (
 
             break;
 
+        case ACPI_RESOURCE_TYPE_PIN_CONFIG:
+
+            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
+                (Resource->Data.PinConfig.PinTableLength * 2) +
+                Resource->Data.PinConfig.ResourceSource.StringLength +
+                Resource->Data.PinConfig.VendorLength);
+
+            break;
+
+        case ACPI_RESOURCE_TYPE_PIN_GROUP:
+
+            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
+                (Resource->Data.PinGroup.PinTableLength * 2) +
+                Resource->Data.PinGroup.ResourceLabel.StringLength +
+                Resource->Data.PinGroup.VendorLength);
+
+            break;
+
+        case ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION:
+
+            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
+                Resource->Data.PinGroupFunction.ResourceSource.StringLength +
+                Resource->Data.PinGroupFunction.ResourceSourceLabel.StringLength +
+                Resource->Data.PinGroupFunction.VendorLength);
+
+            break;
+
+        case ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG:
+
+            TotalSize = (ACPI_RS_LENGTH) (TotalSize +
+                Resource->Data.PinGroupConfig.ResourceSource.StringLength +
+                Resource->Data.PinGroupConfig.ResourceSourceLabel.StringLength +
+                Resource->Data.PinGroupConfig.VendorLength);
+
+            break;
+
         default:
 
             break;
@@ -668,6 +713,26 @@  AcpiRsGetListLength (
             }
             break;
 
+        case ACPI_RESOURCE_NAME_PIN_FUNCTION:
+
+            /* Vendor data is optional */
+
+            if (AmlResource->PinFunction.VendorLength)
+            {
+                ExtraStructBytes +=
+                    AmlResource->PinFunction.VendorOffset -
+                    AmlResource->PinFunction.PinTableOffset +
+                    AmlResource->PinFunction.VendorLength;
+            }
+            else
+            {
+                ExtraStructBytes +=
+                    AmlResource->LargeHeader.ResourceLength +
+                    sizeof (AML_RESOURCE_LARGE_HEADER) -
+                    AmlResource->PinFunction.PinTableOffset;
+            }
+            break;
+
         case ACPI_RESOURCE_NAME_SERIAL_BUS:
 
             MinimumAmlResourceLength = AcpiGbl_ResourceAmlSerialBusSizes[
@@ -677,6 +742,53 @@  AcpiRsGetListLength (
                 MinimumAmlResourceLength;
             break;
 
+        case ACPI_RESOURCE_NAME_PIN_CONFIG:
+
+            /* Vendor data is optional */
+
+            if (AmlResource->PinConfig.VendorLength)
+            {
+                ExtraStructBytes +=
+                    AmlResource->PinConfig.VendorOffset -
+                    AmlResource->PinConfig.PinTableOffset +
+                    AmlResource->PinConfig.VendorLength;
+            }
+            else
+            {
+                ExtraStructBytes +=
+                    AmlResource->LargeHeader.ResourceLength +
+                    sizeof (AML_RESOURCE_LARGE_HEADER) -
+                    AmlResource->PinConfig.PinTableOffset;
+            }
+            break;
+
+        case ACPI_RESOURCE_NAME_PIN_GROUP:
+
+            ExtraStructBytes +=
+                AmlResource->PinGroup.VendorOffset -
+                AmlResource->PinGroup.PinTableOffset +
+                AmlResource->PinGroup.VendorLength;
+
+            break;
+
+        case ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION:
+
+            ExtraStructBytes +=
+                AmlResource->PinGroupFunction.VendorOffset -
+                AmlResource->PinGroupFunction.ResSourceOffset +
+                AmlResource->PinGroupFunction.VendorLength;
+
+            break;
+
+        case ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG:
+
+            ExtraStructBytes +=
+                AmlResource->PinGroupConfig.VendorOffset -
+                AmlResource->PinGroupConfig.ResSourceOffset +
+                AmlResource->PinGroupConfig.VendorLength;
+
+            break;
+
         default:
 
             break;
diff --git a/src/acpica/source/components/resources/rsdump.c b/src/acpica/source/components/resources/rsdump.c
index 9a980781..7cafdcf9 100644
--- a/src/acpica/source/components/resources/rsdump.c
+++ b/src/acpica/source/components/resources/rsdump.c
@@ -216,6 +216,11 @@  AcpiRsDumpResourceSource (
     ACPI_RESOURCE_SOURCE    *ResourceSource);
 
 static void
+AcpiRsDumpResourceLabel (
+    char                   *Title,
+    ACPI_RESOURCE_LABEL    *ResourceLabel);
+
+static void
 AcpiRsDumpAddressCommon (
     ACPI_RESOURCE_DATA      *Resource);
 
@@ -531,6 +536,22 @@  AcpiRsDumpDescriptor (
                 ACPI_RESOURCE_SOURCE, Target));
             break;
 
+        case ACPI_RSD_LABEL:
+            /*
+             * ResourceLabel
+             */
+            AcpiRsDumpResourceLabel ("Resource Label", ACPI_CAST_PTR (
+                ACPI_RESOURCE_LABEL, Target));
+            break;
+
+        case ACPI_RSD_SOURCE_LABEL:
+            /*
+             * ResourceSourceLabel
+             */
+            AcpiRsDumpResourceLabel ("Resource Source Label", ACPI_CAST_PTR (
+                ACPI_RESOURCE_LABEL, Target));
+            break;
+
         default:
 
             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
@@ -580,6 +601,32 @@  AcpiRsDumpResourceSource (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiRsDumpResourceLabel
+ *
+ * PARAMETERS:  Title              - Title of the dumped resource field
+ *              ResourceLabel      - Pointer to a Resource Label struct
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Common routine for dumping the ResourceLabel
+ *
+ ******************************************************************************/
+
+static void
+AcpiRsDumpResourceLabel (
+    char                   *Title,
+    ACPI_RESOURCE_LABEL    *ResourceLabel)
+{
+    ACPI_FUNCTION_ENTRY ();
+
+    AcpiRsOutString (Title,
+        ResourceLabel->StringPtr ?
+            ResourceLabel->StringPtr : "[Not Specified]");
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiRsDumpAddressCommon
  *
  * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
diff --git a/src/acpica/source/components/resources/rsdumpinfo.c b/src/acpica/source/components/resources/rsdumpinfo.c
index ba0f37dd..cd9ae4d3 100644
--- a/src/acpica/source/components/resources/rsdumpinfo.c
+++ b/src/acpica/source/components/resources/rsdumpinfo.c
@@ -360,6 +360,74 @@  ACPI_RSDUMP_INFO        AcpiRsDumpGpio[16] =
     {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (Gpio.VendorData),                 "VendorData",               NULL},
 };
 
+ACPI_RSDUMP_INFO        AcpiRsDumpPinFunction[10] =
+{
+    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinFunction),        "PinFunction",              NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinFunction.RevisionId),           "RevisionId",               NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinFunction.PinConfig),            "PinConfig",                AcpiGbl_PpcDecode},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinFunction.Sharable),             "Sharing",                  AcpiGbl_ShrDecode},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinFunction.FunctionNumber),       "FunctionNumber",           NULL},
+    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinFunction.ResourceSource),       "ResourceSource",           NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinFunction.PinTableLength),       "PinTableLength",           NULL},
+    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (PinFunction.PinTable),             "PinTable",                 NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinFunction.VendorLength),         "VendorLength",             NULL},
+    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinFunction.VendorData),          "VendorData",               NULL},
+};
+
+ACPI_RSDUMP_INFO        AcpiRsDumpPinConfig[11] =
+{
+    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinConfig),          "PinConfig",                NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinConfig.RevisionId),             "RevisionId",               NULL},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinConfig.ProducerConsumer),       "ProducerConsumer",         AcpiGbl_ConsumeDecode},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinConfig.Sharable),               "Sharing",                  AcpiGbl_ShrDecode},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinConfig.PinConfigType),          "PinConfigType",            NULL},
+    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (PinConfig.PinConfigValue),         "PinConfigValue",           NULL},
+    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinConfig.ResourceSource),         "ResourceSource",           NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinConfig.PinTableLength),         "PinTableLength",           NULL},
+    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (PinConfig.PinTable),               "PinTable",                 NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinConfig.VendorLength),           "VendorLength",             NULL},
+    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinConfig.VendorData),            "VendorData",               NULL},
+};
+
+ACPI_RSDUMP_INFO        AcpiRsDumpPinGroup[8] =
+{
+    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinGroup),           "PinGroup",                 NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroup.RevisionId),              "RevisionId",               NULL},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroup.ProducerConsumer),        "ProducerConsumer",         AcpiGbl_ConsumeDecode},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroup.PinTableLength),          "PinTableLength",           NULL},
+    {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET (PinGroup.PinTable),                "PinTable",                 NULL},
+    {ACPI_RSD_LABEL,    ACPI_RSD_OFFSET (PinGroup.ResourceLabel),           "ResourceLabel",            NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroup.VendorLength),            "VendorLength",             NULL},
+    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinGroup.VendorData),             "VendorData",               NULL},
+};
+
+ACPI_RSDUMP_INFO        AcpiRsDumpPinGroupFunction[9] =
+{
+    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinGroupFunction),   "PinGroupFunction",         NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroupFunction.RevisionId),      "RevisionId",               NULL},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupFunction.ProducerConsumer), "ProducerConsumer",        AcpiGbl_ConsumeDecode},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupFunction.Sharable),        "Sharing",                  AcpiGbl_ShrDecode},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroupFunction.FunctionNumber),  "FunctionNumber",           NULL},
+    {ACPI_RSD_SOURCE_LABEL, ACPI_RSD_OFFSET (PinGroupFunction.ResourceSourceLabel), "ResourceSourceLabel", NULL},
+    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinGroupFunction.ResourceSource),  "ResourceSource",           NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroupFunction.VendorLength),    "VendorLength",             NULL},
+    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinGroupFunction.VendorData),     "VendorData",               NULL},
+};
+
+ACPI_RSDUMP_INFO        AcpiRsDumpPinGroupConfig[10] =
+{
+    {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPinGroupConfig),     "PinGroupConfig",           NULL},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroupConfig.RevisionId),        "RevisionId",               NULL},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupConfig.ProducerConsumer),  "ProducerConsumer",         AcpiGbl_ConsumeDecode},
+    {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (PinGroupConfig.Sharable),          "Sharing",                  AcpiGbl_ShrDecode},
+    {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (PinGroupConfig.PinConfigType),     "PinConfigType",            NULL},
+    {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (PinGroupConfig.PinConfigValue),    "PinConfigValue",           NULL},
+    {ACPI_RSD_SOURCE_LABEL, ACPI_RSD_OFFSET (PinGroupConfig.ResourceSourceLabel), "ResourceSourceLabel", NULL},
+    {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (PinGroupConfig.ResourceSource),    "ResourceSource",           NULL},
+    {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (PinGroupConfig.VendorLength),      "VendorLength",             NULL},
+    {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (PinGroupConfig.VendorData),       "VendorData",               NULL},
+};
+
 ACPI_RSDUMP_INFO        AcpiRsDumpFixedDma[4] =
 {
     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedDma),           "FixedDma",                 NULL},
diff --git a/src/acpica/source/components/resources/rsinfo.c b/src/acpica/source/components/resources/rsinfo.c
index 499aff65..58189129 100644
--- a/src/acpica/source/components/resources/rsinfo.c
+++ b/src/acpica/source/components/resources/rsinfo.c
@@ -192,6 +192,11 @@  ACPI_RSCONVERT_INFO         *AcpiGbl_SetResourceDispatch[] =
     AcpiRsConvertGpio,              /* 0x11, ACPI_RESOURCE_TYPE_GPIO */
     AcpiRsConvertFixedDma,          /* 0x12, ACPI_RESOURCE_TYPE_FIXED_DMA */
     NULL,                           /* 0x13, ACPI_RESOURCE_TYPE_SERIAL_BUS - Use subtype table below */
+    AcpiRsConvertPinFunction,       /* 0x14, ACPI_RESOURCE_TYPE_PIN_FUNCTION */
+    AcpiRsConvertPinConfig,         /* 0x15, ACPI_RESOURCE_TYPE_PIN_CONFIG */
+    AcpiRsConvertPinGroup,          /* 0x16, ACPI_RESOURCE_TYPE_PIN_GROUP */
+    AcpiRsConvertPinGroupFunction,  /* 0x17, ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
+    AcpiRsConvertPinGroupConfig,    /* 0x18, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
 };
 
 /* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
@@ -232,8 +237,12 @@  ACPI_RSCONVERT_INFO         *AcpiGbl_GetResourceDispatch[] =
     AcpiRsConvertAddress64,         /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
     AcpiRsConvertExtAddress64,      /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
     AcpiRsConvertGpio,              /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
-    NULL,                           /* 0x0D, Reserved */
+    AcpiRsConvertPinFunction,       /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
     NULL,                           /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use subtype table below */
+    AcpiRsConvertPinConfig,         /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
+    AcpiRsConvertPinGroup,          /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
+    AcpiRsConvertPinGroupFunction,  /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
+    AcpiRsConvertPinGroupConfig,    /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
 };
 
 /* Subtype table for SerialBus -- I2C, SPI, and UART */
@@ -273,6 +282,11 @@  ACPI_RSDUMP_INFO            *AcpiGbl_DumpResourceDispatch[] =
     AcpiRsDumpGpio,                 /* ACPI_RESOURCE_TYPE_GPIO */
     AcpiRsDumpFixedDma,             /* ACPI_RESOURCE_TYPE_FIXED_DMA */
     NULL,                           /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
+    AcpiRsDumpPinFunction,          /* ACPI_RESOURCE_TYPE_PIN_FUNCTION */
+    AcpiRsDumpPinConfig,            /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
+    AcpiRsDumpPinGroup,             /* ACPI_RESOURCE_TYPE_PIN_GROUP */
+    AcpiRsDumpPinGroupFunction,     /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
+    AcpiRsDumpPinGroupConfig,       /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
 };
 
 ACPI_RSDUMP_INFO            *AcpiGbl_DumpSerialBusDispatch[] =
@@ -312,6 +326,11 @@  const UINT8                 AcpiGbl_AmlResourceSizes[] =
     sizeof (AML_RESOURCE_GPIO),             /* ACPI_RESOURCE_TYPE_GPIO */
     sizeof (AML_RESOURCE_FIXED_DMA),        /* ACPI_RESOURCE_TYPE_FIXED_DMA */
     sizeof (AML_RESOURCE_COMMON_SERIALBUS), /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
+    sizeof (AML_RESOURCE_PIN_FUNCTION),     /* ACPI_RESOURCE_TYPE_PIN_FUNCTION */
+    sizeof (AML_RESOURCE_PIN_CONFIG),       /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
+    sizeof (AML_RESOURCE_PIN_GROUP),        /* ACPI_RESOURCE_TYPE_PIN_GROUP */
+    sizeof (AML_RESOURCE_PIN_GROUP_FUNCTION), /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
+    sizeof (AML_RESOURCE_PIN_GROUP_CONFIG), /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
 };
 
 
@@ -351,7 +370,12 @@  const UINT8                 AcpiGbl_ResourceStructSizes[] =
     ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS64),
     ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_ADDRESS64),
     ACPI_RS_SIZE (ACPI_RESOURCE_GPIO),
-    ACPI_RS_SIZE (ACPI_RESOURCE_COMMON_SERIALBUS)
+    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_FUNCTION),
+    ACPI_RS_SIZE (ACPI_RESOURCE_COMMON_SERIALBUS),
+    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_CONFIG),
+    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP),
+    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_FUNCTION),
+    ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_CONFIG),
 };
 
 const UINT8                 AcpiGbl_AmlResourceSerialBusSizes[] =
diff --git a/src/acpica/source/components/resources/rsmisc.c b/src/acpica/source/components/resources/rsmisc.c
index 6a5dfd78..16db6fae 100644
--- a/src/acpica/source/components/resources/rsmisc.c
+++ b/src/acpica/source/components/resources/rsmisc.c
@@ -705,10 +705,7 @@  AcpiRsConvertResourceToAml (
 
             /* Set vendor offset only if there is vendor data */
 
-            if (Resource->Data.Gpio.VendorLength)
-            {
-                ACPI_SET16 (Target, AmlLength);
-            }
+            ACPI_SET16 (Target, AmlLength);
 
             AcpiRsSetResourceLength (AmlLength, Aml);
             break;
diff --git a/src/acpica/source/components/resources/rsserial.c b/src/acpica/source/components/resources/rsserial.c
index 30ddf522..5395382d 100644
--- a/src/acpica/source/components/resources/rsserial.c
+++ b/src/acpica/source/components/resources/rsserial.c
@@ -254,6 +254,78 @@  ACPI_RSCONVERT_INFO     AcpiRsConvertGpio[18] =
                         0},
 };
 
+/*******************************************************************************
+ *
+ * AcpiRsConvertPinfunction
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO     AcpiRsConvertPinFunction[13] =
+{
+    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_FUNCTION,
+                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_FUNCTION),
+                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinFunction)},
+
+    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_FUNCTION,
+                        sizeof (AML_RESOURCE_PIN_FUNCTION),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinFunction.RevisionId),
+                        AML_OFFSET (PinFunction.RevisionId),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinFunction.Sharable),
+                        AML_OFFSET (PinFunction.Flags),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinFunction.PinConfig),
+                        AML_OFFSET (PinFunction.PinConfig),
+                        1},
+
+    {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.PinFunction.FunctionNumber),
+                        AML_OFFSET (PinFunction.FunctionNumber),
+                        2},
+
+    /* Pin Table */
+
+    /*
+     * It is OK to use GPIO operations here because none of them refer GPIO
+     * structures directly but instead use offsets given here.
+     */
+
+    {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.PinFunction.PinTableLength),
+                        AML_OFFSET (PinFunction.PinTableOffset),
+                        AML_OFFSET (PinFunction.ResSourceOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.PinFunction.PinTable),
+                        AML_OFFSET (PinFunction.PinTableOffset),
+                        0},
+
+    /* Resource Source */
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinFunction.ResourceSource.Index),
+                        AML_OFFSET (PinFunction.ResSourceIndex),
+                        1},
+
+    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinFunction.ResourceSource.StringLength),
+                        AML_OFFSET (PinFunction.ResSourceOffset),
+                        AML_OFFSET (PinFunction.VendorOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinFunction.ResourceSource.StringPtr),
+                        AML_OFFSET (PinFunction.ResSourceOffset),
+                        0},
+
+    /* Vendor Data */
+
+    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinFunction.VendorLength),
+                        AML_OFFSET (PinFunction.VendorLength),
+                        1},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinFunction.VendorData),
+                        AML_OFFSET (PinFunction.VendorOffset),
+                        0},
+};
+
 
 /*******************************************************************************
  *
@@ -545,3 +617,278 @@  ACPI_RSCONVERT_INFO     AcpiRsConvertUartSerialBus[23] =
                         AML_OFFSET (UartSerialBus.DefaultBaudRate),
                         1},
 };
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertPinConfig
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO     AcpiRsConvertPinConfig[14] =
+{
+    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_CONFIG,
+                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_CONFIG),
+                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinConfig)},
+
+    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_CONFIG,
+                        sizeof (AML_RESOURCE_PIN_CONFIG),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinConfig.RevisionId),
+                        AML_OFFSET (PinConfig.RevisionId),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinConfig.Sharable),
+                        AML_OFFSET (PinConfig.Flags),
+                        0},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinConfig.ProducerConsumer),
+                        AML_OFFSET (PinConfig.Flags),
+                        1},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinConfig.PinConfigType),
+                        AML_OFFSET (PinConfig.PinConfigType),
+                        1},
+
+    {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.PinConfig.PinConfigValue),
+                        AML_OFFSET (PinConfig.PinConfigValue),
+                        1},
+
+    /* Pin Table */
+
+    /*
+     * It is OK to use GPIO operations here because none of them refer GPIO
+     * structures directly but instead use offsets given here.
+     */
+
+    {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.PinConfig.PinTableLength),
+                        AML_OFFSET (PinConfig.PinTableOffset),
+                        AML_OFFSET (PinConfig.ResSourceOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.PinConfig.PinTable),
+                        AML_OFFSET (PinConfig.PinTableOffset),
+                        0},
+
+    /* Resource Source */
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinConfig.ResourceSource.Index),
+                        AML_OFFSET (PinConfig.ResSourceIndex),
+                        1},
+
+    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinConfig.ResourceSource.StringLength),
+                        AML_OFFSET (PinConfig.ResSourceOffset),
+                        AML_OFFSET (PinConfig.VendorOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinConfig.ResourceSource.StringPtr),
+                        AML_OFFSET (PinConfig.ResSourceOffset),
+                        0},
+
+    /* Vendor Data */
+
+    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinConfig.VendorLength),
+                        AML_OFFSET (PinConfig.VendorLength),
+                        1},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinConfig.VendorData),
+                        AML_OFFSET (PinConfig.VendorOffset),
+                        0},
+};
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertPinGroup
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO     AcpiRsConvertPinGroup[10] =
+{
+    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_GROUP,
+                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP),
+                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinGroup)},
+
+    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_GROUP,
+                        sizeof (AML_RESOURCE_PIN_GROUP),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroup.RevisionId),
+                        AML_OFFSET (PinGroup.RevisionId),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroup.ProducerConsumer),
+                        AML_OFFSET (PinGroup.Flags),
+                        0},
+
+    /* Pin Table */
+
+    /*
+     * It is OK to use GPIO operations here because none of them refer GPIO
+     * structures directly but instead use offsets given here.
+     */
+
+    {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.PinGroup.PinTableLength),
+                        AML_OFFSET (PinGroup.PinTableOffset),
+                        AML_OFFSET (PinGroup.LabelOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.PinGroup.PinTable),
+                        AML_OFFSET (PinGroup.PinTableOffset),
+                        0},
+
+    /* Resource Label */
+
+    {ACPI_RSC_COUNT_GPIO_RES, ACPI_RS_OFFSET (Data.PinGroup.ResourceLabel.StringLength),
+                        AML_OFFSET (PinGroup.LabelOffset),
+                        AML_OFFSET (PinGroup.VendorOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET (Data.PinGroup.ResourceLabel.StringPtr),
+                        AML_OFFSET (PinGroup.LabelOffset),
+                        0},
+
+    /* Vendor Data */
+
+    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinGroup.VendorLength),
+                        AML_OFFSET (PinGroup.VendorLength),
+                        1},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroup.VendorData),
+                        AML_OFFSET (PinGroup.VendorOffset),
+                        0},
+};
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertPinGroupFunction
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO     AcpiRsConvertPinGroupFunction[13] =
+{
+    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION,
+                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_FUNCTION),
+                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinGroupFunction)},
+
+    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION,
+                        sizeof (AML_RESOURCE_PIN_GROUP_FUNCTION),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupFunction.RevisionId),
+                        AML_OFFSET (PinGroupFunction.RevisionId),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupFunction.Sharable),
+                        AML_OFFSET (PinGroupFunction.Flags),
+                        0},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupFunction.ProducerConsumer),
+                        AML_OFFSET (PinGroupFunction.Flags),
+                        1},
+
+    {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.PinGroupFunction.FunctionNumber),
+                        AML_OFFSET (PinGroupFunction.FunctionNumber),
+                        1},
+
+    /* Resource Source */
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSource.Index),
+                        AML_OFFSET (PinGroupFunction.ResSourceIndex),
+                        1},
+
+    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSource.StringLength),
+                        AML_OFFSET (PinGroupFunction.ResSourceOffset),
+                        AML_OFFSET (PinGroupFunction.ResSourceLabelOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSource.StringPtr),
+                        AML_OFFSET (PinGroupFunction.ResSourceOffset),
+                        0},
+
+    /* Resource Source Label */
+
+    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSourceLabel.StringLength),
+                        AML_OFFSET (PinGroupFunction.ResSourceLabelOffset),
+                        AML_OFFSET (PinGroupFunction.VendorOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupFunction.ResourceSourceLabel.StringPtr),
+                        AML_OFFSET (PinGroupFunction.ResSourceLabelOffset),
+                        0},
+
+    /* Vendor Data */
+
+    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinGroupFunction.VendorLength),
+                        AML_OFFSET (PinGroupFunction.VendorLength),
+                        1},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupFunction.VendorData),
+                        AML_OFFSET (PinGroupFunction.VendorOffset),
+                        0},
+};
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertPinGroupConfig
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO     AcpiRsConvertPinGroupConfig[14] =
+{
+    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG,
+                        ACPI_RS_SIZE (ACPI_RESOURCE_PIN_GROUP_CONFIG),
+                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertPinGroupConfig)},
+
+    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG,
+                        sizeof (AML_RESOURCE_PIN_GROUP_CONFIG),
+                        0},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupConfig.RevisionId),
+                        AML_OFFSET (PinGroupConfig.RevisionId),
+                        1},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupConfig.Sharable),
+                        AML_OFFSET (PinGroupConfig.Flags),
+                        0},
+
+    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.PinGroupConfig.ProducerConsumer),
+                        AML_OFFSET (PinGroupConfig.Flags),
+                        1},
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupConfig.PinConfigType),
+                        AML_OFFSET (PinGroupConfig.PinConfigType),
+                        1},
+
+    {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.PinGroupConfig.PinConfigValue),
+                        AML_OFFSET (PinGroupConfig.PinConfigValue),
+                        1},
+
+    /* Resource Source */
+
+    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSource.Index),
+                        AML_OFFSET (PinGroupConfig.ResSourceIndex),
+                        1},
+
+    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSource.StringLength),
+                        AML_OFFSET (PinGroupConfig.ResSourceOffset),
+                        AML_OFFSET (PinGroupConfig.ResSourceLabelOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSource.StringPtr),
+                        AML_OFFSET (PinGroupConfig.ResSourceOffset),
+                        0},
+
+    /* Resource Source Label */
+
+    {ACPI_RSC_COUNT_GPIO_RES,  ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSourceLabel.StringLength),
+                        AML_OFFSET (PinGroupConfig.ResSourceLabelOffset),
+                        AML_OFFSET (PinGroupConfig.VendorOffset)},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupConfig.ResourceSourceLabel.StringPtr),
+                        AML_OFFSET (PinGroupConfig.ResSourceLabelOffset),
+                        0},
+
+    /* Vendor Data */
+
+    {ACPI_RSC_COUNT_GPIO_VEN,   ACPI_RS_OFFSET (Data.PinGroupConfig.VendorLength),
+                        AML_OFFSET (PinGroupConfig.VendorLength),
+                        1},
+
+    {ACPI_RSC_MOVE_GPIO_RES,   ACPI_RS_OFFSET (Data.PinGroupConfig.VendorData),
+                        AML_OFFSET (PinGroupConfig.VendorOffset),
+                        0},
+};
diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
index 42d40a4a..3e4e5229 100644
--- a/src/acpica/source/components/tables/tbfadt.c
+++ b/src/acpica/source/components/tables/tbfadt.c
@@ -597,8 +597,8 @@  AcpiTbCreateLocalFadt (
  * The 64-bit X fields are optional extensions to the original 32-bit FADT
  * V1.0 fields. Even if they are present in the FADT, they are optional and
  * are unused if the BIOS sets them to zero. Therefore, we must copy/expand
- * 32-bit V1.0 fields to the 64-bit X fields if the the 64-bit X field is
- * originally zero.
+ * 32-bit V1.0 fields to the 64-bit X fields if the 64-bit X field is originally
+ * zero.
  *
  * For ACPI 1.0 FADTs (that contain no 64-bit addresses), all 32-bit address
  * fields are expanded to the corresponding 64-bit X fields in the internal
diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c
index 046add5f..c7e0ee75 100644
--- a/src/acpica/source/components/tables/tbutils.c
+++ b/src/acpica/source/components/tables/tbutils.c
@@ -257,9 +257,9 @@  AcpiTbCheckDsdtHeader (
  *
  * FUNCTION:    AcpiTbCopyDsdt
  *
- * PARAMETERS:  TableDesc           - Installed table to copy
+ * PARAMETERS:  TableIndex          - Index of installed table to copy
  *
- * RETURN:      None
+ * RETURN:      The copied DSDT
  *
  * DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory.
  *              Some very bad BIOSs are known to either corrupt the DSDT or
@@ -368,7 +368,7 @@  AcpiTbGetRootTableEntry (
  *
  * FUNCTION:    AcpiTbParseRootTable
  *
- * PARAMETERS:  Rsdp                    - Pointer to the RSDP
+ * PARAMETERS:  RsdpAddress         - Pointer to the RSDP
  *
  * RETURN:      Status
  *
diff --git a/src/acpica/source/components/utilities/utdecode.c b/src/acpica/source/components/utilities/utdecode.c
index a0abe49c..7cb171bc 100644
--- a/src/acpica/source/components/utilities/utdecode.c
+++ b/src/acpica/source/components/utilities/utdecode.c
@@ -629,8 +629,9 @@  static const char           *AcpiGbl_GenericNotify[ACPI_GENERIC_NOTIFY_MAX + 1]
     /* 09 */ "Device PLD Check",
     /* 0A */ "Reserved",
     /* 0B */ "System Locality Update",
-    /* 0C */ "Shutdown Request", /* Reserved in ACPI 6.0 */
-    /* 0D */ "System Resource Affinity Update"
+    /* 0C */ "Reserved (was previously Shutdown Request)",  /* Reserved in ACPI 6.0 */
+    /* 0D */ "System Resource Affinity Update",
+    /* 0E */ "Heterogeneous Memory Attributes Update"       /* ACPI 6.2 */
 };
 
 static const char           *AcpiGbl_DeviceNotify[5] =
diff --git a/src/acpica/source/components/utilities/utownerid.c b/src/acpica/source/components/utilities/utownerid.c
index fba1d7ad..a54513f6 100644
--- a/src/acpica/source/components/utilities/utownerid.c
+++ b/src/acpica/source/components/utilities/utownerid.c
@@ -225,14 +225,20 @@  AcpiUtAllocateOwnerId (
                 break;
             }
 
-            if (!(AcpiGbl_OwnerIdMask[j] & (1 << k)))
+            /*
+             * Note: the UINT32 cast ensures that 1 is stored as a unsigned
+             * integer. Omitting the cast may result in 1 being stored as an
+             * int. Some compilers or runtime error detection may flag this as
+             * an error.
+             */
+            if (!(AcpiGbl_OwnerIdMask[j] & ((UINT32) 1 << k)))
             {
                 /*
                  * Found a free ID. The actual ID is the bit index plus one,
                  * making zero an invalid Owner ID. Save this as the last ID
                  * allocated and update the global ID mask.
                  */
-                AcpiGbl_OwnerIdMask[j] |= (1 << k);
+                AcpiGbl_OwnerIdMask[j] |= ((UINT32) 1 << k);
 
                 AcpiGbl_LastOwnerIdIndex = (UINT8) j;
                 AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1);
@@ -328,7 +334,7 @@  AcpiUtReleaseOwnerId (
     /* Decode ID to index/offset pair */
 
     Index = ACPI_DIV_32 (OwnerId);
-    Bit = 1 << ACPI_MOD_32 (OwnerId);
+    Bit = (UINT32) 1 << ACPI_MOD_32 (OwnerId);
 
     /* Free the owner ID only if it is valid */
 
diff --git a/src/acpica/source/components/utilities/utresdecode.c b/src/acpica/source/components/utilities/utresdecode.c
new file mode 100644
index 00000000..10d84874
--- /dev/null
+++ b/src/acpica/source/components/utilities/utresdecode.c
@@ -0,0 +1,461 @@ 
+/*******************************************************************************
+ *
+ * Module Name: utresdecode - Resource descriptor keyword strings
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ *****************************************************************************/
+
+#include "acpi.h"
+#include "accommon.h"
+#include "acresrc.h"
+
+
+#define _COMPONENT          ACPI_UTILITIES
+        ACPI_MODULE_NAME    ("utresdecode")
+
+
+#if defined (ACPI_DEBUG_OUTPUT) || \
+    defined (ACPI_DISASSEMBLER) || \
+    defined (ACPI_DEBUGGER)
+
+/*
+ * Strings used to decode resource descriptors.
+ * Used by both the disassembler and the debugger resource dump routines
+ */
+const char                      *AcpiGbl_BmDecode[] =
+{
+    "NotBusMaster",
+    "BusMaster"
+};
+
+const char                      *AcpiGbl_ConfigDecode[] =
+{
+    "0 - Good Configuration",
+    "1 - Acceptable Configuration",
+    "2 - Suboptimal Configuration",
+    "3 - ***Invalid Configuration***",
+};
+
+const char                      *AcpiGbl_ConsumeDecode[] =
+{
+    "ResourceProducer",
+    "ResourceConsumer"
+};
+
+const char                      *AcpiGbl_DecDecode[] =
+{
+    "PosDecode",
+    "SubDecode"
+};
+
+const char                      *AcpiGbl_HeDecode[] =
+{
+    "Level",
+    "Edge"
+};
+
+const char                      *AcpiGbl_IoDecode[] =
+{
+    "Decode10",
+    "Decode16"
+};
+
+const char                      *AcpiGbl_LlDecode[] =
+{
+    "ActiveHigh",
+    "ActiveLow",
+    "ActiveBoth",
+    "Reserved"
+};
+
+const char                      *AcpiGbl_MaxDecode[] =
+{
+    "MaxNotFixed",
+    "MaxFixed"
+};
+
+const char                      *AcpiGbl_MemDecode[] =
+{
+    "NonCacheable",
+    "Cacheable",
+    "WriteCombining",
+    "Prefetchable"
+};
+
+const char                      *AcpiGbl_MinDecode[] =
+{
+    "MinNotFixed",
+    "MinFixed"
+};
+
+const char                      *AcpiGbl_MtpDecode[] =
+{
+    "AddressRangeMemory",
+    "AddressRangeReserved",
+    "AddressRangeACPI",
+    "AddressRangeNVS"
+};
+
+const char                      *AcpiGbl_RngDecode[] =
+{
+    "InvalidRanges",
+    "NonISAOnlyRanges",
+    "ISAOnlyRanges",
+    "EntireRange"
+};
+
+const char                      *AcpiGbl_RwDecode[] =
+{
+    "ReadOnly",
+    "ReadWrite"
+};
+
+const char                      *AcpiGbl_ShrDecode[] =
+{
+    "Exclusive",
+    "Shared",
+    "ExclusiveAndWake",         /* ACPI 5.0 */
+    "SharedAndWake"             /* ACPI 5.0 */
+};
+
+const char                      *AcpiGbl_SizDecode[] =
+{
+    "Transfer8",
+    "Transfer8_16",
+    "Transfer16",
+    "InvalidSize"
+};
+
+const char                      *AcpiGbl_TrsDecode[] =
+{
+    "DenseTranslation",
+    "SparseTranslation"
+};
+
+const char                      *AcpiGbl_TtpDecode[] =
+{
+    "TypeStatic",
+    "TypeTranslation"
+};
+
+const char                      *AcpiGbl_TypDecode[] =
+{
+    "Compatibility",
+    "TypeA",
+    "TypeB",
+    "TypeF"
+};
+
+const char                      *AcpiGbl_PpcDecode[] =
+{
+    "PullDefault",
+    "PullUp",
+    "PullDown",
+    "PullNone"
+};
+
+const char                      *AcpiGbl_IorDecode[] =
+{
+    "IoRestrictionNone",
+    "IoRestrictionInputOnly",
+    "IoRestrictionOutputOnly",
+    "IoRestrictionNoneAndPreserve"
+};
+
+const char                      *AcpiGbl_DtsDecode[] =
+{
+    "Width8bit",
+    "Width16bit",
+    "Width32bit",
+    "Width64bit",
+    "Width128bit",
+    "Width256bit",
+};
+
+/* GPIO connection type */
+
+const char                      *AcpiGbl_CtDecode[] =
+{
+    "Interrupt",
+    "I/O"
+};
+
+/* Serial bus type */
+
+const char                      *AcpiGbl_SbtDecode[] =
+{
+    "/* UNKNOWN serial bus type */",
+    "I2C",
+    "SPI",
+    "UART"
+};
+
+/* I2C serial bus access mode */
+
+const char                      *AcpiGbl_AmDecode[] =
+{
+    "AddressingMode7Bit",
+    "AddressingMode10Bit"
+};
+
+/* I2C serial bus slave mode */
+
+const char                      *AcpiGbl_SmDecode[] =
+{
+    "ControllerInitiated",
+    "DeviceInitiated"
+};
+
+/* SPI serial bus wire mode */
+
+const char                      *AcpiGbl_WmDecode[] =
+{
+    "FourWireMode",
+    "ThreeWireMode"
+};
+
+/* SPI serial clock phase */
+
+const char                      *AcpiGbl_CphDecode[] =
+{
+    "ClockPhaseFirst",
+    "ClockPhaseSecond"
+};
+
+/* SPI serial bus clock polarity */
+
+const char                      *AcpiGbl_CpoDecode[] =
+{
+    "ClockPolarityLow",
+    "ClockPolarityHigh"
+};
+
+/* SPI serial bus device polarity */
+
+const char                      *AcpiGbl_DpDecode[] =
+{
+    "PolarityLow",
+    "PolarityHigh"
+};
+
+/* UART serial bus endian */
+
+const char                      *AcpiGbl_EdDecode[] =
+{
+    "LittleEndian",
+    "BigEndian"
+};
+
+/* UART serial bus bits per byte */
+
+const char                      *AcpiGbl_BpbDecode[] =
+{
+    "DataBitsFive",
+    "DataBitsSix",
+    "DataBitsSeven",
+    "DataBitsEight",
+    "DataBitsNine",
+    "/* UNKNOWN Bits per byte */",
+    "/* UNKNOWN Bits per byte */",
+    "/* UNKNOWN Bits per byte */"
+};
+
+/* UART serial bus stop bits */
+
+const char                      *AcpiGbl_SbDecode[] =
+{
+    "StopBitsZero",
+    "StopBitsOne",
+    "StopBitsOnePlusHalf",
+    "StopBitsTwo"
+};
+
+/* UART serial bus flow control */
+
+const char                      *AcpiGbl_FcDecode[] =
+{
+    "FlowControlNone",
+    "FlowControlHardware",
+    "FlowControlXON",
+    "/* UNKNOWN flow control keyword */"
+};
+
+/* UART serial bus parity type */
+
+const char                      *AcpiGbl_PtDecode[] =
+{
+    "ParityTypeNone",
+    "ParityTypeEven",
+    "ParityTypeOdd",
+    "ParityTypeMark",
+    "ParityTypeSpace",
+    "/* UNKNOWN parity keyword */",
+    "/* UNKNOWN parity keyword */",
+    "/* UNKNOWN parity keyword */"
+};
+
+/* PinConfig type */
+
+const char                      *AcpiGbl_PtypDecode[] =
+{
+    "Default",
+    "Bias Pull-up",
+    "Bias Pull-down",
+    "Bias Default",
+    "Bias Disable",
+    "Bias High Impedance",
+    "Bias Bus Hold",
+    "Drive Open Drain",
+    "Drive Open Source",
+    "Drive Push Pull",
+    "Drive Strength",
+    "Slew Rate",
+    "Input Debounce",
+    "Input Schmitt Trigger",
+};
+
+#endif
diff --git a/src/acpica/source/components/utilities/utresrc.c b/src/acpica/source/components/utilities/utresrc.c
index 978711a5..8131cde2 100644
--- a/src/acpica/source/components/utilities/utresrc.c
+++ b/src/acpica/source/components/utilities/utresrc.c
@@ -158,287 +158,6 @@ 
         ACPI_MODULE_NAME    ("utresrc")
 
 
-#if defined(ACPI_DEBUG_OUTPUT) || defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
-
-/*
- * Strings used to decode resource descriptors.
- * Used by both the disassembler and the debugger resource dump routines
- */
-const char                      *AcpiGbl_BmDecode[] =
-{
-    "NotBusMaster",
-    "BusMaster"
-};
-
-const char                      *AcpiGbl_ConfigDecode[] =
-{
-    "0 - Good Configuration",
-    "1 - Acceptable Configuration",
-    "2 - Suboptimal Configuration",
-    "3 - ***Invalid Configuration***",
-};
-
-const char                      *AcpiGbl_ConsumeDecode[] =
-{
-    "ResourceProducer",
-    "ResourceConsumer"
-};
-
-const char                      *AcpiGbl_DecDecode[] =
-{
-    "PosDecode",
-    "SubDecode"
-};
-
-const char                      *AcpiGbl_HeDecode[] =
-{
-    "Level",
-    "Edge"
-};
-
-const char                      *AcpiGbl_IoDecode[] =
-{
-    "Decode10",
-    "Decode16"
-};
-
-const char                      *AcpiGbl_LlDecode[] =
-{
-    "ActiveHigh",
-    "ActiveLow",
-    "ActiveBoth",
-    "Reserved"
-};
-
-const char                      *AcpiGbl_MaxDecode[] =
-{
-    "MaxNotFixed",
-    "MaxFixed"
-};
-
-const char                      *AcpiGbl_MemDecode[] =
-{
-    "NonCacheable",
-    "Cacheable",
-    "WriteCombining",
-    "Prefetchable"
-};
-
-const char                      *AcpiGbl_MinDecode[] =
-{
-    "MinNotFixed",
-    "MinFixed"
-};
-
-const char                      *AcpiGbl_MtpDecode[] =
-{
-    "AddressRangeMemory",
-    "AddressRangeReserved",
-    "AddressRangeACPI",
-    "AddressRangeNVS"
-};
-
-const char                      *AcpiGbl_RngDecode[] =
-{
-    "InvalidRanges",
-    "NonISAOnlyRanges",
-    "ISAOnlyRanges",
-    "EntireRange"
-};
-
-const char                      *AcpiGbl_RwDecode[] =
-{
-    "ReadOnly",
-    "ReadWrite"
-};
-
-const char                      *AcpiGbl_ShrDecode[] =
-{
-    "Exclusive",
-    "Shared",
-    "ExclusiveAndWake",         /* ACPI 5.0 */
-    "SharedAndWake"             /* ACPI 5.0 */
-};
-
-const char                      *AcpiGbl_SizDecode[] =
-{
-    "Transfer8",
-    "Transfer8_16",
-    "Transfer16",
-    "InvalidSize"
-};
-
-const char                      *AcpiGbl_TrsDecode[] =
-{
-    "DenseTranslation",
-    "SparseTranslation"
-};
-
-const char                      *AcpiGbl_TtpDecode[] =
-{
-    "TypeStatic",
-    "TypeTranslation"
-};
-
-const char                      *AcpiGbl_TypDecode[] =
-{
-    "Compatibility",
-    "TypeA",
-    "TypeB",
-    "TypeF"
-};
-
-const char                      *AcpiGbl_PpcDecode[] =
-{
-    "PullDefault",
-    "PullUp",
-    "PullDown",
-    "PullNone"
-};
-
-const char                      *AcpiGbl_IorDecode[] =
-{
-    "IoRestrictionNone",
-    "IoRestrictionInputOnly",
-    "IoRestrictionOutputOnly",
-    "IoRestrictionNoneAndPreserve"
-};
-
-const char                      *AcpiGbl_DtsDecode[] =
-{
-    "Width8bit",
-    "Width16bit",
-    "Width32bit",
-    "Width64bit",
-    "Width128bit",
-    "Width256bit",
-};
-
-/* GPIO connection type */
-
-const char                      *AcpiGbl_CtDecode[] =
-{
-    "Interrupt",
-    "I/O"
-};
-
-/* Serial bus type */
-
-const char                      *AcpiGbl_SbtDecode[] =
-{
-    "/* UNKNOWN serial bus type */",
-    "I2C",
-    "SPI",
-    "UART"
-};
-
-/* I2C serial bus access mode */
-
-const char                      *AcpiGbl_AmDecode[] =
-{
-    "AddressingMode7Bit",
-    "AddressingMode10Bit"
-};
-
-/* I2C serial bus slave mode */
-
-const char                      *AcpiGbl_SmDecode[] =
-{
-    "ControllerInitiated",
-    "DeviceInitiated"
-};
-
-/* SPI serial bus wire mode */
-
-const char                      *AcpiGbl_WmDecode[] =
-{
-    "FourWireMode",
-    "ThreeWireMode"
-};
-
-/* SPI serial clock phase */
-
-const char                      *AcpiGbl_CphDecode[] =
-{
-    "ClockPhaseFirst",
-    "ClockPhaseSecond"
-};
-
-/* SPI serial bus clock polarity */
-
-const char                      *AcpiGbl_CpoDecode[] =
-{
-    "ClockPolarityLow",
-    "ClockPolarityHigh"
-};
-
-/* SPI serial bus device polarity */
-
-const char                      *AcpiGbl_DpDecode[] =
-{
-    "PolarityLow",
-    "PolarityHigh"
-};
-
-/* UART serial bus endian */
-
-const char                      *AcpiGbl_EdDecode[] =
-{
-    "LittleEndian",
-    "BigEndian"
-};
-
-/* UART serial bus bits per byte */
-
-const char                      *AcpiGbl_BpbDecode[] =
-{
-    "DataBitsFive",
-    "DataBitsSix",
-    "DataBitsSeven",
-    "DataBitsEight",
-    "DataBitsNine",
-    "/* UNKNOWN Bits per byte */",
-    "/* UNKNOWN Bits per byte */",
-    "/* UNKNOWN Bits per byte */"
-};
-
-/* UART serial bus stop bits */
-
-const char                      *AcpiGbl_SbDecode[] =
-{
-    "StopBitsZero",
-    "StopBitsOne",
-    "StopBitsOnePlusHalf",
-    "StopBitsTwo"
-};
-
-/* UART serial bus flow control */
-
-const char                      *AcpiGbl_FcDecode[] =
-{
-    "FlowControlNone",
-    "FlowControlHardware",
-    "FlowControlXON",
-    "/* UNKNOWN flow control keyword */"
-};
-
-/* UART serial bus parity type */
-
-const char                      *AcpiGbl_PtDecode[] =
-{
-    "ParityTypeNone",
-    "ParityTypeEven",
-    "ParityTypeOdd",
-    "ParityTypeMark",
-    "ParityTypeSpace",
-    "/* UNKNOWN parity keyword */",
-    "/* UNKNOWN parity keyword */",
-    "/* UNKNOWN parity keyword */"
-};
-
-#endif
-
-
 /*
  * Base sizes of the raw AML resource descriptors, indexed by resource type.
  * Zero indicates a reserved (and therefore invalid) resource type.
@@ -479,8 +198,12 @@  const UINT8                 AcpiGbl_ResourceAmlSizes[] =
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64),
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO),
-    0,
+    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_FUNCTION),
     ACPI_AML_SIZE_LARGE (AML_RESOURCE_COMMON_SERIALBUS),
+    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_CONFIG),
+    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP),
+    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_FUNCTION),
+    ACPI_AML_SIZE_LARGE (AML_RESOURCE_PIN_GROUP_CONFIG),
 };
 
 const UINT8                 AcpiGbl_ResourceAmlSerialBusSizes[] =
@@ -534,8 +257,12 @@  static const UINT8          AcpiGbl_ResourceTypes[] =
     ACPI_VARIABLE_LENGTH,           /* 0A Qword* address */
     ACPI_FIXED_LENGTH,              /* 0B Extended* address */
     ACPI_VARIABLE_LENGTH,           /* 0C Gpio* */
-    0,
-    ACPI_VARIABLE_LENGTH            /* 0E *SerialBus */
+    ACPI_VARIABLE_LENGTH,           /* 0D PinFunction */
+    ACPI_VARIABLE_LENGTH,           /* 0E *SerialBus */
+    ACPI_VARIABLE_LENGTH,           /* 0F PinConfig */
+    ACPI_VARIABLE_LENGTH,           /* 10 PinGroup */
+    ACPI_VARIABLE_LENGTH,           /* 11 PinGroupFunction */
+    ACPI_VARIABLE_LENGTH,           /* 12 PinGroupConfig */
 };
 
 
@@ -580,7 +307,7 @@  AcpiUtWalkAmlResources (
      * The absolute minimum resource template is one EndTag descriptor.
      * However, we will treat a lone EndTag as just a simple buffer.
      */
-    if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
+    if (AmlLength <= sizeof (AML_RESOURCE_END_TAG))
     {
         return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
     }
@@ -613,8 +340,8 @@  AcpiUtWalkAmlResources (
 
         if (UserFunction)
         {
-            Status = UserFunction (Aml, Length, Offset,
-                ResourceIndex, Context);
+            Status = UserFunction (
+                Aml, Length, Offset, ResourceIndex, Context);
             if (ACPI_FAILURE (Status))
             {
                 return_ACPI_STATUS (Status);
@@ -651,15 +378,10 @@  AcpiUtWalkAmlResources (
                 *Context = Aml;
             }
 
-            /* Check if buffer is defined to be longer than the resource length */
-
-            if (AmlLength > (Offset + Length))
-            {
-                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
-            }
-
-            /* Normal exit */
-
+            /*
+             * Normal exit. Note: We allow the buffer to be larger than
+             * the resource template, as long as the END_TAG exists.
+             */
             return_ACPI_STATUS (AE_OK);
         }
 
diff --git a/src/acpica/source/include/acapps.h b/src/acpica/source/include/acapps.h
index 6ceb0f23..6ef98550 100644
--- a/src/acpica/source/include/acapps.h
+++ b/src/acpica/source/include/acapps.h
@@ -294,7 +294,7 @@  AcpiDmFinishNamespaceLoad (
     ACPI_OWNER_ID           OwnerId);
 
 void
-AcpiDmConvertResourceIndexes (
+AcpiDmConvertParseObjects (
     ACPI_PARSE_OBJECT       *ParseTreeRoot,
     ACPI_NAMESPACE_NODE     *NamespaceRoot);
 
diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
index 01b0829d..5beec2d4 100644
--- a/src/acpica/source/include/acdisasm.h
+++ b/src/acpica/source/include/acdisasm.h
@@ -207,6 +207,11 @@  typedef enum
     ACPI_DMT_FLAGS1,
     ACPI_DMT_FLAGS2,
     ACPI_DMT_FLAGS4,
+    ACPI_DMT_FLAGS4_0,
+    ACPI_DMT_FLAGS4_4,
+    ACPI_DMT_FLAGS4_8,
+    ACPI_DMT_FLAGS4_12,
+    ACPI_DMT_FLAGS16_16,
     ACPI_DMT_UINT8,
     ACPI_DMT_UINT16,
     ACPI_DMT_UINT24,
@@ -257,6 +262,7 @@  typedef enum
     ACPI_DMT_HEST,
     ACPI_DMT_HESTNTFY,
     ACPI_DMT_HESTNTYP,
+    ACPI_DMT_HMAT,
     ACPI_DMT_IORTMEM,
     ACPI_DMT_IVRS,
     ACPI_DMT_LPIT,
@@ -264,6 +270,7 @@  typedef enum
     ACPI_DMT_NFIT,
     ACPI_DMT_PCCT,
     ACPI_DMT_PMTT,
+    ACPI_DMT_PPTT,
     ACPI_DMT_SLIC,
     ACPI_DMT_SRAT,
 
@@ -412,12 +419,22 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest7[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest8[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest9[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest10[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHest11[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHestNotify[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHestBank[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHpet[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoLpitHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoLpit0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoLpit1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat0[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1b[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat1c[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat2[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmat2a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoHmatHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoIort0a[];
@@ -495,6 +512,13 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcctHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct2[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct3[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct4[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt2[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPpttHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRasf[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRsdp1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoRsdp2[];
@@ -513,6 +537,7 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat2[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat3[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSrat4[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoStao[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoStaoStr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTcpaHdr[];
@@ -529,6 +554,7 @@  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWddt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWdrt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWpbt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWpbt0[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoWsmt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoXenv[];
 
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoGeneric[][2];
@@ -641,6 +667,10 @@  AcpiDmDumpHest (
     ACPI_TABLE_HEADER       *Table);
 
 void
+AcpiDmDumpHmat (
+    ACPI_TABLE_HEADER       *Table);
+
+void
 AcpiDmDumpIort (
     ACPI_TABLE_HEADER       *Table);
 
@@ -684,6 +714,10 @@  void
 AcpiDmDumpPmtt (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpPptt (
+    ACPI_TABLE_HEADER       *Table);
+
 UINT32
 AcpiDmDumpRsdp (
     ACPI_TABLE_HEADER       *Table);
@@ -759,10 +793,6 @@  AcpiDmDisassembleOneOp (
     ACPI_OP_WALK_INFO       *Info,
     ACPI_PARSE_OBJECT       *Op);
 
-BOOLEAN
-AcpiDmIsTempName (
-    ACPI_PARSE_OBJECT       *Op);
-
 UINT32
 AcpiDmListType (
     ACPI_PARSE_OBJECT       *Op);
@@ -888,6 +918,12 @@  AcpiDmAddOpToExternalList (
     UINT16                  Flags);
 
 void
+AcpiDmCreateSubobjectForExternal (
+    UINT8                   Type,
+    ACPI_NAMESPACE_NODE     **Node,
+    UINT32                  Value);
+
+void
 AcpiDmAddNodeToExternalList (
     ACPI_NAMESPACE_NODE     *Node,
     UINT8                   Type,
@@ -895,11 +931,17 @@  AcpiDmAddNodeToExternalList (
     UINT16                  Flags);
 
 void
-AcpiDmAddExternalsToNamespace (
+AcpiDmAddExternalListToNamespace (
     void);
 
+void
+AcpiDmAddOneExternalToNamespace (
+    char                    *Path,
+    UINT8                   Type,
+    UINT32                  Value);
+
 UINT32
-AcpiDmGetExternalMethodCount (
+AcpiDmGetUnresolvedExternalMethodCount (
     void);
 
 void
@@ -923,6 +965,11 @@  void
 AcpiDmGetExternalsFromFile (
     void);
 
+void
+AcpiDmMarkExternalConflict (
+    ACPI_NAMESPACE_NODE     *Node);
+
+
 /*
  * dmresrc
  */
@@ -1048,6 +1095,41 @@  AcpiDmGpioDescriptor (
     UINT32                  Level);
 
 void
+AcpiDmPinFunctionDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level);
+
+void
+AcpiDmPinConfigDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level);
+
+void
+AcpiDmPinGroupDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level);
+
+void
+AcpiDmPinGroupFunctionDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level);
+
+void
+AcpiDmPinGroupConfigDescriptor (
+    ACPI_OP_WALK_INFO       *Info,
+    AML_RESOURCE            *Resource,
+    UINT32                  Length,
+    UINT32                  Level);
+
+void
 AcpiDmSerialBusDescriptor (
     ACPI_OP_WALK_INFO       *Info,
     AML_RESOURCE            *Resource,
@@ -1171,6 +1253,17 @@  AcpiDmCloseOperator (
 /*
  * dmtables
  */
+ACPI_STATUS
+AcpiDmProcessSwitch (
+    ACPI_PARSE_OBJECT       *Op);
+
+void
+AcpiDmClearTempList(
+    void);
+
+/*
+ * dmtables
+ */
 void
 AdDisassemblerHeader (
     char                    *Filename,
diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
index edb696a9..686dcd81 100644
--- a/src/acpica/source/include/acglobal.h
+++ b/src/acpica/source/include/acglobal.h
@@ -427,6 +427,7 @@  ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_ForceAmlDisassembly, FALSE);
 ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DmOpt_Verbose, TRUE);
 ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DmEmitExternalOpcodes, FALSE);
 ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DoDisassemblerOptimizations, TRUE);
+ACPI_INIT_GLOBAL (ACPI_PARSE_OBJECT_LIST,   *AcpiGbl_TempListHead, NULL);
 
 ACPI_GLOBAL (BOOLEAN,                   AcpiGbl_DmOpt_Disasm);
 ACPI_GLOBAL (BOOLEAN,                   AcpiGbl_DmOpt_Listing);
@@ -480,6 +481,8 @@  ACPI_GLOBAL (const char,                *AcpiGbl_PldVerticalPositionList[]);
 ACPI_GLOBAL (const char,                *AcpiGbl_PldHorizontalPositionList[]);
 ACPI_GLOBAL (const char,                *AcpiGbl_PldShapeList[]);
 
+ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DisasmFlag, FALSE);
+
 #endif
 
 /*
diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
index 92eb49a6..1d94a591 100644
--- a/src/acpica/source/include/aclocal.h
+++ b/src/acpica/source/include/aclocal.h
@@ -1136,7 +1136,7 @@  typedef struct acpi_parse_obj_common
 typedef struct acpi_parse_obj_named
 {
     ACPI_PARSE_COMMON
-    UINT8                           *Path;
+    char                            *Path;
     UINT8                           *Data;          /* AML body or bytelist data */
     UINT32                          Length;         /* AML length */
     UINT32                          Name;           /* 4-byte name or zero if no name */
@@ -1444,8 +1444,13 @@  typedef struct acpi_port_info
 #define ACPI_RESOURCE_NAME_ADDRESS64            0x8A
 #define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64   0x8B
 #define ACPI_RESOURCE_NAME_GPIO                 0x8C
+#define ACPI_RESOURCE_NAME_PIN_FUNCTION         0x8D
 #define ACPI_RESOURCE_NAME_SERIAL_BUS           0x8E
-#define ACPI_RESOURCE_NAME_LARGE_MAX            0x8E
+#define ACPI_RESOURCE_NAME_PIN_CONFIG           0x8F
+#define ACPI_RESOURCE_NAME_PIN_GROUP            0x90
+#define ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION   0x91
+#define ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG     0x92
+#define ACPI_RESOURCE_NAME_LARGE_MAX            0x92
 
 
 /*****************************************************************************
@@ -1482,6 +1487,7 @@  typedef struct acpi_external_list
 #define ACPI_EXT_INTERNAL_PATH_ALLOCATED    0x04    /* Deallocate internal path on completion */
 #define ACPI_EXT_EXTERNAL_EMITTED           0x08    /* External() statement has been emitted */
 #define ACPI_EXT_ORIGIN_FROM_OPCODE         0x10    /* External came from a External() opcode */
+#define ACPI_EXT_CONFLICTING_DECLARATION    0x20    /* External has a conflicting declaration within AML */
 
 
 typedef struct acpi_external_file
@@ -1492,6 +1498,13 @@  typedef struct acpi_external_file
 } ACPI_EXTERNAL_FILE;
 
 
+typedef struct acpi_parse_object_list
+{
+    ACPI_PARSE_OBJECT               *Op;
+    struct acpi_parse_object_list   *Next;
+
+} ACPI_PARSE_OBJECT_LIST;
+
 /*****************************************************************************
  *
  * Debugger
diff --git a/src/acpica/source/include/acopcode.h b/src/acpica/source/include/acopcode.h
index b0cc4b1e..3ce2772b 100644
--- a/src/acpica/source/include/acopcode.h
+++ b/src/acpica/source/include/acopcode.h
@@ -221,7 +221,7 @@ 
 #define ARGP_DWORD_OP                   ARGP_LIST1 (ARGP_DWORDDATA)
 #define ARGP_ELSE_OP                    ARGP_LIST2 (ARGP_PKGLENGTH,  ARGP_TERMLIST)
 #define ARGP_EVENT_OP                   ARGP_LIST1 (ARGP_NAME)
-#define ARGP_EXTERNAL_OP                ARGP_LIST3 (ARGP_NAMESTRING, ARGP_BYTEDATA,      ARGP_BYTEDATA)
+#define ARGP_EXTERNAL_OP                ARGP_LIST3 (ARGP_NAME,       ARGP_BYTEDATA,      ARGP_BYTEDATA)
 #define ARGP_FATAL_OP                   ARGP_LIST3 (ARGP_BYTEDATA,   ARGP_DWORDDATA,     ARGP_TERMARG)
 #define ARGP_FIELD_OP                   ARGP_LIST4 (ARGP_PKGLENGTH,  ARGP_NAMESTRING,    ARGP_BYTEDATA,  ARGP_FIELDLIST)
 #define ARGP_FIND_SET_LEFT_BIT_OP       ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 55a0bded..934e6683 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -154,7 +154,7 @@ 
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20170303
+#define ACPI_CA_VERSION                 0x20170531
 
 #include "acconfig.h"
 #include "actypes.h"
diff --git a/src/acpica/source/include/acpredef.h b/src/acpica/source/include/acpredef.h
index 5adc110d..95a18a47 100644
--- a/src/acpica/source/include/acpredef.h
+++ b/src/acpica/source/include/acpredef.h
@@ -682,6 +682,9 @@  const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
     {{"_HID",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING)}},
 
+    {{"_HMA",   METHOD_0ARGS,
+                METHOD_RETURNS (ACPI_RTYPE_BUFFER)}},
+
     {{"_HOT",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
 
@@ -726,6 +729,17 @@  const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
                     PACKAGE_INFO (ACPI_PTYPE2_VAR_VAR, ACPI_RTYPE_INTEGER, 3,
                     ACPI_RTYPE_INTEGER | ACPI_RTYPE_BUFFER | ACPI_RTYPE_STRING, 10,0),
 
+    {{"_LSI",   METHOD_0ARGS,
+                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}},
+                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 3,0,0,0),
+
+    {{"_LSR",   METHOD_2ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER),
+                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}},
+                    PACKAGE_INFO (ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 1, ACPI_RTYPE_BUFFER, 1,0),
+
+    {{"_LSW",   METHOD_3ARGS (ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_BUFFER),
+                METHOD_RETURNS (ACPI_RTYPE_INTEGER)}},
+
     {{"_MAT",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_BUFFER)}},
 
diff --git a/src/acpica/source/include/acresrc.h b/src/acpica/source/include/acresrc.h
index e6458e54..ca5aad02 100644
--- a/src/acpica/source/include/acresrc.h
+++ b/src/acpica/source/include/acresrc.h
@@ -264,7 +264,9 @@  typedef enum
     ACPI_RSD_UINT16,
     ACPI_RSD_UINT32,
     ACPI_RSD_UINT64,
-    ACPI_RSD_WORDLIST
+    ACPI_RSD_WORDLIST,
+    ACPI_RSD_LABEL,
+    ACPI_RSD_SOURCE_LABEL,
 
 } ACPI_RSDUMP_OPCODES;
 
@@ -496,6 +498,11 @@  extern ACPI_RSCONVERT_INFO      AcpiRsConvertFixedDma[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertI2cSerialBus[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertSpiSerialBus[];
 extern ACPI_RSCONVERT_INFO      AcpiRsConvertUartSerialBus[];
+extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinFunction[];
+extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinConfig[];
+extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinGroup[];
+extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinGroupFunction[];
+extern ACPI_RSCONVERT_INFO      AcpiRsConvertPinGroupConfig[];
 
 /* These resources require separate get/set tables */
 
@@ -540,12 +547,17 @@  extern ACPI_RSDUMP_INFO         AcpiRsDumpExtAddress64[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpExtIrq[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpGenericReg[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpGpio[];
+extern ACPI_RSDUMP_INFO         AcpiRsDumpPinFunction[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpFixedDma[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpCommonSerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpI2cSerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpSpiSerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpUartSerialBus[];
 extern ACPI_RSDUMP_INFO         AcpiRsDumpGeneralFlags[];
+extern ACPI_RSDUMP_INFO         AcpiRsDumpPinConfig[];
+extern ACPI_RSDUMP_INFO         AcpiRsDumpPinGroup[];
+extern ACPI_RSDUMP_INFO         AcpiRsDumpPinGroupFunction[];
+extern ACPI_RSDUMP_INFO         AcpiRsDumpPinGroupConfig[];
 #endif
 
 #endif  /* __ACRESRC_H__ */
diff --git a/src/acpica/source/include/acrestyp.h b/src/acpica/source/include/acrestyp.h
index 7df5a63f..0057722c 100644
--- a/src/acpica/source/include/acrestyp.h
+++ b/src/acpica/source/include/acrestyp.h
@@ -435,6 +435,13 @@  typedef union acpi_resource_attribute
 
 } ACPI_RESOURCE_ATTRIBUTE;
 
+typedef struct acpi_resource_label
+{
+    UINT16                          StringLength;
+    char                            *StringPtr;
+
+} ACPI_RESOURCE_LABEL;
+
 typedef struct acpi_resource_source
 {
     UINT8                           Index;
@@ -725,6 +732,90 @@  typedef struct acpi_resource_uart_serialbus
 #define ACPI_UART_CLEAR_TO_SEND                 (1<<6)
 #define ACPI_UART_REQUEST_TO_SEND               (1<<7)
 
+typedef struct acpi_resource_pin_function
+{
+    UINT8                           RevisionId;
+    UINT8                           PinConfig;
+    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
+    UINT16                          FunctionNumber;
+    UINT16                          PinTableLength;
+    UINT16                          VendorLength;
+    ACPI_RESOURCE_SOURCE            ResourceSource;
+    UINT16                          *PinTable;
+    UINT8                           *VendorData;
+
+} ACPI_RESOURCE_PIN_FUNCTION;
+
+typedef struct acpi_resource_pin_config
+{
+    UINT8                           RevisionId;
+    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
+    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
+    UINT8                           PinConfigType;
+    UINT32                          PinConfigValue;
+    UINT16                          PinTableLength;
+    UINT16                          VendorLength;
+    ACPI_RESOURCE_SOURCE            ResourceSource;
+    UINT16                          *PinTable;
+    UINT8                           *VendorData;
+
+} ACPI_RESOURCE_PIN_CONFIG;
+
+/* Values for PinConfigType field above */
+
+#define ACPI_PIN_CONFIG_DEFAULT                 0
+#define ACPI_PIN_CONFIG_BIAS_PULL_UP            1
+#define ACPI_PIN_CONFIG_BIAS_PULL_DOWN          2
+#define ACPI_PIN_CONFIG_BIAS_DEFAULT            3
+#define ACPI_PIN_CONFIG_BIAS_DISABLE            4
+#define ACPI_PIN_CONFIG_BIAS_HIGH_IMPEDANCE     5
+#define ACPI_PIN_CONFIG_BIAS_BUS_HOLD           6
+#define ACPI_PIN_CONFIG_DRIVE_OPEN_DRAIN        7
+#define ACPI_PIN_CONFIG_DRIVE_OPEN_SOURCE       8
+#define ACPI_PIN_CONFIG_DRIVE_PUSH_PULL         9
+#define ACPI_PIN_CONFIG_DRIVE_STRENGTH          10
+#define ACPI_PIN_CONFIG_SLEW_RATE               11
+#define ACPI_PIN_CONFIG_INPUT_DEBOUNCE          12
+#define ACPI_PIN_CONFIG_INPUT_SCHMITT_TRIGGER   13
+
+typedef struct acpi_resource_pin_group
+{
+    UINT8                           RevisionId;
+    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
+    UINT16                          PinTableLength;
+    UINT16                          VendorLength;
+    UINT16                          *PinTable;
+    ACPI_RESOURCE_LABEL             ResourceLabel;
+    UINT8                           *VendorData;
+
+} ACPI_RESOURCE_PIN_GROUP;
+
+typedef struct acpi_resource_pin_group_function
+{
+    UINT8                           RevisionId;
+    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
+    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
+    UINT16                          FunctionNumber;
+    UINT16                          VendorLength;
+    ACPI_RESOURCE_SOURCE            ResourceSource;
+    ACPI_RESOURCE_LABEL             ResourceSourceLabel;
+    UINT8                           *VendorData;
+
+} ACPI_RESOURCE_PIN_GROUP_FUNCTION;
+
+typedef struct acpi_resource_pin_group_config
+{
+    UINT8                           RevisionId;
+    UINT8                           ProducerConsumer;   /* For values, see Producer/Consumer above */
+    UINT8                           Sharable;           /* For values, see Interrupt Attributes above */
+    UINT8                           PinConfigType;      /* For values, see PinConfigType above */
+    UINT32                          PinConfigValue;
+    UINT16                          VendorLength;
+    ACPI_RESOURCE_SOURCE            ResourceSource;
+    ACPI_RESOURCE_LABEL             ResourceSourceLabel;
+    UINT8                           *VendorData;
+
+} ACPI_RESOURCE_PIN_GROUP_CONFIG;
 
 /* ACPI_RESOURCE_TYPEs */
 
@@ -748,7 +839,12 @@  typedef struct acpi_resource_uart_serialbus
 #define ACPI_RESOURCE_TYPE_GPIO                 17  /* ACPI 5.0 */
 #define ACPI_RESOURCE_TYPE_FIXED_DMA            18  /* ACPI 5.0 */
 #define ACPI_RESOURCE_TYPE_SERIAL_BUS           19  /* ACPI 5.0 */
-#define ACPI_RESOURCE_TYPE_MAX                  19
+#define ACPI_RESOURCE_TYPE_PIN_FUNCTION         20  /* ACPI 6.2 */
+#define ACPI_RESOURCE_TYPE_PIN_CONFIG           21  /* ACPI 6.2 */
+#define ACPI_RESOURCE_TYPE_PIN_GROUP            22  /* ACPI 6.2 */
+#define ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION   23  /* ACPI 6.2 */
+#define ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG     24  /* ACPI 6.2 */
+#define ACPI_RESOURCE_TYPE_MAX                  24
 
 /* Master union for resource descriptors */
 
@@ -777,6 +873,11 @@  typedef union acpi_resource_data
     ACPI_RESOURCE_SPI_SERIALBUS             SpiSerialBus;
     ACPI_RESOURCE_UART_SERIALBUS            UartSerialBus;
     ACPI_RESOURCE_COMMON_SERIALBUS          CommonSerialBus;
+    ACPI_RESOURCE_PIN_FUNCTION              PinFunction;
+    ACPI_RESOURCE_PIN_CONFIG                PinConfig;
+    ACPI_RESOURCE_PIN_GROUP                 PinGroup;
+    ACPI_RESOURCE_PIN_GROUP_FUNCTION        PinGroupFunction;
+    ACPI_RESOURCE_PIN_GROUP_CONFIG          PinGroupConfig;
 
     /* Common fields */
 
diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h
index b7119fa6..da6b561a 100644
--- a/src/acpica/source/include/actbl1.h
+++ b/src/acpica/source/include/actbl1.h
@@ -175,9 +175,11 @@ 
 #define ACPI_SIG_ECDT           "ECDT"      /* Embedded Controller Boot Resources Table */
 #define ACPI_SIG_EINJ           "EINJ"      /* Error Injection table */
 #define ACPI_SIG_ERST           "ERST"      /* Error Record Serialization Table */
+#define ACPI_SIG_HMAT           "HMAT"      /* Heterogeneous Memory Attributes Table */
 #define ACPI_SIG_HEST           "HEST"      /* Hardware Error Source Table */
 #define ACPI_SIG_MADT           "APIC"      /* Multiple APIC Description Table */
 #define ACPI_SIG_MSCT           "MSCT"      /* Maximum System Characteristics Table */
+#define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
 #define ACPI_SIG_SBST           "SBST"      /* Smart Battery Specification Table */
 #define ACPI_SIG_SLIT           "SLIT"      /* System Locality Distance Information Table */
 #define ACPI_SIG_SRAT           "SRAT"      /* System Resource Affinity Table */
@@ -600,7 +602,8 @@  enum AcpiHestTypes
     ACPI_HEST_TYPE_AER_BRIDGE           = 8,
     ACPI_HEST_TYPE_GENERIC_ERROR        = 9,
     ACPI_HEST_TYPE_GENERIC_ERROR_V2     = 10,
-    ACPI_HEST_TYPE_RESERVED             = 11    /* 11 and greater are reserved */
+    ACPI_HEST_TYPE_IA32_DEFERRED_CHECK  = 11,
+    ACPI_HEST_TYPE_RESERVED             = 12    /* 12 and greater are reserved */
 };
 
 
@@ -652,6 +655,7 @@  typedef struct acpi_hest_aer_common
 
 #define ACPI_HEST_FIRMWARE_FIRST        (1)
 #define ACPI_HEST_GLOBAL                (1<<1)
+#define ACPI_HEST_GHES_ASSIST           (1<<2)
 
 /*
  * Macros to access the bus/segment numbers in Bus field above:
@@ -682,18 +686,19 @@  typedef struct acpi_hest_notify
 
 enum AcpiHestNotifyTypes
 {
-    ACPI_HEST_NOTIFY_POLLED     = 0,
-    ACPI_HEST_NOTIFY_EXTERNAL   = 1,
-    ACPI_HEST_NOTIFY_LOCAL      = 2,
-    ACPI_HEST_NOTIFY_SCI        = 3,
-    ACPI_HEST_NOTIFY_NMI        = 4,
-    ACPI_HEST_NOTIFY_CMCI       = 5,    /* ACPI 5.0 */
-    ACPI_HEST_NOTIFY_MCE        = 6,    /* ACPI 5.0 */
-    ACPI_HEST_NOTIFY_GPIO       = 7,    /* ACPI 6.0 */
-    ACPI_HEST_NOTIFY_SEA        = 8,    /* ACPI 6.1 */
-    ACPI_HEST_NOTIFY_SEI        = 9,    /* ACPI 6.1 */
-    ACPI_HEST_NOTIFY_GSIV       = 10,   /* ACPI 6.1 */
-    ACPI_HEST_NOTIFY_RESERVED   = 11    /* 11 and greater are reserved */
+    ACPI_HEST_NOTIFY_POLLED             = 0,
+    ACPI_HEST_NOTIFY_EXTERNAL           = 1,
+    ACPI_HEST_NOTIFY_LOCAL              = 2,
+    ACPI_HEST_NOTIFY_SCI                = 3,
+    ACPI_HEST_NOTIFY_NMI                = 4,
+    ACPI_HEST_NOTIFY_CMCI               = 5,    /* ACPI 5.0 */
+    ACPI_HEST_NOTIFY_MCE                = 6,    /* ACPI 5.0 */
+    ACPI_HEST_NOTIFY_GPIO               = 7,    /* ACPI 6.0 */
+    ACPI_HEST_NOTIFY_SEA                = 8,    /* ACPI 6.1 */
+    ACPI_HEST_NOTIFY_SEI                = 9,    /* ACPI 6.1 */
+    ACPI_HEST_NOTIFY_GSIV               = 10,   /* ACPI 6.1 */
+    ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED = 11,   /* ACPI 6.2 */
+    ACPI_HEST_NOTIFY_RESERVED           = 12    /* 12 and greater are reserved */
 };
 
 /* Values for ConfigWriteEnable bitfield above */
@@ -716,7 +721,7 @@  typedef struct acpi_hest_ia_machine_check
 {
     ACPI_HEST_HEADER        Header;
     UINT16                  Reserved1;
-    UINT8                   Flags;
+    UINT8                   Flags;              /* See flags ACPI_HEST_GLOBAL, etc. above */
     UINT8                   Enabled;
     UINT32                  RecordsToPreallocate;
     UINT32                  MaxSectionsPerRecord;
@@ -734,7 +739,7 @@  typedef struct acpi_hest_ia_corrected
 {
     ACPI_HEST_HEADER        Header;
     UINT16                  Reserved1;
-    UINT8                   Flags;
+    UINT8                   Flags;              /* See flags ACPI_HEST_GLOBAL, etc. above */
     UINT8                   Enabled;
     UINT32                  RecordsToPreallocate;
     UINT32                  MaxSectionsPerRecord;
@@ -899,6 +904,155 @@  typedef struct acpi_hest_generic_data_v300
 #define ACPI_HEST_GEN_VALID_TIMESTAMP       (1<<2)
 
 
+/* 11: IA32 Deferred Machine Check Exception (ACPI 6.2) */
+
+typedef struct acpi_hest_ia_deferred_check
+{
+    ACPI_HEST_HEADER        Header;
+    UINT16                  Reserved1;
+    UINT8                   Flags;              /* See flags ACPI_HEST_GLOBAL, etc. above */
+    UINT8                   Enabled;
+    UINT32                  RecordsToPreallocate;
+    UINT32                  MaxSectionsPerRecord;
+    ACPI_HEST_NOTIFY        Notify;
+    UINT8                   NumHardwareBanks;
+    UINT8                   Reserved2[3];
+
+} ACPI_HEST_IA_DEFERRED_CHECK;
+
+
+/*******************************************************************************
+ *
+ * HMAT - Heterogeneous Memory Attributes Table (ACPI 6.2)
+ *        Version 1
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_hmat
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+    UINT32                  Reserved;
+
+} ACPI_TABLE_HMAT;
+
+
+/* Values for HMAT structure types */
+
+enum AcpiHmatType
+{
+    ACPI_HMAT_TYPE_ADDRESS_RANGE        = 0,   /* Memory subystem address range */
+    ACPI_HMAT_TYPE_LOCALITY             = 1,   /* System locality latency and bandwidth information */
+    ACPI_HMAT_TYPE_CACHE                = 2,   /* Memory side cache information */
+    ACPI_HMAT_TYPE_RESERVED             = 3    /* 3 and greater are reserved */
+};
+
+typedef struct acpi_hmat_structure
+{
+    UINT16                  Type;
+    UINT16                  Reserved;
+    UINT32                  Length;
+
+} ACPI_HMAT_STRUCTURE;
+
+
+/*
+ * HMAT Structures, correspond to Type in ACPI_HMAT_STRUCTURE
+ */
+
+/* 0: Memory subystem address range */
+
+typedef struct acpi_hmat_address_range
+{
+    ACPI_HMAT_STRUCTURE     Header;
+    UINT16                  Flags;
+    UINT16                  Reserved1;
+    UINT32                  ProcessorPD;            /* Processor proximity domain */
+    UINT32                  MemoryPD;               /* Memory proximity domain */
+    UINT32                  Reserved2;
+    UINT64                  PhysicalAddressBase;    /* Physical address range base */
+    UINT64                  PhysicalAddressLength;  /* Physical address range length */
+
+} ACPI_HMAT_ADDRESS_RANGE;
+
+/* Masks for Flags field above */
+
+#define ACPI_HMAT_PROCESSOR_PD_VALID    (1)     /* 1: ProcessorPD field is valid */
+#define ACPI_HMAT_MEMORY_PD_VALID       (1<<1)  /* 1: MemoryPD field is valid */
+#define ACPI_HMAT_RESERVATION_HINT      (1<<2)  /* 1: Reservation hint */
+
+
+/* 1: System locality latency and bandwidth information */
+
+typedef struct acpi_hmat_locality
+{
+    ACPI_HMAT_STRUCTURE     Header;
+    UINT8                   Flags;
+    UINT8                   DataType;
+    UINT16                  Reserved1;
+    UINT32                  NumberOfInitiatorPDs;
+    UINT32                  NumberOfTargetPDs;
+    UINT32                  Reserved2;
+    UINT64                  EntryBaseUnit;
+
+} ACPI_HMAT_LOCALITY;
+
+/* Masks for Flags field above */
+
+#define ACPI_HMAT_MEMORY_HIERARCHY  (0x0F)
+
+/* Values for Memory Hierarchy flag */
+
+#define ACPI_HMAT_MEMORY            0
+#define ACPI_HMAT_LAST_LEVEL_CACHE  1
+#define ACPI_HMAT_1ST_LEVEL_CACHE   2
+#define ACPI_HMAT_2ND_LEVEL_CACHE   3
+#define ACPI_HMAT_3RD_LEVEL_CACHE   4
+
+/* Values for DataType field above */
+
+#define ACPI_HMAT_ACCESS_LATENCY    0
+#define ACPI_HMAT_READ_LATENCY      1
+#define ACPI_HMAT_WRITE_LATENCY     2
+#define ACPI_HMAT_ACCESS_BANDWIDTH  3
+#define ACPI_HMAT_READ_BANDWIDTH    4
+#define ACPI_HMAT_WRITE_BANDWIDTH   5
+
+
+/* 2: Memory side cache information */
+
+typedef struct acpi_hmat_cache
+{
+    ACPI_HMAT_STRUCTURE     Header;
+    UINT32                  MemoryPD;
+    UINT32                  Reserved1;
+    UINT64                  CacheSize;
+    UINT32                  CacheAttributes;
+    UINT16                  Reserved2;
+    UINT16                  NumberOfSMBIOSHandles;
+
+} ACPI_HMAT_CACHE;
+
+/* Masks for CacheAttributes field above */
+
+#define ACPI_HMAT_TOTAL_CACHE_LEVEL     (0x0000000F)
+#define ACPI_HMAT_CACHE_LEVEL           (0x000000F0)
+#define ACPI_HMAT_CACHE_ASSOCIATIVITY   (0x00000F00)
+#define ACPI_HMAT_WRITE_POLICY          (0x0000F000)
+#define ACPI_HMAT_CACHE_LINE_SIZE       (0xFFFF0000)
+
+/* Values for cache associativity flag */
+
+#define ACPI_HMAT_CA_NONE                     (0)
+#define ACPI_HMAT_CA_DIRECT_MAPPED            (1)
+#define ACPI_HMAT_CA_COMPLEX_CACHE_INDEXING   (2)
+
+/* Values for write policy flag */
+
+#define ACPI_HMAT_CP_NONE   (0)
+#define ACPI_HMAT_CP_WB     (1)
+#define ACPI_HMAT_CP_WT     (2)
+
+
 /*******************************************************************************
  *
  * MADT - Multiple APIC Description Table
@@ -920,8 +1074,8 @@  typedef struct acpi_table_madt
 
 /* Values for PCATCompat flag */
 
-#define ACPI_MADT_DUAL_PIC          0
-#define ACPI_MADT_MULTIPLE_APIC     1
+#define ACPI_MADT_DUAL_PIC          1
+#define ACPI_MADT_MULTIPLE_APIC     0
 
 
 /* Values for MADT subtable type in ACPI_SUBTABLE_HEADER */
@@ -1448,6 +1602,95 @@  typedef struct acpi_nfit_flush_address
 
 /*******************************************************************************
  *
+ * PPTT - Processor Properties Topology Table (ACPI 6.2)
+ *        Version 1
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_pptt
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+
+} ACPI_TABLE_PPTT;
+
+/* Values for Type field above */
+
+enum AcpiPpttType
+{
+    ACPI_PPTT_TYPE_PROCESSOR            = 0,
+    ACPI_PPTT_TYPE_CACHE                = 1,
+    ACPI_PPTT_TYPE_ID                   = 2,
+    ACPI_PPTT_TYPE_RESERVED             = 3
+};
+
+
+/* 0: Processor Hierarchy Node Structure */
+
+typedef struct acpi_pptt_processor {
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT16                  Reserved;
+    UINT32                  Flags;
+    UINT32                  Parent;
+    UINT32                  AcpiProcessorId;
+    UINT32                  NumberOfPrivResources;
+
+} ACPI_PPTT_PROCESSOR;
+
+/* Flags */
+
+#define ACPI_PPTT_PHYSICAL_PACKAGE          (1)     /* Physical package */
+#define ACPI_PPTT_ACPI_PROCESSOR_ID_VALID   (2)     /* ACPI Processor ID valid */
+
+
+/* 1: Cache Type Structure */
+
+typedef struct acpi_pptt_cache {
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT16                  Reserved;
+    UINT32                  Flags;
+    UINT32                  NextLevelOfCache;
+    UINT32                  Size;
+    UINT32                  NumberOfSets;
+    UINT8                   Associativity;
+    UINT8                   Attributes;
+    UINT16                  LineSize;
+
+} ACPI_PPTT_CACHE;
+
+/* Flags */
+
+#define ACPI_PPTT_SIZE_PROPERTY_VALID       (1)     /* Physical property valid */
+#define ACPI_PPTT_NUMBER_OF_SETS_VALID      (1<<1)  /* Number of sets valid */
+#define ACPI_PPTT_ASSOCIATIVITY_VALID       (1<<2)  /* Associativity valid */
+#define ACPI_PPTT_ALLOCATION_TYPE_VALID     (1<<3)  /* Allocation type valid */
+#define ACPI_PPTT_CACHE_TYPE_VALID          (1<<4)  /* Cache type valid */
+#define ACPI_PPTT_WRITE_POLICY_VALID        (1<<5)  /* Write policy valid */
+#define ACPI_PPTT_LINE_SIZE_VALID           (1<<6)  /* Line size valid */
+
+/* Masks for Attributes */
+
+#define ACPI_PPTT_MASK_ALLOCATION_TYPE      (0x03)  /* Allocation type */
+#define ACPI_PPTT_MASK_CACHE_TYPE           (0x0C)  /* Cache type */
+#define ACPI_PPTT_MASK_WRITE_POLICY         (0x10)  /* Write policy */
+
+
+/* 2: ID Structure */
+
+typedef struct acpi_pptt_id {
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT16                  Reserved;
+    UINT32                  VendorId;
+    UINT64                  Level1Id;
+    UINT64                  Level2Id;
+    UINT16                  MajorRev;
+    UINT16                  MinorRev;
+    UINT16                  SpinRev;
+
+} ACPI_PPTT_ID;
+
+
+/*******************************************************************************
+ *
  * SBST - Smart Battery Specification Table
  *        Version 1
  *
@@ -1502,7 +1745,8 @@  enum AcpiSratType
     ACPI_SRAT_TYPE_MEMORY_AFFINITY      = 1,
     ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY  = 2,
     ACPI_SRAT_TYPE_GICC_AFFINITY        = 3,
-    ACPI_SRAT_TYPE_RESERVED             = 4     /* 4 and greater are reserved */
+    ACPI_SRAT_TYPE_GIC_ITS_AFFINITY     = 4,    /* ACPI 6.2 */
+    ACPI_SRAT_TYPE_RESERVED             = 5     /* 5 and greater are reserved */
 };
 
 /*
@@ -1586,6 +1830,18 @@  typedef struct acpi_srat_gicc_affinity
 #define ACPI_SRAT_GICC_ENABLED     (1)         /* 00: Use affinity structure */
 
 
+/* 4: GCC ITS Affinity (ACPI 6.2) */
+
+typedef struct acpi_srat_gic_its_affinity
+{
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT32                  ProximityDomain;
+    UINT16                  Reserved;
+    UINT32                  ItsId;
+
+} ACPI_SRAT_GIC_ITS_AFFINITY;
+
+
 /* Reset to default packing */
 
 #pragma pack()
diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h
index 4655b1b4..80495d8f 100644
--- a/src/acpica/source/include/actbl2.h
+++ b/src/acpica/source/include/actbl2.h
@@ -197,6 +197,7 @@ 
 #define ACPI_SIG_WDAT           "WDAT"      /* Watchdog Action Table */
 #define ACPI_SIG_WDDT           "WDDT"      /* Watchdog Timer Description Table */
 #define ACPI_SIG_WDRT           "WDRT"      /* Watchdog Resource Table */
+#define ACPI_SIG_WSMT           "WSMT"      /* Windows SMM Security Migrations Table */
 #define ACPI_SIG_XXXX           "XXXX"      /* Intermediate AML header for ASL/ASL+ converter */
 
 #ifdef ACPI_UNDEFINED_TABLES
@@ -1521,7 +1522,8 @@  enum AcpiSpmiInterfaceTypes
  *        Version 2
  *
  * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
- * December 19, 2014
+ * Version 1.2, Revision 8
+ * February 27, 2017
  *
  * NOTE: There are two versions of the table with the same signature --
  * the client version and the server version. The common PlatformClass
@@ -1592,7 +1594,8 @@  typedef struct acpi_table_tcpa_server
  *        Version 4
  *
  * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
- * December 19, 2014
+ * Version 1.2, Revision 8
+ * February 27, 2017
  *
  ******************************************************************************/
 
@@ -1615,6 +1618,42 @@  typedef struct acpi_table_tpm2
 #define ACPI_TPM2_MEMORY_MAPPED                     6
 #define ACPI_TPM2_COMMAND_BUFFER                    7
 #define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD  8
+#define ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC       11  /* V1.2 Rev 8 */
+
+
+/* Trailer appears after any StartMethod subtables */
+
+typedef struct acpi_tpm2_trailer
+{
+    UINT32                  MinimumLogLength;   /* Minimum length for the event log area */
+    UINT64                  LogAddress;         /* Address of the event log area */
+
+} ACPI_TPM2_TRAILER;
+
+
+/*
+ * Subtables (StartMethod-specific)
+ */
+
+/* 11: Start Method for ARM SMC (V1.2 Rev 8) */
+
+typedef struct acpi_tpm2_arm_smc
+{
+    UINT32                  GlobalInterrupt;
+    UINT8                   InterruptFlags;
+    UINT8                   OperationFlags;
+    UINT16                  Reserved;
+    UINT32                  FunctionId;
+
+} ACPI_TPM2_ARM_SMC;
+
+/* Values for InterruptFlags above */
+
+#define ACPI_TPM2_INTERRUPT_SUPPORT     (1)
+
+/* Values for OperationFlags above */
+
+#define ACPI_TPM2_IDLE_SUPPORT          (1)
 
 
 /*******************************************************************************
@@ -1834,6 +1873,30 @@  typedef struct acpi_table_wdrt
 } ACPI_TABLE_WDRT;
 
 
+/*******************************************************************************
+ *
+ * WSMT - Windows SMM Security Migrations Table
+ *        Version 1
+ *
+ * Conforms to "Windows SMM Security Migrations Table",
+ * Version 1.0, April 18, 2016
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_wsmt
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+    UINT32                  ProtectionFlags;
+
+} ACPI_TABLE_WSMT;
+
+/* Flags for ProtectionFlags field above */
+
+#define ACPI_WSMT_FIXED_COMM_BUFFERS                (1)
+#define ACPI_WSMT_COMM_BUFFER_NESTED_PTR_PROTECTION (2)
+#define ACPI_WSMT_SYSTEM_RESOURCE_PROTECTION        (4)
+
+
 /* Reset to default packing */
 
 #pragma pack()
diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h
index cb9910d7..80b6ae1c 100644
--- a/src/acpica/source/include/actbl3.h
+++ b/src/acpica/source/include/actbl3.h
@@ -229,6 +229,11 @@  typedef struct acpi_table_bgrt
 
 } ACPI_TABLE_BGRT;
 
+/* Flags for Status field above */
+
+#define ACPI_BGRT_DISPLAYED                 (1)
+#define ACPI_BGRT_ORIENTATION_OFFSET        (3 << 1)
+
 
 /*******************************************************************************
  *
@@ -651,7 +656,7 @@  typedef struct acpi_mpst_shared
 /*******************************************************************************
  *
  * PCCT - Platform Communications Channel Table (ACPI 5.0)
- *        Version 1
+ *        Version 2 (ACPI 6.2)
  *
  ******************************************************************************/
 
@@ -674,7 +679,9 @@  enum AcpiPcctType
     ACPI_PCCT_TYPE_GENERIC_SUBSPACE             = 0,
     ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE          = 1,
     ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2    = 2,    /* ACPI 6.1 */
-    ACPI_PCCT_TYPE_RESERVED                     = 3     /* 3 and greater are reserved */
+    ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE      = 3,    /* ACPI 6.2 */
+    ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE       = 4,    /* ACPI 6.2 */
+    ACPI_PCCT_TYPE_RESERVED                     = 5     /* 5 and greater are reserved */
 };
 
 /*
@@ -704,7 +711,7 @@  typedef struct acpi_pcct_subspace
 typedef struct acpi_pcct_hw_reduced
 {
     ACPI_SUBTABLE_HEADER    Header;
-    UINT32                  DoorbellInterrupt;
+    UINT32                  PlatformInterrupt;
     UINT8                   Flags;
     UINT8                   Reserved;
     UINT64                  BaseAddress;
@@ -724,7 +731,7 @@  typedef struct acpi_pcct_hw_reduced
 typedef struct acpi_pcct_hw_reduced_type2
 {
     ACPI_SUBTABLE_HEADER    Header;
-    UINT32                  DoorbellInterrupt;
+    UINT32                  PlatformInterrupt;
     UINT8                   Flags;
     UINT8                   Reserved;
     UINT64                  BaseAddress;
@@ -735,13 +742,75 @@  typedef struct acpi_pcct_hw_reduced_type2
     UINT32                  Latency;
     UINT32                  MaxAccessRate;
     UINT16                  MinTurnaroundTime;
-    ACPI_GENERIC_ADDRESS    DoorbellAckRegister;
+    ACPI_GENERIC_ADDRESS    PlatformAckRegister;
     UINT64                  AckPreserveMask;
     UINT64                  AckWriteMask;
 
 } ACPI_PCCT_HW_REDUCED_TYPE2;
 
 
+/* 3: Extended PCC Master Subspace Type 3 (ACPI 6.2) */
+
+typedef struct acpi_pcct_ext_pcc_master
+{
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT32                  PlatformInterrupt;
+    UINT8                   Flags;
+    UINT8                   Reserved1;
+    UINT64                  BaseAddress;
+    UINT32                  Length;
+    ACPI_GENERIC_ADDRESS    DoorbellRegister;
+    UINT64                  PreserveMask;
+    UINT64                  WriteMask;
+    UINT32                  Latency;
+    UINT32                  MaxAccessRate;
+    UINT32                  MinTurnaroundTime;
+    ACPI_GENERIC_ADDRESS    PlatformAckRegister;
+    UINT64                  AckPreserveMask;
+    UINT64                  AckSetMask;
+    UINT64                  Reserved2;
+    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
+    UINT64                  CmdCompleteMask;
+    ACPI_GENERIC_ADDRESS    CmdUpdateRegister;
+    UINT64                  CmdUpdatePreserveMask;
+    UINT64                  CmdUpdateSetMask;
+    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
+    UINT64                  ErrorStatusMask;
+
+} ACPI_PCCT_EXT_PCC_MASTER;
+
+
+/* 4: Extended PCC Slave Subspace Type 4 (ACPI 6.2) */
+
+typedef struct acpi_pcct_ext_pcc_slave
+{
+    ACPI_SUBTABLE_HEADER    Header;
+    UINT32                  PlatformInterrupt;
+    UINT8                   Flags;
+    UINT8                   Reserved1;
+    UINT64                  BaseAddress;
+    UINT32                  Length;
+    ACPI_GENERIC_ADDRESS    DoorbellRegister;
+    UINT64                  PreserveMask;
+    UINT64                  WriteMask;
+    UINT32                  Latency;
+    UINT32                  MaxAccessRate;
+    UINT32                  MinTurnaroundTime;
+    ACPI_GENERIC_ADDRESS    PlatformAckRegister;
+    UINT64                  AckPreserveMask;
+    UINT64                  AckSetMask;
+    UINT64                  Reserved2;
+    ACPI_GENERIC_ADDRESS    CmdCompleteRegister;
+    UINT64                  CmdCompleteMask;
+    ACPI_GENERIC_ADDRESS    CmdUpdateRegister;
+    UINT64                  CmdUpdatePreserveMask;
+    UINT64                  CmdUpdateSetMask;
+    ACPI_GENERIC_ADDRESS    ErrorStatusRegister;
+    UINT64                  ErrorStatusMask;
+
+} ACPI_PCCT_EXT_PCC_SLAVE;
+
+
 /* Values for doorbell flags above */
 
 #define ACPI_PCCT_INTERRUPT_POLARITY    (1)
@@ -763,6 +832,18 @@  typedef struct acpi_pcct_shared_memory
 } ACPI_PCCT_SHARED_MEMORY;
 
 
+/* Extended PCC Subspace Shared Memory Region (ACPI 6.2) */
+
+typedef struct acpi_pcct_ext_pcc_shared_memory
+{
+    UINT32                  Signature;
+    UINT32                  Flags;
+    UINT32                  Length;
+    UINT32                  Command;
+
+} ACPI_PCCT_EXT_PCC_SHARED_MEMORY;
+
+
 /*******************************************************************************
  *
  * PMTT - Platform Memory Topology Table (ACPI 5.0)
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index 787ceeea..843adec7 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -155,9 +155,9 @@ 
 /* acpisrc:StructDefs -- for acpisrc conversion */
 
 /*
- * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent header
- * and must be either 32 or 64. 16-bit ACPICA is no longer supported, as of
- * 12/2006.
+ * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent
+ * header and must be either 32 or 64. 16-bit ACPICA is no longer
+ * supported, as of 12/2006.
  */
 #ifndef ACPI_MACHINE_WIDTH
 #error ACPI_MACHINE_WIDTH not defined
@@ -196,9 +196,9 @@ 
  * INT64        64-bit (8 byte) signed value
  *
  * COMPILER_DEPENDENT_UINT64/INT64 - These types are defined in the
- * compiler-dependent header(s) and were introduced because there is no common
- * 64-bit integer type across the various compilation models, as shown in
- * the table below.
+ * compiler-dependent header(s) and were introduced because there is no
+ * common 64-bit integer type across the various compilation models, as
+ * shown in the table below.
  *
  * Datatype  LP64 ILP64 LLP64 ILP32 LP32 16bit
  * char      8    8     8     8     8    8
@@ -215,10 +215,10 @@ 
  * 2) These types represent the native word size of the target mode of the
  * processor, and may be 16-bit, 32-bit, or 64-bit as required. They are
  * usually used for memory allocation, efficient loop counters, and array
- * indexes. The types are similar to the size_t type in the C library and are
- * required because there is no C type that consistently represents the native
- * data width. ACPI_SIZE is needed because there is no guarantee that a
- * kernel-level C library is present.
+ * indexes. The types are similar to the size_t type in the C library and
+ * are required because there is no C type that consistently represents the
+ * native data width. ACPI_SIZE is needed because there is no guarantee
+ * that a kernel-level C library is present.
  *
  * ACPI_SIZE        16/32/64-bit unsigned value
  * ACPI_NATIVE_INT  16/32/64-bit signed value
@@ -279,9 +279,10 @@  typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
 
 /*
  * In the case of the Itanium Processor Family (IPF), the hardware does not
- * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED flag
- * to indicate that special precautions must be taken to avoid alignment faults.
- * (IA64 or ia64 is currently used by existing compilers to indicate IPF.)
+ * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED
+ * flag to indicate that special precautions must be taken to avoid alignment
+ * faults. (IA64 or ia64 is currently used by existing compilers to indicate
+ * IPF.)
  *
  * Note: EM64T and other X86-64 processors support misaligned transfers,
  * so there is no need to define this flag.
@@ -422,8 +423,8 @@  typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
 #endif
 
 /*
- * Some compilers complain about unused variables. Sometimes we don't want to
- * use all the variables (for example, _AcpiModuleName). This allows us
+ * Some compilers complain about unused variables. Sometimes we don't want
+ * to use all the variables (for example, _AcpiModuleName). This allows us
  * to tell the compiler in a per-variable manner that a variable
  * is unused
  */
@@ -432,8 +433,9 @@  typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
 #endif
 
 /*
- * All ACPICA external functions that are available to the rest of the kernel
- * are tagged with thes macros which can be defined as appropriate for the host.
+ * All ACPICA external functions that are available to the rest of the
+ * kernel are tagged with these macros which can be defined as appropriate
+ * for the host.
  *
  * Notes:
  * ACPI_EXPORT_SYMBOL_INIT is used for initialization and termination
@@ -498,7 +500,8 @@  typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
 
 /******************************************************************************
  *
- * ACPI Specification constants (Do not change unless the specification changes)
+ * ACPI Specification constants (Do not change unless the specification
+ * changes)
  *
  *****************************************************************************/
 
@@ -604,10 +607,10 @@  typedef UINT8                           ACPI_OWNER_ID;
 #define ACPI_DO_NOT_WAIT                0
 
 /*
- * Obsolete: Acpi integer width. In ACPI version 1 (1996), integers are 32 bits.
- * In ACPI version 2 (2000) and later, integers are 64 bits. Note that this
- * pertains to the ACPI integer type only, not to other integers used in the
- * implementation of the ACPICA subsystem.
+ * Obsolete: Acpi integer width. In ACPI version 1 (1996), integers are
+ * 32 bits. In ACPI version 2 (2000) and later, integers are max 64 bits.
+ * Note that this pertains to the ACPI integer type only, not to other
+ * integers used in the implementation of the ACPICA subsystem.
  *
  * 01/2010: This type is obsolete and has been removed from the entire ACPICA
  * code base. It remains here for compatibility with device drivers that use
@@ -749,8 +752,9 @@  typedef UINT64                          ACPI_INTEGER;
 #define ACPI_NOTIFY_LOCALITY_UPDATE     (UINT8) 0x0B
 #define ACPI_NOTIFY_SHUTDOWN_REQUEST    (UINT8) 0x0C
 #define ACPI_NOTIFY_AFFINITY_UPDATE     (UINT8) 0x0D
+#define ACPI_NOTIFY_MEMORY_UPDATE       (UINT8) 0x0E
 
-#define ACPI_GENERIC_NOTIFY_MAX         0x0D
+#define ACPI_GENERIC_NOTIFY_MAX         0x0E
 #define ACPI_SPECIFIC_NOTIFY_MAX        0x84
 
 /*
@@ -787,10 +791,11 @@  typedef UINT32                          ACPI_OBJECT_TYPE;
 
 /*
  * These are object types that do not map directly to the ACPI
- * ObjectType() operator. They are used for various internal purposes only.
- * If new predefined ACPI_TYPEs are added (via the ACPI specification), these
- * internal types must move upwards. (There is code that depends on these
- * values being contiguous with the external types above.)
+ * ObjectType() operator. They are used for various internal purposes
+ * only. If new predefined ACPI_TYPEs are added (via the ACPI
+ * specification), these internal types must move upwards. (There
+ * is code that depends on these values being contiguous with the
+ * external types above.)
  */
 #define ACPI_TYPE_LOCAL_REGION_FIELD    0x11
 #define ACPI_TYPE_LOCAL_BANK_FIELD      0x12
@@ -891,7 +896,7 @@  typedef UINT32                          ACPI_EVENT_STATUS;
  *   |  | | |  +-- Type of dispatch:to method, handler, notify, or none
  *   |  | | +----- Interrupt type: edge or level triggered
  *   |  | +------- Is a Wake GPE
- *   |  +--------- Is GPE masked by the software GPE masking machanism
+ *   |  +--------- Is GPE masked by the software GPE masking mechanism
  *   +------------ <Reserved>
  */
 #define ACPI_GPE_DISPATCH_NONE          (UINT8) 0x00
@@ -1037,8 +1042,8 @@  typedef struct acpi_sleep_functions
  */
 
 /*
- * Note: Type == ACPI_TYPE_ANY (0) is used to indicate a NULL package element
- * or an unresolved named reference.
+ * Note: Type == ACPI_TYPE_ANY (0) is used to indicate a NULL package
+ * element or an unresolved named reference.
  */
 typedef union acpi_object
 {
@@ -1361,7 +1366,7 @@  typedef struct acpi_pnp_device_id_list
 
 /*
  * Structure returned from AcpiGetObjectInfo.
- * Optimized for both 32- and 64-bit builds
+ * Optimized for both 32-bit and 64-bit builds.
  */
 typedef struct acpi_device_info
 {
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index 30ce8257..46588a40 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -194,6 +194,7 @@  extern const char                       *AcpiGbl_BpbDecode[];
 extern const char                       *AcpiGbl_SbDecode[];
 extern const char                       *AcpiGbl_FcDecode[];
 extern const char                       *AcpiGbl_PtDecode[];
+extern const char                       *AcpiGbl_PtypDecode[];
 #endif
 
 /*
diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h
index 407fcb67..ff0f0126 100644
--- a/src/acpica/source/include/acuuid.h
+++ b/src/acpica/source/include/acuuid.h
@@ -186,6 +186,11 @@ 
 #define UUID_PERSISTENT_VIRTUAL_DISK    "5cea02c9-4d07-69d3-269f-4496fbe096f9"
 #define UUID_PERSISTENT_VIRTUAL_CD      "08018188-42cd-bb48-100f-5387d53ded3d"
 
+/* Processor Properties (ACPI 6.2) */
+
+#define UUID_CACHE_PROPERTIES           "6DC63E77-257E-4E78-A973-A21F2796898D"
+#define UUID_PHYSICAL_PROPERTY          "DDE4D59A-AA42-4349-B407-EA40F57D9FB7"
+
 /* Miscellaneous */
 
 #define UUID_PLATFORM_CAPABILITIES      "0811b06e-4a27-44f9-8d60-3cbbc22e7b48"
diff --git a/src/acpica/source/include/amlcode.h b/src/acpica/source/include/amlcode.h
index 4576c7d9..9236eedb 100644
--- a/src/acpica/source/include/amlcode.h
+++ b/src/acpica/source/include/amlcode.h
@@ -427,6 +427,11 @@ 
  *      #A is the number of required arguments
  *      #T is the number of target operands
  *      #R indicates whether there is a return value
+ *
+ * These types are used for the top-level dispatch of the AML
+ * opcode. They group similar operators that can share common
+ * front-end code before dispatch to the final code that implements
+ * the operator.
  */
 
 /*
@@ -468,42 +473,42 @@ 
  * The opcode Type is used in a dispatch table, do not change
  * or add anything new without updating the table.
  */
-#define AML_TYPE_EXEC_0A_0T_1R      0x00
-#define AML_TYPE_EXEC_1A_0T_0R      0x01 /* Monadic1  */
-#define AML_TYPE_EXEC_1A_0T_1R      0x02 /* Monadic2  */
-#define AML_TYPE_EXEC_1A_1T_0R      0x03
-#define AML_TYPE_EXEC_1A_1T_1R      0x04 /* Monadic2R */
-#define AML_TYPE_EXEC_2A_0T_0R      0x05 /* Dyadic1   */
-#define AML_TYPE_EXEC_2A_0T_1R      0x06 /* Dyadic2   */
-#define AML_TYPE_EXEC_2A_1T_1R      0x07 /* Dyadic2R  */
-#define AML_TYPE_EXEC_2A_2T_1R      0x08
-#define AML_TYPE_EXEC_3A_0T_0R      0x09
-#define AML_TYPE_EXEC_3A_1T_1R      0x0A
-#define AML_TYPE_EXEC_6A_0T_1R      0x0B
+#define AML_TYPE_EXEC_0A_0T_1R      0x00 /* 0 Args, 0 Target, 1 RetVal */
+#define AML_TYPE_EXEC_1A_0T_0R      0x01 /* 1 Args, 0 Target, 0 RetVal */
+#define AML_TYPE_EXEC_1A_0T_1R      0x02 /* 1 Args, 0 Target, 1 RetVal */
+#define AML_TYPE_EXEC_1A_1T_0R      0x03 /* 1 Args, 1 Target, 0 RetVal */
+#define AML_TYPE_EXEC_1A_1T_1R      0x04 /* 1 Args, 1 Target, 1 RetVal */
+#define AML_TYPE_EXEC_2A_0T_0R      0x05 /* 2 Args, 0 Target, 0 RetVal */
+#define AML_TYPE_EXEC_2A_0T_1R      0x06 /* 2 Args, 0 Target, 1 RetVal */
+#define AML_TYPE_EXEC_2A_1T_1R      0x07 /* 2 Args, 1 Target, 1 RetVal */
+#define AML_TYPE_EXEC_2A_2T_1R      0x08 /* 2 Args, 2 Target, 1 RetVal */
+#define AML_TYPE_EXEC_3A_0T_0R      0x09 /* 3 Args, 0 Target, 0 RetVal */
+#define AML_TYPE_EXEC_3A_1T_1R      0x0A /* 3 Args, 1 Target, 1 RetVal */
+#define AML_TYPE_EXEC_6A_0T_1R      0x0B /* 6 Args, 0 Target, 1 RetVal */
 /* End of types used in dispatch table */
 
-#define AML_TYPE_LITERAL            0x0B
-#define AML_TYPE_CONSTANT           0x0C
-#define AML_TYPE_METHOD_ARGUMENT    0x0D
-#define AML_TYPE_LOCAL_VARIABLE     0x0E
-#define AML_TYPE_DATA_TERM          0x0F
+#define AML_TYPE_LITERAL            0x0C
+#define AML_TYPE_CONSTANT           0x0D
+#define AML_TYPE_METHOD_ARGUMENT    0x0E
+#define AML_TYPE_LOCAL_VARIABLE     0x0F
+#define AML_TYPE_DATA_TERM          0x10
 
 /* Generic for an op that returns a value */
 
-#define AML_TYPE_METHOD_CALL        0x10
+#define AML_TYPE_METHOD_CALL        0x11
 
 /* Miscellaneous types */
 
-#define AML_TYPE_CREATE_FIELD       0x11
-#define AML_TYPE_CREATE_OBJECT      0x12
-#define AML_TYPE_CONTROL            0x13
-#define AML_TYPE_NAMED_NO_OBJ       0x14
-#define AML_TYPE_NAMED_FIELD        0x15
-#define AML_TYPE_NAMED_SIMPLE       0x16
-#define AML_TYPE_NAMED_COMPLEX      0x17
-#define AML_TYPE_RETURN             0x18
-#define AML_TYPE_UNDEFINED          0x19
-#define AML_TYPE_BOGUS              0x1A
+#define AML_TYPE_CREATE_FIELD       0x12
+#define AML_TYPE_CREATE_OBJECT      0x13
+#define AML_TYPE_CONTROL            0x14
+#define AML_TYPE_NAMED_NO_OBJ       0x15
+#define AML_TYPE_NAMED_FIELD        0x16
+#define AML_TYPE_NAMED_SIMPLE       0x17
+#define AML_TYPE_NAMED_COMPLEX      0x18
+#define AML_TYPE_RETURN             0x19
+#define AML_TYPE_UNDEFINED          0x1A
+#define AML_TYPE_BOGUS              0x1B
 
 /* AML Package Length encodings */
 
diff --git a/src/acpica/source/include/amlresrc.h b/src/acpica/source/include/amlresrc.h
index aee0a052..5f0bcc4b 100644
--- a/src/acpica/source/include/amlresrc.h
+++ b/src/acpica/source/include/amlresrc.h
@@ -174,6 +174,7 @@ 
 #define ACPI_RESTAG_DRIVESTRENGTH               "_DRS"
 #define ACPI_RESTAG_ENDIANNESS                  "_END"
 #define ACPI_RESTAG_FLOWCONTROL                 "_FLC"
+#define ACPI_RESTAG_FUNCTION                    "_FUN"
 #define ACPI_RESTAG_GRANULARITY                 "_GRA"
 #define ACPI_RESTAG_INTERRUPT                   "_INT"
 #define ACPI_RESTAG_INTERRUPTLEVEL              "_LL_"  /* ActiveLo(1), ActiveHi(0) */
@@ -193,6 +194,8 @@ 
 #define ACPI_RESTAG_PHASE                       "_PHA"
 #define ACPI_RESTAG_PIN                         "_PIN"
 #define ACPI_RESTAG_PINCONFIG                   "_PPI"
+#define ACPI_RESTAG_PINCONFIG_TYPE              "_TYP"
+#define ACPI_RESTAG_PINCONFIG_VALUE             "_VAL"
 #define ACPI_RESTAG_POLARITY                    "_POL"
 #define ACPI_RESTAG_REGISTERBITOFFSET           "_RBO"
 #define ACPI_RESTAG_REGISTERBITWIDTH            "_RBW"
@@ -636,6 +639,116 @@  typedef struct aml_resource_uart_serialbus
 #define AML_RESOURCE_UART_TYPE_REVISION         1       /* ACPI 5.0 */
 #define AML_RESOURCE_UART_MIN_DATA_LEN          10
 
+typedef struct aml_resource_pin_function
+{
+    AML_RESOURCE_LARGE_HEADER_COMMON
+    UINT8                           RevisionId;
+    UINT16                          Flags;
+    UINT8                           PinConfig;
+    UINT16                          FunctionNumber;
+    UINT16                          PinTableOffset;
+    UINT8                           ResSourceIndex;
+    UINT16                          ResSourceOffset;
+    UINT16                          VendorOffset;
+    UINT16                          VendorLength;
+    /*
+     * Optional fields follow immediately:
+     * 1) PIN list (Words)
+     * 2) Resource Source String
+     * 3) Vendor Data bytes
+     */
+
+} AML_RESOURCE_PIN_FUNCTION;
+
+#define AML_RESOURCE_PIN_FUNCTION_REVISION      1       /* ACPI 6.2 */
+
+typedef struct aml_resource_pin_config
+{
+    AML_RESOURCE_LARGE_HEADER_COMMON
+    UINT8                           RevisionId;
+    UINT16                          Flags;
+    UINT8                           PinConfigType;
+    UINT32                          PinConfigValue;
+    UINT16                          PinTableOffset;
+    UINT8                           ResSourceIndex;
+    UINT16                          ResSourceOffset;
+    UINT16                          VendorOffset;
+    UINT16                          VendorLength;
+    /*
+     * Optional fields follow immediately:
+     * 1) PIN list (Words)
+     * 2) Resource Source String
+     * 3) Vendor Data bytes
+     */
+
+} AML_RESOURCE_PIN_CONFIG;
+
+#define AML_RESOURCE_PIN_CONFIG_REVISION      1       /* ACPI 6.2 */
+
+typedef struct aml_resource_pin_group
+{
+    AML_RESOURCE_LARGE_HEADER_COMMON
+    UINT8                           RevisionId;
+    UINT16                          Flags;
+    UINT16                          PinTableOffset;
+    UINT16                          LabelOffset;
+    UINT16                          VendorOffset;
+    UINT16                          VendorLength;
+    /*
+     * Optional fields follow immediately:
+     * 1) PIN list (Words)
+     * 2) Resource Label String
+     * 3) Vendor Data bytes
+     */
+
+} AML_RESOURCE_PIN_GROUP;
+
+#define AML_RESOURCE_PIN_GROUP_REVISION      1       /* ACPI 6.2 */
+
+typedef struct aml_resource_pin_group_function
+{
+    AML_RESOURCE_LARGE_HEADER_COMMON
+    UINT8                           RevisionId;
+    UINT16                          Flags;
+    UINT16                          FunctionNumber;
+    UINT8                           ResSourceIndex;
+    UINT16                          ResSourceOffset;
+    UINT16                          ResSourceLabelOffset;
+    UINT16                          VendorOffset;
+    UINT16                          VendorLength;
+    /*
+     * Optional fields follow immediately:
+     * 1) Resource Source String
+     * 2) Resource Source Label String
+     * 3) Vendor Data bytes
+     */
+
+} AML_RESOURCE_PIN_GROUP_FUNCTION;
+
+#define AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION    1       /* ACPI 6.2 */
+
+typedef struct aml_resource_pin_group_config
+{
+    AML_RESOURCE_LARGE_HEADER_COMMON
+    UINT8                           RevisionId;
+    UINT16                          Flags;
+    UINT8                           PinConfigType;
+    UINT32                          PinConfigValue;
+    UINT8                           ResSourceIndex;
+    UINT16                          ResSourceOffset;
+    UINT16                          ResSourceLabelOffset;
+    UINT16                          VendorOffset;
+    UINT16                          VendorLength;
+    /*
+     * Optional fields follow immediately:
+     * 1) Resource Source String
+     * 2) Resource Source Label String
+     * 3) Vendor Data bytes
+     */
+
+} AML_RESOURCE_PIN_GROUP_CONFIG;
+
+#define AML_RESOURCE_PIN_GROUP_CONFIG_REVISION    1       /* ACPI 6.2 */
 
 /* restore default alignment */
 
@@ -680,6 +793,11 @@  typedef union aml_resource
     AML_RESOURCE_SPI_SERIALBUS              SpiSerialBus;
     AML_RESOURCE_UART_SERIALBUS             UartSerialBus;
     AML_RESOURCE_COMMON_SERIALBUS           CommonSerialBus;
+    AML_RESOURCE_PIN_FUNCTION               PinFunction;
+    AML_RESOURCE_PIN_CONFIG                 PinConfig;
+    AML_RESOURCE_PIN_GROUP                  PinGroup;
+    AML_RESOURCE_PIN_GROUP_FUNCTION         PinGroupFunction;
+    AML_RESOURCE_PIN_GROUP_CONFIG           PinGroupConfig;
 
     /* Utility overlays */
 
diff --git a/src/acpica/source/include/platform/acgcc.h b/src/acpica/source/include/platform/acgcc.h
index d831cbf7..da719a7d 100644
--- a/src/acpica/source/include/platform/acgcc.h
+++ b/src/acpica/source/include/platform/acgcc.h
@@ -156,7 +156,17 @@ 
  * Use compiler specific <stdarg.h> is a good practice for even when
  * -nostdinc is specified (i.e., ACPI_USE_STANDARD_HEADERS undefined.
  */
+#ifndef va_arg
+#ifdef ACPI_USE_BUILTIN_STDARG
+typedef __builtin_va_list       va_list;
+#define va_start(v, l)          __builtin_va_start(v, l)
+#define va_end(v)               __builtin_va_end(v)
+#define va_arg(v, l)            __builtin_va_arg(v, l)
+#define va_copy(d, s)           __builtin_va_copy(d, s)
+#else
 #include <stdarg.h>
+#endif
+#endif
 
 #define ACPI_INLINE             __inline__
 
diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
index 53427ffb..73e45e87 100644
--- a/src/acpica/source/os_specific/service_layers/osunixxf.c
+++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
@@ -984,9 +984,9 @@  AcpiOsWaitSemaphore (
 {
     ACPI_STATUS         Status = AE_OK;
     sem_t               *Sem = (sem_t *) Handle;
+    int                 RetVal;
 #ifndef ACPI_USE_ALTERNATE_TIMEOUT
     struct timespec     Time;
-    int                 RetVal;
 #endif
 
 
@@ -1016,12 +1016,17 @@  AcpiOsWaitSemaphore (
 
     case ACPI_WAIT_FOREVER:
 
-        if (sem_wait (Sem))
+        while (((RetVal = sem_wait (Sem)) == -1) && (errno == EINTR))
+        {
+            continue;   /* Restart if interrupted */
+        }
+        if (RetVal != 0)
         {
             Status = (AE_TIME);
         }
         break;
 
+
     /* Wait with MsecTimeout */
 
     default:
@@ -1075,7 +1080,8 @@  AcpiOsWaitSemaphore (
 
         while (((RetVal = sem_timedwait (Sem, &Time)) == -1) && (errno == EINTR))
         {
-            continue;
+            continue;   /* Restart if interrupted */
+
         }
 
         if (RetVal != 0)
diff --git a/src/acpica/source/tools/acpiexec/aecommon.h b/src/acpica/source/tools/acpiexec/aecommon.h
index c773e96f..b4864610 100644
--- a/src/acpica/source/tools/acpiexec/aecommon.h
+++ b/src/acpica/source/tools/acpiexec/aecommon.h
@@ -204,11 +204,21 @@  extern ACPI_CONNECTION_INFO AeMyContext;
 #define OSD_PRINT(lvl,fp)               TEST_OUTPUT_LEVEL(lvl) {\
                                             AcpiOsPrintf PARAM_LIST(fp);}
 
+#define AE_PREFIX                       "ACPI Exec: "
+
 void ACPI_SYSTEM_XFACE
-AeCtrlCHandler (
+AeSignalHandler (
     int                     Sig);
 
 ACPI_STATUS
+AeExceptionHandler (
+    ACPI_STATUS             AmlStatus,
+    ACPI_NAME               Name,
+    UINT16                  Opcode,
+    UINT32                  AmlOffset,
+    void                    *Context);
+
+ACPI_STATUS
 AeBuildLocalTables (
     ACPI_NEW_TABLE_DESC     *TableList);
 
diff --git a/src/acpica/source/tools/acpiexec/aeexception.c b/src/acpica/source/tools/acpiexec/aeexception.c
new file mode 100644
index 00000000..a5a3293a
--- /dev/null
+++ b/src/acpica/source/tools/acpiexec/aeexception.c
@@ -0,0 +1,441 @@ 
+/******************************************************************************
+ *
+ * Module Name: aeexception - Exception and signal handlers
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ *****************************************************************************/
+
+#include "aecommon.h"
+
+#define _COMPONENT          ACPI_TOOLS
+        ACPI_MODULE_NAME    ("aeexception")
+
+
+/* Local prototypes */
+
+static void
+AeDisplayMethodCallStack (
+    void);
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AeExceptionHandler
+ *
+ * PARAMETERS:  Standard exception handler parameters
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: System exception handler for AcpiExec utility. Called from
+ *              the core ACPICA code after any exception during method
+ *              execution.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AeExceptionHandler (
+    ACPI_STATUS             AmlStatus,
+    ACPI_NAME               Name,
+    UINT16                  Opcode,
+    UINT32                  AmlOffset,
+    void                    *Context)
+{
+    ACPI_STATUS             NewAmlStatus = AmlStatus;
+    ACPI_STATUS             Status;
+    ACPI_BUFFER             ReturnObj;
+    ACPI_OBJECT_LIST        ArgList;
+    ACPI_OBJECT             Arg[3];
+    const char              *Exception;
+    ACPI_HANDLE             ErrHandle;
+
+
+    Exception = AcpiFormatException (AmlStatus);
+    AcpiOsPrintf (AE_PREFIX
+        "Exception %s during execution\n", Exception);
+    if (Name)
+    {
+        AcpiOsPrintf (AE_PREFIX
+            "Evaluating Method or Node: [%4.4s]",
+            (char *) &Name);
+    }
+
+    AcpiOsPrintf ("\n" AE_PREFIX
+        "AML Opcode [%s], Method Offset ~%5.5X\n",
+        AcpiPsGetOpcodeName (Opcode), AmlOffset);
+
+    /* Invoke the _ERR method if present */
+
+    Status = AcpiGetHandle (NULL, "\\_ERR", &ErrHandle);
+    if (ACPI_FAILURE (Status))
+    {
+        goto Cleanup;
+    }
+
+    /* Setup parameter object */
+
+    ArgList.Count = 3;
+    ArgList.Pointer = Arg;
+
+    Arg[0].Type = ACPI_TYPE_INTEGER;
+    Arg[0].Integer.Value = AmlStatus;
+
+    Arg[1].Type = ACPI_TYPE_STRING;
+    Arg[1].String.Pointer = ACPI_CAST_PTR (char, Exception);
+    Arg[1].String.Length = strlen (Exception);
+
+    Arg[2].Type = ACPI_TYPE_INTEGER;
+    Arg[2].Integer.Value = AcpiOsGetThreadId();
+
+    /* Setup return buffer */
+
+    ReturnObj.Pointer = NULL;
+    ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
+
+    Status = AcpiEvaluateObject (ErrHandle, NULL, &ArgList, &ReturnObj);
+    if (ACPI_SUCCESS (Status))
+    {
+        if (ReturnObj.Pointer)
+        {
+            /* Override original status */
+
+            NewAmlStatus = (ACPI_STATUS)
+                ((ACPI_OBJECT *) ReturnObj.Pointer)->Integer.Value;
+
+            /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
+
+            AcpiOsFree (ReturnObj.Pointer);
+        }
+    }
+    else if (Status != AE_NOT_FOUND)
+    {
+        AcpiOsPrintf (AE_PREFIX
+            "Could not execute _ERR method, %s\n",
+            AcpiFormatException (Status));
+    }
+
+Cleanup:
+
+    /* Global overrides */
+
+    if (AcpiGbl_IgnoreErrors)
+    {
+        NewAmlStatus = AE_OK;
+    }
+    else if (AmlStatus == AE_AML_INTERNAL)
+    {
+        NewAmlStatus = AE_AML_INTERNAL;
+        AcpiOsPrintf (AE_PREFIX
+            "Cannot override status %s\n\n",
+            AcpiFormatException (NewAmlStatus));
+    }
+    else if (NewAmlStatus != AmlStatus)
+    {
+        AcpiOsPrintf (AE_PREFIX
+            "Exception override, new status %s\n\n",
+            AcpiFormatException (NewAmlStatus));
+    }
+
+    return (NewAmlStatus);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AeSignalHandler
+ *
+ * PARAMETERS:  Sig
+ *
+ * RETURN:      none
+ *
+ * DESCRIPTION: Master signal handler. Currently handles SIGINT (ctrl-c),
+ *              and SIGSEGV (Segment violation).
+ *
+ *****************************************************************************/
+
+void ACPI_SYSTEM_XFACE
+AeSignalHandler (
+    int                     Sig)
+{
+
+    fflush(stdout);
+    AcpiOsPrintf ("\n" AE_PREFIX);
+
+    switch (Sig)
+    {
+    case SIGINT:
+        signal(Sig, SIG_IGN);
+        AcpiOsPrintf ("<Control-C>\n");
+
+        /* Abort the application if there are no methods executing */
+
+        if (!AcpiGbl_MethodExecuting)
+        {
+            break;
+        }
+
+        /*
+         * Abort the method(s). This will also dump the method call
+         * stack so there is no need to do it here. The application
+         * will then drop back into the debugger interface.
+         */
+        AcpiGbl_AbortMethod = TRUE;
+        AcpiOsPrintf (AE_PREFIX "Control Method Call Stack:\n");
+        signal (SIGINT, AeSignalHandler);
+        return;
+
+    case SIGSEGV:
+        AcpiOsPrintf ("Segmentation Fault\n");
+        AeDisplayMethodCallStack ();
+        break;
+
+    default:
+        AcpiOsPrintf ("Unknown Signal, %X\n", Sig);
+        break;
+    }
+
+    /* Terminate application -- cleanup then exit */
+
+    AcpiOsPrintf (AE_PREFIX "Terminating\n");
+    (void) AcpiOsTerminate ();
+    exit (0);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AeDisplayMethodCallStack
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Display current method call stack, if possible.
+ *
+ * NOTE:        Currently only called from a SIGSEGV, so AcpiExec is about
+ *              to terminate.
+ *
+ *****************************************************************************/
+
+static void
+AeDisplayMethodCallStack (
+    void)
+{
+    ACPI_WALK_STATE         *WalkState;
+    ACPI_THREAD_STATE       *ThreadList = AcpiGbl_CurrentWalkList;
+    char                    *FullPathname = NULL;
+
+
+    if (!AcpiGbl_MethodExecuting)
+    {
+        AcpiOsPrintf (AE_PREFIX "No method is executing\n");
+        return;
+    }
+
+    /*
+     * Try to find the currently executing control method(s)
+     *
+     * Note: The following code may fault if the data structures are
+     * in an indeterminate state when the interrupt occurs. However,
+     * in practice, this works quite well and can provide very
+     * valuable information.
+     *
+     * 1) Walk the global thread list
+     */
+    while (ThreadList &&
+        (ThreadList->DescriptorType == ACPI_DESC_TYPE_STATE_THREAD))
+    {
+        /* 2) Walk the walk state list for this thread */
+
+        WalkState = ThreadList->WalkStateList;
+        while (WalkState &&
+            (WalkState->DescriptorType == ACPI_DESC_TYPE_WALK))
+        {
+            /* An executing control method */
+
+            if (WalkState->MethodNode)
+            {
+                FullPathname = AcpiNsGetExternalPathname (
+                    WalkState->MethodNode);
+
+                AcpiOsPrintf (AE_PREFIX
+                    "Executing Method: %s\n", FullPathname);
+            }
+
+            /* Execution of a deferred opcode/node */
+
+            if (WalkState->DeferredNode)
+            {
+                FullPathname = AcpiNsGetExternalPathname (
+                    WalkState->DeferredNode);
+
+                AcpiOsPrintf (AE_PREFIX
+                    "Evaluating deferred node: %s\n", FullPathname);
+            }
+
+            /* Get the currently executing AML opcode */
+
+            if ((WalkState->Opcode != AML_INT_METHODCALL_OP) &&
+                FullPathname)
+            {
+                AcpiOsPrintf (AE_PREFIX
+                    "Current AML Opcode in %s: [%s]-0x%4.4X at %p\n",
+                    FullPathname, AcpiPsGetOpcodeName (WalkState->Opcode),
+                    WalkState->Opcode, WalkState->Aml);
+            }
+
+            if (FullPathname)
+            {
+                ACPI_FREE (FullPathname);
+                FullPathname = NULL;
+            }
+
+            WalkState = WalkState->Next;
+        }
+
+        ThreadList = ThreadList->Next;
+    }
+}
diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
index 5f32b6af..b2854195 100644
--- a/src/acpica/source/tools/acpiexec/aehandlers.c
+++ b/src/acpica/source/tools/acpiexec/aehandlers.c
@@ -182,14 +182,6 @@  AeDeviceNotifyHandler (
     void                    *Context);
 
 static ACPI_STATUS
-AeExceptionHandler (
-    ACPI_STATUS             AmlStatus,
-    ACPI_NAME               Name,
-    UINT16                  Opcode,
-    UINT32                  AmlOffset,
-    void                    *Context);
-
-static ACPI_STATUS
 AeTableHandler (
     UINT32                  Event,
     void                    *Table,
@@ -230,50 +222,11 @@  static char                *TableEvents[] =
 #endif /* !ACPI_REDUCED_HARDWARE */
 
 
-static UINT32               SigintCount = 0;
 static AE_DEBUG_REGIONS     AeRegions;
 
 
 /******************************************************************************
  *
- * FUNCTION:    AeCtrlCHandler
- *
- * PARAMETERS:  Sig
- *
- * RETURN:      none
- *
- * DESCRIPTION: Control-C handler. Abort running control method if any.
- *
- *****************************************************************************/
-
-void ACPI_SYSTEM_XFACE
-AeCtrlCHandler (
-    int                     Sig)
-{
-
-    signal (SIGINT, SIG_IGN);
-    SigintCount++;
-
-    AcpiOsPrintf ("Caught a ctrl-c (#%u)\n\n", SigintCount);
-
-    if (AcpiGbl_MethodExecuting)
-    {
-        AcpiGbl_AbortMethod = TRUE;
-        signal (SIGINT, AeCtrlCHandler);
-
-        if (SigintCount < 10)
-        {
-            return;
-        }
-    }
-
-    (void) AcpiOsTerminate ();
-    exit (0);
-}
-
-
-/******************************************************************************
- *
  * FUNCTION:    AeNotifyHandler(s)
  *
  * PARAMETERS:  Standard notify handler parameters
@@ -325,28 +278,34 @@  AeCommonNotifyHandler (
 #if 0
     case 0:
 
-        printf ("[AcpiExec] Method Error 0x%X: Results not equal\n", Value);
+        printf (AE_PREFIX
+            "Method Error 0x%X: Results not equal\n", Value);
         if (AcpiGbl_DebugFile)
         {
-            AcpiOsPrintf ("[AcpiExec] Method Error: Results not equal\n");
+            AcpiOsPrintf (AE_PREFIX
+                "Method Error: Results not equal\n");
         }
         break;
 
     case 1:
 
-        printf ("[AcpiExec] Method Error: Incorrect numeric result\n");
+        printf (AE_PREFIX
+            "Method Error: Incorrect numeric result\n");
         if (AcpiGbl_DebugFile)
         {
-            AcpiOsPrintf ("[AcpiExec] Method Error: Incorrect numeric result\n");
+            AcpiOsPrintf (AE_PREFIX
+                "Method Error: Incorrect numeric result\n");
         }
         break;
 
     case 2:
 
-        printf ("[AcpiExec] Method Error: An operand was overwritten\n");
+        printf (AE_PREFIX
+            "Method Error: An operand was overwritten\n");
         if (AcpiGbl_DebugFile)
         {
-            AcpiOsPrintf ("[AcpiExec] Method Error: An operand was overwritten\n");
+            AcpiOsPrintf (AE_PREFIX
+                "Method Error: An operand was overwritten\n");
         }
         break;
 
@@ -354,12 +313,14 @@  AeCommonNotifyHandler (
 
     default:
 
-        printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
+        printf (AE_PREFIX
+            "Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
             HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
             AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
         if (AcpiGbl_DebugFile)
         {
-            AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
+            AcpiOsPrintf (AE_PREFIX
+                "Handler %u: Received a %s notify, Value 0x%2.2X\n",
                 HandlerId, Type, Value);
         }
 
@@ -390,12 +351,14 @@  AeSystemNotifyHandler (
     void                        *Context)
 {
 
-    printf ("[AcpiExec] Global:    Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
+    printf (AE_PREFIX
+        "Global:    Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
         AcpiUtGetNodeName (Device), Device, Value,
         AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
     if (AcpiGbl_DebugFile)
     {
-        AcpiOsPrintf ("[AcpiExec] Global:    Received a System Notify, Value 0x%2.2X\n", Value);
+        AcpiOsPrintf (AE_PREFIX
+            "Global:    Received a System Notify, Value 0x%2.2X\n", Value);
     }
 
     (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
@@ -423,12 +386,14 @@  AeDeviceNotifyHandler (
     void                        *Context)
 {
 
-    printf ("[AcpiExec] Global:    Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
+    printf (AE_PREFIX
+        "Global:    Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
         AcpiUtGetNodeName (Device), Device, Value,
         AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
     if (AcpiGbl_DebugFile)
     {
-        AcpiOsPrintf ("[AcpiExec] Global:    Received a Device Notify, Value 0x%2.2X\n", Value);
+        AcpiOsPrintf (AE_PREFIX
+            "Global:    Received a Device Notify, Value 0x%2.2X\n", Value);
     }
 
     (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
@@ -437,108 +402,6 @@  AeDeviceNotifyHandler (
 
 /******************************************************************************
  *
- * FUNCTION:    AeExceptionHandler
- *
- * PARAMETERS:  Standard exception handler parameters
- *
- * RETURN:      Status
- *
- * DESCRIPTION: System exception handler for AcpiExec utility.
- *
- *****************************************************************************/
-
-static ACPI_STATUS
-AeExceptionHandler (
-    ACPI_STATUS             AmlStatus,
-    ACPI_NAME               Name,
-    UINT16                  Opcode,
-    UINT32                  AmlOffset,
-    void                    *Context)
-{
-    ACPI_STATUS             NewAmlStatus = AmlStatus;
-    ACPI_STATUS             Status;
-    ACPI_BUFFER             ReturnObj;
-    ACPI_OBJECT_LIST        ArgList;
-    ACPI_OBJECT             Arg[3];
-    const char              *Exception;
-
-
-    Exception = AcpiFormatException (AmlStatus);
-    AcpiOsPrintf ("[AcpiExec] Exception %s during execution ", Exception);
-    if (Name)
-    {
-        AcpiOsPrintf ("of method [%4.4s]", (char *) &Name);
-    }
-    else
-    {
-        AcpiOsPrintf ("at module level (table load)");
-    }
-
-    AcpiOsPrintf (" Opcode [%s] @%X\n", AcpiPsGetOpcodeName (Opcode), AmlOffset);
-
-    /*
-     * Invoke the _ERR method if present
-     *
-     * Setup parameter object
-     */
-    ArgList.Count = 3;
-    ArgList.Pointer = Arg;
-
-    Arg[0].Type = ACPI_TYPE_INTEGER;
-    Arg[0].Integer.Value = AmlStatus;
-
-    Arg[1].Type = ACPI_TYPE_STRING;
-    Arg[1].String.Pointer = ACPI_CAST_PTR (char, Exception);
-    Arg[1].String.Length = strlen (Exception);
-
-    Arg[2].Type = ACPI_TYPE_INTEGER;
-    Arg[2].Integer.Value = AcpiOsGetThreadId();
-
-    /* Setup return buffer */
-
-    ReturnObj.Pointer = NULL;
-    ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
-
-    Status = AcpiEvaluateObject (NULL, "\\_ERR", &ArgList, &ReturnObj);
-    if (ACPI_SUCCESS (Status))
-    {
-        if (ReturnObj.Pointer)
-        {
-            /* Override original status */
-
-            NewAmlStatus = (ACPI_STATUS)
-                ((ACPI_OBJECT *) ReturnObj.Pointer)->Integer.Value;
-
-            /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
-
-            AcpiOsFree (ReturnObj.Pointer);
-        }
-    }
-    else if (Status != AE_NOT_FOUND)
-    {
-        AcpiOsPrintf ("[AcpiExec] Could not execute _ERR method, %s\n",
-            AcpiFormatException (Status));
-    }
-
-    /* Global override */
-
-    if (AcpiGbl_IgnoreErrors)
-    {
-        NewAmlStatus = AE_OK;
-    }
-
-    if (NewAmlStatus != AmlStatus)
-    {
-        AcpiOsPrintf ("[AcpiExec] Exception override, new status %s\n\n",
-            AcpiFormatException (NewAmlStatus));
-    }
-
-    return (NewAmlStatus);
-}
-
-
-/******************************************************************************
- *
  * FUNCTION:    AeTableHandler
  *
  * PARAMETERS:  Table handler
@@ -571,8 +434,9 @@  AeTableHandler (
     Status = AcpiUpdateAllGpes ();
     ACPI_CHECK_OK (AcpiUpdateAllGpes, Status);
 
-    printf ("[AcpiExec] Table Event %s, [%4.4s] %p\n",
-        TableEvents[Event], ((ACPI_TABLE_HEADER *) Table)->Signature, Table);
+    printf (AE_PREFIX "Table Event %s, [%4.4s] %p\n",
+        TableEvents[Event],
+        ((ACPI_TABLE_HEADER *) Table)->Signature, Table);
 #endif /* !ACPI_REDUCED_HARDWARE */
 
     return (AE_OK);
@@ -596,7 +460,8 @@  AeGpeHandler (
     ACPI_NAMESPACE_NODE     *DeviceNode = (ACPI_NAMESPACE_NODE *) GpeDevice;
 
 
-    AcpiOsPrintf ("[AcpiExec] GPE Handler received GPE %02X (GPE block %4.4s)\n",
+    AcpiOsPrintf (AE_PREFIX
+        "GPE Handler received GPE %02X (GPE block %4.4s)\n",
         GpeNumber, GpeDevice ? DeviceNode->Name.Ascii : "FADT");
 
     return (ACPI_REENABLE_GPE);
@@ -639,8 +504,8 @@  AeGlobalEventHandler (
         break;
     }
 
-    AcpiOsPrintf (
-        "[AcpiExec] Global Event Handler received: Type %s Number %.2X Dev %p\n",
+    AcpiOsPrintf (AE_PREFIX
+        "Global Event Handler received: Type %s Number %.2X Dev %p\n",
         TypeName, EventNumber, Device);
 }
 
@@ -662,7 +527,8 @@  AeAttachedDataHandler (
     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
 
 
-    AcpiOsPrintf ("Received an attached data deletion (1) on %4.4s\n",
+    AcpiOsPrintf (AE_PREFIX
+        "Received an attached data deletion (1) on %4.4s\n",
         Node->Name.Ascii);
 }
 
@@ -684,7 +550,8 @@  AeAttachedDataHandler2 (
     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
 
 
-    AcpiOsPrintf ("Received an attached data deletion (2) on %4.4s\n",
+    AcpiOsPrintf (AE_PREFIX
+        "Received an attached data deletion (2) on %4.4s\n",
         Node->Name.Ascii);
 }
 
@@ -734,7 +601,8 @@  AeSciHandler (
     void                    *Context)
 {
 
-    AcpiOsPrintf ("[AcpiExec] Received an SCI at handler\n");
+    AcpiOsPrintf (AE_PREFIX
+        "Received an SCI at handler\n");
     return (0);
 }
 
@@ -926,16 +794,16 @@  AeInstallEarlyHandlers (
 
     /* Install global notify handlers */
 
-    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
-        AeSystemNotifyHandler, NULL);
+    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT,
+        ACPI_SYSTEM_NOTIFY, AeSystemNotifyHandler, NULL);
     if (ACPI_FAILURE (Status))
     {
         printf ("Could not install a global system notify handler, %s\n",
             AcpiFormatException (Status));
     }
 
-    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
-        AeDeviceNotifyHandler, NULL);
+    Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT,
+        ACPI_DEVICE_NOTIFY, AeDeviceNotifyHandler, NULL);
     if (ACPI_FAILURE (Status))
     {
         printf ("Could not install a global notify handler, %s\n",