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 - 2025, 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:    AcpiDmDumpEinj
   1568  *
   1569  * PARAMETERS:  Table               - A EINJ table
   1570  *
   1571  * RETURN:      None
   1572  *
   1573  * DESCRIPTION: Format the contents of a EINJ. This table type consists
   1574  *              of an open-ended number of subtables.
   1575  *
   1576  ******************************************************************************/
   1577 
   1578 void
   1579 AcpiDmDumpEinj (
   1580     ACPI_TABLE_HEADER       *Table)
   1581 {
   1582     ACPI_STATUS             Status;
   1583     ACPI_WHEA_HEADER        *Subtable;
   1584     UINT32                  Length = Table->Length;
   1585     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
   1586 
   1587 
   1588     /* Main table */
   1589 
   1590     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
   1591     if (ACPI_FAILURE (Status))
   1592     {
   1593         return;
   1594     }
   1595 
   1596     /* Subtables */
   1597 
   1598     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1599     while (Offset < Table->Length)
   1600     {
   1601         AcpiOsPrintf ("\n");
   1602         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1603             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
   1604         if (ACPI_FAILURE (Status))
   1605         {
   1606             return;
   1607         }
   1608 
   1609         /* Point to next subtable (each subtable is of fixed length) */
   1610 
   1611         Offset += sizeof (ACPI_WHEA_HEADER);
   1612         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1613             sizeof (ACPI_WHEA_HEADER));
   1614     }
   1615 }
   1616 
   1617 
   1618 /*******************************************************************************
   1619  *
   1620  * FUNCTION:    AcpiDmDumpErdt
   1621  *
   1622  * PARAMETERS:  Table               - A ERDT table
   1623  *
   1624  * RETURN:      None
   1625  *
   1626  * DESCRIPTION: Format the contents of a ERDT. This table type consists
   1627  *              of an open-ended number of subtables.
   1628  *
   1629  ******************************************************************************/
   1630 
   1631 void
   1632 AcpiDmDumpErdt (
   1633     ACPI_TABLE_HEADER       *Table)
   1634 {
   1635     ACPI_STATUS             Status;
   1636     ACPI_SUBTBL_HDR_16      *Subtable, *Subsubtable;
   1637     ACPI_ERDT_DACD_PATHS    *ScopeTable;
   1638     UINT32                  Offset = sizeof (ACPI_TABLE_ERDT);
   1639     UINT32                  Suboffset;
   1640     UINT32                  ScopeOffset;
   1641     UINT32                  SubsubtableLength = 0;
   1642     ACPI_DMTABLE_INFO       *InfoTable, *TrailEntries, *DacdEntries;
   1643     UINT32                  NumTrailers = 0;
   1644 
   1645     /* Main table */
   1646 
   1647     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoErdt);
   1648     if (ACPI_FAILURE (Status))
   1649     {
   1650         return;
   1651     }
   1652 
   1653     /* Subtables */
   1654     Subtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Offset);
   1655     while (Offset < Table->Length)
   1656     {
   1657 
   1658         /* Dump common header */
   1659 
   1660         AcpiOsPrintf ("\n");
   1661         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1662             Subtable->Length, AcpiDmTableInfoErdtHdr);
   1663         if (ACPI_FAILURE (Status))
   1664         {
   1665             return;
   1666         }
   1667 
   1668         AcpiOsPrintf ("\n");
   1669         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
   1670             Subtable->Length, AcpiDmTableInfoErdtRmdd);
   1671         if (ACPI_FAILURE (Status))
   1672         {
   1673             return;
   1674         }
   1675 
   1676         /* Subtables of this RMDD table */
   1677 
   1678         Suboffset = Offset + sizeof(ACPI_ERDT_RMDD);
   1679         Subsubtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Suboffset);
   1680         while (Suboffset < Offset + Subtable->Length)
   1681         {
   1682             AcpiOsPrintf ("\n");
   1683 
   1684             TrailEntries = NULL;
   1685             DacdEntries = NULL;
   1686             switch (Subsubtable->Type)
   1687             {
   1688             case ACPI_ERDT_TYPE_CACD:
   1689                  InfoTable = AcpiDmTableInfoErdtCacd;
   1690                  TrailEntries = AcpiDmTableInfoErdtCacdX2apic;
   1691                  SubsubtableLength = sizeof(ACPI_ERDT_CACD);
   1692                  break;
   1693 
   1694             case ACPI_ERDT_TYPE_DACD:
   1695                  InfoTable = AcpiDmTableInfoErdtDacd;
   1696                  DacdEntries = AcpiDmTableInfoErdtDacdScope;
   1697                  SubsubtableLength = sizeof(ACPI_ERDT_DACD);
   1698                  break;
   1699 
   1700             case ACPI_ERDT_TYPE_CMRC:
   1701                  InfoTable = AcpiDmTableInfoErdtCmrc;
   1702                  break;
   1703 
   1704             case ACPI_ERDT_TYPE_MMRC:
   1705                  InfoTable = AcpiDmTableInfoErdtMmrc;
   1706                  TrailEntries = AcpiDmTableInfoErdtMmrcCorrFactor;
   1707                  SubsubtableLength = sizeof(ACPI_ERDT_MMRC);
   1708                  break;
   1709 
   1710             case ACPI_ERDT_TYPE_MARC:
   1711                  InfoTable = AcpiDmTableInfoErdtMarc;
   1712                  break;
   1713 
   1714             case ACPI_ERDT_TYPE_CARC:
   1715                  InfoTable = AcpiDmTableInfoErdtCarc;
   1716                  break;
   1717 
   1718             case ACPI_ERDT_TYPE_CMRD:
   1719                  InfoTable = AcpiDmTableInfoErdtCmrd;
   1720                  break;
   1721 
   1722             case ACPI_ERDT_TYPE_IBRD:
   1723                  InfoTable = AcpiDmTableInfoErdtIbrd;
   1724                  TrailEntries = AcpiDmTableInfoErdtIbrdCorrFactor;
   1725                  SubsubtableLength = sizeof(ACPI_ERDT_IBRD);
   1726                  break;
   1727 
   1728             case ACPI_ERDT_TYPE_IBAD:
   1729                  InfoTable = AcpiDmTableInfoErdtIbad;
   1730                  break;
   1731 
   1732             case ACPI_ERDT_TYPE_CARD:
   1733                  InfoTable = AcpiDmTableInfoErdtCard;
   1734                  break;
   1735 
   1736             default:
   1737                 AcpiOsPrintf ("\n**** Unknown RMDD subtable type 0x%X\n",
   1738                     Subsubtable->Type);
   1739 
   1740                 /* Attempt to continue */
   1741 
   1742                 if (!Subsubtable->Length)
   1743                 {
   1744                     AcpiOsPrintf ("Invalid zero length subtable\n");
   1745                     return;
   1746                 }
   1747                 goto NextSubsubtable;
   1748             }
   1749 
   1750             /* Dump subtable header */
   1751 
   1752             Status = AcpiDmDumpTable (Table->Length, Suboffset, Subsubtable,
   1753                 Subsubtable->Length, AcpiDmTableInfoErdtHdr);
   1754             if (ACPI_FAILURE (Status))
   1755             {
   1756                 return;
   1757             }
   1758 
   1759             /* Dump subtable body */
   1760 
   1761             Status = AcpiDmDumpTable (Table->Length, Suboffset, Subsubtable,
   1762                 Subsubtable->Length, InfoTable);
   1763             if (ACPI_FAILURE (Status))
   1764             {
   1765                 return;
   1766             }
   1767 
   1768             /* CACD, MMRC, and IBRD subtables have simple flex array at end */
   1769 
   1770             if (TrailEntries)
   1771             {
   1772                 NumTrailers = 0;
   1773                 while (NumTrailers < Subsubtable->Length - SubsubtableLength)
   1774                 {
   1775 
   1776                     /* Dump one flex array element */
   1777 
   1778                     Status = AcpiDmDumpTable (Table->Length, Suboffset +
   1779                         SubsubtableLength + NumTrailers,
   1780                         ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Subsubtable,
   1781                             SubsubtableLength + NumTrailers),
   1782                         sizeof(UINT32), TrailEntries);
   1783                     if (ACPI_FAILURE (Status))
   1784                     {
   1785                         return;
   1786                     }
   1787                     NumTrailers += sizeof(UINT32);
   1788                 }
   1789             }
   1790 
   1791             /* DACD subtable has flex array of device agent structures */
   1792 
   1793             if (DacdEntries) {
   1794                  ScopeOffset = Suboffset + SubsubtableLength;
   1795                  ScopeTable = ACPI_ADD_PTR (ACPI_ERDT_DACD_PATHS,
   1796                      Subsubtable, SubsubtableLength);
   1797                  while (ScopeOffset < Suboffset + Subsubtable->Length)
   1798                  {
   1799                      /* Dump one device agent structure */
   1800 
   1801                      AcpiOsPrintf ("\n");
   1802                      Status = AcpiDmDumpTable (Table->Length, ScopeOffset,
   1803                          ScopeTable, ScopeTable->Header.Length, DacdEntries);
   1804                      if (ACPI_FAILURE (Status))
   1805                      {
   1806                          return;
   1807                      }
   1808 
   1809                      /* Flex array of UINT8 for device path */
   1810 
   1811                      NumTrailers = 0;
   1812                      while (NumTrailers < ScopeTable->Header.Length - sizeof(ACPI_ERDT_DACD_PATHS))
   1813                      {
   1814                          /* Dump one UINT8 of the device path */
   1815 
   1816                          Status = AcpiDmDumpTable (Table->Length, ScopeOffset +
   1817                              sizeof(ACPI_ERDT_DACD_PATHS) + NumTrailers,
   1818                              ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, ScopeTable,
   1819                                  sizeof(*ScopeTable) + NumTrailers),
   1820                              sizeof(UINT32), AcpiDmTableInfoErdtDacdPath);
   1821                          if (ACPI_FAILURE (Status))
   1822                          {
   1823                              return;
   1824                          }
   1825                          NumTrailers++;
   1826                      }
   1827 
   1828                      ScopeOffset += ScopeTable->Header.Length;
   1829                      ScopeTable = ACPI_ADD_PTR (ACPI_ERDT_DACD_PATHS,
   1830                          ScopeTable, ScopeTable->Header.Length);
   1831                  }
   1832             }
   1833 NextSubsubtable:
   1834             Suboffset += Subsubtable->Length;
   1835             Subsubtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Table, Suboffset);
   1836         }
   1837 
   1838         Offset += Subtable->Length;
   1839         Subtable = ACPI_ADD_PTR (ACPI_SUBTBL_HDR_16, Subtable,
   1840             Subtable->Length);
   1841     }
   1842 }
   1843 
   1844 
   1845 /*******************************************************************************
   1846  *
   1847  * FUNCTION:    AcpiDmDumpErst
   1848  *
   1849  * PARAMETERS:  Table               - A ERST table
   1850  *
   1851  * RETURN:      None
   1852  *
   1853  * DESCRIPTION: Format the contents of a ERST. This table type consists
   1854  *              of an open-ended number of subtables.
   1855  *
   1856  ******************************************************************************/
   1857 
   1858 void
   1859 AcpiDmDumpErst (
   1860     ACPI_TABLE_HEADER       *Table)
   1861 {
   1862     ACPI_STATUS             Status;
   1863     ACPI_WHEA_HEADER        *Subtable;
   1864     UINT32                  Length = Table->Length;
   1865     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
   1866 
   1867 
   1868     /* Main table */
   1869 
   1870     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
   1871     if (ACPI_FAILURE (Status))
   1872     {
   1873         return;
   1874     }
   1875 
   1876     /* Subtables */
   1877 
   1878     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1879     while (Offset < Table->Length)
   1880     {
   1881         AcpiOsPrintf ("\n");
   1882         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1883             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
   1884         if (ACPI_FAILURE (Status))
   1885         {
   1886             return;
   1887         }
   1888 
   1889         /* Point to next subtable (each subtable is of fixed length) */
   1890 
   1891         Offset += sizeof (ACPI_WHEA_HEADER);
   1892         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1893             sizeof (ACPI_WHEA_HEADER));
   1894     }
   1895 }
   1896 
   1897 
   1898 /*******************************************************************************
   1899  *
   1900  * FUNCTION:    AcpiDmDumpFpdt
   1901  *
   1902  * PARAMETERS:  Table               - A FPDT table
   1903  *
   1904  * RETURN:      None
   1905  *
   1906  * DESCRIPTION: Format the contents of a FPDT. This table type consists
   1907  *              of an open-ended number of subtables.
   1908  *
   1909  ******************************************************************************/
   1910 
   1911 void
   1912 AcpiDmDumpFpdt (
   1913     ACPI_TABLE_HEADER       *Table)
   1914 {
   1915     ACPI_STATUS             Status;
   1916     ACPI_FPDT_HEADER        *Subtable;
   1917     UINT32                  Length = Table->Length;
   1918     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   1919     ACPI_DMTABLE_INFO       *InfoTable;
   1920 
   1921 
   1922     /* There is no main table (other than the standard ACPI header) */
   1923 
   1924     /* Subtables */
   1925 
   1926     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
   1927     while (Offset < Table->Length)
   1928     {
   1929         /* Common subtable header */
   1930 
   1931         AcpiOsPrintf ("\n");
   1932         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1933             Subtable->Length, AcpiDmTableInfoFpdtHdr);
   1934         if (ACPI_FAILURE (Status))
   1935         {
   1936             return;
   1937         }
   1938 
   1939         switch (Subtable->Type)
   1940         {
   1941         case ACPI_FPDT_TYPE_BOOT:
   1942 
   1943             InfoTable = AcpiDmTableInfoFpdt0;
   1944             break;
   1945 
   1946         case ACPI_FPDT_TYPE_S3PERF:
   1947 
   1948             InfoTable = AcpiDmTableInfoFpdt1;
   1949             break;
   1950 
   1951         default:
   1952 
   1953             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
   1954                 Subtable->Type);
   1955 
   1956             /* Attempt to continue */
   1957 
   1958             if (!Subtable->Length)
   1959             {
   1960                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1961                 return;
   1962             }
   1963             goto NextSubtable;
   1964         }
   1965 
   1966         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1967             Subtable->Length, InfoTable);
   1968         if (ACPI_FAILURE (Status))
   1969         {
   1970             return;
   1971         }
   1972 
   1973 NextSubtable:
   1974         /* Point to next subtable */
   1975 
   1976         Offset += Subtable->Length;
   1977         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
   1978             Subtable->Length);
   1979     }
   1980 }
   1981 
   1982 
   1983 /*******************************************************************************
   1984  *
   1985  * FUNCTION:    AcpiDmDumpGtdt
   1986  *
   1987  * PARAMETERS:  Table               - A GTDT table
   1988  *
   1989  * RETURN:      None
   1990  *
   1991  * DESCRIPTION: Format the contents of a GTDT. This table type consists
   1992  *              of an open-ended number of subtables.
   1993  *
   1994  ******************************************************************************/
   1995 
   1996 void
   1997 AcpiDmDumpGtdt (
   1998     ACPI_TABLE_HEADER       *Table)
   1999 {
   2000     ACPI_STATUS             Status;
   2001     ACPI_GTDT_HEADER        *Subtable;
   2002     UINT32                  Length = Table->Length;
   2003     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
   2004     ACPI_DMTABLE_INFO       *InfoTable;
   2005     UINT32                  SubtableLength;
   2006     UINT32                  GtCount;
   2007     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
   2008 
   2009 
   2010     /* Main table */
   2011 
   2012     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
   2013     if (ACPI_FAILURE (Status))
   2014     {
   2015         return;
   2016     }
   2017 
   2018     /* Rev 3 fields */
   2019 
   2020     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   2021 
   2022     if (Table->Revision > 2)
   2023     {
   2024         SubtableLength = sizeof (ACPI_GTDT_EL2);
   2025         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2026             SubtableLength, AcpiDmTableInfoGtdtEl2);
   2027         if (ACPI_FAILURE (Status))
   2028         {
   2029             return;
   2030         }
   2031         Offset += SubtableLength;
   2032     }
   2033 
   2034     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   2035 
   2036     /* Subtables */
   2037 
   2038     while (Offset < Table->Length)
   2039     {
   2040         /* Common subtable header */
   2041 
   2042         AcpiOsPrintf ("\n");
   2043         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2044             Subtable->Length, AcpiDmTableInfoGtdtHdr);
   2045         if (ACPI_FAILURE (Status))
   2046         {
   2047             return;
   2048         }
   2049 
   2050         GtCount = 0;
   2051         switch (Subtable->Type)
   2052         {
   2053         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   2054 
   2055             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
   2056             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   2057                 Subtable))->TimerCount;
   2058 
   2059             InfoTable = AcpiDmTableInfoGtdt0;
   2060             break;
   2061 
   2062         case ACPI_GTDT_TYPE_WATCHDOG:
   2063 
   2064             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
   2065 
   2066             InfoTable = AcpiDmTableInfoGtdt1;
   2067             break;
   2068 
   2069         default:
   2070 
   2071             /* Cannot continue on unknown type - no length */
   2072 
   2073             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
   2074                 Subtable->Type);
   2075             return;
   2076         }
   2077 
   2078         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2079             Subtable->Length, InfoTable);
   2080         if (ACPI_FAILURE (Status))
   2081         {
   2082             return;
   2083         }
   2084 
   2085         /* Point to end of current subtable (each subtable above is of fixed length) */
   2086 
   2087         Offset += SubtableLength;
   2088 
   2089         /* If there are any Gt Timer Blocks from above, dump them now */
   2090 
   2091         if (GtCount)
   2092         {
   2093             GtxTable = ACPI_ADD_PTR (
   2094                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
   2095             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
   2096 
   2097             while (GtCount)
   2098             {
   2099                 AcpiOsPrintf ("\n");
   2100                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
   2101                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
   2102                 if (ACPI_FAILURE (Status))
   2103                 {
   2104                     return;
   2105                 }
   2106                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
   2107                 GtxTable++;
   2108                 GtCount--;
   2109             }
   2110         }
   2111 
   2112         /* Point to next subtable */
   2113 
   2114         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
   2115     }
   2116 }
   2117 
   2118 
   2119 /*******************************************************************************
   2120  *
   2121  * FUNCTION:    AcpiDmDumpHest
   2122  *
   2123  * PARAMETERS:  Table               - A HEST table
   2124  *
   2125  * RETURN:      None
   2126  *
   2127  * DESCRIPTION: Format the contents of a HEST. This table type consists
   2128  *              of an open-ended number of subtables.
   2129  *
   2130  ******************************************************************************/
   2131 
   2132 void
   2133 AcpiDmDumpHest (
   2134     ACPI_TABLE_HEADER       *Table)
   2135 {
   2136     ACPI_STATUS             Status;
   2137     ACPI_HEST_HEADER        *Subtable;
   2138     UINT32                  Length = Table->Length;
   2139     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
   2140     ACPI_DMTABLE_INFO       *InfoTable;
   2141     UINT32                  SubtableLength;
   2142     UINT32                  BankCount;
   2143     ACPI_HEST_IA_ERROR_BANK *BankTable;
   2144 
   2145 
   2146     /* Main table */
   2147 
   2148     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
   2149     if (ACPI_FAILURE (Status))
   2150     {
   2151         return;
   2152     }
   2153 
   2154     /* Subtables */
   2155 
   2156     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
   2157     while (Offset < Table->Length)
   2158     {
   2159         BankCount = 0;
   2160         switch (Subtable->Type)
   2161         {
   2162         case ACPI_HEST_TYPE_IA32_CHECK:
   2163 
   2164             InfoTable = AcpiDmTableInfoHest0;
   2165             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
   2166             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   2167                 Subtable))->NumHardwareBanks;
   2168             break;
   2169 
   2170         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   2171 
   2172             InfoTable = AcpiDmTableInfoHest1;
   2173             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
   2174             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   2175                 Subtable))->NumHardwareBanks;
   2176             break;
   2177 
   2178         case ACPI_HEST_TYPE_IA32_NMI:
   2179 
   2180             InfoTable = AcpiDmTableInfoHest2;
   2181             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
   2182             break;
   2183 
   2184         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   2185 
   2186             InfoTable = AcpiDmTableInfoHest6;
   2187             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
   2188             break;
   2189 
   2190         case ACPI_HEST_TYPE_AER_ENDPOINT:
   2191 
   2192             InfoTable = AcpiDmTableInfoHest7;
   2193             SubtableLength = sizeof (ACPI_HEST_AER);
   2194             break;
   2195 
   2196         case ACPI_HEST_TYPE_AER_BRIDGE:
   2197 
   2198             InfoTable = AcpiDmTableInfoHest8;
   2199             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
   2200             break;
   2201 
   2202         case ACPI_HEST_TYPE_GENERIC_ERROR:
   2203 
   2204             InfoTable = AcpiDmTableInfoHest9;
   2205             SubtableLength = sizeof (ACPI_HEST_GENERIC);
   2206             break;
   2207 
   2208         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
   2209 
   2210             InfoTable = AcpiDmTableInfoHest10;
   2211             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
   2212             break;
   2213 
   2214         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   2215 
   2216             InfoTable = AcpiDmTableInfoHest11;
   2217             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
   2218             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
   2219                 Subtable))->NumHardwareBanks;
   2220             break;
   2221 
   2222         default:
   2223 
   2224             /* Cannot continue on unknown type - no length */
   2225 
   2226             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
   2227                 Subtable->Type);
   2228             return;
   2229         }
   2230 
   2231         AcpiOsPrintf ("\n");
   2232         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2233             SubtableLength, InfoTable);
   2234         if (ACPI_FAILURE (Status))
   2235         {
   2236             return;
   2237         }
   2238 
   2239         /* Point to end of current subtable (each subtable above is of fixed length) */
   2240 
   2241         Offset += SubtableLength;
   2242 
   2243         /* If there are any (fixed-length) Error Banks from above, dump them now */
   2244 
   2245         if (BankCount)
   2246         {
   2247             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
   2248                 SubtableLength);
   2249             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
   2250 
   2251             while (BankCount)
   2252             {
   2253                 AcpiOsPrintf ("\n");
   2254                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
   2255                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
   2256                 if (ACPI_FAILURE (Status))
   2257                 {
   2258                     return;
   2259                 }
   2260 
   2261                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
   2262                 BankTable++;
   2263                 BankCount--;
   2264             }
   2265         }
   2266 
   2267         /* Point to next subtable */
   2268 
   2269         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
   2270     }
   2271 }
   2272 
   2273 
   2274 /*******************************************************************************
   2275  *
   2276  * FUNCTION:    AcpiDmDumpHmat
   2277  *
   2278  * PARAMETERS:  Table               - A HMAT table
   2279  *
   2280  * RETURN:      None
   2281  *
   2282  * DESCRIPTION: Format the contents of a HMAT.
   2283  *
   2284  ******************************************************************************/
   2285 
   2286 void
   2287 AcpiDmDumpHmat (
   2288     ACPI_TABLE_HEADER       *Table)
   2289 {
   2290     ACPI_STATUS             Status;
   2291     ACPI_HMAT_STRUCTURE     *HmatStruct;
   2292     ACPI_HMAT_LOCALITY      *HmatLocality;
   2293     ACPI_HMAT_CACHE         *HmatCache;
   2294     UINT32                  Offset;
   2295     UINT32                  SubtableOffset;
   2296     UINT32                  Length;
   2297     ACPI_DMTABLE_INFO       *InfoTable;
   2298     UINT32                  i, j;
   2299 
   2300 
   2301     /* Main table */
   2302 
   2303     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
   2304     if (ACPI_FAILURE (Status))
   2305     {
   2306         return;
   2307     }
   2308     Offset = sizeof (ACPI_TABLE_HMAT);
   2309 
   2310     while (Offset < Table->Length)
   2311     {
   2312         AcpiOsPrintf ("\n");
   2313 
   2314         /* Dump HMAT structure header */
   2315 
   2316         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
   2317         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
   2318         {
   2319             AcpiOsPrintf ("Invalid HMAT structure length\n");
   2320             return;
   2321         }
   2322         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   2323             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
   2324         if (ACPI_FAILURE (Status))
   2325         {
   2326             return;
   2327         }
   2328 
   2329         switch (HmatStruct->Type)
   2330         {
   2331         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
   2332 
   2333             InfoTable = AcpiDmTableInfoHmat0;
   2334             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
   2335             break;
   2336 
   2337         case ACPI_HMAT_TYPE_LOCALITY:
   2338 
   2339             InfoTable = AcpiDmTableInfoHmat1;
   2340             Length = sizeof (ACPI_HMAT_LOCALITY);
   2341             break;
   2342 
   2343         case ACPI_HMAT_TYPE_CACHE:
   2344 
   2345             InfoTable = AcpiDmTableInfoHmat2;
   2346             Length = sizeof (ACPI_HMAT_CACHE);
   2347             break;
   2348 
   2349         default:
   2350 
   2351             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
   2352                 HmatStruct->Type);
   2353 
   2354             /* Attempt to continue */
   2355 
   2356             goto NextSubtable;
   2357         }
   2358 
   2359         /* Dump HMAT structure body */
   2360 
   2361         if (HmatStruct->Length < Length)
   2362         {
   2363             AcpiOsPrintf ("Invalid HMAT structure length\n");
   2364             return;
   2365         }
   2366         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   2367             HmatStruct->Length, InfoTable);
   2368         if (ACPI_FAILURE (Status))
   2369         {
   2370             return;
   2371         }
   2372 
   2373         /* Dump HMAT structure additional */
   2374 
   2375         switch (HmatStruct->Type)
   2376         {
   2377         case ACPI_HMAT_TYPE_LOCALITY:
   2378 
   2379             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
   2380             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
   2381 
   2382             /* Dump initiator proximity domains */
   2383 
   2384             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2385                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
   2386             {
   2387                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
   2388                 return;
   2389             }
   2390             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   2391             {
   2392                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2393                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2394                     4, AcpiDmTableInfoHmat1a);
   2395                 if (ACPI_FAILURE (Status))
   2396                 {
   2397                     return;
   2398                 }
   2399 
   2400                 SubtableOffset += 4;
   2401             }
   2402 
   2403             /* Dump target proximity domains */
   2404 
   2405             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2406                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
   2407             {
   2408                 AcpiOsPrintf ("Invalid target proximity domain number\n");
   2409                 return;
   2410             }
   2411             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
   2412             {
   2413                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2414                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2415                     4, AcpiDmTableInfoHmat1b);
   2416                 if (ACPI_FAILURE (Status))
   2417                 {
   2418                     return;
   2419                 }
   2420 
   2421                 SubtableOffset += 4;
   2422             }
   2423 
   2424             /* Dump latency/bandwidth entris */
   2425 
   2426             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2427                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
   2428                          HmatLocality->NumberOfTargetPDs * 2))
   2429             {
   2430                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
   2431                 return;
   2432             }
   2433             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   2434             {
   2435                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
   2436                 {
   2437                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2438                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2439                         2, AcpiDmTableInfoHmat1c);
   2440                     if (ACPI_FAILURE(Status))
   2441                     {
   2442                         return;
   2443                     }
   2444 
   2445                     SubtableOffset += 2;
   2446                 }
   2447             }
   2448             break;
   2449 
   2450         case ACPI_HMAT_TYPE_CACHE:
   2451 
   2452             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
   2453             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
   2454 
   2455             /* Dump SMBIOS handles */
   2456 
   2457             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2458                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
   2459             {
   2460                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
   2461                 return;
   2462             }
   2463             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
   2464             {
   2465                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2466                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2467                     2, AcpiDmTableInfoHmat2a);
   2468                 if (ACPI_FAILURE (Status))
   2469                 {
   2470                     return;
   2471                 }
   2472 
   2473                 SubtableOffset += 2;
   2474             }
   2475             break;
   2476 
   2477         default:
   2478 
   2479             break;
   2480         }
   2481 
   2482 NextSubtable:
   2483         /* Point to next HMAT structure subtable */
   2484 
   2485         Offset += (HmatStruct->Length);
   2486     }
   2487 }
   2488