Home | History | Annotate | Line # | Download | only in common
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2026, 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 "acpi.h"
     45 #include "accommon.h"
     46 #include "acdisasm.h"
     47 #include "actables.h"
     48 #include "aslcompiler.h"
     49 
     50 /* This module used for application-level code only */
     51 
     52 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     53         ACPI_MODULE_NAME    ("dmtbdump1")
     54 
     55 
     56 /*******************************************************************************
     57  *
     58  * FUNCTION:    AcpiDmDumpAest
     59  *
     60  * PARAMETERS:  Table               - A AEST table
     61  *
     62  * RETURN:      None
     63  *
     64  * DESCRIPTION: Format the contents of a AEST table
     65  *
     66  * NOTE: Assumes the following table structure:
     67  *      For all AEST Error Nodes:
     68  *          1) An AEST Error Node, followed immediately by:
     69  *          2) Any node-specific data
     70  *          3) An Interface Structure (one)
     71  *          4) A list (array) of Interrupt Structures
     72  *
     73  * AEST - ARM Error Source table. Conforms to:
     74  * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020
     75  *
     76  ******************************************************************************/
     77 
     78 void
     79 AcpiDmDumpAest (
     80     ACPI_TABLE_HEADER       *Table)
     81 {
     82     ACPI_STATUS             Status;
     83     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
     84     ACPI_AEST_HEADER        *Subtable;
     85     ACPI_AEST_HEADER        *NodeHeader;
     86     ACPI_AEST_PROCESSOR     *ProcessorSubtable;
     87     ACPI_DMTABLE_INFO       *InfoTable;
     88     ACPI_SIZE               Length;
     89     UINT8                   Type;
     90     UINT8                   Revision = Table->Revision;
     91     UINT32                  Count;
     92     ACPI_AEST_NODE_INTERFACE_HEADER *InterfaceHeader;
     93 
     94 
     95     /* Very small, generic main table. AEST consists of mostly subtables */
     96 
     97     while (Offset < Table->Length)
     98     {
     99         NodeHeader = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    100 
    101         /* Dump the common error node (subtable) header */
    102 
    103         Status = AcpiDmDumpTable (Table->Length, Offset, NodeHeader,
    104             NodeHeader->Length, AcpiDmTableInfoAestHdr);
    105         if (ACPI_FAILURE (Status))
    106         {
    107             return;
    108         }
    109 
    110         Type = NodeHeader->Type;
    111 
    112         /* Setup the node-specific subtable based on the header Type field */
    113 
    114         switch (Type)
    115         {
    116         case ACPI_AEST_PROCESSOR_ERROR_NODE:
    117             InfoTable = AcpiDmTableInfoAestProcError;
    118             Length = sizeof (ACPI_AEST_PROCESSOR);
    119             break;
    120 
    121         case ACPI_AEST_MEMORY_ERROR_NODE:
    122             InfoTable = AcpiDmTableInfoAestMemError;
    123             Length = sizeof (ACPI_AEST_MEMORY);
    124             break;
    125 
    126         case ACPI_AEST_SMMU_ERROR_NODE:
    127             InfoTable = AcpiDmTableInfoAestSmmuError;
    128             Length = sizeof (ACPI_AEST_SMMU);
    129             break;
    130 
    131         case ACPI_AEST_VENDOR_ERROR_NODE:
    132             switch (Revision)
    133             {
    134             case 1:
    135                 InfoTable = AcpiDmTableInfoAestVendorError;
    136                 Length = sizeof (ACPI_AEST_VENDOR);
    137                 break;
    138 
    139             case 2:
    140                 InfoTable = AcpiDmTableInfoAestVendorV2Error;
    141                 Length = sizeof (ACPI_AEST_VENDOR_V2);
    142                 break;
    143 
    144             default:
    145                 AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);
    146                 return;
    147             }
    148             break;
    149 
    150         case ACPI_AEST_GIC_ERROR_NODE:
    151             InfoTable = AcpiDmTableInfoAestGicError;
    152             Length = sizeof (ACPI_AEST_GIC);
    153             break;
    154 
    155         case ACPI_AEST_PCIE_ERROR_NODE:
    156             InfoTable = AcpiDmTableInfoAestPCIeError;
    157             Length = sizeof (ACPI_AEST_PCIE);
    158             break;
    159 
    160         case ACPI_AEST_PROXY_ERROR_NODE:
    161             InfoTable = AcpiDmTableInfoAestProxyError;
    162             Length = sizeof (ACPI_AEST_PROXY);
    163             break;
    164 
    165         /* Error case below */
    166         default:
    167 
    168             AcpiOsPrintf ("\n**** Unknown AEST Error Subtable type 0x%X\n",
    169                 Type);
    170             return;
    171         }
    172 
    173         /* Point past the common header (to the node-specific data) */
    174 
    175         Offset += sizeof (ACPI_AEST_HEADER);
    176         Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    177         AcpiOsPrintf ("\n");
    178 
    179         /* Dump the node-specific subtable */
    180 
    181         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length,
    182             InfoTable);
    183         if (ACPI_FAILURE (Status))
    184         {
    185             return;
    186         }
    187         AcpiOsPrintf ("\n");
    188 
    189         if (Type == ACPI_AEST_PROCESSOR_ERROR_NODE)
    190         {
    191             /*
    192              * Special handling for PROCESSOR_ERROR_NODE subtables
    193              * (to handle the Resource Substructure via the ResourceType
    194              * field).
    195              */
    196 
    197             /* Point past the node-specific data */
    198 
    199             Offset += Length;
    200             ProcessorSubtable = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, Subtable);
    201 
    202             switch (ProcessorSubtable->ResourceType)
    203             {
    204             /* Setup the Resource Substructure subtable */
    205 
    206             case ACPI_AEST_CACHE_RESOURCE:
    207                 InfoTable = AcpiDmTableInfoAestCacheRsrc;
    208                 Length = sizeof (ACPI_AEST_PROCESSOR_CACHE);
    209                 break;
    210 
    211             case ACPI_AEST_TLB_RESOURCE:
    212                 InfoTable = AcpiDmTableInfoAestTlbRsrc;
    213                 Length = sizeof (ACPI_AEST_PROCESSOR_TLB);
    214                 break;
    215 
    216             case ACPI_AEST_GENERIC_RESOURCE:
    217                 InfoTable = AcpiDmTableInfoAestGenRsrc;
    218                 Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC);
    219                 break;
    220 
    221             /* Error case below */
    222             default:
    223                 AcpiOsPrintf ("\n**** Unknown AEST Processor Resource type 0x%X\n",
    224                     ProcessorSubtable->ResourceType);
    225                 return;
    226             }
    227 
    228             ProcessorSubtable = ACPI_ADD_PTR (ACPI_AEST_PROCESSOR, Table,
    229                 Offset);
    230 
    231             /* Dump the resource substructure subtable */
    232 
    233             Status = AcpiDmDumpTable (Table->Length, Offset, ProcessorSubtable,
    234                 Length, InfoTable);
    235             if (ACPI_FAILURE (Status))
    236             {
    237                 return;
    238             }
    239 
    240             AcpiOsPrintf ("\n");
    241         }
    242 
    243         /* Point past the resource substructure or the node-specific data */
    244 
    245         Offset += Length;
    246 
    247         /* Dump the interface structure, required to be present */
    248 
    249         Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    250         if (Subtable->Type >= ACPI_AEST_XFACE_RESERVED)
    251         {
    252             AcpiOsPrintf ("\n**** Unknown AEST Node Interface type 0x%X\n",
    253                 Subtable->Type);
    254             return;
    255         }
    256 
    257         if (Revision == 1)
    258         {
    259             InfoTable = AcpiDmTableInfoAestXface;
    260             Length = sizeof (ACPI_AEST_NODE_INTERFACE);
    261         }
    262         else if (Revision == 2)
    263         {
    264             InfoTable = AcpiDmTableInfoAestXfaceHeader;
    265             Length = sizeof (ACPI_AEST_NODE_INTERFACE_HEADER);
    266 
    267             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);
    268             if (ACPI_FAILURE (Status))
    269             {
    270                 return;
    271             }
    272 
    273             Offset += Length;
    274 
    275             InterfaceHeader = ACPI_CAST_PTR (ACPI_AEST_NODE_INTERFACE_HEADER, Subtable);
    276             switch (InterfaceHeader->GroupFormat)
    277 	        {
    278             case ACPI_AEST_NODE_GROUP_FORMAT_4K:
    279                 InfoTable = AcpiDmTableInfoAestXface4k;
    280                 Length = sizeof (ACPI_AEST_NODE_INTERFACE_4K);
    281                 break;
    282 
    283             case ACPI_AEST_NODE_GROUP_FORMAT_16K:
    284                 InfoTable = AcpiDmTableInfoAestXface16k;
    285                 Length = sizeof (ACPI_AEST_NODE_INTERFACE_16K);
    286                 break;
    287 
    288             case ACPI_AEST_NODE_GROUP_FORMAT_64K:
    289                 InfoTable = AcpiDmTableInfoAestXface64k;
    290                 Length = sizeof (ACPI_AEST_NODE_INTERFACE_64K);
    291                 break;
    292 
    293             default:
    294                 AcpiOsPrintf ("\n**** Unknown AEST Interface Group Format 0x%X\n",
    295                     InterfaceHeader->GroupFormat);
    296                 return;
    297             }
    298 
    299             Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    300         }
    301         else
    302         {
    303             AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n", Revision);
    304             return;
    305         }
    306 
    307         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length, InfoTable);
    308         if (ACPI_FAILURE (Status))
    309         {
    310             return;
    311         }
    312 
    313         /* Point past the interface structure */
    314 
    315         AcpiOsPrintf ("\n");
    316         Offset += Length;
    317 
    318         /* Dump the entire interrupt structure array, if present */
    319 
    320         if (NodeHeader->NodeInterruptOffset)
    321         {
    322             Count = NodeHeader->NodeInterruptCount;
    323             Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    324 
    325             while (Count)
    326             {
    327                 /* Dump the interrupt structure */
    328 
    329                 switch (Revision) {
    330                 case 1:
    331                     InfoTable = AcpiDmTableInfoAestXrupt;
    332                     Length = sizeof (ACPI_AEST_NODE_INTERRUPT);
    333                     break;
    334 
    335                 case 2:
    336                     InfoTable = AcpiDmTableInfoAestXruptV2;
    337                     Length = sizeof (ACPI_AEST_NODE_INTERRUPT_V2);
    338                     break;
    339                 default:
    340                     AcpiOsPrintf ("\n**** Unknown AEST revision 0x%X\n",
    341                         Revision);
    342                     return;
    343                 }
    344                 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    345                     Length, InfoTable);
    346                 if (ACPI_FAILURE (Status))
    347                 {
    348                     return;
    349                 }
    350 
    351                 /* Point to the next interrupt structure */
    352 
    353                 Offset += Length;
    354                 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
    355                 Count--;
    356                 AcpiOsPrintf ("\n");
    357             }
    358         }
    359     }
    360 }
    361 
    362 /*******************************************************************************
    363  *
    364  * FUNCTION:    AcpiDmDumpApmt
    365  *
    366  * PARAMETERS:  Table               - A APMT table
    367  *
    368  * RETURN:      None
    369  *
    370  * DESCRIPTION: Format the contents of a APMT. This table type consists
    371  *              of an open-ended number of subtables.
    372  *
    373  *
    374  * APMT - ARM Performance Monitoring Unit table. Conforms to:
    375  * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
    376  * ARM DEN0117 v1.0 November 25, 2021
    377  *
    378  ******************************************************************************/
    379 
    380 void
    381 AcpiDmDumpApmt (
    382     ACPI_TABLE_HEADER       *Table)
    383 {
    384     ACPI_STATUS              Status;
    385     ACPI_APMT_NODE           *Subtable;
    386     UINT32                   Length = Table->Length;
    387     UINT32                   Offset = sizeof (ACPI_TABLE_APMT);
    388     UINT32                   NodeNum = 0;
    389 
    390     /* There is no main table (other than the standard ACPI header) */
    391 
    392     /* Subtables */
    393 
    394     Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset);
    395     while (Offset < Table->Length)
    396     {
    397         AcpiOsPrintf ("\n");
    398 
    399         if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT)
    400         {
    401             AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n",
    402                 Subtable->Type);
    403             return;
    404         }
    405 
    406         AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++);
    407 
    408         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    409             Subtable->Length, AcpiDmTableInfoApmtNode);
    410         if (ACPI_FAILURE (Status))
    411         {
    412             return;
    413         }
    414 
    415         /* Point to next subtable */
    416 
    417         Offset += Subtable->Length;
    418         Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable,
    419             Subtable->Length);
    420         AcpiOsPrintf ("\n");
    421     }
    422 }
    423 
    424 
    425 /*******************************************************************************
    426  *
    427  * FUNCTION:    AcpiDmDumpAsf
    428  *
    429  * PARAMETERS:  Table               - A ASF table
    430  *
    431  * RETURN:      None
    432  *
    433  * DESCRIPTION: Format the contents of a ASF table
    434  *
    435  ******************************************************************************/
    436 
    437 void
    438 AcpiDmDumpAsf (
    439     ACPI_TABLE_HEADER       *Table)
    440 {
    441     ACPI_STATUS             Status;
    442     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
    443     ACPI_ASF_INFO           *Subtable;
    444     ACPI_DMTABLE_INFO       *InfoTable;
    445     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
    446     UINT8                   *DataTable = NULL;
    447     UINT32                  DataCount = 0;
    448     UINT32                  DataLength = 0;
    449     UINT32                  DataOffset = 0;
    450     UINT32                  i;
    451     UINT8                   Type;
    452 
    453 
    454     /* No main table, only subtables */
    455 
    456     Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
    457     while (Offset < Table->Length)
    458     {
    459         /* Common subtable header */
    460 
    461         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    462             Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
    463         if (ACPI_FAILURE (Status))
    464         {
    465             return;
    466         }
    467 
    468         /* The actual type is the lower 7 bits of Type */
    469 
    470         Type = (UINT8) (Subtable->Header.Type & 0x7F);
    471 
    472         switch (Type)
    473         {
    474         case ACPI_ASF_TYPE_INFO:
    475 
    476             InfoTable = AcpiDmTableInfoAsf0;
    477             break;
    478 
    479         case ACPI_ASF_TYPE_ALERT:
    480 
    481             InfoTable = AcpiDmTableInfoAsf1;
    482             DataInfoTable = AcpiDmTableInfoAsf1a;
    483             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
    484             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
    485             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
    486             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
    487             break;
    488 
    489         case ACPI_ASF_TYPE_CONTROL:
    490 
    491             InfoTable = AcpiDmTableInfoAsf2;
    492             DataInfoTable = AcpiDmTableInfoAsf2a;
    493             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
    494             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
    495             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
    496             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
    497             break;
    498 
    499         case ACPI_ASF_TYPE_BOOT:
    500 
    501             InfoTable = AcpiDmTableInfoAsf3;
    502             break;
    503 
    504         case ACPI_ASF_TYPE_ADDRESS:
    505 
    506             InfoTable = AcpiDmTableInfoAsf4;
    507             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
    508             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
    509             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
    510             break;
    511 
    512         default:
    513 
    514             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
    515                 Subtable->Header.Type);
    516             return;
    517         }
    518 
    519         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    520             Subtable->Header.Length, InfoTable);
    521         if (ACPI_FAILURE (Status))
    522         {
    523             return;
    524         }
    525 
    526         /* Dump variable-length extra data */
    527 
    528         switch (Type)
    529         {
    530         case ACPI_ASF_TYPE_ALERT:
    531         case ACPI_ASF_TYPE_CONTROL:
    532 
    533             for (i = 0; i < DataCount; i++)
    534             {
    535                 AcpiOsPrintf ("\n");
    536                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
    537                     DataTable, DataLength, DataInfoTable);
    538                 if (ACPI_FAILURE (Status))
    539                 {
    540                     return;
    541                 }
    542 
    543                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
    544                 DataOffset += DataLength;
    545             }
    546             break;
    547 
    548         case ACPI_ASF_TYPE_ADDRESS:
    549 
    550             for (i = 0; i < DataLength; i++)
    551             {
    552                 if (!(i % 16))
    553                 {
    554                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
    555                 }
    556 
    557                 AcpiOsPrintf ("%2.2X ", *DataTable);
    558                 DataTable++;
    559                 DataOffset++;
    560 
    561                 if (DataOffset > Table->Length)
    562                 {
    563                     AcpiOsPrintf (
    564                         "**** ACPI table terminates in the middle of a "
    565                         "data structure! (ASF! table)\n");
    566                     return;
    567                 }
    568             }
    569 
    570             AcpiOsPrintf ("\n");
    571             break;
    572 
    573         default:
    574 
    575             break;
    576         }
    577 
    578         AcpiOsPrintf ("\n");
    579 
    580         /* Point to next subtable */
    581 
    582         if (!Subtable->Header.Length)
    583         {
    584             AcpiOsPrintf ("Invalid zero subtable header length\n");
    585             return;
    586         }
    587 
    588         Offset += Subtable->Header.Length;
    589         Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
    590             Subtable->Header.Length);
    591     }
    592 }
    593 
    594 /*******************************************************************************
    595  *
    596  * FUNCTION:    AcpiDmDumpAspt
    597  *
    598  * PARAMETERS:  Table               - A ASPT table
    599  *
    600  * RETURN:      None
    601  *
    602  * DESCRIPTION: Format the contents of a ASPT table
    603  *
    604  ******************************************************************************/
    605 
    606 void
    607 AcpiDmDumpAspt (
    608     ACPI_TABLE_HEADER       *Table)
    609 {
    610     ACPI_STATUS             Status;
    611     UINT32                  Offset = sizeof (ACPI_TABLE_ASPT);
    612     UINT32                  Length = Table->Length;
    613     ACPI_ASPT_HEADER        *Subtable;
    614     ACPI_DMTABLE_INFO       *InfoTable;
    615     UINT16                   Type;
    616 
    617     /* Main table */
    618     Status = AcpiDmDumpTable(Length, 0, Table, 0, AcpiDmTableInfoAspt);
    619 
    620     /* Subtables */
    621 
    622     Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Table, Offset);
    623     while (Offset < Table->Length)
    624     {
    625         AcpiOsPrintf ("\n");
    626 
    627         /* Common subtable header */
    628         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    629             Subtable->Length, AcpiDmTableInfoAsptHdr);
    630         if (ACPI_FAILURE (Status))
    631         {
    632             return;
    633         }
    634 
    635         Type = Subtable->Type;
    636 
    637         switch (Type)
    638         {
    639         case ACPI_ASPT_TYPE_GLOBAL_REGS:
    640 
    641             InfoTable = AcpiDmTableInfoAspt0;
    642             break;
    643 
    644         case ACPI_ASPT_TYPE_SEV_MBOX_REGS:
    645 
    646             InfoTable = AcpiDmTableInfoAspt1;
    647             break;
    648 
    649         case ACPI_ASPT_TYPE_ACPI_MBOX_REGS:
    650 
    651             InfoTable = AcpiDmTableInfoAspt2;
    652             break;
    653 
    654         default:
    655 
    656             AcpiOsPrintf ("\n**** Unknown ASPT subtable type 0x%X\n",
    657                 Subtable->Type);
    658             return;
    659         }
    660 
    661         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    662             Subtable->Length, InfoTable);
    663         if (ACPI_FAILURE (Status))
    664         {
    665             return;
    666         }
    667 
    668         AcpiOsPrintf ("\n");
    669 
    670         /* Point to next subtable */
    671         if (!Subtable->Length)
    672         {
    673             AcpiOsPrintf ("Invalid zero subtable header length\n");
    674             return;
    675         }
    676 
    677         Offset += Subtable->Length;
    678         Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Subtable,
    679             Subtable->Length);
    680     }
    681 }
    682 
    683 
    684 /*******************************************************************************
    685  *
    686  * FUNCTION:    AcpiDmDumpCdat
    687  *
    688  * PARAMETERS:  InTable             - A CDAT table
    689  *
    690  * RETURN:      None
    691  *
    692  * DESCRIPTION: Format the contents of a CDAT. This table type consists
    693  *              of an open-ended number of subtables.
    694  *
    695  ******************************************************************************/
    696 
    697 void
    698 AcpiDmDumpCdat (
    699     ACPI_TABLE_HEADER       *InTable)
    700 {
    701     ACPI_TABLE_CDAT         *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable);
    702     ACPI_STATUS             Status;
    703     ACPI_CDAT_HEADER        *Subtable;
    704     ACPI_TABLE_CDAT         *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table);
    705     ACPI_DMTABLE_INFO       *InfoTable;
    706     UINT32                  Length = CdatTable->Length;
    707     UINT32                  Offset = sizeof (ACPI_TABLE_CDAT);
    708     UINT32                  SubtableLength;
    709     UINT32                  SubtableType;
    710     INT32                   EntriesLength;
    711 
    712 
    713     /* Main table */
    714 
    715     Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0,
    716         AcpiDmTableInfoCdatTableHdr);
    717     if (ACPI_FAILURE (Status))
    718     {
    719         return;
    720     }
    721 
    722     Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT));
    723     while (Offset < Table->Length)
    724     {
    725         /* Dump the common subtable header */
    726 
    727         DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset);
    728         AcpiOsPrintf ("\n");
    729         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    730             sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader);
    731         if (ACPI_FAILURE (Status))
    732         {
    733             return;
    734         }
    735 
    736         /* Point past the common subtable header, decode the subtable type */
    737 
    738         Offset += sizeof (ACPI_CDAT_HEADER);
    739         SubtableType = Subtable->Type;
    740 
    741         switch (Subtable->Type)
    742         {
    743         case ACPI_CDAT_TYPE_DSMAS:
    744             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    745             SubtableLength = sizeof (ACPI_CDAT_DSMAS);
    746 
    747             InfoTable = AcpiDmTableInfoCdat0;
    748             break;
    749 
    750         case ACPI_CDAT_TYPE_DSLBIS:
    751             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    752             SubtableLength = sizeof (ACPI_CDAT_DSLBIS);
    753             DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset);
    754 
    755             InfoTable = AcpiDmTableInfoCdat1;
    756             break;
    757 
    758         case ACPI_CDAT_TYPE_DSMSCIS:
    759             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    760             SubtableLength = sizeof (ACPI_CDAT_DSMSCIS);
    761 
    762             InfoTable = AcpiDmTableInfoCdat2;
    763             break;
    764 
    765         case ACPI_CDAT_TYPE_DSIS:
    766             DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset);
    767             SubtableLength = sizeof (ACPI_CDAT_DSIS);
    768             DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table);
    769             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    770             DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n",
    771                 Table, Subtable, Offset);
    772             DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset);
    773 
    774             InfoTable = AcpiDmTableInfoCdat3;
    775             break;
    776 
    777         case ACPI_CDAT_TYPE_DSEMTS:
    778             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    779             SubtableLength = sizeof (ACPI_CDAT_DSEMTS);
    780 
    781             InfoTable = AcpiDmTableInfoCdat4;
    782             break;
    783 
    784         case ACPI_CDAT_TYPE_SSLBIS:
    785             SubtableLength = Subtable->Length;
    786 
    787             InfoTable = AcpiDmTableInfoCdat5;
    788             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    789             break;
    790 
    791         default:
    792             fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type);
    793             return;
    794         }
    795 
    796         DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual "
    797             "Length: %X Offset: %X tableptr: %p\n", SubtableType,
    798             Subtable->Length, SubtableLength, Offset, Table);
    799 
    800         /*
    801          * Do the subtable-specific fields
    802          */
    803         Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable);
    804         if (ACPI_FAILURE (Status))
    805         {
    806             return;
    807         }
    808 
    809         DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n",
    810             SubtableType, Offset, SubtableLength);
    811 
    812         /* Additional sub-subtables, dependent on the main subtable type */
    813 
    814         switch (SubtableType)
    815         {
    816         case ACPI_CDAT_TYPE_SSLBIS:
    817             Offset += sizeof (ACPI_CDAT_SSLBIS);
    818             Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table,
    819                 Offset);
    820 
    821             DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X "
    822                 "Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length);
    823 
    824             /* Generate the total length of all the SSLBE entries */
    825 
    826             EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) -
    827                 sizeof (ACPI_CDAT_SSLBIS);
    828             DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n",
    829                 EntriesLength, Offset, Table->Length);
    830 
    831             /* Do each of the SSLBE Entries */
    832 
    833             while ((EntriesLength > 0) && (Offset < Table->Length))
    834             {
    835                 AcpiOsPrintf ("\n");
    836 
    837                 Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset,
    838                     AcpiDmTableInfoCdatEntries);
    839                 if (ACPI_FAILURE (Status))
    840                 {
    841                     return;
    842                 }
    843 
    844                 EntriesLength -= sizeof (ACPI_CDAT_SSLBE);
    845                 Offset += sizeof (ACPI_CDAT_SSLBE);
    846                 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    847             }
    848 
    849             SubtableLength = 0;
    850             break;
    851 
    852         default:
    853             break;
    854         }
    855 
    856         DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n",
    857             Offset, SubtableLength);
    858 
    859         /* Point to next subtable */
    860 
    861         Offset += SubtableLength;
    862         Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
    863     }
    864 
    865     return;
    866 }
    867 
    868 
    869 /*******************************************************************************
    870  *
    871  * FUNCTION:    AcpiDmDumpCedt
    872  *
    873  * PARAMETERS:  Table               - A CEDT table
    874  *
    875  * RETURN:      None
    876  *
    877  * DESCRIPTION: Format the contents of a CEDT. This table type consists
    878  *              of an open-ended number of subtables.
    879  *
    880  ******************************************************************************/
    881 
    882 void
    883 AcpiDmDumpCedt (
    884     ACPI_TABLE_HEADER       *Table)
    885 {
    886     ACPI_STATUS             Status;
    887     ACPI_CEDT_HEADER        *Subtable;
    888     UINT32                  Length = Table->Length;
    889     UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
    890 
    891 
    892     /* There is no main table (other than the standard ACPI header) */
    893 
    894     Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
    895     while (Offset < Table->Length)
    896     {
    897         /* Common subtable header */
    898 
    899         AcpiOsPrintf ("\n");
    900         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    901             Subtable->Length, AcpiDmTableInfoCedtHdr);
    902         if (ACPI_FAILURE (Status))
    903         {
    904             return;
    905         }
    906 
    907         switch (Subtable->Type)
    908         {
    909         case ACPI_CEDT_TYPE_CHBS:
    910             Status = AcpiDmDumpTable (Length, Offset, Subtable,
    911                 Subtable->Length, AcpiDmTableInfoCedt0);
    912             if (ACPI_FAILURE (Status))
    913             {
    914                 return;
    915             }
    916             break;
    917 
    918         case ACPI_CEDT_TYPE_CFMWS:
    919         {
    920             ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable;
    921             unsigned int i, max;
    922 
    923             if (ptr->InterleaveWays < 8)
    924                 max = 1 << (ptr->InterleaveWays);
    925             else
    926                 max = 3 << (ptr->InterleaveWays - 8);
    927 
    928 	    /* print out table with first "Interleave target" */
    929 
    930             Status = AcpiDmDumpTable (Length, Offset, Subtable,
    931                 Subtable->Length, AcpiDmTableInfoCedt1);
    932             if (ACPI_FAILURE (Status))
    933             {
    934                 return;
    935             }
    936 
    937             /* Now, print out any interleave targets beyond the first. */
    938 
    939             for (i = 1; i < max; i++)
    940             {
    941                 unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets);
    942                 unsigned int *trg = &(ptr->InterleaveTargets[i]);
    943 
    944                 Status = AcpiDmDumpTable (Length, loc_offset, trg,
    945                         Subtable->Length, AcpiDmTableInfoCedt1_te);
    946                 if (ACPI_FAILURE (Status))
    947                 {
    948                     return;
    949                 }
    950             }
    951             break;
    952         }
    953 
    954         case ACPI_CEDT_TYPE_CXIMS:
    955         {
    956             ACPI_CEDT_CXIMS *ptr = (ACPI_CEDT_CXIMS *) Subtable;
    957             unsigned int i, max = ptr->NrXormaps;
    958 
    959             /* print out table with first "XOR Map" */
    960 
    961             Status = AcpiDmDumpTable (Length, Offset, Subtable,
    962                 Subtable->Length, AcpiDmTableInfoCedt2);
    963             if (ACPI_FAILURE (Status))
    964             {
    965                 return;
    966             }
    967 
    968             /* Now, print out any XOR Map beyond the first. */
    969 
    970             for (i = 1; i < max; i++)
    971             {
    972                 unsigned int loc_offset = Offset + (i * 1) + ACPI_OFFSET (ACPI_CEDT_CXIMS, XormapList);
    973                 UINT64 *trg = &(ptr->XormapList[i]);
    974 
    975                 Status = AcpiDmDumpTable (Length, loc_offset, trg,
    976                         Subtable->Length, AcpiDmTableInfoCedt2_te);
    977                 if (ACPI_FAILURE (Status))
    978                 {
    979                     return;
    980                 }
    981             }
    982             break;
    983         }
    984 
    985         default:
    986             AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
    987                 Subtable->Type);
    988 
    989             /* Attempt to continue */
    990             if (!Subtable->Length)
    991             {
    992                 AcpiOsPrintf ("Invalid zero length subtable\n");
    993                 return;
    994             }
    995         }
    996 
    997         /* Point to next subtable */
    998         Offset += Subtable->Length;
    999         Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
   1000             Subtable->Length);
   1001     }
   1002 }
   1003 
   1004 /*******************************************************************************
   1005  *
   1006  * FUNCTION:    AcpiDmDumpCpep
   1007  *
   1008  * PARAMETERS:  Table               - A CPEP table
   1009  *
   1010  * RETURN:      None
   1011  *
   1012  * DESCRIPTION: Format the contents of a CPEP. This table type consists
   1013  *              of an open-ended number of subtables.
   1014  *
   1015  ******************************************************************************/
   1016 
   1017 void
   1018 AcpiDmDumpCpep (
   1019     ACPI_TABLE_HEADER       *Table)
   1020 {
   1021     ACPI_STATUS             Status;
   1022     ACPI_CPEP_POLLING       *Subtable;
   1023     UINT32                  Length = Table->Length;
   1024     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
   1025 
   1026 
   1027     /* Main table */
   1028 
   1029     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
   1030     if (ACPI_FAILURE (Status))
   1031     {
   1032         return;
   1033     }
   1034 
   1035     /* Subtables */
   1036 
   1037     Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
   1038     while (Offset < Table->Length)
   1039     {
   1040         AcpiOsPrintf ("\n");
   1041         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1042             Subtable->Header.Length, AcpiDmTableInfoCpep0);
   1043         if (ACPI_FAILURE (Status))
   1044         {
   1045             return;
   1046         }
   1047 
   1048         /* Point to next subtable */
   1049 
   1050         Offset += Subtable->Header.Length;
   1051         Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
   1052             Subtable->Header.Length);
   1053     }
   1054 }
   1055 
   1056 
   1057 /*******************************************************************************
   1058  *
   1059  * FUNCTION:    AcpiDmDumpCsrt
   1060  *
   1061  * PARAMETERS:  Table               - A CSRT table
   1062  *
   1063  * RETURN:      None
   1064  *
   1065  * DESCRIPTION: Format the contents of a CSRT. This table type consists
   1066  *              of an open-ended number of subtables.
   1067  *
   1068  ******************************************************************************/
   1069 
   1070 void
   1071 AcpiDmDumpCsrt (
   1072     ACPI_TABLE_HEADER       *Table)
   1073 {
   1074     ACPI_STATUS             Status;
   1075     ACPI_CSRT_GROUP         *Subtable;
   1076     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
   1077     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
   1078     UINT32                  Length = Table->Length;
   1079     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
   1080     UINT32                  SubOffset;
   1081     UINT32                  SubSubOffset;
   1082     UINT32                  InfoLength;
   1083 
   1084 
   1085     /* The main table only contains the ACPI header, thus already handled */
   1086 
   1087     /* Subtables (Resource Groups) */
   1088 
   1089     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
   1090     while (Offset < Table->Length)
   1091     {
   1092         /* Resource group subtable */
   1093 
   1094         AcpiOsPrintf ("\n");
   1095         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1096             Subtable->Length, AcpiDmTableInfoCsrt0);
   1097         if (ACPI_FAILURE (Status))
   1098         {
   1099             return;
   1100         }
   1101 
   1102         /* Shared info subtable (One per resource group) */
   1103 
   1104         SubOffset = sizeof (ACPI_CSRT_GROUP);
   1105         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
   1106             Offset + SubOffset);
   1107 
   1108         AcpiOsPrintf ("\n");
   1109         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
   1110             sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
   1111         if (ACPI_FAILURE (Status))
   1112         {
   1113             return;
   1114         }
   1115 
   1116         SubOffset += Subtable->SharedInfoLength;
   1117 
   1118         /* Sub-Subtables (Resource Descriptors) */
   1119 
   1120         SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
   1121             Offset + SubOffset);
   1122 
   1123         while ((SubOffset < Subtable->Length) &&
   1124               ((Offset + SubOffset) < Table->Length))
   1125         {
   1126             AcpiOsPrintf ("\n");
   1127             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
   1128                 SubSubtable->Length, AcpiDmTableInfoCsrt2);
   1129             if (ACPI_FAILURE (Status))
   1130             {
   1131                 return;
   1132             }
   1133 
   1134             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
   1135 
   1136             /* Resource-specific info buffer */
   1137 
   1138             InfoLength = SubSubtable->Length - SubSubOffset;
   1139             if (InfoLength)
   1140             {
   1141                 Status = AcpiDmDumpTable (Length,
   1142                     Offset + SubOffset + SubSubOffset, Table,
   1143                     InfoLength, AcpiDmTableInfoCsrt2a);
   1144                 if (ACPI_FAILURE (Status))
   1145                 {
   1146                     return;
   1147                 }
   1148             }
   1149 
   1150             /* Point to next sub-subtable */
   1151 
   1152             SubOffset += SubSubtable->Length;
   1153             SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
   1154                 SubSubtable->Length);
   1155         }
   1156 
   1157         /* Point to next subtable */
   1158 
   1159         Offset += Subtable->Length;
   1160         Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
   1161             Subtable->Length);
   1162     }
   1163 }
   1164 
   1165 
   1166 /*******************************************************************************
   1167  *
   1168  * FUNCTION:    AcpiDmDumpDbg2
   1169  *
   1170  * PARAMETERS:  Table               - A DBG2 table
   1171  *
   1172  * RETURN:      None
   1173  *
   1174  * DESCRIPTION: Format the contents of a DBG2. This table type consists
   1175  *              of an open-ended number of subtables.
   1176  *
   1177  ******************************************************************************/
   1178 
   1179 void
   1180 AcpiDmDumpDbg2 (
   1181     ACPI_TABLE_HEADER       *Table)
   1182 {
   1183     ACPI_STATUS             Status;
   1184     ACPI_DBG2_DEVICE        *Subtable;
   1185     UINT32                  Length = Table->Length;
   1186     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
   1187     UINT32                  i;
   1188     UINT32                  ArrayOffset;
   1189     UINT32                  AbsoluteOffset;
   1190     UINT8                   *Array;
   1191 
   1192 
   1193     /* Main table */
   1194 
   1195     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
   1196     if (ACPI_FAILURE (Status))
   1197     {
   1198         return;
   1199     }
   1200 
   1201     /* Subtables */
   1202 
   1203     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
   1204     while (Offset < Table->Length)
   1205     {
   1206         AcpiOsPrintf ("\n");
   1207         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1208             Subtable->Length, AcpiDmTableInfoDbg2Device);
   1209         if (ACPI_FAILURE (Status))
   1210         {
   1211             return;
   1212         }
   1213 
   1214         /* Dump the BaseAddress array */
   1215 
   1216         for (i = 0; i < Subtable->RegisterCount; i++)
   1217         {
   1218             ArrayOffset = Subtable->BaseAddressOffset +
   1219                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
   1220             AbsoluteOffset = Offset + ArrayOffset;
   1221             Array = (UINT8 *) Subtable + ArrayOffset;
   1222 
   1223             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
   1224                 Subtable->Length, AcpiDmTableInfoDbg2Addr);
   1225             if (ACPI_FAILURE (Status))
   1226             {
   1227                 return;
   1228             }
   1229         }
   1230 
   1231         /* Dump the AddressSize array */
   1232 
   1233         for (i = 0; i < Subtable->RegisterCount; i++)
   1234         {
   1235             ArrayOffset = Subtable->AddressSizeOffset +
   1236                 (sizeof (UINT32) * i);
   1237             AbsoluteOffset = Offset + ArrayOffset;
   1238             Array = (UINT8 *) Subtable + ArrayOffset;
   1239 
   1240             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
   1241                 Subtable->Length, AcpiDmTableInfoDbg2Size);
   1242             if (ACPI_FAILURE (Status))
   1243             {
   1244                 return;
   1245             }
   1246         }
   1247 
   1248         /* Dump the Namestring (required) */
   1249 
   1250         AcpiOsPrintf ("\n");
   1251         ArrayOffset = Subtable->NamepathOffset;
   1252         AbsoluteOffset = Offset + ArrayOffset;
   1253         Array = (UINT8 *) Subtable + ArrayOffset;
   1254 
   1255         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
   1256             Subtable->Length, AcpiDmTableInfoDbg2Name);
   1257         if (ACPI_FAILURE (Status))
   1258         {
   1259             return;
   1260         }
   1261 
   1262         /* Dump the OemData (optional) */
   1263 
   1264         if (Subtable->OemDataOffset)
   1265         {
   1266             Status = AcpiDmDumpTable (Length, Subtable->OemDataOffset,
   1267                 Subtable, Subtable->OemDataLength,
   1268                 AcpiDmTableInfoDbg2OemData);
   1269             if (ACPI_FAILURE (Status))
   1270             {
   1271                 return;
   1272             }
   1273         }
   1274 
   1275         /* Point to next subtable */
   1276 
   1277         Offset += Subtable->Length;
   1278         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
   1279             Subtable->Length);
   1280     }
   1281 }
   1282 
   1283 
   1284 /*******************************************************************************
   1285  *
   1286  * FUNCTION:    AcpiDmDumpDmar
   1287  *
   1288  * PARAMETERS:  Table               - A DMAR table
   1289  *
   1290  * RETURN:      None
   1291  *
   1292  * DESCRIPTION: Format the contents of a DMAR. This table type consists
   1293  *              of an open-ended number of subtables.
   1294  *
   1295  ******************************************************************************/
   1296 
   1297 void
   1298 AcpiDmDumpDmar (
   1299     ACPI_TABLE_HEADER       *Table)
   1300 {
   1301     ACPI_STATUS             Status;
   1302     ACPI_DMAR_HEADER        *Subtable;
   1303     UINT32                  Length = Table->Length;
   1304     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
   1305     ACPI_DMTABLE_INFO       *InfoTable;
   1306     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
   1307     UINT32                  ScopeOffset;
   1308     UINT8                   *PciPath;
   1309     UINT32                  PathOffset;
   1310 
   1311 
   1312     /* Main table */
   1313 
   1314     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
   1315     if (ACPI_FAILURE (Status))
   1316     {
   1317         return;
   1318     }
   1319 
   1320     /* Subtables */
   1321 
   1322     Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
   1323     while (Offset < Table->Length)
   1324     {
   1325         /* Common subtable header */
   1326 
   1327         AcpiOsPrintf ("\n");
   1328         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1329             Subtable->Length, AcpiDmTableInfoDmarHdr);
   1330         if (ACPI_FAILURE (Status))
   1331         {
   1332             return;
   1333         }
   1334 
   1335         AcpiOsPrintf ("\n");
   1336 
   1337         switch (Subtable->Type)
   1338         {
   1339         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
   1340 
   1341             InfoTable = AcpiDmTableInfoDmar0;
   1342             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
   1343             break;
   1344 
   1345         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
   1346 
   1347             InfoTable = AcpiDmTableInfoDmar1;
   1348             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
   1349             break;
   1350 
   1351         case ACPI_DMAR_TYPE_ROOT_ATS:
   1352 
   1353             InfoTable = AcpiDmTableInfoDmar2;
   1354             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
   1355             break;
   1356 
   1357         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
   1358 
   1359             InfoTable = AcpiDmTableInfoDmar3;
   1360             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
   1361             break;
   1362 
   1363         case ACPI_DMAR_TYPE_NAMESPACE:
   1364 
   1365             InfoTable = AcpiDmTableInfoDmar4;
   1366             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
   1367             break;
   1368 
   1369         case ACPI_DMAR_TYPE_SATC:
   1370 
   1371             InfoTable = AcpiDmTableInfoDmar5;
   1372             ScopeOffset = sizeof (ACPI_DMAR_SATC);
   1373             break;
   1374 
   1375         case ACPI_DMAR_TYPE_SIDP:
   1376 
   1377             InfoTable = AcpiDmTableInfoDmar6;
   1378             ScopeOffset = sizeof (ACPI_DMAR_SIDP);
   1379             break;
   1380 
   1381         default:
   1382 
   1383             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
   1384                 Subtable->Type);
   1385             return;
   1386         }
   1387 
   1388         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1389             Subtable->Length, InfoTable);
   1390         if (ACPI_FAILURE (Status))
   1391         {
   1392             return;
   1393         }
   1394 
   1395         /*
   1396          * Dump the optional device scope entries
   1397          */
   1398         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
   1399             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
   1400         {
   1401             /* These types do not support device scopes */
   1402 
   1403             goto NextSubtable;
   1404         }
   1405 
   1406         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
   1407         while (ScopeOffset < Subtable->Length)
   1408         {
   1409             AcpiOsPrintf ("\n");
   1410             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
   1411                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
   1412             if (ACPI_FAILURE (Status))
   1413             {
   1414                 return;
   1415             }
   1416             AcpiOsPrintf ("\n");
   1417 
   1418             /* Dump the PCI Path entries for this device scope */
   1419 
   1420             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
   1421 
   1422             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
   1423                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
   1424 
   1425             while (PathOffset < ScopeTable->Length)
   1426             {
   1427                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
   1428                     "PCI Path");
   1429                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
   1430 
   1431                 /* Point to next PCI Path entry */
   1432 
   1433                 PathOffset += 2;
   1434                 PciPath += 2;
   1435                 AcpiOsPrintf ("\n");
   1436             }
   1437 
   1438             /* Point to next device scope entry */
   1439 
   1440             ScopeOffset += ScopeTable->Length;
   1441             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
   1442                 ScopeTable, ScopeTable->Length);
   1443         }
   1444 
   1445 NextSubtable:
   1446         /* Point to next subtable */
   1447 
   1448         Offset += Subtable->Length;
   1449         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
   1450             Subtable->Length);
   1451     }
   1452 }
   1453 
   1454 
   1455 /*******************************************************************************
   1456  *
   1457  * FUNCTION:    AcpiDmDumpDrtm
   1458  *
   1459  * PARAMETERS:  Table               - A DRTM table
   1460  *
   1461  * RETURN:      None
   1462  *
   1463  * DESCRIPTION: Format the contents of a DRTM.
   1464  *
   1465  ******************************************************************************/
   1466 
   1467 void
   1468 AcpiDmDumpDrtm (
   1469     ACPI_TABLE_HEADER       *Table)
   1470 {
   1471     ACPI_STATUS             Status;
   1472     UINT32                  Offset;
   1473     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
   1474     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
   1475     ACPI_DRTM_DPS_ID        *DrtmDps;
   1476     UINT32                  Count;
   1477 
   1478 
   1479     /* Main table */
   1480 
   1481     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
   1482         AcpiDmTableInfoDrtm);
   1483     if (ACPI_FAILURE (Status))
   1484     {
   1485         return;
   1486     }
   1487 
   1488     Offset = sizeof (ACPI_TABLE_DRTM);
   1489 
   1490     /* Sub-tables */
   1491 
   1492     /* Dump ValidatedTable length */
   1493 
   1494     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
   1495     AcpiOsPrintf ("\n");
   1496     Status = AcpiDmDumpTable (Table->Length, Offset,
   1497         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
   1498         AcpiDmTableInfoDrtm0);
   1499     if (ACPI_FAILURE (Status))
   1500     {
   1501             return;
   1502     }
   1503 
   1504     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
   1505 
   1506     /* Dump Validated table addresses */
   1507 
   1508     Count = 0;
   1509     while ((Offset < Table->Length) &&
   1510             (DrtmVtl->ValidatedTableCount > Count))
   1511     {
   1512         Status = AcpiDmDumpTable (Table->Length, Offset,
   1513             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
   1514             AcpiDmTableInfoDrtm0a);
   1515         if (ACPI_FAILURE (Status))
   1516         {
   1517             return;
   1518         }
   1519 
   1520         Offset += sizeof (UINT64);
   1521         Count++;
   1522     }
   1523 
   1524     /* Dump ResourceList length */
   1525 
   1526     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
   1527     AcpiOsPrintf ("\n");
   1528     Status = AcpiDmDumpTable (Table->Length, Offset,
   1529         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
   1530         AcpiDmTableInfoDrtm1);
   1531     if (ACPI_FAILURE (Status))
   1532     {
   1533         return;
   1534     }
   1535 
   1536     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
   1537 
   1538     /* Dump the Resource List */
   1539 
   1540     Count = 0;
   1541     while ((Offset < Table->Length) &&
   1542            (DrtmRl->ResourceCount > Count))
   1543     {
   1544         Status = AcpiDmDumpTable (Table->Length, Offset,
   1545             ACPI_ADD_PTR (void, Table, Offset),
   1546             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
   1547         if (ACPI_FAILURE (Status))
   1548         {
   1549             return;
   1550         }
   1551 
   1552         Offset += sizeof (ACPI_DRTM_RESOURCE);
   1553         Count++;
   1554     }
   1555 
   1556     /* Dump DPS */
   1557 
   1558     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
   1559     AcpiOsPrintf ("\n");
   1560     (void) AcpiDmDumpTable (Table->Length, Offset,
   1561         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
   1562 }
   1563 
   1564 
   1565 /*******************************************************************************
   1566  *
   1567  * FUNCTION:    AcpiDmDumpDtpr
   1568  *
   1569  * PARAMETERS:  Table               - A DTPR table
   1570  *
   1571  * RETURN:      None
   1572  *
   1573  * DESCRIPTION: Format the contents of a DTPR.
   1574  *
   1575  ******************************************************************************/
   1576 
   1577 void
   1578 AcpiDmDumpDtpr (
   1579     ACPI_TABLE_HEADER       *Table)
   1580 {
   1581     ACPI_STATUS                Status;
   1582     ACPI_TPR_ARRAY             *TprArr;
   1583     ACPI_TPR_INSTANCE          *TprInstance;
   1584     ACPI_TPR_AUX_SR            *TprAuxSr;
   1585     ACPI_TPR_SERIALIZE_REQUEST *TprSerializeRequest;
   1586     UINT32                     i = 0, j, InsCnt, TprRefCnt;
   1587     UINT32                     Offset = sizeof(ACPI_TABLE_DTPR);
   1588 
   1589     /* Main table */
   1590 
   1591     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoDtpr);
   1592     if (ACPI_FAILURE (Status))
   1593     {
   1594         return;
   1595     }
   1596 
   1597     /* Subtables */
   1598 
   1599     while (Offset < Table->Length)
   1600     {
   1601         InsCnt = ((ACPI_TABLE_DTPR*) Table)->InsCnt;
   1602 
   1603         for (i = 0; i < InsCnt; i++)
   1604         {
   1605             TprInstance = ACPI_ADD_PTR(ACPI_TPR_INSTANCE, Table, Offset);
   1606             Status = AcpiDmDumpTable(Table->Length, Offset, TprInstance,
   1607                                      sizeof(ACPI_TPR_INSTANCE), AcpiDmTableInfoDtprInstance);
   1608             if (ACPI_FAILURE (Status))
   1609             {
   1610                 return;
   1611             }
   1612 
   1613                 /* Each of the TPR instances must have the same number of TPRs*/
   1614             TprRefCnt = TprInstance->TprCnt;
   1615 
   1616             Offset += sizeof(ACPI_TPR_INSTANCE);
   1617 
   1618             if (TprInstance->TprCnt < 2)
   1619             {
   1620                 AcpiOsPrintf("TPR Instance No.%d has invalid number of TPRs.\n"
   1621                              "There should be at least 2 of them, but there is %d.",
   1622                              i, TprInstance->TprCnt);
   1623                 return;
   1624             }
   1625             else
   1626             {
   1627                 if (TprInstance->TprCnt != TprRefCnt)
   1628                 {
   1629                     AcpiOsPrintf("Each of TPR instances should have equal\n"
   1630                                  "number of TPRs. TprInstance No.%d has %d TPRs"
   1631                                  ", while the reference TPR instance has %d.\n",
   1632                                  i, TprInstance->TprCnt, TprRefCnt);
   1633                     return;
   1634                 }
   1635             }
   1636 
   1637             for (j = 0; j < TprInstance->TprCnt; j++)
   1638             {
   1639                 TprArr = ACPI_ADD_PTR(ACPI_TPR_ARRAY, Table, Offset);
   1640                 Status = AcpiDmDumpTable(Table->Length, Offset, TprArr,
   1641                                          sizeof(ACPI_TPR_ARRAY), AcpiDmTableInfoDtprArr);
   1642                 if (ACPI_FAILURE (Status))
   1643                 {
   1644                     return;
   1645                 }
   1646 
   1647                 Offset += sizeof(ACPI_TPR_ARRAY);
   1648             }
   1649         }
   1650 
   1651         TprAuxSr = ACPI_ADD_PTR(ACPI_TPR_AUX_SR, Table, Offset);
   1652         Status = AcpiDmDumpTable(Table->Length, Offset, TprAuxSr,
   1653                                  sizeof(ACPI_TPR_AUX_SR), AcpiDmTableInfoDtprSerializeReq0);
   1654 
   1655         Offset += sizeof(ACPI_TPR_AUX_SR);
   1656 
   1657         for (i = 0; i < TprAuxSr->SrlCnt; i++)
   1658         {
   1659             TprSerializeRequest = ACPI_ADD_PTR(ACPI_TPR_SERIALIZE_REQUEST,
   1660                                                Table, Offset);
   1661             Status = AcpiDmDumpTable(Table->Length, Offset, TprSerializeRequest,
   1662                                      sizeof(ACPI_TPR_SERIALIZE_REQUEST), AcpiDmTableInfoDtprSerializeReq1);
   1663             if (ACPI_FAILURE (Status))
   1664             {
   1665                 return;
   1666             }
   1667 
   1668             Offset += sizeof(ACPI_TPR_SERIALIZE_REQUEST);
   1669         }
   1670     }
   1671 }
   1672 
   1673 
   1674 /*******************************************************************************
   1675  *
   1676  * FUNCTION:    AcpiDmDumpEinj
   1677  *
   1678  * PARAMETERS:  Table               - A EINJ table
   1679  *
   1680  * RETURN:      None
   1681  *
   1682  * DESCRIPTION: Format the contents of a EINJ. This table type consists
   1683  *              of an open-ended number of subtables.
   1684  *
   1685  ******************************************************************************/
   1686 
   1687 void
   1688 AcpiDmDumpEinj (
   1689     ACPI_TABLE_HEADER       *Table)
   1690 {
   1691     ACPI_STATUS             Status;
   1692     ACPI_WHEA_HEADER        *Subtable;
   1693     UINT32                  Length = Table->Length;
   1694     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
   1695 
   1696 
   1697     /* Main table */
   1698 
   1699     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
   1700     if (ACPI_FAILURE (Status))
   1701     {
   1702         return;
   1703     }
   1704 
   1705     /* Subtables */
   1706 
   1707     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1708     while (Offset < Table->Length)
   1709     {
   1710         AcpiOsPrintf ("\n");
   1711         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1712             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
   1713         if (ACPI_FAILURE (Status))
   1714         {
   1715             return;
   1716         }
   1717 
   1718         /* Point to next subtable (each subtable is of fixed length) */
   1719 
   1720         Offset += sizeof (ACPI_WHEA_HEADER);
   1721         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1722             sizeof (ACPI_WHEA_HEADER));
   1723     }
   1724 }
   1725 
   1726 
   1727 /*******************************************************************************
   1728  *
   1729  * FUNCTION:    AcpiDmDumpErdt
   1730  *
   1731  * PARAMETERS:  Table               - A ERDT table
   1732  *
   1733  * RETURN:      None
   1734  *
   1735  * DESCRIPTION: Format the contents of a ERDT. This table type consists
   1736  *              of an open-ended number of subtables.
   1737  *
   1738  ******************************************************************************/
   1739 
   1740 void
   1741 AcpiDmDumpErdt (
   1742     ACPI_TABLE_HEADER       *Table)
   1743 {
   1744     ACPI_STATUS             Status;
   1745     ACPI_SUBTBL_HDR_16      *Subtable, *Subsubtable;
   1746     ACPI_ERDT_DACD_PATHS    *ScopeTable;
   1747     UINT32                  Offset = sizeof (ACPI_TABLE_ERDT);
   1748     UINT32                  Suboffset;
   1749     UINT32                  ScopeOffset;
   1750     UINT32                  SubsubtableLength = 0;
   1751     ACPI_DMTABLE_INFO       *InfoTable, *TrailEntries, *DacdEntries;
   1752     UINT32                  NumTrailers = 0;
   1753 
   1754     /* Main table */
   1755 
   1756     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoErdt);
   1757     if (ACPI_FAILURE (Status))
   1758     {
   1759         return;
   1760     }
   1761 
   1762     /* Subtables */
   1763     Subtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Offset);
   1764     while (Offset < Table->Length)
   1765     {
   1766 
   1767         /* Dump common header */
   1768 
   1769         AcpiOsPrintf ("\n");
   1770         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1771             Subtable->Length, AcpiDmTableInfoErdtHdr);
   1772         if (ACPI_FAILURE (Status))
   1773         {
   1774             return;
   1775         }
   1776 
   1777         AcpiOsPrintf ("\n");
   1778         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1779             Subtable->Length, AcpiDmTableInfoErdtRmdd);
   1780         if (ACPI_FAILURE (Status))
   1781         {
   1782             return;
   1783         }
   1784 
   1785         /* Subtables of this RMDD table */
   1786 
   1787         Suboffset = Offset + sizeof(ACPI_ERDT_RMDD);
   1788         Subsubtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Suboffset);
   1789         while (Suboffset < Offset + Subtable->Length)
   1790         {
   1791             AcpiOsPrintf ("\n");
   1792 
   1793             TrailEntries = NULL;
   1794             DacdEntries = NULL;
   1795             switch (Subsubtable->Type)
   1796             {
   1797             case ACPI_ERDT_TYPE_CACD:
   1798                  InfoTable = AcpiDmTableInfoErdtCacd;
   1799                  TrailEntries = AcpiDmTableInfoErdtCacdX2apic;
   1800                  SubsubtableLength = sizeof(ACPI_ERDT_CACD);
   1801                  break;
   1802 
   1803             case ACPI_ERDT_TYPE_DACD:
   1804                  InfoTable = AcpiDmTableInfoErdtDacd;
   1805                  DacdEntries = AcpiDmTableInfoErdtDacdScope;
   1806                  SubsubtableLength = sizeof(ACPI_ERDT_DACD);
   1807                  break;
   1808 
   1809             case ACPI_ERDT_TYPE_CMRC:
   1810                  InfoTable = AcpiDmTableInfoErdtCmrc;
   1811                  break;
   1812 
   1813             case ACPI_ERDT_TYPE_MMRC:
   1814                  InfoTable = AcpiDmTableInfoErdtMmrc;
   1815                  TrailEntries = AcpiDmTableInfoErdtMmrcCorrFactor;
   1816                  SubsubtableLength = sizeof(ACPI_ERDT_MMRC);
   1817                  break;
   1818 
   1819             case ACPI_ERDT_TYPE_MARC:
   1820                  InfoTable = AcpiDmTableInfoErdtMarc;
   1821                  break;
   1822 
   1823             case ACPI_ERDT_TYPE_CARC:
   1824                  InfoTable = AcpiDmTableInfoErdtCarc;
   1825                  break;
   1826 
   1827             case ACPI_ERDT_TYPE_CMRD:
   1828                  InfoTable = AcpiDmTableInfoErdtCmrd;
   1829                  break;
   1830 
   1831             case ACPI_ERDT_TYPE_IBRD:
   1832                  InfoTable = AcpiDmTableInfoErdtIbrd;
   1833                  TrailEntries = AcpiDmTableInfoErdtIbrdCorrFactor;
   1834                  SubsubtableLength = sizeof(ACPI_ERDT_IBRD);
   1835                  break;
   1836 
   1837             case ACPI_ERDT_TYPE_IBAD:
   1838                  InfoTable = AcpiDmTableInfoErdtIbad;
   1839                  break;
   1840 
   1841             case ACPI_ERDT_TYPE_CARD:
   1842                  InfoTable = AcpiDmTableInfoErdtCard;
   1843                  break;
   1844 
   1845             default:
   1846                 AcpiOsPrintf ("\n**** Unknown RMDD subtable type 0x%X\n",
   1847                     Subsubtable->Type);
   1848 
   1849                 /* Attempt to continue */
   1850 
   1851                 if (!Subsubtable->Length)
   1852                 {
   1853                     AcpiOsPrintf ("Invalid zero length subtable\n");
   1854                     return;
   1855                 }
   1856                 goto NextSubsubtable;
   1857             }
   1858 
   1859             /* Dump subtable header */
   1860 
   1861             Status = AcpiDmDumpTable (Table->Length, Suboffset, Subsubtable,
   1862                 Subsubtable->Length, AcpiDmTableInfoErdtHdr);
   1863             if (ACPI_FAILURE (Status))
   1864             {
   1865                 return;
   1866             }
   1867 
   1868             /* Dump subtable body */
   1869 
   1870             Status = AcpiDmDumpTable (Table->Length, Suboffset, Subsubtable,
   1871                 Subsubtable->Length, InfoTable);
   1872             if (ACPI_FAILURE (Status))
   1873             {
   1874                 return;
   1875             }
   1876 
   1877             /* CACD, MMRC, and IBRD subtables have simple flex array at end */
   1878 
   1879             if (TrailEntries)
   1880             {
   1881                 NumTrailers = 0;
   1882                 while (NumTrailers < Subsubtable->Length - SubsubtableLength)
   1883                 {
   1884 
   1885                     /* Dump one flex array element */
   1886 
   1887                     Status = AcpiDmDumpTable (Table->Length, Suboffset +
   1888                         SubsubtableLength + NumTrailers,
   1889                         ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Subsubtable,
   1890                             SubsubtableLength + NumTrailers),
   1891                         sizeof(UINT32), TrailEntries);
   1892                     if (ACPI_FAILURE (Status))
   1893                     {
   1894                         return;
   1895                     }
   1896                     NumTrailers += sizeof(UINT32);
   1897                 }
   1898             }
   1899 
   1900             /* DACD subtable has flex array of device agent structures */
   1901 
   1902             if (DacdEntries) {
   1903                  ScopeOffset = Suboffset + SubsubtableLength;
   1904                  ScopeTable = ACPI_ADD_PTR (ACPI_ERDT_DACD_PATHS,
   1905                      Subsubtable, SubsubtableLength);
   1906                  while (ScopeOffset < Suboffset + Subsubtable->Length)
   1907                  {
   1908                      /* Dump one device agent structure */
   1909 
   1910                      AcpiOsPrintf ("\n");
   1911                      Status = AcpiDmDumpTable (Table->Length, ScopeOffset,
   1912                          ScopeTable, ScopeTable->Header.Length, DacdEntries);
   1913                      if (ACPI_FAILURE (Status))
   1914                      {
   1915                          return;
   1916                      }
   1917 
   1918                      /* Flex array of UINT8 for device path */
   1919 
   1920                      NumTrailers = 0;
   1921                      while (NumTrailers < ScopeTable->Header.Length - sizeof(ACPI_ERDT_DACD_PATHS))
   1922                      {
   1923                          /* Dump one UINT8 of the device path */
   1924 
   1925                          Status = AcpiDmDumpTable (Table->Length, ScopeOffset +
   1926                              sizeof(ACPI_ERDT_DACD_PATHS) + NumTrailers,
   1927                              ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, ScopeTable,
   1928                                  sizeof(*ScopeTable) + NumTrailers),
   1929                              sizeof(UINT32), AcpiDmTableInfoErdtDacdPath);
   1930                          if (ACPI_FAILURE (Status))
   1931                          {
   1932                              return;
   1933                          }
   1934                          NumTrailers++;
   1935                      }
   1936 
   1937                      ScopeOffset += ScopeTable->Header.Length;
   1938                      ScopeTable = ACPI_ADD_PTR (ACPI_ERDT_DACD_PATHS,
   1939                          ScopeTable, ScopeTable->Header.Length);
   1940                  }
   1941             }
   1942 NextSubsubtable:
   1943             Suboffset += Subsubtable->Length;
   1944             Subsubtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Suboffset);
   1945         }
   1946 
   1947         Offset += Subtable->Length;
   1948         Subtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Subtable,
   1949             Subtable->Length);
   1950     }
   1951 }
   1952 
   1953 
   1954 /*******************************************************************************
   1955  *
   1956  * FUNCTION:    AcpiDmDumpErst
   1957  *
   1958  * PARAMETERS:  Table               - A ERST table
   1959  *
   1960  * RETURN:      None
   1961  *
   1962  * DESCRIPTION: Format the contents of a ERST. This table type consists
   1963  *              of an open-ended number of subtables.
   1964  *
   1965  ******************************************************************************/
   1966 
   1967 void
   1968 AcpiDmDumpErst (
   1969     ACPI_TABLE_HEADER       *Table)
   1970 {
   1971     ACPI_STATUS             Status;
   1972     ACPI_WHEA_HEADER        *Subtable;
   1973     UINT32                  Length = Table->Length;
   1974     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
   1975 
   1976 
   1977     /* Main table */
   1978 
   1979     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
   1980     if (ACPI_FAILURE (Status))
   1981     {
   1982         return;
   1983     }
   1984 
   1985     /* Subtables */
   1986 
   1987     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1988     while (Offset < Table->Length)
   1989     {
   1990         AcpiOsPrintf ("\n");
   1991         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1992             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
   1993         if (ACPI_FAILURE (Status))
   1994         {
   1995             return;
   1996         }
   1997 
   1998         /* Point to next subtable (each subtable is of fixed length) */
   1999 
   2000         Offset += sizeof (ACPI_WHEA_HEADER);
   2001         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   2002             sizeof (ACPI_WHEA_HEADER));
   2003     }
   2004 }
   2005 
   2006 
   2007 /*******************************************************************************
   2008  *
   2009  * FUNCTION:    AcpiDmDumpFpdt
   2010  *
   2011  * PARAMETERS:  Table               - A FPDT table
   2012  *
   2013  * RETURN:      None
   2014  *
   2015  * DESCRIPTION: Format the contents of a FPDT. This table type consists
   2016  *              of an open-ended number of subtables.
   2017  *
   2018  ******************************************************************************/
   2019 
   2020 void
   2021 AcpiDmDumpFpdt (
   2022     ACPI_TABLE_HEADER       *Table)
   2023 {
   2024     ACPI_STATUS             Status;
   2025     ACPI_FPDT_HEADER        *Subtable;
   2026     UINT32                  Length = Table->Length;
   2027     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   2028     ACPI_DMTABLE_INFO       *InfoTable;
   2029 
   2030 
   2031     /* There is no main table (other than the standard ACPI header) */
   2032 
   2033     /* Subtables */
   2034 
   2035     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
   2036     while (Offset < Table->Length)
   2037     {
   2038         /* Common subtable header */
   2039 
   2040         AcpiOsPrintf ("\n");
   2041         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2042             Subtable->Length, AcpiDmTableInfoFpdtHdr);
   2043         if (ACPI_FAILURE (Status))
   2044         {
   2045             return;
   2046         }
   2047 
   2048         switch (Subtable->Type)
   2049         {
   2050         case ACPI_FPDT_TYPE_BOOT:
   2051 
   2052             InfoTable = AcpiDmTableInfoFpdt0;
   2053             break;
   2054 
   2055         case ACPI_FPDT_TYPE_S3PERF:
   2056 
   2057             InfoTable = AcpiDmTableInfoFpdt1;
   2058             break;
   2059 
   2060         default:
   2061 
   2062             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
   2063                 Subtable->Type);
   2064 
   2065             /* Attempt to continue */
   2066 
   2067             if (!Subtable->Length)
   2068             {
   2069                 AcpiOsPrintf ("Invalid zero length subtable\n");
   2070                 return;
   2071             }
   2072             goto NextSubtable;
   2073         }
   2074 
   2075         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2076             Subtable->Length, InfoTable);
   2077         if (ACPI_FAILURE (Status))
   2078         {
   2079             return;
   2080         }
   2081 
   2082 NextSubtable:
   2083         /* Point to next subtable */
   2084 
   2085         Offset += Subtable->Length;
   2086         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
   2087             Subtable->Length);
   2088     }
   2089 }
   2090 
   2091 
   2092 /*******************************************************************************
   2093  *
   2094  * FUNCTION:    AcpiDmDumpGtdt
   2095  *
   2096  * PARAMETERS:  Table               - A GTDT table
   2097  *
   2098  * RETURN:      None
   2099  *
   2100  * DESCRIPTION: Format the contents of a GTDT. This table type consists
   2101  *              of an open-ended number of subtables.
   2102  *
   2103  ******************************************************************************/
   2104 
   2105 void
   2106 AcpiDmDumpGtdt (
   2107     ACPI_TABLE_HEADER       *Table)
   2108 {
   2109     ACPI_STATUS             Status;
   2110     ACPI_GTDT_HEADER        *Subtable;
   2111     UINT32                  Length = Table->Length;
   2112     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
   2113     ACPI_DMTABLE_INFO       *InfoTable;
   2114     UINT32                  SubtableLength;
   2115     UINT32                  GtCount;
   2116     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
   2117 
   2118 
   2119     /* Main table */
   2120 
   2121     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
   2122     if (ACPI_FAILURE (Status))
   2123     {
   2124         return;
   2125     }
   2126 
   2127     /* Rev 3 fields */
   2128 
   2129     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   2130 
   2131     if (Table->Revision > 2)
   2132     {
   2133         SubtableLength = sizeof (ACPI_GTDT_EL2);
   2134         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2135             SubtableLength, AcpiDmTableInfoGtdtEl2);
   2136         if (ACPI_FAILURE (Status))
   2137         {
   2138             return;
   2139         }
   2140         Offset += SubtableLength;
   2141     }
   2142 
   2143     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   2144 
   2145     /* Subtables */
   2146 
   2147     while (Offset < Table->Length)
   2148     {
   2149         /* Common subtable header */
   2150 
   2151         AcpiOsPrintf ("\n");
   2152         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2153             Subtable->Length, AcpiDmTableInfoGtdtHdr);
   2154         if (ACPI_FAILURE (Status))
   2155         {
   2156             return;
   2157         }
   2158 
   2159         GtCount = 0;
   2160         switch (Subtable->Type)
   2161         {
   2162         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   2163 
   2164             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
   2165             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   2166                 Subtable))->TimerCount;
   2167 
   2168             InfoTable = AcpiDmTableInfoGtdt0;
   2169             break;
   2170 
   2171         case ACPI_GTDT_TYPE_WATCHDOG:
   2172 
   2173             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
   2174 
   2175             InfoTable = AcpiDmTableInfoGtdt1;
   2176             break;
   2177 
   2178         default:
   2179 
   2180             /* Cannot continue on unknown type - no length */
   2181 
   2182             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
   2183                 Subtable->Type);
   2184             return;
   2185         }
   2186 
   2187         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2188             Subtable->Length, InfoTable);
   2189         if (ACPI_FAILURE (Status))
   2190         {
   2191             return;
   2192         }
   2193 
   2194         /* Point to end of current subtable (each subtable above is of fixed length) */
   2195 
   2196         Offset += SubtableLength;
   2197 
   2198         /* If there are any Gt Timer Blocks from above, dump them now */
   2199 
   2200         if (GtCount)
   2201         {
   2202             GtxTable = ACPI_ADD_PTR (
   2203                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
   2204             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
   2205 
   2206             while (GtCount)
   2207             {
   2208                 AcpiOsPrintf ("\n");
   2209                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
   2210                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
   2211                 if (ACPI_FAILURE (Status))
   2212                 {
   2213                     return;
   2214                 }
   2215                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
   2216                 GtxTable++;
   2217                 GtCount--;
   2218             }
   2219         }
   2220 
   2221         /* Point to next subtable */
   2222 
   2223         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
   2224     }
   2225 }
   2226 
   2227 
   2228 /*******************************************************************************
   2229  *
   2230  * FUNCTION:    AcpiDmDumpHest
   2231  *
   2232  * PARAMETERS:  Table               - A HEST table
   2233  *
   2234  * RETURN:      None
   2235  *
   2236  * DESCRIPTION: Format the contents of a HEST. This table type consists
   2237  *              of an open-ended number of subtables.
   2238  *
   2239  ******************************************************************************/
   2240 
   2241 void
   2242 AcpiDmDumpHest (
   2243     ACPI_TABLE_HEADER       *Table)
   2244 {
   2245     ACPI_STATUS             Status;
   2246     ACPI_HEST_HEADER        *Subtable;
   2247     UINT32                  Length = Table->Length;
   2248     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
   2249     ACPI_DMTABLE_INFO       *InfoTable;
   2250     UINT32                  SubtableLength;
   2251     UINT32                  BankCount;
   2252     ACPI_HEST_IA_ERROR_BANK *BankTable;
   2253 
   2254 
   2255     /* Main table */
   2256 
   2257     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
   2258     if (ACPI_FAILURE (Status))
   2259     {
   2260         return;
   2261     }
   2262 
   2263     /* Subtables */
   2264 
   2265     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
   2266     while (Offset < Table->Length)
   2267     {
   2268         BankCount = 0;
   2269         switch (Subtable->Type)
   2270         {
   2271         case ACPI_HEST_TYPE_IA32_CHECK:
   2272 
   2273             InfoTable = AcpiDmTableInfoHest0;
   2274             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
   2275             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   2276                 Subtable))->NumHardwareBanks;
   2277             break;
   2278 
   2279         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   2280 
   2281             InfoTable = AcpiDmTableInfoHest1;
   2282             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
   2283             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   2284                 Subtable))->NumHardwareBanks;
   2285             break;
   2286 
   2287         case ACPI_HEST_TYPE_IA32_NMI:
   2288 
   2289             InfoTable = AcpiDmTableInfoHest2;
   2290             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
   2291             break;
   2292 
   2293         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   2294 
   2295             InfoTable = AcpiDmTableInfoHest6;
   2296             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
   2297             break;
   2298 
   2299         case ACPI_HEST_TYPE_AER_ENDPOINT:
   2300 
   2301             InfoTable = AcpiDmTableInfoHest7;
   2302             SubtableLength = sizeof (ACPI_HEST_AER);
   2303             break;
   2304 
   2305         case ACPI_HEST_TYPE_AER_BRIDGE:
   2306 
   2307             InfoTable = AcpiDmTableInfoHest8;
   2308             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
   2309             break;
   2310 
   2311         case ACPI_HEST_TYPE_GENERIC_ERROR:
   2312 
   2313             InfoTable = AcpiDmTableInfoHest9;
   2314             SubtableLength = sizeof (ACPI_HEST_GENERIC);
   2315             break;
   2316 
   2317         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
   2318 
   2319             InfoTable = AcpiDmTableInfoHest10;
   2320             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
   2321             break;
   2322 
   2323         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   2324 
   2325             InfoTable = AcpiDmTableInfoHest11;
   2326             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
   2327             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
   2328                 Subtable))->NumHardwareBanks;
   2329             break;
   2330 
   2331         default:
   2332 
   2333             /* Cannot continue on unknown type - no length */
   2334 
   2335             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
   2336                 Subtable->Type);
   2337             return;
   2338         }
   2339 
   2340         AcpiOsPrintf ("\n");
   2341         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2342             SubtableLength, InfoTable);
   2343         if (ACPI_FAILURE (Status))
   2344         {
   2345             return;
   2346         }
   2347 
   2348         /* Point to end of current subtable (each subtable above is of fixed length) */
   2349 
   2350         Offset += SubtableLength;
   2351 
   2352         /* If there are any (fixed-length) Error Banks from above, dump them now */
   2353 
   2354         if (BankCount)
   2355         {
   2356             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
   2357                 SubtableLength);
   2358             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
   2359 
   2360             while (BankCount)
   2361             {
   2362                 AcpiOsPrintf ("\n");
   2363                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
   2364                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
   2365                 if (ACPI_FAILURE (Status))
   2366                 {
   2367                     return;
   2368                 }
   2369 
   2370                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
   2371                 BankTable++;
   2372                 BankCount--;
   2373             }
   2374         }
   2375 
   2376         /* Point to next subtable */
   2377 
   2378         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
   2379     }
   2380 }
   2381 
   2382 
   2383 /*******************************************************************************
   2384  *
   2385  * FUNCTION:    AcpiDmDumpHmat
   2386  *
   2387  * PARAMETERS:  Table               - A HMAT table
   2388  *
   2389  * RETURN:      None
   2390  *
   2391  * DESCRIPTION: Format the contents of a HMAT.
   2392  *
   2393  ******************************************************************************/
   2394 
   2395 void
   2396 AcpiDmDumpHmat (
   2397     ACPI_TABLE_HEADER       *Table)
   2398 {
   2399     ACPI_STATUS             Status;
   2400     ACPI_HMAT_STRUCTURE     *HmatStruct;
   2401     ACPI_HMAT_LOCALITY      *HmatLocality;
   2402     ACPI_HMAT_CACHE         *HmatCache;
   2403     UINT32                  Offset;
   2404     UINT32                  SubtableOffset;
   2405     UINT32                  Length;
   2406     ACPI_DMTABLE_INFO       *InfoTable;
   2407     UINT32                  i, j;
   2408 
   2409 
   2410     /* Main table */
   2411 
   2412     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
   2413     if (ACPI_FAILURE (Status))
   2414     {
   2415         return;
   2416     }
   2417     Offset = sizeof (ACPI_TABLE_HMAT);
   2418 
   2419     while (Offset < Table->Length)
   2420     {
   2421         AcpiOsPrintf ("\n");
   2422 
   2423         /* Dump HMAT structure header */
   2424 
   2425         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
   2426         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
   2427         {
   2428             AcpiOsPrintf ("Invalid HMAT structure length\n");
   2429             return;
   2430         }
   2431         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   2432             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
   2433         if (ACPI_FAILURE (Status))
   2434         {
   2435             return;
   2436         }
   2437 
   2438         switch (HmatStruct->Type)
   2439         {
   2440         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
   2441 
   2442             InfoTable = AcpiDmTableInfoHmat0;
   2443             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
   2444             break;
   2445 
   2446         case ACPI_HMAT_TYPE_LOCALITY:
   2447 
   2448             InfoTable = AcpiDmTableInfoHmat1;
   2449             Length = sizeof (ACPI_HMAT_LOCALITY);
   2450             break;
   2451 
   2452         case ACPI_HMAT_TYPE_CACHE:
   2453 
   2454             InfoTable = AcpiDmTableInfoHmat2;
   2455             Length = sizeof (ACPI_HMAT_CACHE);
   2456             break;
   2457 
   2458         default:
   2459 
   2460             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
   2461                 HmatStruct->Type);
   2462 
   2463             /* Attempt to continue */
   2464 
   2465             goto NextSubtable;
   2466         }
   2467 
   2468         /* Dump HMAT structure body */
   2469 
   2470         if (HmatStruct->Length < Length)
   2471         {
   2472             AcpiOsPrintf ("Invalid HMAT structure length\n");
   2473             return;
   2474         }
   2475         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   2476             HmatStruct->Length, InfoTable);
   2477         if (ACPI_FAILURE (Status))
   2478         {
   2479             return;
   2480         }
   2481 
   2482         /* Dump HMAT structure additional */
   2483 
   2484         switch (HmatStruct->Type)
   2485         {
   2486         case ACPI_HMAT_TYPE_LOCALITY:
   2487 
   2488             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
   2489             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
   2490 
   2491             /* Dump initiator proximity domains */
   2492 
   2493             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2494                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
   2495             {
   2496                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
   2497                 return;
   2498             }
   2499             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   2500             {
   2501                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2502                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2503                     4, AcpiDmTableInfoHmat1a);
   2504                 if (ACPI_FAILURE (Status))
   2505                 {
   2506                     return;
   2507                 }
   2508 
   2509                 SubtableOffset += 4;
   2510             }
   2511 
   2512             /* Dump target proximity domains */
   2513 
   2514             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2515                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
   2516             {
   2517                 AcpiOsPrintf ("Invalid target proximity domain number\n");
   2518                 return;
   2519             }
   2520             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
   2521             {
   2522                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2523                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2524                     4, AcpiDmTableInfoHmat1b);
   2525                 if (ACPI_FAILURE (Status))
   2526                 {
   2527                     return;
   2528                 }
   2529 
   2530                 SubtableOffset += 4;
   2531             }
   2532 
   2533             /* Dump latency/bandwidth entris */
   2534 
   2535             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2536                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
   2537                          HmatLocality->NumberOfTargetPDs * 2))
   2538             {
   2539                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
   2540                 return;
   2541             }
   2542             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   2543             {
   2544                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
   2545                 {
   2546                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2547                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2548                         2, AcpiDmTableInfoHmat1c);
   2549                     if (ACPI_FAILURE(Status))
   2550                     {
   2551                         return;
   2552                     }
   2553 
   2554                     SubtableOffset += 2;
   2555                 }
   2556             }
   2557             break;
   2558 
   2559         case ACPI_HMAT_TYPE_CACHE:
   2560 
   2561             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
   2562             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
   2563 
   2564             /* Dump SMBIOS handles */
   2565 
   2566             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2567                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
   2568             {
   2569                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
   2570                 return;
   2571             }
   2572             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
   2573             {
   2574                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2575                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2576                     2, AcpiDmTableInfoHmat2a);
   2577                 if (ACPI_FAILURE (Status))
   2578                 {
   2579                     return;
   2580                 }
   2581 
   2582                 SubtableOffset += 2;
   2583             }
   2584             break;
   2585 
   2586         default:
   2587 
   2588             break;
   2589         }
   2590 
   2591 NextSubtable:
   2592         /* Point to next HMAT structure subtable */
   2593 
   2594         Offset += (HmatStruct->Length);
   2595     }
   2596 }
   2597