Home | History | Annotate | Line # | Download | only in common
dmtbdump2.c revision 1.1.1.13
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump2 - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2022, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include <wchar.h>
     45 #include "acpi.h"
     46 #include "accommon.h"
     47 #include "acdisasm.h"
     48 #include "actables.h"
     49 #include "aslcompiler.h"
     50 
     51 /* This module used for application-level code only */
     52 
     53 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     54         ACPI_MODULE_NAME    ("dmtbdump2")
     55 
     56 
     57 /*******************************************************************************
     58  *
     59  * FUNCTION:    AcpiDmDumpIort
     60  *
     61  * PARAMETERS:  Table               - A IORT table
     62  *
     63  * RETURN:      None
     64  *
     65  * DESCRIPTION: Format the contents of a IORT
     66  *
     67  ******************************************************************************/
     68 
     69 void
     70 AcpiDmDumpIort (
     71     ACPI_TABLE_HEADER       *Table)
     72 {
     73     ACPI_STATUS             Status;
     74     ACPI_TABLE_IORT         *Iort;
     75     ACPI_IORT_NODE          *IortNode;
     76     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
     77     ACPI_IORT_SMMU          *IortSmmu = NULL;
     78     ACPI_IORT_RMR           *IortRmr = NULL;
     79     UINT32                  Offset;
     80     UINT32                  NodeOffset;
     81     UINT32                  Length;
     82     ACPI_DMTABLE_INFO       *InfoTable;
     83     char                    *String;
     84     UINT32                  i;
     85     UINT32                  MappingByteLength;
     86     UINT8                   Revision;
     87 
     88 
     89     /* Main table */
     90 
     91     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
     92     if (ACPI_FAILURE (Status))
     93     {
     94         return;
     95     }
     96 
     97     Revision = Table->Revision;
     98 
     99     /* IORT Revisions E, E.a and E.c have known issues and are not supported */
    100 
    101     if (Revision == 1 || Revision == 2 || Revision == 4)
    102     {
    103         AcpiOsPrintf ("\n**** Unsupported IORT revision 0x%X\n",
    104                       Revision);
    105         return;
    106     }
    107 
    108     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
    109     Offset = sizeof (ACPI_TABLE_IORT);
    110 
    111     /* Dump the OptionalPadding (optional) */
    112 
    113     if (Iort->NodeOffset > Offset)
    114     {
    115         Status = AcpiDmDumpTable (Table->Length, Offset, Table,
    116             Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
    117         if (ACPI_FAILURE (Status))
    118         {
    119             return;
    120         }
    121     }
    122 
    123     Offset = Iort->NodeOffset;
    124     while (Offset < Table->Length)
    125     {
    126         /* Common subtable header */
    127 
    128         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
    129         AcpiOsPrintf ("\n");
    130         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
    131 
    132         if (Revision == 0)
    133         {
    134             Status = AcpiDmDumpTable (Table->Length, Offset,
    135                 IortNode, Length, AcpiDmTableInfoIortHdr);
    136         }
    137         else if (Revision >= 3)
    138         {
    139             Status = AcpiDmDumpTable (Table->Length, Offset,
    140                 IortNode, Length, AcpiDmTableInfoIortHdr3);
    141         }
    142 
    143         if (ACPI_FAILURE (Status))
    144         {
    145             return;
    146         }
    147 
    148         NodeOffset = Length;
    149 
    150         switch (IortNode->Type)
    151         {
    152         case ACPI_IORT_NODE_ITS_GROUP:
    153 
    154             InfoTable = AcpiDmTableInfoIort0;
    155             Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
    156             IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
    157             break;
    158 
    159         case ACPI_IORT_NODE_NAMED_COMPONENT:
    160 
    161             InfoTable = AcpiDmTableInfoIort1;
    162             Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
    163             String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
    164             Length += strlen (String) + 1;
    165             break;
    166 
    167         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
    168 
    169             InfoTable = AcpiDmTableInfoIort2;
    170             Length = IortNode->Length - NodeOffset;
    171             break;
    172 
    173         case ACPI_IORT_NODE_SMMU:
    174 
    175             InfoTable = AcpiDmTableInfoIort3;
    176             Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
    177             IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
    178             break;
    179 
    180         case ACPI_IORT_NODE_SMMU_V3:
    181 
    182             InfoTable = AcpiDmTableInfoIort4;
    183             Length = IortNode->Length - NodeOffset;
    184             break;
    185 
    186         case ACPI_IORT_NODE_PMCG:
    187 
    188             InfoTable = AcpiDmTableInfoIort5;
    189             Length = IortNode->Length - NodeOffset;
    190             break;
    191 
    192         case ACPI_IORT_NODE_RMR:
    193 
    194             InfoTable = AcpiDmTableInfoIort6;
    195             Length = IortNode->Length - NodeOffset;
    196             IortRmr = ACPI_ADD_PTR (ACPI_IORT_RMR, IortNode, NodeOffset);
    197             break;
    198 
    199         default:
    200 
    201             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
    202                 IortNode->Type);
    203 
    204             /* Attempt to continue */
    205 
    206             if (!IortNode->Length)
    207             {
    208                 AcpiOsPrintf ("Invalid zero length IORT node\n");
    209                 return;
    210             }
    211             goto NextSubtable;
    212         }
    213 
    214         /* Dump the node subtable header */
    215 
    216         AcpiOsPrintf ("\n");
    217         Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    218             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    219             Length, InfoTable);
    220         if (ACPI_FAILURE (Status))
    221         {
    222             return;
    223         }
    224 
    225         NodeOffset += Length;
    226 
    227         /* Dump the node specific data */
    228 
    229         switch (IortNode->Type)
    230         {
    231         case ACPI_IORT_NODE_ITS_GROUP:
    232 
    233             /* Validate IortItsGroup to avoid compiler warnings */
    234 
    235             if (IortItsGroup)
    236             {
    237                 for (i = 0; i < IortItsGroup->ItsCount; i++)
    238                 {
    239                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    240                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    241                         4, AcpiDmTableInfoIort0a);
    242                     if (ACPI_FAILURE (Status))
    243                     {
    244                         return;
    245                     }
    246 
    247                     NodeOffset += 4;
    248                 }
    249             }
    250             break;
    251 
    252         case ACPI_IORT_NODE_NAMED_COMPONENT:
    253 
    254             /* Dump the Padding (optional) */
    255 
    256             if (IortNode->Length > NodeOffset)
    257             {
    258                 MappingByteLength =
    259                     IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);
    260                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    261                     Table, IortNode->Length - NodeOffset - MappingByteLength,
    262                     AcpiDmTableInfoIort1a);
    263                 if (ACPI_FAILURE (Status))
    264                 {
    265                     return;
    266                 }
    267             }
    268             break;
    269 
    270         case ACPI_IORT_NODE_SMMU:
    271 
    272             AcpiOsPrintf ("\n");
    273 
    274             /* Validate IortSmmu to avoid compiler warnings */
    275 
    276             if (IortSmmu)
    277             {
    278                 Length = 2 * sizeof (UINT64);
    279                 NodeOffset = IortSmmu->GlobalInterruptOffset;
    280                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    281                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    282                     Length, AcpiDmTableInfoIort3a);
    283                 if (ACPI_FAILURE (Status))
    284                 {
    285                     return;
    286                 }
    287 
    288                 NodeOffset = IortSmmu->ContextInterruptOffset;
    289                 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
    290                 {
    291                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    292                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    293                         8, AcpiDmTableInfoIort3b);
    294                     if (ACPI_FAILURE (Status))
    295                     {
    296                         return;
    297                     }
    298 
    299                     NodeOffset += 8;
    300                 }
    301 
    302                 NodeOffset = IortSmmu->PmuInterruptOffset;
    303                 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
    304                 {
    305                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    306                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    307                         8, AcpiDmTableInfoIort3c);
    308                     if (ACPI_FAILURE (Status))
    309                     {
    310                         return;
    311                     }
    312 
    313                     NodeOffset += 8;
    314                 }
    315             }
    316             break;
    317 
    318         case ACPI_IORT_NODE_RMR:
    319 
    320             /* Validate IortRmr to avoid compiler warnings */
    321             if (IortRmr)
    322             {
    323                 NodeOffset = IortRmr->RmrOffset;
    324                 Length = sizeof (ACPI_IORT_RMR_DESC);
    325                 for (i = 0; i < IortRmr->RmrCount; i++)
    326                 {
    327                     AcpiOsPrintf ("\n");
    328                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    329                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    330                         Length, AcpiDmTableInfoIort6a);
    331                     if (ACPI_FAILURE (Status))
    332                     {
    333                         return;
    334                     }
    335 
    336                     NodeOffset += Length;
    337                 }
    338             }
    339             break;
    340 
    341         default:
    342 
    343             break;
    344         }
    345 
    346         /* Dump the ID mappings */
    347 
    348         NodeOffset = IortNode->MappingOffset;
    349         for (i = 0; i < IortNode->MappingCount; i++)
    350         {
    351             AcpiOsPrintf ("\n");
    352             Length = sizeof (ACPI_IORT_ID_MAPPING);
    353             Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
    354                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
    355                 Length, AcpiDmTableInfoIortMap);
    356             if (ACPI_FAILURE (Status))
    357             {
    358                 return;
    359             }
    360 
    361             NodeOffset += Length;
    362         }
    363 
    364 NextSubtable:
    365         /* Point to next node subtable */
    366 
    367         Offset += IortNode->Length;
    368     }
    369 }
    370 
    371 
    372 /*******************************************************************************
    373  *
    374  * FUNCTION:    AcpiDmDumpIvrs
    375  *
    376  * PARAMETERS:  Table               - A IVRS table
    377  *
    378  * RETURN:      None
    379  *
    380  * DESCRIPTION: Format the contents of a IVRS. Notes:
    381  *              The IVRS is essentially a flat table, with the following
    382  *              structure:
    383  *              <Main ACPI Table Header>
    384  *              <Main subtable - virtualization info>
    385  *              <IVHD>
    386  *                  <Device Entries>
    387  *              ...
    388  *              <IVHD>
    389  *                  <Device Entries>
    390  *              <IVMD>
    391  *              ...
    392  *
    393  ******************************************************************************/
    394 
    395 void
    396 AcpiDmDumpIvrs (
    397     ACPI_TABLE_HEADER       *Table)
    398 {
    399     ACPI_STATUS             Status;
    400     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
    401     UINT32                  EntryOffset;
    402     UINT32                  EntryLength;
    403     UINT32                  EntryType;
    404     ACPI_IVRS_DEVICE_HID    *HidSubtable;
    405     ACPI_IVRS_DE_HEADER     *DeviceEntry;
    406     ACPI_IVRS_HEADER        *Subtable;
    407     ACPI_DMTABLE_INFO       *InfoTable;
    408 
    409 
    410     /* Main table */
    411 
    412     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
    413     if (ACPI_FAILURE (Status))
    414     {
    415         return;
    416     }
    417 
    418     /* Subtables */
    419 
    420     Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
    421 
    422     while (Offset < Table->Length)
    423     {
    424         switch (Subtable->Type)
    425         {
    426         /* Type 10h, IVHD (I/O Virtualization Hardware Definition) */
    427 
    428         case ACPI_IVRS_TYPE_HARDWARE1:
    429 
    430             AcpiOsPrintf ("\n");
    431             InfoTable = AcpiDmTableInfoIvrsHware1;
    432             break;
    433 
    434         /* Types 11h, 40h, IVHD (I/O Virtualization Hardware Definition) */
    435 
    436         case ACPI_IVRS_TYPE_HARDWARE2:
    437         case ACPI_IVRS_TYPE_HARDWARE3:
    438 
    439             AcpiOsPrintf ("\n");
    440             InfoTable = AcpiDmTableInfoIvrsHware23;
    441             break;
    442 
    443         /* Types 20h-22h, IVMD (I/O Virtualization Memory Definition Block) */
    444 
    445         case ACPI_IVRS_TYPE_MEMORY1:
    446         case ACPI_IVRS_TYPE_MEMORY2:
    447         case ACPI_IVRS_TYPE_MEMORY3:
    448 
    449             AcpiOsPrintf ("\n");
    450             InfoTable = AcpiDmTableInfoIvrsMemory;
    451             break;
    452 
    453         default:
    454 
    455             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
    456                 Subtable->Type);
    457 
    458             /* Attempt to continue */
    459 
    460             if (!Subtable->Length)
    461             {
    462                 AcpiOsPrintf ("Invalid zero length subtable\n");
    463                 return;
    464             }
    465             goto NextSubtable;
    466         }
    467 
    468         /* Dump the subtable */
    469 
    470         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    471             Subtable->Length, InfoTable);
    472         if (ACPI_FAILURE (Status))
    473         {
    474             return;
    475         }
    476 
    477         /* The hardware subtables (IVHD) can contain multiple device entries */
    478 
    479         if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
    480             Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2 ||
    481             Subtable->Type == ACPI_IVRS_TYPE_HARDWARE3)
    482         {
    483             if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
    484             {
    485                 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);
    486                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
    487                     sizeof (ACPI_IVRS_HARDWARE1));
    488             }
    489             else
    490             {
    491                 /* ACPI_IVRS_TYPE_HARDWARE2, HARDWARE3 subtable types */
    492 
    493                 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);
    494                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
    495                     sizeof (ACPI_IVRS_HARDWARE2));
    496             }
    497 
    498             /* Process all of the Device Entries */
    499 
    500             while (EntryOffset < (Offset + Subtable->Length))
    501             {
    502                 AcpiOsPrintf ("\n");
    503 
    504                 /*
    505                  * Upper 2 bits of Type encode the length of the device entry
    506                  *
    507                  * 00 = 4 byte
    508                  * 01 = 8 byte
    509                  * 1x = variable length
    510                  */
    511                 EntryType = DeviceEntry->Type;
    512                 EntryLength = EntryType >> 6 == 1 ? 8 : 4;
    513 
    514                 switch (EntryType)
    515                 {
    516                 /* 4-byte device entries */
    517 
    518                 case ACPI_IVRS_TYPE_PAD4:
    519                 case ACPI_IVRS_TYPE_ALL:
    520                 case ACPI_IVRS_TYPE_SELECT:
    521                 case ACPI_IVRS_TYPE_START:
    522                 case ACPI_IVRS_TYPE_END:
    523 
    524                     InfoTable = AcpiDmTableInfoIvrs4;
    525                     break;
    526 
    527                 /* 8-byte entries, type A */
    528 
    529                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
    530                 case ACPI_IVRS_TYPE_ALIAS_START:
    531 
    532                     InfoTable = AcpiDmTableInfoIvrs8a;
    533                     break;
    534 
    535                 /* 8-byte entries, type B */
    536 
    537                 case ACPI_IVRS_TYPE_PAD8:
    538                 case ACPI_IVRS_TYPE_EXT_SELECT:
    539                 case ACPI_IVRS_TYPE_EXT_START:
    540 
    541                     InfoTable = AcpiDmTableInfoIvrs8b;
    542                     break;
    543 
    544                 /* 8-byte entries, type C */
    545 
    546                 case ACPI_IVRS_TYPE_SPECIAL:
    547 
    548                     InfoTable = AcpiDmTableInfoIvrs8c;
    549                     break;
    550 
    551                 /* Variable-length entries */
    552 
    553                 case ACPI_IVRS_TYPE_HID:
    554 
    555                     EntryLength = 4;
    556                     InfoTable = AcpiDmTableInfoIvrsHid;
    557                     break;
    558 
    559                 default:
    560                     InfoTable = AcpiDmTableInfoIvrs4;
    561                     AcpiOsPrintf (
    562                         "\n**** Unknown IVRS device entry type/length: "
    563                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
    564                         EntryType, EntryLength, EntryOffset);
    565                     break;
    566                 }
    567 
    568                 /* Dump the Device Entry */
    569 
    570                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    571                     DeviceEntry, EntryLength, InfoTable);
    572                 if (ACPI_FAILURE (Status))
    573                 {
    574                     return;
    575                 }
    576 
    577                 HidSubtable = ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, DeviceEntry);
    578                 EntryOffset += EntryLength;
    579                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, HidSubtable,
    580                     EntryLength);
    581 
    582                 if (EntryType == ACPI_IVRS_TYPE_HID)
    583                 {
    584                     /*
    585                      * Determine if the HID is an integer or a string.
    586                      * An integer is defined to be 32 bits, with the upper 32 bits
    587                      * set to zero. (from the ACPI Spec): "The HID can be a 32-bit
    588                      * integer or a character string. If an integer, the lower
    589                      * 4 bytes of the field contain the integer and the upper
    590                      * 4 bytes are padded with 0".
    591                      */
    592                     if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiHid))
    593                     {
    594                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    595                             &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidInteger);
    596                     }
    597                     else
    598                     {
    599                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    600                             &HidSubtable->AcpiHid, 8, AcpiDmTableInfoIvrsHidString);
    601                     }
    602                     if (ACPI_FAILURE (Status))
    603                     {
    604                         return;
    605                     }
    606 
    607                     EntryOffset += 8;
    608 
    609                     /*
    610                      * Determine if the CID is an integer or a string. The format
    611                      * of the CID is the same as the HID above. From ACPI Spec:
    612                      * "If present, CID must be a single Compatible Device ID
    613                      * following the same format as the HID field."
    614                      */
    615                     if (UtIsIdInteger ((UINT8 *) &HidSubtable->AcpiCid))
    616                     {
    617                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    618                             &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidInteger);
    619                     }
    620                     else
    621                     {
    622                         Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    623                             &HidSubtable->AcpiCid, 8, AcpiDmTableInfoIvrsCidString);
    624                     }
    625                     if (ACPI_FAILURE (Status))
    626                     {
    627                         return;
    628                     }
    629 
    630                     EntryOffset += 8;
    631                     EntryLength = HidSubtable->UidLength;
    632 
    633                     if (EntryLength > ACPI_IVRS_UID_NOT_PRESENT)
    634                     {
    635                         /* Dump the UID based upon the UidType field (String or Integer) */
    636 
    637                         if (HidSubtable->UidType == ACPI_IVRS_UID_IS_STRING)
    638                         {
    639                             Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    640                                 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidString);
    641                             if (ACPI_FAILURE (Status))
    642                             {
    643                                 return;
    644                             }
    645                         }
    646                         else /* ACPI_IVRS_UID_IS_INTEGER */
    647                         {
    648                             Status = AcpiDmDumpTable (Table->Length, EntryOffset,
    649                                 &HidSubtable->UidType, EntryLength, AcpiDmTableInfoIvrsUidInteger);
    650                             if (ACPI_FAILURE (Status))
    651                             {
    652                                 return;
    653                             }
    654                         }
    655                     }
    656 
    657                     EntryOffset += EntryLength+2;
    658                     DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER,
    659                         Table, EntryOffset);
    660                 }
    661             }
    662         }
    663 
    664 NextSubtable:
    665         /* Point to next subtable */
    666 
    667         Offset += Subtable->Length;
    668         Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
    669     }
    670 }
    671 
    672 
    673 /*******************************************************************************
    674  *
    675  * FUNCTION:    AcpiDmDumpLpit
    676  *
    677  * PARAMETERS:  Table               - A LPIT table
    678  *
    679  * RETURN:      None
    680  *
    681  * DESCRIPTION: Format the contents of a LPIT. This table type consists
    682  *              of an open-ended number of subtables. Note: There are no
    683  *              entries in the main table. An LPIT consists of the table
    684  *              header and then subtables only.
    685  *
    686  ******************************************************************************/
    687 
    688 void
    689 AcpiDmDumpLpit (
    690     ACPI_TABLE_HEADER       *Table)
    691 {
    692     ACPI_STATUS             Status;
    693     ACPI_LPIT_HEADER        *Subtable;
    694     UINT32                  Length = Table->Length;
    695     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
    696     ACPI_DMTABLE_INFO       *InfoTable;
    697     UINT32                  SubtableLength;
    698 
    699 
    700     /* Subtables */
    701 
    702     Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
    703     while (Offset < Table->Length)
    704     {
    705         /* Common subtable header */
    706 
    707         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    708             sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
    709         if (ACPI_FAILURE (Status))
    710         {
    711             return;
    712         }
    713 
    714         switch (Subtable->Type)
    715         {
    716         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
    717 
    718             InfoTable = AcpiDmTableInfoLpit0;
    719             SubtableLength = sizeof (ACPI_LPIT_NATIVE);
    720             break;
    721 
    722         default:
    723 
    724             /* Cannot continue on unknown type - no length */
    725 
    726             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
    727                 Subtable->Type);
    728             return;
    729         }
    730 
    731         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    732             SubtableLength, InfoTable);
    733         if (ACPI_FAILURE (Status))
    734         {
    735             return;
    736         }
    737 
    738         AcpiOsPrintf ("\n");
    739 
    740         /* Point to next subtable */
    741 
    742         Offset += SubtableLength;
    743         Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
    744     }
    745 }
    746 
    747 
    748 /*******************************************************************************
    749  *
    750  * FUNCTION:    AcpiDmDumpMadt
    751  *
    752  * PARAMETERS:  Table               - A MADT table
    753  *
    754  * RETURN:      None
    755  *
    756  * DESCRIPTION: Format the contents of a MADT. This table type consists
    757  *              of an open-ended number of subtables.
    758  *
    759  ******************************************************************************/
    760 
    761 void
    762 AcpiDmDumpMadt (
    763     ACPI_TABLE_HEADER       *Table)
    764 {
    765     ACPI_STATUS             Status;
    766     ACPI_SUBTABLE_HEADER    *Subtable;
    767     UINT32                  Length = Table->Length;
    768     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
    769     ACPI_DMTABLE_INFO       *InfoTable;
    770 
    771 
    772     /* Main table */
    773 
    774     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
    775     if (ACPI_FAILURE (Status))
    776     {
    777         return;
    778     }
    779 
    780     /* Subtables */
    781 
    782     Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
    783     DbgPrint (ASL_PARSE_OUTPUT, "//0B) Offset %X, from table start: 0x%8.8X%8.8X\n",
    784         Offset, ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));
    785     while (Offset < Table->Length)
    786     {
    787         /* Common subtable header */
    788 
    789         AcpiOsPrintf ("\n");
    790         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    791             Subtable->Length, AcpiDmTableInfoMadtHdr);
    792         if (ACPI_FAILURE (Status))
    793         {
    794             return;
    795         }
    796 
    797         DbgPrint (ASL_PARSE_OUTPUT, "subtableType: %X\n", Subtable->Type);
    798         switch (Subtable->Type)
    799         {
    800         case ACPI_MADT_TYPE_LOCAL_APIC:
    801 
    802             InfoTable = AcpiDmTableInfoMadt0;
    803             break;
    804 
    805         case ACPI_MADT_TYPE_IO_APIC:
    806 
    807             InfoTable = AcpiDmTableInfoMadt1;
    808             break;
    809 
    810         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    811 
    812             InfoTable = AcpiDmTableInfoMadt2;
    813             break;
    814 
    815         case ACPI_MADT_TYPE_NMI_SOURCE:
    816 
    817             InfoTable = AcpiDmTableInfoMadt3;
    818             break;
    819 
    820         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    821 
    822             InfoTable = AcpiDmTableInfoMadt4;
    823             break;
    824 
    825         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    826 
    827             InfoTable = AcpiDmTableInfoMadt5;
    828             break;
    829 
    830         case ACPI_MADT_TYPE_IO_SAPIC:
    831 
    832             InfoTable = AcpiDmTableInfoMadt6;
    833             break;
    834 
    835         case ACPI_MADT_TYPE_LOCAL_SAPIC:
    836 
    837             InfoTable = AcpiDmTableInfoMadt7;
    838             break;
    839 
    840         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    841 
    842             InfoTable = AcpiDmTableInfoMadt8;
    843             break;
    844 
    845         case ACPI_MADT_TYPE_LOCAL_X2APIC:
    846 
    847             InfoTable = AcpiDmTableInfoMadt9;
    848             break;
    849 
    850         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    851 
    852             InfoTable = AcpiDmTableInfoMadt10;
    853             break;
    854 
    855         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
    856 
    857             InfoTable = AcpiDmTableInfoMadt11;
    858             break;
    859 
    860         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
    861 
    862             InfoTable = AcpiDmTableInfoMadt12;
    863             break;
    864 
    865         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
    866 
    867             InfoTable = AcpiDmTableInfoMadt13;
    868             break;
    869 
    870         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
    871 
    872             InfoTable = AcpiDmTableInfoMadt14;
    873             break;
    874 
    875         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
    876 
    877             InfoTable = AcpiDmTableInfoMadt15;
    878             break;
    879 
    880         case ACPI_MADT_TYPE_MULTIPROC_WAKEUP:
    881 
    882             InfoTable = AcpiDmTableInfoMadt16;
    883             break;
    884 
    885         default:
    886 
    887             if ((Subtable->Type >= ACPI_MADT_TYPE_RESERVED) &&
    888                 (Subtable->Type < ACPI_MADT_TYPE_OEM_RESERVED))
    889             {
    890                 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
    891                     Subtable->Type);
    892                 goto NextSubtable;
    893             }
    894             else if (Subtable->Type >= ACPI_MADT_TYPE_OEM_RESERVED)
    895             {
    896                 DbgPrint (ASL_PARSE_OUTPUT, "//[Found an OEM structure, type = %0x]\n",
    897                     Subtable->Type);
    898                 Offset += sizeof (ACPI_SUBTABLE_HEADER);
    899                 DbgPrint (ASL_PARSE_OUTPUT, "//[0) Subtable->Length = %X, Subtable = %p, Offset = %X]\n",
    900                     Subtable->Length, Subtable, Offset);
    901                 DbgPrint (ASL_PARSE_OUTPUT, "//[0A) Offset from table start: 0x%8.8X%8.8X]\n",
    902                     ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)));
    903             }
    904 
    905             /* Attempt to continue */
    906 
    907             if (!Subtable->Length)
    908             {
    909                 AcpiOsPrintf ("Invalid zero length subtable\n");
    910                 return;
    911             }
    912 
    913             /* Dump the OEM data */
    914 
    915             Status = AcpiDmDumpTable (Length, Offset, ACPI_CAST_PTR (UINT8, Table) + Offset,
    916                 Subtable->Length - sizeof (ACPI_SUBTABLE_HEADER), AcpiDmTableInfoMadt17);
    917             if (ACPI_FAILURE (Status))
    918             {
    919                 return;
    920             }
    921 
    922             DbgPrint (ASL_PARSE_OUTPUT, "//[1) Subtable->Length = %X, Offset = %X]\n",
    923                 Subtable->Length, Offset);
    924             Offset -= sizeof (ACPI_SUBTABLE_HEADER);
    925 
    926             goto NextSubtable;
    927         }
    928 
    929         DbgPrint (ASL_PARSE_OUTPUT, "//[2) Subtable->Length = %X, Offset = %X]\n",
    930             Subtable->Length, Offset);
    931         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    932             Subtable->Length, InfoTable);
    933         if (ACPI_FAILURE (Status))
    934         {
    935             return;
    936         }
    937 
    938 NextSubtable:
    939         /* Point to next subtable */
    940 
    941         DbgPrint (ASL_PARSE_OUTPUT, "//[3) Subtable->Length = %X, Offset = %X]\n",
    942             Subtable->Length, Offset);
    943         DbgPrint (ASL_PARSE_OUTPUT, "//[4) Offset from table start: 0x%8.8X%8.8X (%p) %p]\n",
    944             ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (UINT8, Subtable) - ACPI_CAST_PTR (UINT8, Table)), Subtable, Table);
    945         if (Offset > Table->Length)
    946         {
    947             return;
    948         }
    949 
    950         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
    951             Subtable->Length);
    952 
    953         DbgPrint (ASL_PARSE_OUTPUT, "//[5) Next Subtable %p, length %X]\n",
    954             Subtable, Subtable->Length);
    955         DbgPrint (ASL_PARSE_OUTPUT, "//[5B) Offset from table start: 0x%8.8X%8.8X (%p)]\n",
    956             ACPI_FORMAT_UINT64 (ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table)), Subtable);
    957 
    958         Offset = ACPI_CAST_PTR (char, Subtable) - ACPI_CAST_PTR (char, Table);
    959         if (Offset >= Table->Length)
    960         {
    961             return;
    962         }
    963     }
    964 }
    965 
    966 
    967 /*******************************************************************************
    968  *
    969  * FUNCTION:    AcpiDmDumpMcfg
    970  *
    971  * PARAMETERS:  Table               - A MCFG Table
    972  *
    973  * RETURN:      None
    974  *
    975  * DESCRIPTION: Format the contents of a MCFG table
    976  *
    977  ******************************************************************************/
    978 
    979 void
    980 AcpiDmDumpMcfg (
    981     ACPI_TABLE_HEADER       *Table)
    982 {
    983     ACPI_STATUS             Status;
    984     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
    985     ACPI_MCFG_ALLOCATION    *Subtable;
    986 
    987 
    988     /* Main table */
    989 
    990     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
    991     if (ACPI_FAILURE (Status))
    992     {
    993         return;
    994     }
    995 
    996     /* Subtables */
    997 
    998     Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
    999     while (Offset < Table->Length)
   1000     {
   1001         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
   1002         {
   1003             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
   1004                 (UINT32) sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
   1005             return;
   1006         }
   1007 
   1008         AcpiOsPrintf ("\n");
   1009         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1010             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
   1011         if (ACPI_FAILURE (Status))
   1012         {
   1013             return;
   1014         }
   1015 
   1016         /* Point to next subtable (each subtable is of fixed length) */
   1017 
   1018         Offset += sizeof (ACPI_MCFG_ALLOCATION);
   1019         Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
   1020             sizeof (ACPI_MCFG_ALLOCATION));
   1021     }
   1022 }
   1023 
   1024 
   1025 /*******************************************************************************
   1026  *
   1027  * FUNCTION:    AcpiDmDumpMpst
   1028  *
   1029  * PARAMETERS:  Table               - A MPST Table
   1030  *
   1031  * RETURN:      None
   1032  *
   1033  * DESCRIPTION: Format the contents of a MPST table
   1034  *
   1035  ******************************************************************************/
   1036 
   1037 void
   1038 AcpiDmDumpMpst (
   1039     ACPI_TABLE_HEADER       *Table)
   1040 {
   1041     ACPI_STATUS             Status;
   1042     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
   1043     ACPI_MPST_POWER_NODE    *Subtable0;
   1044     ACPI_MPST_POWER_STATE   *Subtable0A;
   1045     ACPI_MPST_COMPONENT     *Subtable0B;
   1046     ACPI_MPST_DATA_HDR      *Subtable1;
   1047     ACPI_MPST_POWER_DATA    *Subtable2;
   1048     UINT16                  SubtableCount;
   1049     UINT32                  PowerStateCount;
   1050     UINT32                  ComponentCount;
   1051 
   1052 
   1053     /* Main table */
   1054 
   1055     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
   1056     if (ACPI_FAILURE (Status))
   1057     {
   1058         return;
   1059     }
   1060 
   1061     /* Subtable: Memory Power Node(s) */
   1062 
   1063     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
   1064     Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
   1065 
   1066     while ((Offset < Table->Length) && SubtableCount)
   1067     {
   1068         AcpiOsPrintf ("\n");
   1069         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
   1070             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
   1071         if (ACPI_FAILURE (Status))
   1072         {
   1073             return;
   1074         }
   1075 
   1076         /* Extract the sub-subtable counts */
   1077 
   1078         PowerStateCount = Subtable0->NumPowerStates;
   1079         ComponentCount = Subtable0->NumPhysicalComponents;
   1080         Offset += sizeof (ACPI_MPST_POWER_NODE);
   1081 
   1082         /* Sub-subtables - Memory Power State Structure(s) */
   1083 
   1084         Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
   1085             sizeof (ACPI_MPST_POWER_NODE));
   1086 
   1087         while (PowerStateCount)
   1088         {
   1089             AcpiOsPrintf ("\n");
   1090             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
   1091                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
   1092             if (ACPI_FAILURE (Status))
   1093             {
   1094                 return;
   1095             }
   1096 
   1097             Subtable0A++;
   1098             PowerStateCount--;
   1099             Offset += sizeof (ACPI_MPST_POWER_STATE);
   1100        }
   1101 
   1102         /* Sub-subtables - Physical Component ID Structure(s) */
   1103 
   1104         Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
   1105 
   1106         if (ComponentCount)
   1107         {
   1108             AcpiOsPrintf ("\n");
   1109         }
   1110 
   1111         while (ComponentCount)
   1112         {
   1113             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
   1114                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
   1115             if (ACPI_FAILURE (Status))
   1116             {
   1117                 return;
   1118             }
   1119 
   1120             Subtable0B++;
   1121             ComponentCount--;
   1122             Offset += sizeof (ACPI_MPST_COMPONENT);
   1123         }
   1124 
   1125         /* Point to next Memory Power Node subtable */
   1126 
   1127         SubtableCount--;
   1128         Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
   1129             sizeof (ACPI_MPST_POWER_NODE) +
   1130             (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
   1131             (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
   1132     }
   1133 
   1134     /* Subtable: Count of Memory Power State Characteristic structures */
   1135 
   1136     AcpiOsPrintf ("\n");
   1137     Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
   1138     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
   1139         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
   1140     if (ACPI_FAILURE (Status))
   1141     {
   1142         return;
   1143     }
   1144 
   1145     SubtableCount = Subtable1->CharacteristicsCount;
   1146     Offset += sizeof (ACPI_MPST_DATA_HDR);
   1147 
   1148     /* Subtable: Memory Power State Characteristics structure(s) */
   1149 
   1150     Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
   1151         sizeof (ACPI_MPST_DATA_HDR));
   1152 
   1153     while ((Offset < Table->Length) && SubtableCount)
   1154     {
   1155         AcpiOsPrintf ("\n");
   1156         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
   1157             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
   1158         if (ACPI_FAILURE (Status))
   1159         {
   1160             return;
   1161         }
   1162 
   1163         Subtable2++;
   1164         SubtableCount--;
   1165         Offset += sizeof (ACPI_MPST_POWER_DATA);
   1166     }
   1167 }
   1168 
   1169 
   1170 /*******************************************************************************
   1171  *
   1172  * FUNCTION:    AcpiDmDumpMsct
   1173  *
   1174  * PARAMETERS:  Table               - A MSCT table
   1175  *
   1176  * RETURN:      None
   1177  *
   1178  * DESCRIPTION: Format the contents of a MSCT
   1179  *
   1180  ******************************************************************************/
   1181 
   1182 void
   1183 AcpiDmDumpMsct (
   1184     ACPI_TABLE_HEADER       *Table)
   1185 {
   1186     ACPI_STATUS             Status;
   1187     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
   1188     ACPI_MSCT_PROXIMITY     *Subtable;
   1189 
   1190 
   1191     /* Main table */
   1192 
   1193     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
   1194     if (ACPI_FAILURE (Status))
   1195     {
   1196         return;
   1197     }
   1198 
   1199     /* Subtables */
   1200 
   1201     Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
   1202     while (Offset < Table->Length)
   1203     {
   1204         /* Common subtable header */
   1205 
   1206         AcpiOsPrintf ("\n");
   1207         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1208             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
   1209         if (ACPI_FAILURE (Status))
   1210         {
   1211             return;
   1212         }
   1213 
   1214         /* Point to next subtable */
   1215 
   1216         Offset += sizeof (ACPI_MSCT_PROXIMITY);
   1217         Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
   1218             sizeof (ACPI_MSCT_PROXIMITY));
   1219     }
   1220 }
   1221 
   1222 
   1223 /*******************************************************************************
   1224  *
   1225  * FUNCTION:    AcpiDmDumpNfit
   1226  *
   1227  * PARAMETERS:  Table               - A NFIT table
   1228  *
   1229  * RETURN:      None
   1230  *
   1231  * DESCRIPTION: Format the contents of an NFIT.
   1232  *
   1233  ******************************************************************************/
   1234 
   1235 void
   1236 AcpiDmDumpNfit (
   1237     ACPI_TABLE_HEADER       *Table)
   1238 {
   1239     ACPI_STATUS             Status;
   1240     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
   1241     UINT32                  FieldOffset = 0;
   1242     UINT32                  Length;
   1243     ACPI_NFIT_HEADER        *Subtable;
   1244     ACPI_DMTABLE_INFO       *InfoTable;
   1245     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
   1246     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
   1247     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
   1248     UINT32                  i;
   1249 
   1250 
   1251     /* Main table */
   1252 
   1253     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
   1254     if (ACPI_FAILURE (Status))
   1255     {
   1256         return;
   1257     }
   1258 
   1259     /* Subtables */
   1260 
   1261     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
   1262     while (Offset < Table->Length)
   1263     {
   1264         /* NFIT subtable header */
   1265 
   1266         AcpiOsPrintf ("\n");
   1267         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1268             Subtable->Length, AcpiDmTableInfoNfitHdr);
   1269         if (ACPI_FAILURE (Status))
   1270         {
   1271             return;
   1272         }
   1273 
   1274         switch (Subtable->Type)
   1275         {
   1276         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
   1277 
   1278             InfoTable = AcpiDmTableInfoNfit0;
   1279             break;
   1280 
   1281         case ACPI_NFIT_TYPE_MEMORY_MAP:
   1282 
   1283             InfoTable = AcpiDmTableInfoNfit1;
   1284             break;
   1285 
   1286         case ACPI_NFIT_TYPE_INTERLEAVE:
   1287 
   1288             /* Has a variable number of 32-bit values at the end */
   1289 
   1290             InfoTable = AcpiDmTableInfoNfit2;
   1291             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
   1292             break;
   1293 
   1294         case ACPI_NFIT_TYPE_SMBIOS:
   1295 
   1296             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
   1297             InfoTable = AcpiDmTableInfoNfit3;
   1298             break;
   1299 
   1300         case ACPI_NFIT_TYPE_CONTROL_REGION:
   1301 
   1302             InfoTable = AcpiDmTableInfoNfit4;
   1303             break;
   1304 
   1305         case ACPI_NFIT_TYPE_DATA_REGION:
   1306 
   1307             InfoTable = AcpiDmTableInfoNfit5;
   1308             break;
   1309 
   1310         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1311 
   1312             /* Has a variable number of 64-bit addresses at the end */
   1313 
   1314             InfoTable = AcpiDmTableInfoNfit6;
   1315             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
   1316             break;
   1317 
   1318         case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
   1319 
   1320             InfoTable = AcpiDmTableInfoNfit7;
   1321             break;
   1322 
   1323         default:
   1324             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
   1325                 Subtable->Type);
   1326 
   1327             /* Attempt to continue */
   1328 
   1329             if (!Subtable->Length)
   1330             {
   1331                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1332                 return;
   1333             }
   1334             goto NextSubtable;
   1335         }
   1336 
   1337         AcpiOsPrintf ("\n");
   1338         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1339             Subtable->Length, InfoTable);
   1340         if (ACPI_FAILURE (Status))
   1341         {
   1342             return;
   1343         }
   1344 
   1345         /* Per-subtable variable-length fields */
   1346 
   1347         switch (Subtable->Type)
   1348         {
   1349         case ACPI_NFIT_TYPE_INTERLEAVE:
   1350 
   1351             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
   1352             for (i = 0; i < Interleave->LineCount; i++)
   1353             {
   1354                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   1355                     &Interleave->LineOffset[i],
   1356                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
   1357                 if (ACPI_FAILURE (Status))
   1358                 {
   1359                     return;
   1360                 }
   1361 
   1362                 FieldOffset += sizeof (UINT32);
   1363             }
   1364             break;
   1365 
   1366         case ACPI_NFIT_TYPE_SMBIOS:
   1367 
   1368             Length = Subtable->Length -
   1369                 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
   1370 
   1371             if (Length)
   1372             {
   1373                 Status = AcpiDmDumpTable (Table->Length,
   1374                     sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
   1375                     SmbiosInfo,
   1376                     Length, AcpiDmTableInfoNfit3a);
   1377                 if (ACPI_FAILURE (Status))
   1378                 {
   1379                     return;
   1380                 }
   1381             }
   1382 
   1383             break;
   1384 
   1385         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   1386 
   1387             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
   1388             for (i = 0; i < Hint->HintCount; i++)
   1389             {
   1390                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   1391                     &Hint->HintAddress[i],
   1392                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
   1393                 if (ACPI_FAILURE (Status))
   1394                 {
   1395                     return;
   1396                 }
   1397 
   1398                 FieldOffset += sizeof (UINT64);
   1399             }
   1400             break;
   1401 
   1402         default:
   1403             break;
   1404         }
   1405 
   1406 NextSubtable:
   1407         /* Point to next subtable */
   1408 
   1409         Offset += Subtable->Length;
   1410         Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
   1411     }
   1412 }
   1413 
   1414 
   1415 /*******************************************************************************
   1416  *
   1417  * FUNCTION:    AcpiDmDumpNhlt
   1418  *
   1419  * PARAMETERS:  Table               - A NHLT table
   1420  *
   1421  * RETURN:      None
   1422  *
   1423  * DESCRIPTION: Format the contents of an NHLT.
   1424  *
   1425  ******************************************************************************/
   1426 
   1427 void
   1428 AcpiDmDumpNhlt (
   1429     ACPI_TABLE_HEADER       *Table)
   1430 {
   1431     ACPI_STATUS             Status;
   1432     UINT32                  Offset;
   1433     UINT32                  TableLength = Table->Length;
   1434     UINT32                  EndpointCount;
   1435     UINT8                   FormatsCount;
   1436     ACPI_NHLT_ENDPOINT      *Subtable;
   1437     ACPI_NHLT_FORMAT_CONFIG *FormatSubtable;
   1438     ACPI_TABLE_NHLT         *InfoTable;
   1439     UINT32                  CapabilitiesSize;
   1440     UINT32                  i;
   1441     UINT32                  j;
   1442     UINT32                  EndpointEndOffset;
   1443     UINT8                   ConfigType = 0;
   1444     UINT8                   ArrayType;
   1445     UINT8                   MicrophoneCount;
   1446     ACPI_NHLT_VENDOR_MIC_COUNT          *MicCount;
   1447     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A  *DevSpecific;
   1448     ACPI_NHLT_FORMATS_CONFIG            *FormatsConfig;
   1449     ACPI_NHLT_DEVICE_INFO_COUNT         *Count;
   1450     ACPI_NHLT_DEVICE_INFO               *DeviceInfo;
   1451     ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B  *Capabilities;
   1452 
   1453 
   1454     /* Main table */
   1455 
   1456     AcpiOsPrintf ("    /* Main table */\n");
   1457 
   1458     Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNhlt);
   1459     if (ACPI_FAILURE (Status))
   1460     {
   1461         return;
   1462     }
   1463 
   1464     /* Get the Endpoint Descriptor Count */
   1465 
   1466     InfoTable = ACPI_ADD_PTR (ACPI_TABLE_NHLT, Table, 0);
   1467     EndpointCount = InfoTable->EndpointCount;
   1468 
   1469     /* Subtables */
   1470 
   1471     Offset = sizeof (ACPI_TABLE_NHLT);
   1472 
   1473     while (Offset < TableLength)
   1474     {
   1475         /* A variable number of Endpoint Descriptors - process each */
   1476 
   1477         for (i = 0; i < EndpointCount; i++)
   1478         {
   1479             /* Do the Endpoint Descriptor table */
   1480 
   1481             Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1482 
   1483             /* Check for endpoint descriptor length beyond end-of-table */
   1484 
   1485             if (Subtable->DescriptorLength > TableLength)
   1486             {
   1487                 Offset += 1;
   1488                 AcpiOsPrintf ("\n    /* Endpoint Descriptor Length larger than"
   1489                     " table size: %X, table %X, adjusting table offset (+1) */\n",
   1490                     Subtable->DescriptorLength, TableLength);
   1491 
   1492                 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1493             }
   1494 
   1495             AcpiOsPrintf ("\n    /* Endpoint Descriptor #%u */\n", i+1);
   1496             Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
   1497                 Subtable->DescriptorLength, AcpiDmTableInfoNhlt0);
   1498             if (ACPI_FAILURE (Status))
   1499             {
   1500                 return;
   1501             }
   1502 
   1503             EndpointEndOffset = Subtable->DescriptorLength + Offset;
   1504 
   1505             /* Check for endpoint descriptor beyond end-of-table */
   1506 
   1507             if (Subtable->DescriptorLength > TableLength)
   1508             {
   1509                 AcpiOsPrintf ("\n    /* Endpoint Descriptor Length larger than table size: %X, table %X */\n",
   1510                     Subtable->DescriptorLength, TableLength);
   1511             }
   1512 
   1513             Offset += sizeof (ACPI_NHLT_ENDPOINT);
   1514             Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1515 
   1516             /* Do the Device Specific table */
   1517 
   1518             AcpiOsPrintf ("\n    /* Endpoint Device_Specific_Config table */\n");
   1519             DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
   1520             CapabilitiesSize = DevSpecific->CapabilitiesSize;
   1521             Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1522                 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
   1523             if (ACPI_FAILURE (Status))
   1524             {
   1525                 return;
   1526             }
   1527 
   1528             ArrayType = 0;
   1529 
   1530             /* Different subtables based upon capabilities_size */
   1531 
   1532             switch (CapabilitiesSize)
   1533             {
   1534             case 0:
   1535                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
   1536                 break;
   1537 
   1538             case 1:
   1539                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1540                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C), AcpiDmTableInfoNhlt5c);
   1541                 if (ACPI_FAILURE (Status))
   1542                 {
   1543                     return;
   1544                 }
   1545                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_C);
   1546                 break;
   1547 
   1548             case 2:
   1549                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1550                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
   1551                 if (ACPI_FAILURE (Status))
   1552                 {
   1553                     return;
   1554                 }
   1555                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
   1556                 break;
   1557 
   1558             case 3:
   1559             default:
   1560                 /* Extract the ConfigType and ArrayType */
   1561 
   1562                 ConfigType = DevSpecific->ConfigType;
   1563                 ArrayType = DevSpecific->ArrayType;
   1564 
   1565                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1566                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A), AcpiDmTableInfoNhlt5a);
   1567                 if (ACPI_FAILURE (Status))
   1568                 {
   1569                     return;
   1570                 }
   1571 
   1572                 /* Capabilities Size == 3 */
   1573                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A);
   1574                 break;
   1575 
   1576             case 7:
   1577                 ConfigType = DevSpecific->ConfigType;
   1578                 Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1579                 DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
   1580 
   1581                 AcpiOsPrintf ("\n    /* Render Feedback Device-Specific table */\n");
   1582                 Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1583                     sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt5);
   1584                 if (ACPI_FAILURE (Status))
   1585                 {
   1586                     return;
   1587                 }
   1588 
   1589                 /* Capabilities Size = 7 */
   1590                 Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG);
   1591 
   1592                 if (ConfigType == ACPI_NHLT_CONFIG_TYPE_RENDER_FEEDBACK)
   1593                 {
   1594                     Subtable = ACPI_ADD_PTR (ACPI_NHLT_ENDPOINT, Table, Offset);
   1595                     DevSpecific = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Subtable);
   1596 
   1597                     Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1598                         sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG), AcpiDmTableInfoNhlt6b);
   1599                     if (ACPI_FAILURE (Status))
   1600                     {
   1601                         return;
   1602                     }
   1603                     Offset += sizeof (ACPI_NHLT_RENDER_FEEDBACK_DEVICE_SPECIFIC_CONFIG);
   1604                 }
   1605                 break;
   1606            }
   1607 
   1608             /* Check for a vendor-defined mic array */
   1609 
   1610             if (ConfigType == ACPI_NHLT_CONFIG_TYPE_MIC_ARRAY)
   1611             {
   1612                 if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_MASK) == ACPI_NHLT_VENDOR_DEFINED)
   1613                 {
   1614                     /* Vendor-defined microphone array; get the microphone count first */
   1615 
   1616                     AcpiOsPrintf ("\n    /* Vendor-defined microphone count */\n");
   1617                     MicCount = ACPI_ADD_PTR (ACPI_NHLT_VENDOR_MIC_COUNT, Table, Offset);
   1618                     MicrophoneCount = MicCount->MicrophoneCount;
   1619 
   1620                     Status = AcpiDmDumpTable (TableLength, Offset, MicCount,
   1621                         sizeof (ACPI_NHLT_VENDOR_MIC_COUNT), AcpiDmTableInfoNhlt6a);
   1622                     Offset += sizeof (ACPI_NHLT_VENDOR_MIC_COUNT);
   1623                     if (ACPI_FAILURE (Status))
   1624                     {
   1625                         return;
   1626                     }
   1627 
   1628                     /* Get the vendor microphone config structure(s) */
   1629 
   1630                     for (j = 0; j < MicrophoneCount; j++)
   1631                     {
   1632                         AcpiOsPrintf ("\n    /* Vendor-defined microphone array #%u*/\n", j+1);
   1633                         DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
   1634 
   1635                         Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1636                             sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG), AcpiDmTableInfoNhlt6);
   1637                         if (ACPI_FAILURE (Status))
   1638                         {
   1639                             return;
   1640                         }
   1641 
   1642                         Offset += sizeof (ACPI_NHLT_VENDOR_MIC_CONFIG);
   1643                     }
   1644 
   1645                     /* Check for Microphone SNR and sensitivity extension */
   1646 
   1647                     if ((ArrayType & ACPI_NHLT_ARRAY_TYPE_EXT_MASK) == ACPI_NHLT_MIC_SNR_SENSITIVITY_EXT)
   1648                     {
   1649                         AcpiOsPrintf ("\n    /* Microphone SNR and sensitivity array */\n");
   1650                         DevSpecific = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_A, Table, Offset);
   1651 
   1652                         Status = AcpiDmDumpTable (TableLength, Offset, DevSpecific,
   1653                             sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION), AcpiDmTableInfoNhlt9);
   1654                         if (ACPI_FAILURE (Status))
   1655                         {
   1656                             return;
   1657                         }
   1658 
   1659                         Offset += sizeof (ACPI_NHLT_MIC_SNR_SENSITIVITY_EXTENSION);
   1660                     }
   1661                 }
   1662             }
   1663 
   1664             /* Do the Formats_Config table - starts with the FormatsCount field */
   1665 
   1666             FormatsConfig = ACPI_ADD_PTR (ACPI_NHLT_FORMATS_CONFIG, Table, Offset);
   1667             FormatsCount = FormatsConfig->FormatsCount;
   1668 
   1669             AcpiOsPrintf ("\n    /* Formats_Config table */\n");
   1670 
   1671             /* Dump the FormatsCount value */
   1672 
   1673             if (FormatsCount > 0)
   1674             {
   1675                 Status = AcpiDmDumpTable (TableLength, Offset, FormatsConfig,
   1676                     sizeof (ACPI_NHLT_FORMATS_CONFIG), AcpiDmTableInfoNhlt4);
   1677                 if (ACPI_FAILURE (Status))
   1678                 {
   1679                     return;
   1680                 }
   1681             }
   1682             Offset += sizeof (ACPI_NHLT_FORMATS_CONFIG);
   1683 
   1684             /* A variable number of Format_Config Descriptors - process each */
   1685 
   1686             for (j = 0; j < FormatsCount; j++)
   1687             {
   1688                 FormatSubtable = ACPI_ADD_PTR (ACPI_NHLT_FORMAT_CONFIG, Table, Offset);
   1689                 CapabilitiesSize = FormatSubtable->CapabilitySize;
   1690 
   1691                 /* Do the Wave_extensible struct */
   1692 
   1693                 AcpiOsPrintf ("\n    /* Wave_Format_Extensible table #%u */\n", j+1);
   1694                 Status = AcpiDmDumpTable (TableLength, Offset, FormatSubtable,
   1695                     sizeof (ACPI_NHLT_FORMAT_CONFIG), AcpiDmTableInfoNhlt3);
   1696                 if (ACPI_FAILURE (Status))
   1697                 {
   1698                     return;
   1699                 }
   1700 
   1701                 Offset += sizeof (ACPI_NHLT_FORMAT_CONFIG);
   1702 
   1703                 if (CapabilitiesSize > 0)
   1704                 {
   1705                     UINT8* CapabilitiesBuf = ACPI_ADD_PTR (UINT8, Table, Offset);
   1706                     /* Do the Capabilities array (of bytes) */
   1707 
   1708                     AcpiOsPrintf ("\n    /* Specific_Config table #%u */\n", j+1);
   1709 
   1710                     Status = AcpiDmDumpTable (TableLength, Offset, CapabilitiesBuf,
   1711                         CapabilitiesSize, AcpiDmTableInfoNhlt3a);
   1712                     if (ACPI_FAILURE (Status))
   1713                     {
   1714                         return;
   1715                     }
   1716 
   1717                     Offset += CapabilitiesSize; /* + sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B); */
   1718                 }
   1719 
   1720             } /* for (j = 0; j < FormatsCount; j++) */
   1721 
   1722             /*
   1723              * If we are not done with the current Endpoint yet, then there must be
   1724              * some non documented structure(s) yet to be processed. First, get
   1725              * the count of such structure(s).
   1726              */
   1727             if (Offset < EndpointEndOffset)
   1728             {
   1729                 AcpiOsPrintf ("\n    /* Structures that are not part of NHLT spec */\n");
   1730                 Count = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_INFO_COUNT, Table, Offset);
   1731                 Status = AcpiDmDumpTable (TableLength, Offset, Count,
   1732                     sizeof (ACPI_NHLT_DEVICE_INFO_COUNT), AcpiDmTableInfoNhlt7);
   1733                 if (ACPI_FAILURE (Status))
   1734                 {
   1735                     return;
   1736                 }
   1737                 Offset += sizeof (ACPI_NHLT_DEVICE_INFO_COUNT);
   1738 
   1739                 /* Variable number of device structures */
   1740 
   1741                 for (j = 0; j < Count->StructureCount; j++)
   1742                 {
   1743                     DeviceInfo = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_INFO, Table, Offset);
   1744                     AcpiOsPrintf ("\n    /* Device Info structure #%u (not part of NHLT spec) */\n", j+1);
   1745 
   1746                     /*
   1747                      * Dump the following Device Info fields:
   1748                      *  1) Device ID
   1749                      *  2) Device Instance ID
   1750                      *  3) Device Port ID
   1751                      */
   1752                     Status = AcpiDmDumpTable (TableLength, Offset, DeviceInfo,
   1753                         sizeof (ACPI_NHLT_DEVICE_INFO), AcpiDmTableInfoNhlt7a);
   1754                     if (ACPI_FAILURE (Status))
   1755                     {
   1756                         return;
   1757                     }
   1758 
   1759                     Offset += sizeof (ACPI_NHLT_DEVICE_INFO);
   1760                 }
   1761 
   1762                 /*
   1763                  * Check that the current offset is not beyond the end of
   1764                  * this endpoint descriptor. If it is not, print those
   1765                  * undocumented bytes.
   1766                  */
   1767                 if (Offset < EndpointEndOffset)
   1768                 {
   1769                     /* Unknown data at the end of the Endpoint */
   1770                     UINT32 size = EndpointEndOffset - Offset;
   1771                     UINT8* buffer = ACPI_ADD_PTR (UINT8, Table, Offset);
   1772                     AcpiOsPrintf ("\n    /* Unknown data at the end of the Endpoint, size: %X */\n", size);
   1773                     Status = AcpiDmDumpTable (TableLength, Offset, buffer,
   1774                         size, AcpiDmTableInfoNhlt7b);
   1775                     Offset = EndpointEndOffset;
   1776                 }
   1777 
   1778                 /* Should be at the end of the Endpoint structure. */
   1779             }
   1780 
   1781         } /* for (i = 0; i < EndpointCount; i++) */
   1782 
   1783 
   1784         /*
   1785          * Done with all of the Endpoint Descriptors, Emit the table terminator
   1786          * (if such a legacy structure is present -- not in NHLT specification)
   1787          */
   1788         if (Offset < TableLength)
   1789         {
   1790             Capabilities = ACPI_ADD_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B, Table, Offset);
   1791             AcpiOsPrintf ("\n/* Terminating specific config (not part of NHLT spec) */\n");
   1792 
   1793             Status = AcpiDmDumpTable (TableLength, Offset, Capabilities,
   1794                 sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B), AcpiDmTableInfoNhlt5b);
   1795             if (ACPI_FAILURE (Status))
   1796             {
   1797                 return;
   1798             }
   1799             Offset += sizeof (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B);
   1800 
   1801             if (Capabilities->CapabilitiesSize > 0)
   1802             {
   1803                 UINT32 remainingBytes = TableLength - Offset;
   1804                 UINT8* buffer = ACPI_ADD_PTR (UINT8, Table, Offset);
   1805 
   1806                 if (remainingBytes != Capabilities->CapabilitiesSize)
   1807                     AcpiOsPrintf ("\n/* Incorrect config size, should be %X, is %X */\n",
   1808                         Capabilities->CapabilitiesSize, remainingBytes);
   1809                 Status = AcpiDmDumpTable (TableLength, Offset, buffer,
   1810                         remainingBytes, AcpiDmTableInfoNhlt3a);
   1811             }
   1812         }
   1813 
   1814         return;
   1815     }
   1816 }
   1817 
   1818 
   1819 /*******************************************************************************
   1820  *
   1821  * FUNCTION:    AcpiDmDumpPcct
   1822  *
   1823  * PARAMETERS:  Table               - A PCCT table
   1824  *
   1825  * RETURN:      None
   1826  *
   1827  * DESCRIPTION: Format the contents of a PCCT. This table type consists
   1828  *              of an open-ended number of subtables.
   1829  *
   1830  ******************************************************************************/
   1831 
   1832 void
   1833 AcpiDmDumpPcct (
   1834     ACPI_TABLE_HEADER       *Table)
   1835 {
   1836     ACPI_STATUS             Status;
   1837     ACPI_PCCT_SUBSPACE      *Subtable;
   1838     ACPI_DMTABLE_INFO       *InfoTable;
   1839     UINT32                  Length = Table->Length;
   1840     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
   1841 
   1842 
   1843     /* Main table */
   1844 
   1845     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
   1846     if (ACPI_FAILURE (Status))
   1847     {
   1848         return;
   1849     }
   1850 
   1851     /* Subtables */
   1852 
   1853     Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
   1854     while (Offset < Table->Length)
   1855     {
   1856         /* Common subtable header */
   1857 
   1858         AcpiOsPrintf ("\n");
   1859         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1860             Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
   1861         if (ACPI_FAILURE (Status))
   1862         {
   1863             return;
   1864         }
   1865 
   1866         switch (Subtable->Header.Type)
   1867         {
   1868         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   1869 
   1870             InfoTable = AcpiDmTableInfoPcct0;
   1871             break;
   1872 
   1873         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   1874 
   1875             InfoTable = AcpiDmTableInfoPcct1;
   1876             break;
   1877 
   1878         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   1879 
   1880             InfoTable = AcpiDmTableInfoPcct2;
   1881             break;
   1882 
   1883         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   1884 
   1885             InfoTable = AcpiDmTableInfoPcct3;
   1886             break;
   1887 
   1888         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   1889 
   1890             InfoTable = AcpiDmTableInfoPcct4;
   1891             break;
   1892 
   1893         case ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE:
   1894 
   1895             InfoTable = AcpiDmTableInfoPcct5;
   1896             break;
   1897 
   1898         default:
   1899 
   1900             AcpiOsPrintf (
   1901                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
   1902                 Subtable->Header.Type);
   1903             return;
   1904         }
   1905 
   1906         AcpiOsPrintf ("\n");
   1907         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1908             Subtable->Header.Length, InfoTable);
   1909         if (ACPI_FAILURE (Status))
   1910         {
   1911             return;
   1912         }
   1913 
   1914         /* Point to next subtable */
   1915 
   1916         Offset += Subtable->Header.Length;
   1917         Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
   1918             Subtable->Header.Length);
   1919     }
   1920 }
   1921 
   1922 
   1923 /*******************************************************************************
   1924  *
   1925  * FUNCTION:    AcpiDmDumpPdtt
   1926  *
   1927  * PARAMETERS:  Table               - A PDTT table
   1928  *
   1929  * RETURN:      None
   1930  *
   1931  * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
   1932  *              table that contains an open-ended number of IDs
   1933  *              at the end of the table.
   1934  *
   1935  ******************************************************************************/
   1936 
   1937 void
   1938 AcpiDmDumpPdtt (
   1939     ACPI_TABLE_HEADER       *Table)
   1940 {
   1941     ACPI_STATUS             Status;
   1942     ACPI_PDTT_CHANNEL       *Subtable;
   1943     UINT32                  Length = Table->Length;
   1944     UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
   1945 
   1946 
   1947     /* Main table */
   1948 
   1949     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
   1950     if (ACPI_FAILURE (Status))
   1951     {
   1952         return;
   1953     }
   1954 
   1955     /* Subtables. Currently there is only one type, but can be multiples */
   1956 
   1957     Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
   1958     while (Offset < Table->Length)
   1959     {
   1960         AcpiOsPrintf ("\n");
   1961         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1962             sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
   1963         if (ACPI_FAILURE (Status))
   1964         {
   1965             return;
   1966         }
   1967 
   1968         /* Point to next subtable */
   1969 
   1970         Offset += sizeof (ACPI_PDTT_CHANNEL);
   1971         Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
   1972             sizeof (ACPI_PDTT_CHANNEL));
   1973     }
   1974 }
   1975 
   1976 
   1977 /*******************************************************************************
   1978  *
   1979  * FUNCTION:    AcpiDmDumpPhat
   1980  *
   1981  * PARAMETERS:  Table               - A PHAT table
   1982  *
   1983  * RETURN:      None
   1984  *
   1985  * DESCRIPTION: Format the contents of a PHAT.
   1986  *
   1987  ******************************************************************************/
   1988 
   1989 void
   1990 AcpiDmDumpPhat (
   1991     ACPI_TABLE_HEADER       *Table)
   1992 {
   1993     ACPI_STATUS             Status;
   1994     ACPI_DMTABLE_INFO       *InfoTable;
   1995     ACPI_PHAT_HEADER        *Subtable;
   1996     ACPI_PHAT_VERSION_DATA  *VersionData;
   1997     UINT32                  RecordCount;
   1998     UINT32                  Length = Table->Length;
   1999     UINT32                  Offset = sizeof (ACPI_TABLE_PHAT);
   2000     UINT32                  OriginalOffset;
   2001     UINT32                  SubtableLength;
   2002     UINT32                  PathLength;
   2003     UINT32                  VendorLength;
   2004     UINT16                  RecordType;
   2005     const wchar_t           *WideString;
   2006 
   2007 
   2008     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT));
   2009 
   2010     while (Offset < Table->Length)
   2011     {
   2012         /* Common subtable header */
   2013 
   2014         AcpiOsPrintf ("\n");
   2015         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2016             sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr);
   2017         if (ACPI_FAILURE (Status))
   2018         {
   2019             return;
   2020         }
   2021 
   2022         DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n",
   2023             __LINE__, Subtable->Type);
   2024 
   2025         switch (Subtable->Type)
   2026         {
   2027         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   2028 
   2029             InfoTable = AcpiDmTableInfoPhat0;
   2030             SubtableLength = Offset += sizeof (ACPI_PHAT_VERSION_DATA);
   2031             break;
   2032 
   2033         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   2034 
   2035             InfoTable = AcpiDmTableInfoPhat1;
   2036             SubtableLength = Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA);
   2037             break;
   2038 
   2039         default:
   2040 
   2041             DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n",
   2042                 Subtable->Type);
   2043 
   2044             return;
   2045         }
   2046 
   2047         Status = AcpiDmDumpTable (Length, SubtableLength, Subtable,
   2048             SubtableLength, InfoTable);
   2049         if (ACPI_FAILURE (Status))
   2050         {
   2051             return;
   2052         }
   2053 
   2054         OriginalOffset = Offset;
   2055         switch (Subtable->Type)
   2056         {
   2057         case ACPI_PHAT_TYPE_FW_VERSION_DATA:
   2058 
   2059             VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable);
   2060             RecordCount = VersionData->ElementCount;
   2061             RecordType = *ACPI_CAST_PTR (UINT8, Subtable);
   2062 
   2063             /*
   2064              * Skip past a zero-valued block (not part of the ACPI PHAT specification).
   2065              * First, check for a zero length record and a zero element count
   2066              */
   2067             if (!VersionData->Header.Length && !VersionData->ElementCount)
   2068             {
   2069                 while (RecordType == 0)
   2070                 {
   2071                     Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);
   2072                     RecordType = *ACPI_CAST_PTR (UINT8, Subtable);
   2073                     RecordCount = VersionData->ElementCount;
   2074                     Offset += 1;
   2075                 }
   2076 
   2077                 Offset -= 1;
   2078                 AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n"
   2079                     "/* (not compliant to PHAT specification -- ignoring block) */\n",
   2080                     OriginalOffset - 12, Offset - OriginalOffset + 12);
   2081             }
   2082 
   2083             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n",
   2084                 __LINE__, RecordCount, Offset, SubtableLength);
   2085 
   2086             /* Emit each of the version elements */
   2087 
   2088             while (RecordCount && VersionData->Header.Length)
   2089             {
   2090                 AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n",
   2091                     VersionData->ElementCount - RecordCount + 1, Offset);
   2092 
   2093                 Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset);
   2094                 Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2095                     sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a);
   2096                 if (ACPI_FAILURE (Status))
   2097                 {
   2098                     return;
   2099                 }
   2100 
   2101                 Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT);
   2102                 RecordCount--;
   2103             }
   2104 
   2105             break;
   2106 
   2107         case ACPI_PHAT_TYPE_FW_HEALTH_DATA:
   2108 
   2109             /*
   2110              * Get the length of the Device Path (UEFI wide string).
   2111              * Include the wide null terminator (+2),
   2112              */
   2113             WideString = ACPI_ADD_PTR (wchar_t, Subtable,
   2114                 sizeof (ACPI_PHAT_HEALTH_DATA));
   2115 
   2116             PathLength = (wcslen (WideString) * 2) + 2;
   2117             DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X, Table->Length %X */\n",
   2118                 __LINE__, PathLength, Offset, Length);
   2119 
   2120             Status = AcpiDmDumpTable (Length, Offset,
   2121                 ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)),
   2122                 PathLength, AcpiDmTableInfoPhat1a);
   2123             Offset += PathLength;
   2124             if (ACPI_FAILURE (Status))
   2125             {
   2126                 return;
   2127             }
   2128 
   2129             /* Get Device-Specific Data - length of which is the remaining subtable length. */
   2130 
   2131             VendorLength =
   2132                 Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength;
   2133             DbgPrint (ASL_DEBUG_OUTPUT, "%u, Subtable->Length %X, VendorLength %X, Offset %X PathLength: %X\n",
   2134                 __LINE__, Subtable->Length, VendorLength, Offset, PathLength);
   2135 
   2136             if (VendorLength)
   2137             {
   2138                 /* Point past the Device Path, Compile the Device-Specific Data */
   2139 
   2140                 Status = AcpiDmDumpTable (Length, Offset,
   2141                     ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength),
   2142                     VendorLength, AcpiDmTableInfoPhat1b);
   2143                 if (ACPI_FAILURE (Status))
   2144                 {
   2145                     return;
   2146                 }
   2147 
   2148                 Offset += VendorLength;
   2149             }
   2150 
   2151             if (ACPI_FAILURE (Status))
   2152             {
   2153                 return;
   2154             }
   2155             break;
   2156 
   2157         default:
   2158 
   2159             AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n",
   2160                 Subtable->Type);
   2161             return;
   2162         }
   2163 
   2164         /* Next subtable */
   2165 
   2166         DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, "
   2167             "Subtable->Length %X, Table->Length %X */\n",
   2168             __LINE__, Offset, Subtable->Length, Table->Length);
   2169 
   2170         Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table,
   2171             Offset);
   2172     }
   2173 }
   2174 
   2175 
   2176 /*******************************************************************************
   2177  *
   2178  * FUNCTION:    AcpiDmDumpPmtt
   2179  *
   2180  * PARAMETERS:  Table               - A PMTT table
   2181  *
   2182  * RETURN:      None
   2183  *
   2184  * DESCRIPTION: Format the contents of a PMTT. This table type consists
   2185  *              of an open-ended number of subtables.
   2186  *
   2187  ******************************************************************************/
   2188 
   2189 void
   2190 AcpiDmDumpPmtt (
   2191     ACPI_TABLE_HEADER       *Table)
   2192 {
   2193     ACPI_STATUS             Status;
   2194     ACPI_PMTT_HEADER        *Subtable;
   2195     UINT32                  Length = Table->Length;
   2196     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
   2197 
   2198 
   2199     /* Main table */
   2200 
   2201     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
   2202     if (ACPI_FAILURE (Status))
   2203     {
   2204         return;
   2205     }
   2206 
   2207     /* Subtables */
   2208 
   2209     Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
   2210     while (Offset < Table->Length)
   2211     {
   2212         /* Each of the types below contain the common subtable header */
   2213 
   2214         AcpiOsPrintf ("\n");
   2215         switch (Subtable->Type)
   2216         {
   2217         case ACPI_PMTT_TYPE_SOCKET:
   2218 
   2219             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2220                 Subtable->Length, AcpiDmTableInfoPmtt0);
   2221             if (ACPI_FAILURE (Status))
   2222             {
   2223                 return;
   2224             }
   2225             break;
   2226 
   2227         case ACPI_PMTT_TYPE_CONTROLLER:
   2228             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2229                 Subtable->Length, AcpiDmTableInfoPmtt1);
   2230             if (ACPI_FAILURE (Status))
   2231             {
   2232                 return;
   2233             }
   2234             break;
   2235 
   2236        case ACPI_PMTT_TYPE_DIMM:
   2237             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2238                 Subtable->Length, AcpiDmTableInfoPmtt2);
   2239             if (ACPI_FAILURE (Status))
   2240             {
   2241                 return;
   2242             }
   2243             break;
   2244 
   2245         case ACPI_PMTT_TYPE_VENDOR:
   2246             Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2247                 Subtable->Length, AcpiDmTableInfoPmttVendor);
   2248             if (ACPI_FAILURE (Status))
   2249             {
   2250                 return;
   2251             }
   2252             break;
   2253 
   2254         default:
   2255             AcpiOsPrintf (
   2256                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
   2257                 Subtable->Type);
   2258             return;
   2259         }
   2260 
   2261         /* Point to next subtable */
   2262 
   2263         Offset += Subtable->Length;
   2264         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
   2265             Subtable, Subtable->Length);
   2266     }
   2267 }
   2268 
   2269 
   2270 /*******************************************************************************
   2271  *
   2272  * FUNCTION:    AcpiDmDumpPptt
   2273  *
   2274  * PARAMETERS:  Table               - A PMTT table
   2275  *
   2276  * RETURN:      None
   2277  *
   2278  * DESCRIPTION: Format the contents of a PPTT. This table type consists
   2279  *              of an open-ended number of subtables.
   2280  *
   2281  ******************************************************************************/
   2282 
   2283 void
   2284 AcpiDmDumpPptt (
   2285     ACPI_TABLE_HEADER       *Table)
   2286 {
   2287     ACPI_STATUS             Status;
   2288     ACPI_SUBTABLE_HEADER    *Subtable;
   2289     ACPI_PPTT_PROCESSOR     *PpttProcessor;
   2290     UINT8                   Length;
   2291     UINT8                   SubtableOffset;
   2292     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   2293     ACPI_DMTABLE_INFO       *InfoTable;
   2294     UINT32                  i;
   2295 
   2296 
   2297     /* There is no main table (other than the standard ACPI header) */
   2298 
   2299     /* Subtables */
   2300 
   2301     Offset = sizeof (ACPI_TABLE_HEADER);
   2302     while (Offset < Table->Length)
   2303     {
   2304         AcpiOsPrintf ("\n");
   2305 
   2306         /* Common subtable header */
   2307 
   2308         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
   2309         if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
   2310         {
   2311             AcpiOsPrintf ("Invalid subtable length\n");
   2312             return;
   2313         }
   2314         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2315             Subtable->Length, AcpiDmTableInfoPpttHdr);
   2316         if (ACPI_FAILURE (Status))
   2317         {
   2318             return;
   2319         }
   2320 
   2321         switch (Subtable->Type)
   2322         {
   2323         case ACPI_PPTT_TYPE_PROCESSOR:
   2324 
   2325             InfoTable = AcpiDmTableInfoPptt0;
   2326             Length = sizeof (ACPI_PPTT_PROCESSOR);
   2327             break;
   2328 
   2329         case ACPI_PPTT_TYPE_CACHE:
   2330 
   2331             InfoTable = AcpiDmTableInfoPptt1;
   2332             Length = sizeof (ACPI_PPTT_CACHE);
   2333             break;
   2334 
   2335         case ACPI_PPTT_TYPE_ID:
   2336 
   2337             InfoTable = AcpiDmTableInfoPptt2;
   2338             Length = sizeof (ACPI_PPTT_ID);
   2339             break;
   2340 
   2341         default:
   2342 
   2343             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
   2344                 Subtable->Type);
   2345 
   2346             /* Attempt to continue */
   2347 
   2348             goto NextSubtable;
   2349         }
   2350 
   2351         if (Subtable->Length < Length)
   2352         {
   2353             AcpiOsPrintf ("Invalid subtable length\n");
   2354             return;
   2355         }
   2356         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2357             Subtable->Length, InfoTable);
   2358         if (ACPI_FAILURE (Status))
   2359         {
   2360             return;
   2361         }
   2362         SubtableOffset = Length;
   2363 
   2364         switch (Subtable->Type)
   2365         {
   2366         case ACPI_PPTT_TYPE_PROCESSOR:
   2367 
   2368             PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
   2369 
   2370             /* Dump SMBIOS handles */
   2371 
   2372             if ((UINT8)(Subtable->Length - SubtableOffset) <
   2373                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
   2374             {
   2375                 AcpiOsPrintf ("Invalid private resource number\n");
   2376                 return;
   2377             }
   2378             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
   2379             {
   2380                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2381                     ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
   2382                     4, AcpiDmTableInfoPptt0a);
   2383                 if (ACPI_FAILURE (Status))
   2384                 {
   2385                     return;
   2386                 }
   2387 
   2388                 SubtableOffset += 4;
   2389             }
   2390             break;
   2391 
   2392         case ACPI_PPTT_TYPE_CACHE:
   2393 
   2394             if (Table->Revision < 3)
   2395             {
   2396                 break;
   2397             }
   2398             Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2399                 ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
   2400                 sizeof (ACPI_PPTT_CACHE_V1), AcpiDmTableInfoPptt1a);
   2401             if (ACPI_FAILURE (Status))
   2402             {
   2403                 return;
   2404             }
   2405             break;
   2406 
   2407         default:
   2408 
   2409             break;
   2410         }
   2411 
   2412 NextSubtable:
   2413         /* Point to next subtable */
   2414 
   2415         Offset += Subtable->Length;
   2416     }
   2417 }
   2418 
   2419 
   2420 /*******************************************************************************
   2421  *
   2422  * FUNCTION:    AcpiDmDumpPrmt
   2423  *
   2424  * PARAMETERS:  Table               - A PRMT table
   2425  *
   2426  * RETURN:      None
   2427  *
   2428  * DESCRIPTION: Format the contents of a PRMT. This table type consists
   2429  *              of an open-ended number of subtables.
   2430  *
   2431  ******************************************************************************/
   2432 
   2433 void
   2434 AcpiDmDumpPrmt (
   2435     ACPI_TABLE_HEADER       *Table)
   2436 {
   2437     UINT32                  CurrentOffset = sizeof (ACPI_TABLE_HEADER);
   2438     ACPI_TABLE_PRMT_HEADER  *PrmtHeader;
   2439     ACPI_PRMT_MODULE_INFO   *PrmtModuleInfo;
   2440     ACPI_PRMT_HANDLER_INFO  *PrmtHandlerInfo;
   2441     ACPI_STATUS             Status;
   2442     UINT32                  i, j;
   2443 
   2444 
   2445     /* Main table header */
   2446 
   2447     PrmtHeader = ACPI_ADD_PTR (ACPI_TABLE_PRMT_HEADER, Table, CurrentOffset);
   2448     Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHeader,
   2449         sizeof (ACPI_TABLE_PRMT_HEADER), AcpiDmTableInfoPrmtHdr);
   2450     if (ACPI_FAILURE (Status))
   2451     {
   2452         AcpiOsPrintf ("Invalid PRMT header\n");
   2453         return;
   2454     }
   2455 
   2456     CurrentOffset += sizeof (ACPI_TABLE_PRMT_HEADER);
   2457 
   2458     /* PRM Module Information Structure array */
   2459 
   2460     for (i = 0; i < PrmtHeader->ModuleInfoCount; ++i)
   2461     {
   2462         PrmtModuleInfo = ACPI_ADD_PTR (ACPI_PRMT_MODULE_INFO, Table, CurrentOffset);
   2463         Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtModuleInfo,
   2464             sizeof (ACPI_PRMT_MODULE_INFO), AcpiDmTableInfoPrmtModule);
   2465 
   2466         CurrentOffset += sizeof (ACPI_PRMT_MODULE_INFO);
   2467 
   2468         /* PRM handler information structure array */
   2469 
   2470         for (j = 0; j < PrmtModuleInfo->HandlerInfoCount; ++j)
   2471         {
   2472             PrmtHandlerInfo = ACPI_ADD_PTR (ACPI_PRMT_HANDLER_INFO, Table, CurrentOffset);
   2473             Status = AcpiDmDumpTable (Table->Length, CurrentOffset, PrmtHandlerInfo,
   2474                 sizeof (ACPI_PRMT_HANDLER_INFO), AcpiDmTableInfoPrmtHandler);
   2475 
   2476             CurrentOffset += sizeof (ACPI_PRMT_HANDLER_INFO);
   2477         }
   2478     }
   2479 }
   2480 
   2481 
   2482 /*******************************************************************************
   2483  *
   2484  * FUNCTION:    AcpiDmDumpRgrt
   2485  *
   2486  * PARAMETERS:  Table               - A RGRT table
   2487  *
   2488  * RETURN:      None
   2489  *
   2490  * DESCRIPTION: Format the contents of a RGRT
   2491  *
   2492  ******************************************************************************/
   2493 
   2494 void
   2495 AcpiDmDumpRgrt (
   2496     ACPI_TABLE_HEADER       *Table)
   2497 {
   2498     ACPI_STATUS             Status;
   2499     ACPI_TABLE_RGRT         *Subtable = ACPI_CAST_PTR (ACPI_TABLE_RGRT, Table);
   2500     UINT32                  Offset = sizeof (ACPI_TABLE_RGRT);
   2501 
   2502 
   2503     /* Main table */
   2504 
   2505     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoRgrt);
   2506     if (ACPI_FAILURE (Status))
   2507     {
   2508         return;
   2509     }
   2510 
   2511     /* Dump the binary image as a subtable */
   2512 
   2513     Status = AcpiDmDumpTable (Table->Length, Offset, &Subtable->Image,
   2514         Table->Length - Offset, AcpiDmTableInfoRgrt0);
   2515     if (ACPI_FAILURE (Status))
   2516     {
   2517         return;
   2518     }
   2519 }
   2520 
   2521 
   2522 /*******************************************************************************
   2523  *
   2524  * FUNCTION:    AcpiDmDumpS3pt
   2525  *
   2526  * PARAMETERS:  Table               - A S3PT table
   2527  *
   2528  * RETURN:      Length of the table
   2529  *
   2530  * DESCRIPTION: Format the contents of a S3PT
   2531  *
   2532  ******************************************************************************/
   2533 
   2534 UINT32
   2535 AcpiDmDumpS3pt (
   2536     ACPI_TABLE_HEADER       *Tables)
   2537 {
   2538     ACPI_STATUS             Status;
   2539     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
   2540     ACPI_FPDT_HEADER        *Subtable;
   2541     ACPI_DMTABLE_INFO       *InfoTable;
   2542     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
   2543 
   2544 
   2545     /* Main table */
   2546 
   2547     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
   2548     if (ACPI_FAILURE (Status))
   2549     {
   2550         return 0;
   2551     }
   2552 
   2553     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
   2554     while (Offset < S3ptTable->Length)
   2555     {
   2556         /* Common subtable header */
   2557 
   2558         AcpiOsPrintf ("\n");
   2559         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
   2560             Subtable->Length, AcpiDmTableInfoS3ptHdr);
   2561         if (ACPI_FAILURE (Status))
   2562         {
   2563             return 0;
   2564         }
   2565 
   2566         switch (Subtable->Type)
   2567         {
   2568         case ACPI_S3PT_TYPE_RESUME:
   2569 
   2570             InfoTable = AcpiDmTableInfoS3pt0;
   2571             break;
   2572 
   2573         case ACPI_S3PT_TYPE_SUSPEND:
   2574 
   2575             InfoTable = AcpiDmTableInfoS3pt1;
   2576             break;
   2577 
   2578         default:
   2579 
   2580             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
   2581                 Subtable->Type);
   2582 
   2583             /* Attempt to continue */
   2584 
   2585             if (!Subtable->Length)
   2586             {
   2587                 AcpiOsPrintf ("Invalid zero length subtable\n");
   2588                 return 0;
   2589             }
   2590             goto NextSubtable;
   2591         }
   2592 
   2593         AcpiOsPrintf ("\n");
   2594         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
   2595             Subtable->Length, InfoTable);
   2596         if (ACPI_FAILURE (Status))
   2597         {
   2598             return 0;
   2599         }
   2600 
   2601 NextSubtable:
   2602         /* Point to next subtable */
   2603 
   2604         Offset += Subtable->Length;
   2605         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
   2606     }
   2607 
   2608     return (S3ptTable->Length);
   2609 }
   2610 
   2611 
   2612 /*******************************************************************************
   2613  *
   2614  * FUNCTION:    AcpiDmDumpSdev
   2615  *
   2616  * PARAMETERS:  Table               - A SDEV table
   2617  *
   2618  * RETURN:      None
   2619  *
   2620  * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
   2621  *              table that contains variable strings and vendor data.
   2622  *
   2623  ******************************************************************************/
   2624 
   2625 void
   2626 AcpiDmDumpSdev (
   2627     ACPI_TABLE_HEADER       *Table)
   2628 {
   2629     ACPI_STATUS                 Status;
   2630     ACPI_SDEV_HEADER            *Subtable;
   2631     ACPI_SDEV_PCIE              *Pcie;
   2632     ACPI_SDEV_NAMESPACE         *Namesp;
   2633     ACPI_DMTABLE_INFO           *InfoTable;
   2634     ACPI_DMTABLE_INFO           *SecureComponentInfoTable;
   2635     UINT32                      Length = Table->Length;
   2636     UINT32                      Offset = sizeof (ACPI_TABLE_SDEV);
   2637     UINT16                      PathOffset;
   2638     UINT16                      PathLength;
   2639     UINT16                      VendorDataOffset;
   2640     UINT16                      VendorDataLength;
   2641     ACPI_SDEV_SECURE_COMPONENT  *SecureComponent = NULL;
   2642     UINT32                      CurrentOffset = 0;
   2643 
   2644 
   2645     /* Main table */
   2646 
   2647     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
   2648     if (ACPI_FAILURE (Status))
   2649     {
   2650         return;
   2651     }
   2652 
   2653     /* Subtables */
   2654 
   2655     Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
   2656     while (Offset < Table->Length)
   2657     {
   2658         /* Common subtable header */
   2659 
   2660         AcpiOsPrintf ("\n");
   2661         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   2662             Subtable->Length, AcpiDmTableInfoSdevHdr);
   2663         if (ACPI_FAILURE (Status))
   2664         {
   2665             return;
   2666         }
   2667 
   2668         switch (Subtable->Type)
   2669         {
   2670         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2671 
   2672             InfoTable = AcpiDmTableInfoSdev0;
   2673             break;
   2674 
   2675         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2676 
   2677             InfoTable = AcpiDmTableInfoSdev1;
   2678             break;
   2679 
   2680         default:
   2681             goto NextSubtable;
   2682         }
   2683 
   2684         AcpiOsPrintf ("\n");
   2685         Status = AcpiDmDumpTable (Table->Length, 0, Subtable,
   2686             Subtable->Length, InfoTable);
   2687         if (ACPI_FAILURE (Status))
   2688         {
   2689             return;
   2690         }
   2691 
   2692         switch (Subtable->Type)
   2693         {
   2694         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
   2695 
   2696             CurrentOffset = sizeof (ACPI_SDEV_NAMESPACE);
   2697             if (Subtable->Flags & ACPI_SDEV_SECURE_COMPONENTS_PRESENT)
   2698             {
   2699                 SecureComponent = ACPI_CAST_PTR (ACPI_SDEV_SECURE_COMPONENT,
   2700                     ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)));
   2701 
   2702                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2703                     ACPI_ADD_PTR(UINT8, Subtable, sizeof (ACPI_SDEV_NAMESPACE)),
   2704                     sizeof (ACPI_SDEV_SECURE_COMPONENT), AcpiDmTableInfoSdev0b);
   2705                 if (ACPI_FAILURE (Status))
   2706                 {
   2707                     return;
   2708                 }
   2709                 CurrentOffset += sizeof (ACPI_SDEV_SECURE_COMPONENT);
   2710 
   2711                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2712                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
   2713                     sizeof (ACPI_SDEV_HEADER), AcpiDmTableInfoSdevSecCompHdr);
   2714                 if (ACPI_FAILURE (Status))
   2715                 {
   2716                     return;
   2717                 }
   2718                 CurrentOffset += sizeof (ACPI_SDEV_HEADER);
   2719 
   2720                 switch (Subtable->Type)
   2721                 {
   2722                 case ACPI_SDEV_TYPE_ID_COMPONENT:
   2723 
   2724                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompId;
   2725                     break;
   2726 
   2727                 case ACPI_SDEV_TYPE_MEM_COMPONENT:
   2728 
   2729                     SecureComponentInfoTable = AcpiDmTableInfoSdevSecCompMem;
   2730                     break;
   2731 
   2732                 default:
   2733                     goto NextSubtable;
   2734                 }
   2735 
   2736                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2737                     ACPI_ADD_PTR(UINT8, Subtable, SecureComponent->SecureComponentOffset),
   2738                     SecureComponent->SecureComponentLength, SecureComponentInfoTable);
   2739                 CurrentOffset += SecureComponent->SecureComponentLength;
   2740             }
   2741 
   2742             /* Dump the PCIe device ID(s) */
   2743 
   2744             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
   2745             PathOffset = Namesp->DeviceIdOffset;
   2746             PathLength = Namesp->DeviceIdLength;
   2747 
   2748             if (PathLength)
   2749             {
   2750                 Status = AcpiDmDumpTable (Table->Length, CurrentOffset,
   2751                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
   2752                     PathLength, AcpiDmTableInfoSdev0a);
   2753                 if (ACPI_FAILURE (Status))
   2754                 {
   2755                     return;
   2756                 }
   2757                 CurrentOffset += PathLength;
   2758             }
   2759 
   2760             /* Dump the vendor-specific data */
   2761 
   2762             VendorDataLength =
   2763                 Namesp->VendorDataLength;
   2764             VendorDataOffset =
   2765                 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
   2766 
   2767             if (VendorDataLength)
   2768             {
   2769                 Status = AcpiDmDumpTable (Table->Length, 0,
   2770                     ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
   2771                     VendorDataLength, AcpiDmTableInfoSdev1b);
   2772                 if (ACPI_FAILURE (Status))
   2773                 {
   2774                     return;
   2775                 }
   2776             }
   2777             break;
   2778 
   2779         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
   2780 
   2781             /* PCI path substructures */
   2782 
   2783             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
   2784             PathOffset = Pcie->PathOffset;
   2785             PathLength = Pcie->PathLength;
   2786 
   2787             while (PathLength)
   2788             {
   2789                 Status = AcpiDmDumpTable (Table->Length,
   2790                     PathOffset + Offset,
   2791                     ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
   2792                     sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
   2793                 if (ACPI_FAILURE (Status))
   2794                 {
   2795                     return;
   2796                 }
   2797 
   2798                 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
   2799                 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
   2800             }
   2801 
   2802             /* VendorData */
   2803 
   2804             VendorDataLength = Pcie->VendorDataLength;
   2805             VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
   2806 
   2807             if (VendorDataLength)
   2808             {
   2809                 Status = AcpiDmDumpTable (Table->Length, 0,
   2810                     ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
   2811                     VendorDataLength, AcpiDmTableInfoSdev1b);
   2812                 if (ACPI_FAILURE (Status))
   2813                 {
   2814                     return;
   2815                 }
   2816             }
   2817             break;
   2818 
   2819         default:
   2820             goto NextSubtable;
   2821         }
   2822 
   2823 NextSubtable:
   2824         /* Point to next subtable */
   2825 
   2826         Offset += Subtable->Length;
   2827         Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
   2828             Subtable->Length);
   2829     }
   2830 }
   2831