From 38607d8acdd9736eba1e4cf8321e9b1608a0d9e9 Mon Sep 17 00:00:00 2001
From: Sascha Wildner <saw@online.de>
Date: Sat, 30 Sep 2017 17:56:00 +0200
Subject: [PATCH] WIP ACPICA 20170929

---
 sys/contrib/dev/acpica/changes.txt                 |  100 ++
 .../dev/acpica/generate/unix/acpiexec/Makefile     |    1 +
 sys/contrib/dev/acpica/generate/unix/iasl/Makefile |    2 +
 sys/contrib/dev/acpica/source/common/adfile.c      |    4 +-
 sys/contrib/dev/acpica/source/common/ahtable.c     |    2 +
 sys/contrib/dev/acpica/source/common/dmtable.c     |   71 +-
 sys/contrib/dev/acpica/source/common/dmtbdump.c    | 1024 +++++++++++++-------
 sys/contrib/dev/acpica/source/common/dmtbinfo.c    |  160 ++-
 .../dev/acpica/source/compiler/aslallocate.c       |  303 ++++++
 sys/contrib/dev/acpica/source/compiler/aslcache.c  |  481 +++++++++
 .../dev/acpica/source/compiler/aslcompile.c        |   66 +-
 .../dev/acpica/source/compiler/aslcompiler.h       |   71 +-
 .../dev/acpica/source/compiler/aslcompiler.l       |    4 +-
 sys/contrib/dev/acpica/source/compiler/asldebug.c  |    2 +-
 sys/contrib/dev/acpica/source/compiler/aslerror.c  |  794 +++++++++------
 sys/contrib/dev/acpica/source/compiler/aslfiles.c  |    7 +-
 sys/contrib/dev/acpica/source/compiler/aslhelp.c   |    1 +
 sys/contrib/dev/acpica/source/compiler/aslload.c   |   30 +-
 .../dev/acpica/source/compiler/aslmapenter.c       |    4 +-
 .../dev/acpica/source/compiler/aslmaputils.c       |    4 +-
 .../dev/acpica/source/compiler/aslmessages.c       |    4 +-
 .../dev/acpica/source/compiler/aslmessages.h       |    2 +
 sys/contrib/dev/acpica/source/compiler/aslmethod.c |   43 +-
 .../dev/acpica/source/compiler/asloperands.c       |    4 +-
 sys/contrib/dev/acpica/source/compiler/aslopt.c    |    2 +-
 .../dev/acpica/source/compiler/asloptions.c        |    9 +-
 .../dev/acpica/source/compiler/aslparseop.c        |   55 +-
 sys/contrib/dev/acpica/source/compiler/aslprintf.c |    4 +-
 .../dev/acpica/source/compiler/aslstartup.c        |    4 +-
 .../dev/acpica/source/compiler/aslsupport.l        |    4 +-
 sys/contrib/dev/acpica/source/compiler/asltypes.h  |    9 +-
 sys/contrib/dev/acpica/source/compiler/aslutils.c  |  221 +----
 .../dev/acpica/source/compiler/cvcompiler.c        |   16 +-
 sys/contrib/dev/acpica/source/compiler/cvparser.c  |    2 +-
 sys/contrib/dev/acpica/source/compiler/dtcompile.c |    8 +-
 .../dev/acpica/source/compiler/dtcompiler.h        |   33 +-
 sys/contrib/dev/acpica/source/compiler/dtexpress.c |    1 -
 sys/contrib/dev/acpica/source/compiler/dtfield.c   |    1 -
 sys/contrib/dev/acpica/source/compiler/dtio.c      |    5 +-
 sys/contrib/dev/acpica/source/compiler/dtparser.y  |    1 -
 .../dev/acpica/source/compiler/dtsubtable.c        |    3 +-
 sys/contrib/dev/acpica/source/compiler/dttable.c   |    1 -
 sys/contrib/dev/acpica/source/compiler/dttable1.c  |    1 -
 sys/contrib/dev/acpica/source/compiler/dttable2.c  |  377 ++++++-
 .../dev/acpica/source/compiler/dttemplate.c        |    3 +-
 .../dev/acpica/source/compiler/dttemplate.h        |   46 +-
 sys/contrib/dev/acpica/source/compiler/dtutils.c   |  153 +--
 sys/contrib/dev/acpica/source/compiler/prexpress.c |    2 -
 sys/contrib/dev/acpica/source/compiler/prmacros.c  |    2 -
 sys/contrib/dev/acpica/source/compiler/prparser.y  |    1 -
 sys/contrib/dev/acpica/source/compiler/prscan.c    |    1 -
 sys/contrib/dev/acpica/source/compiler/prutils.c   |    4 +-
 .../source/components/dispatcher/dscontrol.c       |   17 +-
 .../acpica/source/components/hardware/hwtimer.c    |   27 +-
 .../acpica/source/components/namespace/nsaccess.c  |   14 +-
 .../acpica/source/components/namespace/nssearch.c  |    1 +
 .../dev/acpica/source/components/parser/psobject.c |    9 +-
 .../dev/acpica/source/components/parser/psutils.c  |    8 +-
 .../acpica/source/components/utilities/utinit.c    |    1 -
 .../acpica/source/components/utilities/utmath.c    |    4 +-
 sys/contrib/dev/acpica/source/include/acapps.h     |    3 +
 sys/contrib/dev/acpica/source/include/acconfig.h   |    4 +-
 sys/contrib/dev/acpica/source/include/acdisasm.h   |   27 +-
 sys/contrib/dev/acpica/source/include/acexcep.h    |    4 +-
 sys/contrib/dev/acpica/source/include/aclocal.h    |    2 +-
 sys/contrib/dev/acpica/source/include/acpixf.h     |    6 +-
 sys/contrib/dev/acpica/source/include/actbl1.h     |   92 +-
 sys/contrib/dev/acpica/source/include/actbl2.h     |   14 +-
 sys/contrib/dev/acpica/source/include/actypes.h    |    2 +
 .../dev/acpica/source/tools/acpibin/abmain.c       |   21 +-
 .../dev/acpica/source/tools/acpidump/apmain.c      |   26 +-
 .../dev/acpica/source/tools/acpiexec/aecommon.h    |    1 +
 .../dev/acpica/source/tools/acpiexec/aeexception.c |   11 +-
 .../dev/acpica/source/tools/acpiexec/aeexec.c      |   13 +
 .../dev/acpica/source/tools/acpiexec/aemain.c      |   66 +-
 .../dev/acpica/source/tools/acpihelp/ahmain.c      |   21 +-
 .../dev/acpica/source/tools/acpinames/anmain.c     |   23 +-
 .../dev/acpica/source/tools/acpisrc/asmain.c       |    6 +
 .../dev/acpica/source/tools/acpisrc/astable.c      |    9 +-
 .../acpica/source/tools/acpixtract/acpixtract.c    |  241 +++--
 .../acpica/source/tools/acpixtract/acpixtract.h    |   35 +-
 .../dev/acpica/source/tools/acpixtract/axmain.c    |   23 +-
 .../dev/acpica/source/tools/acpixtract/axutils.c   |  396 +++++---
 usr.sbin/acpi/acpibin/acpibin.8                    |    4 +-
 usr.sbin/acpi/acpidump/acpidump.8                  |    4 +-
 usr.sbin/acpi/acpiexec/Makefile                    |    1 +
 usr.sbin/acpi/acpiexec/acpiexec.8                  |    8 +-
 usr.sbin/acpi/acpihelp/acpihelp.8                  |    4 +-
 usr.sbin/acpi/acpinames/acpinames.8                |    4 +-
 usr.sbin/acpi/acpixtract/acpixtract.8              |    4 +-
 usr.sbin/acpi/iasl/Makefile                        |    2 +
 91 files changed, 3655 insertions(+), 1656 deletions(-)
 create mode 100644 sys/contrib/dev/acpica/source/compiler/aslallocate.c
 create mode 100644 sys/contrib/dev/acpica/source/compiler/aslcache.c

