Home | History | Annotate | Line # | Download | only in common
dmtbdump.c revision 1.3
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2015, 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 MERCHANTIBILITY 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 
     49 /* This module used for application-level code only */
     50 
     51 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     52         ACPI_MODULE_NAME    ("dmtbdump")
     53 
     54 
     55 /* Local prototypes */
     56 
     57 static void
     58 AcpiDmValidateFadtLength (
     59     UINT32                  Revision,
     60     UINT32                  Length);
     61 
     62 
     63 /*******************************************************************************
     64  *
     65  * FUNCTION:    AcpiDmDumpBuffer
     66  *
     67  * PARAMETERS:  Table               - ACPI Table or subtable
     68  *              BufferOffset        - Offset of buffer from Table above
     69  *              Length              - Length of the buffer
     70  *              AbsoluteOffset      - Offset of buffer in the main ACPI table
     71  *              Header              - Name of the buffer field (printed on the
     72  *                                    first line only.)
     73  *
     74  * RETURN:      None
     75  *
     76  * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
     77  *              disassembler output format.)
     78  *
     79  ******************************************************************************/
     80 
     81 void
     82 AcpiDmDumpBuffer (
     83     void                    *Table,
     84     UINT32                  BufferOffset,
     85     UINT32                  Length,
     86     UINT32                  AbsoluteOffset,
     87     char                    *Header)
     88 {
     89     UINT8                   *Buffer;
     90     UINT32                  i;
     91 
     92 
     93     if (!Length)
     94     {
     95         return;
     96     }
     97 
     98     Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
     99     i = 0;
    100 
    101     while (i < Length)
    102     {
    103         if (!(i % 16))
    104         {
    105             /* Insert a backslash - line continuation character */
    106 
    107             if (Length > 16)
    108             {
    109                 AcpiOsPrintf ("\\\n    ");
    110             }
    111         }
    112 
    113         AcpiOsPrintf ("%.02X ", *Buffer);
    114         i++;
    115         Buffer++;
    116         AbsoluteOffset++;
    117     }
    118 
    119     AcpiOsPrintf ("\n");
    120 }
    121 
    122 
    123 /*******************************************************************************
    124  *
    125  * FUNCTION:    AcpiDmDumpUnicode
    126  *
    127  * PARAMETERS:  Table               - ACPI Table or subtable
    128  *              BufferOffset        - Offset of buffer from Table above
    129  *              ByteLength          - Length of the buffer
    130  *
    131  * RETURN:      None
    132  *
    133  * DESCRIPTION: Validate and dump the contents of a buffer that contains
    134  *              unicode data. The output is a standard ASCII string. If it
    135  *              appears that the data is not unicode, the buffer is dumped
    136  *              as hex characters.
    137  *
    138  ******************************************************************************/
    139 
    140 void
    141 AcpiDmDumpUnicode (
    142     void                    *Table,
    143     UINT32                  BufferOffset,
    144     UINT32                  ByteLength)
    145 {
    146     UINT8                   *Buffer;
    147     UINT32                  Length;
    148     UINT32                  i;
    149 
    150 
    151     Buffer = ((UINT8 *) Table) + BufferOffset;
    152     Length = ByteLength - 2; /* Last two bytes are the null terminator */
    153 
    154     /* Ensure all low bytes are entirely printable ASCII */
    155 
    156     for (i = 0; i < Length; i += 2)
    157     {
    158         if (!isprint (Buffer[i]))
    159         {
    160             goto DumpRawBuffer;
    161         }
    162     }
    163 
    164     /* Ensure all high bytes are zero */
    165 
    166     for (i = 1; i < Length; i += 2)
    167     {
    168         if (Buffer[i])
    169         {
    170             goto DumpRawBuffer;
    171         }
    172     }
    173 
    174     /* Dump the buffer as a normal string */
    175 
    176     AcpiOsPrintf ("\"");
    177     for (i = 0; i < Length; i += 2)
    178     {
    179         AcpiOsPrintf ("%c", Buffer[i]);
    180     }
    181     AcpiOsPrintf ("\"\n");
    182     return;
    183 
    184 DumpRawBuffer:
    185     AcpiDmDumpBuffer (Table, BufferOffset, ByteLength,
    186         BufferOffset, NULL);
    187     AcpiOsPrintf ("\n");
    188 }
    189 
    190 
    191 /*******************************************************************************
    192  *
    193  * FUNCTION:    AcpiDmDumpRsdp
    194  *
    195  * PARAMETERS:  Table               - A RSDP
    196  *
    197  * RETURN:      Length of the table (there is not always a length field,
    198  *              use revision or length if available (ACPI 2.0+))
    199  *
    200  * DESCRIPTION: Format the contents of a RSDP
    201  *
    202  ******************************************************************************/
    203 
    204 UINT32
    205 AcpiDmDumpRsdp (
    206     ACPI_TABLE_HEADER       *Table)
    207 {
    208     ACPI_TABLE_RSDP         *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
    209     UINT32                  Length = sizeof (ACPI_RSDP_COMMON);
    210     UINT8                   Checksum;
    211     ACPI_STATUS             Status;
    212 
    213 
    214     /* Dump the common ACPI 1.0 portion */
    215 
    216     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
    217     if (ACPI_FAILURE (Status))
    218     {
    219         return (Length);
    220     }
    221 
    222     /* Validate the first checksum */
    223 
    224     Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
    225                 Rsdp->Checksum);
    226     if (Checksum != Rsdp->Checksum)
    227     {
    228         AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
    229             Checksum);
    230     }
    231 
    232     /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
    233 
    234     if (Rsdp->Revision > 0)
    235     {
    236         Length = Rsdp->Length;
    237         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
    238         if (ACPI_FAILURE (Status))
    239         {
    240             return (Length);
    241         }
    242 
    243         /* Validate the extended checksum over entire RSDP */
    244 
    245         Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
    246                     Rsdp->ExtendedChecksum);
    247         if (Checksum != Rsdp->ExtendedChecksum)
    248         {
    249             AcpiOsPrintf (
    250                 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
    251                 Checksum);
    252         }
    253     }
    254 
    255     return (Length);
    256 }
    257 
    258 
    259 /*******************************************************************************
    260  *
    261  * FUNCTION:    AcpiDmDumpRsdt
    262  *
    263  * PARAMETERS:  Table               - A RSDT
    264  *
    265  * RETURN:      None
    266  *
    267  * DESCRIPTION: Format the contents of a RSDT
    268  *
    269  ******************************************************************************/
    270 
    271 void
    272 AcpiDmDumpRsdt (
    273     ACPI_TABLE_HEADER       *Table)
    274 {
    275     UINT32                  *Array;
    276     UINT32                  Entries;
    277     UINT32                  Offset;
    278     UINT32                  i;
    279 
    280 
    281     /* Point to start of table pointer array */
    282 
    283     Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
    284     Offset = sizeof (ACPI_TABLE_HEADER);
    285 
    286     /* RSDT uses 32-bit pointers */
    287 
    288     Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
    289 
    290     for (i = 0; i < Entries; i++)
    291     {
    292         AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
    293         AcpiOsPrintf ("%8.8X\n", Array[i]);
    294         Offset += sizeof (UINT32);
    295     }
    296 }
    297 
    298 
    299 /*******************************************************************************
    300  *
    301  * FUNCTION:    AcpiDmDumpXsdt
    302  *
    303  * PARAMETERS:  Table               - A XSDT
    304  *
    305  * RETURN:      None
    306  *
    307  * DESCRIPTION: Format the contents of a XSDT
    308  *
    309  ******************************************************************************/
    310 
    311 void
    312 AcpiDmDumpXsdt (
    313     ACPI_TABLE_HEADER       *Table)
    314 {
    315     UINT64                  *Array;
    316     UINT32                  Entries;
    317     UINT32                  Offset;
    318     UINT32                  i;
    319 
    320 
    321     /* Point to start of table pointer array */
    322 
    323     Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
    324     Offset = sizeof (ACPI_TABLE_HEADER);
    325 
    326     /* XSDT uses 64-bit pointers */
    327 
    328     Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
    329 
    330     for (i = 0; i < Entries; i++)
    331     {
    332         AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
    333         AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
    334         Offset += sizeof (UINT64);
    335     }
    336 }
    337 
    338 
    339 /*******************************************************************************
    340  *
    341  * FUNCTION:    AcpiDmDumpFadt
    342  *
    343  * PARAMETERS:  Table               - A FADT
    344  *
    345  * RETURN:      None
    346  *
    347  * DESCRIPTION: Format the contents of a FADT
    348  *
    349  * NOTE:        We cannot depend on the FADT version to indicate the actual
    350  *              contents of the FADT because of BIOS bugs. The table length
    351  *              is the only reliable indicator.
    352  *
    353  ******************************************************************************/
    354 
    355 void
    356 AcpiDmDumpFadt (
    357     ACPI_TABLE_HEADER       *Table)
    358 {
    359     ACPI_STATUS             Status;
    360 
    361 
    362     /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
    363 
    364     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
    365     if (ACPI_FAILURE (Status))
    366     {
    367         return;
    368     }
    369 
    370     /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
    371 
    372     if ((Table->Length > ACPI_FADT_V1_SIZE) &&
    373         (Table->Length <= ACPI_FADT_V2_SIZE))
    374     {
    375         Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
    376         if (ACPI_FAILURE (Status))
    377         {
    378             return;
    379         }
    380     }
    381 
    382     /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
    383 
    384     else if (Table->Length > ACPI_FADT_V2_SIZE)
    385     {
    386         Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
    387         if (ACPI_FAILURE (Status))
    388         {
    389             return;
    390         }
    391 
    392         /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
    393 
    394         if (Table->Length > ACPI_FADT_V3_SIZE)
    395         {
    396             Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5);
    397             if (ACPI_FAILURE (Status))
    398             {
    399                 return;
    400             }
    401         }
    402 
    403         /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
    404 
    405         if (Table->Length > ACPI_FADT_V3_SIZE)
    406         {
    407             Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt6);
    408             if (ACPI_FAILURE (Status))
    409             {
    410                 return;
    411             }
    412         }
    413     }
    414 
    415     /* Validate various fields in the FADT, including length */
    416 
    417     AcpiTbCreateLocalFadt (Table, Table->Length);
    418 
    419     /* Validate FADT length against the revision */
    420 
    421     AcpiDmValidateFadtLength (Table->Revision, Table->Length);
    422 }
    423 
    424 
    425 /*******************************************************************************
    426  *
    427  * FUNCTION:    AcpiDmValidateFadtLength
    428  *
    429  * PARAMETERS:  Revision            - FADT revision (Header->Revision)
    430  *              Length              - FADT length (Header->Length
    431  *
    432  * RETURN:      None
    433  *
    434  * DESCRIPTION: Check the FADT revision against the expected table length for
    435  *              that revision. Issue a warning if the length is not what was
    436  *              expected. This seems to be such a common BIOS bug that the
    437  *              FADT revision has been rendered virtually meaningless.
    438  *
    439  ******************************************************************************/
    440 
    441 static void
    442 AcpiDmValidateFadtLength (
    443     UINT32                  Revision,
    444     UINT32                  Length)
    445 {
    446     UINT32                  ExpectedLength;
    447 
    448 
    449     switch (Revision)
    450     {
    451     case 0:
    452 
    453         AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
    454         return;
    455 
    456     case 1:
    457 
    458         ExpectedLength = ACPI_FADT_V1_SIZE;
    459         break;
    460 
    461     case 2:
    462 
    463         ExpectedLength = ACPI_FADT_V2_SIZE;
    464         break;
    465 
    466     case 3:
    467     case 4:
    468 
    469         ExpectedLength = ACPI_FADT_V3_SIZE;
    470         break;
    471 
    472     case 5:
    473 
    474         ExpectedLength = ACPI_FADT_V5_SIZE;
    475         break;
    476 
    477     default:
    478 
    479         return;
    480     }
    481 
    482     if (Length == ExpectedLength)
    483     {
    484         return;
    485     }
    486 
    487     AcpiOsPrintf (
    488         "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
    489         Revision, Length, ExpectedLength);
    490 }
    491 
    492 
    493 /*******************************************************************************
    494  *
    495  * FUNCTION:    AcpiDmDumpAsf
    496  *
    497  * PARAMETERS:  Table               - A ASF table
    498  *
    499  * RETURN:      None
    500  *
    501  * DESCRIPTION: Format the contents of a ASF table
    502  *
    503  ******************************************************************************/
    504 
    505 void
    506 AcpiDmDumpAsf (
    507     ACPI_TABLE_HEADER       *Table)
    508 {
    509     ACPI_STATUS             Status;
    510     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
    511     ACPI_ASF_INFO           *SubTable;
    512     ACPI_DMTABLE_INFO       *InfoTable;
    513     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
    514     UINT8                   *DataTable = NULL;
    515     UINT32                  DataCount = 0;
    516     UINT32                  DataLength = 0;
    517     UINT32                  DataOffset = 0;
    518     UINT32                  i;
    519     UINT8                   Type;
    520 
    521 
    522     /* No main table, only subtables */
    523 
    524     SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
    525     while (Offset < Table->Length)
    526     {
    527         /* Common subtable header */
    528 
    529         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
    530                     SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
    531         if (ACPI_FAILURE (Status))
    532         {
    533             return;
    534         }
    535 
    536         /* The actual type is the lower 7 bits of Type */
    537 
    538         Type = (UINT8) (SubTable->Header.Type & 0x7F);
    539 
    540         switch (Type)
    541         {
    542         case ACPI_ASF_TYPE_INFO:
    543 
    544             InfoTable = AcpiDmTableInfoAsf0;
    545             break;
    546 
    547         case ACPI_ASF_TYPE_ALERT:
    548 
    549             InfoTable = AcpiDmTableInfoAsf1;
    550             DataInfoTable = AcpiDmTableInfoAsf1a;
    551             DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
    552             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
    553             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
    554             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
    555             break;
    556 
    557         case ACPI_ASF_TYPE_CONTROL:
    558 
    559             InfoTable = AcpiDmTableInfoAsf2;
    560             DataInfoTable = AcpiDmTableInfoAsf2a;
    561             DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
    562             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
    563             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
    564             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
    565             break;
    566 
    567         case ACPI_ASF_TYPE_BOOT:
    568 
    569             InfoTable = AcpiDmTableInfoAsf3;
    570             break;
    571 
    572         case ACPI_ASF_TYPE_ADDRESS:
    573 
    574             InfoTable = AcpiDmTableInfoAsf4;
    575             DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
    576             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
    577             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
    578             break;
    579 
    580         default:
    581 
    582             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", SubTable->Header.Type);
    583             return;
    584         }
    585 
    586         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
    587                     SubTable->Header.Length, InfoTable);
    588         if (ACPI_FAILURE (Status))
    589         {
    590             return;
    591         }
    592 
    593         /* Dump variable-length extra data */
    594 
    595         switch (Type)
    596         {
    597         case ACPI_ASF_TYPE_ALERT:
    598         case ACPI_ASF_TYPE_CONTROL:
    599 
    600             for (i = 0; i < DataCount; i++)
    601             {
    602                 AcpiOsPrintf ("\n");
    603                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
    604                             DataTable, DataLength, DataInfoTable);
    605                 if (ACPI_FAILURE (Status))
    606                 {
    607                     return;
    608                 }
    609 
    610                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
    611                 DataOffset += DataLength;
    612             }
    613             break;
    614 
    615         case ACPI_ASF_TYPE_ADDRESS:
    616 
    617             for (i = 0; i < DataLength; i++)
    618             {
    619                 if (!(i % 16))
    620                 {
    621                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
    622                 }
    623 
    624                 AcpiOsPrintf ("%2.2X ", *DataTable);
    625                 DataTable++;
    626                 DataOffset++;
    627                 if (DataOffset > Table->Length)
    628                 {
    629                     AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure! (ASF! table)\n");
    630                     return;
    631                 }
    632             }
    633 
    634             AcpiOsPrintf ("\n");
    635             break;
    636 
    637         default:
    638 
    639             break;
    640         }
    641 
    642         AcpiOsPrintf ("\n");
    643 
    644         /* Point to next subtable */
    645 
    646         if (!SubTable->Header.Length)
    647         {
    648             AcpiOsPrintf ("Invalid zero subtable header length\n");
    649             return;
    650         }
    651 
    652         Offset += SubTable->Header.Length;
    653         SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
    654     }
    655 }
    656 
    657 
    658 /*******************************************************************************
    659  *
    660  * FUNCTION:    AcpiDmDumpCpep
    661  *
    662  * PARAMETERS:  Table               - A CPEP table
    663  *
    664  * RETURN:      None
    665  *
    666  * DESCRIPTION: Format the contents of a CPEP. This table type consists
    667  *              of an open-ended number of subtables.
    668  *
    669  ******************************************************************************/
    670 
    671 void
    672 AcpiDmDumpCpep (
    673     ACPI_TABLE_HEADER       *Table)
    674 {
    675     ACPI_STATUS             Status;
    676     ACPI_CPEP_POLLING       *SubTable;
    677     UINT32                  Length = Table->Length;
    678     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
    679 
    680 
    681     /* Main table */
    682 
    683     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
    684     if (ACPI_FAILURE (Status))
    685     {
    686         return;
    687     }
    688 
    689     /* Subtables */
    690 
    691     SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
    692     while (Offset < Table->Length)
    693     {
    694         AcpiOsPrintf ("\n");
    695         Status = AcpiDmDumpTable (Length, Offset, SubTable,
    696                     SubTable->Header.Length, AcpiDmTableInfoCpep0);
    697         if (ACPI_FAILURE (Status))
    698         {
    699             return;
    700         }
    701 
    702         /* Point to next subtable */
    703 
    704         Offset += SubTable->Header.Length;
    705         SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
    706                     SubTable->Header.Length);
    707     }
    708 }
    709 
    710 
    711 /*******************************************************************************
    712  *
    713  * FUNCTION:    AcpiDmDumpCsrt
    714  *
    715  * PARAMETERS:  Table               - A CSRT table
    716  *
    717  * RETURN:      None
    718  *
    719  * DESCRIPTION: Format the contents of a CSRT. This table type consists
    720  *              of an open-ended number of subtables.
    721  *
    722  ******************************************************************************/
    723 
    724 void
    725 AcpiDmDumpCsrt (
    726     ACPI_TABLE_HEADER       *Table)
    727 {
    728     ACPI_STATUS             Status;
    729     ACPI_CSRT_GROUP         *SubTable;
    730     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
    731     ACPI_CSRT_DESCRIPTOR    *SubSubTable;
    732     UINT32                  Length = Table->Length;
    733     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
    734     UINT32                  SubOffset;
    735     UINT32                  SubSubOffset;
    736     UINT32                  InfoLength;
    737 
    738 
    739     /* The main table only contains the ACPI header, thus already handled */
    740 
    741     /* Subtables (Resource Groups) */
    742 
    743     SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
    744     while (Offset < Table->Length)
    745     {
    746         /* Resource group subtable */
    747 
    748         AcpiOsPrintf ("\n");
    749         Status = AcpiDmDumpTable (Length, Offset, SubTable,
    750                     SubTable->Length, AcpiDmTableInfoCsrt0);
    751         if (ACPI_FAILURE (Status))
    752         {
    753             return;
    754         }
    755 
    756         /* Shared info subtable (One per resource group) */
    757 
    758         SubOffset = sizeof (ACPI_CSRT_GROUP);
    759         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
    760             Offset + SubOffset);
    761 
    762         AcpiOsPrintf ("\n");
    763         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
    764                     sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
    765         if (ACPI_FAILURE (Status))
    766         {
    767             return;
    768         }
    769 
    770         SubOffset += SubTable->SharedInfoLength;
    771 
    772         /* Sub-Subtables (Resource Descriptors) */
    773 
    774         SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
    775             Offset + SubOffset);
    776 
    777         while ((SubOffset < SubTable->Length) &&
    778               ((Offset + SubOffset) < Table->Length))
    779         {
    780             AcpiOsPrintf ("\n");
    781             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
    782                         SubSubTable->Length, AcpiDmTableInfoCsrt2);
    783             if (ACPI_FAILURE (Status))
    784             {
    785                 return;
    786             }
    787 
    788             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
    789 
    790             /* Resource-specific info buffer */
    791 
    792             InfoLength = SubSubTable->Length - SubSubOffset;
    793             if (InfoLength)
    794             {
    795                 Status = AcpiDmDumpTable (Length,
    796                             Offset + SubOffset + SubSubOffset, Table,
    797                             InfoLength, AcpiDmTableInfoCsrt2a);
    798                 if (ACPI_FAILURE (Status))
    799                 {
    800                     return;
    801                 }
    802                 SubSubOffset += InfoLength;
    803             }
    804 
    805             /* Point to next sub-subtable */
    806 
    807             SubOffset += SubSubTable->Length;
    808             SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
    809                         SubSubTable->Length);
    810         }
    811 
    812         /* Point to next subtable */
    813 
    814         Offset += SubTable->Length;
    815         SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
    816                     SubTable->Length);
    817     }
    818 }
    819 
    820 
    821 /*******************************************************************************
    822  *
    823  * FUNCTION:    AcpiDmDumpDbg2
    824  *
    825  * PARAMETERS:  Table               - A DBG2 table
    826  *
    827  * RETURN:      None
    828  *
    829  * DESCRIPTION: Format the contents of a DBG2. This table type consists
    830  *              of an open-ended number of subtables.
    831  *
    832  ******************************************************************************/
    833 
    834 void
    835 AcpiDmDumpDbg2 (
    836     ACPI_TABLE_HEADER       *Table)
    837 {
    838     ACPI_STATUS             Status;
    839     ACPI_DBG2_DEVICE        *SubTable;
    840     UINT32                  Length = Table->Length;
    841     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
    842     UINT32                  i;
    843     UINT32                  ArrayOffset;
    844     UINT32                  AbsoluteOffset;
    845     UINT8                   *Array;
    846 
    847 
    848     /* Main table */
    849 
    850     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
    851     if (ACPI_FAILURE (Status))
    852     {
    853         return;
    854     }
    855 
    856     /* Subtables */
    857 
    858     SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
    859     while (Offset < Table->Length)
    860     {
    861         AcpiOsPrintf ("\n");
    862         Status = AcpiDmDumpTable (Length, Offset, SubTable,
    863                     SubTable->Length, AcpiDmTableInfoDbg2Device);
    864         if (ACPI_FAILURE (Status))
    865         {
    866             return;
    867         }
    868 
    869         /* Dump the BaseAddress array */
    870 
    871         for (i = 0; i < SubTable->RegisterCount; i++)
    872         {
    873             ArrayOffset = SubTable->BaseAddressOffset +
    874                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
    875             AbsoluteOffset = Offset + ArrayOffset;
    876             Array = (UINT8 *) SubTable + ArrayOffset;
    877 
    878             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    879                         SubTable->Length, AcpiDmTableInfoDbg2Addr);
    880             if (ACPI_FAILURE (Status))
    881             {
    882                 return;
    883             }
    884         }
    885 
    886         /* Dump the AddressSize array */
    887 
    888         for (i = 0; i < SubTable->RegisterCount; i++)
    889         {
    890             ArrayOffset = SubTable->AddressSizeOffset +
    891                 (sizeof (UINT32) * i);
    892             AbsoluteOffset = Offset + ArrayOffset;
    893             Array = (UINT8 *) SubTable + ArrayOffset;
    894 
    895             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    896                         SubTable->Length, AcpiDmTableInfoDbg2Size);
    897             if (ACPI_FAILURE (Status))
    898             {
    899                 return;
    900             }
    901         }
    902 
    903         /* Dump the Namestring (required) */
    904 
    905         AcpiOsPrintf ("\n");
    906         ArrayOffset = SubTable->NamepathOffset;
    907         AbsoluteOffset = Offset + ArrayOffset;
    908         Array = (UINT8 *) SubTable + ArrayOffset;
    909 
    910         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    911                     SubTable->Length, AcpiDmTableInfoDbg2Name);
    912         if (ACPI_FAILURE (Status))
    913         {
    914             return;
    915         }
    916 
    917         /* Dump the OemData (optional) */
    918 
    919         if (SubTable->OemDataOffset)
    920         {
    921             Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset,
    922                         Table, SubTable->OemDataLength,
    923                         AcpiDmTableInfoDbg2OemData);
    924             if (ACPI_FAILURE (Status))
    925             {
    926                 return;
    927             }
    928         }
    929 
    930         /* Point to next subtable */
    931 
    932         Offset += SubTable->Length;
    933         SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
    934                     SubTable->Length);
    935     }
    936 }
    937 
    938 
    939 /*******************************************************************************
    940  *
    941  * FUNCTION:    AcpiDmDumpDmar
    942  *
    943  * PARAMETERS:  Table               - A DMAR table
    944  *
    945  * RETURN:      None
    946  *
    947  * DESCRIPTION: Format the contents of a DMAR. This table type consists
    948  *              of an open-ended number of subtables.
    949  *
    950  ******************************************************************************/
    951 
    952 void
    953 AcpiDmDumpDmar (
    954     ACPI_TABLE_HEADER       *Table)
    955 {
    956     ACPI_STATUS             Status;
    957     ACPI_DMAR_HEADER        *SubTable;
    958     UINT32                  Length = Table->Length;
    959     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
    960     ACPI_DMTABLE_INFO       *InfoTable;
    961     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
    962     UINT32                  ScopeOffset;
    963     UINT8                   *PciPath;
    964     UINT32                  PathOffset;
    965 
    966 
    967     /* Main table */
    968 
    969     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
    970     if (ACPI_FAILURE (Status))
    971     {
    972         return;
    973     }
    974 
    975     /* Subtables */
    976 
    977     SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
    978     while (Offset < Table->Length)
    979     {
    980         /* Common subtable header */
    981 
    982         AcpiOsPrintf ("\n");
    983         Status = AcpiDmDumpTable (Length, Offset, SubTable,
    984                     SubTable->Length, AcpiDmTableInfoDmarHdr);
    985         if (ACPI_FAILURE (Status))
    986         {
    987             return;
    988         }
    989         AcpiOsPrintf ("\n");
    990 
    991         switch (SubTable->Type)
    992         {
    993         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
    994 
    995             InfoTable = AcpiDmTableInfoDmar0;
    996             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
    997             break;
    998 
    999         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
   1000 
   1001             InfoTable = AcpiDmTableInfoDmar1;
   1002             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
   1003             break;
   1004 
   1005         case ACPI_DMAR_TYPE_ROOT_ATS:
   1006 
   1007             InfoTable = AcpiDmTableInfoDmar2;
   1008             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
   1009             break;
   1010 
   1011         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
   1012 
   1013             InfoTable = AcpiDmTableInfoDmar3;
   1014             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
   1015             break;
   1016 
   1017         case ACPI_DMAR_TYPE_NAMESPACE:
   1018 
   1019             InfoTable = AcpiDmTableInfoDmar4;
   1020             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
   1021             break;
   1022 
   1023         default:
   1024 
   1025             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", SubTable->Type);
   1026             return;
   1027         }
   1028 
   1029         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1030                     SubTable->Length, InfoTable);
   1031         if (ACPI_FAILURE (Status))
   1032         {
   1033             return;
   1034         }
   1035 
   1036         /*
   1037          * Dump the optional device scope entries
   1038          */
   1039         if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
   1040             (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
   1041         {
   1042             /* These types do not support device scopes */
   1043 
   1044             goto NextSubtable;
   1045         }
   1046 
   1047         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
   1048         while (ScopeOffset < SubTable->Length)
   1049         {
   1050             AcpiOsPrintf ("\n");
   1051             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
   1052                         ScopeTable->Length, AcpiDmTableInfoDmarScope);
   1053             if (ACPI_FAILURE (Status))
   1054             {
   1055                 return;
   1056             }
   1057             AcpiOsPrintf ("\n");
   1058 
   1059             /* Dump the PCI Path entries for this device scope */
   1060 
   1061             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
   1062 
   1063             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
   1064                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
   1065 
   1066             while (PathOffset < ScopeTable->Length)
   1067             {
   1068                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
   1069                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
   1070 
   1071                 /* Point to next PCI Path entry */
   1072 
   1073                 PathOffset += 2;
   1074                 PciPath += 2;
   1075                 AcpiOsPrintf ("\n");
   1076             }
   1077 
   1078             /* Point to next device scope entry */
   1079 
   1080             ScopeOffset += ScopeTable->Length;
   1081             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
   1082                 ScopeTable, ScopeTable->Length);
   1083         }
   1084 
   1085 NextSubtable:
   1086         /* Point to next subtable */
   1087 
   1088         Offset += SubTable->Length;
   1089         SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
   1090     }
   1091 }
   1092 
   1093 
   1094 /*******************************************************************************
   1095  *
   1096  * FUNCTION:    AcpiDmDumpDrtm
   1097  *
   1098  * PARAMETERS:  Table               - A DRTM table
   1099  *
   1100  * RETURN:      None
   1101  *
   1102  * DESCRIPTION: Format the contents of a DRTM.
   1103  *
   1104  ******************************************************************************/
   1105 
   1106 void
   1107 AcpiDmDumpDrtm (
   1108     ACPI_TABLE_HEADER       *Table)
   1109 {
   1110     ACPI_STATUS             Status;
   1111     UINT32                  Offset;
   1112     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
   1113     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
   1114     ACPI_DRTM_DPS_ID        *DrtmDps;
   1115     UINT32                  Count;
   1116 
   1117 
   1118     /* Main table */
   1119 
   1120     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
   1121                 AcpiDmTableInfoDrtm);
   1122     if (ACPI_FAILURE (Status))
   1123     {
   1124         return;
   1125     }
   1126 
   1127     Offset = sizeof (ACPI_TABLE_DRTM);
   1128 
   1129     /* Sub-tables */
   1130 
   1131     /* Dump ValidatedTable length */
   1132 
   1133     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
   1134     AcpiOsPrintf ("\n");
   1135     Status = AcpiDmDumpTable (Table->Length, Offset,
   1136                 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
   1137                 AcpiDmTableInfoDrtm0);
   1138     if (ACPI_FAILURE (Status))
   1139     {
   1140             return;
   1141     }
   1142     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
   1143 
   1144     /* Dump Validated table addresses */
   1145 
   1146     Count = 0;
   1147     while ((Offset < Table->Length) &&
   1148             (DrtmVtl->ValidatedTableCount > Count))
   1149     {
   1150         Status = AcpiDmDumpTable (Table->Length, Offset,
   1151                     ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
   1152                     AcpiDmTableInfoDrtm0a);
   1153         if (ACPI_FAILURE (Status))
   1154         {
   1155             return;
   1156         }
   1157         Offset += sizeof (UINT64);
   1158         Count++;
   1159     }
   1160 
   1161     /* Dump ResourceList length */
   1162 
   1163     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
   1164     AcpiOsPrintf ("\n");
   1165     Status = AcpiDmDumpTable (Table->Length, Offset,
   1166                 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
   1167                 AcpiDmTableInfoDrtm1);
   1168     if (ACPI_FAILURE (Status))
   1169     {
   1170         return;
   1171     }
   1172 
   1173     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
   1174 
   1175     /* Dump the Resource List */
   1176 
   1177     Count = 0;
   1178     while ((Offset < Table->Length) &&
   1179            (DrtmRl->ResourceCount > Count))
   1180     {
   1181         Status = AcpiDmDumpTable (Table->Length, Offset,
   1182                     ACPI_ADD_PTR (void, Table, Offset),
   1183                     sizeof (ACPI_DRTM_RESOURCE),
   1184                     AcpiDmTableInfoDrtm1a);
   1185         if (ACPI_FAILURE (Status))
   1186         {
   1187             return;
   1188         }
   1189 
   1190         Offset += sizeof (ACPI_DRTM_RESOURCE);
   1191         Count++;
   1192     }
   1193 
   1194     /* Dump DPS */
   1195 
   1196     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
   1197     AcpiOsPrintf ("\n");
   1198     (void) AcpiDmDumpTable (Table->Length, Offset,
   1199                 DrtmDps, sizeof (ACPI_DRTM_DPS_ID),
   1200                 AcpiDmTableInfoDrtm2);
   1201 }
   1202 
   1203 
   1204 /*******************************************************************************
   1205  *
   1206  * FUNCTION:    AcpiDmDumpEinj
   1207  *
   1208  * PARAMETERS:  Table               - A EINJ table
   1209  *
   1210  * RETURN:      None
   1211  *
   1212  * DESCRIPTION: Format the contents of a EINJ. This table type consists
   1213  *              of an open-ended number of subtables.
   1214  *
   1215  ******************************************************************************/
   1216 
   1217 void
   1218 AcpiDmDumpEinj (
   1219     ACPI_TABLE_HEADER       *Table)
   1220 {
   1221     ACPI_STATUS             Status;
   1222     ACPI_WHEA_HEADER        *SubTable;
   1223     UINT32                  Length = Table->Length;
   1224     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
   1225 
   1226 
   1227     /* Main table */
   1228 
   1229     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
   1230     if (ACPI_FAILURE (Status))
   1231     {
   1232         return;
   1233     }
   1234 
   1235     /* Subtables */
   1236 
   1237     SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1238     while (Offset < Table->Length)
   1239     {
   1240         AcpiOsPrintf ("\n");
   1241         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1242                     sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
   1243         if (ACPI_FAILURE (Status))
   1244         {
   1245             return;
   1246         }
   1247 
   1248         /* Point to next subtable (each subtable is of fixed length) */
   1249 
   1250         Offset += sizeof (ACPI_WHEA_HEADER);
   1251         SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
   1252                         sizeof (ACPI_WHEA_HEADER));
   1253     }
   1254 }
   1255 
   1256 
   1257 /*******************************************************************************
   1258  *
   1259  * FUNCTION:    AcpiDmDumpErst
   1260  *
   1261  * PARAMETERS:  Table               - A ERST table
   1262  *
   1263  * RETURN:      None
   1264  *
   1265  * DESCRIPTION: Format the contents of a ERST. This table type consists
   1266  *              of an open-ended number of subtables.
   1267  *
   1268  ******************************************************************************/
   1269 
   1270 void
   1271 AcpiDmDumpErst (
   1272     ACPI_TABLE_HEADER       *Table)
   1273 {
   1274     ACPI_STATUS             Status;
   1275     ACPI_WHEA_HEADER        *SubTable;
   1276     UINT32                  Length = Table->Length;
   1277     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
   1278 
   1279 
   1280     /* Main table */
   1281 
   1282     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
   1283     if (ACPI_FAILURE (Status))
   1284     {
   1285         return;
   1286     }
   1287 
   1288     /* Subtables */
   1289 
   1290     SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
   1291     while (Offset < Table->Length)
   1292     {
   1293         AcpiOsPrintf ("\n");
   1294         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1295                     sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
   1296         if (ACPI_FAILURE (Status))
   1297         {
   1298             return;
   1299         }
   1300 
   1301         /* Point to next subtable (each subtable is of fixed length) */
   1302 
   1303         Offset += sizeof (ACPI_WHEA_HEADER);
   1304         SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
   1305                         sizeof (ACPI_WHEA_HEADER));
   1306     }
   1307 }
   1308 
   1309 
   1310 /*******************************************************************************
   1311  *
   1312  * FUNCTION:    AcpiDmDumpFpdt
   1313  *
   1314  * PARAMETERS:  Table               - A FPDT table
   1315  *
   1316  * RETURN:      None
   1317  *
   1318  * DESCRIPTION: Format the contents of a FPDT. This table type consists
   1319  *              of an open-ended number of subtables.
   1320  *
   1321  ******************************************************************************/
   1322 
   1323 void
   1324 AcpiDmDumpFpdt (
   1325     ACPI_TABLE_HEADER       *Table)
   1326 {
   1327     ACPI_STATUS             Status;
   1328     ACPI_FPDT_HEADER        *SubTable;
   1329     UINT32                  Length = Table->Length;
   1330     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
   1331     ACPI_DMTABLE_INFO       *InfoTable;
   1332 
   1333 
   1334     /* There is no main table (other than the standard ACPI header) */
   1335 
   1336     /* Subtables */
   1337 
   1338     SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
   1339     while (Offset < Table->Length)
   1340     {
   1341         /* Common subtable header */
   1342 
   1343         AcpiOsPrintf ("\n");
   1344         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1345                     SubTable->Length, AcpiDmTableInfoFpdtHdr);
   1346         if (ACPI_FAILURE (Status))
   1347         {
   1348             return;
   1349         }
   1350 
   1351         switch (SubTable->Type)
   1352         {
   1353         case ACPI_FPDT_TYPE_BOOT:
   1354 
   1355             InfoTable = AcpiDmTableInfoFpdt0;
   1356             break;
   1357 
   1358         case ACPI_FPDT_TYPE_S3PERF:
   1359 
   1360             InfoTable = AcpiDmTableInfoFpdt1;
   1361             break;
   1362 
   1363         default:
   1364 
   1365             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", SubTable->Type);
   1366 
   1367             /* Attempt to continue */
   1368 
   1369             if (!SubTable->Length)
   1370             {
   1371                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1372                 return;
   1373             }
   1374             goto NextSubTable;
   1375         }
   1376 
   1377         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1378                     SubTable->Length, InfoTable);
   1379         if (ACPI_FAILURE (Status))
   1380         {
   1381             return;
   1382         }
   1383 
   1384 NextSubTable:
   1385         /* Point to next subtable */
   1386 
   1387         Offset += SubTable->Length;
   1388         SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
   1389     }
   1390 }
   1391 
   1392 
   1393 /*******************************************************************************
   1394  *
   1395  * FUNCTION:    AcpiDmDumpGtdt
   1396  *
   1397  * PARAMETERS:  Table               - A GTDT table
   1398  *
   1399  * RETURN:      None
   1400  *
   1401  * DESCRIPTION: Format the contents of a GTDT. This table type consists
   1402  *              of an open-ended number of subtables.
   1403  *
   1404  ******************************************************************************/
   1405 
   1406 void
   1407 AcpiDmDumpGtdt (
   1408     ACPI_TABLE_HEADER       *Table)
   1409 {
   1410     ACPI_STATUS             Status;
   1411     ACPI_GTDT_HEADER        *SubTable;
   1412     UINT32                  Length = Table->Length;
   1413     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
   1414     ACPI_DMTABLE_INFO       *InfoTable;
   1415     UINT32                  SubTableLength;
   1416     UINT32                  GtCount;
   1417     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
   1418 
   1419 
   1420     /* Main table */
   1421 
   1422     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
   1423     if (ACPI_FAILURE (Status))
   1424     {
   1425         return;
   1426     }
   1427 
   1428     /* Subtables */
   1429 
   1430     SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1431     while (Offset < Table->Length)
   1432     {
   1433         /* Common subtable header */
   1434 
   1435         AcpiOsPrintf ("\n");
   1436         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1437                     SubTable->Length, AcpiDmTableInfoGtdtHdr);
   1438         if (ACPI_FAILURE (Status))
   1439         {
   1440             return;
   1441         }
   1442 
   1443         GtCount = 0;
   1444         switch (SubTable->Type)
   1445         {
   1446         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1447 
   1448             SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
   1449             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   1450                         SubTable))->TimerCount;
   1451 
   1452             InfoTable = AcpiDmTableInfoGtdt0;
   1453             break;
   1454 
   1455         case ACPI_GTDT_TYPE_WATCHDOG:
   1456 
   1457             SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
   1458 
   1459             InfoTable = AcpiDmTableInfoGtdt1;
   1460             break;
   1461 
   1462         default:
   1463 
   1464             /* Cannot continue on unknown type - no length */
   1465 
   1466             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", SubTable->Type);
   1467             return;
   1468         }
   1469 
   1470         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1471                     SubTable->Length, InfoTable);
   1472         if (ACPI_FAILURE (Status))
   1473         {
   1474             return;
   1475         }
   1476 
   1477         /* Point to end of current subtable (each subtable above is of fixed length) */
   1478 
   1479         Offset += SubTableLength;
   1480 
   1481         /* If there are any Gt Timer Blocks from above, dump them now */
   1482 
   1483         if (GtCount)
   1484         {
   1485             GtxTable = ACPI_ADD_PTR (ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
   1486             SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
   1487 
   1488             while (GtCount)
   1489             {
   1490                 AcpiOsPrintf ("\n");
   1491                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
   1492                             sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
   1493                 if (ACPI_FAILURE (Status))
   1494                 {
   1495                     return;
   1496                 }
   1497                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
   1498                 GtxTable++;
   1499                 GtCount--;
   1500             }
   1501         }
   1502 
   1503         /* Point to next subtable */
   1504 
   1505         SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
   1506     }
   1507 }
   1508 
   1509 
   1510 /*******************************************************************************
   1511  *
   1512  * FUNCTION:    AcpiDmDumpHest
   1513  *
   1514  * PARAMETERS:  Table               - A HEST table
   1515  *
   1516  * RETURN:      None
   1517  *
   1518  * DESCRIPTION: Format the contents of a HEST. This table type consists
   1519  *              of an open-ended number of subtables.
   1520  *
   1521  ******************************************************************************/
   1522 
   1523 void
   1524 AcpiDmDumpHest (
   1525     ACPI_TABLE_HEADER       *Table)
   1526 {
   1527     ACPI_STATUS             Status;
   1528     ACPI_HEST_HEADER        *SubTable;
   1529     UINT32                  Length = Table->Length;
   1530     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
   1531     ACPI_DMTABLE_INFO       *InfoTable;
   1532     UINT32                  SubTableLength;
   1533     UINT32                  BankCount;
   1534     ACPI_HEST_IA_ERROR_BANK *BankTable;
   1535 
   1536 
   1537     /* Main table */
   1538 
   1539     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
   1540     if (ACPI_FAILURE (Status))
   1541     {
   1542         return;
   1543     }
   1544 
   1545     /* Subtables */
   1546 
   1547     SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
   1548     while (Offset < Table->Length)
   1549     {
   1550         BankCount = 0;
   1551         switch (SubTable->Type)
   1552         {
   1553         case ACPI_HEST_TYPE_IA32_CHECK:
   1554 
   1555             InfoTable = AcpiDmTableInfoHest0;
   1556             SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
   1557             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   1558                             SubTable))->NumHardwareBanks;
   1559             break;
   1560 
   1561         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1562 
   1563             InfoTable = AcpiDmTableInfoHest1;
   1564             SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
   1565             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   1566                             SubTable))->NumHardwareBanks;
   1567             break;
   1568 
   1569         case ACPI_HEST_TYPE_IA32_NMI:
   1570 
   1571             InfoTable = AcpiDmTableInfoHest2;
   1572             SubTableLength = sizeof (ACPI_HEST_IA_NMI);
   1573             break;
   1574 
   1575         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   1576 
   1577             InfoTable = AcpiDmTableInfoHest6;
   1578             SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
   1579             break;
   1580 
   1581         case ACPI_HEST_TYPE_AER_ENDPOINT:
   1582 
   1583             InfoTable = AcpiDmTableInfoHest7;
   1584             SubTableLength = sizeof (ACPI_HEST_AER);
   1585             break;
   1586 
   1587         case ACPI_HEST_TYPE_AER_BRIDGE:
   1588 
   1589             InfoTable = AcpiDmTableInfoHest8;
   1590             SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
   1591             break;
   1592 
   1593         case ACPI_HEST_TYPE_GENERIC_ERROR:
   1594 
   1595             InfoTable = AcpiDmTableInfoHest9;
   1596             SubTableLength = sizeof (ACPI_HEST_GENERIC);
   1597             break;
   1598 
   1599         default:
   1600 
   1601             /* Cannot continue on unknown type - no length */
   1602 
   1603             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", SubTable->Type);
   1604             return;
   1605         }
   1606 
   1607         AcpiOsPrintf ("\n");
   1608         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   1609                     SubTableLength, InfoTable);
   1610         if (ACPI_FAILURE (Status))
   1611         {
   1612             return;
   1613         }
   1614 
   1615         /* Point to end of current subtable (each subtable above is of fixed length) */
   1616 
   1617         Offset += SubTableLength;
   1618 
   1619         /* If there are any (fixed-length) Error Banks from above, dump them now */
   1620 
   1621         if (BankCount)
   1622         {
   1623             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
   1624             SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
   1625 
   1626             while (BankCount)
   1627             {
   1628                 AcpiOsPrintf ("\n");
   1629                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
   1630                             sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
   1631                 if (ACPI_FAILURE (Status))
   1632                 {
   1633                     return;
   1634                 }
   1635                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
   1636                 BankTable++;
   1637                 BankCount--;
   1638             }
   1639         }
   1640 
   1641         /* Point to next subtable */
   1642 
   1643         SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
   1644     }
   1645 }
   1646 
   1647 
   1648 /*******************************************************************************
   1649  *
   1650  * FUNCTION:    AcpiDmDumpIort
   1651  *
   1652  * PARAMETERS:  Table               - A IORT table
   1653  *
   1654  * RETURN:      None
   1655  *
   1656  * DESCRIPTION: Format the contents of a IORT
   1657  *
   1658  ******************************************************************************/
   1659 
   1660 void
   1661 AcpiDmDumpIort (
   1662     ACPI_TABLE_HEADER       *Table)
   1663 {
   1664     ACPI_STATUS             Status;
   1665     ACPI_TABLE_IORT         *Iort;
   1666     ACPI_IORT_NODE          *IortNode;
   1667     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
   1668     ACPI_IORT_SMMU          *IortSmmu = NULL;
   1669     UINT32                  Offset;
   1670     UINT32                  NodeOffset;
   1671     UINT32                  Length;
   1672     ACPI_DMTABLE_INFO       *InfoTable;
   1673     char                    *String;
   1674     UINT32                  i;
   1675 
   1676 
   1677     /* Main table */
   1678 
   1679     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
   1680     if (ACPI_FAILURE (Status))
   1681     {
   1682         return;
   1683     }
   1684 
   1685     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
   1686     Offset = sizeof (ACPI_TABLE_IORT);
   1687 
   1688     /* Dump the OptionalPadding (optional) */
   1689 
   1690     if (Iort->NodeOffset > Offset)
   1691     {
   1692         Status = AcpiDmDumpTable (Table->Length, Offset, Table,
   1693                     Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
   1694         if (ACPI_FAILURE (Status))
   1695         {
   1696             return;
   1697         }
   1698     }
   1699 
   1700     Offset = Iort->NodeOffset;
   1701     while (Offset < Table->Length)
   1702     {
   1703         /* Common subtable header */
   1704 
   1705         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
   1706         AcpiOsPrintf ("\n");
   1707         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
   1708         Status = AcpiDmDumpTable (Table->Length, Offset,
   1709                     IortNode, Length, AcpiDmTableInfoIortHdr);
   1710         if (ACPI_FAILURE (Status))
   1711         {
   1712             return;
   1713         }
   1714 
   1715         NodeOffset = Length;
   1716 
   1717         switch (IortNode->Type)
   1718         {
   1719         case ACPI_IORT_NODE_ITS_GROUP:
   1720 
   1721             InfoTable = AcpiDmTableInfoIort0;
   1722             Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
   1723             IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
   1724             break;
   1725 
   1726         case ACPI_IORT_NODE_NAMED_COMPONENT:
   1727 
   1728             InfoTable = AcpiDmTableInfoIort1;
   1729             Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
   1730             String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
   1731             Length += strlen (String) + 1;
   1732             break;
   1733 
   1734         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
   1735 
   1736             InfoTable = AcpiDmTableInfoIort2;
   1737             Length = IortNode->Length - NodeOffset;
   1738             break;
   1739 
   1740         case ACPI_IORT_NODE_SMMU:
   1741 
   1742             InfoTable = AcpiDmTableInfoIort3;
   1743             Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
   1744             IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
   1745             break;
   1746 
   1747         default:
   1748 
   1749             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
   1750                 IortNode->Type);
   1751 
   1752             /* Attempt to continue */
   1753 
   1754             if (!IortNode->Length)
   1755             {
   1756                 AcpiOsPrintf ("Invalid zero length IORT node\n");
   1757                 return;
   1758             }
   1759             goto NextSubTable;
   1760         }
   1761 
   1762         /* Dump the node subtable header */
   1763 
   1764         AcpiOsPrintf ("\n");
   1765         Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1766                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
   1767                     Length, InfoTable);
   1768         if (ACPI_FAILURE (Status))
   1769         {
   1770             return;
   1771         }
   1772 
   1773         NodeOffset += Length;
   1774 
   1775         /* Dump the node specific data */
   1776 
   1777         switch (IortNode->Type)
   1778         {
   1779         case ACPI_IORT_NODE_ITS_GROUP:
   1780 
   1781             /* Validate IortItsGroup to avoid compiler warnings */
   1782 
   1783             if (IortItsGroup)
   1784             {
   1785                 for (i = 0; i < IortItsGroup->ItsCount; i++)
   1786                 {
   1787                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1788                                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
   1789                                 4, AcpiDmTableInfoIort0a);
   1790                     NodeOffset += 4;
   1791                 }
   1792             }
   1793             break;
   1794 
   1795         case ACPI_IORT_NODE_NAMED_COMPONENT:
   1796 
   1797             /* Dump the Padding (optional) */
   1798 
   1799             if (IortNode->Length > NodeOffset)
   1800             {
   1801                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1802                             Table, IortNode->Length - NodeOffset,
   1803                             AcpiDmTableInfoIort1a);
   1804                 if (ACPI_FAILURE (Status))
   1805                 {
   1806                     return;
   1807                 }
   1808             }
   1809             break;
   1810 
   1811         case ACPI_IORT_NODE_SMMU:
   1812 
   1813             AcpiOsPrintf ("\n");
   1814 
   1815             /* Validate IortSmmu to avoid compiler warnings */
   1816 
   1817             if (IortSmmu)
   1818             {
   1819                 Length = 2 * sizeof (UINT64);
   1820                 NodeOffset = IortSmmu->GlobalInterruptOffset;
   1821                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1822                             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
   1823                             Length, AcpiDmTableInfoIort3a);
   1824                 if (ACPI_FAILURE (Status))
   1825                 {
   1826                     return;
   1827                 }
   1828 
   1829                 NodeOffset = IortSmmu->ContextInterruptOffset;
   1830                 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
   1831                 {
   1832                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1833                                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
   1834                                 8, AcpiDmTableInfoIort3b);
   1835                     if (ACPI_FAILURE (Status))
   1836                     {
   1837                         return;
   1838                     }
   1839                     NodeOffset += 8;
   1840                 }
   1841 
   1842                 NodeOffset = IortSmmu->PmuInterruptOffset;
   1843                 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
   1844                 {
   1845                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1846                                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
   1847                                 8, AcpiDmTableInfoIort3c);
   1848                     if (ACPI_FAILURE (Status))
   1849                     {
   1850                         return;
   1851                     }
   1852                     NodeOffset += 8;
   1853                 }
   1854             }
   1855             break;
   1856 
   1857         default:
   1858 
   1859             break;
   1860         }
   1861 
   1862         /* Dump the ID mappings */
   1863 
   1864         NodeOffset = IortNode->MappingOffset;
   1865         for (i = 0; i < IortNode->MappingCount; i++)
   1866         {
   1867             AcpiOsPrintf ("\n");
   1868             Length = sizeof (ACPI_IORT_ID_MAPPING);
   1869             Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
   1870                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
   1871                         Length, AcpiDmTableInfoIortMap);
   1872             if (ACPI_FAILURE (Status))
   1873             {
   1874                 return;
   1875             }
   1876             NodeOffset += Length;
   1877         }
   1878 
   1879 NextSubTable:
   1880         /* Point to next node subtable */
   1881 
   1882         Offset += IortNode->Length;
   1883         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
   1884     }
   1885 }
   1886 
   1887 
   1888 /*******************************************************************************
   1889  *
   1890  * FUNCTION:    AcpiDmDumpIvrs
   1891  *
   1892  * PARAMETERS:  Table               - A IVRS table
   1893  *
   1894  * RETURN:      None
   1895  *
   1896  * DESCRIPTION: Format the contents of a IVRS
   1897  *
   1898  ******************************************************************************/
   1899 
   1900 static UINT8 EntrySizes[] = {4,8,16,32};
   1901 
   1902 void
   1903 AcpiDmDumpIvrs (
   1904     ACPI_TABLE_HEADER       *Table)
   1905 {
   1906     ACPI_STATUS             Status;
   1907     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
   1908     UINT32                  EntryOffset;
   1909     UINT32                  EntryLength;
   1910     UINT32                  EntryType;
   1911     ACPI_IVRS_DE_HEADER     *DeviceEntry;
   1912     ACPI_IVRS_HEADER        *SubTable;
   1913     ACPI_DMTABLE_INFO       *InfoTable;
   1914 
   1915 
   1916     /* Main table */
   1917 
   1918     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
   1919     if (ACPI_FAILURE (Status))
   1920     {
   1921         return;
   1922     }
   1923 
   1924     /* Subtables */
   1925 
   1926     SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
   1927     while (Offset < Table->Length)
   1928     {
   1929         /* Common subtable header */
   1930 
   1931         AcpiOsPrintf ("\n");
   1932         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   1933                     SubTable->Length, AcpiDmTableInfoIvrsHdr);
   1934         if (ACPI_FAILURE (Status))
   1935         {
   1936             return;
   1937         }
   1938 
   1939         switch (SubTable->Type)
   1940         {
   1941         case ACPI_IVRS_TYPE_HARDWARE:
   1942 
   1943             InfoTable = AcpiDmTableInfoIvrs0;
   1944             break;
   1945 
   1946         case ACPI_IVRS_TYPE_MEMORY1:
   1947         case ACPI_IVRS_TYPE_MEMORY2:
   1948         case ACPI_IVRS_TYPE_MEMORY3:
   1949 
   1950             InfoTable = AcpiDmTableInfoIvrs1;
   1951             break;
   1952 
   1953         default:
   1954 
   1955             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
   1956                 SubTable->Type);
   1957 
   1958             /* Attempt to continue */
   1959 
   1960             if (!SubTable->Length)
   1961             {
   1962                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1963                 return;
   1964             }
   1965             goto NextSubTable;
   1966         }
   1967 
   1968         /* Dump the subtable */
   1969 
   1970         AcpiOsPrintf ("\n");
   1971         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   1972                     SubTable->Length, InfoTable);
   1973         if (ACPI_FAILURE (Status))
   1974         {
   1975             return;
   1976         }
   1977 
   1978         /* The hardware subtable can contain multiple device entries */
   1979 
   1980         if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
   1981         {
   1982             EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
   1983             DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
   1984                             sizeof (ACPI_IVRS_HARDWARE));
   1985 
   1986             while (EntryOffset < (Offset + SubTable->Length))
   1987             {
   1988                 AcpiOsPrintf ("\n");
   1989                 /*
   1990                  * Upper 2 bits of Type encode the length of the device entry
   1991                  *
   1992                  * 00 = 4 byte
   1993                  * 01 = 8 byte
   1994                  * 10 = 16 byte - currently no entries defined
   1995                  * 11 = 32 byte - currently no entries defined
   1996                  */
   1997                 EntryType = DeviceEntry->Type;
   1998                 EntryLength = EntrySizes [EntryType >> 6];
   1999 
   2000                 switch (EntryType)
   2001                 {
   2002                 /* 4-byte device entries */
   2003 
   2004                 case ACPI_IVRS_TYPE_PAD4:
   2005                 case ACPI_IVRS_TYPE_ALL:
   2006                 case ACPI_IVRS_TYPE_SELECT:
   2007                 case ACPI_IVRS_TYPE_START:
   2008                 case ACPI_IVRS_TYPE_END:
   2009 
   2010                     InfoTable = AcpiDmTableInfoIvrs4;
   2011                     break;
   2012 
   2013                 /* 8-byte entries, type A */
   2014 
   2015                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
   2016                 case ACPI_IVRS_TYPE_ALIAS_START:
   2017 
   2018                     InfoTable = AcpiDmTableInfoIvrs8a;
   2019                     break;
   2020 
   2021                 /* 8-byte entries, type B */
   2022 
   2023                 case ACPI_IVRS_TYPE_PAD8:
   2024                 case ACPI_IVRS_TYPE_EXT_SELECT:
   2025                 case ACPI_IVRS_TYPE_EXT_START:
   2026 
   2027                     InfoTable = AcpiDmTableInfoIvrs8b;
   2028                     break;
   2029 
   2030                 /* 8-byte entries, type C */
   2031 
   2032                 case ACPI_IVRS_TYPE_SPECIAL:
   2033 
   2034                     InfoTable = AcpiDmTableInfoIvrs8c;
   2035                     break;
   2036 
   2037                 default:
   2038                     InfoTable = AcpiDmTableInfoIvrs4;
   2039                     AcpiOsPrintf (
   2040                         "\n**** Unknown IVRS device entry type/length: "
   2041                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
   2042                         EntryType, EntryLength, EntryOffset);
   2043                     break;
   2044                 }
   2045 
   2046                 /* Dump the Device Entry */
   2047 
   2048                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
   2049                             DeviceEntry, EntryLength, InfoTable);
   2050                 if (ACPI_FAILURE (Status))
   2051                 {
   2052                     return;
   2053                 }
   2054 
   2055                 EntryOffset += EntryLength;
   2056                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
   2057                                 EntryLength);
   2058             }
   2059         }
   2060 
   2061 NextSubTable:
   2062         /* Point to next subtable */
   2063 
   2064         Offset += SubTable->Length;
   2065         SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
   2066     }
   2067 }
   2068 
   2069 
   2070 /*******************************************************************************
   2071  *
   2072  * FUNCTION:    AcpiDmDumpLpit
   2073  *
   2074  * PARAMETERS:  Table               - A LPIT table
   2075  *
   2076  * RETURN:      None
   2077  *
   2078  * DESCRIPTION: Format the contents of a LPIT. This table type consists
   2079  *              of an open-ended number of subtables. Note: There are no
   2080  *              entries in the main table. An LPIT consists of the table
   2081  *              header and then subtables only.
   2082  *
   2083  ******************************************************************************/
   2084 
   2085 void
   2086 AcpiDmDumpLpit (
   2087     ACPI_TABLE_HEADER       *Table)
   2088 {
   2089     ACPI_STATUS             Status;
   2090     ACPI_LPIT_HEADER        *SubTable;
   2091     UINT32                  Length = Table->Length;
   2092     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
   2093     ACPI_DMTABLE_INFO       *InfoTable;
   2094     UINT32                  SubTableLength;
   2095 
   2096 
   2097     /* Subtables */
   2098 
   2099     SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
   2100     while (Offset < Table->Length)
   2101     {
   2102         /* Common subtable header */
   2103 
   2104         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2105                     sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
   2106         if (ACPI_FAILURE (Status))
   2107         {
   2108             return;
   2109         }
   2110 
   2111         switch (SubTable->Type)
   2112         {
   2113         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
   2114 
   2115             InfoTable = AcpiDmTableInfoLpit0;
   2116             SubTableLength = sizeof (ACPI_LPIT_NATIVE);
   2117             break;
   2118 
   2119         default:
   2120 
   2121             /* Cannot continue on unknown type - no length */
   2122 
   2123             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", SubTable->Type);
   2124             return;
   2125         }
   2126 
   2127         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2128                     SubTableLength, InfoTable);
   2129         if (ACPI_FAILURE (Status))
   2130         {
   2131             return;
   2132         }
   2133         AcpiOsPrintf ("\n");
   2134 
   2135         /* Point to next subtable */
   2136 
   2137         Offset += SubTableLength;
   2138         SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
   2139     }
   2140 }
   2141 
   2142 
   2143 /*******************************************************************************
   2144  *
   2145  * FUNCTION:    AcpiDmDumpMadt
   2146  *
   2147  * PARAMETERS:  Table               - A MADT table
   2148  *
   2149  * RETURN:      None
   2150  *
   2151  * DESCRIPTION: Format the contents of a MADT. This table type consists
   2152  *              of an open-ended number of subtables.
   2153  *
   2154  ******************************************************************************/
   2155 
   2156 void
   2157 AcpiDmDumpMadt (
   2158     ACPI_TABLE_HEADER       *Table)
   2159 {
   2160     ACPI_STATUS             Status;
   2161     ACPI_SUBTABLE_HEADER    *SubTable;
   2162     UINT32                  Length = Table->Length;
   2163     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
   2164     ACPI_DMTABLE_INFO       *InfoTable;
   2165 
   2166 
   2167     /* Main table */
   2168 
   2169     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
   2170     if (ACPI_FAILURE (Status))
   2171     {
   2172         return;
   2173     }
   2174 
   2175     /* Subtables */
   2176 
   2177     SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
   2178     while (Offset < Table->Length)
   2179     {
   2180         /* Common subtable header */
   2181 
   2182         AcpiOsPrintf ("\n");
   2183         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2184                     SubTable->Length, AcpiDmTableInfoMadtHdr);
   2185         if (ACPI_FAILURE (Status))
   2186         {
   2187             return;
   2188         }
   2189 
   2190         switch (SubTable->Type)
   2191         {
   2192         case ACPI_MADT_TYPE_LOCAL_APIC:
   2193 
   2194             InfoTable = AcpiDmTableInfoMadt0;
   2195             break;
   2196 
   2197         case ACPI_MADT_TYPE_IO_APIC:
   2198 
   2199             InfoTable = AcpiDmTableInfoMadt1;
   2200             break;
   2201 
   2202         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
   2203 
   2204             InfoTable = AcpiDmTableInfoMadt2;
   2205             break;
   2206 
   2207         case ACPI_MADT_TYPE_NMI_SOURCE:
   2208 
   2209             InfoTable = AcpiDmTableInfoMadt3;
   2210             break;
   2211 
   2212         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
   2213 
   2214             InfoTable = AcpiDmTableInfoMadt4;
   2215             break;
   2216 
   2217         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
   2218 
   2219             InfoTable = AcpiDmTableInfoMadt5;
   2220             break;
   2221 
   2222         case ACPI_MADT_TYPE_IO_SAPIC:
   2223 
   2224             InfoTable = AcpiDmTableInfoMadt6;
   2225             break;
   2226 
   2227         case ACPI_MADT_TYPE_LOCAL_SAPIC:
   2228 
   2229             InfoTable = AcpiDmTableInfoMadt7;
   2230             break;
   2231 
   2232         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
   2233 
   2234             InfoTable = AcpiDmTableInfoMadt8;
   2235             break;
   2236 
   2237         case ACPI_MADT_TYPE_LOCAL_X2APIC:
   2238 
   2239             InfoTable = AcpiDmTableInfoMadt9;
   2240             break;
   2241 
   2242         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
   2243 
   2244             InfoTable = AcpiDmTableInfoMadt10;
   2245             break;
   2246 
   2247         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
   2248 
   2249             InfoTable = AcpiDmTableInfoMadt11;
   2250             break;
   2251 
   2252         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
   2253 
   2254             InfoTable = AcpiDmTableInfoMadt12;
   2255             break;
   2256 
   2257         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
   2258 
   2259             InfoTable = AcpiDmTableInfoMadt13;
   2260             break;
   2261 
   2262         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
   2263 
   2264             InfoTable = AcpiDmTableInfoMadt14;
   2265             break;
   2266 
   2267         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
   2268 
   2269             InfoTable = AcpiDmTableInfoMadt15;
   2270             break;
   2271 
   2272         default:
   2273 
   2274             AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", SubTable->Type);
   2275 
   2276             /* Attempt to continue */
   2277 
   2278             if (!SubTable->Length)
   2279             {
   2280                 AcpiOsPrintf ("Invalid zero length subtable\n");
   2281                 return;
   2282             }
   2283             goto NextSubTable;
   2284         }
   2285 
   2286         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2287                     SubTable->Length, InfoTable);
   2288         if (ACPI_FAILURE (Status))
   2289         {
   2290             return;
   2291         }
   2292 
   2293 NextSubTable:
   2294         /* Point to next subtable */
   2295 
   2296         Offset += SubTable->Length;
   2297         SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
   2298     }
   2299 }
   2300 
   2301 
   2302 /*******************************************************************************
   2303  *
   2304  * FUNCTION:    AcpiDmDumpMcfg
   2305  *
   2306  * PARAMETERS:  Table               - A MCFG Table
   2307  *
   2308  * RETURN:      None
   2309  *
   2310  * DESCRIPTION: Format the contents of a MCFG table
   2311  *
   2312  ******************************************************************************/
   2313 
   2314 void
   2315 AcpiDmDumpMcfg (
   2316     ACPI_TABLE_HEADER       *Table)
   2317 {
   2318     ACPI_STATUS             Status;
   2319     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
   2320     ACPI_MCFG_ALLOCATION    *SubTable;
   2321 
   2322 
   2323     /* Main table */
   2324 
   2325     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
   2326     if (ACPI_FAILURE (Status))
   2327     {
   2328         return;
   2329     }
   2330 
   2331     /* Subtables */
   2332 
   2333     SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
   2334     while (Offset < Table->Length)
   2335     {
   2336         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
   2337         {
   2338             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
   2339                 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
   2340             return;
   2341         }
   2342 
   2343         AcpiOsPrintf ("\n");
   2344         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   2345                     sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
   2346         if (ACPI_FAILURE (Status))
   2347         {
   2348             return;
   2349         }
   2350 
   2351         /* Point to next subtable (each subtable is of fixed length) */
   2352 
   2353         Offset += sizeof (ACPI_MCFG_ALLOCATION);
   2354         SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
   2355                         sizeof (ACPI_MCFG_ALLOCATION));
   2356     }
   2357 }
   2358 
   2359 
   2360 /*******************************************************************************
   2361  *
   2362  * FUNCTION:    AcpiDmDumpMpst
   2363  *
   2364  * PARAMETERS:  Table               - A MPST Table
   2365  *
   2366  * RETURN:      None
   2367  *
   2368  * DESCRIPTION: Format the contents of a MPST table
   2369  *
   2370  ******************************************************************************/
   2371 
   2372 void
   2373 AcpiDmDumpMpst (
   2374     ACPI_TABLE_HEADER       *Table)
   2375 {
   2376     ACPI_STATUS             Status;
   2377     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
   2378     ACPI_MPST_POWER_NODE    *SubTable0;
   2379     ACPI_MPST_POWER_STATE   *SubTable0A;
   2380     ACPI_MPST_COMPONENT     *SubTable0B;
   2381     ACPI_MPST_DATA_HDR      *SubTable1;
   2382     ACPI_MPST_POWER_DATA    *SubTable2;
   2383     UINT16                  SubtableCount;
   2384     UINT32                  PowerStateCount;
   2385     UINT32                  ComponentCount;
   2386 
   2387 
   2388     /* Main table */
   2389 
   2390     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
   2391     if (ACPI_FAILURE (Status))
   2392     {
   2393         return;
   2394     }
   2395 
   2396     /* Subtable: Memory Power Node(s) */
   2397 
   2398     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
   2399     SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
   2400 
   2401     while ((Offset < Table->Length) && SubtableCount)
   2402     {
   2403         AcpiOsPrintf ("\n");
   2404         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
   2405                     sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
   2406         if (ACPI_FAILURE (Status))
   2407         {
   2408             return;
   2409         }
   2410 
   2411         /* Extract the sub-subtable counts */
   2412 
   2413         PowerStateCount = SubTable0->NumPowerStates;
   2414         ComponentCount = SubTable0->NumPhysicalComponents;
   2415         Offset += sizeof (ACPI_MPST_POWER_NODE);
   2416 
   2417         /* Sub-subtables - Memory Power State Structure(s) */
   2418 
   2419         SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
   2420             sizeof (ACPI_MPST_POWER_NODE));
   2421 
   2422         while (PowerStateCount)
   2423         {
   2424             AcpiOsPrintf ("\n");
   2425             Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
   2426                         sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
   2427             if (ACPI_FAILURE (Status))
   2428             {
   2429                 return;
   2430             }
   2431 
   2432             SubTable0A++;
   2433             PowerStateCount--;
   2434             Offset += sizeof (ACPI_MPST_POWER_STATE);
   2435        }
   2436 
   2437         /* Sub-subtables - Physical Component ID Structure(s) */
   2438 
   2439         SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
   2440 
   2441         if (ComponentCount)
   2442         {
   2443             AcpiOsPrintf ("\n");
   2444         }
   2445 
   2446         while (ComponentCount)
   2447         {
   2448             Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
   2449                         sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
   2450             if (ACPI_FAILURE (Status))
   2451             {
   2452                 return;
   2453             }
   2454 
   2455             SubTable0B++;
   2456             ComponentCount--;
   2457             Offset += sizeof (ACPI_MPST_COMPONENT);
   2458         }
   2459 
   2460         /* Point to next Memory Power Node subtable */
   2461 
   2462         SubtableCount--;
   2463         SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
   2464             sizeof (ACPI_MPST_POWER_NODE) +
   2465             (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
   2466             (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
   2467     }
   2468 
   2469     /* Subtable: Count of Memory Power State Characteristic structures */
   2470 
   2471     AcpiOsPrintf ("\n");
   2472     SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
   2473     Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
   2474                 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
   2475     if (ACPI_FAILURE (Status))
   2476     {
   2477         return;
   2478     }
   2479 
   2480     SubtableCount = SubTable1->CharacteristicsCount;
   2481     Offset += sizeof (ACPI_MPST_DATA_HDR);
   2482 
   2483     /* Subtable: Memory Power State Characteristics structure(s) */
   2484 
   2485     SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
   2486 
   2487     while ((Offset < Table->Length) && SubtableCount)
   2488     {
   2489         AcpiOsPrintf ("\n");
   2490         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
   2491                     sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
   2492         if (ACPI_FAILURE (Status))
   2493         {
   2494             return;
   2495         }
   2496 
   2497         SubTable2++;
   2498         SubtableCount--;
   2499         Offset += sizeof (ACPI_MPST_POWER_DATA);
   2500     }
   2501 }
   2502 
   2503 
   2504 /*******************************************************************************
   2505  *
   2506  * FUNCTION:    AcpiDmDumpMsct
   2507  *
   2508  * PARAMETERS:  Table               - A MSCT table
   2509  *
   2510  * RETURN:      None
   2511  *
   2512  * DESCRIPTION: Format the contents of a MSCT
   2513  *
   2514  ******************************************************************************/
   2515 
   2516 void
   2517 AcpiDmDumpMsct (
   2518     ACPI_TABLE_HEADER       *Table)
   2519 {
   2520     ACPI_STATUS             Status;
   2521     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
   2522     ACPI_MSCT_PROXIMITY     *SubTable;
   2523 
   2524 
   2525     /* Main table */
   2526 
   2527     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
   2528     if (ACPI_FAILURE (Status))
   2529     {
   2530         return;
   2531     }
   2532 
   2533     /* Subtables */
   2534 
   2535     SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
   2536     while (Offset < Table->Length)
   2537     {
   2538         /* Common subtable header */
   2539 
   2540         AcpiOsPrintf ("\n");
   2541         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   2542                     sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
   2543         if (ACPI_FAILURE (Status))
   2544         {
   2545             return;
   2546         }
   2547 
   2548         /* Point to next subtable */
   2549 
   2550         Offset += sizeof (ACPI_MSCT_PROXIMITY);
   2551         SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
   2552     }
   2553 }
   2554 
   2555 
   2556 /*******************************************************************************
   2557  *
   2558  * FUNCTION:    AcpiDmDumpMtmr
   2559  *
   2560  * PARAMETERS:  Table               - A MTMR table
   2561  *
   2562  * RETURN:      None
   2563  *
   2564  * DESCRIPTION: Format the contents of a MTMR
   2565  *
   2566  ******************************************************************************/
   2567 
   2568 void
   2569 AcpiDmDumpMtmr (
   2570     ACPI_TABLE_HEADER       *Table)
   2571 {
   2572     ACPI_STATUS             Status;
   2573     UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
   2574     ACPI_MTMR_ENTRY         *SubTable;
   2575 
   2576 
   2577     /* Main table */
   2578 
   2579     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
   2580     if (ACPI_FAILURE (Status))
   2581     {
   2582         return;
   2583     }
   2584 
   2585     /* Subtables */
   2586 
   2587     SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
   2588     while (Offset < Table->Length)
   2589     {
   2590         /* Common subtable header */
   2591 
   2592         AcpiOsPrintf ("\n");
   2593         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   2594                     sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
   2595         if (ACPI_FAILURE (Status))
   2596         {
   2597             return;
   2598         }
   2599 
   2600         /* Point to next subtable */
   2601 
   2602         Offset += sizeof (ACPI_MTMR_ENTRY);
   2603         SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, sizeof (ACPI_MTMR_ENTRY));
   2604     }
   2605 }
   2606 
   2607 
   2608 /*******************************************************************************
   2609  *
   2610  * FUNCTION:    AcpiDmDumpNfit
   2611  *
   2612  * PARAMETERS:  Table               - A NFIT table
   2613  *
   2614  * RETURN:      None
   2615  *
   2616  * DESCRIPTION: Format the contents of an NFIT.
   2617  *
   2618  ******************************************************************************/
   2619 
   2620 void
   2621 AcpiDmDumpNfit (
   2622     ACPI_TABLE_HEADER       *Table)
   2623 {
   2624     ACPI_STATUS             Status;
   2625     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
   2626     UINT32                  FieldOffset = 0;
   2627     UINT32                  Length;
   2628     ACPI_NFIT_HEADER        *SubTable;
   2629     ACPI_DMTABLE_INFO       *InfoTable;
   2630     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
   2631     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
   2632     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
   2633     UINT32                  i;
   2634 
   2635 
   2636     /* Main table */
   2637 
   2638     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
   2639     if (ACPI_FAILURE (Status))
   2640     {
   2641         return;
   2642     }
   2643 
   2644     /* Subtables */
   2645 
   2646     SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
   2647     while (Offset < Table->Length)
   2648     {
   2649         /* NFIT subtable header */
   2650 
   2651         AcpiOsPrintf ("\n");
   2652         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   2653                     SubTable->Length, AcpiDmTableInfoNfitHdr);
   2654         if (ACPI_FAILURE (Status))
   2655         {
   2656             return;
   2657         }
   2658 
   2659         switch (SubTable->Type)
   2660         {
   2661         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
   2662 
   2663             InfoTable = AcpiDmTableInfoNfit0;
   2664             break;
   2665 
   2666         case ACPI_NFIT_TYPE_MEMORY_MAP:
   2667 
   2668             InfoTable = AcpiDmTableInfoNfit1;
   2669             break;
   2670 
   2671         case ACPI_NFIT_TYPE_INTERLEAVE:
   2672 
   2673             /* Has a variable number of 32-bit values at the end */
   2674 
   2675             InfoTable = AcpiDmTableInfoNfit2;
   2676             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable);
   2677             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
   2678             break;
   2679 
   2680         case ACPI_NFIT_TYPE_SMBIOS:
   2681 
   2682             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable);
   2683             InfoTable = AcpiDmTableInfoNfit3;
   2684             break;
   2685 
   2686         case ACPI_NFIT_TYPE_CONTROL_REGION:
   2687 
   2688             InfoTable = AcpiDmTableInfoNfit4;
   2689             break;
   2690 
   2691         case ACPI_NFIT_TYPE_DATA_REGION:
   2692 
   2693             InfoTable = AcpiDmTableInfoNfit5;
   2694             break;
   2695 
   2696         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   2697 
   2698             /* Has a variable number of 64-bit addresses at the end */
   2699 
   2700             InfoTable = AcpiDmTableInfoNfit6;
   2701             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable);
   2702             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
   2703             break;
   2704 
   2705         default:
   2706             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", SubTable->Type);
   2707 
   2708             /* Attempt to continue */
   2709 
   2710             if (!SubTable->Length)
   2711             {
   2712                 AcpiOsPrintf ("Invalid zero length subtable\n");
   2713                 return;
   2714             }
   2715             goto NextSubTable;
   2716         }
   2717 
   2718         AcpiOsPrintf ("\n");
   2719         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   2720                     SubTable->Length, InfoTable);
   2721         if (ACPI_FAILURE (Status))
   2722         {
   2723             return;
   2724         }
   2725 
   2726         /* Per-subtable variable-length fields */
   2727 
   2728         switch (SubTable->Type)
   2729         {
   2730         case ACPI_NFIT_TYPE_INTERLEAVE:
   2731 
   2732             for (i = 0; i < Interleave->LineCount; i++)
   2733             {
   2734                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   2735                             &Interleave->LineOffset[i],
   2736                             sizeof (UINT32), AcpiDmTableInfoNfit2a);
   2737                 if (ACPI_FAILURE (Status))
   2738                 {
   2739                     return;
   2740                 }
   2741 
   2742                 FieldOffset += sizeof (UINT32);
   2743             }
   2744             break;
   2745 
   2746         case ACPI_NFIT_TYPE_SMBIOS:
   2747 
   2748             Length = SubTable->Length - sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
   2749             if (Length)
   2750             {
   2751                 Status = AcpiDmDumpTable (Table->Length,
   2752                             sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
   2753                             SmbiosInfo,
   2754                             Length, AcpiDmTableInfoNfit3a);
   2755                 if (ACPI_FAILURE (Status))
   2756                 {
   2757                     return;
   2758                 }
   2759             }
   2760 
   2761             break;
   2762 
   2763         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   2764 
   2765             for (i = 0; i < Hint->HintCount; i++)
   2766             {
   2767                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
   2768                             &Hint->HintAddress[i],
   2769                             sizeof (UINT64), AcpiDmTableInfoNfit6a);
   2770                 if (ACPI_FAILURE (Status))
   2771                 {
   2772                     return;
   2773                 }
   2774 
   2775                 FieldOffset += sizeof (UINT64);
   2776             }
   2777             break;
   2778 
   2779         default:
   2780             break;
   2781         }
   2782 
   2783 NextSubTable:
   2784         /* Point to next subtable */
   2785 
   2786         Offset += SubTable->Length;
   2787         SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length);
   2788     }
   2789 }
   2790 
   2791 
   2792 /*******************************************************************************
   2793  *
   2794  * FUNCTION:    AcpiDmDumpPcct
   2795  *
   2796  * PARAMETERS:  Table               - A PCCT table
   2797  *
   2798  * RETURN:      None
   2799  *
   2800  * DESCRIPTION: Format the contents of a PCCT. This table type consists
   2801  *              of an open-ended number of subtables.
   2802  *
   2803  ******************************************************************************/
   2804 
   2805 void
   2806 AcpiDmDumpPcct (
   2807     ACPI_TABLE_HEADER       *Table)
   2808 {
   2809     ACPI_STATUS             Status;
   2810     ACPI_PCCT_SUBSPACE      *SubTable;
   2811     ACPI_DMTABLE_INFO       *InfoTable;
   2812     UINT32                  Length = Table->Length;
   2813     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
   2814 
   2815 
   2816     /* Main table */
   2817 
   2818     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
   2819     if (ACPI_FAILURE (Status))
   2820     {
   2821         return;
   2822     }
   2823 
   2824     /* Subtables */
   2825 
   2826     SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
   2827     while (Offset < Table->Length)
   2828     {
   2829         /* Common subtable header */
   2830 
   2831         AcpiOsPrintf ("\n");
   2832         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2833                     SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
   2834         if (ACPI_FAILURE (Status))
   2835         {
   2836             return;
   2837         }
   2838 
   2839         switch (SubTable->Header.Type)
   2840         {
   2841         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   2842 
   2843             InfoTable = AcpiDmTableInfoPcct0;
   2844             break;
   2845 
   2846         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   2847 
   2848             InfoTable = AcpiDmTableInfoPcct1;
   2849             break;
   2850 
   2851         default:
   2852 
   2853             AcpiOsPrintf (
   2854                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
   2855                 SubTable->Header.Type);
   2856             return;
   2857         }
   2858 
   2859         AcpiOsPrintf ("\n");
   2860         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2861                     SubTable->Header.Length, InfoTable);
   2862         if (ACPI_FAILURE (Status))
   2863         {
   2864             return;
   2865         }
   2866 
   2867         /* Point to next subtable */
   2868 
   2869         Offset += SubTable->Header.Length;
   2870         SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
   2871                     SubTable->Header.Length);
   2872     }
   2873 }
   2874 
   2875 
   2876 /*******************************************************************************
   2877  *
   2878  * FUNCTION:    AcpiDmDumpPmtt
   2879  *
   2880  * PARAMETERS:  Table               - A PMTT table
   2881  *
   2882  * RETURN:      None
   2883  *
   2884  * DESCRIPTION: Format the contents of a PMTT. This table type consists
   2885  *              of an open-ended number of subtables.
   2886  *
   2887  ******************************************************************************/
   2888 
   2889 void
   2890 AcpiDmDumpPmtt (
   2891     ACPI_TABLE_HEADER       *Table)
   2892 {
   2893     ACPI_STATUS             Status;
   2894     ACPI_PMTT_HEADER        *SubTable;
   2895     ACPI_PMTT_HEADER        *MemSubTable;
   2896     ACPI_PMTT_HEADER        *DimmSubTable;
   2897     ACPI_PMTT_DOMAIN        *DomainArray;
   2898     UINT32                  Length = Table->Length;
   2899     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
   2900     UINT32                  MemOffset;
   2901     UINT32                  DimmOffset;
   2902     UINT32                  DomainOffset;
   2903     UINT32                  DomainCount;
   2904 
   2905 
   2906     /* Main table */
   2907 
   2908     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
   2909     if (ACPI_FAILURE (Status))
   2910     {
   2911         return;
   2912     }
   2913 
   2914     /* Subtables */
   2915 
   2916     SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
   2917     while (Offset < Table->Length)
   2918     {
   2919         /* Common subtable header */
   2920 
   2921         AcpiOsPrintf ("\n");
   2922         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2923                     SubTable->Length, AcpiDmTableInfoPmttHdr);
   2924         if (ACPI_FAILURE (Status))
   2925         {
   2926             return;
   2927         }
   2928 
   2929         /* Only Socket subtables are expected at this level */
   2930 
   2931         if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
   2932         {
   2933             AcpiOsPrintf (
   2934                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
   2935                 SubTable->Type);
   2936             return;
   2937         }
   2938 
   2939         /* Dump the fixed-length portion of the subtable */
   2940 
   2941         Status = AcpiDmDumpTable (Length, Offset, SubTable,
   2942                     SubTable->Length, AcpiDmTableInfoPmtt0);
   2943         if (ACPI_FAILURE (Status))
   2944         {
   2945             return;
   2946         }
   2947 
   2948         /* Walk the memory controller subtables */
   2949 
   2950         MemOffset = sizeof (ACPI_PMTT_SOCKET);
   2951         MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
   2952             sizeof (ACPI_PMTT_SOCKET));
   2953 
   2954         while (((Offset + MemOffset) < Table->Length) &&
   2955             (MemOffset < SubTable->Length))
   2956         {
   2957             /* Common subtable header */
   2958 
   2959             AcpiOsPrintf ("\n");
   2960             Status = AcpiDmDumpTable (Length,
   2961                         Offset + MemOffset, MemSubTable,
   2962                         MemSubTable->Length, AcpiDmTableInfoPmttHdr);
   2963             if (ACPI_FAILURE (Status))
   2964             {
   2965                 return;
   2966             }
   2967 
   2968             /* Only memory controller subtables are expected at this level */
   2969 
   2970             if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
   2971             {
   2972                 AcpiOsPrintf (
   2973                     "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
   2974                     MemSubTable->Type);
   2975                 return;
   2976             }
   2977 
   2978             /* Dump the fixed-length portion of the controller subtable */
   2979 
   2980             Status = AcpiDmDumpTable (Length,
   2981                         Offset + MemOffset, MemSubTable,
   2982                         MemSubTable->Length, AcpiDmTableInfoPmtt1);
   2983             if (ACPI_FAILURE (Status))
   2984             {
   2985                 return;
   2986             }
   2987 
   2988             /* Walk the variable count of proximity domains */
   2989 
   2990             DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
   2991             DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
   2992             DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
   2993                 sizeof (ACPI_PMTT_CONTROLLER));
   2994 
   2995             while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
   2996                 ((MemOffset + DomainOffset) < SubTable->Length) &&
   2997                 DomainCount)
   2998             {
   2999                 Status = AcpiDmDumpTable (Length,
   3000                             Offset + MemOffset + DomainOffset, DomainArray,
   3001                             sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
   3002                 if (ACPI_FAILURE (Status))
   3003                 {
   3004                     return;
   3005                 }
   3006 
   3007                 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
   3008                 DomainArray++;
   3009                 DomainCount--;
   3010             }
   3011 
   3012             if (DomainCount)
   3013             {
   3014                 AcpiOsPrintf (
   3015                     "\n**** DomainCount exceeds subtable length\n\n");
   3016             }
   3017 
   3018             /* Walk the physical component (DIMM) subtables */
   3019 
   3020             DimmOffset = DomainOffset;
   3021             DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
   3022                 DomainOffset);
   3023 
   3024             while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
   3025                 (DimmOffset < MemSubTable->Length))
   3026             {
   3027                 /* Common subtable header */
   3028 
   3029                 AcpiOsPrintf ("\n");
   3030                 Status = AcpiDmDumpTable (Length,
   3031                             Offset + MemOffset + DimmOffset, DimmSubTable,
   3032                             DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
   3033                 if (ACPI_FAILURE (Status))
   3034                 {
   3035                     return;
   3036                 }
   3037 
   3038                 /* Only DIMM subtables are expected at this level */
   3039 
   3040                 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
   3041                 {
   3042                     AcpiOsPrintf (
   3043                         "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
   3044                         DimmSubTable->Type);
   3045                     return;
   3046                 }
   3047 
   3048                 /* Dump the fixed-length DIMM subtable */
   3049 
   3050                 Status = AcpiDmDumpTable (Length,
   3051                             Offset + MemOffset + DimmOffset, DimmSubTable,
   3052                             DimmSubTable->Length, AcpiDmTableInfoPmtt2);
   3053                 if (ACPI_FAILURE (Status))
   3054                 {
   3055                     return;
   3056                 }
   3057 
   3058                 /* Point to next DIMM subtable */
   3059 
   3060                 DimmOffset += DimmSubTable->Length;
   3061                 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
   3062                     DimmSubTable, DimmSubTable->Length);
   3063             }
   3064 
   3065             /* Point to next Controller subtable */
   3066 
   3067             MemOffset += MemSubTable->Length;
   3068             MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
   3069                 MemSubTable, MemSubTable->Length);
   3070         }
   3071 
   3072         /* Point to next Socket subtable */
   3073 
   3074         Offset += SubTable->Length;
   3075         SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
   3076             SubTable, SubTable->Length);
   3077     }
   3078 }
   3079 
   3080 
   3081 /*******************************************************************************
   3082  *
   3083  * FUNCTION:    AcpiDmDumpS3pt
   3084  *
   3085  * PARAMETERS:  Table               - A S3PT table
   3086  *
   3087  * RETURN:      Length of the table
   3088  *
   3089  * DESCRIPTION: Format the contents of a S3PT
   3090  *
   3091  ******************************************************************************/
   3092 
   3093 UINT32
   3094 AcpiDmDumpS3pt (
   3095     ACPI_TABLE_HEADER       *Tables)
   3096 {
   3097     ACPI_STATUS             Status;
   3098     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
   3099     ACPI_S3PT_HEADER        *SubTable;
   3100     ACPI_DMTABLE_INFO       *InfoTable;
   3101     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
   3102 
   3103 
   3104     /* Main table */
   3105 
   3106     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
   3107     if (ACPI_FAILURE (Status))
   3108     {
   3109         return 0;
   3110     }
   3111 
   3112     SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
   3113     while (Offset < S3ptTable->Length)
   3114     {
   3115         /* Common subtable header */
   3116 
   3117         AcpiOsPrintf ("\n");
   3118         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
   3119                     SubTable->Length, AcpiDmTableInfoS3ptHdr);
   3120         if (ACPI_FAILURE (Status))
   3121         {
   3122             return 0;
   3123         }
   3124 
   3125         switch (SubTable->Type)
   3126         {
   3127         case ACPI_S3PT_TYPE_RESUME:
   3128 
   3129             InfoTable = AcpiDmTableInfoS3pt0;
   3130             break;
   3131 
   3132         case ACPI_S3PT_TYPE_SUSPEND:
   3133 
   3134             InfoTable = AcpiDmTableInfoS3pt1;
   3135             break;
   3136 
   3137         default:
   3138 
   3139             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", SubTable->Type);
   3140 
   3141             /* Attempt to continue */
   3142 
   3143             if (!SubTable->Length)
   3144             {
   3145                 AcpiOsPrintf ("Invalid zero length subtable\n");
   3146                 return 0;
   3147             }
   3148             goto NextSubTable;
   3149         }
   3150 
   3151         AcpiOsPrintf ("\n");
   3152         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
   3153                     SubTable->Length, InfoTable);
   3154         if (ACPI_FAILURE (Status))
   3155         {
   3156             return 0;
   3157         }
   3158 
   3159 NextSubTable:
   3160         /* Point to next subtable */
   3161 
   3162         Offset += SubTable->Length;
   3163         SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
   3164     }
   3165 
   3166     return (S3ptTable->Length);
   3167 }
   3168 
   3169 
   3170 /*******************************************************************************
   3171  *
   3172  * FUNCTION:    AcpiDmDumpSlic
   3173  *
   3174  * PARAMETERS:  Table               - A SLIC table
   3175  *
   3176  * RETURN:      None
   3177  *
   3178  * DESCRIPTION: Format the contents of a SLIC
   3179  *
   3180  ******************************************************************************/
   3181 
   3182 void
   3183 AcpiDmDumpSlic (
   3184     ACPI_TABLE_HEADER       *Table)
   3185 {
   3186     (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
   3187                 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
   3188 }
   3189 
   3190 
   3191 /*******************************************************************************
   3192  *
   3193  * FUNCTION:    AcpiDmDumpSlit
   3194  *
   3195  * PARAMETERS:  Table               - An SLIT
   3196  *
   3197  * RETURN:      None
   3198  *
   3199  * DESCRIPTION: Format the contents of a SLIT
   3200  *
   3201  ******************************************************************************/
   3202 
   3203 void
   3204 AcpiDmDumpSlit (
   3205     ACPI_TABLE_HEADER       *Table)
   3206 {
   3207     ACPI_STATUS             Status;
   3208     UINT32                  Offset;
   3209     UINT8                   *Row;
   3210     UINT32                  Localities;
   3211     UINT32                  i;
   3212     UINT32                  j;
   3213 
   3214 
   3215     /* Main table */
   3216 
   3217     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
   3218     if (ACPI_FAILURE (Status))
   3219     {
   3220         return;
   3221     }
   3222 
   3223     /* Display the Locality NxN Matrix */
   3224 
   3225     Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
   3226     Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
   3227     Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
   3228 
   3229     for (i = 0; i < Localities; i++)
   3230     {
   3231         /* Display one row of the matrix */
   3232 
   3233         AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
   3234         for  (j = 0; j < Localities; j++)
   3235         {
   3236             /* Check for beyond EOT */
   3237 
   3238             if (Offset >= Table->Length)
   3239             {
   3240                 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
   3241                 return;
   3242             }
   3243 
   3244             AcpiOsPrintf ("%2.2X", Row[j]);
   3245             Offset++;
   3246 
   3247             /* Display up to 16 bytes per output row */
   3248 
   3249             if ((j+1) < Localities)
   3250             {
   3251                 AcpiOsPrintf (" ");
   3252 
   3253                 if (j && (((j+1) % 16) == 0))
   3254                 {
   3255                     AcpiOsPrintf ("\\\n"); /* With line continuation char */
   3256                     AcpiDmLineHeader (Offset, 0, NULL);
   3257                 }
   3258             }
   3259         }
   3260 
   3261         /* Point to next row */
   3262 
   3263         AcpiOsPrintf ("\n");
   3264         Row += Localities;
   3265     }
   3266 }
   3267 
   3268 
   3269 /*******************************************************************************
   3270  *
   3271  * FUNCTION:    AcpiDmDumpSrat
   3272  *
   3273  * PARAMETERS:  Table               - A SRAT table
   3274  *
   3275  * RETURN:      None
   3276  *
   3277  * DESCRIPTION: Format the contents of a SRAT
   3278  *
   3279  ******************************************************************************/
   3280 
   3281 void
   3282 AcpiDmDumpSrat (
   3283     ACPI_TABLE_HEADER       *Table)
   3284 {
   3285     ACPI_STATUS             Status;
   3286     UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
   3287     ACPI_SUBTABLE_HEADER    *SubTable;
   3288     ACPI_DMTABLE_INFO       *InfoTable;
   3289 
   3290 
   3291     /* Main table */
   3292 
   3293     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
   3294     if (ACPI_FAILURE (Status))
   3295     {
   3296         return;
   3297     }
   3298 
   3299     /* Subtables */
   3300 
   3301     SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
   3302     while (Offset < Table->Length)
   3303     {
   3304         /* Common subtable header */
   3305 
   3306         AcpiOsPrintf ("\n");
   3307         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   3308                     SubTable->Length, AcpiDmTableInfoSratHdr);
   3309         if (ACPI_FAILURE (Status))
   3310         {
   3311             return;
   3312         }
   3313 
   3314         switch (SubTable->Type)
   3315         {
   3316         case ACPI_SRAT_TYPE_CPU_AFFINITY:
   3317 
   3318             InfoTable = AcpiDmTableInfoSrat0;
   3319             break;
   3320 
   3321         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   3322 
   3323             InfoTable = AcpiDmTableInfoSrat1;
   3324             break;
   3325 
   3326         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   3327 
   3328             InfoTable = AcpiDmTableInfoSrat2;
   3329             break;
   3330 
   3331         case ACPI_SRAT_TYPE_GICC_AFFINITY:
   3332 
   3333             InfoTable = AcpiDmTableInfoSrat3;
   3334             break;
   3335 
   3336         default:
   3337             AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", SubTable->Type);
   3338 
   3339             /* Attempt to continue */
   3340 
   3341             if (!SubTable->Length)
   3342             {
   3343                 AcpiOsPrintf ("Invalid zero length subtable\n");
   3344                 return;
   3345             }
   3346             goto NextSubTable;
   3347         }
   3348 
   3349         AcpiOsPrintf ("\n");
   3350         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   3351                     SubTable->Length, InfoTable);
   3352         if (ACPI_FAILURE (Status))
   3353         {
   3354             return;
   3355         }
   3356 
   3357 NextSubTable:
   3358         /* Point to next subtable */
   3359 
   3360         Offset += SubTable->Length;
   3361         SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
   3362     }
   3363 }
   3364 
   3365 
   3366 /*******************************************************************************
   3367  *
   3368  * FUNCTION:    AcpiDmDumpStao
   3369  *
   3370  * PARAMETERS:  Table               - A STAO table
   3371  *
   3372  * RETURN:      None
   3373  *
   3374  * DESCRIPTION: Format the contents of a STAO. This is a variable-length
   3375  *              table that contains an open-ended number of ASCII strings
   3376  *              at the end of the table.
   3377  *
   3378  ******************************************************************************/
   3379 
   3380 void
   3381 AcpiDmDumpStao (
   3382     ACPI_TABLE_HEADER       *Table)
   3383 {
   3384     ACPI_STATUS             Status;
   3385     char                    *Namepath;
   3386     UINT32                  Length = Table->Length;
   3387     UINT32                  StringLength;
   3388     UINT32                  Offset = sizeof (ACPI_TABLE_STAO);
   3389 
   3390 
   3391     /* Main table */
   3392 
   3393     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
   3394     if (ACPI_FAILURE (Status))
   3395     {
   3396         return;
   3397     }
   3398 
   3399     /* The rest of the table consists of Namepath strings */
   3400 
   3401     while (Offset < Table->Length)
   3402     {
   3403         Namepath = ACPI_ADD_PTR (char, Table, Offset);
   3404         StringLength = strlen (Namepath) + 1;
   3405 
   3406         AcpiDmLineHeader (Offset, StringLength, "Namestring");
   3407         AcpiOsPrintf ("\"%s\"\n", Namepath);
   3408 
   3409         /* Point to next namepath */
   3410 
   3411         Offset += StringLength;
   3412     }
   3413 }
   3414 
   3415 
   3416 /*******************************************************************************
   3417  *
   3418  * FUNCTION:    AcpiDmDumpTcpa
   3419  *
   3420  * PARAMETERS:  Table               - A TCPA table
   3421  *
   3422  * RETURN:      None
   3423  *
   3424  * DESCRIPTION: Format the contents of a TCPA.
   3425  *
   3426  * NOTE:        There are two versions of the table with the same signature:
   3427  *              the client version and the server version. The common
   3428  *              PlatformClass field is used to differentiate the two types of
   3429  *              tables.
   3430  *
   3431  ******************************************************************************/
   3432 
   3433 void
   3434 AcpiDmDumpTcpa (
   3435     ACPI_TABLE_HEADER       *Table)
   3436 {
   3437     UINT32                  Offset = sizeof (ACPI_TABLE_TCPA_HDR);
   3438     ACPI_TABLE_TCPA_HDR     *CommonHeader = ACPI_CAST_PTR (
   3439                                 ACPI_TABLE_TCPA_HDR, Table);
   3440     ACPI_TABLE_TCPA_HDR     *SubTable = ACPI_ADD_PTR (
   3441                                 ACPI_TABLE_TCPA_HDR, Table, Offset);
   3442     ACPI_STATUS             Status;
   3443 
   3444 
   3445     /* Main table */
   3446 
   3447     Status = AcpiDmDumpTable (Table->Length, 0, Table,
   3448         0, AcpiDmTableInfoTcpaHdr);
   3449     if (ACPI_FAILURE (Status))
   3450     {
   3451         return;
   3452     }
   3453 
   3454     /*
   3455      * Examine the PlatformClass field to determine the table type.
   3456      * Either a client or server table. Only one.
   3457      */
   3458     switch (CommonHeader->PlatformClass)
   3459     {
   3460     case ACPI_TCPA_CLIENT_TABLE:
   3461 
   3462         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   3463             Table->Length - Offset, AcpiDmTableInfoTcpaClient);
   3464         break;
   3465 
   3466     case ACPI_TCPA_SERVER_TABLE:
   3467 
   3468         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   3469             Table->Length - Offset, AcpiDmTableInfoTcpaServer);
   3470         break;
   3471 
   3472     default:
   3473 
   3474         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
   3475             CommonHeader->PlatformClass);
   3476         Status = AE_ERROR;
   3477         break;
   3478     }
   3479 
   3480     if (ACPI_FAILURE (Status))
   3481     {
   3482         AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n");
   3483     }
   3484 }
   3485 
   3486 
   3487 /*******************************************************************************
   3488  *
   3489  * FUNCTION:    AcpiDmDumpVrtc
   3490  *
   3491  * PARAMETERS:  Table               - A VRTC table
   3492  *
   3493  * RETURN:      None
   3494  *
   3495  * DESCRIPTION: Format the contents of a VRTC
   3496  *
   3497  ******************************************************************************/
   3498 
   3499 void
   3500 AcpiDmDumpVrtc (
   3501     ACPI_TABLE_HEADER       *Table)
   3502 {
   3503     ACPI_STATUS             Status;
   3504     UINT32                  Offset = sizeof (ACPI_TABLE_VRTC);
   3505     ACPI_VRTC_ENTRY         *SubTable;
   3506 
   3507 
   3508     /* Main table */
   3509 
   3510     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
   3511     if (ACPI_FAILURE (Status))
   3512     {
   3513         return;
   3514     }
   3515 
   3516     /* Subtables */
   3517 
   3518     SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
   3519     while (Offset < Table->Length)
   3520     {
   3521         /* Common subtable header */
   3522 
   3523         AcpiOsPrintf ("\n");
   3524         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   3525                     sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
   3526         if (ACPI_FAILURE (Status))
   3527         {
   3528             return;
   3529         }
   3530 
   3531         /* Point to next subtable */
   3532 
   3533         Offset += sizeof (ACPI_VRTC_ENTRY);
   3534         SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, sizeof (ACPI_VRTC_ENTRY));
   3535     }
   3536 }
   3537 
   3538 
   3539 /*******************************************************************************
   3540  *
   3541  * FUNCTION:    AcpiDmDumpWdat
   3542  *
   3543  * PARAMETERS:  Table               - A WDAT table
   3544  *
   3545  * RETURN:      None
   3546  *
   3547  * DESCRIPTION: Format the contents of a WDAT
   3548  *
   3549  ******************************************************************************/
   3550 
   3551 void
   3552 AcpiDmDumpWdat (
   3553     ACPI_TABLE_HEADER       *Table)
   3554 {
   3555     ACPI_STATUS             Status;
   3556     UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
   3557     ACPI_WDAT_ENTRY         *SubTable;
   3558 
   3559 
   3560     /* Main table */
   3561 
   3562     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
   3563     if (ACPI_FAILURE (Status))
   3564     {
   3565         return;
   3566     }
   3567 
   3568     /* Subtables */
   3569 
   3570     SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
   3571     while (Offset < Table->Length)
   3572     {
   3573         /* Common subtable header */
   3574 
   3575         AcpiOsPrintf ("\n");
   3576         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
   3577                     sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
   3578         if (ACPI_FAILURE (Status))
   3579         {
   3580             return;
   3581         }
   3582 
   3583         /* Point to next subtable */
   3584 
   3585         Offset += sizeof (ACPI_WDAT_ENTRY);
   3586         SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
   3587     }
   3588 }
   3589 
   3590 /*******************************************************************************
   3591  *
   3592  * FUNCTION:    AcpiDmDumpWpbt
   3593  *
   3594  * PARAMETERS:  Table               - A WPBT table
   3595  *
   3596  * RETURN:      None
   3597  *
   3598  * DESCRIPTION: Format the contents of a WPBT. This table type consists
   3599  *              of an open-ended arguments buffer at the end of the table.
   3600  *
   3601  ******************************************************************************/
   3602 
   3603 void
   3604 AcpiDmDumpWpbt (
   3605     ACPI_TABLE_HEADER       *Table)
   3606 {
   3607     ACPI_STATUS             Status;
   3608     ACPI_TABLE_WPBT         *SubTable;
   3609     UINT32                  Length = Table->Length;
   3610     UINT16                  ArgumentsLength;
   3611 
   3612 
   3613     /* Dump the main table */
   3614 
   3615     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
   3616     if (ACPI_FAILURE (Status))
   3617     {
   3618         return;
   3619     }
   3620 
   3621     /* Extract the arguments buffer length from the main table */
   3622 
   3623     SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
   3624     ArgumentsLength = SubTable->ArgumentsLength;
   3625 
   3626     /* Dump the arguments buffer */
   3627 
   3628     (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
   3629         AcpiDmTableInfoWpbt0);
   3630 }
   3631