Home | History | Annotate | Line # | Download | only in common
dmtbdump1.c revision 1.1.1.11
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2023, 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         default:
   1376 
   1377             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
   1378                 Subtable->Type);
   1379             return;
   1380         }
   1381 
   1382         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1383             Subtable->Length, InfoTable);
   1384         if (ACPI_FAILURE (Status))
   1385         {
   1386             return;
   1387         }
   1388 
   1389         /*
   1390          * Dump the optional device scope entries
   1391          */
   1392         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
   1393             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
   1394         {
   1395             /* These types do not support device scopes */
   1396 
   1397             goto NextSubtable;
   1398         }
   1399 
   1400         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
   1401         while (ScopeOffset < Subtable->Length)
   1402         {
   1403             AcpiOsPrintf ("\n");
   1404             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
   1405                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
   1406             if (ACPI_FAILURE (Status))
   1407             {
   1408                 return;
   1409             }
   1410             AcpiOsPrintf ("\n");
   1411 
   1412             /* Dump the PCI Path entries for this device scope */
   1413 
   1414             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
   1415 
   1416             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
   1417                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
   1418 
   1419             while (PathOffset < ScopeTable->Length)
   1420             {
   1421                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
   1422                     "PCI Path");
   1423                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
   1424 
   1425                 /* Point to next PCI Path entry */
   1426 
   1427                 PathOffset += 2;
   1428                 PciPath += 2;
   1429                 AcpiOsPrintf ("\n");
   1430             }
   1431 
   1432             /* Point to next device scope entry */
   1433 
   1434             ScopeOffset += ScopeTable->Length;
   1435             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
   1436                 ScopeTable, ScopeTable->Length);
   1437         }
   1438 
   1439 NextSubtable:
   1440         /* Point to next subtable */
   1441 
   1442         Offset += Subtable->Length;
   1443         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
   1444             Subtable->Length);
   1445     }
   1446 }
   1447 
   1448 
   1449 /*******************************************************************************
   1450  *
   1451  * FUNCTION:    AcpiDmDumpDrtm
   1452  *
   1453  * PARAMETERS:  Table               - A DRTM table
   1454  *
   1455  * RETURN:      None
   1456  *
   1457  * DESCRIPTION: Format the contents of a DRTM.
   1458  *
   1459  ******************************************************************************/
   1460 
   1461 void
   1462 AcpiDmDumpDrtm (
   1463     ACPI_TABLE_HEADER       *Table)
   1464 {
   1465     ACPI_STATUS             Status;
   1466     UINT32                  Offset;
   1467     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
   1468     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
   1469     ACPI_DRTM_DPS_ID        *DrtmDps;
   1470     UINT32                  Count;
   1471 
   1472 
   1473     /* Main table */
   1474 
   1475     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
   1476         AcpiDmTableInfoDrtm);
   1477     if (ACPI_FAILURE (Status))
   1478     {
   1479         return;
   1480     }
   1481 
   1482     Offset = sizeof (ACPI_TABLE_DRTM);
   1483 
   1484     /* Sub-tables */
   1485 
   1486     /* Dump ValidatedTable length */
   1487 
   1488     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
   1489     AcpiOsPrintf ("\n");
   1490     Status = AcpiDmDumpTable (Table->Length, Offset,
   1491         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
   1492         AcpiDmTableInfoDrtm0);
   1493     if (ACPI_FAILURE (Status))
   1494     {
   1495             return;
   1496     }
   1497 
   1498     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
   1499 
   1500     /* Dump Validated table addresses */
   1501 
   1502     Count = 0;
   1503     while ((Offset < Table->Length) &&
   1504             (DrtmVtl->ValidatedTableCount > Count))
   1505     {
   1506         Status = AcpiDmDumpTable (Table->Length, Offset,
   1507             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
   1508             AcpiDmTableInfoDrtm0a);
   1509         if (ACPI_FAILURE (Status))
   1510         {
   1511             return;
   1512         }
   1513 
   1514         Offset += sizeof (UINT64);
   1515         Count++;
   1516     }
   1517 
   1518     /* Dump ResourceList length */
   1519 
   1520     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
   1521     AcpiOsPrintf ("\n");
   1522     Status = AcpiDmDumpTable (Table->Length, Offset,
   1523         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
   1524         AcpiDmTableInfoDrtm1);
   1525     if (ACPI_FAILURE (Status))
   1526     {
   1527         return;
   1528     }
   1529 
   1530     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
   1531 
   1532     /* Dump the Resource List */
   1533 
   1534     Count = 0;
   1535     while ((Offset < Table->Length) &&
   1536            (DrtmRl->ResourceCount > Count))
   1537     {
   1538         Status = AcpiDmDumpTable (Table->Length, Offset,
   1539             ACPI_ADD_PTR (void, Table, Offset),
   1540             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
   1541         if (ACPI_FAILURE (Status))
   1542         {
   1543             return;
   1544         }
   1545 
   1546         Offset += sizeof (ACPI_DRTM_RESOURCE);
   1547         Count++;
   1548     }
   1549 
   1550     /* Dump DPS */
   1551 
   1552     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
   1553     AcpiOsPrintf ("\n");
   1554     (void) AcpiDmDumpTable (Table->Length, Offset,
   1555         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
   1556 }
   1557 
   1558 
   1559 /*******************************************************************************
   1560  *
   1561  * FUNCTION:    AcpiDmDumpEinj
   1562  *
   1563  * PARAMETERS:  Table               - A EINJ table
   1564  *
   1565  * RETURN:      None
   1566  *
   1567  * DESCRIPTION: Format the contents of a EINJ. This table type consists
   1568  *              of an open-ended number of subtables.
   1569  *
   1570  ******************************************************************************/
   1571 
   1572 void
   1573 AcpiDmDumpEinj (
   1574     ACPI_TABLE_HEADER       *Table)
   1575 {
   1576     ACPI_STATUS             Status;
   1577     ACPI_WHEA_HEADER        *Subtable;
   1578     UINT32                  Length = Table->Length;
   1579     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
   1580 
   1581 
   1582     /* Main table */
   1583 
   1584     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
   1585     if (ACPI_FAILURE (Status))
   1586     {
   1587         return;
   1588     }
   1589 
   1590     /* Subtables */
   1591 
   1592     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1593     while (Offset < Table->Length)
   1594     {
   1595         AcpiOsPrintf ("\n");
   1596         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1597             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
   1598         if (ACPI_FAILURE (Status))
   1599         {
   1600             return;
   1601         }
   1602 
   1603         /* Point to next subtable (each subtable is of fixed length) */
   1604 
   1605         Offset += sizeof (ACPI_WHEA_HEADER);
   1606         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1607             sizeof (ACPI_WHEA_HEADER));
   1608     }
   1609 }
   1610 
   1611 
   1612 /*******************************************************************************
   1613  *
   1614  * FUNCTION:    AcpiDmDumpErst
   1615  *
   1616  * PARAMETERS:  Table               - A ERST table
   1617  *
   1618  * RETURN:      None
   1619  *
   1620  * DESCRIPTION: Format the contents of a ERST. This table type consists
   1621  *              of an open-ended number of subtables.
   1622  *
   1623  ******************************************************************************/
   1624 
   1625 void
   1626 AcpiDmDumpErst (
   1627     ACPI_TABLE_HEADER       *Table)
   1628 {
   1629     ACPI_STATUS             Status;
   1630     ACPI_WHEA_HEADER        *Subtable;
   1631     UINT32                  Length = Table->Length;
   1632     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
   1633 
   1634 
   1635     /* Main table */
   1636 
   1637     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
   1638     if (ACPI_FAILURE (Status))
   1639     {
   1640         return;
   1641     }
   1642 
   1643     /* Subtables */
   1644 
   1645     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1646     while (Offset < Table->Length)
   1647     {
   1648         AcpiOsPrintf ("\n");
   1649         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1650             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
   1651         if (ACPI_FAILURE (Status))
   1652         {
   1653             return;
   1654         }
   1655 
   1656         /* Point to next subtable (each subtable is of fixed length) */
   1657 
   1658         Offset += sizeof (ACPI_WHEA_HEADER);
   1659         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
   1660             sizeof (ACPI_WHEA_HEADER));
   1661     }
   1662 }
   1663 
   1664 
   1665 /*******************************************************************************
   1666  *
   1667  * FUNCTION:    AcpiDmDumpFpdt
   1668  *
   1669  * PARAMETERS:  Table               - A FPDT table
   1670  *
   1671  * RETURN:      None
   1672  *
   1673  * DESCRIPTION: Format the contents of a FPDT. This table type consists
   1674  *              of an open-ended number of subtables.
   1675  *
   1676  ******************************************************************************/
   1677 
   1678 void
   1679 AcpiDmDumpFpdt (
   1680     ACPI_TABLE_HEADER       *Table)
   1681 {
   1682     ACPI_STATUS             Status;
   1683     ACPI_FPDT_HEADER        *Subtable;
   1684     UINT32                  Length = Table->Length;
   1685     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   1686     ACPI_DMTABLE_INFO       *InfoTable;
   1687 
   1688 
   1689     /* There is no main table (other than the standard ACPI header) */
   1690 
   1691     /* Subtables */
   1692 
   1693     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
   1694     while (Offset < Table->Length)
   1695     {
   1696         /* Common subtable header */
   1697 
   1698         AcpiOsPrintf ("\n");
   1699         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1700             Subtable->Length, AcpiDmTableInfoFpdtHdr);
   1701         if (ACPI_FAILURE (Status))
   1702         {
   1703             return;
   1704         }
   1705 
   1706         switch (Subtable->Type)
   1707         {
   1708         case ACPI_FPDT_TYPE_BOOT:
   1709 
   1710             InfoTable = AcpiDmTableInfoFpdt0;
   1711             break;
   1712 
   1713         case ACPI_FPDT_TYPE_S3PERF:
   1714 
   1715             InfoTable = AcpiDmTableInfoFpdt1;
   1716             break;
   1717 
   1718         default:
   1719 
   1720             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
   1721                 Subtable->Type);
   1722 
   1723             /* Attempt to continue */
   1724 
   1725             if (!Subtable->Length)
   1726             {
   1727                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1728                 return;
   1729             }
   1730             goto NextSubtable;
   1731         }
   1732 
   1733         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1734             Subtable->Length, InfoTable);
   1735         if (ACPI_FAILURE (Status))
   1736         {
   1737             return;
   1738         }
   1739 
   1740 NextSubtable:
   1741         /* Point to next subtable */
   1742 
   1743         Offset += Subtable->Length;
   1744         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
   1745             Subtable->Length);
   1746     }
   1747 }
   1748 
   1749 
   1750 /*******************************************************************************
   1751  *
   1752  * FUNCTION:    AcpiDmDumpGtdt
   1753  *
   1754  * PARAMETERS:  Table               - A GTDT table
   1755  *
   1756  * RETURN:      None
   1757  *
   1758  * DESCRIPTION: Format the contents of a GTDT. This table type consists
   1759  *              of an open-ended number of subtables.
   1760  *
   1761  ******************************************************************************/
   1762 
   1763 void
   1764 AcpiDmDumpGtdt (
   1765     ACPI_TABLE_HEADER       *Table)
   1766 {
   1767     ACPI_STATUS             Status;
   1768     ACPI_GTDT_HEADER        *Subtable;
   1769     UINT32                  Length = Table->Length;
   1770     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
   1771     ACPI_DMTABLE_INFO       *InfoTable;
   1772     UINT32                  SubtableLength;
   1773     UINT32                  GtCount;
   1774     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
   1775 
   1776 
   1777     /* Main table */
   1778 
   1779     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
   1780     if (ACPI_FAILURE (Status))
   1781     {
   1782         return;
   1783     }
   1784 
   1785     /* Rev 3 fields */
   1786 
   1787     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1788 
   1789     if (Table->Revision > 2)
   1790     {
   1791         SubtableLength = sizeof (ACPI_GTDT_EL2);
   1792         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1793             SubtableLength, AcpiDmTableInfoGtdtEl2);
   1794         if (ACPI_FAILURE (Status))
   1795         {
   1796             return;
   1797         }
   1798         Offset += SubtableLength;
   1799     }
   1800 
   1801     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1802 
   1803     /* Subtables */
   1804 
   1805     while (Offset < Table->Length)
   1806     {
   1807         /* Common subtable header */
   1808 
   1809         AcpiOsPrintf ("\n");
   1810         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1811             Subtable->Length, AcpiDmTableInfoGtdtHdr);
   1812         if (ACPI_FAILURE (Status))
   1813         {
   1814             return;
   1815         }
   1816 
   1817         GtCount = 0;
   1818         switch (Subtable->Type)
   1819         {
   1820         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1821 
   1822             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
   1823             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   1824                 Subtable))->TimerCount;
   1825 
   1826             InfoTable = AcpiDmTableInfoGtdt0;
   1827             break;
   1828 
   1829         case ACPI_GTDT_TYPE_WATCHDOG:
   1830 
   1831             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
   1832 
   1833             InfoTable = AcpiDmTableInfoGtdt1;
   1834             break;
   1835 
   1836         default:
   1837 
   1838             /* Cannot continue on unknown type - no length */
   1839 
   1840             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
   1841                 Subtable->Type);
   1842             return;
   1843         }
   1844 
   1845         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1846             Subtable->Length, InfoTable);
   1847         if (ACPI_FAILURE (Status))
   1848         {
   1849             return;
   1850         }
   1851 
   1852         /* Point to end of current subtable (each subtable above is of fixed length) */
   1853 
   1854         Offset += SubtableLength;
   1855 
   1856         /* If there are any Gt Timer Blocks from above, dump them now */
   1857 
   1858         if (GtCount)
   1859         {
   1860             GtxTable = ACPI_ADD_PTR (
   1861                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
   1862             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
   1863 
   1864             while (GtCount)
   1865             {
   1866                 AcpiOsPrintf ("\n");
   1867                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
   1868                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
   1869                 if (ACPI_FAILURE (Status))
   1870                 {
   1871                     return;
   1872                 }
   1873                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
   1874                 GtxTable++;
   1875                 GtCount--;
   1876             }
   1877         }
   1878 
   1879         /* Point to next subtable */
   1880 
   1881         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
   1882     }
   1883 }
   1884 
   1885 
   1886 /*******************************************************************************
   1887  *
   1888  * FUNCTION:    AcpiDmDumpHest
   1889  *
   1890  * PARAMETERS:  Table               - A HEST table
   1891  *
   1892  * RETURN:      None
   1893  *
   1894  * DESCRIPTION: Format the contents of a HEST. This table type consists
   1895  *              of an open-ended number of subtables.
   1896  *
   1897  ******************************************************************************/
   1898 
   1899 void
   1900 AcpiDmDumpHest (
   1901     ACPI_TABLE_HEADER       *Table)
   1902 {
   1903     ACPI_STATUS             Status;
   1904     ACPI_HEST_HEADER        *Subtable;
   1905     UINT32                  Length = Table->Length;
   1906     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
   1907     ACPI_DMTABLE_INFO       *InfoTable;
   1908     UINT32                  SubtableLength;
   1909     UINT32                  BankCount;
   1910     ACPI_HEST_IA_ERROR_BANK *BankTable;
   1911 
   1912 
   1913     /* Main table */
   1914 
   1915     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
   1916     if (ACPI_FAILURE (Status))
   1917     {
   1918         return;
   1919     }
   1920 
   1921     /* Subtables */
   1922 
   1923     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
   1924     while (Offset < Table->Length)
   1925     {
   1926         BankCount = 0;
   1927         switch (Subtable->Type)
   1928         {
   1929         case ACPI_HEST_TYPE_IA32_CHECK:
   1930 
   1931             InfoTable = AcpiDmTableInfoHest0;
   1932             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
   1933             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   1934                 Subtable))->NumHardwareBanks;
   1935             break;
   1936 
   1937         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1938 
   1939             InfoTable = AcpiDmTableInfoHest1;
   1940             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
   1941             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   1942                 Subtable))->NumHardwareBanks;
   1943             break;
   1944 
   1945         case ACPI_HEST_TYPE_IA32_NMI:
   1946 
   1947             InfoTable = AcpiDmTableInfoHest2;
   1948             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
   1949             break;
   1950 
   1951         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   1952 
   1953             InfoTable = AcpiDmTableInfoHest6;
   1954             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
   1955             break;
   1956 
   1957         case ACPI_HEST_TYPE_AER_ENDPOINT:
   1958 
   1959             InfoTable = AcpiDmTableInfoHest7;
   1960             SubtableLength = sizeof (ACPI_HEST_AER);
   1961             break;
   1962 
   1963         case ACPI_HEST_TYPE_AER_BRIDGE:
   1964 
   1965             InfoTable = AcpiDmTableInfoHest8;
   1966             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
   1967             break;
   1968 
   1969         case ACPI_HEST_TYPE_GENERIC_ERROR:
   1970 
   1971             InfoTable = AcpiDmTableInfoHest9;
   1972             SubtableLength = sizeof (ACPI_HEST_GENERIC);
   1973             break;
   1974 
   1975         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
   1976 
   1977             InfoTable = AcpiDmTableInfoHest10;
   1978             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
   1979             break;
   1980 
   1981         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   1982 
   1983             InfoTable = AcpiDmTableInfoHest11;
   1984             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
   1985             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
   1986                 Subtable))->NumHardwareBanks;
   1987             break;
   1988 
   1989         default:
   1990 
   1991             /* Cannot continue on unknown type - no length */
   1992 
   1993             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
   1994                 Subtable->Type);
   1995             return;
   1996         }
   1997 
   1998         AcpiOsPrintf ("\n");
   1999         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   2000             SubtableLength, InfoTable);
   2001         if (ACPI_FAILURE (Status))
   2002         {
   2003             return;
   2004         }
   2005 
   2006         /* Point to end of current subtable (each subtable above is of fixed length) */
   2007 
   2008         Offset += SubtableLength;
   2009 
   2010         /* If there are any (fixed-length) Error Banks from above, dump them now */
   2011 
   2012         if (BankCount)
   2013         {
   2014             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
   2015                 SubtableLength);
   2016             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
   2017 
   2018             while (BankCount)
   2019             {
   2020                 AcpiOsPrintf ("\n");
   2021                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
   2022                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
   2023                 if (ACPI_FAILURE (Status))
   2024                 {
   2025                     return;
   2026                 }
   2027 
   2028                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
   2029                 BankTable++;
   2030                 BankCount--;
   2031             }
   2032         }
   2033 
   2034         /* Point to next subtable */
   2035 
   2036         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
   2037     }
   2038 }
   2039 
   2040 
   2041 /*******************************************************************************
   2042  *
   2043  * FUNCTION:    AcpiDmDumpHmat
   2044  *
   2045  * PARAMETERS:  Table               - A HMAT table
   2046  *
   2047  * RETURN:      None
   2048  *
   2049  * DESCRIPTION: Format the contents of a HMAT.
   2050  *
   2051  ******************************************************************************/
   2052 
   2053 void
   2054 AcpiDmDumpHmat (
   2055     ACPI_TABLE_HEADER       *Table)
   2056 {
   2057     ACPI_STATUS             Status;
   2058     ACPI_HMAT_STRUCTURE     *HmatStruct;
   2059     ACPI_HMAT_LOCALITY      *HmatLocality;
   2060     ACPI_HMAT_CACHE         *HmatCache;
   2061     UINT32                  Offset;
   2062     UINT32                  SubtableOffset;
   2063     UINT32                  Length;
   2064     ACPI_DMTABLE_INFO       *InfoTable;
   2065     UINT32                  i, j;
   2066 
   2067 
   2068     /* Main table */
   2069 
   2070     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
   2071     if (ACPI_FAILURE (Status))
   2072     {
   2073         return;
   2074     }
   2075     Offset = sizeof (ACPI_TABLE_HMAT);
   2076 
   2077     while (Offset < Table->Length)
   2078     {
   2079         AcpiOsPrintf ("\n");
   2080 
   2081         /* Dump HMAT structure header */
   2082 
   2083         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
   2084         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
   2085         {
   2086             AcpiOsPrintf ("Invalid HMAT structure length\n");
   2087             return;
   2088         }
   2089         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   2090             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
   2091         if (ACPI_FAILURE (Status))
   2092         {
   2093             return;
   2094         }
   2095 
   2096         switch (HmatStruct->Type)
   2097         {
   2098         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
   2099 
   2100             InfoTable = AcpiDmTableInfoHmat0;
   2101             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
   2102             break;
   2103 
   2104         case ACPI_HMAT_TYPE_LOCALITY:
   2105 
   2106             InfoTable = AcpiDmTableInfoHmat1;
   2107             Length = sizeof (ACPI_HMAT_LOCALITY);
   2108             break;
   2109 
   2110         case ACPI_HMAT_TYPE_CACHE:
   2111 
   2112             InfoTable = AcpiDmTableInfoHmat2;
   2113             Length = sizeof (ACPI_HMAT_CACHE);
   2114             break;
   2115 
   2116         default:
   2117 
   2118             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
   2119                 HmatStruct->Type);
   2120 
   2121             /* Attempt to continue */
   2122 
   2123             goto NextSubtable;
   2124         }
   2125 
   2126         /* Dump HMAT structure body */
   2127 
   2128         if (HmatStruct->Length < Length)
   2129         {
   2130             AcpiOsPrintf ("Invalid HMAT structure length\n");
   2131             return;
   2132         }
   2133         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   2134             HmatStruct->Length, InfoTable);
   2135         if (ACPI_FAILURE (Status))
   2136         {
   2137             return;
   2138         }
   2139 
   2140         /* Dump HMAT structure additional */
   2141 
   2142         switch (HmatStruct->Type)
   2143         {
   2144         case ACPI_HMAT_TYPE_LOCALITY:
   2145 
   2146             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
   2147             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
   2148 
   2149             /* Dump initiator proximity domains */
   2150 
   2151             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2152                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
   2153             {
   2154                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
   2155                 return;
   2156             }
   2157             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   2158             {
   2159                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2160                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2161                     4, AcpiDmTableInfoHmat1a);
   2162                 if (ACPI_FAILURE (Status))
   2163                 {
   2164                     return;
   2165                 }
   2166 
   2167                 SubtableOffset += 4;
   2168             }
   2169 
   2170             /* Dump target proximity domains */
   2171 
   2172             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2173                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
   2174             {
   2175                 AcpiOsPrintf ("Invalid target proximity domain number\n");
   2176                 return;
   2177             }
   2178             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
   2179             {
   2180                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2181                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2182                     4, AcpiDmTableInfoHmat1b);
   2183                 if (ACPI_FAILURE (Status))
   2184                 {
   2185                     return;
   2186                 }
   2187 
   2188                 SubtableOffset += 4;
   2189             }
   2190 
   2191             /* Dump latency/bandwidth entris */
   2192 
   2193             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2194                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
   2195                          HmatLocality->NumberOfTargetPDs * 2))
   2196             {
   2197                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
   2198                 return;
   2199             }
   2200             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   2201             {
   2202                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
   2203                 {
   2204                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2205                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2206                         2, AcpiDmTableInfoHmat1c);
   2207                     if (ACPI_FAILURE(Status))
   2208                     {
   2209                         return;
   2210                     }
   2211 
   2212                     SubtableOffset += 2;
   2213                 }
   2214             }
   2215             break;
   2216 
   2217         case ACPI_HMAT_TYPE_CACHE:
   2218 
   2219             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
   2220             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
   2221 
   2222             /* Dump SMBIOS handles */
   2223 
   2224             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   2225                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
   2226             {
   2227                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
   2228                 return;
   2229             }
   2230             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
   2231             {
   2232                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   2233                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   2234                     2, AcpiDmTableInfoHmat2a);
   2235                 if (ACPI_FAILURE (Status))
   2236                 {
   2237                     return;
   2238                 }
   2239 
   2240                 SubtableOffset += 2;
   2241             }
   2242             break;
   2243 
   2244         default:
   2245 
   2246             break;
   2247         }
   2248 
   2249 NextSubtable:
   2250         /* Point to next HMAT structure subtable */
   2251 
   2252         Offset += (HmatStruct->Length);
   2253     }
   2254 }
   2255