diff --git a/sys/contrib/dev/acpica/changes.txt b/sys/contrib/dev/acpica/changes.txt
index db25f7e5fb..b40fa32099 100644
--- a/sys/contrib/dev/acpica/changes.txt
+++ b/sys/contrib/dev/acpica/changes.txt
@@ -1,3 +1,103 @@
+----------------------------------------
+29 September 2017. Summary of changes for version 20170929:
+
+
+1) ACPICA kernel-resident subsystem:
+
+Redesigned and implemented an improved ASL While() loop timeout 
+mechanism. This mechanism is used to prevent infinite loops in the kernel 
+AML interpreter caused by either non-responsive hardware or incorrect AML 
+code. The new implementation uses AcpiOsGetTimer instead of a simple 
+maximum loop count, and is thus more accurate and constant across 
+different machines. The default timeout is currently 30 seconds, but this 
+may be adjusted later.
+
+Renamed the ACPI_AML_INFINITE_LOOP exception to AE_AML_LOOP_TIMEOUT to 
+better reflect the new implementation of the loop timeout mechanism.
+
+Updated the AcpiGetTimerDuration interface to cleanup the 64-bit support 
+and to fix an off-by-one error. Jung-uk Kim.
+
+Fixed an EFI build problem by updating the makefiles to for a new file 
+that was added, utstrsuppt.c
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Implemented full support for the PDTT, SDEV, and TPM2 ACPI tables. This 
+includes support in the table disassembler, compiler, and template 
+generator.
+
+iASL: Added an exception for an illegal type of recursive method 
+invocation. If a method creates named objects, the first recursive call 
+will fail at runtime. This change adds an error detection at compile time 
+to catch the problem up front. Note: Marking such a method as 
+"serialized" will not help with this problem, because the same thread can 
+acquire the method mutex more than once. Example compiler and runtime 
+output:
+
+    Method (MTH1)
+    {
+        Name (INT1, 1)
+        MTH1 ()
+    }
+
+    dsdt.asl     22: MTH1 ()
+    Error    6152 -  ^ Illegal recursive call to method
+                       that creates named objects (MTH1)
+
+Previous runtime exception:
+    ACPI Error: [INT1] Namespace lookup failure,
+    AE_ALREADY_EXISTS (20170831/dswload2-465)
+
+iASL: Updated support for External() opcodes to improve namespace 
+management and error detection. These changes are related to issues seen 
+with multiple-segment namespace pathnames within External declarations, 
+such as below:
+
+    External(\_SB.PCI0.GFX0, DeviceObj)
+    External(\_SB.PCI0.GFX0.ALSI)
+
+iASL: Implemented support for multi-line error/warning messages. This 
+enables more detailed and helpful error messages as below, from the 
+initial deployment for the duplicate names error:
+
+    DSDT.iiii   1692:       Device(PEG2) {
+    Error    6074 -                  ^ Name already exists in scope 
+(PEG2)
+
+        Original name creation/declaration below:
+        DSDT.iiii     93:   External(\_SB.PCI0.PEG2, DeviceObj)
+
+AcpiXtract: Added additional flexibility to support differing input hex 
+dump formats. Specifically, hex dumps that contain partial disassembly 
+and/or comments within the ACPI table data definition. There exist some 
+dump utilities seen in the field that create this type of hex dump (such 
+as Simics). For example:
+
+    DSDT @ 0xdfffd0c0 (10999 bytes)
+        Signature DSDT
+        Length 10999
+        Revision 1
+        Checksum 0xf3 (Ok)
+        OEM_ID BXPC
+        OEM_table_id BXDSDT
+        OEM_revision 1
+        Creator_id 1280593481
+        Creator_revision 537399345
+      0000: 44 53 44 54 f7 2a 00 00 01 f3 42 58 50 43 00 00
+      ...
+      2af0: 5f 4c 30 46 00 a4 01
+
+Test suite: Miscellaneous changes/fixes:
+    More cleanup and simplification of makefiles
+    Continue compilation of test cases after a compile failure
+    Do not perform binary compare unless both files actually exist
+
+iASL: Performed some code/module restructuring. Moved all memory 
+allocation functions to new modules. Two new files, aslallocate.c and 
+aslcache.c
+
 ----------------------------------------
 31 August 2017. Summary of changes for version 20170831:
 
diff --git a/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile b/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile
index 681442c375..fc45da8dc8 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile
@@ -140,6 +140,7 @@ OBJECTS = \
 	$(OBJDIR)/hwpci.o\
 	$(OBJDIR)/hwregs.o\
 	$(OBJDIR)/hwsleep.o\
+	$(OBJDIR)/hwtimer.o\
 	$(OBJDIR)/hwvalid.o\
 	$(OBJDIR)/hwxface.o\
 	$(OBJDIR)/hwxfsleep.o\
diff --git a/sys/contrib/dev/acpica/generate/unix/iasl/Makefile b/sys/contrib/dev/acpica/generate/unix/iasl/Makefile
index 02390ea1c9..27f5d8d276 100644
--- a/sys/contrib/dev/acpica/generate/unix/iasl/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/iasl/Makefile
@@ -51,9 +51,11 @@ OBJECTS = \
 	$(OBJDIR)/ahpredef.o\
 	$(OBJDIR)/ahtable.o\
 	$(OBJDIR)/ahuuids.o\
+	$(OBJDIR)/aslallocate.o\
 	$(OBJDIR)/aslanalyze.o\
 	$(OBJDIR)/aslascii.o\
 	$(OBJDIR)/aslbtypes.o\
+	$(OBJDIR)/aslcache.o\
 	$(OBJDIR)/aslcodegen.o\
 	$(OBJDIR)/aslcompile.o\
 	$(OBJDIR)/asldebug.o\
diff --git a/sys/contrib/dev/acpica/source/common/adfile.c b/sys/contrib/dev/acpica/source/common/adfile.c
index ac96156db2..80462f1779 100644
--- a/sys/contrib/dev/acpica/source/common/adfile.c
+++ b/sys/contrib/dev/acpica/source/common/adfile.c
@@ -314,7 +314,7 @@ FlGenerateFilename (
      * Copy the original filename to a new buffer. Leave room for the worst
      * case where we append the suffix, an added dot and the null terminator.
      */
-    NewFilename = UtStringCacheCalloc ((ACPI_SIZE)
+    NewFilename = UtLocalCacheCalloc ((ACPI_SIZE)
         strlen (InputFilename) + strlen (Suffix) + 2);
     strcpy (NewFilename, InputFilename);
 
@@ -358,7 +358,7 @@ FlStrdup (
     char                *NewString;
 
 
-    NewString = UtStringCacheCalloc ((ACPI_SIZE) strlen (String) + 1);
+    NewString = UtLocalCacheCalloc ((ACPI_SIZE) strlen (String) + 1);
     strcpy (NewString, String);
     return (NewString);
 }
diff --git a/sys/contrib/dev/acpica/source/common/ahtable.c b/sys/contrib/dev/acpica/source/common/ahtable.c
index 7aee3c669b..be68ed480c 100644
--- a/sys/contrib/dev/acpica/source/common/ahtable.c
+++ b/sys/contrib/dev/acpica/source/common/ahtable.c
@@ -232,6 +232,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
     {ACPI_SIG_MTMR, "MID Timer Table"},
     {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"},
     {ACPI_SIG_PCCT, "Platform Communications Channel Table"},
+    {ACPI_SIG_PDTT, "Platform Debug Trigger Table"},
     {ACPI_SIG_PMTT, "Platform Memory Topology Table"},
     {ACPI_SIG_PPTT, "Processor Properties Topology Table"},
     {ACPI_SIG_RASF, "RAS Features Table"},
@@ -240,6 +241,7 @@ const AH_TABLE      Gbl_AcpiSupportedTables[] =
     {ACPI_SIG_S3PT, "S3 Performance Table"},
     {ACPI_SIG_SBST, "Smart Battery Specification Table"},
     {ACPI_SIG_SDEI, "Software Delegated Exception Interface Table"},
+    {ACPI_SIG_SDEV, "Secure Devices table"},
     {ACPI_SIG_SLIC, "Software Licensing Description Table"},
     {ACPI_SIG_SLIT, "System Locality Information Table"},
     {ACPI_SIG_SPCR, "Serial Port Console Redirection table"},
diff --git a/sys/contrib/dev/acpica/source/common/dmtable.c b/sys/contrib/dev/acpica/source/common/dmtable.c
index 38248c2c45..07d27faf78 100644
--- a/sys/contrib/dev/acpica/source/common/dmtable.c
+++ b/sys/contrib/dev/acpica/source/common/dmtable.c
@@ -154,7 +154,6 @@
 #include "acdisasm.h"
 #include "actables.h"
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 /* This module used for application-level code only */
 
@@ -290,9 +289,9 @@ static const char           *AcpiDmHestSubnames[] =
     "IA-32 Machine Check Exception",
     "IA-32 Corrected Machine Check",
     "IA-32 Non-Maskable Interrupt",
-    "Unknown SubTable Type",        /* 3 - Reserved */
-    "Unknown SubTable Type",        /* 4 - Reserved */
-    "Unknown SubTable Type",        /* 5 - Reserved */
+    "Unknown Subtable Type",        /* 3 - Reserved */
+    "Unknown Subtable Type",        /* 4 - Reserved */
+    "Unknown Subtable Type",        /* 5 - Reserved */
     "PCI Express Root Port AER",
     "PCI Express AER (AER Endpoint)",
     "PCI Express/PCI-X Bridge AER",
@@ -374,7 +373,7 @@ static const char           *AcpiDmPmttSubnames[] =
 {
     "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
     "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
-    "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM  */
+    "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
     "Unknown Subtable Type"         /* Reserved */
 };
 
@@ -382,7 +381,14 @@ static const char           *AcpiDmPpttSubnames[] =
 {
     "Processor Hierarchy Node",     /* ACPI_PPTT_TYPE_PROCESSOR */
     "Cache Type",                   /* ACPI_PPTT_TYPE_CACHE */
-    "ID",                           /* ACPI_PMTT_TYPE_ID  */
+    "ID",                           /* ACPI_PPTT_TYPE_ID */
+    "Unknown Subtable Type"         /* Reserved */
+};
+
+static const char           *AcpiDmSdevSubnames[] =
+{
+    "Namespace Device",             /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
+    "PCIe Endpoint Device",         /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
     "Unknown Subtable Type"         /* Reserved */
 };
 
@@ -396,6 +402,23 @@ static const char           *AcpiDmSratSubnames[] =
     "Unknown Subtable Type"         /* Reserved */
 };
 
+static const char           *AcpiDmTpm2Subnames[] =
+{
+    "Illegal Start Method value",
+    "Reserved",
+    "ACPI Start Method",
+    "Reserved",
+    "Reserved",
+    "Reserved",
+    "Memory Mapped I/O",
+    "Command Response Buffer",
+    "Command Response Buffer with ACPI Start Method",
+    "Reserved",
+    "Reserved",
+    "Command Response Buffer with ARM SMC",
+    "Unknown Subtable Type"         /* Reserved */
+};
+
 static const char           *AcpiDmIvrsSubnames[] =
 {
     "Hardware Definition Block",
@@ -487,6 +510,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_MTMR, NULL,                   AcpiDmDumpMtmr, DtCompileMtmr,  TemplateMtmr},
     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
+    {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
     {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
@@ -494,6 +518,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
     {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
     {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
+    {ACPI_SIG_SDEV, AcpiDmTableInfoSdev,    AcpiDmDumpSdev, DtCompileSdev,  TemplateSdev},
     {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
     {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
     {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
@@ -501,7 +526,7 @@ const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
     {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat},
     {ACPI_SIG_STAO, NULL,                   AcpiDmDumpStao, DtCompileStao,  TemplateStao},
     {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
-    {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    NULL,           NULL,           TemplateTpm2},
+    {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
     {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
     {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc,    AcpiDmDumpVrtc, DtCompileVrtc,  TemplateVrtc},
     {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
@@ -917,6 +942,7 @@ AcpiDmDumpTable (
         case ACPI_DMT_PCCT:
         case ACPI_DMT_PMTT:
         case ACPI_DMT_PPTT:
+        case ACPI_DMT_SDEV:
         case ACPI_DMT_SRAT:
         case ACPI_DMT_ASF:
         case ACPI_DMT_HESTNTYP:
@@ -948,6 +974,7 @@ AcpiDmDumpTable (
         case ACPI_DMT_NAME4:
         case ACPI_DMT_SIG:
         case ACPI_DMT_LPIT:
+        case ACPI_DMT_TPM2:
 
             ByteLength = 4;
             break;
@@ -1583,6 +1610,20 @@ AcpiDmDumpTable (
                 CurrentOffset, NULL);
             break;
 
+        case ACPI_DMT_SDEV:
+
+            /* SDEV subtable types */
+
+            Temp8 = *Target;
+            if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
+            {
+                Temp8 = ACPI_SDEV_TYPE_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT8_FORMAT, *Target,
+                AcpiDmSdevSubnames[Temp8]);
+            break;
+
         case ACPI_DMT_SRAT:
 
             /* SRAT subtable types */
@@ -1597,6 +1638,22 @@ AcpiDmDumpTable (
                 AcpiDmSratSubnames[Temp8]);
             break;
 
+        case ACPI_DMT_TPM2:
+
+            /* TPM2 Start Method types */
+
+            Temp8 = *Target;
+            if (Temp8 > ACPI_TPM2_RESERVED)
+            {
+                Temp8 = ACPI_TPM2_RESERVED;
+            }
+
+            AcpiOsPrintf (UINT8_FORMAT, *Target,
+                AcpiDmTpm2Subnames[Temp8]);
+            break;
+
+
+
         case ACPI_DMT_FADTPM:
 
             /* FADT Preferred PM Profile names */
diff --git a/sys/contrib/dev/acpica/source/common/dmtbdump.c b/sys/contrib/dev/acpica/source/common/dmtbdump.c
index 9441ca494f..0f0697e3d7 100644
--- a/sys/contrib/dev/acpica/source/common/dmtbdump.c
+++ b/sys/contrib/dev/acpica/source/common/dmtbdump.c
@@ -623,7 +623,7 @@ AcpiDmDumpAsf (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
-    ACPI_ASF_INFO           *SubTable;
+    ACPI_ASF_INFO           *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
     UINT8                   *DataTable = NULL;
@@ -636,13 +636,13 @@ AcpiDmDumpAsf (
 
     /* No main table, only subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -650,7 +650,7 @@ AcpiDmDumpAsf (
 
         /* The actual type is the lower 7 bits of Type */
 
-        Type = (UINT8) (SubTable->Header.Type & 0x7F);
+        Type = (UINT8) (Subtable->Header.Type & 0x7F);
 
         switch (Type)
         {
@@ -663,9 +663,9 @@ AcpiDmDumpAsf (
 
             InfoTable = AcpiDmTableInfoAsf1;
             DataInfoTable = AcpiDmTableInfoAsf1a;
-            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
-            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
-            DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
+            DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
+            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
+            DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
             break;
 
@@ -673,9 +673,9 @@ AcpiDmDumpAsf (
 
             InfoTable = AcpiDmTableInfoAsf2;
             DataInfoTable = AcpiDmTableInfoAsf2a;
-            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
-            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
-            DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
+            DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
+            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
+            DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
             break;
 
@@ -687,20 +687,20 @@ AcpiDmDumpAsf (
         case ACPI_ASF_TYPE_ADDRESS:
 
             InfoTable = AcpiDmTableInfoAsf4;
-            DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
-            DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
+            DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
+            DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
             break;
 
         default:
 
             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
-                SubTable->Header.Type);
+                Subtable->Header.Type);
             return;
         }
 
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Header.Length, InfoTable);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Header.Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -762,15 +762,15 @@ AcpiDmDumpAsf (
 
         /* Point to next subtable */
 
-        if (!SubTable->Header.Length)
+        if (!Subtable->Header.Length)
         {
             AcpiOsPrintf ("Invalid zero subtable header length\n");
             return;
         }
 
-        Offset += SubTable->Header.Length;
-        SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable,
-            SubTable->Header.Length);
+        Offset += Subtable->Header.Length;
+        Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
+            Subtable->Header.Length);
     }
 }
 
@@ -793,7 +793,7 @@ AcpiDmDumpCpep (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_CPEP_POLLING       *SubTable;
+    ACPI_CPEP_POLLING       *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
 
@@ -808,12 +808,12 @@ AcpiDmDumpCpep (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
     while (Offset < Table->Length)
     {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Header.Length, AcpiDmTableInfoCpep0);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Header.Length, AcpiDmTableInfoCpep0);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -821,9 +821,9 @@ AcpiDmDumpCpep (
 
         /* Point to next subtable */
 
-        Offset += SubTable->Header.Length;
-        SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
-            SubTable->Header.Length);
+        Offset += Subtable->Header.Length;
+        Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
+            Subtable->Header.Length);
     }
 }
 
@@ -846,9 +846,9 @@ AcpiDmDumpCsrt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_CSRT_GROUP         *SubTable;
+    ACPI_CSRT_GROUP         *Subtable;
     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
-    ACPI_CSRT_DESCRIPTOR    *SubSubTable;
+    ACPI_CSRT_DESCRIPTOR    *SubSubtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
     UINT32                  SubOffset;
@@ -860,14 +860,14 @@ AcpiDmDumpCsrt (
 
     /* Subtables (Resource Groups) */
 
-    SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Resource group subtable */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoCsrt0);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoCsrt0);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -887,19 +887,19 @@ AcpiDmDumpCsrt (
             return;
         }
 
-        SubOffset += SubTable->SharedInfoLength;
+        SubOffset += Subtable->SharedInfoLength;
 
         /* Sub-Subtables (Resource Descriptors) */
 
-        SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
+        SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
             Offset + SubOffset);
 
-        while ((SubOffset < SubTable->Length) &&
+        while ((SubOffset < Subtable->Length) &&
               ((Offset + SubOffset) < Table->Length))
         {
             AcpiOsPrintf ("\n");
-            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
-                SubSubTable->Length, AcpiDmTableInfoCsrt2);
+            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
+                SubSubtable->Length, AcpiDmTableInfoCsrt2);
             if (ACPI_FAILURE (Status))
             {
                 return;
@@ -909,7 +909,7 @@ AcpiDmDumpCsrt (
 
             /* Resource-specific info buffer */
 
-            InfoLength = SubSubTable->Length - SubSubOffset;
+            InfoLength = SubSubtable->Length - SubSubOffset;
             if (InfoLength)
             {
                 Status = AcpiDmDumpTable (Length,
@@ -924,16 +924,16 @@ AcpiDmDumpCsrt (
 
             /* Point to next sub-subtable */
 
-            SubOffset += SubSubTable->Length;
-            SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
-                SubSubTable->Length);
+            SubOffset += SubSubtable->Length;
+            SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
+                SubSubtable->Length);
         }
 
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
-            SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
+            Subtable->Length);
     }
 }
 
@@ -956,7 +956,7 @@ AcpiDmDumpDbg2 (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_DBG2_DEVICE        *SubTable;
+    ACPI_DBG2_DEVICE        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
     UINT32                  i;
@@ -975,12 +975,12 @@ AcpiDmDumpDbg2 (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
     while (Offset < Table->Length)
     {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoDbg2Device);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoDbg2Device);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -988,15 +988,15 @@ AcpiDmDumpDbg2 (
 
         /* Dump the BaseAddress array */
 
-        for (i = 0; i < SubTable->RegisterCount; i++)
+        for (i = 0; i < Subtable->RegisterCount; i++)
         {
-            ArrayOffset = SubTable->BaseAddressOffset +
+            ArrayOffset = Subtable->BaseAddressOffset +
                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
             AbsoluteOffset = Offset + ArrayOffset;
-            Array = (UINT8 *) SubTable + ArrayOffset;
+            Array = (UINT8 *) Subtable + ArrayOffset;
 
             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
-                SubTable->Length, AcpiDmTableInfoDbg2Addr);
+                Subtable->Length, AcpiDmTableInfoDbg2Addr);
             if (ACPI_FAILURE (Status))
             {
                 return;
@@ -1005,15 +1005,15 @@ AcpiDmDumpDbg2 (
 
         /* Dump the AddressSize array */
 
-        for (i = 0; i < SubTable->RegisterCount; i++)
+        for (i = 0; i < Subtable->RegisterCount; i++)
         {
-            ArrayOffset = SubTable->AddressSizeOffset +
+            ArrayOffset = Subtable->AddressSizeOffset +
                 (sizeof (UINT32) * i);
             AbsoluteOffset = Offset + ArrayOffset;
-            Array = (UINT8 *) SubTable + ArrayOffset;
+            Array = (UINT8 *) Subtable + ArrayOffset;
 
             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
-                SubTable->Length, AcpiDmTableInfoDbg2Size);
+                Subtable->Length, AcpiDmTableInfoDbg2Size);
             if (ACPI_FAILURE (Status))
             {
                 return;
@@ -1023,12 +1023,12 @@ AcpiDmDumpDbg2 (
         /* Dump the Namestring (required) */
 
         AcpiOsPrintf ("\n");
-        ArrayOffset = SubTable->NamepathOffset;
+        ArrayOffset = Subtable->NamepathOffset;
         AbsoluteOffset = Offset + ArrayOffset;
-        Array = (UINT8 *) SubTable + ArrayOffset;
+        Array = (UINT8 *) Subtable + ArrayOffset;
 
         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
-            SubTable->Length, AcpiDmTableInfoDbg2Name);
+            Subtable->Length, AcpiDmTableInfoDbg2Name);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -1036,10 +1036,10 @@ AcpiDmDumpDbg2 (
 
         /* Dump the OemData (optional) */
 
-        if (SubTable->OemDataOffset)
+        if (Subtable->OemDataOffset)
         {
-            Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset,
-                Table, SubTable->OemDataLength,
+            Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
+                Table, Subtable->OemDataLength,
                 AcpiDmTableInfoDbg2OemData);
             if (ACPI_FAILURE (Status))
             {
@@ -1049,9 +1049,9 @@ AcpiDmDumpDbg2 (
 
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
-            SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
+            Subtable->Length);
     }
 }
 
@@ -1074,7 +1074,7 @@ AcpiDmDumpDmar (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_DMAR_HEADER        *SubTable;
+    ACPI_DMAR_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
     ACPI_DMTABLE_INFO       *InfoTable;
@@ -1094,14 +1094,14 @@ AcpiDmDumpDmar (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoDmarHdr);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoDmarHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -1109,7 +1109,7 @@ AcpiDmDumpDmar (
 
         AcpiOsPrintf ("\n");
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
 
@@ -1144,12 +1144,12 @@ AcpiDmDumpDmar (
         default:
 
             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
-                SubTable->Type);
+                Subtable->Type);
             return;
         }
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -1158,16 +1158,16 @@ AcpiDmDumpDmar (
         /*
          * Dump the optional device scope entries
          */
-        if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
-            (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
+        if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
+            (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
         {
             /* These types do not support device scopes */
 
             goto NextSubtable;
         }
 
-        ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
-        while (ScopeOffset < SubTable->Length)
+        ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
+        while (ScopeOffset < Subtable->Length)
         {
             AcpiOsPrintf ("\n");
             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
@@ -1208,9 +1208,9 @@ AcpiDmDumpDmar (
 NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable,
-            SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
+            Subtable->Length);
     }
 }
 
@@ -1343,7 +1343,7 @@ AcpiDmDumpEinj (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_WHEA_HEADER        *SubTable;
+    ACPI_WHEA_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
 
@@ -1358,11 +1358,11 @@ AcpiDmDumpEinj (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
         if (ACPI_FAILURE (Status))
         {
@@ -1372,7 +1372,7 @@ AcpiDmDumpEinj (
         /* Point to next subtable (each subtable is of fixed length) */
 
         Offset += sizeof (ACPI_WHEA_HEADER);
-        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
             sizeof (ACPI_WHEA_HEADER));
     }
 }
@@ -1396,7 +1396,7 @@ AcpiDmDumpErst (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_WHEA_HEADER        *SubTable;
+    ACPI_WHEA_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
 
@@ -1411,11 +1411,11 @@ AcpiDmDumpErst (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
         if (ACPI_FAILURE (Status))
         {
@@ -1425,7 +1425,7 @@ AcpiDmDumpErst (
         /* Point to next subtable (each subtable is of fixed length) */
 
         Offset += sizeof (ACPI_WHEA_HEADER);
-        SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
             sizeof (ACPI_WHEA_HEADER));
     }
 }
@@ -1449,7 +1449,7 @@ AcpiDmDumpFpdt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_FPDT_HEADER        *SubTable;
+    ACPI_FPDT_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
     ACPI_DMTABLE_INFO       *InfoTable;
@@ -1459,20 +1459,20 @@ AcpiDmDumpFpdt (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoFpdtHdr);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoFpdtHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_FPDT_TYPE_BOOT:
 
@@ -1487,31 +1487,31 @@ AcpiDmDumpFpdt (
         default:
 
             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            if (!SubTable->Length)
+            if (!Subtable->Length)
             {
                 AcpiOsPrintf ("Invalid zero length subtable\n");
                 return;
             }
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable,
-            SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
+            Subtable->Length);
     }
 }
 
@@ -1534,11 +1534,11 @@ AcpiDmDumpGtdt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_GTDT_HEADER        *SubTable;
+    ACPI_GTDT_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
     ACPI_DMTABLE_INFO       *InfoTable;
-    UINT32                  SubTableLength;
+    UINT32                  SubtableLength;
     UINT32                  GtCount;
     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
 
@@ -1553,34 +1553,34 @@ AcpiDmDumpGtdt (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoGtdtHdr);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoGtdtHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
         GtCount = 0;
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_GTDT_TYPE_TIMER_BLOCK:
 
-            SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
+            SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
-                SubTable))->TimerCount;
+                Subtable))->TimerCount;
 
             InfoTable = AcpiDmTableInfoGtdt0;
             break;
 
         case ACPI_GTDT_TYPE_WATCHDOG:
 
-            SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
+            SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
 
             InfoTable = AcpiDmTableInfoGtdt1;
             break;
@@ -1590,12 +1590,12 @@ AcpiDmDumpGtdt (
             /* Cannot continue on unknown type - no length */
 
             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
             return;
         }
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -1603,15 +1603,15 @@ AcpiDmDumpGtdt (
 
         /* Point to end of current subtable (each subtable above is of fixed length) */
 
-        Offset += SubTableLength;
+        Offset += SubtableLength;
 
         /* If there are any Gt Timer Blocks from above, dump them now */
 
         if (GtCount)
         {
             GtxTable = ACPI_ADD_PTR (
-                ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
-            SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
+                ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
+            SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
 
             while (GtCount)
             {
@@ -1630,7 +1630,7 @@ AcpiDmDumpGtdt (
 
         /* Point to next subtable */
 
-        SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
+        Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
     }
 }
 
@@ -1653,11 +1653,11 @@ AcpiDmDumpHest (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_HEST_HEADER        *SubTable;
+    ACPI_HEST_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
     ACPI_DMTABLE_INFO       *InfoTable;
-    UINT32                  SubTableLength;
+    UINT32                  SubtableLength;
     UINT32                  BankCount;
     ACPI_HEST_IA_ERROR_BANK *BankTable;
 
@@ -1672,70 +1672,70 @@ AcpiDmDumpHest (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         BankCount = 0;
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_HEST_TYPE_IA32_CHECK:
 
             InfoTable = AcpiDmTableInfoHest0;
-            SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
+            SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
-                SubTable))->NumHardwareBanks;
+                Subtable))->NumHardwareBanks;
             break;
 
         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
 
             InfoTable = AcpiDmTableInfoHest1;
-            SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
+            SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
-                SubTable))->NumHardwareBanks;
+                Subtable))->NumHardwareBanks;
             break;
 
         case ACPI_HEST_TYPE_IA32_NMI:
 
             InfoTable = AcpiDmTableInfoHest2;
-            SubTableLength = sizeof (ACPI_HEST_IA_NMI);
+            SubtableLength = sizeof (ACPI_HEST_IA_NMI);
             break;
 
         case ACPI_HEST_TYPE_AER_ROOT_PORT:
 
             InfoTable = AcpiDmTableInfoHest6;
-            SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
+            SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
             break;
 
         case ACPI_HEST_TYPE_AER_ENDPOINT:
 
             InfoTable = AcpiDmTableInfoHest7;
-            SubTableLength = sizeof (ACPI_HEST_AER);
+            SubtableLength = sizeof (ACPI_HEST_AER);
             break;
 
         case ACPI_HEST_TYPE_AER_BRIDGE:
 
             InfoTable = AcpiDmTableInfoHest8;
-            SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
+            SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
             break;
 
         case ACPI_HEST_TYPE_GENERIC_ERROR:
 
             InfoTable = AcpiDmTableInfoHest9;
-            SubTableLength = sizeof (ACPI_HEST_GENERIC);
+            SubtableLength = sizeof (ACPI_HEST_GENERIC);
             break;
 
         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
 
             InfoTable = AcpiDmTableInfoHest10;
-            SubTableLength = sizeof (ACPI_HEST_GENERIC_V2);
+            SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
             break;
 
         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
 
             InfoTable = AcpiDmTableInfoHest11;
-            SubTableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
+            SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
-                SubTable))->NumHardwareBanks;
+                Subtable))->NumHardwareBanks;
             break;
 
         default:
@@ -1743,13 +1743,13 @@ AcpiDmDumpHest (
             /* Cannot continue on unknown type - no length */
 
             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
             return;
         }
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTableLength, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            SubtableLength, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -1757,15 +1757,15 @@ AcpiDmDumpHest (
 
         /* Point to end of current subtable (each subtable above is of fixed length) */
 
-        Offset += SubTableLength;
+        Offset += SubtableLength;
 
         /* If there are any (fixed-length) Error Banks from above, dump them now */
 
         if (BankCount)
         {
-            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable,
-                SubTableLength);
-            SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
+            BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
+                SubtableLength);
+            SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
 
             while (BankCount)
             {
@@ -1785,7 +1785,7 @@ AcpiDmDumpHest (
 
         /* Point to next subtable */
 
-        SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
+        Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
     }
 }
 
@@ -1811,7 +1811,7 @@ AcpiDmDumpHmat (
     ACPI_HMAT_LOCALITY      *HmatLocality;
     ACPI_HMAT_CACHE         *HmatCache;
     UINT32                  Offset;
-    UINT32                  SubTableOffset;
+    UINT32                  SubtableOffset;
     UINT32                  Length;
     ACPI_DMTABLE_INFO       *InfoTable;
     UINT32                  i, j;
@@ -1829,7 +1829,7 @@ AcpiDmDumpHmat (
     while (Offset < Table->Length)
     {
         AcpiOsPrintf ("\n");
-        SubTableOffset = 0;
+        SubtableOffset = 0;
 
         /* Dump HMAT structure header */
 
@@ -1873,7 +1873,7 @@ AcpiDmDumpHmat (
 
             /* Attempt to continue */
 
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
         /* Dump HMAT structure body */
@@ -1897,11 +1897,11 @@ AcpiDmDumpHmat (
         case ACPI_HMAT_TYPE_LOCALITY:
 
             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
-            SubTableOffset = sizeof (ACPI_HMAT_LOCALITY);
+            SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
 
             /* Dump initiator proximity domains */
 
-            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+            if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
             {
                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
@@ -1909,15 +1909,15 @@ AcpiDmDumpHmat (
             }
             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
             {
-                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
-                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
+                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                     4, AcpiDmTableInfoHmat1a);
-                SubTableOffset += 4;
+                SubtableOffset += 4;
             }
 
             /* Dump target proximity domains */
 
-            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+            if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
             {
                 AcpiOsPrintf ("Invalid target proximity domain number\n");
@@ -1925,15 +1925,15 @@ AcpiDmDumpHmat (
             }
             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
             {
-                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
-                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
+                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                     4, AcpiDmTableInfoHmat1b);
-                SubTableOffset += 4;
+                SubtableOffset += 4;
             }
 
             /* Dump latency/bandwidth entris */
 
-            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+            if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
                          HmatLocality->NumberOfTargetPDs * 2))
             {
@@ -1944,10 +1944,10 @@ AcpiDmDumpHmat (
             {
                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
                 {
-                    Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
-                        ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                    Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
+                        ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                         2, AcpiDmTableInfoHmat1c);
-                    SubTableOffset += 2;
+                    SubtableOffset += 2;
                 }
             }
             break;
@@ -1955,11 +1955,11 @@ AcpiDmDumpHmat (
         case ACPI_HMAT_TYPE_CACHE:
 
             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
-            SubTableOffset = sizeof (ACPI_HMAT_CACHE);
+            SubtableOffset = sizeof (ACPI_HMAT_CACHE);
 
             /* Dump SMBIOS handles */
 
-            if ((UINT32)(HmatStruct->Length - SubTableOffset) <
+            if ((UINT32)(HmatStruct->Length - SubtableOffset) <
                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
             {
                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
@@ -1967,10 +1967,10 @@ AcpiDmDumpHmat (
             }
             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
             {
-                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
-                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset),
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
+                    ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
                     2, AcpiDmTableInfoHmat2a);
-                SubTableOffset += 2;
+                SubtableOffset += 2;
             }
             break;
 
@@ -1979,7 +1979,7 @@ AcpiDmDumpHmat (
             break;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next HMAT structure subtable */
 
         Offset += (HmatStruct->Length);
@@ -2104,7 +2104,7 @@ AcpiDmDumpIort (
                 AcpiOsPrintf ("Invalid zero length IORT node\n");
                 return;
             }
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
         /* Dump the node subtable header */
@@ -2227,7 +2227,7 @@ AcpiDmDumpIort (
             NodeOffset += Length;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next node subtable */
 
         Offset += IortNode->Length;
@@ -2260,7 +2260,7 @@ AcpiDmDumpIvrs (
     UINT32                  EntryLength;
     UINT32                  EntryType;
     ACPI_IVRS_DE_HEADER     *DeviceEntry;
-    ACPI_IVRS_HEADER        *SubTable;
+    ACPI_IVRS_HEADER        *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
 
 
@@ -2274,20 +2274,20 @@ AcpiDmDumpIvrs (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoIvrsHdr);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoIvrsHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_IVRS_TYPE_HARDWARE:
 
@@ -2304,23 +2304,23 @@ AcpiDmDumpIvrs (
         default:
 
             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            if (!SubTable->Length)
+            if (!Subtable->Length)
             {
                 AcpiOsPrintf ("Invalid zero length subtable\n");
                 return;
             }
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
         /* Dump the subtable */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -2328,13 +2328,13 @@ AcpiDmDumpIvrs (
 
         /* The hardware subtable can contain multiple device entries */
 
-        if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
+        if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE)
         {
             EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
-            DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
+            DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
                 sizeof (ACPI_IVRS_HARDWARE));
 
-            while (EntryOffset < (Offset + SubTable->Length))
+            while (EntryOffset < (Offset + Subtable->Length))
             {
                 AcpiOsPrintf ("\n");
                 /*
@@ -2409,11 +2409,11 @@ AcpiDmDumpIvrs (
             }
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
     }
 }
 
@@ -2438,33 +2438,33 @@ AcpiDmDumpLpit (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_LPIT_HEADER        *SubTable;
+    ACPI_LPIT_HEADER        *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
     ACPI_DMTABLE_INFO       *InfoTable;
-    UINT32                  SubTableLength;
+    UINT32                  SubtableLength;
 
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
             sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
 
             InfoTable = AcpiDmTableInfoLpit0;
-            SubTableLength = sizeof (ACPI_LPIT_NATIVE);
+            SubtableLength = sizeof (ACPI_LPIT_NATIVE);
             break;
 
         default:
@@ -2472,12 +2472,12 @@ AcpiDmDumpLpit (
             /* Cannot continue on unknown type - no length */
 
             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
             return;
         }
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTableLength, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            SubtableLength, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -2487,8 +2487,8 @@ AcpiDmDumpLpit (
 
         /* Point to next subtable */
 
-        Offset += SubTableLength;
-        SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
+        Offset += SubtableLength;
+        Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
     }
 }
 
@@ -2511,7 +2511,7 @@ AcpiDmDumpMadt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_SUBTABLE_HEADER    *SubTable;
+    ACPI_SUBTABLE_HEADER    *Subtable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
     ACPI_DMTABLE_INFO       *InfoTable;
@@ -2527,20 +2527,20 @@ AcpiDmDumpMadt (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoMadtHdr);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoMadtHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_MADT_TYPE_LOCAL_APIC:
 
@@ -2625,32 +2625,32 @@ AcpiDmDumpMadt (
         default:
 
             AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            if (!SubTable->Length)
+            if (!Subtable->Length)
             {
                 AcpiOsPrintf ("Invalid zero length subtable\n");
                 return;
             }
 
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable,
-            SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
+            Subtable->Length);
     }
 }
 
@@ -2673,7 +2673,7 @@ AcpiDmDumpMcfg (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
-    ACPI_MCFG_ALLOCATION    *SubTable;
+    ACPI_MCFG_ALLOCATION    *Subtable;
 
 
     /* Main table */
@@ -2686,7 +2686,7 @@ AcpiDmDumpMcfg (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
     while (Offset < Table->Length)
     {
         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
@@ -2697,7 +2697,7 @@ AcpiDmDumpMcfg (
         }
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
         if (ACPI_FAILURE (Status))
         {
@@ -2707,7 +2707,7 @@ AcpiDmDumpMcfg (
         /* Point to next subtable (each subtable is of fixed length) */
 
         Offset += sizeof (ACPI_MCFG_ALLOCATION);
-        SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
             sizeof (ACPI_MCFG_ALLOCATION));
     }
 }
@@ -2731,11 +2731,11 @@ AcpiDmDumpMpst (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
-    ACPI_MPST_POWER_NODE    *SubTable0;
-    ACPI_MPST_POWER_STATE   *SubTable0A;
-    ACPI_MPST_COMPONENT     *SubTable0B;
-    ACPI_MPST_DATA_HDR      *SubTable1;
-    ACPI_MPST_POWER_DATA    *SubTable2;
+    ACPI_MPST_POWER_NODE    *Subtable0;
+    ACPI_MPST_POWER_STATE   *Subtable0A;
+    ACPI_MPST_COMPONENT     *Subtable0B;
+    ACPI_MPST_DATA_HDR      *Subtable1;
+    ACPI_MPST_POWER_DATA    *Subtable2;
     UINT16                  SubtableCount;
     UINT32                  PowerStateCount;
     UINT32                  ComponentCount;
@@ -2752,12 +2752,12 @@ AcpiDmDumpMpst (
     /* Subtable: Memory Power Node(s) */
 
     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
-    SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
+    Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
 
     while ((Offset < Table->Length) && SubtableCount)
     {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
         if (ACPI_FAILURE (Status))
         {
@@ -2766,33 +2766,33 @@ AcpiDmDumpMpst (
 
         /* Extract the sub-subtable counts */
 
-        PowerStateCount = SubTable0->NumPowerStates;
-        ComponentCount = SubTable0->NumPhysicalComponents;
+        PowerStateCount = Subtable0->NumPowerStates;
+        ComponentCount = Subtable0->NumPhysicalComponents;
         Offset += sizeof (ACPI_MPST_POWER_NODE);
 
         /* Sub-subtables - Memory Power State Structure(s) */
 
-        SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
+        Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
             sizeof (ACPI_MPST_POWER_NODE));
 
         while (PowerStateCount)
         {
             AcpiOsPrintf ("\n");
-            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
+            Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
             if (ACPI_FAILURE (Status))
             {
                 return;
             }
 
-            SubTable0A++;
+            Subtable0A++;
             PowerStateCount--;
             Offset += sizeof (ACPI_MPST_POWER_STATE);
        }
 
         /* Sub-subtables - Physical Component ID Structure(s) */
 
-        SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
+        Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
 
         if (ComponentCount)
         {
@@ -2801,14 +2801,14 @@ AcpiDmDumpMpst (
 
         while (ComponentCount)
         {
-            Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
+            Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
             if (ACPI_FAILURE (Status))
             {
                 return;
             }
 
-            SubTable0B++;
+            Subtable0B++;
             ComponentCount--;
             Offset += sizeof (ACPI_MPST_COMPONENT);
         }
@@ -2816,42 +2816,42 @@ AcpiDmDumpMpst (
         /* Point to next Memory Power Node subtable */
 
         SubtableCount--;
-        SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
+        Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
             sizeof (ACPI_MPST_POWER_NODE) +
-            (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
-            (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
+            (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
+            (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
     }
 
     /* Subtable: Count of Memory Power State Characteristic structures */
 
     AcpiOsPrintf ("\n");
-    SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
-    Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
+    Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
+    Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
     if (ACPI_FAILURE (Status))
     {
         return;
     }
 
-    SubtableCount = SubTable1->CharacteristicsCount;
+    SubtableCount = Subtable1->CharacteristicsCount;
     Offset += sizeof (ACPI_MPST_DATA_HDR);
 
     /* Subtable: Memory Power State Characteristics structure(s) */
 
-    SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1,
+    Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
         sizeof (ACPI_MPST_DATA_HDR));
 
     while ((Offset < Table->Length) && SubtableCount)
     {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        SubTable2++;
+        Subtable2++;
         SubtableCount--;
         Offset += sizeof (ACPI_MPST_POWER_DATA);
     }
@@ -2876,7 +2876,7 @@ AcpiDmDumpMsct (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
-    ACPI_MSCT_PROXIMITY     *SubTable;
+    ACPI_MSCT_PROXIMITY     *Subtable;
 
 
     /* Main table */
@@ -2889,13 +2889,13 @@ AcpiDmDumpMsct (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
         if (ACPI_FAILURE (Status))
         {
@@ -2905,7 +2905,7 @@ AcpiDmDumpMsct (
         /* Point to next subtable */
 
         Offset += sizeof (ACPI_MSCT_PROXIMITY);
-        SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
             sizeof (ACPI_MSCT_PROXIMITY));
     }
 }
@@ -2929,7 +2929,7 @@ AcpiDmDumpMtmr (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
-    ACPI_MTMR_ENTRY         *SubTable;
+    ACPI_MTMR_ENTRY         *Subtable;
 
 
     /* Main table */
@@ -2942,13 +2942,13 @@ AcpiDmDumpMtmr (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
         if (ACPI_FAILURE (Status))
         {
@@ -2958,7 +2958,7 @@ AcpiDmDumpMtmr (
         /* Point to next subtable */
 
         Offset += sizeof (ACPI_MTMR_ENTRY);
-        SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Subtable,
             sizeof (ACPI_MTMR_ENTRY));
     }
 }
@@ -2984,7 +2984,7 @@ AcpiDmDumpNfit (
     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
     UINT32                  FieldOffset = 0;
     UINT32                  Length;
-    ACPI_NFIT_HEADER        *SubTable;
+    ACPI_NFIT_HEADER        *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
@@ -3002,20 +3002,20 @@ AcpiDmDumpNfit (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* NFIT subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoNfitHdr);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoNfitHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
 
@@ -3032,13 +3032,13 @@ AcpiDmDumpNfit (
             /* Has a variable number of 32-bit values at the end */
 
             InfoTable = AcpiDmTableInfoNfit2;
-            Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable);
+            Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
             break;
 
         case ACPI_NFIT_TYPE_SMBIOS:
 
-            SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable);
+            SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
             InfoTable = AcpiDmTableInfoNfit3;
             break;
 
@@ -3057,27 +3057,27 @@ AcpiDmDumpNfit (
             /* Has a variable number of 64-bit addresses at the end */
 
             InfoTable = AcpiDmTableInfoNfit6;
-            Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable);
+            Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
             break;
 
         default:
             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            if (!SubTable->Length)
+            if (!Subtable->Length)
             {
                 AcpiOsPrintf ("Invalid zero length subtable\n");
                 return;
             }
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -3085,7 +3085,7 @@ AcpiDmDumpNfit (
 
         /* Per-subtable variable-length fields */
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_NFIT_TYPE_INTERLEAVE:
 
@@ -3105,7 +3105,7 @@ AcpiDmDumpNfit (
 
         case ACPI_NFIT_TYPE_SMBIOS:
 
-            Length = SubTable->Length -
+            Length = Subtable->Length -
                 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
 
             if (Length)
@@ -3142,11 +3142,11 @@ AcpiDmDumpNfit (
             break;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
     }
 }
 
@@ -3169,7 +3169,7 @@ AcpiDmDumpPcct (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_PCCT_SUBSPACE      *SubTable;
+    ACPI_PCCT_SUBSPACE      *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
@@ -3185,20 +3185,20 @@ AcpiDmDumpPcct (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Header.Type)
+        switch (Subtable->Header.Type)
         {
         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
 
@@ -3229,13 +3229,67 @@ AcpiDmDumpPcct (
 
             AcpiOsPrintf (
                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
-                SubTable->Header.Type);
+                Subtable->Header.Type);
+            return;
+        }
+
+        AcpiOsPrintf ("\n");
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Header.Length, InfoTable);
+        if (ACPI_FAILURE (Status))
+        {
             return;
         }
 
+        /* Point to next subtable */
+
+        Offset += Subtable->Header.Length;
+        Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
+            Subtable->Header.Length);
+    }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmDumpPdtt
+ *
+ * PARAMETERS:  Table               - A PDTT table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
+ *              table that contains an open-ended number of IDs
+ *              at the end of the table.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpPdtt (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_PDTT_CHANNEL       *Subtable;
+    UINT32                  Length = Table->Length;
+    UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
+
+
+    /* Main table */
+
+    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+
+    /* Subtables. Currently there is only one type, but can be multiples */
+
+    Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
+    while (Offset < Table->Length)
+    {
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Header.Length, InfoTable);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -3243,9 +3297,9 @@ AcpiDmDumpPcct (
 
         /* Point to next subtable */
 
-        Offset += SubTable->Header.Length;
-        SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
-            SubTable->Header.Length);
+        Offset += sizeof (ACPI_PDTT_CHANNEL);
+        Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
+            sizeof (ACPI_PDTT_CHANNEL));
     }
 }
 
@@ -3268,9 +3322,9 @@ AcpiDmDumpPmtt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_PMTT_HEADER        *SubTable;
-    ACPI_PMTT_HEADER        *MemSubTable;
-    ACPI_PMTT_HEADER        *DimmSubTable;
+    ACPI_PMTT_HEADER        *Subtable;
+    ACPI_PMTT_HEADER        *MemSubtable;
+    ACPI_PMTT_HEADER        *DimmSubtable;
     ACPI_PMTT_DOMAIN        *DomainArray;
     UINT32                  Length = Table->Length;
     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
@@ -3290,14 +3344,14 @@ AcpiDmDumpPmtt (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoPmttHdr);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoPmttHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -3305,18 +3359,18 @@ AcpiDmDumpPmtt (
 
         /* Only Socket subtables are expected at this level */
 
-        if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
+        if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
         {
             AcpiOsPrintf (
                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
-                SubTable->Type);
+                Subtable->Type);
             return;
         }
 
         /* Dump the fixed-length portion of the subtable */
 
-        Status = AcpiDmDumpTable (Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoPmtt0);
+        Status = AcpiDmDumpTable (Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoPmtt0);
         if (ACPI_FAILURE (Status))
         {
             return;
@@ -3325,18 +3379,18 @@ AcpiDmDumpPmtt (
         /* Walk the memory controller subtables */
 
         MemOffset = sizeof (ACPI_PMTT_SOCKET);
-        MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
+        MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
             sizeof (ACPI_PMTT_SOCKET));
 
         while (((Offset + MemOffset) < Table->Length) &&
-            (MemOffset < SubTable->Length))
+            (MemOffset < Subtable->Length))
         {
             /* Common subtable header */
 
             AcpiOsPrintf ("\n");
             Status = AcpiDmDumpTable (Length,
-                Offset + MemOffset, MemSubTable,
-                MemSubTable->Length, AcpiDmTableInfoPmttHdr);
+                Offset + MemOffset, MemSubtable,
+                MemSubtable->Length, AcpiDmTableInfoPmttHdr);
             if (ACPI_FAILURE (Status))
             {
                 return;
@@ -3344,19 +3398,19 @@ AcpiDmDumpPmtt (
 
             /* Only memory controller subtables are expected at this level */
 
-            if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
+            if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
             {
                 AcpiOsPrintf (
                     "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
-                    MemSubTable->Type);
+                    MemSubtable->Type);
                 return;
             }
 
             /* Dump the fixed-length portion of the controller subtable */
 
             Status = AcpiDmDumpTable (Length,
-                Offset + MemOffset, MemSubTable,
-                MemSubTable->Length, AcpiDmTableInfoPmtt1);
+                Offset + MemOffset, MemSubtable,
+                MemSubtable->Length, AcpiDmTableInfoPmtt1);
             if (ACPI_FAILURE (Status))
             {
                 return;
@@ -3364,13 +3418,13 @@ AcpiDmDumpPmtt (
 
             /* Walk the variable count of proximity domains */
 
-            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
+            DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
             DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
-            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
+            DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
                 sizeof (ACPI_PMTT_CONTROLLER));
 
             while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
-                ((MemOffset + DomainOffset) < SubTable->Length) &&
+                ((MemOffset + DomainOffset) < Subtable->Length) &&
                 DomainCount)
             {
                 Status = AcpiDmDumpTable (Length,
@@ -3395,18 +3449,18 @@ AcpiDmDumpPmtt (
             /* Walk the physical component (DIMM) subtables */
 
             DimmOffset = DomainOffset;
-            DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
+            DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
                 DomainOffset);
 
             while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
-                (DimmOffset < MemSubTable->Length))
+                (DimmOffset < MemSubtable->Length))
             {
                 /* Common subtable header */
 
                 AcpiOsPrintf ("\n");
                 Status = AcpiDmDumpTable (Length,
-                    Offset + MemOffset + DimmOffset, DimmSubTable,
-                    DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
+                    Offset + MemOffset + DimmOffset, DimmSubtable,
+                    DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
                 if (ACPI_FAILURE (Status))
                 {
                     return;
@@ -3414,19 +3468,19 @@ AcpiDmDumpPmtt (
 
                 /* Only DIMM subtables are expected at this level */
 
-                if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
+                if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
                 {
                     AcpiOsPrintf (
                         "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
-                        DimmSubTable->Type);
+                        DimmSubtable->Type);
                     return;
                 }
 
                 /* Dump the fixed-length DIMM subtable */
 
                 Status = AcpiDmDumpTable (Length,
-                    Offset + MemOffset + DimmOffset, DimmSubTable,
-                    DimmSubTable->Length, AcpiDmTableInfoPmtt2);
+                    Offset + MemOffset + DimmOffset, DimmSubtable,
+                    DimmSubtable->Length, AcpiDmTableInfoPmtt2);
                 if (ACPI_FAILURE (Status))
                 {
                     return;
@@ -3434,23 +3488,23 @@ AcpiDmDumpPmtt (
 
                 /* Point to next DIMM subtable */
 
-                DimmOffset += DimmSubTable->Length;
-                DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
-                    DimmSubTable, DimmSubTable->Length);
+                DimmOffset += DimmSubtable->Length;
+                DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
+                    DimmSubtable, DimmSubtable->Length);
             }
 
             /* Point to next Controller subtable */
 
-            MemOffset += MemSubTable->Length;
-            MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
-                MemSubTable, MemSubTable->Length);
+            MemOffset += MemSubtable->Length;
+            MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
+                MemSubtable, MemSubtable->Length);
         }
 
         /* Point to next Socket subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
-            SubTable, SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
+            Subtable, Subtable->Length);
     }
 }
 
@@ -3473,10 +3527,10 @@ AcpiDmDumpPptt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_SUBTABLE_HEADER    *SubTable;
+    ACPI_SUBTABLE_HEADER    *Subtable;
     ACPI_PPTT_PROCESSOR     *PpttProcessor;
     UINT8                   Length;
-    UINT8                   SubTableOffset;
+    UINT8                   SubtableOffset;
     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
     ACPI_DMTABLE_INFO       *InfoTable;
     UINT32                  i;
@@ -3493,20 +3547,20 @@ AcpiDmDumpPptt (
 
         /* Common subtable header */
 
-        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
-        if (SubTable->Length < sizeof (ACPI_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);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoPpttHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_PPTT_TYPE_PROCESSOR:
 
@@ -3529,35 +3583,35 @@ AcpiDmDumpPptt (
         default:
 
             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
-        if (SubTable->Length < Length)
+        if (Subtable->Length < Length)
         {
             AcpiOsPrintf ("Invalid subtable length\n");
             return;
         }
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
-        SubTableOffset = Length;
+        SubtableOffset = Length;
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_PPTT_TYPE_PROCESSOR:
 
-            PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, SubTable);
+            PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
 
             /* Dump SMBIOS handles */
 
-            if ((UINT8)(SubTable->Length - SubTableOffset) <
+            if ((UINT8)(Subtable->Length - SubtableOffset) <
                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
             {
                 AcpiOsPrintf ("Invalid private resource number\n");
@@ -3565,10 +3619,10 @@ AcpiDmDumpPptt (
             }
             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
             {
-                Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset,
-                    ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTableOffset),
+                Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
+                    ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
                     4, AcpiDmTableInfoPptt0a);
-                SubTableOffset += 4;
+                SubtableOffset += 4;
             }
             break;
 
@@ -3577,10 +3631,10 @@ AcpiDmDumpPptt (
             break;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
+        Offset += Subtable->Length;
     }
 }
 
@@ -3603,7 +3657,7 @@ AcpiDmDumpS3pt (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
-    ACPI_FPDT_HEADER        *SubTable;
+    ACPI_FPDT_HEADER        *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
 
@@ -3616,20 +3670,20 @@ AcpiDmDumpS3pt (
         return 0;
     }
 
-    SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
     while (Offset < S3ptTable->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoS3ptHdr);
+        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoS3ptHdr);
         if (ACPI_FAILURE (Status))
         {
             return 0;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_S3PT_TYPE_RESUME:
 
@@ -3644,37 +3698,205 @@ AcpiDmDumpS3pt (
         default:
 
             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            if (!SubTable->Length)
+            if (!Subtable->Length)
             {
                 AcpiOsPrintf ("Invalid zero length subtable\n");
                 return 0;
             }
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return 0;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
     }
 
     return (S3ptTable->Length);
 }
 
 
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmDumpSdev
+ *
+ * PARAMETERS:  Table               - A SDEV table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
+ *              table that contains variable strings and vendor data.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpSdev (
+    ACPI_TABLE_HEADER       *Table)
+{
+    ACPI_STATUS             Status;
+    ACPI_SDEV_HEADER        *Subtable;
+    ACPI_SDEV_PCIE          *Pcie;
+    ACPI_SDEV_NAMESPACE     *Namesp;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    UINT32                  Length = Table->Length;
+    UINT32                  Offset = sizeof (ACPI_TABLE_SDEV);
+    UINT16                  PathOffset;
+    UINT16                  PathLength;
+    UINT16                  VendorDataOffset;
+    UINT16                  VendorDataLength;
+
+
+    /* Main table */
+
+    Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+
+    /* Subtables */
+
+    Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
+    while (Offset < Table->Length)
+    {
+        /* Common subtable header */
+
+        AcpiOsPrintf ("\n");
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoSdevHdr);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        switch (Subtable->Type)
+        {
+        case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
+
+            InfoTable = AcpiDmTableInfoSdev0;
+            break;
+
+        case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
+
+            InfoTable = AcpiDmTableInfoSdev1;
+            break;
+
+        default:
+            goto NextSubtable;
+        }
+
+        AcpiOsPrintf ("\n");
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        switch (Subtable->Type)
+        {
+        case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
+
+            /* Dump the PCIe device ID(s) */
+
+            Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
+            PathOffset = Namesp->DeviceIdOffset;
+            PathLength = Namesp->DeviceIdLength;
+
+            if (PathLength)
+            {
+                Status = AcpiDmDumpTable (Table->Length, 0,
+                    ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
+                    PathLength, AcpiDmTableInfoSdev0a);
+                if (ACPI_FAILURE (Status))
+                {
+                    return;
+                }
+            }
+
+            /* Dump the vendor-specific data */
+
+            VendorDataLength =
+                Namesp->VendorDataLength;
+            VendorDataOffset =
+                Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
+
+            if (VendorDataLength)
+            {
+                Status = AcpiDmDumpTable (Table->Length, 0,
+                    ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
+                    VendorDataLength, AcpiDmTableInfoSdev1b);
+                if (ACPI_FAILURE (Status))
+                {
+                    return;
+                }
+            }
+            break;
+
+        case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
+
+            /* PCI path substructures */
+
+            Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
+            PathOffset = Pcie->PathOffset;
+            PathLength = Pcie->PathLength;
+
+            while (PathLength)
+            {
+                Status = AcpiDmDumpTable (Table->Length,
+                    PathOffset + Offset,
+                    ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
+                    sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
+                if (ACPI_FAILURE (Status))
+                {
+                    return;
+                }
+
+                PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
+                PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
+            }
+
+            /* VendorData */
+
+            VendorDataLength = Pcie->VendorDataLength;
+            VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
+
+            if (VendorDataLength)
+            {
+                Status = AcpiDmDumpTable (Table->Length, 0,
+                    ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
+                    VendorDataLength, AcpiDmTableInfoSdev1b);
+            }
+            break;
+
+        default:
+            goto NextSubtable;
+        }
+
+NextSubtable:
+        /* Point to next subtable */
+
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
+            Subtable->Length);
+    }
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmDumpSlic
@@ -3794,7 +4016,7 @@ AcpiDmDumpSrat (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
-    ACPI_SUBTABLE_HEADER    *SubTable;
+    ACPI_SUBTABLE_HEADER    *Subtable;
     ACPI_DMTABLE_INFO       *InfoTable;
 
 
@@ -3808,20 +4030,20 @@ AcpiDmDumpSrat (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, AcpiDmTableInfoSratHdr);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, AcpiDmTableInfoSratHdr);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-        switch (SubTable->Type)
+        switch (Subtable->Type)
         {
         case ACPI_SRAT_TYPE_CPU_AFFINITY:
 
@@ -3850,32 +4072,32 @@ AcpiDmDumpSrat (
 
         default:
             AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
-                SubTable->Type);
+                Subtable->Type);
 
             /* Attempt to continue */
 
-            if (!SubTable->Length)
+            if (!Subtable->Length)
             {
                 AcpiOsPrintf ("Invalid zero length subtable\n");
                 return;
             }
-            goto NextSubTable;
+            goto NextSubtable;
         }
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
-            SubTable->Length, InfoTable);
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+            Subtable->Length, InfoTable);
         if (ACPI_FAILURE (Status))
         {
             return;
         }
 
-NextSubTable:
+NextSubtable:
         /* Point to next subtable */
 
-        Offset += SubTable->Length;
-        SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable,
-            SubTable->Length);
+        Offset += Subtable->Length;
+        Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
+            Subtable->Length);
     }
 }
 
@@ -3954,7 +4176,7 @@ AcpiDmDumpTcpa (
     UINT32                  Offset = sizeof (ACPI_TABLE_TCPA_HDR);
     ACPI_TABLE_TCPA_HDR     *CommonHeader = ACPI_CAST_PTR (
                                 ACPI_TABLE_TCPA_HDR, Table);
-    ACPI_TABLE_TCPA_HDR     *SubTable = ACPI_ADD_PTR (
+    ACPI_TABLE_TCPA_HDR     *Subtable = ACPI_ADD_PTR (
                                 ACPI_TABLE_TCPA_HDR, Table, Offset);
     ACPI_STATUS             Status;
 
@@ -3976,13 +4198,13 @@ AcpiDmDumpTcpa (
     {
     case ACPI_TCPA_CLIENT_TABLE:
 
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             Table->Length - Offset, AcpiDmTableInfoTcpaClient);
         break;
 
     case ACPI_TCPA_SERVER_TABLE:
 
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             Table->Length - Offset, AcpiDmTableInfoTcpaServer);
         break;
 
@@ -4001,6 +4223,64 @@ AcpiDmDumpTcpa (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiDmDumpTpm2
+ *
+ * PARAMETERS:  Table               - A TPM2 table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Format the contents of a TPM2.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpTpm2 (
+    ACPI_TABLE_HEADER       *Table)
+{
+    UINT32                  Offset = sizeof (ACPI_TABLE_TPM2);
+    ACPI_TABLE_TPM2         *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM2, Table);
+    ACPI_TPM2_TRAILER       *Subtable = ACPI_ADD_PTR (ACPI_TPM2_TRAILER, Table, Offset);
+    ACPI_TPM2_ARM_SMC       *ArmSubtable;
+    ACPI_STATUS             Status;
+
+
+    /* Main table */
+
+    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+
+    AcpiOsPrintf ("\n");
+    Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+        Table->Length - Offset, AcpiDmTableInfoTpm2a);
+    if (ACPI_FAILURE (Status))
+    {
+        return;
+    }
+
+    switch (CommonHeader->StartMethod)
+    {
+    case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
+
+        ArmSubtable = ACPI_ADD_PTR (ACPI_TPM2_ARM_SMC, Subtable,
+            sizeof (ACPI_TPM2_TRAILER));
+        Offset += sizeof (ACPI_TPM2_TRAILER);
+
+        AcpiOsPrintf ("\n");
+        Status = AcpiDmDumpTable (Table->Length, Offset, ArmSubtable,
+            Table->Length - Offset, AcpiDmTableInfoTpm211);
+        break;
+
+    default:
+        break;
+    }
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDmDumpVrtc
@@ -4019,7 +4299,7 @@ AcpiDmDumpVrtc (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_VRTC);
-    ACPI_VRTC_ENTRY         *SubTable;
+    ACPI_VRTC_ENTRY         *Subtable;
 
 
     /* Main table */
@@ -4032,13 +4312,13 @@ AcpiDmDumpVrtc (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
         if (ACPI_FAILURE (Status))
         {
@@ -4048,7 +4328,7 @@ AcpiDmDumpVrtc (
         /* Point to next subtable */
 
         Offset += sizeof (ACPI_VRTC_ENTRY);
-        SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Subtable,
             sizeof (ACPI_VRTC_ENTRY));
     }
 }
@@ -4072,7 +4352,7 @@ AcpiDmDumpWdat (
 {
     ACPI_STATUS             Status;
     UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
-    ACPI_WDAT_ENTRY         *SubTable;
+    ACPI_WDAT_ENTRY         *Subtable;
 
 
     /* Main table */
@@ -4085,13 +4365,13 @@ AcpiDmDumpWdat (
 
     /* Subtables */
 
-    SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
+    Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
     while (Offset < Table->Length)
     {
         /* Common subtable header */
 
         AcpiOsPrintf ("\n");
-        Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
+        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
             sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
         if (ACPI_FAILURE (Status))
         {
@@ -4101,7 +4381,7 @@ AcpiDmDumpWdat (
         /* Point to next subtable */
 
         Offset += sizeof (ACPI_WDAT_ENTRY);
-        SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable,
+        Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Subtable,
             sizeof (ACPI_WDAT_ENTRY));
     }
 }
@@ -4125,7 +4405,7 @@ AcpiDmDumpWpbt (
     ACPI_TABLE_HEADER       *Table)
 {
     ACPI_STATUS             Status;
-    ACPI_TABLE_WPBT         *SubTable;
+    ACPI_TABLE_WPBT         *Subtable;
     UINT32                  Length = Table->Length;
     UINT16                  ArgumentsLength;
 
@@ -4140,8 +4420,8 @@ AcpiDmDumpWpbt (
 
     /* Extract the arguments buffer length from the main table */
 
-    SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
-    ArgumentsLength = SubTable->ArgumentsLength;
+    Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
+    ArgumentsLength = Subtable->ArgumentsLength;
 
     /* Dump the arguments buffer */
 
diff --git a/sys/contrib/dev/acpica/source/common/dmtbinfo.c b/sys/contrib/dev/acpica/source/common/dmtbinfo.c
index 5180b4db07..ad546e8afa 100644
--- a/sys/contrib/dev/acpica/source/common/dmtbinfo.c
+++ b/sys/contrib/dev/acpica/source/common/dmtbinfo.c
@@ -214,11 +214,13 @@
 #define ACPI_MSCT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_MSCT,f)
 #define ACPI_NFIT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_NFIT,f)
 #define ACPI_PCCT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_PCCT,f)
+#define ACPI_PDTT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_PDTT,f)
 #define ACPI_PMTT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_PMTT,f)
 #define ACPI_RASF_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_RASF,f)
 #define ACPI_S3PT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_S3PT,f)
 #define ACPI_SBST_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SBST,f)
 #define ACPI_SDEI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEI,f)
+#define ACPI_SDEV_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEV,f)
 #define ACPI_SLIT_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIT,f)
 #define ACPI_SPCR_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPCR,f)
 #define ACPI_SPMI_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
@@ -339,6 +341,7 @@
 #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_PDTT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_PDTT_CHANNEL,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)
@@ -351,6 +354,10 @@
 #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)
+#define ACPI_SDEVH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f)
+#define ACPI_SDEV0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_NAMESPACE,f)
+#define ACPI_SDEV1_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE,f)
+#define ACPI_SDEV1A_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE_PATH,f)
 #define ACPI_SLIC_OFFSET(f)             (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f)
 #define ACPI_SRATH_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
 #define ACPI_SRAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_SRAT_CPU_AFFINITY,f)
@@ -360,6 +367,8 @@
 #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_TPM2A_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f)
+#define ACPI_TPM211_OFFSET(f)           (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f)
 #define ACPI_VRTC0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f)
 #define ACPI_WDAT0_OFFSET(f)            (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f)
 
@@ -415,7 +424,9 @@
 #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_PDTT0_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PDTT_CHANNEL,f,o)
 #define ACPI_PMTTH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_PMTT_HEADER,f,o)
+#define ACPI_SDEVH_FLAG_OFFSET(f,o)     ACPI_FLAG_OFFSET (ACPI_SDEV_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)
@@ -896,7 +907,6 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoCsrt1[] =
     ACPI_DMT_TERMINATOR
 };
 
-
 /* Resource Descriptor subtable */
 
 ACPI_DMTABLE_INFO           AcpiDmTableInfoCsrt2[] =
@@ -1260,6 +1270,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoFpdt1[] =
     {ACPI_DMT_UINT64,   ACPI_FPDT0_OFFSET (ExitServicesExit),       "Exit Services Exit", 0},
 #endif
 
+
 /*******************************************************************************
  *
  * GTDT - Generic Timer Description Table
@@ -1853,6 +1864,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoIort4[] =
     ACPI_DMT_TERMINATOR
 };
 
+
 /*******************************************************************************
  *
  * IVRS - I/O Virtualization Reporting Structure
@@ -2219,6 +2231,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoMadt15[] =
    ACPI_DMT_TERMINATOR
 };
 
+
 /*******************************************************************************
  *
  * MCFG - PCI Memory Mapped Configuration table and Subtable
@@ -2696,6 +2709,31 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPcct4[] =
     ACPI_DMT_TERMINATOR
 };
 
+
+/*******************************************************************************
+ *
+ * PDTT - Platform Debug Trigger Table (ACPI 6.2)
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPdtt[] =
+{
+    {ACPI_DMT_UINT8,    ACPI_PDTT_OFFSET (TriggerCount),            "Trigger Count", 0},
+    {ACPI_DMT_UINT24,   ACPI_PDTT_OFFSET (Reserved),                "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_PDTT_OFFSET (ArrayOffset),             "Array Offset", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoPdtt0[] =
+{
+    {ACPI_DMT_UINT8,    ACPI_PDTT0_OFFSET (SubchannelId),           "Subchannel Id", 0},
+    {ACPI_DMT_UINT8,    ACPI_PDTT0_OFFSET (Flags),                  "Flags (Decoded Below)", DT_FLAG},
+    {ACPI_DMT_FLAG0,    ACPI_PDTT0_FLAG_OFFSET (Flags,0),           "Runtime Trigger", 0},
+    {ACPI_DMT_FLAG1,    ACPI_PDTT0_FLAG_OFFSET (Flags,0),           "Wait for Completion", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+
 /*******************************************************************************
  *
  * PMTT - Platform Memory Topology Table
@@ -2768,16 +2806,6 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPmtt2[] =
     ACPI_DMT_TERMINATOR
 };
 
-/*******************************************************************************
- *
- * SDEI - Software Delegated Execption Interface Descriptor Table
- *
- ******************************************************************************/
-
-ACPI_DMTABLE_INFO           AcpiDmTableInfoSdei[] =
-{
-    ACPI_DMT_TERMINATOR
-};
 
 /*******************************************************************************
  *
@@ -2801,7 +2829,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPpttHdr[] =
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt0[] =
 {
     {ACPI_DMT_UINT16,   ACPI_PPTT0_OFFSET (Reserved),               "Reserved", 0},
-    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (Flags),                  "Flags", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT0_OFFSET (Flags),                  "Flags (decoded below)", 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},
@@ -2821,7 +2849,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt0a[] =
 ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt1[] =
 {
     {ACPI_DMT_UINT16,   ACPI_PPTT1_OFFSET (Reserved),               "Reserved", 0},
-    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Flags),                  "Flags", 0},
+    {ACPI_DMT_UINT32,   ACPI_PPTT1_OFFSET (Flags),                  "Flags (decoded below)", 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},
@@ -2855,6 +2883,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoPptt2[] =
     ACPI_DMT_TERMINATOR
 };
 
+
 /*******************************************************************************
  *
  * RASF -  RAS Feature table
@@ -2867,6 +2896,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoRasf[] =
     ACPI_DMT_TERMINATOR
 };
 
+
 /*******************************************************************************
  *
  * S3PT - S3 Performance Table
@@ -2925,6 +2955,86 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoSbst[] =
 };
 
 
+/*******************************************************************************
+ *
+ * SDEI - Software Delegated Execption Interface Descriptor Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdei[] =
+{
+    ACPI_DMT_TERMINATOR
+};
+
+
+/*******************************************************************************
+ *
+ * SDEV - Secure Devices Table (ACPI 6.2)
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev[] =
+{
+    ACPI_DMT_TERMINATOR
+};
+
+/* Common Subtable header (one per Subtable) */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdevHdr[] =
+{
+    {ACPI_DMT_SDEV,     ACPI_SDEVH_OFFSET (Type),                   "Subtable Type", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEVH_OFFSET (Flags),                  "Flags (decoded below)", 0},
+    {ACPI_DMT_FLAG0,    ACPI_SDEVH_FLAG_OFFSET (Flags,0),           "Allow handoff to unsecure OS", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEVH_OFFSET (Length),                 "Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* SDEV Subtables */
+
+/* 0: Namespace Device Based Secure Device Structure */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_SDEV0_OFFSET (DeviceIdOffset),         "Device ID Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV0_OFFSET (DeviceIdLength),         "Device ID Length", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV0_OFFSET (VendorDataOffset),       "Vendor Data Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV0_OFFSET (VendorDataLength),       "Vendor Data Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev0a[] =
+{
+    {ACPI_DMT_STRING,   0,                                          "Namepath", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 1: PCIe Endpoint Device Based Device Structure */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev1[] =
+{
+    {ACPI_DMT_UINT16,   ACPI_SDEV1_OFFSET (Segment),                "Segment", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV1_OFFSET (StartBus),               "Start Bus", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV1_OFFSET (PathOffset),             "Path Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV1_OFFSET (PathLength),             "Path Length", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV1_OFFSET (VendorDataOffset),       "Vendor Data Offset", 0},
+    {ACPI_DMT_UINT16,   ACPI_SDEV1_OFFSET (VendorDataLength),       "Vendor Data Length", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev1a[] =
+{
+    {ACPI_DMT_UINT8,    ACPI_SDEV1A_OFFSET (Device),                "Device", 0},
+    {ACPI_DMT_UINT8,    ACPI_SDEV1A_OFFSET (Function),              "Function", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoSdev1b[] =
+{
+    {ACPI_DMT_RAW_BUFFER, 0,                                        "Vendor Data", 0}, /*, DT_OPTIONAL}, */
+    ACPI_DMT_TERMINATOR
+};
+
+
 /*******************************************************************************
  *
  * SLIC - Software Licensing Description Table. This table contains the standard
@@ -3186,7 +3296,29 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoTpm2[] =
     {ACPI_DMT_UINT16,   ACPI_TPM2_OFFSET (PlatformClass),           "Platform Class", 0},
     {ACPI_DMT_UINT16,   ACPI_TPM2_OFFSET (Reserved),                "Reserved", 0},
     {ACPI_DMT_UINT64,   ACPI_TPM2_OFFSET (ControlAddress),          "Control Address", 0},
-    {ACPI_DMT_UINT32,   ACPI_TPM2_OFFSET (StartMethod),             "Start Method", 0},
+    {ACPI_DMT_TPM2,     ACPI_TPM2_OFFSET (StartMethod),             "Start Method", 0},
+    ACPI_DMT_TERMINATOR
+};
+
+/* Optional trailer. LogLength and LogAddress are additionally optional */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoTpm2a[] =
+{
+    {ACPI_DMT_BUF12,    ACPI_TPM2A_OFFSET (MethodParameters),       "Method Parameters", DT_OPTIONAL},
+    {ACPI_DMT_UINT32,   ACPI_TPM2A_OFFSET (MinimumLogLength),       "Minimum Log Length", DT_OPTIONAL},
+    {ACPI_DMT_UINT64,   ACPI_TPM2A_OFFSET (LogAddress),             "Log Address", DT_OPTIONAL},
+    ACPI_DMT_TERMINATOR
+};
+
+/* 11: Start Method for ARM SMC */
+
+ACPI_DMTABLE_INFO           AcpiDmTableInfoTpm211[] =
+{
+    {ACPI_DMT_UINT32,   ACPI_TPM211_OFFSET (GlobalInterrupt),       "Global Interrupt", 0},
+    {ACPI_DMT_UINT8,    ACPI_TPM211_OFFSET (InterruptFlags),        "Interrupt Flags", 0},
+    {ACPI_DMT_UINT8,    ACPI_TPM211_OFFSET (OperationFlags),        "Operation Flags", 0},
+    {ACPI_DMT_UINT16,   ACPI_TPM211_OFFSET (Reserved),              "Reserved", 0},
+    {ACPI_DMT_UINT32,   ACPI_TPM211_OFFSET (FunctionId),            "Function ID", 0},
     ACPI_DMT_TERMINATOR
 };
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslallocate.c b/sys/contrib/dev/acpica/source/compiler/aslallocate.c
new file mode 100644
index 0000000000..e9898dffd3
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/compiler/aslallocate.c
@@ -0,0 +1,303 @@
+/******************************************************************************
+ *
+ * Module Name: aslallocate -- Local memory allocation
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 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 "aslcompiler.h"
+
+/*
+ * Local heap allocation wrappers. See aslcache.c for allocation from local
+ * cache alloctions
+ */
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    UtLocalCalloc
+ *
+ * PARAMETERS:  Size                - Bytes to be allocated
+ *
+ * RETURN:      Pointer to the allocated memory. If this function returns
+ *              (the compiler is not aborted), the pointer is guaranteed to
+ *              be valid.
+ *
+ * DESCRIPTION: Allocate zero-initialized memory. The point of this function
+ *              is to abort the compile on an allocation failure, on the
+ *              assumption that nothing more can be accomplished.
+ *
+ * NOTE:        For allocation from the local caches, see aslcache.c
+ *
+ ******************************************************************************/
+
+void *
+UtLocalCalloc (
+    UINT32                  Size)
+{
+    void                    *Allocated;
+
+
+    Allocated = ACPI_ALLOCATE_ZEROED (Size);
+    if (!Allocated)
+    {
+        AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
+            Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+            Gbl_InputByteCount, Gbl_CurrentColumn,
+            Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+
+        CmCleanupAndExit ();
+        exit (1);
+    }
+
+    TotalAllocations++;
+    TotalAllocated += Size;
+    return (Allocated);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    UtExpandLineBuffers
+ *
+ * PARAMETERS:  None. Updates global line buffer pointers.
+ *
+ * RETURN:      None. Reallocates the global line buffers
+ *
+ * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
+ *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
+ *              Also used for the initial allocation of the buffers, when
+ *              all of the buffer pointers are NULL. Initial allocations are
+ *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
+ *
+ *****************************************************************************/
+
+void
+UtExpandLineBuffers (
+    void)
+{
+    UINT32                  NewSize;
+
+
+    /* Attempt to double the size of all line buffers */
+
+    NewSize = Gbl_LineBufferSize * 2;
+    if (Gbl_CurrentLineBuffer)
+    {
+        DbgPrint (ASL_DEBUG_OUTPUT,
+            "Increasing line buffer size from %u to %u\n",
+            Gbl_LineBufferSize, NewSize);
+    }
+
+    UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize);
+    UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize);
+    UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize);
+    UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize);
+
+    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
+    Gbl_LineBufferSize = NewSize;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    UtReallocLineBuffers
+ *
+ * PARAMETERS:  Buffer              - Buffer to realloc
+ *              OldSize             - Old size of Buffer
+ *              NewSize             - New size of Buffer
+ *
+ * RETURN:      none
+ *
+ * DESCRIPTION: Reallocate and initialize Buffer
+ *
+ *****************************************************************************/
+
+void
+UtReallocLineBuffers (
+    char                    **Buffer,
+    UINT32                  OldSize,
+    UINT32                  NewSize)
+{
+
+    *Buffer = realloc (*Buffer, NewSize);
+    if (*Buffer)
+    {
+        memset (*Buffer + OldSize, 0, NewSize - OldSize);
+        return;
+    }
+
+    printf ("Could not increase line buffer size from %u to %u\n",
+        OldSize, NewSize);
+
+    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL);
+    AslAbort ();
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    UtFreeLineBuffers
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Free all line buffers
+ *
+ *****************************************************************************/
+
+void
+UtFreeLineBuffers (
+    void)
+{
+
+    free (Gbl_CurrentLineBuffer);
+    free (Gbl_MainTokenBuffer);
+    free (Gbl_MacroTokenBuffer);
+    free (Gbl_ExpressionTokenBuffer);
+}
diff --git a/sys/contrib/dev/acpica/source/compiler/aslcache.c b/sys/contrib/dev/acpica/source/compiler/aslcache.c
new file mode 100644
index 0000000000..4154395030
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/compiler/aslcache.c
@@ -0,0 +1,481 @@
+/******************************************************************************
+ *
+ * Module Name: aslcache -- Local cache support for iASL
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 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 "aslcompiler.h"
+
+/*
+ * Local caches. The caches are fully deleted after the compilation/disassembly
+ * of each individual input file. Thus, individual allocations from the cache
+ * memory do not need to be freed or even released back into the cache.
+ *
+ * See aslallocate.c for standard heap allocations.
+ */
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    UtLocalCacheCalloc
+ *
+ * PARAMETERS:  Length              - Size of buffer requested
+ *
+ * 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
+ *              major impact on the speed of the compiler.)
+ *
+ ******************************************************************************/
+
+char *
+UtLocalCacheCalloc (
+    UINT32                  Length)
+{
+    char                    *Buffer;
+    ASL_CACHE_INFO          *Cache;
+    UINT32                  CacheSize = ASL_STRING_CACHE_SIZE;
+
+
+    if (Length > CacheSize)
+    {
+        CacheSize = Length;
+
+        if (Gbl_StringCacheList)
+        {
+            Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
+
+            /* Link new cache buffer just following head of list */
+
+            Cache->Next = Gbl_StringCacheList->Next;
+            Gbl_StringCacheList->Next = Cache;
+
+            /* Leave cache management pointers alone as they pertain to head */
+
+            Gbl_StringCount++;
+            Gbl_StringSize += Length;
+
+            return (Cache->Buffer);
+        }
+    }
+
+    if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
+    {
+        /* Allocate a new buffer */
+
+        Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
+
+        /* Link new cache buffer to head of list */
+
+        Cache->Next = Gbl_StringCacheList;
+        Gbl_StringCacheList = Cache;
+
+        /* Setup cache management pointers */
+
+        Gbl_StringCacheNext = Cache->Buffer;
+        Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize;
+    }
+
+    Gbl_StringCount++;
+    Gbl_StringSize += Length;
+
+    Buffer = Gbl_StringCacheNext;
+    Gbl_StringCacheNext += Length;
+    return (Buffer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    UtParseOpCacheCalloc
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      New parse op. Aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate a new parse op for the parse tree. Bypass the local
+ *              dynamic memory manager for performance reasons (This has a
+ *              major impact on the speed of the compiler.)
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+UtParseOpCacheCalloc (
+    void)
+{
+    ASL_CACHE_INFO          *Cache;
+
+
+    if (Gbl_ParseOpCacheNext >= Gbl_ParseOpCacheLast)
+    {
+        /* Allocate a new buffer */
+
+        Cache = UtLocalCalloc (sizeof (Cache->Next) +
+            (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE));
+
+        /* Link new cache buffer to head of list */
+
+        Cache->Next = Gbl_ParseOpCacheList;
+        Gbl_ParseOpCacheList = Cache;
+
+        /* Setup cache management pointers */
+
+        Gbl_ParseOpCacheNext = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Cache->Buffer);
+        Gbl_ParseOpCacheLast = Gbl_ParseOpCacheNext + ASL_PARSEOP_CACHE_SIZE;
+    }
+
+    Gbl_ParseOpCount++;
+    return (Gbl_ParseOpCacheNext++);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    UtSubtableCacheCalloc - Data Table compiler
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Pointer to the buffer. Aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate a subtable object buffer. Bypass the local
+ *              dynamic memory manager for performance reasons (This has a
+ *              major impact on the speed of the compiler.)
+ *
+ ******************************************************************************/
+
+DT_SUBTABLE *
+UtSubtableCacheCalloc (
+    void)
+{
+    ASL_CACHE_INFO          *Cache;
+
+
+    if (Gbl_SubtableCacheNext >= Gbl_SubtableCacheLast)
+    {
+        /* Allocate a new buffer */
+
+        Cache = UtLocalCalloc (sizeof (Cache->Next) +
+            (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE));
+
+        /* Link new cache buffer to head of list */
+
+        Cache->Next = Gbl_SubtableCacheList;
+        Gbl_SubtableCacheList = Cache;
+
+        /* Setup cache management pointers */
+
+        Gbl_SubtableCacheNext = ACPI_CAST_PTR (DT_SUBTABLE, Cache->Buffer);
+        Gbl_SubtableCacheLast = Gbl_SubtableCacheNext + ASL_SUBTABLE_CACHE_SIZE;
+    }
+
+    Gbl_SubtableCount++;
+    return (Gbl_SubtableCacheNext++);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    UtFieldCacheCalloc - Data Table compiler
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Pointer to the buffer. Aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate a field object buffer. Bypass the local
+ *              dynamic memory manager for performance reasons (This has a
+ *              major impact on the speed of the compiler.)
+ *
+ ******************************************************************************/
+
+DT_FIELD *
+UtFieldCacheCalloc (
+    void)
+{
+    ASL_CACHE_INFO          *Cache;
+
+
+    if (Gbl_FieldCacheNext >= Gbl_FieldCacheLast)
+    {
+        /* Allocate a new buffer */
+
+        Cache = UtLocalCalloc (sizeof (Cache->Next) +
+            (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE));
+
+        /* Link new cache buffer to head of list */
+
+        Cache->Next = Gbl_FieldCacheList;
+        Gbl_FieldCacheList = Cache;
+
+        /* Setup cache management pointers */
+
+        Gbl_FieldCacheNext = ACPI_CAST_PTR (DT_FIELD, Cache->Buffer);
+        Gbl_FieldCacheLast = Gbl_FieldCacheNext + ASL_FIELD_CACHE_SIZE;
+    }
+
+    Gbl_FieldCount++;
+    return (Gbl_FieldCacheNext++);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    UtDeleteLocalCaches
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Delete all local cache buffer blocks
+ *
+ ******************************************************************************/
+
+void
+UtDeleteLocalCaches (
+    void)
+{
+    UINT32                  BufferCount;
+    ASL_CACHE_INFO          *Next;
+
+
+    /*
+     * Generic cache, arbitrary size allocations
+     */
+    BufferCount = 0;
+    while (Gbl_StringCacheList)
+    {
+        Next = Gbl_StringCacheList->Next;
+        ACPI_FREE (Gbl_StringCacheList);
+        Gbl_StringCacheList = Next;
+        BufferCount++;
+    }
+
+    DbgPrint (ASL_DEBUG_OUTPUT,
+        "%u Strings (%u bytes), Buffer size: %u bytes, %u Buffers\n",
+        Gbl_StringCount, Gbl_StringSize, ASL_STRING_CACHE_SIZE, BufferCount);
+
+    /* Reset cache globals */
+
+    Gbl_StringSize = 0;
+    Gbl_StringCount = 0;
+    Gbl_StringCacheNext = NULL;
+    Gbl_StringCacheLast = NULL;
+
+
+    /*
+     * Parse Op cache
+     */
+    BufferCount = 0;
+    while (Gbl_ParseOpCacheList)
+    {
+        Next = Gbl_ParseOpCacheList->Next;
+        ACPI_FREE (Gbl_ParseOpCacheList);
+        Gbl_ParseOpCacheList = Next;
+        BufferCount++;
+    }
+
+    DbgPrint (ASL_DEBUG_OUTPUT,
+        "%u ParseOps, Buffer size: %u ops (%u bytes), %u Buffers\n",
+        Gbl_ParseOpCount, ASL_PARSEOP_CACHE_SIZE,
+        (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE), BufferCount);
+
+    /* Reset cache globals */
+
+    Gbl_ParseOpCount = 0;
+    Gbl_ParseOpCacheNext = NULL;
+    Gbl_ParseOpCacheLast = NULL;
+    Gbl_ParseTreeRoot = NULL;
+
+
+    /*
+     * Table Compiler - Field cache
+     */
+    BufferCount = 0;
+    while (Gbl_FieldCacheList)
+    {
+        Next = Gbl_FieldCacheList->Next;
+        ACPI_FREE (Gbl_FieldCacheList);
+        Gbl_FieldCacheList = Next;
+        BufferCount++;
+    }
+
+    DbgPrint (ASL_DEBUG_OUTPUT,
+        "%u Fields, Buffer size: %u fields (%u bytes), %u Buffers\n",
+        Gbl_FieldCount, ASL_FIELD_CACHE_SIZE,
+        (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE), BufferCount);
+
+    /* Reset cache globals */
+
+    Gbl_FieldCount = 0;
+    Gbl_FieldCacheNext = NULL;
+    Gbl_FieldCacheLast = NULL;
+
+
+    /*
+     * Table Compiler - Subtable cache
+     */
+    BufferCount = 0;
+    while (Gbl_SubtableCacheList)
+    {
+        Next = Gbl_SubtableCacheList->Next;
+        ACPI_FREE (Gbl_SubtableCacheList);
+        Gbl_SubtableCacheList = Next;
+        BufferCount++;
+    }
+
+    DbgPrint (ASL_DEBUG_OUTPUT,
+        "%u Subtables, Buffer size: %u subtables (%u bytes), %u Buffers\n",
+        Gbl_SubtableCount, ASL_SUBTABLE_CACHE_SIZE,
+        (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE), BufferCount);
+
+    /* Reset cache globals */
+
+    Gbl_SubtableCount = 0;
+    Gbl_SubtableCacheNext = NULL;
+    Gbl_SubtableCacheLast = NULL;
+}
diff --git a/sys/contrib/dev/acpica/source/compiler/aslcompile.c b/sys/contrib/dev/acpica/source/compiler/aslcompile.c
index 3856844013..1ddb8864c4 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslcompile.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslcompile.c
@@ -150,7 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 #include "acnamesp.h"
 
 #include <stdio.h>
@@ -932,70 +931,7 @@ CmCleanupAndExit (
 
     if (!Gbl_DoAslConversion)
     {
-        CmDeleteCaches ();
+        UtDeleteLocalCaches ();
     }
 
 }
-
-
-/*******************************************************************************
- *
- * FUNCTION:    CmDeleteCaches
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Delete all local cache buffer blocks
- *
- ******************************************************************************/
-
-void
-CmDeleteCaches (
-    void)
-{
-    UINT32                  BufferCount;
-    ASL_CACHE_INFO          *Next;
-
-
-    /* Parse Op cache */
-
-    BufferCount = 0;
-    while (Gbl_ParseOpCacheList)
-    {
-        Next = Gbl_ParseOpCacheList->Next;
-        ACPI_FREE (Gbl_ParseOpCacheList);
-        Gbl_ParseOpCacheList = Next;
-        BufferCount++;
-    }
-
-    DbgPrint (ASL_DEBUG_OUTPUT,
-        "%u ParseOps, Buffer size: %u ops (%u bytes), %u Buffers\n",
-        Gbl_ParseOpCount, ASL_PARSEOP_CACHE_SIZE,
-        (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE), BufferCount);
-
-    Gbl_ParseOpCount = 0;
-    Gbl_ParseOpCacheNext = NULL;
-    Gbl_ParseOpCacheLast = NULL;
-    Gbl_ParseTreeRoot = NULL;
-
-    /* Generic string cache */
-
-    BufferCount = 0;
-    while (Gbl_StringCacheList)
-    {
-        Next = Gbl_StringCacheList->Next;
-        ACPI_FREE (Gbl_StringCacheList);
-        Gbl_StringCacheList = Next;
-        BufferCount++;
-    }
-
-    DbgPrint (ASL_DEBUG_OUTPUT,
-        "%u Strings (%u bytes), Buffer size: %u bytes, %u Buffers\n",
-        Gbl_StringCount, Gbl_StringSize, ASL_STRING_CACHE_SIZE, BufferCount);
-
-    Gbl_StringSize = 0;
-    Gbl_StringCount = 0;
-    Gbl_StringCacheNext = NULL;
-    Gbl_StringCacheLast = NULL;
-}
diff --git a/sys/contrib/dev/acpica/source/compiler/aslcompiler.h b/sys/contrib/dev/acpica/source/compiler/aslcompiler.h
index 3b6a9c1dc1..fdf7ea96d3 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslcompiler.h
+++ b/sys/contrib/dev/acpica/source/compiler/aslcompiler.h
@@ -181,6 +181,7 @@
 #include "aslmessages.h"
 #include "aslglobal.h"
 #include "preprocess.h"
+#include "dtcompiler.h"
 
 
 /*******************************************************************************
@@ -265,8 +266,50 @@ void
 CmCleanupAndExit (
     void);
 
+
+/*
+ * aslallocate - memory allocation
+ */
+void *
+UtLocalCalloc (
+    UINT32                  Size);
+
+void
+UtExpandLineBuffers (
+    void);
+
+void
+UtReallocLineBuffers (
+    char                    **Buffer,
+    UINT32                  OldSize,
+    UINT32                  NewSize);
+
+void
+UtFreeLineBuffers (
+    void);
+
+
+/*
+ * aslcache - local cache support
+ */
+char *
+UtLocalCacheCalloc (
+    UINT32                  Length);
+
+ACPI_PARSE_OBJECT *
+UtParseOpCacheCalloc (
+    void);
+
+DT_SUBTABLE *
+UtSubtableCacheCalloc (
+    void);
+
+DT_FIELD *
+UtFieldCacheCalloc (
+    void);
+
 void
-CmDeleteCaches (
+UtDeleteLocalCaches (
     void);
 
 
@@ -406,6 +449,16 @@ void
 AslAbort (
     void);
 
+void
+AslDualParseOpError (
+    UINT8                   Level,
+    UINT16                  MainMessageId,
+    ACPI_PARSE_OBJECT       *MainOp,
+    char                    *MainMessage,
+    UINT16                  SecondMessageId,
+    ACPI_PARSE_OBJECT       *SecondOp,
+    char                    *SecondaryMessage);
+
 void
 AslError (
     UINT8                   Level,
@@ -1150,10 +1203,6 @@ void
 UtEndEvent (
     UINT8                   Event);
 
-void *
-UtLocalCalloc (
-    UINT32                  Size);
-
 void
 UtDisplaySummary (
     UINT32                  FileId);
@@ -1176,18 +1225,6 @@ void
 UtSetParseOpName (
     ACPI_PARSE_OBJECT       *Op);
 
-char *
-UtStringCacheCalloc (
-    UINT32                  Length);
-
-void
-UtExpandLineBuffers (
-    void);
-
-void
-UtFreeLineBuffers (
-    void);
-
 ACPI_STATUS
 UtInternalizeName (
     char                    *ExternalName,
diff --git a/sys/contrib/dev/acpica/source/compiler/aslcompiler.l b/sys/contrib/dev/acpica/source/compiler/aslcompiler.l
index 5fcfc18867..a5d0ee9a7f 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslcompiler.l
+++ b/sys/contrib/dev/acpica/source/compiler/aslcompiler.l
@@ -813,7 +813,7 @@ NamePathTail                [.]{NameSeg}
 
 {NameSeg}                   { char *s;
                                 count (0);
-                                s=UtStringCacheCalloc (ACPI_NAME_SIZE + 1);
+                                s=UtLocalCacheCalloc (ACPI_NAME_SIZE + 1);
                                 if (strcmp (AslCompilertext, "\\"))
                                 {
                                     strcpy (s, "____");
@@ -826,7 +826,7 @@ NamePathTail                [.]{NameSeg}
 
 {NameString}                { char *s;
                                 count (0);
-                                s=UtStringCacheCalloc (strlen (AslCompilertext)+1);
+                                s=UtLocalCacheCalloc (strlen (AslCompilertext)+1);
                                 AcpiUtStrupr (AslCompilertext);
                                 strcpy (s, AslCompilertext);
                                 AslCompilerlval.s = s;
diff --git a/sys/contrib/dev/acpica/source/compiler/asldebug.c b/sys/contrib/dev/acpica/source/compiler/asldebug.c
index 684e222485..ba252251f7 100644
--- a/sys/contrib/dev/acpica/source/compiler/asldebug.c
+++ b/sys/contrib/dev/acpica/source/compiler/asldebug.c
@@ -356,7 +356,7 @@ UtCreateEscapeSequences (
 
     /* New string buffer, 3 extra chars per escape (4 total) */
 
-    OutString = UtLocalCalloc (InStringLength + (EscapeCount * 3));
+    OutString = UtLocalCacheCalloc (InStringLength + (EscapeCount * 3));
     OutStringPtr = OutString;
 
     /* Convert non-ascii or non-printable chars to escape sequences */
diff --git a/sys/contrib/dev/acpica/source/compiler/aslerror.c b/sys/contrib/dev/acpica/source/compiler/aslerror.c
index 56b5cabb94..087f06ef10 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslerror.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslerror.c
@@ -170,6 +170,37 @@ AslIsExceptionDisabled (
     UINT8                   Level,
     UINT16                  MessageId);
 
+static void AslInitEnode (
+    ASL_ERROR_MSG           **Enode,
+    UINT8                   Level,
+    UINT16                  MessageId,
+    UINT32                  LineNumber,
+    UINT32                  LogicalLineNumber,
+    UINT32                  LogicalByteOffset,
+    UINT32                  Column,
+    char                    *Filename,
+    char                    *Message,
+    char                    *SourceLine,
+    ASL_ERROR_MSG           *SubError);
+
+static void
+AslLogNewError (
+    UINT8                   Level,
+    UINT16                  MessageId,
+    UINT32                  LineNumber,
+    UINT32                  LogicalLineNumber,
+    UINT32                  LogicalByteOffset,
+    UINT32                  Column,
+    char                    *Filename,
+    char                    *Message,
+    char                    *SourceLine,
+    ASL_ERROR_MSG           *SubError);
+
+static void
+AePrintSubError (
+    FILE                    *OutputFile,
+    ASL_ERROR_MSG           *Enode);
+
 
 /*******************************************************************************
  *
@@ -220,6 +251,7 @@ AeClearErrorLog (
     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
     ASL_ERROR_MSG           *Next;
 
+
     /* Walk the error node list */
 
     while (Enode)
@@ -270,8 +302,7 @@ AeAddToErrorLog (
     Prev = NULL;
     Next = Gbl_ErrorLog;
 
-    while ((Next) &&
-           (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
+    while ((Next) && (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
     {
         Prev = Next;
         Next = Next->Next;
@@ -294,94 +325,143 @@ AeAddToErrorLog (
 
 /*******************************************************************************
  *
- * FUNCTION:    AePrintException
+ * FUNCTION:    AeDecodeErrorMessageId
  *
- * PARAMETERS:  FileId          - ID of output file
+ * PARAMETERS:  OutputFile      - Output file
  *              Enode           - Error node to print
- *              Header          - Additional text before each message
+ *              PrematureEOF    - True = PrematureEOF has been reached
+ *              Total           - Total legth of line
  *
  * RETURN:      None
  *
- * DESCRIPTION: Print the contents of an error node.
- *
- * NOTE:        We don't use the FlxxxFile I/O functions here because on error
- *              they abort the compiler and call this function!  Since we
- *              are reporting errors here, we ignore most output errors and
- *              just try to get out as much as we can.
+ * DESCRIPTION: Print the source line of an error.
  *
  ******************************************************************************/
 
-void
-AePrintException (
-    UINT32                  FileId,
+static void
+AeDecodeErrorMessageId (
+    FILE                    *OutputFile,
     ASL_ERROR_MSG           *Enode,
-    char                    *Header)
+    BOOLEAN                 PrematureEOF,
+    UINT32                  Total)
 {
-    UINT8                   SourceByte;
-    int                     Actual;
-    size_t                  RActual;
     UINT32                  MsgLength;
     const char              *MainMessage;
     char                    *ExtraMessage;
     UINT32                  SourceColumn;
     UINT32                  ErrorColumn;
-    FILE                    *OutputFile;
-    FILE                    *SourceFile = NULL;
-    long                    FileSize;
-    BOOLEAN                 PrematureEOF = FALSE;
-    UINT32                  Total = 0;
 
 
-    if (Gbl_NoErrors)
+    fprintf (OutputFile, "%s %4.4d -",
+        AeDecodeExceptionLevel (Enode->Level),
+        AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
+
+    MainMessage = AeDecodeMessageId (Enode->MessageId);
+    ExtraMessage = Enode->Message;
+
+    /* If a NULL line number, just print the decoded message */
+
+    if (!Enode->LineNumber)
     {
+        fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
         return;
     }
 
-    /*
-     * Only listing files have a header, and remarks/optimizations
-     * are always output
-     */
-    if (!Header)
+    MsgLength = strlen (MainMessage);
+    if (MsgLength == 0)
     {
-        /* Ignore remarks if requested */
+        /* Use the secondary/extra message as main message */
 
-        switch (Enode->Level)
+        MainMessage = Enode->Message;
+        if (!MainMessage)
         {
-        case ASL_WARNING:
-        case ASL_WARNING2:
-        case ASL_WARNING3:
+            MainMessage = "";
+        }
 
-            if (!Gbl_DisplayWarnings)
-            {
-                return;
-            }
-            break;
+        MsgLength = strlen (MainMessage);
+        ExtraMessage = NULL;
+    }
 
-        case ASL_REMARK:
+    if (Gbl_VerboseErrors && !PrematureEOF)
+    {
+        if (Total >= 256)
+        {
+            fprintf (OutputFile, "    %s",
+                MainMessage);
+        }
+        else
+        {
+            SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
+            ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
 
-            if (!Gbl_DisplayRemarks)
+            if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
             {
-                return;
+                fprintf (OutputFile, "%*s%s",
+                    (int) ((SourceColumn - 1) - ErrorColumn),
+                    MainMessage, " ^ ");
             }
-            break;
-
-        case ASL_OPTIMIZATION:
-
-            if (!Gbl_DisplayOptimizations)
+            else
             {
-                return;
+                fprintf (OutputFile, "%*s %s",
+                    (int) ((SourceColumn - ErrorColumn) + 1), "^",
+                    MainMessage);
             }
-            break;
+        }
+    }
+    else
+    {
+        fprintf (OutputFile, " %s", MainMessage);
+    }
 
-        default:
+    /* Print the extra info message if present */
 
-            break;
-        }
+    if (ExtraMessage)
+    {
+        fprintf (OutputFile, " (%s)", ExtraMessage);
     }
 
-    /* Get the various required file handles */
+    if (PrematureEOF)
+    {
+        fprintf (OutputFile, " and premature End-Of-File");
+    }
+
+    fprintf (OutputFile, "\n");
+    if (Gbl_VerboseErrors && !Enode->SubError)
+    {
+        fprintf (OutputFile, "\n");
+    }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AePrintErrorSourceLine
+ *
+ * PARAMETERS:  OutputFile      - Output file
+ *              Enode           - Error node to print
+ *              PrematureEOF    - True = PrematureEOF has been reached
+ *              Total           - amount of characters printed so far
+ *
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Print the source line of an error.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AePrintErrorSourceLine (
+    FILE                    *OutputFile,
+    ASL_ERROR_MSG           *Enode,
+    BOOLEAN                 *PrematureEOF,
+    UINT32                  *Total)
+{
+    UINT8                   SourceByte;
+    int                     Actual;
+    size_t                  RActual;
+    FILE                    *SourceFile = NULL;
+    long                    FileSize;
 
-    OutputFile = Gbl_Files[FileId].Handle;
 
     if (!Enode->SourceLine)
     {
@@ -404,211 +484,270 @@ AePrintException (
 
             if ((long) Enode->LogicalByteOffset >= FileSize)
             {
-                PrematureEOF = TRUE;
+                *PrematureEOF = TRUE;
             }
         }
-    }
-
-    if (Header)
-    {
-        fprintf (OutputFile, "%s", Header);
+        else
+        {
+            fprintf (OutputFile,
+                "[*** iASL: Source File Does not exist ***]\n");
+            return AE_IO_ERROR;
+        }
     }
 
     /* Print filename and line number if present and valid */
 
-    if (Enode->Filename)
+    if (Gbl_VerboseErrors)
     {
-        if (Gbl_VerboseErrors)
+        fprintf (OutputFile, "%-8s", Enode->Filename);
+
+        if (Enode->SourceLine && Enode->LineNumber)
+        {
+            fprintf (OutputFile, " %6u: %s",
+                Enode->LineNumber, Enode->SourceLine);
+        }
+        else if (Enode->LineNumber)
         {
-            fprintf (OutputFile, "%-8s", Enode->Filename);
+            fprintf (OutputFile, " %6u: ", Enode->LineNumber);
 
-            if (Enode->LineNumber)
+            /*
+             * If not at EOF, get the corresponding source code line
+             * and display it. Don't attempt this if we have a
+             * premature EOF condition.
+             */
+            if (*PrematureEOF)
             {
-                if (Enode->SourceLine)
-                {
-                    fprintf (OutputFile, " %6u: %s",
-                        Enode->LineNumber, Enode->SourceLine);
-                }
-                else
+                fprintf (OutputFile, "\n");
+                return AE_OK;
+            }
+            /*
+             * Seek to the offset in the combined source file,
+             * read the source line, and write it to the output.
+             */
+            Actual = fseek (SourceFile,
+                (long) Enode->LogicalByteOffset, (int) SEEK_SET);
+            if (Actual)
+            {
+                fprintf (OutputFile,
+                    "[*** iASL: Seek error on source code temp file %s ***]",
+                    Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
+
+                fprintf (OutputFile, "\n");
+                return AE_OK;
+            }
+            RActual = fread (&SourceByte, 1, 1, SourceFile);
+            if (RActual != 1)
+            {
+                fprintf (OutputFile,
+                    "[*** iASL: Read error on source code temp file %s ***]",
+                    Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
+                return AE_IO_ERROR;
+            }
+                /* Read/write the source line, up to the maximum line length */
+
+            while (RActual && SourceByte && (SourceByte != '\n'))
+            {
+                if (*Total < 256)
                 {
-                    fprintf (OutputFile, " %6u: ", Enode->LineNumber);
-
-                    /*
-                     * If not at EOF, get the corresponding source code line
-                     * and display it. Don't attempt this if we have a
-                     * premature EOF condition.
-                     */
-                    if (!PrematureEOF)
+                    /* After the max line length, we will just read the line, no write */
+
+                    if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
                     {
-                        /*
-                         * Seek to the offset in the combined source file,
-                         * read the source line, and write it to the output.
-                         */
-                        Actual = fseek (SourceFile,
-                            (long) Enode->LogicalByteOffset, (int) SEEK_SET);
-                        if (Actual)
-                        {
-                            fprintf (OutputFile,
-                                "[*** iASL: Seek error on source code temp file %s ***]",
-                                Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
-                        }
-                        else
-                        {
-                            RActual = fread (&SourceByte, 1, 1, SourceFile);
-                            if (RActual != 1)
-                            {
-                                fprintf (OutputFile,
-                                    "[*** iASL: Read error on source code temp file %s ***]",
-                                    Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
-                            }
-                            else
-                            {
-                                /* Read/write the source line, up to the maximum line length */
-
-                                while (RActual && SourceByte && (SourceByte != '\n'))
-                                {
-                                    if (Total < 256)
-                                    {
-                                        /* After the max line length, we will just read the line, no write */
-
-                                        if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
-                                        {
-                                            printf ("[*** iASL: Write error on output file ***]\n");
-                                            return;
-                                        }
-                                    }
-                                    else if (Total == 256)
-                                    {
-                                        fprintf (OutputFile,
-                                            "\n[*** iASL: Very long input line, message below refers to column %u ***]",
-                                            Enode->Column);
-                                    }
-
-                                    RActual = fread (&SourceByte, 1, 1, SourceFile);
-                                    if (RActual != 1)
-                                    {
-                                        fprintf (OutputFile,
-                                            "[*** iASL: Read error on source code temp file %s ***]",
-                                            Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
-                                        return;
-                                    }
-                                    Total++;
-                                }
-                            }
-                        }
+                        printf ("[*** iASL: Write error on output file ***]\n");
+                        return AE_IO_ERROR;
                     }
+                }
+                else if (*Total == 256)
+                {
+                    fprintf (OutputFile,
+                        "\n[*** iASL: Very long input line, message below refers to column %u ***]",
+                        Enode->Column);
+                }
+
+                RActual = fread (&SourceByte, 1, 1, SourceFile);
+                if (RActual != 1)
+                {
+                    fprintf (OutputFile,
+                        "[*** iASL: Read error on source code temp file %s ***]",
+                        Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
 
-                    fprintf (OutputFile, "\n");
+                    return AE_IO_ERROR;
                 }
+                *Total += 1;
             }
-        }
-        else
-        {
-            /*
-             * Less verbose version of the error message, enabled via the
-             * -vi switch. The format is compatible with MS Visual Studio.
-             */
-            fprintf (OutputFile, "%s", Enode->Filename);
 
-            if (Enode->LineNumber)
-            {
-                fprintf (OutputFile, "(%u) : ",
-                    Enode->LineNumber);
-            }
+            fprintf (OutputFile, "\n");
         }
     }
-
-    /* If a NULL message ID, just print the raw message */
-
-    if (Enode->MessageId == 0)
+    else
     {
-        fprintf (OutputFile, "%s\n", Enode->Message);
-        return;
+        /*
+         * Less verbose version of the error message, enabled via the
+         * -vi switch. The format is compatible with MS Visual Studio.
+         */
+        fprintf (OutputFile, "%s", Enode->Filename);
+
+        if (Enode->LineNumber)
+        {
+            fprintf (OutputFile, "(%u) : ",
+                Enode->LineNumber);
+        }
     }
 
-    /* Decode the message ID */
+    return AE_OK;
+}
 
-    fprintf (OutputFile, "%s %4.4d -",
-        AeDecodeExceptionLevel (Enode->Level),
-        AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
+/*******************************************************************************
+ *
+ * FUNCTION:    AePrintException
+ *
+ * PARAMETERS:  FileId          - ID of output file
+ *              Enode           - Error node to print
+ *              Header          - Additional text before each message
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Print the contents of an error node.
+ *
+ * NOTE:        We don't use the FlxxxFile I/O functions here because on error
+ *              they abort the compiler and call this function!  Since we
+ *              are reporting errors here, we ignore most output errors and
+ *              just try to get out as much as we can.
+ *
+ ******************************************************************************/
 
-    MainMessage = AeDecodeMessageId (Enode->MessageId);
-    ExtraMessage = Enode->Message;
+void
+AePrintException (
+    UINT32                  FileId,
+    ASL_ERROR_MSG           *Enode,
+    char                    *Header)
+{
+    FILE                    *OutputFile;
+    BOOLEAN                 PrematureEOF = FALSE;
+    UINT32                  Total = 0;
+    ACPI_STATUS             Status;
+    ASL_ERROR_MSG           *Child = Enode->SubError;
 
-    /* If a NULL line number, just print the decoded message */
 
-    if (!Enode->LineNumber)
+    if (Gbl_NoErrors)
     {
-        fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
         return;
     }
 
-    MsgLength = strlen (MainMessage);
-    if (MsgLength == 0)
+    /*
+     * Only listing files have a header, and remarks/optimizations
+     * are always output
+     */
+    if (!Header)
     {
-        /* Use the secondary/extra message as main message */
+        /* Ignore remarks if requested */
 
-        MainMessage = Enode->Message;
-        if (!MainMessage)
+        switch (Enode->Level)
         {
-            MainMessage = "";
-        }
+        case ASL_WARNING:
+        case ASL_WARNING2:
+        case ASL_WARNING3:
 
-        MsgLength = strlen (MainMessage);
-        ExtraMessage = NULL;
-    }
+            if (!Gbl_DisplayWarnings)
+            {
+                return;
+            }
+            break;
 
-    if (Gbl_VerboseErrors && !PrematureEOF)
-    {
-        if (Total >= 256)
-        {
-            fprintf (OutputFile, "    %s",
-                MainMessage);
-        }
-        else
-        {
-            SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
-            ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
+        case ASL_REMARK:
 
-            if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
+            if (!Gbl_DisplayRemarks)
             {
-                fprintf (OutputFile, "%*s%s",
-                    (int) ((SourceColumn - 1) - ErrorColumn),
-                    MainMessage, " ^ ");
+                return;
             }
-            else
+            break;
+
+        case ASL_OPTIMIZATION:
+
+            if (!Gbl_DisplayOptimizations)
             {
-                fprintf (OutputFile, "%*s %s",
-                    (int) ((SourceColumn - ErrorColumn) + 1), "^",
-                    MainMessage);
+                return;
             }
+            break;
+
+        default:
+
+            break;
         }
     }
-    else
+
+    /* Get the various required file handles */
+
+    OutputFile = Gbl_Files[FileId].Handle;
+
+    if (Header)
     {
-        fprintf (OutputFile, " %s", MainMessage);
+        fprintf (OutputFile, "%s", Header);
     }
 
-    /* Print the extra info message if present */
+    if (!Enode->Filename)
+    {
+        AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
+        return;
+    }
 
-    if (ExtraMessage)
+    Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
+    if (ACPI_FAILURE (Status))
     {
-        fprintf (OutputFile, " (%s)", ExtraMessage);
+        return;
     }
 
-    if (PrematureEOF)
+    /* If a NULL message ID, just print the raw message */
+
+    if (Enode->MessageId == 0)
     {
-        fprintf (OutputFile, " and premature End-Of-File");
+        fprintf (OutputFile, "%s\n", Enode->Message);
+        return;
     }
 
-    fprintf (OutputFile, "\n");
-    if (Gbl_VerboseErrors)
+    AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
+
+    while (Child)
     {
         fprintf (OutputFile, "\n");
+        AePrintSubError (OutputFile, Child);
+        Child = Child->SubError;
     }
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AePrintSubError
+ *
+ * PARAMETERS:  OutputFile      - Output file
+ *              Enode           - Error node to print
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Print the contents of an error nodes. This function is tailored
+ *              to print error nodes that are SubErrors within ASL_ERROR_MSG
+ *
+ ******************************************************************************/
+
+static void
+AePrintSubError (
+    FILE                    *OutputFile,
+    ASL_ERROR_MSG           *Enode)
+{
+    UINT32                  Total = 0;
+    BOOLEAN                 PrematureEOF = FALSE;
+    const char              *MainMessage;
+
+
+    MainMessage = AeDecodeMessageId (Enode->MessageId);
+
+    fprintf (OutputFile, "    %s%s", MainMessage, "\n    ");
+    (void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
+    fprintf (OutputFile, "\n");
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AePrintErrorLog
@@ -640,54 +779,72 @@ AePrintErrorLog (
 
 /*******************************************************************************
  *
- * FUNCTION:    AslCommonError2
+ * FUNCTION:    AslInitEnode
  *
- * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
+ * PARAMETERS:  InputEnode          - Input Error node to initialize
+ *              Level               - Seriousness (Warning/error, etc.)
  *              MessageId           - Index into global message buffer
- *              LineNumber          - Actual file line number
+ *              CurrentLineNumber   - Actual file line number
+ *              LogicalLineNumber   - Cumulative line number
+ *              LogicalByteOffset   - Byte offset in source file
  *              Column              - Column in current line
- *              SourceLine          - Actual source code line
  *              Filename            - source filename
  *              ExtraMessage        - additional error message
+ *              SourceLine          - Line of error source code
+ *              SubError            - SubError of this InputEnode
  *
  * RETURN:      None
  *
- * DESCRIPTION: Create a new error node and add it to the error log
+ * DESCRIPTION: Initialize an Error node
  *
  ******************************************************************************/
 
-void
-AslCommonError2 (
+static void AslInitEnode (
+    ASL_ERROR_MSG           **InputEnode,
     UINT8                   Level,
     UINT16                  MessageId,
     UINT32                  LineNumber,
+    UINT32                  LogicalLineNumber,
+    UINT32                  LogicalByteOffset,
     UINT32                  Column,
-    char                    *SourceLine,
     char                    *Filename,
-    char                    *ExtraMessage)
+    char                    *ExtraMessage,
+    char                    *SourceLine,
+    ASL_ERROR_MSG           *SubError)
 {
-    char                    *MessageBuffer = NULL;
-    char                    *LineBuffer;
     ASL_ERROR_MSG           *Enode;
 
 
-    Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
+    *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
+    Enode = *InputEnode;
+    Enode->Level                = Level;
+    Enode->MessageId            = MessageId;
+    Enode->LineNumber           = LineNumber;
+    Enode->LogicalLineNumber    = LogicalLineNumber;
+    Enode->LogicalByteOffset    = LogicalByteOffset;
+    Enode->Column               = Column;
+    Enode->SubError             = SubError;
+    Enode->Message              = NULL;
+    Enode->SourceLine           = NULL;
+    Enode->Filename             = NULL;
 
     if (ExtraMessage)
     {
         /* Allocate a buffer for the message and a new error node */
 
-        MessageBuffer = UtStringCacheCalloc (strlen (ExtraMessage) + 1);
+        Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1);
 
         /* Keep a copy of the extra message */
 
-        strcpy (MessageBuffer, ExtraMessage);
+        strcpy (Enode->Message, ExtraMessage);
     }
 
-    LineBuffer = UtLocalCalloc (strlen (SourceLine) + 1);
-    strcpy (LineBuffer, SourceLine);
+    if (SourceLine)
+    {
+        Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1);
+        strcpy (Enode->SourceLine, SourceLine);
+    }
 
-    /* Initialize the error node */
 
     if (Filename)
     {
@@ -698,28 +855,39 @@ AslCommonError2 (
             Enode->FilenameLength = 6;
         }
     }
+}
 
-    Enode->MessageId            = MessageId;
-    Enode->Level                = Level;
-    Enode->LineNumber           = LineNumber;
-    Enode->LogicalLineNumber    = LineNumber;
-    Enode->LogicalByteOffset    = 0;
-    Enode->Column               = Column;
-    Enode->Message              = MessageBuffer;
-    Enode->SourceLine           = LineBuffer;
-
-    /* Add the new node to the error node list */
-
-    AeAddToErrorLog (Enode);
-
-    if (Gbl_DebugFlag)
-    {
-        /* stderr is a file, send error to it immediately */
 
-        AePrintException (ASL_FILE_STDERR, Enode, NULL);
-    }
+/*******************************************************************************
+ *
+ * FUNCTION:    AslCommonError2
+ *
+ * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
+ *              MessageId           - Index into global message buffer
+ *              LineNumber          - Actual file line number
+ *              Column              - Column in current line
+ *              SourceLine          - Actual source code line
+ *              Filename            - source filename
+ *              ExtraMessage        - additional error message
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Create a new error node and add it to the error log
+ *
+ ******************************************************************************/
 
-    Gbl_ExceptionCount[Level]++;
+void
+AslCommonError2 (
+    UINT8                   Level,
+    UINT16                  MessageId,
+    UINT32                  LineNumber,
+    UINT32                  Column,
+    char                    *SourceLine,
+    char                    *Filename,
+    char                    *ExtraMessage)
+{
+    AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
+        Filename, ExtraMessage, SourceLine, NULL);
 }
 
 
@@ -753,48 +921,51 @@ AslCommonError (
     char                    *Filename,
     char                    *ExtraMessage)
 {
-    char                    *MessageBuffer = NULL;
-    ASL_ERROR_MSG           *Enode;
-
-
-    if (AslIsExceptionIgnored (Level, MessageId))
-    {
-        return;
-    }
-
-    Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
-
-    if (ExtraMessage)
-    {
-        /* Allocate a buffer for the message and a new error node */
-
-        MessageBuffer = UtStringCacheCalloc (strlen (ExtraMessage) + 1);
-
-        /* Keep a copy of the extra message */
+    AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
+        LogicalByteOffset, Column, Filename, ExtraMessage,
+        NULL, NULL);
+}
 
-        strcpy (MessageBuffer, ExtraMessage);
-    }
 
-    /* Initialize the error node */
+/*******************************************************************************
+ *
+ * FUNCTION:    AslLogNewError
+ *
+ * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
+ *              MessageId           - Index into global message buffer
+ *              CurrentLineNumber   - Actual file line number
+ *              LogicalLineNumber   - Cumulative line number
+ *              LogicalByteOffset   - Byte offset in source file
+ *              Column              - Column in current line
+ *              Filename            - source filename
+ *              Message             - additional error message
+ *              SourceLine          - Actual line of source code
+ *              SubError            - Sub-error associated with this error
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Create a new error node and add it to the error log
+ *
+ ******************************************************************************/
+static void
+AslLogNewError (
+    UINT8                   Level,
+    UINT16                  MessageId,
+    UINT32                  LineNumber,
+    UINT32                  LogicalLineNumber,
+    UINT32                  LogicalByteOffset,
+    UINT32                  Column,
+    char                    *Filename,
+    char                    *Message,
+    char                    *SourceLine,
+    ASL_ERROR_MSG           *SubError)
+{
+    ASL_ERROR_MSG           *Enode = NULL;
 
-    if (Filename)
-    {
-        Enode->Filename = Filename;
-        Enode->FilenameLength = strlen (Filename);
-        if (Enode->FilenameLength < 6)
-        {
-            Enode->FilenameLength = 6;
-        }
-    }
 
-    Enode->MessageId            = MessageId;
-    Enode->Level                = Level;
-    Enode->LineNumber           = CurrentLineNumber;
-    Enode->LogicalLineNumber    = LogicalLineNumber;
-    Enode->LogicalByteOffset    = LogicalByteOffset;
-    Enode->Column               = Column;
-    Enode->Message              = MessageBuffer;
-    Enode->SourceLine           = NULL;
+    AslInitEnode (&Enode, Level, MessageId, LineNumber, LogicalLineNumber,
+        LogicalByteOffset, Column, Filename, Message, SourceLine,
+        SubError);
 
     /* Add the new node to the error node list */
 
@@ -825,8 +996,8 @@ AslCommonError (
  *
  * FUNCTION:    AslIsExceptionIgnored
  *
- * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
- *              MessageId           - Index into global message buffer
+ * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
+ *              MessageId       - Index into global message buffer
  *
  * RETURN:      BOOLEAN
  *
@@ -840,7 +1011,7 @@ AslIsExceptionIgnored (
     UINT8                   Level,
     UINT16                  MessageId)
 {
-    BOOLEAN ExceptionIgnored;
+    BOOLEAN                 ExceptionIgnored;
 
 
     /* Note: this allows exception to be disabled and expected */
@@ -869,7 +1040,8 @@ void
 AslCheckExpectedExceptions (
     void)
 {
-    UINT8 i;
+    UINT8                   i;
+
 
     for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
     {
@@ -980,8 +1152,8 @@ AslDisableException (
  *
  * FUNCTION:    AslIsExceptionDisabled
  *
- * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
- *              MessageId           - Index into global message buffer
+ * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
+ *              MessageId       - Index into global message buffer
  *
  * RETURN:      TRUE if exception/message should be ignored
  *
@@ -999,9 +1171,8 @@ AslIsExceptionExpected (
     UINT32                  i;
 
 
-    /*
-     * Mark this exception as received
-     */
+    /* Mark this exception as received */
+
     EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
     for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
     {
@@ -1080,6 +1251,61 @@ AslIsExceptionDisabled (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AslDualParseOpError
+ *
+ * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
+ *              MainMsgId       - Index into global message buffer
+ *              MainOp          - Parse node where error happened
+ *              MainMsg         - Message pertaining to the MainOp
+ *              SubMsgId        - Index into global message buffer
+ *              SubOp           - Additional parse node for better message
+ *              SubMsg          - Message pertainint to SubOp
+ *
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Main error reporting routine for the ASL compiler for error
+ *              messages that point to multiple parse objects.
+ *
+ ******************************************************************************/
+
+void
+AslDualParseOpError (
+    UINT8                   Level,
+    UINT16                  MainMsgId,
+    ACPI_PARSE_OBJECT       *MainOp,
+    char                    *MainMsg,
+    UINT16                  SubMsgId,
+    ACPI_PARSE_OBJECT       *SubOp,
+    char                    *SubMsg)
+{
+    ASL_ERROR_MSG           *SubEnode = NULL;
+
+
+    /* Check if user wants to ignore this exception */
+
+    if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp)
+    {
+        return;
+    }
+
+    if (SubOp)
+    {
+        AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
+            SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
+            SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
+            NULL, NULL);
+    }
+
+    AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
+        MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
+        MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
+        NULL, SubEnode);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AslError
diff --git a/sys/contrib/dev/acpica/source/compiler/aslfiles.c b/sys/contrib/dev/acpica/source/compiler/aslfiles.c
index 46307ab04a..53df683e55 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslfiles.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslfiles.c
@@ -151,7 +151,6 @@
 
 #include "aslcompiler.h"
 #include "acapps.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          ACPI_COMPILER
         ACPI_MODULE_NAME    ("aslfiles")
@@ -326,14 +325,14 @@ FlMergePathnames (
         (*FilePathname == '/') ||
          (FilePathname[1] == ':'))
     {
-        Pathname = UtStringCacheCalloc (strlen (FilePathname) + 1);
+        Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1);
         strcpy (Pathname, FilePathname);
         goto ConvertBackslashes;
     }
 
     /* Need a local copy of the prefix directory path */
 
-    CommonPath = UtStringCacheCalloc (strlen (PrefixDir) + 1);
+    CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1);
     strcpy (CommonPath, PrefixDir);
 
     /*
@@ -369,7 +368,7 @@ FlMergePathnames (
     /* Build the final merged pathname */
 
 ConcatenatePaths:
-    Pathname = UtStringCacheCalloc (
+    Pathname = UtLocalCacheCalloc (
         strlen (CommonPath) + strlen (FilePathname) + 2);
     if (LastElement && *CommonPath)
     {
diff --git a/sys/contrib/dev/acpica/source/compiler/aslhelp.c b/sys/contrib/dev/acpica/source/compiler/aslhelp.c
index e1266dc864..2d78aeb23b 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslhelp.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslhelp.c
@@ -173,6 +173,7 @@ void
 Usage (
     void)
 {
+    printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
     printf ("%s\n\n", ASL_COMPLIANCE);
     ACPI_USAGE_HEADER ("iasl [Options] [Files]");
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslload.c b/sys/contrib/dev/acpica/source/compiler/aslload.c
index 2c825f0fd3..7ccc0b58a6 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslload.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslload.c
@@ -327,8 +327,9 @@ LdLoadFieldElements (
                      * The name already exists in this scope
                      * But continue processing the elements
                      */
-                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
-                        Child->Asl.Value.String);
+                    AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
+                        Child->Asl.Value.String, ASL_MSG_FOUND_HERE, Node->Op,
+                        Node->Op->Asl.ExternalName);
                 }
             }
             else
@@ -388,8 +389,10 @@ LdLoadResourceElements (
         {
             /* Actual node causing the error was saved in ParentMethod */
 
-            AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS,
-                (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath);
+            AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS,
+                (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod,
+                Op->Asl.Namepath, ASL_MSG_FOUND_HERE, Node->Op,
+                Node->Op->Asl.ExternalName);
             return (AE_OK);
         }
         return (Status);
@@ -805,8 +808,8 @@ LdNamespace1Begin (
                 /*
                  * Allow one create on an object or segment that was
                  * previously declared External only if WalkState->OwnerId and
-                 * Node->OwnerId are found in different tables (meaning that
-                 * they have differnt OwnerIds).
+                 * Node->OwnerId are different (meaning that the current WalkState
+                 * and the Node are in different tables).
                  */
                 Node->Flags &= ~ANOBJ_IS_EXTERNAL;
                 Node->Type = (UINT8) ObjectType;
@@ -827,8 +830,9 @@ LdNamespace1Begin (
                 if (Node->OwnerId == WalkState->OwnerId &&
                     !(Node->Flags & IMPLICIT_EXTERNAL))
                 {
-                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
-                        Op->Asl.ExternalName);
+                    AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
+                        Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op,
+                        Node->Op->Asl.ExternalName);
                 }
                 if (Node->Flags & IMPLICIT_EXTERNAL)
                 {
@@ -849,8 +853,9 @@ LdNamespace1Begin (
 
                 if (Node->OwnerId == WalkState->OwnerId)
                 {
-                    AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
-                        Op->Asl.ExternalName);
+                    AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
+                        Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op,
+                        Node->Op->Asl.ExternalName);
                 }
             }
             else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
@@ -905,8 +910,9 @@ LdNamespace1Begin (
             {
                 /* Valid error, object already exists */
 
-                AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
-                    Op->Asl.ExternalName);
+                AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
+                    Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op,
+                    Node->Op->Asl.ExternalName);
                 return_ACPI_STATUS (AE_OK);
             }
         }
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmapenter.c b/sys/contrib/dev/acpica/source/compiler/aslmapenter.c
index da9f8e514b..69cea72f8c 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmapenter.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmapenter.c
@@ -332,7 +332,7 @@ MpCreateGpioInfo (
      * sorted by both source device name and then the pin number. There is
      * one block per pin.
      */
-    Buffer = UtStringCacheCalloc (sizeof (ACPI_GPIO_INFO));
+    Buffer = UtLocalCacheCalloc (sizeof (ACPI_GPIO_INFO));
     Info = ACPI_CAST_PTR (ACPI_GPIO_INFO, Buffer);
 
     NextGpio = Gbl_GpioList;
@@ -409,7 +409,7 @@ MpCreateSerialInfo (
      * Allocate a new info block and insert it into the global Serial list
      * sorted by both source device name and then the address.
      */
-    Buffer = UtStringCacheCalloc (sizeof (ACPI_SERIAL_INFO));
+    Buffer = UtLocalCacheCalloc (sizeof (ACPI_SERIAL_INFO));
     Info = ACPI_CAST_PTR (ACPI_SERIAL_INFO, Buffer);
 
     NextSerial = Gbl_SerialList;
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmaputils.c b/sys/contrib/dev/acpica/source/compiler/aslmaputils.c
index b66d176db2..82b1d2809b 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmaputils.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmaputils.c
@@ -212,7 +212,7 @@ MpGetHidFromParseTree (
 
             /* Convert EISAID to a string */
 
-            HidString = UtStringCacheCalloc (ACPI_EISAID_STRING_SIZE);
+            HidString = UtLocalCacheCalloc (ACPI_EISAID_STRING_SIZE);
             AcpiExEisaIdToString (HidString, Arg->Asl.Value.Integer);
             return (HidString);
 
@@ -277,7 +277,7 @@ MpGetHidValue (
 
         /* Convert EISAID to a string */
 
-        HidString = UtStringCacheCalloc (ACPI_EISAID_STRING_SIZE);
+        HidString = UtLocalCacheCalloc (ACPI_EISAID_STRING_SIZE);
         AcpiExEisaIdToString (HidString, HidNode->Object->Integer.Value);
         return (HidString);
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmessages.c b/sys/contrib/dev/acpica/source/compiler/aslmessages.c
index 159f9d23f8..5cff70a522 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmessages.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmessages.c
@@ -350,7 +350,9 @@ const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_CONSTANT_REQUIRED */          "Non-reducible expression",
 /*    ASL_MSG_CROSS_TABLE_SCOPE */          "Illegal open scope on external object from within DSDT",
 /*    ASL_MSG_EXCEPTION_NOT_RECEIVED */     "Expected remark, warning, or error did not occur. Message ID:",
-/*    ASL_MSG_NULL_RESOURCE_TEMPLATE */     "Empty Resource Template (END_TAG only)"
+/*    ASL_MSG_NULL_RESOURCE_TEMPLATE */     "Empty Resource Template (END_TAG only)",
+/*    ASL_MSG_FOUND_HERE */                 "Original name creation/declaration below: ",
+/*    ASL_MSG_ILLEGAL_RECURSION */          "Illegal recursive call to method that creates named objects"
 };
 
 /* Table compiler */
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmessages.h b/sys/contrib/dev/acpica/source/compiler/aslmessages.h
index d69c05a176..a80184016c 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmessages.h
+++ b/sys/contrib/dev/acpica/source/compiler/aslmessages.h
@@ -353,6 +353,8 @@ typedef enum
     ASL_MSG_CROSS_TABLE_SCOPE,
     ASL_MSG_EXCEPTION_NOT_RECEIVED,
     ASL_MSG_NULL_RESOURCE_TEMPLATE,
+    ASL_MSG_FOUND_HERE,
+    ASL_MSG_ILLEGAL_RECURSION,
 
     /* These messages are used by the Data Table compiler only */
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmethod.c b/sys/contrib/dev/acpica/source/compiler/aslmethod.c
index 9734b643ef..b2bb89c536 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmethod.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmethod.c
@@ -347,10 +347,31 @@ MtMethodAnalysisWalkBegin (
 
     case PARSEOP_METHODCALL:
 
+        /* Check for a recursive method call */
+
         if (MethodInfo &&
            (Op->Asl.Node == MethodInfo->Op->Asl.Node))
         {
-            AslError (ASL_REMARK, ASL_MSG_RECURSION, Op, Op->Asl.ExternalName);
+            if (MethodInfo->CreatesNamedObjects)
+            {
+                /*
+                 * This is an error, as it will fail at runtime on all ACPI
+                 * implementations. Any named object declarations will be
+                 * executed twice, causing failure the second time. Note,
+                 * this is independent of whether the method is declared
+                 * Serialized, because the same thread is attempting to
+                 * reenter the method, and this will always succeed.
+                 */
+                AslDualParseOpError (ASL_ERROR, ASL_MSG_ILLEGAL_RECURSION, Op,
+                    Op->Asl.Value.String, ASL_MSG_FOUND_HERE, MethodInfo->Op,
+                    MethodInfo->Op->Asl.ExternalName);
+            }
+            else
+            {
+                /* Method does not create objects, issue a remark */
+
+                AslError (ASL_REMARK, ASL_MSG_RECURSION, Op, Op->Asl.ExternalName);
+            }
         }
         break;
 
@@ -622,20 +643,28 @@ MtCheckNamedObjectInMethod (
         return;
     }
 
-    /* Determine if we are creating a named object */
+    /* Determine if we are creating a named object within a method */
+
+    if (!MethodInfo)
+    {
+        return;
+    }
 
     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
     if (OpInfo->Class == AML_CLASS_NAMED_OBJECT)
     {
         /*
-         * If we have a named object created within a non-serialized method,
-         * emit a remark that the method should be serialized.
+         * 1) Mark the method as a method that creates named objects.
+         *
+         * 2) If the method is non-serialized, emit a remark that the method
+         * should be serialized.
          *
          * Reason: If a thread blocks within the method for any reason, and
-         * another thread enters the method, the method will fail because an
-         * attempt will be made to create the same object twice.
+         * another thread enters the method, the method will fail because
+         * an attempt will be made to create the same object twice.
          */
-        if (MethodInfo && !MethodInfo->ShouldBeSerialized)
+        MethodInfo->CreatesNamedObjects = TRUE;
+        if (!MethodInfo->ShouldBeSerialized)
         {
             AslError (ASL_REMARK, ASL_MSG_SERIALIZED_REQUIRED, MethodInfo->Op,
                 "due to creation of named objects within");
diff --git a/sys/contrib/dev/acpica/source/compiler/asloperands.c b/sys/contrib/dev/acpica/source/compiler/asloperands.c
index 03403a39a8..9e5788fa12 100644
--- a/sys/contrib/dev/acpica/source/compiler/asloperands.c
+++ b/sys/contrib/dev/acpica/source/compiler/asloperands.c
@@ -1037,7 +1037,7 @@ OpnDoDefinitionBlock (
          * We will use the AML filename that is embedded in the source file
          * for the output filename.
          */
-        Filename = UtStringCacheCalloc (strlen (Gbl_DirectoryPath) +
+        Filename = UtLocalCacheCalloc (strlen (Gbl_DirectoryPath) +
             strlen ((char *) Child->Asl.Value.Buffer) + 1);
 
         /* Prepend the current directory path */
@@ -1094,7 +1094,7 @@ OpnDoDefinitionBlock (
     if (Child->Asl.Value.String)
     {
         Length = strlen (Child->Asl.Value.String);
-        Gbl_TableId = UtStringCacheCalloc (Length + 1);
+        Gbl_TableId = UtLocalCacheCalloc (Length + 1);
         strcpy (Gbl_TableId, Child->Asl.Value.String);
 
         /*
diff --git a/sys/contrib/dev/acpica/source/compiler/aslopt.c b/sys/contrib/dev/acpica/source/compiler/aslopt.c
index 79e41da246..fa92d711eb 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslopt.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslopt.c
@@ -275,7 +275,7 @@ OptSearchToRoot (
 
     /* We must allocate a new string for the name (TargetPath gets deleted) */
 
-    *NewPath = UtStringCacheCalloc (ACPI_NAME_SIZE + 1);
+    *NewPath = UtLocalCacheCalloc (ACPI_NAME_SIZE + 1);
     strcpy (*NewPath, Path);
 
     if (strncmp (*NewPath, "_T_", 3))
diff --git a/sys/contrib/dev/acpica/source/compiler/asloptions.c b/sys/contrib/dev/acpica/source/compiler/asloptions.c
index 6d39f6d254..683aaa2f4f 100644
--- a/sys/contrib/dev/acpica/source/compiler/asloptions.c
+++ b/sys/contrib/dev/acpica/source/compiler/asloptions.c
@@ -178,9 +178,6 @@ AslDoResponseFile (
 #define ASL_TOKEN_SEPARATORS    " \t\n"
 #define ASL_SUPPORTED_OPTIONS   "@:a:b|c|d^D:e:f^gh^i|I:l^m:no|p:P^q^r:s|t|T+G^v^w|x:z"
 
-static char ASL_BUILD_DATE[] = __DATE__;
-static char ASL_BUILD_TIME[] = __TIME__;
-
 
 /*******************************************************************************
  *
@@ -207,7 +204,6 @@ AslCommandLine (
 
     if (argc < 2)
     {
-        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
         Usage ();
         exit (1);
     }
@@ -541,7 +537,6 @@ AslDoOptions (
         {
         case '^':
 
-            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
             Usage ();
             exit (0);
 
@@ -891,8 +886,8 @@ AslDoOptions (
 
         case 'd':
 
-            printf ("%s Build date/time: %s %s\n",
-                ASL_COMPILER_NAME, ASL_BUILD_DATE, ASL_BUILD_TIME);
+            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
+            printf (ACPI_COMMON_BUILD_TIME);
             exit (0);
 
         case 'e':
diff --git a/sys/contrib/dev/acpica/source/compiler/aslparseop.c b/sys/contrib/dev/acpica/source/compiler/aslparseop.c
index 41badcee52..438e5a281a 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslparseop.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslparseop.c
@@ -158,13 +158,6 @@
         ACPI_MODULE_NAME    ("aslparseop")
 
 
-/* Local prototypes */
-
-static ACPI_PARSE_OBJECT *
-TrGetOpFromCache (
-    void);
-
-
 /*******************************************************************************
  *
  * FUNCTION:    TrCreateOp
@@ -490,7 +483,7 @@ TrCreateTargetOp (
         return (NULL);
     }
 
-    Op = TrGetOpFromCache ();
+    Op = UtParseOpCacheCalloc ();
 
     /* Copy the pertinent values (omit link pointer fields) */
 
@@ -788,7 +781,7 @@ TrAllocateOp (
     ACPI_PARSE_OBJECT       *LatestOp;
 
 
-    Op = TrGetOpFromCache ();
+    Op = UtParseOpCacheCalloc ();
 
     Op->Asl.ParseOpcode       = (UINT16) ParseOpcode;
     Op->Asl.Filename          = Gbl_Files[ASL_FILE_INPUT].Filename;
@@ -875,50 +868,6 @@ TrAllocateOp (
 }
 
 
-/*******************************************************************************
- *
- * FUNCTION:    TrGetOpFromCache
- *
- * PARAMETERS:  None
- *
- * RETURN:      New parse op. Aborts on allocation failure
- *
- * DESCRIPTION: Allocate a new parse op for the parse tree. Bypass the local
- *              dynamic memory manager for performance reasons (This has a
- *              major impact on the speed of the compiler.)
- *
- ******************************************************************************/
-
-static ACPI_PARSE_OBJECT *
-TrGetOpFromCache (
-    void)
-{
-    ASL_CACHE_INFO          *Cache;
-
-
-    if (Gbl_ParseOpCacheNext >= Gbl_ParseOpCacheLast)
-    {
-        /* Allocate a new buffer */
-
-        Cache = UtLocalCalloc (sizeof (Cache->Next) +
-            (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE));
-
-        /* Link new cache buffer to head of list */
-
-        Cache->Next = Gbl_ParseOpCacheList;
-        Gbl_ParseOpCacheList = Cache;
-
-        /* Setup cache management pointers */
-
-        Gbl_ParseOpCacheNext = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Cache->Buffer);
-        Gbl_ParseOpCacheLast = Gbl_ParseOpCacheNext + ASL_PARSEOP_CACHE_SIZE;
-    }
-
-    Gbl_ParseOpCount++;
-    return (Gbl_ParseOpCacheNext++);
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    TrPrintOpFlags
diff --git a/sys/contrib/dev/acpica/source/compiler/aslprintf.c b/sys/contrib/dev/acpica/source/compiler/aslprintf.c
index e5f56f11fd..48c2fb1fe5 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslprintf.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslprintf.c
@@ -293,7 +293,7 @@ OpcParsePrintf (
 
         if (StringToProcess)
         {
-            NewString = UtStringCacheCalloc (StringLength + 1);
+            NewString = UtLocalCacheCalloc (StringLength + 1);
             strncpy (NewString, StartPosition, StringLength);
 
             NewOp = TrAllocateOp (PARSEOP_STRING_LITERAL);
@@ -382,7 +382,7 @@ OpcParsePrintf (
 
     if (StringToProcess)
     {
-        NewString = UtStringCacheCalloc (StringLength + 1);
+        NewString = UtLocalCacheCalloc (StringLength + 1);
         strncpy (NewString, StartPosition, StringLength);
 
         NewOp = TrAllocateOp (PARSEOP_STRING_LITERAL);
diff --git a/sys/contrib/dev/acpica/source/compiler/aslstartup.c b/sys/contrib/dev/acpica/source/compiler/aslstartup.c
index 72c0d641e1..fa1ac25bd9 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslstartup.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslstartup.c
@@ -410,7 +410,7 @@ AslDoDisassembly (
 
     Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
 
-    CmDeleteCaches ();
+    UtDeleteLocalCaches ();
     return (AE_OK);
 }
 
@@ -453,7 +453,7 @@ AslDoOneFile (
     /* Take a copy of the input filename, convert any backslashes */
 
     Gbl_Files[ASL_FILE_INPUT].Filename =
-        UtStringCacheCalloc (strlen (Filename) + 1);
+        UtLocalCacheCalloc (strlen (Filename) + 1);
 
     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
     UtConvertBackslashes (Gbl_Files[ASL_FILE_INPUT].Filename);
diff --git a/sys/contrib/dev/acpica/source/compiler/aslsupport.l b/sys/contrib/dev/acpica/source/compiler/aslsupport.l
index 42cee752a9..40cead33c3 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslsupport.l
+++ b/sys/contrib/dev/acpica/source/compiler/aslsupport.l
@@ -382,7 +382,7 @@ AslPushInputFileStack (
     /* Reset the global line count and filename */
 
     Gbl_Files[ASL_FILE_INPUT].Filename =
-        UtStringCacheCalloc (strlen (Filename) + 1);
+        UtLocalCacheCalloc (strlen (Filename) + 1);
 
     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
 
@@ -1009,7 +1009,7 @@ CompletedString:
      */
     *StringBuffer = 0;
 
-    CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
+    CleanString = UtLocalCacheCalloc (strlen (MsgBuffer) + 1);
     strcpy (CleanString, MsgBuffer);
     AslCompilerlval.s = CleanString;
     return (TRUE);
diff --git a/sys/contrib/dev/acpica/source/compiler/asltypes.h b/sys/contrib/dev/acpica/source/compiler/asltypes.h
index e4250871fd..f72226d5e0 100644
--- a/sys/contrib/dev/acpica/source/compiler/asltypes.h
+++ b/sys/contrib/dev/acpica/source/compiler/asltypes.h
@@ -202,6 +202,7 @@ typedef struct asl_method_info
     UINT8                   ArgInitialized[ACPI_METHOD_NUM_ARGS];
     UINT8                   HasBeenTyped;
     UINT8                   ShouldBeSerialized;
+    UINT8                   CreatesNamedObjects;
 
 } ASL_METHOD_INFO;
 
@@ -337,8 +338,11 @@ typedef struct asl_include_dir
 } ASL_INCLUDE_DIR;
 
 
-/* An entry in the exception list, one for each error/warning */
-
+/*
+ * An entry in the exception list, one for each error/warning
+ * Note: SubError nodes would be treated with the same messageId and Level
+ * as the parent error node.
+ */
 typedef struct asl_error_msg
 {
     UINT32                      LineNumber;
@@ -347,6 +351,7 @@ typedef struct asl_error_msg
     UINT32                      Column;
     char                        *Message;
     struct asl_error_msg        *Next;
+    struct asl_error_msg        *SubError;
     char                        *Filename;
     char                        *SourceLine;
     UINT32                      FilenameLength;
diff --git a/sys/contrib/dev/acpica/source/compiler/aslutils.c b/sys/contrib/dev/acpica/source/compiler/aslutils.c
index 8b46d38bb5..82d11b4b96 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslutils.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslutils.c
@@ -174,12 +174,6 @@ UtAttachNameseg (
     ACPI_PARSE_OBJECT       *Op,
     char                    *Name);
 
-static void
-UtReallocLineBuffers (
-    char                    **Buffer,
-    UINT32                  OldSize,
-    UINT32                  NewSize);
-
 
 /*******************************************************************************
  *
@@ -309,45 +303,6 @@ UtDisplayConstantOpcodes (
 }
 
 
-/*******************************************************************************
- *
- * FUNCTION:    UtLocalCalloc
- *
- * PARAMETERS:  Size                - Bytes to be allocated
- *
- * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
- *
- * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
- *              allocation failure, on the assumption that nothing more can be
- *              accomplished.
- *
- ******************************************************************************/
-
-void *
-UtLocalCalloc (
-    UINT32                  Size)
-{
-    void                    *Allocated;
-
-
-    Allocated = ACPI_ALLOCATE_ZEROED (Size);
-    if (!Allocated)
-    {
-        AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
-            Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
-            Gbl_InputByteCount, Gbl_CurrentColumn,
-            Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
-
-        CmCleanupAndExit ();
-        exit (1);
-    }
-
-    TotalAllocations++;
-    TotalAllocated += Size;
-    return (Allocated);
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    UtBeginEvent
@@ -635,180 +590,6 @@ UtCheckIntegerRange (
 }
 
 
-/*******************************************************************************
- *
- * FUNCTION:    UtStringCacheCalloc
- *
- * PARAMETERS:  Length              - Size of buffer requested
- *
- * 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
- *              major impact on the speed of the compiler.)
- *
- ******************************************************************************/
-
-char *
-UtStringCacheCalloc (
-    UINT32                  Length)
-{
-    char                    *Buffer;
-    ASL_CACHE_INFO          *Cache;
-    UINT32                  CacheSize = ASL_STRING_CACHE_SIZE;
-
-
-    if (Length > CacheSize)
-    {
-        CacheSize = Length;
-
-        if (Gbl_StringCacheList)
-        {
-            Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
-
-            /* Link new cache buffer just following head of list */
-
-            Cache->Next = Gbl_StringCacheList->Next;
-            Gbl_StringCacheList->Next = Cache;
-
-            /* Leave cache management pointers alone as they pertain to head */
-
-            Gbl_StringCount++;
-            Gbl_StringSize += Length;
-
-            return (Cache->Buffer);
-        }
-    }
-
-    if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
-    {
-        /* Allocate a new buffer */
-
-        Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
-
-        /* Link new cache buffer to head of list */
-
-        Cache->Next = Gbl_StringCacheList;
-        Gbl_StringCacheList = Cache;
-
-        /* Setup cache management pointers */
-
-        Gbl_StringCacheNext = Cache->Buffer;
-        Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize;
-    }
-
-    Gbl_StringCount++;
-    Gbl_StringSize += Length;
-
-    Buffer = Gbl_StringCacheNext;
-    Gbl_StringCacheNext += Length;
-    return (Buffer);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    UtExpandLineBuffers
- *
- * PARAMETERS:  None. Updates global line buffer pointers.
- *
- * RETURN:      None. Reallocates the global line buffers
- *
- * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
- *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
- *              Also used for the initial allocation of the buffers, when
- *              all of the buffer pointers are NULL. Initial allocations are
- *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
- *
- *****************************************************************************/
-
-void
-UtExpandLineBuffers (
-    void)
-{
-    UINT32                  NewSize;
-
-
-    /* Attempt to double the size of all line buffers */
-
-    NewSize = Gbl_LineBufferSize * 2;
-    if (Gbl_CurrentLineBuffer)
-    {
-        DbgPrint (ASL_DEBUG_OUTPUT,
-            "Increasing line buffer size from %u to %u\n",
-            Gbl_LineBufferSize, NewSize);
-    }
-
-    UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize);
-    UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize);
-    UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize);
-    UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize);
-
-    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
-    Gbl_LineBufferSize = NewSize;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    UtReallocLineBuffers
- *
- * PARAMETERS:  Buffer              - Buffer to realloc
- *              OldSize             - Old size of Buffer
- *              NewSize             - New size of Buffer
- *
- * RETURN:      none
- *
- * DESCRIPTION: Reallocate and initialize Buffer
- *
- *****************************************************************************/
-
-static void
-UtReallocLineBuffers (
-    char                    **Buffer,
-    UINT32                  OldSize,
-    UINT32                  NewSize)
-{
-
-    *Buffer = realloc (*Buffer, NewSize);
-    if (*Buffer)
-    {
-        memset (*Buffer + OldSize, 0, NewSize - OldSize);
-        return;
-    }
-
-    printf ("Could not increase line buffer size from %u to %u\n",
-        OldSize, NewSize);
-
-    AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL);
-    AslAbort ();
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    UtFreeLineBuffers
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Free all line buffers
- *
- *****************************************************************************/
-
-void
-UtFreeLineBuffers (
-    void)
-{
-
-    free (Gbl_CurrentLineBuffer);
-    free (Gbl_MainTokenBuffer);
-    free (Gbl_MacroTokenBuffer);
-    free (Gbl_ExpressionTokenBuffer);
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    UtInternalizeName
@@ -843,7 +624,7 @@ UtInternalizeName (
 
     /* We need a segment to store the internal name */
 
-    Info.InternalName = UtStringCacheCalloc (Info.Length);
+    Info.InternalName = UtLocalCacheCalloc (Info.Length);
 
     /* Build the name */
 
diff --git a/sys/contrib/dev/acpica/source/compiler/cvcompiler.c b/sys/contrib/dev/acpica/source/compiler/cvcompiler.c
index afb6ea1bce..d2a6c8f06f 100644
--- a/sys/contrib/dev/acpica/source/compiler/cvcompiler.c
+++ b/sys/contrib/dev/acpica/source/compiler/cvcompiler.c
@@ -193,7 +193,7 @@ CvProcessComment (
         *StringBuffer = 0;
 
         CvDbgPrint ("Multi-line comment\n");
-        CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
+        CommentString = UtLocalCacheCalloc (strlen (MsgBuffer) + 1);
         strcpy (CommentString, MsgBuffer);
 
         CvDbgPrint ("CommentString: %s\n", CommentString);
@@ -208,7 +208,7 @@ CvProcessComment (
 
         if (LineToken)
         {
-            FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1);
+            FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1);
             strcpy (FinalLineToken, LineToken);
 
             /* Get rid of any carriage returns */
@@ -238,7 +238,7 @@ CvProcessComment (
                     }
                 }
 
-                FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1);
+                FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1);
                 strcat (FinalLineToken, LineToken);
 
                 /* Get rid of any carriage returns */
@@ -268,7 +268,7 @@ CvProcessComment (
             * spacing.
             */
             FinalCommentString =
-                UtStringCacheCalloc (strlen (CommentString) +
+                UtLocalCacheCalloc (strlen (CommentString) +
                 CurrentState.SpacesBefore + 1);
 
             for (i = 0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) &&
@@ -313,7 +313,7 @@ CvProcessCommentType2 (
     {
         *StringBuffer = 0; /* null terminate */
         CvDbgPrint ("Single-line comment\n");
-        CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
+        CommentString = UtLocalCacheCalloc (strlen (MsgBuffer) + 1);
         strcpy (CommentString, MsgBuffer);
 
         /* If this comment lies on the same line as the latest parse op,
@@ -342,7 +342,7 @@ CvProcessCommentType2 (
          * [ (spaces) (comment)  ( * /) ('\0') ]
          *
          */
-        FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore +
+        FinalCommentString = UtLocalCacheCalloc (CurrentState.SpacesBefore +
             strlen (CommentString) + 3 + 1);
 
         for (i = 0; (CurrentState.CommentType != 1) &&
@@ -507,7 +507,7 @@ CgWriteAmlDefBlockComment(
 
     /* First, print the file name comment after changing .asl to .dsl */
 
-    NewFilename = UtStringCacheCalloc (strlen (Op->Asl.Filename));
+    NewFilename = UtLocalCacheCalloc (strlen (Op->Asl.Filename));
     strcpy (NewFilename, Op->Asl.Filename);
     DirectoryPosition = strrchr (NewFilename, '/');
     Position = strrchr (NewFilename, '.');
@@ -944,7 +944,7 @@ CvAppendInlineComment (
 
     Size = strlen (ToAdd);
     Size += strlen (InlineComment);
-    Str = UtStringCacheCalloc (Size + 1);
+    Str = UtLocalCacheCalloc (Size + 1);
 
     strcpy (Str, InlineComment);
     strcat (Str, ToAdd);
diff --git a/sys/contrib/dev/acpica/source/compiler/cvparser.c b/sys/contrib/dev/acpica/source/compiler/cvparser.c
index 9941582a56..b2e3e76742 100644
--- a/sys/contrib/dev/acpica/source/compiler/cvparser.c
+++ b/sys/contrib/dev/acpica/source/compiler/cvparser.c
@@ -714,7 +714,7 @@ CvCaptureCommentsOnly (
     UINT8                   *Aml = ParserState->Aml;
     UINT16                  Opcode = (UINT16) ACPI_GET8 (Aml);
     UINT32                  Length = 0;
-    UINT8                   CommentOption = (UINT16) ACPI_GET8 (Aml+1);
+    UINT8                   CommentOption;
     BOOLEAN                 StdDefBlockFlag = FALSE;
     ACPI_COMMENT_NODE       *CommentNode;
     ACPI_FILE_NODE          *FileNode;
diff --git a/sys/contrib/dev/acpica/source/compiler/dtcompile.c b/sys/contrib/dev/acpica/source/compiler/dtcompile.c
index 5344562433..0823196feb 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtcompile.c
+++ b/sys/contrib/dev/acpica/source/compiler/dtcompile.c
@@ -152,7 +152,6 @@
 #define _DECLARE_DT_GLOBALS
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dtcompile")
@@ -281,7 +280,6 @@ DtDoCompile (
 CleanupAndExit:
 
     AcpiUtDeleteCaches ();
-    DtDeleteCaches ();
     CmCleanupAndExit ();
     return (Status);
 }
@@ -412,7 +410,7 @@ DtCompileDataTable (
         return (AE_ERROR);
     }
 
-    Gbl_Signature = UtStringCacheCalloc (strlen (Signature) + 1);
+    Gbl_Signature = UtLocalCacheCalloc (strlen (Signature) + 1);
     strcpy (Gbl_Signature, Signature);
 
     /*
@@ -585,7 +583,7 @@ DtCompileTable (
 
     if (Length > 0)
     {
-        String = UtStringCacheCalloc (Length);
+        String = UtLocalCacheCalloc (Length);
         Subtable->Buffer = ACPI_CAST_PTR (UINT8, String);
     }
 
@@ -828,7 +826,7 @@ DtCompilePadding (
 
     if (Length > 0)
     {
-        String = UtStringCacheCalloc (Length);
+        String = UtLocalCacheCalloc (Length);
         Subtable->Buffer = ACPI_CAST_PTR (UINT8, String);
     }
 
diff --git a/sys/contrib/dev/acpica/source/compiler/dtcompiler.h b/sys/contrib/dev/acpica/source/compiler/dtcompiler.h
index 90fad8896f..941e2c65e8 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtcompiler.h
+++ b/sys/contrib/dev/acpica/source/compiler/dtcompiler.h
@@ -154,7 +154,6 @@
 #ifndef _DTCOMPILER
 #define _DTCOMPILER
 
-#include <stdio.h>
 #include "acdisasm.h"
 
 
@@ -510,18 +509,6 @@ void
 DtSetTableLength(
     void);
 
-DT_SUBTABLE *
-UtSubtableCacheCalloc (
-    void);
-
-DT_FIELD *
-UtFieldCacheCalloc (
-    void);
-
-void
-DtDeleteCaches (
-    void);
-
 
 /* dttable - individual table compilation */
 
@@ -622,15 +609,19 @@ DtCompileNfit (
     void                    **PFieldList);
 
 ACPI_STATUS
-DtCompilePmtt (
+DtCompilePcct (
     void                    **PFieldList);
 
 ACPI_STATUS
-DtCompilePptt (
+DtCompilePdtt (
     void                    **PFieldList);
 
 ACPI_STATUS
-DtCompilePcct (
+DtCompilePmtt (
+    void                    **PFieldList);
+
+ACPI_STATUS
+DtCompilePptt (
     void                    **PFieldList);
 
 ACPI_STATUS
@@ -641,6 +632,10 @@ ACPI_STATUS
 DtCompileS3pt (
     DT_FIELD                **PFieldList);
 
+ACPI_STATUS
+DtCompileSdev (
+    void                    **PFieldList);
+
 ACPI_STATUS
 DtCompileSlic (
     void                    **PFieldList);
@@ -661,6 +656,10 @@ ACPI_STATUS
 DtCompileTcpa (
     void                    **PFieldList);
 
+ACPI_STATUS
+DtCompileTpm2 (
+    void                    **PFieldList);
+
 ACPI_STATUS
 DtCompileUefi (
     void                    **PFieldList);
@@ -724,6 +723,7 @@ extern const unsigned char  TemplateMsdm[];
 extern const unsigned char  TemplateMtmr[];
 extern const unsigned char  TemplateNfit[];
 extern const unsigned char  TemplatePcct[];
+extern const unsigned char  TemplatePdtt[];
 extern const unsigned char  TemplatePmtt[];
 extern const unsigned char  TemplatePptt[];
 extern const unsigned char  TemplateRasf[];
@@ -731,6 +731,7 @@ extern const unsigned char  TemplateRsdt[];
 extern const unsigned char  TemplateS3pt[];
 extern const unsigned char  TemplateSbst[];
 extern const unsigned char  TemplateSdei[];
+extern const unsigned char  TemplateSdev[];
 extern const unsigned char  TemplateSlic[];
 extern const unsigned char  TemplateSlit[];
 extern const unsigned char  TemplateSpcr[];
diff --git a/sys/contrib/dev/acpica/source/compiler/dtexpress.c b/sys/contrib/dev/acpica/source/compiler/dtexpress.c
index 4e0ac89a82..8b97bdc0f2 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtexpress.c
+++ b/sys/contrib/dev/acpica/source/compiler/dtexpress.c
@@ -150,7 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 #include "dtparser.y.h"
 
 #define _COMPONENT          DT_COMPILER
diff --git a/sys/contrib/dev/acpica/source/compiler/dtfield.c b/sys/contrib/dev/acpica/source/compiler/dtfield.c
index b06877a8f8..290fa18bd1 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtfield.c
+++ b/sys/contrib/dev/acpica/source/compiler/dtfield.c
@@ -150,7 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dtfield")
diff --git a/sys/contrib/dev/acpica/source/compiler/dtio.c b/sys/contrib/dev/acpica/source/compiler/dtio.c
index 0112999ef5..1d8ee98bfc 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtio.c
+++ b/sys/contrib/dev/acpica/source/compiler/dtio.c
@@ -150,7 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 #include "acapps.h"
 
 #define _COMPONENT          DT_COMPILER
@@ -239,7 +238,7 @@ DtTrim (
 
     if (!strcmp (String, " "))
     {
-        ReturnString = UtStringCacheCalloc (1);
+        ReturnString = UtLocalCacheCalloc (1);
         return (ReturnString);
     }
 
@@ -287,7 +286,7 @@ DtTrim (
     /* Create the trimmed return string */
 
     Length = ACPI_PTR_DIFF (End, Start) + 1;
-    ReturnString = UtStringCacheCalloc (Length + 1);
+    ReturnString = UtLocalCacheCalloc (Length + 1);
     if (strlen (Start))
     {
         strncpy (ReturnString, Start, Length);
diff --git a/sys/contrib/dev/acpica/source/compiler/dtparser.y b/sys/contrib/dev/acpica/source/compiler/dtparser.y
index d5990fe45f..17607d96ce 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtparser.y
+++ b/sys/contrib/dev/acpica/source/compiler/dtparser.y
@@ -151,7 +151,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dtparser")
diff --git a/sys/contrib/dev/acpica/source/compiler/dtsubtable.c b/sys/contrib/dev/acpica/source/compiler/dtsubtable.c
index 44e36492ff..c7b85e9085 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtsubtable.c
+++ b/sys/contrib/dev/acpica/source/compiler/dtsubtable.c
@@ -150,7 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dtsubtable")
@@ -186,7 +185,7 @@ DtCreateSubtable (
 
     /* Create a new buffer for the subtable data */
 
-    String = UtStringCacheCalloc (Length);
+    String = UtLocalCacheCalloc (Length);
     Subtable->Buffer = ACPI_CAST_PTR (UINT8, String);
     memcpy (Subtable->Buffer, Buffer, Length);
 
diff --git a/sys/contrib/dev/acpica/source/compiler/dttable.c b/sys/contrib/dev/acpica/source/compiler/dttable.c
index 08b862d1a0..91e7544a9b 100644
--- a/sys/contrib/dev/acpica/source/compiler/dttable.c
+++ b/sys/contrib/dev/acpica/source/compiler/dttable.c
@@ -152,7 +152,6 @@
 /* Compile routines for the basic ACPI tables */
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dttable")
diff --git a/sys/contrib/dev/acpica/source/compiler/dttable1.c b/sys/contrib/dev/acpica/source/compiler/dttable1.c
index bdf0419cf9..138f4f3a17 100644
--- a/sys/contrib/dev/acpica/source/compiler/dttable1.c
+++ b/sys/contrib/dev/acpica/source/compiler/dttable1.c
@@ -152,7 +152,6 @@
 /* Compile all complex data tables, signatures starting with A-I */
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dttable1")
diff --git a/sys/contrib/dev/acpica/source/compiler/dttable2.c b/sys/contrib/dev/acpica/source/compiler/dttable2.c
index 356a7d0d19..172354cde8 100644
--- a/sys/contrib/dev/acpica/source/compiler/dttable2.c
+++ b/sys/contrib/dev/acpica/source/compiler/dttable2.c
@@ -152,7 +152,6 @@
 /* Compile all complex data tables, signatures starting with L-Z */
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          DT_COMPILER
         ACPI_MODULE_NAME    ("dttable2")
@@ -902,6 +901,66 @@ DtCompilePcct (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    DtCompilePdtt
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile PDTT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompilePdtt (
+    void                    **List)
+{
+    ACPI_STATUS             Status;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    ACPI_TABLE_PDTT         *PdttHeader;
+    UINT32                  Count = 0;
+
+
+    /* Main table */
+
+    Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable, TRUE);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    ParentTable = DtPeekSubtable ();
+    DtInsertSubtable (ParentTable, Subtable);
+
+    PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer);
+    PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT);
+
+    /* There is only one type of subtable at this time, no need to decode */
+
+    while (*PFieldList)
+    {
+        /* List of subchannel IDs, each 2 bytes */
+
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0,
+            &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        DtInsertSubtable (ParentTable, Subtable);
+        Count++;
+    }
+
+    PdttHeader->TriggerCount = (UINT8) Count;
+    return (AE_OK);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    DtCompilePmtt
@@ -1283,6 +1342,219 @@ DtCompileS3pt (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    DtCompileSdev
+ *
+ * PARAMETERS:  List                - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile SDEV.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileSdev (
+    void                    **List)
+{
+    ACPI_STATUS             Status;
+    ACPI_SDEV_HEADER        *SdevHeader;
+    DT_SUBTABLE             *Subtable;
+    DT_SUBTABLE             *ParentTable;
+    ACPI_DMTABLE_INFO       *InfoTable;
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    DT_FIELD                *SubtableStart;
+    ACPI_SDEV_PCIE          *Pcie = NULL;
+    ACPI_SDEV_NAMESPACE     *Namesp = NULL;
+    UINT32                  EntryCount;
+
+
+    /* Subtables */
+
+    while (*PFieldList)
+    {
+        /* Compile common SDEV subtable header */
+
+        SubtableStart = *PFieldList;
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr,
+            &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        DtPushSubtable (Subtable);
+
+        SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
+        SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
+
+        switch (SdevHeader->Type)
+        {
+        case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
+
+            InfoTable = AcpiDmTableInfoSdev0;
+            Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer);
+            break;
+
+        case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
+
+            InfoTable = AcpiDmTableInfoSdev1;
+            Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer);
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
+            return (AE_ERROR);
+        }
+
+        /* Compile SDEV subtable body */
+
+        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+
+        /* Optional data fields are appended to the main subtable body */
+
+        switch (SdevHeader->Type)
+        {
+        case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
+
+            /* Append DeviceId namespace string */
+
+            Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a,
+                &Subtable, TRUE);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+
+            if (!Subtable)
+            {
+                break;
+            }
+
+            ParentTable = DtPeekSubtable ();
+            DtInsertSubtable (ParentTable, Subtable);
+
+            Namesp->DeviceIdOffset = sizeof (ACPI_SDEV_NAMESPACE);
+            Namesp->DeviceIdLength = (UINT16) Subtable->Length;
+
+            /* Append Vendor data */
+
+            Namesp->VendorDataLength = 0;
+            Namesp->VendorDataOffset = 0;
+
+            if (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
+                    &Subtable, TRUE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+
+                if (Subtable)
+                {
+                    ParentTable = DtPeekSubtable ();
+                    DtInsertSubtable (ParentTable, Subtable);
+
+                    Namesp->VendorDataOffset =
+                        Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
+                    Namesp->VendorDataLength =
+                        (UINT16) Subtable->Length;
+                }
+            }
+
+            /* Final size of entire namespace structure */
+
+            SdevHeader->Length = (UINT16) (sizeof (ACPI_SDEV_NAMESPACE) +
+                Subtable->Length + Namesp->DeviceIdLength);
+            break;
+
+        case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
+
+            /* Append the PCIe path info first */
+
+            EntryCount = 0;
+            while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device"))
+            {
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a,
+                    &Subtable, FALSE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+
+                if (!Subtable)
+                {
+                    DtPopSubtable ();
+                    break;
+                }
+
+                ParentTable = DtPeekSubtable ();
+                DtInsertSubtable (ParentTable, Subtable);
+                EntryCount++;
+            }
+
+            /* Path offset will point immediately after the main subtable */
+
+            Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
+            Pcie->PathLength = (UINT16)
+                (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
+
+            /* Append the Vendor Data last */
+
+            Pcie->VendorDataLength = 0;
+            Pcie->VendorDataOffset = 0;
+
+            if (*PFieldList)
+            {
+                Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b,
+                    &Subtable, TRUE);
+                if (ACPI_FAILURE (Status))
+                {
+                    return (Status);
+                }
+
+                if (Subtable)
+                {
+                    ParentTable = DtPeekSubtable ();
+                    DtInsertSubtable (ParentTable, Subtable);
+
+                    Pcie->VendorDataOffset =
+                        Pcie->PathOffset + Pcie->PathLength;
+                    Pcie->VendorDataLength = (UINT16)
+                        Subtable->Length;
+                }
+            }
+
+            SdevHeader->Length =
+                sizeof (ACPI_SDEV_PCIE) +
+                Pcie->PathLength + Pcie->VendorDataLength;
+            break;
+
+        default:
+
+            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV");
+            return (AE_ERROR);
+        }
+
+        DtPopSubtable ();
+    }
+
+    return (AE_OK);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    DtCompileSlic
@@ -1601,6 +1873,109 @@ DtCompileTcpa (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    DtCompileTpm2
+ *
+ * PARAMETERS:  PFieldList          - Current field list pointer
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Compile TPM2.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileTpm2 (
+    void                    **List)
+{
+    DT_FIELD                **PFieldList = (DT_FIELD **) List;
+    DT_SUBTABLE             *Subtable;
+    ACPI_TABLE_TPM2         *Tpm2Header;
+    DT_SUBTABLE             *ParentTable;
+    ACPI_STATUS             Status = AE_OK;
+
+
+    /* Compile the main table */
+
+    Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2,
+        &Subtable, TRUE);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    ParentTable = DtPeekSubtable ();
+    DtInsertSubtable (ParentTable, Subtable);
+
+    Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer);
+
+    /* Method parameters */
+    /* Optional: Log area minimum length */
+    /* Optional: Log area start address */
+    /* TBD: Optional fields above not fully implemented (not optional at this time) */
+
+    Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a,
+        &Subtable, TRUE);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    ParentTable = DtPeekSubtable ();
+    DtInsertSubtable (ParentTable, Subtable);
+
+
+    /* Subtable type depends on the StartMethod */
+
+    switch (Tpm2Header->StartMethod)
+    {
+    case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
+
+        /* Subtable specific to to ARM_SMC */
+
+        Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211,
+            &Subtable, TRUE);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        ParentTable = DtPeekSubtable ();
+        DtInsertSubtable (ParentTable, Subtable);
+        break;
+
+    case ACPI_TPM2_START_METHOD:
+    case ACPI_TPM2_MEMORY_MAPPED:
+    case ACPI_TPM2_COMMAND_BUFFER:
+    case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD:
+        break;
+
+    case ACPI_TPM2_RESERVED1:
+    case ACPI_TPM2_RESERVED3:
+    case ACPI_TPM2_RESERVED4:
+    case ACPI_TPM2_RESERVED5:
+    case ACPI_TPM2_RESERVED9:
+    case ACPI_TPM2_RESERVED10:
+
+        AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
+            Tpm2Header->StartMethod);
+        Status = AE_ERROR;
+        break;
+
+    case ACPI_TPM2_NOT_ALLOWED:
+    default:
+
+        AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
+            Tpm2Header->StartMethod);
+        Status = AE_ERROR;
+        break;
+    }
+
+    return (Status);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    DtGetGenericTableInfo
diff --git a/sys/contrib/dev/acpica/source/compiler/dttemplate.c b/sys/contrib/dev/acpica/source/compiler/dttemplate.c
index 55c6e9d65d..4c14b68861 100644
--- a/sys/contrib/dev/acpica/source/compiler/dttemplate.c
+++ b/sys/contrib/dev/acpica/source/compiler/dttemplate.c
@@ -151,7 +151,6 @@
 
 #include "aslcompiler.h"
 #include "acapps.h"
-#include "dtcompiler.h"
 #include "dttemplate.h" /* Contains the hex ACPI table templates */
 
 #define _COMPONENT          DT_COMPILER
@@ -315,7 +314,7 @@ Exit:
     /* Shutdown ACPICA subsystem */
 
     (void) AcpiTerminate ();
-    CmDeleteCaches ();
+    UtDeleteLocalCaches ();
     return (Status);
 }
 
diff --git a/sys/contrib/dev/acpica/source/compiler/dttemplate.h b/sys/contrib/dev/acpica/source/compiler/dttemplate.h
index 8d27359d9a..38750f79d9 100644
--- a/sys/contrib/dev/acpica/source/compiler/dttemplate.h
+++ b/sys/contrib/dev/acpica/source/compiler/dttemplate.h
@@ -1079,6 +1079,17 @@ const unsigned char TemplatePcct[] =
     0x55,0x55,0x55,0x55,0x55,0x55             /* 00000248    "UUUUUU|   */
 };
 
+const unsigned char TemplatePdtt[] =
+{
+    0x50,0x44,0x54,0x54,0x34,0x00,0x00,0x00,  /* 00000000    "PDTT4..." */
+    0x01,0xCB,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" */
+    0x31,0x08,0x17,0x20,0x04,0x00,0x00,0x00,  /* 00000020    "1.. ...." */
+    0x2C,0x00,0x00,0x00,0xAA,0x03,0xBB,0x02,  /* 00000028    ",......." */
+    0xCC,0x01,0xDD,0x00                       /* 00000030    "...."     */
+};
+
 const unsigned char TemplatePmtt[] =
 {
     0x50,0x4D,0x54,0x54,0xB4,0x00,0x00,0x00,  /* 00000000    "PMTT...." */
@@ -1187,6 +1198,25 @@ const unsigned char TemplateSdei[] =
     0x30,0x09,0x16,0x20                       /* 00000028    "0.. " */
 };
 
+const unsigned char TemplateSdev[] =
+{
+    0x53,0x44,0x45,0x56,0x72,0x00,0x00,0x00,  /* 00000000    "SDEVr..." */
+    0x01,0x2F,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" */
+    0x31,0x08,0x17,0x20,0x00,0x01,0x2A,0x00,  /* 00000020    "1.. ..*." */
+    0x0C,0x00,0x16,0x00,0x22,0x00,0x08,0x00,  /* 00000028    "...."..." */
+    0x5C,0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50,  /* 00000030    "\\_SB_.P" */
+    0x43,0x49,0x30,0x2E,0x55,0x53,0x42,0x31,  /* 00000038    "CI0.USB1" */
+    0x2E,0x53,0x55,0x42,0x31,0x00,0x00,0x11,  /* 00000040    ".SUB1..." */
+    0x22,0x33,0x44,0x55,0x66,0x77,0x01,0x01,  /* 00000048    ""3DUfw.." */
+    0x24,0x00,0x10,0x00,0x20,0x00,0x10,0x00,  /* 00000050    "$... ..." */
+    0x04,0x00,0x14,0x00,0x10,0x00,0x11,0x22,  /* 00000058    "......."" */
+    0x33,0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55,  /* 00000060    "3D.....U" */
+    0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,  /* 00000068    "fw......" */
+    0xEE,0xFF                                 /* 00000070    ".."       */
+};
+
 const unsigned char TemplateSlic[] =
 {
     0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00,  /* 00000000    "SLICv..." */
@@ -1388,13 +1418,17 @@ const unsigned char TemplateTcpa[] =
 
 const unsigned char TemplateTpm2[] =
 {
-    0x54,0x50,0x4D,0x32,0x34,0x00,0x00,0x00,  /* 00000000    "TPM24..." */
-    0x03,0x42,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    ".BINTEL " */
-    0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
+    0x54,0x50,0x4D,0x32,0x58,0x00,0x00,0x00,  /* 00000000    "TPM2X..." */
+    0x03,0xAB,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" */
-    0x14,0x11,0x12,0x20,0x00,0x00,0x00,0x00,  /* 00000020    "... ...." */
-    0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00,  /* 00000028    "wfUD3".." */
-    0x01,0x00,0x00,0x00                       /* 00000030    "...."     */
+    0x31,0x08,0x17,0x20,0x01,0x00,0x00,0x00,  /* 00000020    "1.. ...." */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
+    0x0B,0x00,0x00,0x00,0x01,0x02,0x03,0x04,  /* 00000030    "........" */
+    0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,  /* 00000038    "........" */
+    0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000040    "........" */
+    0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,  /* 00000048    "........" */
+    0x01,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF   /* 00000050    "........" */
 };
 
 const unsigned char TemplateUefi[] =
diff --git a/sys/contrib/dev/acpica/source/compiler/dtutils.c b/sys/contrib/dev/acpica/source/compiler/dtutils.c
index c6c89eaa7d..1e8f9b243a 100644
--- a/sys/contrib/dev/acpica/source/compiler/dtutils.c
+++ b/sys/contrib/dev/acpica/source/compiler/dtutils.c
@@ -150,7 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 #include "actables.h"
 
 #define _COMPONENT          DT_COMPILER
@@ -570,6 +569,7 @@ DtGetFieldLength (
     case ACPI_DMT_PCCT:
     case ACPI_DMT_PMTT:
     case ACPI_DMT_PPTT:
+    case ACPI_DMT_SDEV:
     case ACPI_DMT_SRAT:
     case ACPI_DMT_ASF:
     case ACPI_DMT_HESTNTYP:
@@ -602,6 +602,7 @@ DtGetFieldLength (
     case ACPI_DMT_NAME4:
     case ACPI_DMT_SIG:
     case ACPI_DMT_LPIT:
+    case ACPI_DMT_TPM2:
 
         ByteLength = 4;
         break;
@@ -920,153 +921,3 @@ DtWalkTableTree (
         }
     }
 }
-
-
-/*******************************************************************************
- *
- * FUNCTION:    UtSubtableCacheCalloc
- *
- * PARAMETERS:  None
- *
- * RETURN:      Pointer to the buffer. Aborts on allocation failure
- *
- * DESCRIPTION: Allocate a subtable object buffer. Bypass the local
- *              dynamic memory manager for performance reasons (This has a
- *              major impact on the speed of the compiler.)
- *
- ******************************************************************************/
-
-DT_SUBTABLE *
-UtSubtableCacheCalloc (
-    void)
-{
-    ASL_CACHE_INFO          *Cache;
-
-
-    if (Gbl_SubtableCacheNext >= Gbl_SubtableCacheLast)
-    {
-        /* Allocate a new buffer */
-
-        Cache = UtLocalCalloc (sizeof (Cache->Next) +
-            (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE));
-
-        /* Link new cache buffer to head of list */
-
-        Cache->Next = Gbl_SubtableCacheList;
-        Gbl_SubtableCacheList = Cache;
-
-        /* Setup cache management pointers */
-
-        Gbl_SubtableCacheNext = ACPI_CAST_PTR (DT_SUBTABLE, Cache->Buffer);
-        Gbl_SubtableCacheLast = Gbl_SubtableCacheNext + ASL_SUBTABLE_CACHE_SIZE;
-    }
-
-    Gbl_SubtableCount++;
-    return (Gbl_SubtableCacheNext++);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    UtFieldCacheCalloc
- *
- * PARAMETERS:  None
- *
- * RETURN:      Pointer to the buffer. Aborts on allocation failure
- *
- * DESCRIPTION: Allocate a field object buffer. Bypass the local
- *              dynamic memory manager for performance reasons (This has a
- *              major impact on the speed of the compiler.)
- *
- ******************************************************************************/
-
-DT_FIELD *
-UtFieldCacheCalloc (
-    void)
-{
-    ASL_CACHE_INFO          *Cache;
-
-
-    if (Gbl_FieldCacheNext >= Gbl_FieldCacheLast)
-    {
-        /* Allocate a new buffer */
-
-        Cache = UtLocalCalloc (sizeof (Cache->Next) +
-            (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE));
-
-        /* Link new cache buffer to head of list */
-
-        Cache->Next = Gbl_FieldCacheList;
-        Gbl_FieldCacheList = Cache;
-
-        /* Setup cache management pointers */
-
-        Gbl_FieldCacheNext = ACPI_CAST_PTR (DT_FIELD, Cache->Buffer);
-        Gbl_FieldCacheLast = Gbl_FieldCacheNext + ASL_FIELD_CACHE_SIZE;
-    }
-
-    Gbl_FieldCount++;
-    return (Gbl_FieldCacheNext++);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    DtDeleteCaches
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Delete all local cache buffer blocks
- *
- ******************************************************************************/
-
-void
-DtDeleteCaches (
-    void)
-{
-    UINT32                  BufferCount;
-    ASL_CACHE_INFO          *Next;
-
-
-    /* Field cache */
-
-    BufferCount = 0;
-    while (Gbl_FieldCacheList)
-    {
-        Next = Gbl_FieldCacheList->Next;
-        ACPI_FREE (Gbl_FieldCacheList);
-        Gbl_FieldCacheList = Next;
-        BufferCount++;
-    }
-
-    DbgPrint (ASL_DEBUG_OUTPUT,
-        "%u Fields, Buffer size: %u fields (%u bytes), %u Buffers\n",
-        Gbl_FieldCount, ASL_FIELD_CACHE_SIZE,
-        (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE), BufferCount);
-
-    Gbl_FieldCount = 0;
-    Gbl_FieldCacheNext = NULL;
-    Gbl_FieldCacheLast = NULL;
-
-    /* Subtable cache */
-
-    BufferCount = 0;
-    while (Gbl_SubtableCacheList)
-    {
-        Next = Gbl_SubtableCacheList->Next;
-        ACPI_FREE (Gbl_SubtableCacheList);
-        Gbl_SubtableCacheList = Next;
-        BufferCount++;
-    }
-
-    DbgPrint (ASL_DEBUG_OUTPUT,
-        "%u Subtables, Buffer size: %u subtables (%u bytes), %u Buffers\n",
-        Gbl_SubtableCount, ASL_SUBTABLE_CACHE_SIZE,
-        (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE), BufferCount);
-
-    Gbl_SubtableCount = 0;
-    Gbl_SubtableCacheNext = NULL;
-    Gbl_SubtableCacheLast = NULL;
-}
diff --git a/sys/contrib/dev/acpica/source/compiler/prexpress.c b/sys/contrib/dev/acpica/source/compiler/prexpress.c
index a0ba7447d3..a9ed5fe776 100644
--- a/sys/contrib/dev/acpica/source/compiler/prexpress.c
+++ b/sys/contrib/dev/acpica/source/compiler/prexpress.c
@@ -150,8 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
-
 
 #define _COMPONENT          ASL_PREPROCESSOR
         ACPI_MODULE_NAME    ("prexpress")
diff --git a/sys/contrib/dev/acpica/source/compiler/prmacros.c b/sys/contrib/dev/acpica/source/compiler/prmacros.c
index 675d4522cb..5560c12aa9 100644
--- a/sys/contrib/dev/acpica/source/compiler/prmacros.c
+++ b/sys/contrib/dev/acpica/source/compiler/prmacros.c
@@ -150,8 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
-
 
 #define _COMPONENT          ASL_PREPROCESSOR
         ACPI_MODULE_NAME    ("prmacros")
diff --git a/sys/contrib/dev/acpica/source/compiler/prparser.y b/sys/contrib/dev/acpica/source/compiler/prparser.y
index d24a5bbee0..17da8485cb 100644
--- a/sys/contrib/dev/acpica/source/compiler/prparser.y
+++ b/sys/contrib/dev/acpica/source/compiler/prparser.y
@@ -151,7 +151,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 #define _COMPONENT          ASL_PREPROCESSOR
         ACPI_MODULE_NAME    ("prparser")
diff --git a/sys/contrib/dev/acpica/source/compiler/prscan.c b/sys/contrib/dev/acpica/source/compiler/prscan.c
index 75a9866576..a012e111b0 100644
--- a/sys/contrib/dev/acpica/source/compiler/prscan.c
+++ b/sys/contrib/dev/acpica/source/compiler/prscan.c
@@ -152,7 +152,6 @@
 #define _DECLARE_PR_GLOBALS
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
 
 /*
  * TBDs:
diff --git a/sys/contrib/dev/acpica/source/compiler/prutils.c b/sys/contrib/dev/acpica/source/compiler/prutils.c
index 61641ddbe2..5fa77aa689 100644
--- a/sys/contrib/dev/acpica/source/compiler/prutils.c
+++ b/sys/contrib/dev/acpica/source/compiler/prutils.c
@@ -150,8 +150,6 @@
  *****************************************************************************/
 
 #include "aslcompiler.h"
-#include "dtcompiler.h"
-
 
 #define _COMPONENT          ASL_PREPROCESSOR
         ACPI_MODULE_NAME    ("prutils")
@@ -514,7 +512,7 @@ PrPushInputFileStack (
     /* Reset the global line count and filename */
 
     Gbl_Files[ASL_FILE_INPUT].Filename =
-        UtStringCacheCalloc (strlen (Filename) + 1);
+        UtLocalCacheCalloc (strlen (Filename) + 1);
     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
 
     Gbl_Files[ASL_FILE_INPUT].Handle = InputFile;
diff --git a/sys/contrib/dev/acpica/source/components/dispatcher/dscontrol.c b/sys/contrib/dev/acpica/source/components/dispatcher/dscontrol.c
index 897200a5ef..7a06a1e670 100644
--- a/sys/contrib/dev/acpica/source/components/dispatcher/dscontrol.c
+++ b/sys/contrib/dev/acpica/source/components/dispatcher/dscontrol.c
@@ -234,7 +234,8 @@ AcpiDsExecBeginControlOp (
             WalkState->ParserState.PkgEnd;
         ControlState->Control.Opcode =
             Op->Common.AmlOpcode;
-
+        ControlState->Control.LoopTimeout = AcpiOsGetTimer () +
+           (UINT64) (AcpiGbl_MaxLoopIterations * ACPI_100NSEC_PER_SEC);
 
         /* Push the control state on this walk's control stack */
 
@@ -327,15 +328,15 @@ AcpiDsExecEndControlOp (
             /* Predicate was true, the body of the loop was just executed */
 
             /*
-             * This loop counter mechanism allows the interpreter to escape
-             * possibly infinite loops. This can occur in poorly written AML
-             * when the hardware does not respond within a while loop and the
-             * loop does not implement a timeout.
+             * This infinite loop detection mechanism allows the interpreter
+             * to escape possibly infinite loops. This can occur in poorly
+             * written AML when the hardware does not respond within a while
+             * loop and the loop does not implement a timeout.
              */
-            ControlState->Control.LoopCount++;
-            if (ControlState->Control.LoopCount > AcpiGbl_MaxLoopIterations)
+            if (ACPI_TIME_AFTER (AcpiOsGetTimer (),
+                    ControlState->Control.LoopTimeout))
             {
-                Status = AE_AML_INFINITE_LOOP;
+                Status = AE_AML_LOOP_TIMEOUT;
                 break;
             }
 
diff --git a/sys/contrib/dev/acpica/source/components/hardware/hwtimer.c b/sys/contrib/dev/acpica/source/components/hardware/hwtimer.c
index 358164ee8a..0fc33e8acc 100644
--- a/sys/contrib/dev/acpica/source/components/hardware/hwtimer.c
+++ b/sys/contrib/dev/acpica/source/components/hardware/hwtimer.c
@@ -283,7 +283,7 @@ AcpiGetTimerDuration (
     UINT32                  *TimeElapsed)
 {
     ACPI_STATUS             Status;
-    UINT32                  DeltaTicks;
+    UINT64                  DeltaTicks;
     UINT64                  Quotient;
 
 
@@ -302,34 +302,33 @@ AcpiGetTimerDuration (
         return_ACPI_STATUS (AE_SUPPORT);
     }
 
+    if (StartTicks == EndTicks)
+    {
+        *TimeElapsed = 0;
+        return_ACPI_STATUS (AE_OK);
+    }
+
     /*
      * Compute Tick Delta:
      * Handle (max one) timer rollovers on 24-bit versus 32-bit timers.
      */
-    if (StartTicks < EndTicks)
-    {
-        DeltaTicks = EndTicks - StartTicks;
-    }
-    else if (StartTicks > EndTicks)
+    DeltaTicks = EndTicks;
+    if (StartTicks > EndTicks)
     {
         if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0)
         {
             /* 24-bit Timer */
 
-            DeltaTicks = (((0x00FFFFFF - StartTicks) + EndTicks) & 0x00FFFFFF);
+            DeltaTicks |= (UINT64) 1 << 24;
         }
         else
         {
             /* 32-bit Timer */
 
-            DeltaTicks = (0xFFFFFFFF - StartTicks) + EndTicks;
+            DeltaTicks |= (UINT64) 1 << 32;
         }
     }
-    else /* StartTicks == EndTicks */
-    {
-        *TimeElapsed = 0;
-        return_ACPI_STATUS (AE_OK);
-    }
+    DeltaTicks -= StartTicks;
 
     /*
      * Compute Duration (Requires a 64-bit multiply and divide):
@@ -337,7 +336,7 @@ AcpiGetTimerDuration (
      * TimeElapsed (microseconds) =
      *  (DeltaTicks * ACPI_USEC_PER_SEC) / ACPI_PM_TIMER_FREQUENCY;
      */
-    Status = AcpiUtShortDivide (((UINT64) DeltaTicks) * ACPI_USEC_PER_SEC,
+    Status = AcpiUtShortDivide (DeltaTicks * ACPI_USEC_PER_SEC,
                 ACPI_PM_TIMER_FREQUENCY, &Quotient, NULL);
 
     *TimeElapsed = (UINT32) Quotient;
diff --git a/sys/contrib/dev/acpica/source/components/namespace/nsaccess.c b/sys/contrib/dev/acpica/source/components/namespace/nsaccess.c
index 0ae1fbdd08..8f98ca6827 100644
--- a/sys/contrib/dev/acpica/source/components/namespace/nsaccess.c
+++ b/sys/contrib/dev/acpica/source/components/namespace/nsaccess.c
@@ -775,19 +775,19 @@ AcpiNsLookup (
                     ThisNode = (ACPI_NAMESPACE_NODE *) ThisNode->Object;
                 }
             }
-#ifdef ACPI_ASL_COMPILER
-            if (!AcpiGbl_DisasmFlag &&
-                (ThisNode->Flags & ANOBJ_IS_EXTERNAL))
-            {
-                ThisNode->Flags |= IMPLICIT_EXTERNAL;
-            }
-#endif
         }
 
         /* Special handling for the last segment (NumSegments == 0) */
 
         else
         {
+#ifdef ACPI_ASL_COMPILER
+            if (!AcpiGbl_DisasmFlag && (ThisNode->Flags & ANOBJ_IS_EXTERNAL))
+            {
+                ThisNode->Flags &= ~IMPLICIT_EXTERNAL;
+            }
+#endif
+
             /*
              * Sanity typecheck of the target object:
              *
diff --git a/sys/contrib/dev/acpica/source/components/namespace/nssearch.c b/sys/contrib/dev/acpica/source/components/namespace/nssearch.c
index 3504092aed..3697ea4be0 100644
--- a/sys/contrib/dev/acpica/source/components/namespace/nssearch.c
+++ b/sys/contrib/dev/acpica/source/components/namespace/nssearch.c
@@ -545,6 +545,7 @@ AcpiNsSearchAndEnter (
         (WalkState && WalkState->Opcode == AML_SCOPE_OP))
     {
         NewNode->Flags |= ANOBJ_IS_EXTERNAL;
+        NewNode->Flags |= IMPLICIT_EXTERNAL;
     }
 #endif
 
diff --git a/sys/contrib/dev/acpica/source/components/parser/psobject.c b/sys/contrib/dev/acpica/source/components/parser/psobject.c
index 8f31750c5f..b6aa802590 100644
--- a/sys/contrib/dev/acpica/source/components/parser/psobject.c
+++ b/sys/contrib/dev/acpica/source/components/parser/psobject.c
@@ -500,15 +500,10 @@ AcpiPsCreateOp (
              * external declaration opcode. Setting WalkState->Aml to
              * WalkState->ParserState.Aml + 2 moves increments the
              * WalkState->Aml past the object type and the paramcount of the
-             * external opcode. For the error message, only print the AML
-             * offset. We could attempt to print the name but this may cause
-             * a segmentation fault when printing the namepath because the
-             * AML may be incorrect.
+             * external opcode.
              */
-            AcpiOsPrintf (
-                "// Invalid external declaration at AML offset 0x%x.\n",
-                WalkState->Aml - WalkState->ParserState.AmlStart);
             WalkState->Aml = WalkState->ParserState.Aml + 2;
+            WalkState->ParserState.Aml = WalkState->Aml;
             return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
         }
 #endif
diff --git a/sys/contrib/dev/acpica/source/components/parser/psutils.c b/sys/contrib/dev/acpica/source/components/parser/psutils.c
index 19ae3a9d4b..a04b2e50aa 100644
--- a/sys/contrib/dev/acpica/source/components/parser/psutils.c
+++ b/sys/contrib/dev/acpica/source/components/parser/psutils.c
@@ -292,11 +292,11 @@ AcpiPsAllocOp (
         {
             AcpiGbl_CurrentScope = Op;
         }
-    }
 
-    if (Gbl_CaptureComments)
-    {
-        ASL_CV_TRANSFER_COMMENTS (Op);
+        if (Gbl_CaptureComments)
+        {
+            ASL_CV_TRANSFER_COMMENTS (Op);
+        }
     }
 
     return (Op);
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utinit.c b/sys/contrib/dev/acpica/source/components/utilities/utinit.c
index d1937a57aa..faa34bbd20 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utinit.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utinit.c
@@ -334,7 +334,6 @@ AcpiUtInitGlobals (
     AcpiGbl_NextOwnerIdOffset           = 0;
     AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
     AcpiGbl_OsiMutex                    = NULL;
-    AcpiGbl_MaxLoopIterations           = ACPI_MAX_LOOP_COUNT;
 
     /* Hardware oriented */
 
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utmath.c b/sys/contrib/dev/acpica/source/components/utilities/utmath.c
index 4aa940251d..a4c3fba369 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utmath.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utmath.c
@@ -260,7 +260,7 @@ AcpiUtShortShiftLeft (
     if ((Count & 63) >= 32)
     {
         OperandOvl.Part.Hi = OperandOvl.Part.Lo;
-        OperandOvl.Part.Lo ^= OperandOvl.Part.Lo;
+        OperandOvl.Part.Lo = 0;
         Count = (Count & 63) - 32;
     }
     ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
@@ -305,7 +305,7 @@ AcpiUtShortShiftRight (
     if ((Count & 63) >= 32)
     {
         OperandOvl.Part.Lo = OperandOvl.Part.Hi;
-        OperandOvl.Part.Hi ^= OperandOvl.Part.Hi;
+        OperandOvl.Part.Hi = 0;
         Count = (Count & 63) - 32;
     }
     ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
diff --git a/sys/contrib/dev/acpica/source/include/acapps.h b/sys/contrib/dev/acpica/source/include/acapps.h
index 4ca3e80fb3..faae2fb691 100644
--- a/sys/contrib/dev/acpica/source/include/acapps.h
+++ b/sys/contrib/dev/acpica/source/include/acapps.h
@@ -188,6 +188,9 @@
     Prefix, ACPICA_COPYRIGHT, \
     Prefix
 
+#define ACPI_COMMON_BUILD_TIME \
+    "Build date/time: %s %s\n", __DATE__, __TIME__
+
 /* Macros for usage messages */
 
 #define ACPI_USAGE_HEADER(Usage) \
diff --git a/sys/contrib/dev/acpica/source/include/acconfig.h b/sys/contrib/dev/acpica/source/include/acconfig.h
index 6fc043639e..7cff063651 100644
--- a/sys/contrib/dev/acpica/source/include/acconfig.h
+++ b/sys/contrib/dev/acpica/source/include/acconfig.h
@@ -255,9 +255,9 @@
 
 #define ACPI_ADDRESS_RANGE_MAX          2
 
-/* Maximum number of While() loops before abort */
+/* Maximum time (default 30s) of While() loops before abort */
 
-#define ACPI_MAX_LOOP_COUNT             0x000FFFFF
+#define ACPI_MAX_LOOP_TIMEOUT           30
 
 
 /******************************************************************************
diff --git a/sys/contrib/dev/acpica/source/include/acdisasm.h b/sys/contrib/dev/acpica/source/include/acdisasm.h
index 26d4f47b70..0c465602d1 100644
--- a/sys/contrib/dev/acpica/source/include/acdisasm.h
+++ b/sys/contrib/dev/acpica/source/include/acdisasm.h
@@ -272,8 +272,10 @@ typedef enum
     ACPI_DMT_PMTT,
     ACPI_DMT_PPTT,
     ACPI_DMT_SDEI,
+    ACPI_DMT_SDEV,
     ACPI_DMT_SLIC,
     ACPI_DMT_SRAT,
+    ACPI_DMT_TPM2,
 
     /* Special opcodes */
 
@@ -502,6 +504,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit4[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit5[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoNfit6a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPmtt1[];
@@ -515,6 +518,7 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct2[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct3[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPcct4[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPdtt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt0a[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoPptt1[];
@@ -529,6 +533,13 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt0[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoS3pt1[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSbst[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdei[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdevHdr[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev0a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSdev1b[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlic[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSlit[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoSpcr[];
@@ -546,6 +557,8 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTcpaHdr[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTcpaClient[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTcpaServer[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm2[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm2a[];
+extern ACPI_DMTABLE_INFO        AcpiDmTableInfoTpm211[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoUefi[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoVrtc[];
 extern ACPI_DMTABLE_INFO        AcpiDmTableInfoVrtc0[];
@@ -586,7 +599,7 @@ AcpiDmDumpTable (
     UINT32                  TableLength,
     UINT32                  TableOffset,
     void                    *Table,
-    UINT32                  SubTableLength,
+    UINT32                  SubtableLength,
     ACPI_DMTABLE_INFO        *Info);
 
 void
@@ -712,6 +725,10 @@ void
 AcpiDmDumpPcct (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpPdtt (
+    ACPI_TABLE_HEADER       *Table);
+
 void
 AcpiDmDumpPmtt (
     ACPI_TABLE_HEADER       *Table);
@@ -732,6 +749,10 @@ UINT32
 AcpiDmDumpS3pt (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpSdev (
+    ACPI_TABLE_HEADER       *Table);
+
 void
 AcpiDmDumpSlic (
     ACPI_TABLE_HEADER       *Table);
@@ -752,6 +773,10 @@ void
 AcpiDmDumpTcpa (
     ACPI_TABLE_HEADER       *Table);
 
+void
+AcpiDmDumpTpm2 (
+    ACPI_TABLE_HEADER       *Table);
+
 void
 AcpiDmDumpVrtc (
     ACPI_TABLE_HEADER       *Table);
diff --git a/sys/contrib/dev/acpica/source/include/acexcep.h b/sys/contrib/dev/acpica/source/include/acexcep.h
index d808f27514..21db48dcb0 100644
--- a/sys/contrib/dev/acpica/source/include/acexcep.h
+++ b/sys/contrib/dev/acpica/source/include/acexcep.h
@@ -309,7 +309,7 @@ typedef struct acpi_exception_info
 #define AE_AML_CIRCULAR_REFERENCE       EXCEP_AML (0x001E)
 #define AE_AML_BAD_RESOURCE_LENGTH      EXCEP_AML (0x001F)
 #define AE_AML_ILLEGAL_ADDRESS          EXCEP_AML (0x0020)
-#define AE_AML_INFINITE_LOOP            EXCEP_AML (0x0021)
+#define AE_AML_LOOP_TIMEOUT             EXCEP_AML (0x0021)
 #define AE_AML_UNINITIALIZED_NODE       EXCEP_AML (0x0022)
 #define AE_AML_TARGET_TYPE              EXCEP_AML (0x0023)
 
@@ -441,7 +441,7 @@ static const ACPI_EXCEPTION_INFO    AcpiGbl_ExceptionNames_Aml[] =
     EXCEP_TXT ("AE_AML_CIRCULAR_REFERENCE",     "Two references refer to each other"),
     EXCEP_TXT ("AE_AML_BAD_RESOURCE_LENGTH",    "The length of a Resource Descriptor in the AML is incorrect"),
     EXCEP_TXT ("AE_AML_ILLEGAL_ADDRESS",        "A memory, I/O, or PCI configuration address is invalid"),
-    EXCEP_TXT ("AE_AML_INFINITE_LOOP",          "An apparent infinite AML While loop, method was aborted"),
+    EXCEP_TXT ("AE_AML_LOOP_TIMEOUT",           "An AML While loop exceeded the maximum execution time"),
     EXCEP_TXT ("AE_AML_UNINITIALIZED_NODE",     "A namespace node is uninitialized or unresolved"),
     EXCEP_TXT ("AE_AML_TARGET_TYPE",            "A target operand of an incorrect type was encountered")
 };
diff --git a/sys/contrib/dev/acpica/source/include/aclocal.h b/sys/contrib/dev/acpica/source/include/aclocal.h
index f3dd2a5f61..1b895e62fb 100644
--- a/sys/contrib/dev/acpica/source/include/aclocal.h
+++ b/sys/contrib/dev/acpica/source/include/aclocal.h
@@ -834,7 +834,7 @@ typedef struct acpi_control_state
     union acpi_parse_object         *PredicateOp;
     UINT8                           *AmlPredicateStart;     /* Start of if/while predicate */
     UINT8                           *PackageEnd;            /* End of if/while block */
-    UINT32                          LoopCount;              /* While() loop counter */
+    UINT64                          LoopTimeout;            /* While() loop timeout */
 
 } ACPI_CONTROL_STATE;
 
diff --git a/sys/contrib/dev/acpica/source/include/acpixf.h b/sys/contrib/dev/acpica/source/include/acpixf.h
index 7d6c18d698..bd5fde1765 100644
--- a/sys/contrib/dev/acpica/source/include/acpixf.h
+++ b/sys/contrib/dev/acpica/source/include/acpixf.h
@@ -154,7 +154,7 @@
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20170831
+#define ACPI_CA_VERSION                 0x20170929
 
 #include "acconfig.h"
 #include "actypes.h"
@@ -370,11 +370,11 @@ ACPI_INIT_GLOBAL (UINT8,            AcpiGbl_OsiData, 0);
 ACPI_INIT_GLOBAL (BOOLEAN,          AcpiGbl_ReducedHardware, FALSE);
 
 /*
- * Maximum number of While() loop iterations before forced method abort.
+ * Maximum timeout for While() loop iterations before forced method abort.
  * This mechanism is intended to prevent infinite loops during interpreter
  * execution within a host kernel.
  */
-ACPI_INIT_GLOBAL (UINT32,           AcpiGbl_MaxLoopIterations, ACPI_MAX_LOOP_COUNT);
+ACPI_INIT_GLOBAL (UINT32,           AcpiGbl_MaxLoopIterations, ACPI_MAX_LOOP_TIMEOUT);
 
 /*
  * This mechanism is used to trace a specified AML method. The method is
diff --git a/sys/contrib/dev/acpica/source/include/actbl1.h b/sys/contrib/dev/acpica/source/include/actbl1.h
index 537c33e7c3..7eed2c5507 100644
--- a/sys/contrib/dev/acpica/source/include/actbl1.h
+++ b/sys/contrib/dev/acpica/source/include/actbl1.h
@@ -179,9 +179,10 @@
 #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_PDTT           "PDTT"      /* Processor Debug Trigger Table */
+#define ACPI_SIG_PDTT           "PDTT"      /* Platform Debug Trigger Table */
 #define ACPI_SIG_PPTT           "PPTT"      /* Processor Properties Topology Table */
 #define ACPI_SIG_SBST           "SBST"      /* Smart Battery Specification Table */
+#define ACPI_SIG_SDEV           "SDEV"      /* Secure Devices table */
 #define ACPI_SIG_SLIT           "SLIT"      /* System Locality Distance Information Table */
 #define ACPI_SIG_SRAT           "SRAT"      /* System Resource Affinity Table */
 #define ACPI_SIG_NFIT           "NFIT"      /* NVDIMM Firmware Interface Table */
@@ -1603,7 +1604,7 @@ typedef struct acpi_nfit_flush_address
 
 /*******************************************************************************
  *
- * PDTT - Processor Debug Trigger Table (ACPI 6.2)
+ * PDTT - Platform Debug Trigger Table (ACPI 6.2)
  *        Version 0
  *
  ******************************************************************************/
@@ -1625,16 +1626,15 @@ typedef struct acpi_table_pdtt
  */
 typedef struct acpi_pdtt_channel
 {
-    UINT16                  SubChannelId;
+    UINT8                   SubchannelId;
+    UINT8                   Flags;
 
 } ACPI_PDTT_CHANNEL;
 
+/* Flags for above */
 
-/* Mask and Flags for above */
-
-#define ACPI_PDTT_SUBCHANNEL_ID_MASK        0x00FF
-#define ACPI_PDTT_RUNTIME_TRIGGER           (1<<8)
-#define ACPI_PPTT_WAIT_COMPLETION           (1<<9)
+#define ACPI_PDTT_RUNTIME_TRIGGER           (1)
+#define ACPI_PPTT_WAIT_COMPLETION           (1<<1)
 
 
 /*******************************************************************************
@@ -1746,6 +1746,82 @@ typedef struct acpi_table_sbst
 } ACPI_TABLE_SBST;
 
 
+/*******************************************************************************
+ *
+ * SDEV - Secure Devices Table (ACPI 6.2)
+ *        Version 1
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_sdev
+{
+    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */
+
+} ACPI_TABLE_SDEV;
+
+
+typedef struct acpi_sdev_header
+{
+    UINT8                   Type;
+    UINT8                   Flags;
+    UINT16                  Length;
+
+} ACPI_SDEV_HEADER;
+
+
+/* Values for subtable type above */
+
+enum AcpiSdevType
+{
+    ACPI_SDEV_TYPE_NAMESPACE_DEVICE     = 0,
+    ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE = 1,
+    ACPI_SDEV_TYPE_RESERVED             = 2     /* 2 and greater are reserved */
+};
+
+/* Values for flags above */
+
+#define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS    (1)
+
+/*
+ * SDEV subtables
+ */
+
+/* 0: Namespace Device Based Secure Device Structure */
+
+typedef struct acpi_sdev_namespace
+{
+    ACPI_SDEV_HEADER        Header;
+    UINT16                  DeviceIdOffset;
+    UINT16                  DeviceIdLength;
+    UINT16                  VendorDataOffset;
+    UINT16                  VendorDataLength;
+
+} ACPI_SDEV_NAMESPACE;
+
+/* 1: PCIe Endpoint Device Based Device Structure */
+
+typedef struct acpi_sdev_pcie
+{
+    ACPI_SDEV_HEADER        Header;
+    UINT16                  Segment;
+    UINT16                  StartBus;
+    UINT16                  PathOffset;
+    UINT16                  PathLength;
+    UINT16                  VendorDataOffset;
+    UINT16                  VendorDataLength;
+
+} ACPI_SDEV_PCIE;
+
+/* 1a: PCIe Endpoint path entry */
+
+typedef struct acpi_sdev_pcie_path
+{
+    UINT8                   Device;
+    UINT8                   Function;
+
+} ACPI_SDEV_PCIE_PATH;
+
+
 /*******************************************************************************
  *
  * SLIT - System Locality Distance Information Table
diff --git a/sys/contrib/dev/acpica/source/include/actbl2.h b/sys/contrib/dev/acpica/source/include/actbl2.h
index 951d65531a..02a897b0fb 100644
--- a/sys/contrib/dev/acpica/source/include/actbl2.h
+++ b/sys/contrib/dev/acpica/source/include/actbl2.h
@@ -1550,6 +1550,8 @@ enum AcpiSpmiInterfaceTypes
  * TCPA - Trusted Computing Platform Alliance table
  *        Version 2
  *
+ * TCG Hardware Interface Table for TPM 1.2 Clients and Servers
+ *
  * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
  * Version 1.2, Revision 8
  * February 27, 2017
@@ -1622,6 +1624,8 @@ typedef struct acpi_table_tcpa_server
  * TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table
  *        Version 4
  *
+ * TCG Hardware Interface Table for TPM 2.0 Clients and Servers
+ *
  * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0",
  * Version 1.2, Revision 8
  * February 27, 2017
@@ -1643,17 +1647,25 @@ typedef struct acpi_table_tpm2
 /* Values for StartMethod above */
 
 #define ACPI_TPM2_NOT_ALLOWED                       0
+#define ACPI_TPM2_RESERVED1                         1
 #define ACPI_TPM2_START_METHOD                      2
+#define ACPI_TPM2_RESERVED3                         3
+#define ACPI_TPM2_RESERVED4                         4
+#define ACPI_TPM2_RESERVED5                         5
 #define ACPI_TPM2_MEMORY_MAPPED                     6
 #define ACPI_TPM2_COMMAND_BUFFER                    7
 #define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD  8
+#define ACPI_TPM2_RESERVED9                         9
+#define ACPI_TPM2_RESERVED10                        10
 #define ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC       11  /* V1.2 Rev 8 */
+#define ACPI_TPM2_RESERVED                          12
 
 
-/* Trailer appears after any StartMethod subtables */
+/* Optional trailer appears after any StartMethod subtables */
 
 typedef struct acpi_tpm2_trailer
 {
+    UINT8                   MethodParameters[12];
     UINT32                  MinimumLogLength;   /* Minimum length for the event log area */
     UINT64                  LogAddress;         /* Address of the event log area */
 
diff --git a/sys/contrib/dev/acpica/source/include/actypes.h b/sys/contrib/dev/acpica/source/include/actypes.h
index 1839f936e4..4cc6d4fd07 100644
--- a/sys/contrib/dev/acpica/source/include/actypes.h
+++ b/sys/contrib/dev/acpica/source/include/actypes.h
@@ -586,6 +586,8 @@ typedef void *                          ACPI_HANDLE;    /* Actually a ptr to a N
 #define ACPI_NSEC_PER_MSEC              1000000L
 #define ACPI_NSEC_PER_SEC               1000000000L
 
+#define ACPI_TIME_AFTER(a, b)           ((INT64)((b) - (a)) < 0)
+
 
 /* Owner IDs are used to track namespace nodes for selective deletion */
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c b/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c
index a3e0ba89bf..c5fc7860ad 100644
--- a/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c
@@ -160,7 +160,7 @@ AbDisplayUsage (
 
 
 #define AB_UTILITY_NAME             "ACPI Binary Table Dump Utility"
-#define AB_SUPPORTED_OPTIONS        "a:c:d:h:o:s:tv"
+#define AB_SUPPORTED_OPTIONS        "a:c:d:h:o:s:tv^"
 
 
 /******************************************************************************
@@ -192,6 +192,7 @@ AbDisplayUsage (
     ACPI_OPTION ("-s <File>",               "Update checksum for binary AML file");
     ACPI_OPTION ("-t",                      "Terse mode");
     ACPI_OPTION ("-v",                      "Display version information");
+    ACPI_OPTION ("-vd",                     "Display build date and time");
 }
 
 
@@ -292,7 +293,23 @@ main (
 
     case 'v': /* -v: (Version): signon already emitted, just exit */
 
-        return (0);
+        switch (AcpiGbl_Optarg[0])
+        {
+        case '^':  /* -v: (Version): signon already emitted, just exit */
+
+            return (1);
+
+        case 'd':
+
+            printf (ACPI_COMMON_BUILD_TIME);
+            return (1);
+
+        default:
+
+            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
+            return (-1);
+        }
+        break;
 
     default:
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c b/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c
index 99962797d7..e95ad6c3b1 100644
--- a/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c
@@ -199,7 +199,7 @@ UINT32                      CurrentAction = 0;
 
 
 #define AP_UTILITY_NAME             "ACPI Binary Table Dump Utility"
-#define AP_SUPPORTED_OPTIONS        "?a:bc:f:hn:o:r:svxz"
+#define AP_SUPPORTED_OPTIONS        "?a:bc:f:hn:o:r:sv^xz"
 
 
 /******************************************************************************
@@ -223,6 +223,7 @@ ApDisplayUsage (
     ACPI_OPTION ("-r <Address>",            "Dump tables from specified RSDP");
     ACPI_OPTION ("-s",                      "Print table summaries only");
     ACPI_OPTION ("-v",                      "Display version information");
+    ACPI_OPTION ("-vd",                     "Display build date and time");
     ACPI_OPTION ("-z",                      "Verbose mode");
 
     ACPI_USAGE_TEXT ("\nTable Options:\n");
@@ -369,10 +370,27 @@ ApDoOptions (
         }
         continue;
 
-    case 'v':   /* Revision/version */
+    case 'v': /* -v: (Version): signon already emitted, just exit */
 
-        AcpiOsPrintf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
-        return (1);
+        switch (AcpiGbl_Optarg[0])
+        {
+        case '^':  /* -v: (Version) */
+
+            fprintf (stderr, ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
+            return (1);
+
+        case 'd':
+
+            fprintf (stderr, ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
+            printf (ACPI_COMMON_BUILD_TIME);
+            return (1);
+
+        default:
+
+            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
+            return (-1);
+        }
+        break;
 
     case 'z':   /* Verbose mode */
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aecommon.h b/sys/contrib/dev/acpica/source/tools/acpiexec/aecommon.h
index b4864610a6..00bf09b413 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aecommon.h
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aecommon.h
@@ -190,6 +190,7 @@ typedef struct ae_debug_regions
 
 
 extern BOOLEAN              AcpiGbl_IgnoreErrors;
+extern BOOLEAN              AcpiGbl_AbortLoopOnTimeout;
 extern UINT8                AcpiGbl_RegionFillValue;
 extern UINT8                AcpiGbl_UseHwReducedFadt;
 extern BOOLEAN              AcpiGbl_DisplayRegionAccess;
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aeexception.c b/sys/contrib/dev/acpica/source/tools/acpiexec/aeexception.c
index 62e9db0a01..2e44dbc504 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aeexception.c
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aeexception.c
@@ -196,13 +196,22 @@ AeExceptionHandler (
     Exception = AcpiFormatException (AmlStatus);
     AcpiOsPrintf (AE_PREFIX
         "Exception %s during execution\n", Exception);
+
     if (Name)
     {
         AcpiOsPrintf (AE_PREFIX
-            "Evaluating Method or Node: [%4.4s]",
+            "Evaluating Method or Node: [%4.4s]\n",
             (char *) &Name);
     }
 
+    /* Be terse about loop timeouts */
+
+    if ((AmlStatus == AE_AML_LOOP_TIMEOUT) && AcpiGbl_AbortLoopOnTimeout)
+    {
+        AcpiOsPrintf (AE_PREFIX "Aborting loop after timeout\n");
+        return (AE_OK);
+    }
+
     AcpiOsPrintf ("\n" AE_PREFIX
         "AML Opcode [%s], Method Offset ~%5.5X\n",
         AcpiPsGetOpcodeName (Opcode), AmlOffset);
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aeexec.c b/sys/contrib/dev/acpica/source/tools/acpiexec/aeexec.c
index 2594f7d00a..d609ec1cce 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aeexec.c
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aeexec.c
@@ -715,6 +715,7 @@ AeMiscellaneousTests (
     ACPI_HANDLE             Handle;
 
 #if (!ACPI_REDUCED_HARDWARE)
+    UINT32                  Temp;
     UINT32                  LockHandle1;
     UINT32                  LockHandle2;
     ACPI_VENDOR_UUID        Uuid =
@@ -973,5 +974,17 @@ AeMiscellaneousTests (
     Status = AcpiReleaseGlobalLock (LockHandle2);
     ACPI_CHECK_OK (AcpiReleaseGlobalLock, Status);
 
+    /* Test timer interfaces */
+
+    Status = AcpiGetTimerResolution (&Temp);
+    ACPI_CHECK_OK (AcpiGetTimerResolution, Status);
+
+    Status = AcpiGetTimer (&Temp);
+    ACPI_CHECK_OK (AcpiGetTimer, Status);
+
+    Status = AcpiGetTimerDuration (0x1000, 0x2000, &Temp);
+    ACPI_CHECK_OK (AcpiGetTimerDuration, Status);
+
+
 #endif /* !ACPI_REDUCED_HARDWARE */
 }
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c b/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c
index 323e2bfa17..e9908e8488 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c
@@ -189,6 +189,7 @@ AeDoOptions (
 
 UINT8                       AcpiGbl_RegionFillValue = 0;
 BOOLEAN                     AcpiGbl_IgnoreErrors = FALSE;
+BOOLEAN                     AcpiGbl_AbortLoopOnTimeout = FALSE;
 BOOLEAN                     AcpiGbl_DbOpt_NoRegionSupport = FALSE;
 UINT8                       AcpiGbl_UseHwReducedFadt = FALSE;
 BOOLEAN                     AcpiGbl_DoInterfaceTests = FALSE;
@@ -196,11 +197,9 @@ BOOLEAN                     AcpiGbl_LoadTestTables = FALSE;
 BOOLEAN                     AcpiGbl_AeLoadOnly = FALSE;
 static UINT8                AcpiGbl_ExecutionMode = AE_MODE_COMMAND_LOOP;
 static char                 BatchBuffer[AE_BUFFER_SIZE];    /* Batch command buffer */
-static char                 AeBuildDate[] = __DATE__;
-static char                 AeBuildTime[] = __TIME__;
 
 #define ACPIEXEC_NAME               "AML Execution/Debug Utility"
-#define AE_SUPPORTED_OPTIONS        "?b:d:e:f^ghi:lm^rv^:x:"
+#define AE_SUPPORTED_OPTIONS        "?b:d:e:f^ghlm^rt^v^:x:"
 
 
 /* Stubs for the disassembler */
@@ -270,9 +269,12 @@ usage (
     ACPI_OPTION ("-fv <Value>",         "Operation Region initialization fill value");
     printf ("\n");
 
-    ACPI_OPTION ("-i <Count>",          "Maximum iterations for AML while loops");
     ACPI_OPTION ("-l",                  "Load tables and namespace only");
     ACPI_OPTION ("-r",                  "Use hardware-reduced FADT V5");
+    ACPI_OPTION ("-te",                 "Exit loop on timeout instead of aborting method");
+    ACPI_OPTION ("-to <Seconds>",       "Set timeout period for AML while loops");
+    printf ("\n");
+
     ACPI_OPTION ("-v",                  "Display version information");
     ACPI_OPTION ("-vd",                 "Display build date and time");
     ACPI_OPTION ("-vi",                 "Verbose initialization output");
@@ -461,20 +463,6 @@ AeDoOptions (
         usage();
         return (1);
 
-    case 'i':
-
-        Temp = strtoul (AcpiGbl_Optarg, NULL, 0);
-        if (!Temp || (Temp > ACPI_UINT16_MAX))
-        {
-            printf ("%s: Invalid max loops value\n", AcpiGbl_Optarg);
-            return (-1);
-        }
-
-        AcpiGbl_MaxLoopIterations = (UINT16) Temp;
-        printf ("Max Loop Iterations is %u (0x%X)\n",
-            AcpiGbl_MaxLoopIterations, AcpiGbl_MaxLoopIterations);
-        break;
-
     case 'l':
 
         AcpiGbl_AeLoadOnly = TRUE;
@@ -503,6 +491,42 @@ AeDoOptions (
         printf ("Using ACPI 5.0 Hardware Reduced Mode via version 5 FADT\n");
         break;
 
+    case 't':
+
+        switch (AcpiGbl_Optarg[0])
+        {
+        case 'o':  /* -to: Set loop timeout in seconds */
+
+            if (AcpiGetoptArgument (argc, argv))
+            {
+                return (-1);
+            }
+
+            Temp = strtoul (AcpiGbl_Optarg, NULL, 0);
+            if (!Temp || (Temp > ACPI_UINT16_MAX))
+            {
+                printf ("%s: Invalid loop timeout value\n",
+                    AcpiGbl_Optarg);
+                return (-1);
+            }
+
+            AcpiGbl_MaxLoopIterations = (UINT16) Temp;
+            printf ("Automatic loop timeout after %u seconds\n",
+                AcpiGbl_MaxLoopIterations);
+            break;
+
+        case 'e':
+
+            AcpiGbl_AbortLoopOnTimeout = TRUE;
+            break;
+
+        default:
+
+            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
+            return (-1);
+        }
+        break;
+
     case 'v':
 
         switch (AcpiGbl_Optarg[0])
@@ -514,7 +538,7 @@ AeDoOptions (
 
         case 'd':
 
-            printf ("Build date/time: %s %s\n", AeBuildDate, AeBuildTime);
+            printf (ACPI_COMMON_BUILD_TIME);
             return (1);
 
         case 'i':
@@ -598,6 +622,10 @@ main (
         goto ErrorExit;
     }
 
+    /* Use a shorter timeout value for acpiexec */
+
+    AcpiGbl_MaxLoopIterations = 1;
+
     /* Initialize the AML debugger */
 
     Status = AcpiInitializeDebugger ();
diff --git a/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c b/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c
index cbc28573f2..ee7fd23e2f 100644
--- a/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c
@@ -160,7 +160,7 @@ AhDisplayUsage (
     void);
 
 #define AH_UTILITY_NAME             "ACPI Help Utility"
-#define AH_SUPPORTED_OPTIONS        "adeghikmopstuv"
+#define AH_SUPPORTED_OPTIONS        "adeghikmopstuv^"
 
 
 #if defined ACPI_OPTION
@@ -187,6 +187,7 @@ AhDisplayUsage (
     ACPI_USAGE_HEADER ("acpihelp <options> [Name/Prefix | HexValue]");
     ACPI_OPTION ("-h",                      "Display help");
     ACPI_OPTION ("-v",                      "Display version information");
+    ACPI_OPTION ("-vd",                     "Display build date and time");
 
     ACPI_USAGE_TEXT ("\nAML Names and Encodings (ACPI Machine Language):\n");
     ACPI_OPTION ("-a [Name/Prefix | *]",    "Display both ASL operator and AML opcode name(s)");
@@ -310,7 +311,23 @@ main (
 
     case 'v': /* -v: (Version): signon already emitted, just exit */
 
-        return (0);
+        switch (AcpiGbl_Optarg[0])
+        {
+        case '^':  /* -v: (Version) */
+
+            return (1);
+
+        case 'd':
+
+            printf (ACPI_COMMON_BUILD_TIME);
+            return (1);
+
+        default:
+
+            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
+            return (-1);
+        }
+        break;
 
     case 'h':
     default:
diff --git a/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c b/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c
index 256acaa97d..7fe629a950 100644
--- a/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c
@@ -179,7 +179,7 @@ BOOLEAN                     AcpiGbl_NsLoadOnly = FALSE;
 
 
 #define AN_UTILITY_NAME             "ACPI Namespace Dump Utility"
-#define AN_SUPPORTED_OPTIONS        "?hlvx:"
+#define AN_SUPPORTED_OPTIONS        "?hlv^x:"
 
 
 /******************************************************************************
@@ -203,6 +203,7 @@ usage (
     ACPI_OPTION ("-?",                  "Display this message");
     ACPI_OPTION ("-l",                  "Load namespace only, no display");
     ACPI_OPTION ("-v",                  "Display version information");
+    ACPI_OPTION ("-vd",                 "Display build date and time");
     ACPI_OPTION ("-x <DebugLevel>",     "Debug output level");
 }
 
@@ -259,9 +260,25 @@ main (
         AcpiGbl_NsLoadOnly = TRUE;
         break;
 
-    case 'v': /* -v: (Version): signon already emitted, just exit */
+    case 'v':
 
-        return (0);
+        switch (AcpiGbl_Optarg[0])
+        {
+        case '^':  /* -v: (Version): signon already emitted, just exit */
+
+            exit (0);
+
+        case 'd':
+
+            printf (ACPI_COMMON_BUILD_TIME);
+            return (0);
+
+        default:
+
+            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
+            return (-1);
+        }
+        break;
 
     case 'x':
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c b/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c
index a14af868a4..0ab58a9372 100644
--- a/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c
@@ -374,6 +374,7 @@ AsDisplayUsage (
     ACPI_OPTION ("-s",          "Generate source statistics only");
     ACPI_OPTION ("-v",          "Display version information");
     ACPI_OPTION ("-vb",         "Verbose mode");
+    ACPI_OPTION ("-vd",         "Display build date and time");
     ACPI_OPTION ("-y",          "Suppress file overwrite prompts");
 }
 
@@ -478,6 +479,11 @@ main (
             Gbl_VerboseMode = TRUE;
             break;
 
+        case 'd':
+
+            printf (ACPI_COMMON_BUILD_TIME);
+            return (0);
+
         default:
 
             printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
diff --git a/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c b/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c
index e0215e97a4..c4b023d81b 100644
--- a/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c
+++ b/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c
@@ -663,12 +663,14 @@ ACPI_TYPED_IDENTIFIER_TABLE           AcpiIdentifiers[] = {
     {"ACPI_TABLE_MSDM",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_NFIT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_PCCT",                     SRC_TYPE_STRUCT},
+    {"ACPI_TABLE_PDTT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_PPTT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_RSDP",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_RSDT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_MCHI",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_S3PT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_SBST",                     SRC_TYPE_STRUCT},
+    {"ACPI_TABLE_SDEV",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_SLIC",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_SLIT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_SPCR",                     SRC_TYPE_STRUCT},
@@ -806,13 +808,18 @@ ACPI_TYPED_IDENTIFIER_TABLE           AcpiIdentifiers[] = {
     {"ACPI_PCCT_EXT_PCC_SLAVE",             SRC_TYPE_STRUCT},
     {"ACPI_PCCT_SHARED_MEMORY",             SRC_TYPE_STRUCT},
     {"ACPI_PCCT_SUBSPACE",                  SRC_TYPE_STRUCT},
-    {"ACPI_PPTT_PROCESSOR",                 SRC_TYPE_STRUCT},
+    {"ACPI_PDTT_CHANNEL",                   SRC_TYPE_STRUCT},
     {"ACPI_PPTT_CACHE",                     SRC_TYPE_STRUCT},
     {"ACPI_PPTT_ID",                        SRC_TYPE_STRUCT},
+    {"ACPI_PPTT_PROCESSOR",                 SRC_TYPE_STRUCT},
     {"ACPI_RSDP_COMMON",                    SRC_TYPE_STRUCT},
     {"ACPI_RSDP_EXTENSION",                 SRC_TYPE_STRUCT},
     {"ACPI_S3PT_RESUME",                    SRC_TYPE_STRUCT},
     {"ACPI_S3PT_SUSPEND",                   SRC_TYPE_STRUCT},
+    {"ACPI_SDEV_HEADER",                    SRC_TYPE_STRUCT},
+    {"ACPI_SDEV_NAMESPACE",                 SRC_TYPE_STRUCT},
+    {"ACPI_SDEV_PCIE",                      SRC_TYPE_STRUCT},
+    {"ACPI_SDEV_PCIE_PATH",                 SRC_TYPE_STRUCT},
     {"ACPI_SRAT_CPU_AFFINITY",              SRC_TYPE_STRUCT},
     {"ACPI_SRAT_HEADER",                    SRC_TYPE_STRUCT},
     {"ACPI_SRAT_GIC_ITS_AFFINITY",          SRC_TYPE_STRUCT},
diff --git a/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.c b/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.c
index 32f40f52d0..ea78846da1 100644
--- a/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.c
+++ b/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.c
@@ -1,6 +1,7 @@
 /******************************************************************************
  *
- * Module Name: acpixtract - convert ascii ACPI tables to binary
+ * Module Name: acpixtract - Top level functions to convert ascii/hex
+ *                           ACPI tables to the original binary tables
  *
  *****************************************************************************/
 
@@ -152,13 +153,6 @@
 #include "acpixtract.h"
 
 
-/* Local prototypes */
-
-static BOOLEAN
-AxIsFileAscii (
-    FILE                    *Handle);
-
-
 /******************************************************************************
  *
  * FUNCTION:    AxExtractTables
@@ -217,14 +211,14 @@ AxExtractTables (
         /* Are there enough instances of the table to continue? */
 
         AxNormalizeSignature (UpperSignature);
-
         Instances = AxCountTableInstances (InputPathname, UpperSignature);
+
         if (Instances < MinimumInstances)
         {
             printf ("Table [%s] was not found in %s\n",
                 UpperSignature, InputPathname);
             fclose (InputFile);
-            return (-1);
+            return (0);             /* Don't abort */
         }
 
         if (Instances == 0)
@@ -238,6 +232,28 @@ AxExtractTables (
 
     while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile))
     {
+        /*
+         * Check up front if we have a header line of the form:
+         * DSDT @ 0xdfffd0c0 (10999 bytes)
+         */
+        if (AX_IS_TABLE_BLOCK_HEADER &&
+            (State == AX_STATE_EXTRACT_DATA))
+        {
+            /* End of previous table, start of new table */
+
+            if (ThisTableBytesWritten)
+            {
+                printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
+                    ThisTableBytesWritten, Gbl_OutputFilename);
+            }
+            else
+            {
+                Gbl_TableCount--;
+            }
+
+            State = AX_STATE_FIND_HEADER;
+        }
+
         switch (State)
         {
         case AX_STATE_FIND_HEADER:
@@ -301,10 +317,15 @@ AxExtractTables (
 
         case AX_STATE_EXTRACT_DATA:
 
+            if (!AxIsHexDataLine ())
+            {
+                continue;   /* Toss any lines that are not raw hex data */
+            }
+
             /* Empty line or non-data line terminates the data block */
 
-            BytesConverted = AxProcessOneTextLine (
-                OutputFile, ThisSignature, ThisTableBytesWritten);
+            BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature,
+                ThisTableBytesWritten);
             switch (BytesConverted)
             {
             case 0:
@@ -341,14 +362,8 @@ CleanupAndExit:
     {
         /* Received an input file EOF while extracting data */
 
-        printf (AX_TABLE_INFO_FORMAT,
-            ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename);
-    }
-
-    if (Gbl_TableCount > 1)
-    {
-        printf ("\n%u binary ACPI tables extracted\n",
-            Gbl_TableCount);
+        printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
+            ThisTableBytesWritten, Gbl_OutputFilename);
     }
 
     if (OutputFile)
@@ -385,7 +400,7 @@ AxExtractToMultiAmlFile (
     int                     Status = 0;
     unsigned int            TotalBytesWritten = 0;
     unsigned int            ThisTableBytesWritten = 0;
-    unsigned int             BytesConverted;
+    unsigned int            BytesConverted;
     char                    ThisSignature[4];
     unsigned int            State = AX_STATE_FIND_HEADER;
 
@@ -421,6 +436,28 @@ AxExtractToMultiAmlFile (
 
     while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile))
     {
+        /*
+         * Check up front if we have a header line of the form:
+         * DSDT @ 0xdfffd0c0 (10999 bytes)
+         */
+        if (AX_IS_TABLE_BLOCK_HEADER &&
+            (State == AX_STATE_EXTRACT_DATA))
+        {
+            /* End of previous table, start of new table */
+
+            if (ThisTableBytesWritten)
+            {
+                printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
+                    ThisTableBytesWritten, Gbl_OutputFilename);
+            }
+            else
+            {
+                Gbl_TableCount--;
+            }
+
+            State = AX_STATE_FIND_HEADER;
+        }
+
         switch (State)
         {
         case AX_STATE_FIND_HEADER:
@@ -451,9 +488,14 @@ AxExtractToMultiAmlFile (
 
         case AX_STATE_EXTRACT_DATA:
 
+            if (!AxIsHexDataLine ())
+            {
+                continue;   /* Toss any lines that are not raw hex data */
+            }
+
             /* Empty line or non-data line terminates the data block */
 
-            BytesConverted = AxProcessOneTextLine (
+            BytesConverted = AxConvertAndWrite (
                 OutputFile, ThisSignature, ThisTableBytesWritten);
             switch (BytesConverted)
             {
@@ -487,8 +529,8 @@ CleanupAndExit:
     {
         /* Received an input file EOF or error while writing data */
 
-        printf (AX_TABLE_INFO_FORMAT,
-            ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename);
+        printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
+            ThisTableBytesWritten, Gbl_OutputFilename);
     }
 
     printf ("\n%u binary ACPI tables extracted and written to %s (%u bytes)\n",
@@ -502,7 +544,7 @@ CleanupAndExit:
 
 /******************************************************************************
  *
- * FUNCTION:    AxListTables
+ * FUNCTION:    AxListAllTables
  *
  * PARAMETERS:  InputPathname       - Filename for acpidump file
  *
@@ -514,13 +556,13 @@ CleanupAndExit:
  ******************************************************************************/
 
 int
-AxListTables (
+AxListAllTables (
     char                    *InputPathname)
 {
     FILE                    *InputFile;
-    size_t                  HeaderSize;
     unsigned char           Header[48];
-    ACPI_TABLE_HEADER       *TableHeader = (ACPI_TABLE_HEADER *) (void *) Header;
+    UINT32                  ByteCount = 0;
+    unsigned int            State = AX_STATE_FIND_HEADER;
 
 
     /* Open input in text mode, output is in binary mode */
@@ -538,133 +580,74 @@ AxListTables (
         return (-1);
     }
 
-    /* Dump the headers for all tables found in the input file */
+    /* Info header */
+
+    printf ("\n Signature  Length    Version Oem       Oem         "
+        "Oem         Compiler Compiler\n");
+    printf (  "                              Id        TableId     "
+        "RevisionId  Name     Revision\n");
+    printf (  " _________  __________  ____  ________  __________  "
+        "__________  _______  __________\n\n");
 
-    printf ("\nSignature  Length      Revision   OemId    OemTableId"
-        "   OemRevision CompilerId CompilerRevision\n\n");
+    /* Dump the headers for all tables found in the input file */
 
     while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile))
     {
-        /* Ignore empty lines and lines that start with a space */
+        /* Ignore empty lines */
 
-        if (AxIsEmptyLine (Gbl_LineBuffer) ||
-            (Gbl_LineBuffer[0] == ' '))
+        if (AxIsEmptyLine (Gbl_LineBuffer))
         {
             continue;
         }
 
-        /* Get the 36 byte header and display the fields */
-
-        HeaderSize = AxGetTableHeader (InputFile, Header);
-        if (HeaderSize < 16)
+        /*
+         * Check up front if we have a header line of the form:
+         * DSDT @ 0xdfffd0c0 (10999 bytes)
+         */
+        if (AX_IS_TABLE_BLOCK_HEADER &&
+            (State == AX_STATE_EXTRACT_DATA))
         {
-            continue;
+            State = AX_STATE_FIND_HEADER;
         }
 
-        /* RSDP has an oddball signature and header */
-
-        if (!strncmp (TableHeader->Signature, "RSD PTR ", 8))
+        switch (State)
         {
-            AxCheckAscii ((char *) &Header[9], 6);
-            printf ("%7.4s                          \"%6.6s\"\n", "RSDP",
-                &Header[9]);
-            Gbl_TableCount++;
-            continue;
-        }
+        case AX_STATE_FIND_HEADER:
 
-        /* Minimum size for table with standard header */
+            ByteCount = 0;
+            if (!AxIsDataBlockHeader ())
+            {
+                continue;
+            }
 
-        if (HeaderSize < sizeof (ACPI_TABLE_HEADER))
-        {
+            State = AX_STATE_EXTRACT_DATA;
             continue;
-        }
 
-        if (!AcpiUtValidNameseg (TableHeader->Signature))
-        {
-            continue;
-        }
+        case AX_STATE_EXTRACT_DATA:
 
-        /* Signature and Table length */
+            /* Ignore any lines that don't look like a data line */
 
-        Gbl_TableCount++;
-        printf ("%7.4s   0x%8.8X", TableHeader->Signature,
-            TableHeader->Length);
+            if (!AxIsHexDataLine ())
+            {
+                continue;   /* Toss any lines that are not raw hex data */
+            }
 
-        /* FACS has only signature and length */
+            /* Convert header to hex and display it */
 
-        if (ACPI_COMPARE_NAME (TableHeader->Signature, "FACS"))
-        {
-            printf ("\n");
+            ByteCount += AxConvertToBinary (Gbl_LineBuffer, &Header[ByteCount]);
+            if (ByteCount >= sizeof (ACPI_TABLE_HEADER))
+            {
+                AxDumpTableHeader (Header);
+                State = AX_STATE_FIND_HEADER;
+            }
             continue;
-        }
-
-        /* OEM IDs and Compiler IDs */
-
-        AxCheckAscii (TableHeader->OemId, 6);
-        AxCheckAscii (TableHeader->OemTableId, 8);
-        AxCheckAscii (TableHeader->AslCompilerId, 4);
 
-        printf (
-            "     0x%2.2X    \"%6.6s\"  \"%8.8s\"   0x%8.8X"
-            "    \"%4.4s\"     0x%8.8X\n",
-            TableHeader->Revision, TableHeader->OemId,
-            TableHeader->OemTableId, TableHeader->OemRevision,
-            TableHeader->AslCompilerId, TableHeader->AslCompilerRevision);
+        default:
+            break;
+        }
     }
 
     printf ("\nFound %u ACPI tables in %s\n", Gbl_TableCount, InputPathname);
     fclose (InputFile);
     return (0);
 }
-
-
-/*******************************************************************************
- *
- * FUNCTION:    AxIsFileAscii
- *
- * PARAMETERS:  Handle              - To open input file
- *
- * RETURN:      TRUE if file is entirely ASCII and printable
- *
- * DESCRIPTION: Verify that the input file is entirely ASCII.
- *
- ******************************************************************************/
-
-static BOOLEAN
-AxIsFileAscii (
-    FILE                    *Handle)
-{
-    UINT8                   Byte;
-
-
-    /* Read the entire file */
-
-    while (fread (&Byte, 1, 1, Handle) == 1)
-    {
-        /* Check for an ASCII character */
-
-        if (!ACPI_IS_ASCII (Byte))
-        {
-            goto ErrorExit;
-        }
-
-        /* Ensure character is either printable or a "space" char */
-
-        else if (!isprint (Byte) && !isspace (Byte))
-        {
-            goto ErrorExit;
-        }
-    }
-
-    /* File is OK (100% ASCII) */
-
-    fseek (Handle, 0, SEEK_SET);
-    return (TRUE);
-
-ErrorExit:
-
-    printf ("File is binary (contains non-text or non-ascii characters)\n");
-    fseek (Handle, 0, SEEK_SET);
-    return (FALSE);
-
-}
diff --git a/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.h b/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.h
index abe2a1903c..c998f6b72b 100644
--- a/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.h
+++ b/sys/contrib/dev/acpica/source/tools/acpixtract/acpixtract.h
@@ -180,9 +180,9 @@
 #define AX_REQUIRED_TABLE           1
 
 #define AX_UTILITY_NAME             "ACPI Binary Table Extraction Utility"
-#define AX_SUPPORTED_OPTIONS        "ahlms:v"
+#define AX_SUPPORTED_OPTIONS        "ahlms:v^"
 #define AX_MULTI_TABLE_FILENAME     "amltables.dat"
-#define AX_TABLE_INFO_FORMAT        "Acpi table [%4.4s] - %7u bytes written to %s\n"
+#define AX_TABLE_INFO_FORMAT        "  %4.4s - %7u bytes written (0x%8.8X) - %s\n"
 
 /* Extraction states */
 
@@ -193,6 +193,8 @@
 
 #define AX_LINE_BUFFER_SIZE         256
 #define AX_MIN_BLOCK_HEADER_LENGTH  6   /* strlen ("DSDT @") */
+#define AX_IS_TABLE_BLOCK_HEADER    strstr (Gbl_LineBuffer, " @ ")
+#define AX_END_OF_HEX_DATA          55
 
 
 typedef struct AxTableInfo
@@ -210,12 +212,12 @@ typedef struct AxTableInfo
 ACPI_GLOBAL (char,           Gbl_LineBuffer[AX_LINE_BUFFER_SIZE]);
 ACPI_GLOBAL (char,           Gbl_HeaderBuffer[AX_LINE_BUFFER_SIZE]);
 ACPI_GLOBAL (char,           Gbl_InstanceBuffer[AX_LINE_BUFFER_SIZE]);
-
 ACPI_GLOBAL (AX_TABLE_INFO, *Gbl_TableListHead);
 ACPI_GLOBAL (char,           Gbl_OutputFilename[32]);
 ACPI_GLOBAL (unsigned char,  Gbl_BinaryData[16]);
 ACPI_GLOBAL (unsigned int,   Gbl_TableCount);
 
+
 /*
  * acpixtract.c
  */
@@ -230,18 +232,13 @@ AxExtractToMultiAmlFile (
     char                    *InputPathname);
 
 int
-AxListTables (
+AxListAllTables (
     char                    *InputPathname);
 
 
 /*
  * axutils.c
  */
-size_t
-AxGetTableHeader (
-    FILE                    *InputFile,
-    unsigned char           *OutputData);
-
 unsigned int
 AxCountTableInstances (
     char                    *InputPathname,
@@ -261,21 +258,33 @@ AxCheckAscii (
     char                    *Name,
     int                     Count);
 
-int
+BOOLEAN
+AxIsFileAscii (
+    FILE                    *Handle);
+
+BOOLEAN
+AxIsHexDataLine (
+    void);
+
+BOOLEAN
 AxIsEmptyLine (
     char                    *Buffer);
 
-int
+BOOLEAN
 AxIsDataBlockHeader (
     void);
 
 long
-AxProcessOneTextLine (
+AxConvertAndWrite (
     FILE                    *OutputFile,
     char                    *ThisSignature,
     unsigned int            ThisTableBytesWritten);
 
 size_t
-AxConvertLine (
+AxConvertToBinary (
     char                    *InputLine,
     unsigned char           *OutputData);
+
+void
+AxDumpTableHeader (
+    unsigned char           *Header);
diff --git a/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c b/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c
index f5aa710113..e0a274cbcd 100644
--- a/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c
@@ -180,6 +180,7 @@ DisplayUsage (
     ACPI_OPTION ("-m",                  "Extract multiple DSDT/SSDTs to a single file");
     ACPI_OPTION ("-s <signature>",      "Extract all tables with <signature>");
     ACPI_OPTION ("-v",                  "Display version information");
+    ACPI_OPTION ("-vd",                 "Display build date and time");
 
     ACPI_USAGE_TEXT ("\nExtract binary ACPI tables from text acpidump output\n");
     ACPI_USAGE_TEXT ("Default invocation extracts the DSDT and all SSDTs\n");
@@ -243,9 +244,25 @@ main (
         AxAction = AX_EXTRACT_SIGNATURE;    /* Extract only tables with this sig */
         break;
 
-    case 'v': /* -v: (Version): signon already emitted, just exit */
+    case 'v':
 
-        return (0);
+        switch (AcpiGbl_Optarg[0])
+        {
+        case '^':  /* -v: (Version): signon already emitted, just exit */
+
+            exit (0);
+
+        case 'd':
+
+            printf (ACPI_COMMON_BUILD_TIME);
+            return (0);
+
+        default:
+
+            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
+            return (-1);
+        }
+        break;
 
     case 'h':
     default:
@@ -279,7 +296,7 @@ main (
 
     case AX_LIST_ALL:
 
-        Status = AxListTables (Filename);
+        Status = AxListAllTables (Filename);
         break;
 
     case AX_EXTRACT_SIGNATURE:
diff --git a/sys/contrib/dev/acpica/source/tools/acpixtract/axutils.c b/sys/contrib/dev/acpica/source/tools/acpixtract/axutils.c
index 00882c6fed..6f88766842 100644
--- a/sys/contrib/dev/acpica/source/tools/acpixtract/axutils.c
+++ b/sys/contrib/dev/acpica/source/tools/acpixtract/axutils.c
@@ -184,6 +184,70 @@ AxCheckAscii (
 }
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AxIsFileAscii
+ *
+ * PARAMETERS:  Handle              - To open input file
+ *
+ * RETURN:      TRUE if file is entirely ASCII and printable
+ *
+ * DESCRIPTION: Verify that the input file is entirely ASCII.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AxIsFileAscii (
+    FILE                    *Handle)
+{
+    UINT8                   Byte;
+
+
+    /* Read the entire file */
+
+    fseek (Handle, 0, SEEK_SET);
+    while (fread (&Byte, 1, 1, Handle) == 1)
+    {
+        /*
+         * Ignore null characters. Some acpidump-type utilities insert
+         * a few of these, probably a bug in the utility. As long as these
+         * characters are in lines that are tossed (non-data), they
+         * won't cause a problem.
+         */
+        if (!Byte)
+        {
+            continue;
+        }
+
+        /* Check for an ASCII character */
+
+        if (!ACPI_IS_ASCII (Byte))
+        {
+            goto ErrorExit;
+        }
+
+        /* Ensure character is either printable or a "space" char */
+
+        else if (!isprint (Byte) && !isspace (Byte))
+        {
+            goto ErrorExit;
+        }
+    }
+
+    /* File is OK (100% ASCII) */
+
+    fseek (Handle, 0, SEEK_SET);
+    return (TRUE);
+
+ErrorExit:
+
+    printf ("File appears to be binary "
+        "(contains non-text or non-ascii characters)\n");
+    fseek (Handle, 0, SEEK_SET);
+    return (FALSE);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    AxIsEmptyLine
@@ -196,7 +260,7 @@ AxCheckAscii (
  *
  ******************************************************************************/
 
-int
+BOOLEAN
 AxIsEmptyLine (
     char                    *Buffer)
 {
@@ -219,6 +283,96 @@ AxIsEmptyLine (
 }
 
 
+/******************************************************************************
+ *
+ * FUNCTION:    AxIsHexDataLine
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status. 1 if the table header is valid, 0 otherwise.
+ *
+ * DESCRIPTION: Check for a valid line of hex data of the form:
+ *
+ *  00a0: 0c 00 00 00 03 00 00 00 43 48 41 35 0c 00 00 00  ........CHA5....
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AxIsHexDataLine (
+    void)
+{
+
+    if (AxIsEmptyLine (Gbl_LineBuffer) ||
+        (Gbl_LineBuffer[0] != ' '))
+    {
+        return (FALSE);
+    }
+
+    if (!strstr (Gbl_LineBuffer, ": "))
+    {
+        /* Not valid data line */
+
+        return (FALSE);
+    }
+
+    return (TRUE);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AxIsDataBlockHeader
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status. 1 if the table header is valid, 0 otherwise.
+ *
+ * DESCRIPTION: Check if the ACPI table identifier in the input acpidump text
+ *              file is valid (of the form: <sig> @ <addr>).
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AxIsDataBlockHeader (
+    void)
+{
+
+    /* Ignore lines that are too short to be header lines */
+
+    if (strlen (Gbl_LineBuffer) < AX_MIN_BLOCK_HEADER_LENGTH)
+    {
+        return (FALSE);
+    }
+
+    /* Ignore empty lines and lines that start with a space */
+
+    if (AxIsEmptyLine (Gbl_LineBuffer) ||
+        (Gbl_LineBuffer[0] == ' '))
+    {
+        return (FALSE);
+    }
+
+    /*
+     * Ignore lines that are not headers of the form <sig> @ <addr>.
+     * Basically, just look for the '@' symbol, surrounded by spaces.
+     *
+     * Examples of headers that must be supported:
+     *
+     * DSDT @ 0x737e4000
+     * XSDT @ 0x737f2fff
+     * RSD PTR @ 0xf6cd0
+     * SSDT @ (nil)
+     */
+    if (!AX_IS_TABLE_BLOCK_HEADER)
+    {
+        return (FALSE);
+    }
+
+    AxNormalizeSignature (Gbl_LineBuffer);
+    return (TRUE);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    AxNormalizeSignature
@@ -245,7 +399,7 @@ AxNormalizeSignature (
 
 /******************************************************************************
  *
- * FUNCTION:    AxConvertLine
+ * FUNCTION:    AxConvertToBinary
  *
  * PARAMETERS:  InputLine           - One line from the input acpidump file
  *              OutputData          - Where the converted data is returned
@@ -254,27 +408,30 @@ AxNormalizeSignature (
  *
  * DESCRIPTION: Convert one line of ascii text binary (up to 16 bytes)
  *
+ * NOTE: Assumes the input data line has been validated to be of the form:
+ *
+ *  0010: 48 53 57 55 4c 54 2d 52 01 00 00 00 49 4e 54 4c  HSWULT-R....INTL
+ *
  ******************************************************************************/
 
 size_t
-AxConvertLine (
+AxConvertToBinary (
     char                    *InputLine,
     unsigned char           *OutputData)
 {
-    char                    *End;
     int                     BytesConverted;
     int                     Converted[16];
     int                     i;
 
 
-    /* Terminate the input line at the end of the actual data (for sscanf) */
-
-    End = strstr (InputLine + 2, "  ");
-    if (!End)
-    {
-        return (0); /* Don't understand the format */
-    }
-    *End = 0;
+    /*
+     * Terminate input line immediately after the data. Otherwise, the
+     * second line below will not scan correctly.
+     *
+     *    00b0: 03 00 00 00 43 48 41 36 0c 00 00 00 03 00 00 00  ....CHA6........
+     *    00c0: 43 48 41 37                                      CHA7
+     */
+    InputLine [AX_END_OF_HEX_DATA] = 0;
 
     /*
      * Convert one line of table data, of the form:
@@ -284,7 +441,7 @@ AxConvertLine (
      * 02C0: 5F 53 42 5F 4C 4E 4B 44 00 12 13 04 0C FF FF 08  _SB_LNKD........
      */
     BytesConverted = sscanf (InputLine,
-        "%*s %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
+        "%*s %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X",
         &Converted[0],  &Converted[1],  &Converted[2],  &Converted[3],
         &Converted[4],  &Converted[5],  &Converted[6],  &Converted[7],
         &Converted[8],  &Converted[9],  &Converted[10], &Converted[11],
@@ -301,52 +458,6 @@ AxConvertLine (
 }
 
 
-/******************************************************************************
- *
- * FUNCTION:    AxGetTableHeader
- *
- * PARAMETERS:  InputFile           - Handle for the input acpidump file
- *              OutputData          - Where the table header is returned
- *
- * RETURN:      The actual number of bytes converted
- *
- * DESCRIPTION: Extract and convert an ACPI table header
- *
- ******************************************************************************/
-
-size_t
-AxGetTableHeader (
-    FILE                    *InputFile,
-    unsigned char           *OutputData)
-{
-    size_t                  BytesConverted;
-    size_t                  TotalConverted = 0;
-    int                     i;
-
-
-    /* Get the full 36 byte ACPI table header, requires 3 input text lines */
-
-    for (i = 0; i < 3; i++)
-    {
-        if (!fgets (Gbl_HeaderBuffer, AX_LINE_BUFFER_SIZE, InputFile))
-        {
-            return (TotalConverted);
-        }
-
-        BytesConverted = AxConvertLine (Gbl_HeaderBuffer, OutputData);
-        TotalConverted += BytesConverted;
-        OutputData += 16;
-
-        if (BytesConverted != 16)
-        {
-            return (TotalConverted);
-        }
-    }
-
-    return (TotalConverted);
-}
-
-
 /******************************************************************************
  *
  * FUNCTION:    AxCountTableInstances
@@ -467,105 +578,154 @@ AxGetNextInstance (
 
 /******************************************************************************
  *
- * FUNCTION:    AxIsDataBlockHeader
+ * FUNCTION:    AxConvertAndWrite
  *
- * PARAMETERS:  None
+ * PARAMETERS:  OutputFile              - Where to write the binary data
+ *              ThisSignature           - Signature of current ACPI table
+ *              ThisTableBytesWritten   - Total count of data written
  *
- * RETURN:      Status. 1 if the table header is valid, 0 otherwise.
+ * RETURN:      Length of the converted line
  *
- * DESCRIPTION: Check if the ACPI table identifier in the input acpidump text
- *              file is valid (of the form: <sig> @ <addr>).
+ * DESCRIPTION: Convert one line of input hex ascii text to binary, and write
+ *              the binary data to the table output file.
+ *
+ * NOTE: Assumes the input data line has been validated to be of the form:
+ *
+ *  0010: 48 53 57 55 4c 54 2d 52 01 00 00 00 49 4e 54 4c  HSWULT-R....INTL
  *
  ******************************************************************************/
 
-int
-AxIsDataBlockHeader (
-    void)
+long
+AxConvertAndWrite (
+    FILE                    *OutputFile,
+    char                    *ThisSignature,
+    unsigned int            ThisTableBytesWritten)
 {
+    size_t                  BytesWritten;
+    size_t                  BytesConverted;
 
-    /* Ignore lines that are too short to be header lines */
 
-    if (strlen (Gbl_LineBuffer) < AX_MIN_BLOCK_HEADER_LENGTH)
-    {
-        return (0);
-    }
+    /* Convert one line of ascii hex data to binary */
 
-    /* Ignore empty lines and lines that start with a space */
+    BytesConverted = AxConvertToBinary (Gbl_LineBuffer, Gbl_BinaryData);
 
-    if (AxIsEmptyLine (Gbl_LineBuffer) ||
-        (Gbl_LineBuffer[0] == ' '))
+    /* Write the binary data */
+
+    if (!BytesConverted)
     {
         return (0);
     }
 
-    /*
-     * Ignore lines that are not headers of the form <sig> @ <addr>.
-     * Basically, just look for the '@' symbol, surrounded by spaces.
-     *
-     * Examples of headers that must be supported:
-     *
-     * DSDT @ 0x737e4000
-     * XSDT @ 0x737f2fff
-     * RSD PTR @ 0xf6cd0
-     * SSDT @ (nil)
-     */
-    if (!strstr (Gbl_LineBuffer, " @ "))
+    BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile);
+    if (BytesWritten != BytesConverted)
     {
-        return (0);
+        printf ("Error while writing file %s\n", Gbl_OutputFilename);
+        return (-1);
     }
 
-    AxNormalizeSignature (Gbl_LineBuffer);
-    return (1);
+    return (BytesWritten);
 }
 
 
 /******************************************************************************
  *
- * FUNCTION:    AxProcessOneTextLine
+ * FUNCTION:    AxDumpTableHeader
  *
- * PARAMETERS:  OutputFile              - Where to write the binary data
- *              ThisSignature           - Signature of current ACPI table
- *              ThisTableBytesWritten   - Total count of data written
+ * PARAMETERS:  Header          - A binary ACPI table header
  *
- * RETURN:      Length of the converted line
+ * RETURN:      None
  *
- * DESCRIPTION: Convert one line of input hex ascii text to binary, and write
- *              the binary data to the table output file.
+ * DESCRIPTION: Display the contents of a standard ACPI table header
  *
  ******************************************************************************/
 
-long
-AxProcessOneTextLine (
-    FILE                    *OutputFile,
-    char                    *ThisSignature,
-    unsigned int            ThisTableBytesWritten)
+void
+AxDumpTableHeader (
+    unsigned char           *Header)
 {
-    size_t                  BytesWritten;
-    size_t                  BytesConverted;
+    ACPI_TABLE_HEADER       *TableHeader = (ACPI_TABLE_HEADER *) (void *) Header;
+    ACPI_TABLE_RSDP         *Rsdp = (ACPI_TABLE_RSDP *) (void *) Header;
+    ACPI_TABLE_FACS         *Facs = (ACPI_TABLE_FACS *) (void *) Header;
 
 
-    /* Check for the end of this table data block */
+    /* RSDP has an oddball signature and header */
 
-    if (AxIsEmptyLine (Gbl_LineBuffer) ||
-        (Gbl_LineBuffer[0] != ' '))
+    if (!strncmp (TableHeader->Signature, "RSD PTR ", 8))
     {
-        printf (AX_TABLE_INFO_FORMAT,
-            ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename);
-        return (0);
+        AxCheckAscii ((char *) &Header[9], 6);
+
+        Gbl_TableCount++;
+        printf (" %.2u) %5.4s  0x%8.8X  0x%2.2X  \"%6.6s\"\n",
+            Gbl_TableCount, "RSDP", Rsdp->Length, Rsdp->Revision, Rsdp->OemId);
+        return;
     }
 
-    /* Convert one line of ascii hex data to binary */
+    if (!AcpiUtValidNameseg (TableHeader->Signature))
+    {
+        return;
+    }
 
-    BytesConverted = AxConvertLine (Gbl_LineBuffer, Gbl_BinaryData);
+    /* Signature and Table length */
 
-    /* Write the binary data */
+    Gbl_TableCount++;
+    printf (" %.2u) %5.4s  0x%8.8X", Gbl_TableCount, TableHeader->Signature,
+        TableHeader->Length);
 
-    BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile);
-    if (BytesWritten != BytesConverted)
+    /* FACS has only signature and length */
+
+    if (ACPI_COMPARE_NAME (TableHeader->Signature, "FACS"))
     {
-        printf ("Error while writing file %s\n", Gbl_OutputFilename);
-        return (-1);
+        printf ("  0x%2.2X\n", Facs->Version);
+        return;
     }
 
-    return (BytesWritten);
+    /* OEM IDs and Compiler IDs */
+
+    AxCheckAscii (TableHeader->OemId, 6);
+    AxCheckAscii (TableHeader->OemTableId, 8);
+    AxCheckAscii (TableHeader->AslCompilerId, 4);
+
+    printf (
+        "  0x%2.2X  \"%6.6s\"  \"%8.8s\"  0x%8.8X"
+        "  \"%4.4s\"   0x%8.8X\n",
+        TableHeader->Revision, TableHeader->OemId,
+        TableHeader->OemTableId, TableHeader->OemRevision,
+        TableHeader->AslCompilerId, TableHeader->AslCompilerRevision);
+}
+
+
+#ifdef _AX_FUTURE_ENHANCEMENTS
+
+/* Possible enhancement to validate table lengths */
+
+void
+AxCheckTableLengths (
+    UINT32                  ByteCount,
+    UINT32                  AmlByteCount)
+{
+
+    if (AmlByteCount == 0)
+    {
+        return;
+    }
+
+    if (ByteCount == 0)
+    {
+        return;
+    }
+
+    if ((ByteCount < sizeof (ACPI_TABLE_HEADER)) &&
+        (ByteCount >= ACPI_NAME_SIZE))
+    {
+        printf ("  : (Table too short for an ACPI table)");
+    }
+
+    else if (ByteCount != AmlByteCount)
+    {
+        printf ("  : (Hex data length mismatch with AML length 0x%X)",
+            AmlByteCount);
+    }
+
+    printf ("\n");
 }
+#endif
diff --git a/usr.sbin/acpi/acpibin/acpibin.8 b/usr.sbin/acpi/acpibin/acpibin.8
index f0cb6fe2b4..6d4f45b103 100644
--- a/usr.sbin/acpi/acpibin/acpibin.8
+++ b/usr.sbin/acpi/acpibin/acpibin.8
@@ -28,7 +28,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd November 23, 2016
+.Dd September 29, 2017
 .Dt ACPIBIN 8
 .Os
 .Sh NAME
@@ -60,6 +60,8 @@ Update checksum for binary AML file.
 Terse mode.
 .It Fl v
 Display version information.
+.It Fl vd
+Display build date and time.
 .El
 .Sh SEE ALSO
 .Xr acpi 4 ,
diff --git a/usr.sbin/acpi/acpidump/acpidump.8 b/usr.sbin/acpi/acpidump/acpidump.8
index 7fd375b418..05d860bc73 100644
--- a/usr.sbin/acpi/acpidump/acpidump.8
+++ b/usr.sbin/acpi/acpidump/acpidump.8
@@ -28,7 +28,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd July 1, 2017
+.Dd September 29, 2017
 .Dt ACPIDUMP 8
 .Os
 .Sh NAME
@@ -63,6 +63,8 @@ Dump tables from specified RSDP.
 Print table summaries only.
 .It Fl v
 Display version information.
+.It Fl vd
+Display build date and time.
 .It Fl x
 Use RSDT instead of XSDT.
 .It Fl z
diff --git a/usr.sbin/acpi/acpiexec/Makefile b/usr.sbin/acpi/acpiexec/Makefile
index 4b5af66bd1..b8baea73e7 100644
--- a/usr.sbin/acpi/acpiexec/Makefile
+++ b/usr.sbin/acpi/acpiexec/Makefile
@@ -115,6 +115,7 @@ SRCS+=	\
 	hwpci.c \
 	hwregs.c \
 	hwsleep.c \
+	hwtimer.c \
 	hwvalid.c \
 	hwxface.c \
 	hwxfsleep.c \
diff --git a/usr.sbin/acpi/acpiexec/acpiexec.8 b/usr.sbin/acpi/acpiexec/acpiexec.8
index fdea91d4ca..2c643ada74 100644
--- a/usr.sbin/acpi/acpiexec/acpiexec.8
+++ b/usr.sbin/acpi/acpiexec/acpiexec.8
@@ -28,7 +28,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd September 4, 2016
+.Dd September 29, 2017
 .Dt ACPIEXEC 8
 .Os
 .Sh NAME
@@ -80,8 +80,6 @@ Display the help message.
 .It Fl \&?
 Alias for
 .Fl h .
-.It Fl i Ar count
-Set maximum iterations for AML while loops.
 .It Fl l
 Load tables and namespace only.
 .It Fl m Op Ar method
@@ -90,6 +88,10 @@ The default method is
 .Sy MAIN .
 .It Fl r
 Use hardware-reduced FADT V5.
+.It Fl te
+Exit loop on timeout instead of aborting method.
+.It Fl to
+Set timeout period for AML while loops.
 .It Fl v
 Display version information.
 .It Fl vd
diff --git a/usr.sbin/acpi/acpihelp/acpihelp.8 b/usr.sbin/acpi/acpihelp/acpihelp.8
index 31655e2bcf..660b9d5350 100644
--- a/usr.sbin/acpi/acpihelp/acpihelp.8
+++ b/usr.sbin/acpi/acpihelp/acpihelp.8
@@ -28,7 +28,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd July 30, 2016
+.Dd September 29, 2017
 .Dt ACPIHELP 8
 .Os
 .Sh NAME
@@ -69,6 +69,8 @@ Display supported ACPI tables.
 Display ACPI-related UUIDs.
 .It Fl v
 Display version information.
+.It Fl vd
+Display build date and time.
 .El
 .Pp
 If neither
diff --git a/usr.sbin/acpi/acpinames/acpinames.8 b/usr.sbin/acpi/acpinames/acpinames.8
index 8315d9a8f3..81e053aa0d 100644
--- a/usr.sbin/acpi/acpinames/acpinames.8
+++ b/usr.sbin/acpi/acpinames/acpinames.8
@@ -28,7 +28,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd August 21, 2015
+.Dd September 29, 2017
 .Dt ACPINAMES 8
 .Os
 .Sh NAME
@@ -50,6 +50,8 @@ Alias for
 Load namespace only, no display.
 .It Fl v
 Display version information.
+.It Fl vd
+Display build date and time.
 .It Fl x Ar debug_level
 Set debug output level.
 .El
diff --git a/usr.sbin/acpi/acpixtract/acpixtract.8 b/usr.sbin/acpi/acpixtract/acpixtract.8
index bd87e686c8..969fa578a3 100644
--- a/usr.sbin/acpi/acpixtract/acpixtract.8
+++ b/usr.sbin/acpi/acpixtract/acpixtract.8
@@ -28,7 +28,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd November 25, 2015
+.Dd September 29, 2017
 .Dt ACPIXTRACT 8
 .Os
 .Sh NAME
@@ -52,6 +52,8 @@ Extract all tables with
 .Ar signature .
 .It Fl v
 Display version information.
+.It Fl vd
+Display build date and time.
 .El
 .Sh SEE ALSO
 .Xr acpi 4 ,
diff --git a/usr.sbin/acpi/iasl/Makefile b/usr.sbin/acpi/iasl/Makefile
index 175c16c5b1..3006f4c86b 100644
--- a/usr.sbin/acpi/iasl/Makefile
+++ b/usr.sbin/acpi/iasl/Makefile
@@ -29,9 +29,11 @@ SRCS=	\
 	ahpredef.c \
 	ahtable.c \
 	ahuuids.c \
+	aslallocate.c \
 	aslanalyze.c \
 	aslascii.c \
 	aslbtypes.c \
+	aslcache.c \
 	aslcodegen.c \
 	aslcompile.c \
 	asldebug.c \
-- 
2.14.1

