Home | History | Annotate | Line # | Download | only in common
dmtbdump1.c revision 1.1.1.5
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2021, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "acpi.h"
     45 #include "accommon.h"
     46 #include "acdisasm.h"
     47 #include "actables.h"
     48 
     49 /* This module used for application-level code only */
     50 
     51 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     52         ACPI_MODULE_NAME    ("dmtbdump1")
     53 
     54 
     55 /*******************************************************************************
     56  *
     57  * FUNCTION:    AcpiDmDumpAsf
     58  *
     59  * PARAMETERS:  Table               - A ASF table
     60  *
     61  * RETURN:      None
     62  *
     63  * DESCRIPTION: Format the contents of a ASF table
     64  *
     65  ******************************************************************************/
     66 
     67 void
     68 AcpiDmDumpAsf (
     69     ACPI_TABLE_HEADER       *Table)
     70 {
     71     ACPI_STATUS             Status;
     72     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
     73     ACPI_ASF_INFO           *Subtable;
     74     ACPI_DMTABLE_INFO       *InfoTable;
     75     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
     76     UINT8                   *DataTable = NULL;
     77     UINT32                  DataCount = 0;
     78     UINT32                  DataLength = 0;
     79     UINT32                  DataOffset = 0;
     80     UINT32                  i;
     81     UINT8                   Type;
     82 
     83 
     84     /* No main table, only subtables */
     85 
     86     Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
     87     while (Offset < Table->Length)
     88     {
     89         /* Common subtable header */
     90 
     91         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
     92             Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
     93         if (ACPI_FAILURE (Status))
     94         {
     95             return;
     96         }
     97 
     98         /* The actual type is the lower 7 bits of Type */
     99 
    100         Type = (UINT8) (Subtable->Header.Type & 0x7F);
    101 
    102         switch (Type)
    103         {
    104         case ACPI_ASF_TYPE_INFO:
    105 
    106             InfoTable = AcpiDmTableInfoAsf0;
    107             break;
    108 
    109         case ACPI_ASF_TYPE_ALERT:
    110 
    111             InfoTable = AcpiDmTableInfoAsf1;
    112             DataInfoTable = AcpiDmTableInfoAsf1a;
    113             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
    114             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
    115             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
    116             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
    117             break;
    118 
    119         case ACPI_ASF_TYPE_CONTROL:
    120 
    121             InfoTable = AcpiDmTableInfoAsf2;
    122             DataInfoTable = AcpiDmTableInfoAsf2a;
    123             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
    124             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
    125             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
    126             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
    127             break;
    128 
    129         case ACPI_ASF_TYPE_BOOT:
    130 
    131             InfoTable = AcpiDmTableInfoAsf3;
    132             break;
    133 
    134         case ACPI_ASF_TYPE_ADDRESS:
    135 
    136             InfoTable = AcpiDmTableInfoAsf4;
    137             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
    138             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
    139             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
    140             break;
    141 
    142         default:
    143 
    144             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
    145                 Subtable->Header.Type);
    146             return;
    147         }
    148 
    149         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
    150             Subtable->Header.Length, InfoTable);
    151         if (ACPI_FAILURE (Status))
    152         {
    153             return;
    154         }
    155 
    156         /* Dump variable-length extra data */
    157 
    158         switch (Type)
    159         {
    160         case ACPI_ASF_TYPE_ALERT:
    161         case ACPI_ASF_TYPE_CONTROL:
    162 
    163             for (i = 0; i < DataCount; i++)
    164             {
    165                 AcpiOsPrintf ("\n");
    166                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
    167                     DataTable, DataLength, DataInfoTable);
    168                 if (ACPI_FAILURE (Status))
    169                 {
    170                     return;
    171                 }
    172 
    173                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
    174                 DataOffset += DataLength;
    175             }
    176             break;
    177 
    178         case ACPI_ASF_TYPE_ADDRESS:
    179 
    180             for (i = 0; i < DataLength; i++)
    181             {
    182                 if (!(i % 16))
    183                 {
    184                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
    185                 }
    186 
    187                 AcpiOsPrintf ("%2.2X ", *DataTable);
    188                 DataTable++;
    189                 DataOffset++;
    190 
    191                 if (DataOffset > Table->Length)
    192                 {
    193                     AcpiOsPrintf (
    194                         "**** ACPI table terminates in the middle of a "
    195                         "data structure! (ASF! table)\n");
    196                     return;
    197                 }
    198             }
    199 
    200             AcpiOsPrintf ("\n");
    201             break;
    202 
    203         default:
    204 
    205             break;
    206         }
    207 
    208         AcpiOsPrintf ("\n");
    209 
    210         /* Point to next subtable */
    211 
    212         if (!Subtable->Header.Length)
    213         {
    214             AcpiOsPrintf ("Invalid zero subtable header length\n");
    215             return;
    216         }
    217 
    218         Offset += Subtable->Header.Length;
    219         Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
    220             Subtable->Header.Length);
    221     }
    222 }
    223 
    224 /*******************************************************************************
    225  *
    226  * FUNCTION:    AcpiDmDumpCedt
    227  *
    228  * PARAMETERS:  Table               - A CEDT table
    229  *
    230  * RETURN:      None
    231  *
    232  * DESCRIPTION: Format the contents of a CEDT. This table type consists
    233  *              of an open-ended number of subtables.
    234  *
    235  ******************************************************************************/
    236 
    237 void
    238 AcpiDmDumpCedt (
    239     ACPI_TABLE_HEADER       *Table)
    240 {
    241     ACPI_STATUS             Status;
    242     ACPI_CEDT_HEADER        *Subtable;
    243     UINT32                  Length = Table->Length;
    244     UINT32                  Offset = sizeof (ACPI_TABLE_CEDT);
    245     ACPI_DMTABLE_INFO       *InfoTable;
    246 
    247 
    248     /* There is no main table (other than the standard ACPI header) */
    249 
    250     Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
    251     while (Offset < Table->Length)
    252     {
    253         /* Common subtable header */
    254 
    255         AcpiOsPrintf ("\n");
    256         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    257             Subtable->Length, AcpiDmTableInfoCedtHdr);
    258         if (ACPI_FAILURE (Status))
    259         {
    260             return;
    261         }
    262 
    263         switch (Subtable->Type)
    264         {
    265         case ACPI_CEDT_TYPE_CHBS:
    266 
    267             InfoTable = AcpiDmTableInfoCedt0;
    268             break;
    269 
    270         default:
    271 
    272             AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
    273                 Subtable->Type);
    274 
    275             /* Attempt to continue */
    276 
    277             if (!Subtable->Length)
    278             {
    279                 AcpiOsPrintf ("Invalid zero length subtable\n");
    280                 return;
    281             }
    282             goto NextSubtable;
    283         }
    284 
    285         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    286             Subtable->Length, InfoTable);
    287         if (ACPI_FAILURE (Status))
    288         {
    289             return;
    290         }
    291 
    292 NextSubtable:
    293         /* Point to next subtable */
    294 
    295         Offset += Subtable->Length;
    296         Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
    297             Subtable->Length);
    298     }
    299 }
    300 
    301 /*******************************************************************************
    302  *
    303  * FUNCTION:    AcpiDmDumpCpep
    304  *
    305  * PARAMETERS:  Table               - A CPEP table
    306  *
    307  * RETURN:      None
    308  *
    309  * DESCRIPTION: Format the contents of a CPEP. This table type consists
    310  *              of an open-ended number of subtables.
    311  *
    312  ******************************************************************************/
    313 
    314 void
    315 AcpiDmDumpCpep (
    316     ACPI_TABLE_HEADER       *Table)
    317 {
    318     ACPI_STATUS             Status;
    319     ACPI_CPEP_POLLING       *Subtable;
    320     UINT32                  Length = Table->Length;
    321     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
    322 
    323 
    324     /* Main table */
    325 
    326     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
    327     if (ACPI_FAILURE (Status))
    328     {
    329         return;
    330     }
    331 
    332     /* Subtables */
    333 
    334     Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
    335     while (Offset < Table->Length)
    336     {
    337         AcpiOsPrintf ("\n");
    338         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    339             Subtable->Header.Length, AcpiDmTableInfoCpep0);
    340         if (ACPI_FAILURE (Status))
    341         {
    342             return;
    343         }
    344 
    345         /* Point to next subtable */
    346 
    347         Offset += Subtable->Header.Length;
    348         Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
    349             Subtable->Header.Length);
    350     }
    351 }
    352 
    353 
    354 /*******************************************************************************
    355  *
    356  * FUNCTION:    AcpiDmDumpCsrt
    357  *
    358  * PARAMETERS:  Table               - A CSRT table
    359  *
    360  * RETURN:      None
    361  *
    362  * DESCRIPTION: Format the contents of a CSRT. This table type consists
    363  *              of an open-ended number of subtables.
    364  *
    365  ******************************************************************************/
    366 
    367 void
    368 AcpiDmDumpCsrt (
    369     ACPI_TABLE_HEADER       *Table)
    370 {
    371     ACPI_STATUS             Status;
    372     ACPI_CSRT_GROUP         *Subtable;
    373     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
    374     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
    375     UINT32                  Length = Table->Length;
    376     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
    377     UINT32                  SubOffset;
    378     UINT32                  SubSubOffset;
    379     UINT32                  InfoLength;
    380 
    381 
    382     /* The main table only contains the ACPI header, thus already handled */
    383 
    384     /* Subtables (Resource Groups) */
    385 
    386     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
    387     while (Offset < Table->Length)
    388     {
    389         /* Resource group subtable */
    390 
    391         AcpiOsPrintf ("\n");
    392         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    393             Subtable->Length, AcpiDmTableInfoCsrt0);
    394         if (ACPI_FAILURE (Status))
    395         {
    396             return;
    397         }
    398 
    399         /* Shared info subtable (One per resource group) */
    400 
    401         SubOffset = sizeof (ACPI_CSRT_GROUP);
    402         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
    403             Offset + SubOffset);
    404 
    405         AcpiOsPrintf ("\n");
    406         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
    407             sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
    408         if (ACPI_FAILURE (Status))
    409         {
    410             return;
    411         }
    412 
    413         SubOffset += Subtable->SharedInfoLength;
    414 
    415         /* Sub-Subtables (Resource Descriptors) */
    416 
    417         SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
    418             Offset + SubOffset);
    419 
    420         while ((SubOffset < Subtable->Length) &&
    421               ((Offset + SubOffset) < Table->Length))
    422         {
    423             AcpiOsPrintf ("\n");
    424             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
    425                 SubSubtable->Length, AcpiDmTableInfoCsrt2);
    426             if (ACPI_FAILURE (Status))
    427             {
    428                 return;
    429             }
    430 
    431             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
    432 
    433             /* Resource-specific info buffer */
    434 
    435             InfoLength = SubSubtable->Length - SubSubOffset;
    436             if (InfoLength)
    437             {
    438                 Status = AcpiDmDumpTable (Length,
    439                     Offset + SubOffset + SubSubOffset, Table,
    440                     InfoLength, AcpiDmTableInfoCsrt2a);
    441                 if (ACPI_FAILURE (Status))
    442                 {
    443                     return;
    444                 }
    445             }
    446 
    447             /* Point to next sub-subtable */
    448 
    449             SubOffset += SubSubtable->Length;
    450             SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
    451                 SubSubtable->Length);
    452         }
    453 
    454         /* Point to next subtable */
    455 
    456         Offset += Subtable->Length;
    457         Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
    458             Subtable->Length);
    459     }
    460 }
    461 
    462 
    463 /*******************************************************************************
    464  *
    465  * FUNCTION:    AcpiDmDumpDbg2
    466  *
    467  * PARAMETERS:  Table               - A DBG2 table
    468  *
    469  * RETURN:      None
    470  *
    471  * DESCRIPTION: Format the contents of a DBG2. This table type consists
    472  *              of an open-ended number of subtables.
    473  *
    474  ******************************************************************************/
    475 
    476 void
    477 AcpiDmDumpDbg2 (
    478     ACPI_TABLE_HEADER       *Table)
    479 {
    480     ACPI_STATUS             Status;
    481     ACPI_DBG2_DEVICE        *Subtable;
    482     UINT32                  Length = Table->Length;
    483     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
    484     UINT32                  i;
    485     UINT32                  ArrayOffset;
    486     UINT32                  AbsoluteOffset;
    487     UINT8                   *Array;
    488 
    489 
    490     /* Main table */
    491 
    492     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
    493     if (ACPI_FAILURE (Status))
    494     {
    495         return;
    496     }
    497 
    498     /* Subtables */
    499 
    500     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
    501     while (Offset < Table->Length)
    502     {
    503         AcpiOsPrintf ("\n");
    504         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    505             Subtable->Length, AcpiDmTableInfoDbg2Device);
    506         if (ACPI_FAILURE (Status))
    507         {
    508             return;
    509         }
    510 
    511         /* Dump the BaseAddress array */
    512 
    513         for (i = 0; i < Subtable->RegisterCount; i++)
    514         {
    515             ArrayOffset = Subtable->BaseAddressOffset +
    516                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
    517             AbsoluteOffset = Offset + ArrayOffset;
    518             Array = (UINT8 *) Subtable + ArrayOffset;
    519 
    520             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    521                 Subtable->Length, AcpiDmTableInfoDbg2Addr);
    522             if (ACPI_FAILURE (Status))
    523             {
    524                 return;
    525             }
    526         }
    527 
    528         /* Dump the AddressSize array */
    529 
    530         for (i = 0; i < Subtable->RegisterCount; i++)
    531         {
    532             ArrayOffset = Subtable->AddressSizeOffset +
    533                 (sizeof (UINT32) * i);
    534             AbsoluteOffset = Offset + ArrayOffset;
    535             Array = (UINT8 *) Subtable + ArrayOffset;
    536 
    537             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    538                 Subtable->Length, AcpiDmTableInfoDbg2Size);
    539             if (ACPI_FAILURE (Status))
    540             {
    541                 return;
    542             }
    543         }
    544 
    545         /* Dump the Namestring (required) */
    546 
    547         AcpiOsPrintf ("\n");
    548         ArrayOffset = Subtable->NamepathOffset;
    549         AbsoluteOffset = Offset + ArrayOffset;
    550         Array = (UINT8 *) Subtable + ArrayOffset;
    551 
    552         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
    553             Subtable->Length, AcpiDmTableInfoDbg2Name);
    554         if (ACPI_FAILURE (Status))
    555         {
    556             return;
    557         }
    558 
    559         /* Dump the OemData (optional) */
    560 
    561         if (Subtable->OemDataOffset)
    562         {
    563             Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
    564                 Table, Subtable->OemDataLength,
    565                 AcpiDmTableInfoDbg2OemData);
    566             if (ACPI_FAILURE (Status))
    567             {
    568                 return;
    569             }
    570         }
    571 
    572         /* Point to next subtable */
    573 
    574         Offset += Subtable->Length;
    575         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
    576             Subtable->Length);
    577     }
    578 }
    579 
    580 
    581 /*******************************************************************************
    582  *
    583  * FUNCTION:    AcpiDmDumpDmar
    584  *
    585  * PARAMETERS:  Table               - A DMAR table
    586  *
    587  * RETURN:      None
    588  *
    589  * DESCRIPTION: Format the contents of a DMAR. This table type consists
    590  *              of an open-ended number of subtables.
    591  *
    592  ******************************************************************************/
    593 
    594 void
    595 AcpiDmDumpDmar (
    596     ACPI_TABLE_HEADER       *Table)
    597 {
    598     ACPI_STATUS             Status;
    599     ACPI_DMAR_HEADER        *Subtable;
    600     UINT32                  Length = Table->Length;
    601     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
    602     ACPI_DMTABLE_INFO       *InfoTable;
    603     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
    604     UINT32                  ScopeOffset;
    605     UINT8                   *PciPath;
    606     UINT32                  PathOffset;
    607 
    608 
    609     /* Main table */
    610 
    611     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
    612     if (ACPI_FAILURE (Status))
    613     {
    614         return;
    615     }
    616 
    617     /* Subtables */
    618 
    619     Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
    620     while (Offset < Table->Length)
    621     {
    622         /* Common subtable header */
    623 
    624         AcpiOsPrintf ("\n");
    625         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    626             Subtable->Length, AcpiDmTableInfoDmarHdr);
    627         if (ACPI_FAILURE (Status))
    628         {
    629             return;
    630         }
    631 
    632         AcpiOsPrintf ("\n");
    633 
    634         switch (Subtable->Type)
    635         {
    636         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
    637 
    638             InfoTable = AcpiDmTableInfoDmar0;
    639             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
    640             break;
    641 
    642         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
    643 
    644             InfoTable = AcpiDmTableInfoDmar1;
    645             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
    646             break;
    647 
    648         case ACPI_DMAR_TYPE_ROOT_ATS:
    649 
    650             InfoTable = AcpiDmTableInfoDmar2;
    651             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
    652             break;
    653 
    654         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
    655 
    656             InfoTable = AcpiDmTableInfoDmar3;
    657             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
    658             break;
    659 
    660         case ACPI_DMAR_TYPE_NAMESPACE:
    661 
    662             InfoTable = AcpiDmTableInfoDmar4;
    663             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
    664             break;
    665 
    666         default:
    667 
    668             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
    669                 Subtable->Type);
    670             return;
    671         }
    672 
    673         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    674             Subtable->Length, InfoTable);
    675         if (ACPI_FAILURE (Status))
    676         {
    677             return;
    678         }
    679 
    680         /*
    681          * Dump the optional device scope entries
    682          */
    683         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
    684             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
    685         {
    686             /* These types do not support device scopes */
    687 
    688             goto NextSubtable;
    689         }
    690 
    691         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
    692         while (ScopeOffset < Subtable->Length)
    693         {
    694             AcpiOsPrintf ("\n");
    695             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
    696                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
    697             if (ACPI_FAILURE (Status))
    698             {
    699                 return;
    700             }
    701             AcpiOsPrintf ("\n");
    702 
    703             /* Dump the PCI Path entries for this device scope */
    704 
    705             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
    706 
    707             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
    708                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
    709 
    710             while (PathOffset < ScopeTable->Length)
    711             {
    712                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
    713                     "PCI Path");
    714                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
    715 
    716                 /* Point to next PCI Path entry */
    717 
    718                 PathOffset += 2;
    719                 PciPath += 2;
    720                 AcpiOsPrintf ("\n");
    721             }
    722 
    723             /* Point to next device scope entry */
    724 
    725             ScopeOffset += ScopeTable->Length;
    726             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
    727                 ScopeTable, ScopeTable->Length);
    728         }
    729 
    730 NextSubtable:
    731         /* Point to next subtable */
    732 
    733         Offset += Subtable->Length;
    734         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
    735             Subtable->Length);
    736     }
    737 }
    738 
    739 
    740 /*******************************************************************************
    741  *
    742  * FUNCTION:    AcpiDmDumpDrtm
    743  *
    744  * PARAMETERS:  Table               - A DRTM table
    745  *
    746  * RETURN:      None
    747  *
    748  * DESCRIPTION: Format the contents of a DRTM.
    749  *
    750  ******************************************************************************/
    751 
    752 void
    753 AcpiDmDumpDrtm (
    754     ACPI_TABLE_HEADER       *Table)
    755 {
    756     ACPI_STATUS             Status;
    757     UINT32                  Offset;
    758     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
    759     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
    760     ACPI_DRTM_DPS_ID        *DrtmDps;
    761     UINT32                  Count;
    762 
    763 
    764     /* Main table */
    765 
    766     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
    767         AcpiDmTableInfoDrtm);
    768     if (ACPI_FAILURE (Status))
    769     {
    770         return;
    771     }
    772 
    773     Offset = sizeof (ACPI_TABLE_DRTM);
    774 
    775     /* Sub-tables */
    776 
    777     /* Dump ValidatedTable length */
    778 
    779     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
    780     AcpiOsPrintf ("\n");
    781     Status = AcpiDmDumpTable (Table->Length, Offset,
    782         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
    783         AcpiDmTableInfoDrtm0);
    784     if (ACPI_FAILURE (Status))
    785     {
    786             return;
    787     }
    788 
    789     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
    790 
    791     /* Dump Validated table addresses */
    792 
    793     Count = 0;
    794     while ((Offset < Table->Length) &&
    795             (DrtmVtl->ValidatedTableCount > Count))
    796     {
    797         Status = AcpiDmDumpTable (Table->Length, Offset,
    798             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
    799             AcpiDmTableInfoDrtm0a);
    800         if (ACPI_FAILURE (Status))
    801         {
    802             return;
    803         }
    804 
    805         Offset += sizeof (UINT64);
    806         Count++;
    807     }
    808 
    809     /* Dump ResourceList length */
    810 
    811     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
    812     AcpiOsPrintf ("\n");
    813     Status = AcpiDmDumpTable (Table->Length, Offset,
    814         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
    815         AcpiDmTableInfoDrtm1);
    816     if (ACPI_FAILURE (Status))
    817     {
    818         return;
    819     }
    820 
    821     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
    822 
    823     /* Dump the Resource List */
    824 
    825     Count = 0;
    826     while ((Offset < Table->Length) &&
    827            (DrtmRl->ResourceCount > Count))
    828     {
    829         Status = AcpiDmDumpTable (Table->Length, Offset,
    830             ACPI_ADD_PTR (void, Table, Offset),
    831             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
    832         if (ACPI_FAILURE (Status))
    833         {
    834             return;
    835         }
    836 
    837         Offset += sizeof (ACPI_DRTM_RESOURCE);
    838         Count++;
    839     }
    840 
    841     /* Dump DPS */
    842 
    843     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
    844     AcpiOsPrintf ("\n");
    845     (void) AcpiDmDumpTable (Table->Length, Offset,
    846         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
    847 }
    848 
    849 
    850 /*******************************************************************************
    851  *
    852  * FUNCTION:    AcpiDmDumpEinj
    853  *
    854  * PARAMETERS:  Table               - A EINJ table
    855  *
    856  * RETURN:      None
    857  *
    858  * DESCRIPTION: Format the contents of a EINJ. This table type consists
    859  *              of an open-ended number of subtables.
    860  *
    861  ******************************************************************************/
    862 
    863 void
    864 AcpiDmDumpEinj (
    865     ACPI_TABLE_HEADER       *Table)
    866 {
    867     ACPI_STATUS             Status;
    868     ACPI_WHEA_HEADER        *Subtable;
    869     UINT32                  Length = Table->Length;
    870     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
    871 
    872 
    873     /* Main table */
    874 
    875     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
    876     if (ACPI_FAILURE (Status))
    877     {
    878         return;
    879     }
    880 
    881     /* Subtables */
    882 
    883     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
    884     while (Offset < Table->Length)
    885     {
    886         AcpiOsPrintf ("\n");
    887         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    888             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
    889         if (ACPI_FAILURE (Status))
    890         {
    891             return;
    892         }
    893 
    894         /* Point to next subtable (each subtable is of fixed length) */
    895 
    896         Offset += sizeof (ACPI_WHEA_HEADER);
    897         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
    898             sizeof (ACPI_WHEA_HEADER));
    899     }
    900 }
    901 
    902 
    903 /*******************************************************************************
    904  *
    905  * FUNCTION:    AcpiDmDumpErst
    906  *
    907  * PARAMETERS:  Table               - A ERST table
    908  *
    909  * RETURN:      None
    910  *
    911  * DESCRIPTION: Format the contents of a ERST. This table type consists
    912  *              of an open-ended number of subtables.
    913  *
    914  ******************************************************************************/
    915 
    916 void
    917 AcpiDmDumpErst (
    918     ACPI_TABLE_HEADER       *Table)
    919 {
    920     ACPI_STATUS             Status;
    921     ACPI_WHEA_HEADER        *Subtable;
    922     UINT32                  Length = Table->Length;
    923     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
    924 
    925 
    926     /* Main table */
    927 
    928     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
    929     if (ACPI_FAILURE (Status))
    930     {
    931         return;
    932     }
    933 
    934     /* Subtables */
    935 
    936     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
    937     while (Offset < Table->Length)
    938     {
    939         AcpiOsPrintf ("\n");
    940         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    941             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
    942         if (ACPI_FAILURE (Status))
    943         {
    944             return;
    945         }
    946 
    947         /* Point to next subtable (each subtable is of fixed length) */
    948 
    949         Offset += sizeof (ACPI_WHEA_HEADER);
    950         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
    951             sizeof (ACPI_WHEA_HEADER));
    952     }
    953 }
    954 
    955 
    956 /*******************************************************************************
    957  *
    958  * FUNCTION:    AcpiDmDumpFpdt
    959  *
    960  * PARAMETERS:  Table               - A FPDT table
    961  *
    962  * RETURN:      None
    963  *
    964  * DESCRIPTION: Format the contents of a FPDT. This table type consists
    965  *              of an open-ended number of subtables.
    966  *
    967  ******************************************************************************/
    968 
    969 void
    970 AcpiDmDumpFpdt (
    971     ACPI_TABLE_HEADER       *Table)
    972 {
    973     ACPI_STATUS             Status;
    974     ACPI_FPDT_HEADER        *Subtable;
    975     UINT32                  Length = Table->Length;
    976     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
    977     ACPI_DMTABLE_INFO       *InfoTable;
    978 
    979 
    980     /* There is no main table (other than the standard ACPI header) */
    981 
    982     /* Subtables */
    983 
    984     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
    985     while (Offset < Table->Length)
    986     {
    987         /* Common subtable header */
    988 
    989         AcpiOsPrintf ("\n");
    990         Status = AcpiDmDumpTable (Length, Offset, Subtable,
    991             Subtable->Length, AcpiDmTableInfoFpdtHdr);
    992         if (ACPI_FAILURE (Status))
    993         {
    994             return;
    995         }
    996 
    997         switch (Subtable->Type)
    998         {
    999         case ACPI_FPDT_TYPE_BOOT:
   1000 
   1001             InfoTable = AcpiDmTableInfoFpdt0;
   1002             break;
   1003 
   1004         case ACPI_FPDT_TYPE_S3PERF:
   1005 
   1006             InfoTable = AcpiDmTableInfoFpdt1;
   1007             break;
   1008 
   1009         default:
   1010 
   1011             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
   1012                 Subtable->Type);
   1013 
   1014             /* Attempt to continue */
   1015 
   1016             if (!Subtable->Length)
   1017             {
   1018                 AcpiOsPrintf ("Invalid zero length subtable\n");
   1019                 return;
   1020             }
   1021             goto NextSubtable;
   1022         }
   1023 
   1024         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1025             Subtable->Length, InfoTable);
   1026         if (ACPI_FAILURE (Status))
   1027         {
   1028             return;
   1029         }
   1030 
   1031 NextSubtable:
   1032         /* Point to next subtable */
   1033 
   1034         Offset += Subtable->Length;
   1035         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
   1036             Subtable->Length);
   1037     }
   1038 }
   1039 
   1040 
   1041 /*******************************************************************************
   1042  *
   1043  * FUNCTION:    AcpiDmDumpGtdt
   1044  *
   1045  * PARAMETERS:  Table               - A GTDT table
   1046  *
   1047  * RETURN:      None
   1048  *
   1049  * DESCRIPTION: Format the contents of a GTDT. This table type consists
   1050  *              of an open-ended number of subtables.
   1051  *
   1052  ******************************************************************************/
   1053 
   1054 void
   1055 AcpiDmDumpGtdt (
   1056     ACPI_TABLE_HEADER       *Table)
   1057 {
   1058     ACPI_STATUS             Status;
   1059     ACPI_GTDT_HEADER        *Subtable;
   1060     UINT32                  Length = Table->Length;
   1061     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
   1062     ACPI_DMTABLE_INFO       *InfoTable;
   1063     UINT32                  SubtableLength;
   1064     UINT32                  GtCount;
   1065     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
   1066 
   1067 
   1068     /* Main table */
   1069 
   1070     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
   1071     if (ACPI_FAILURE (Status))
   1072     {
   1073         return;
   1074     }
   1075 
   1076     /* Rev 3 fields */
   1077 
   1078     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1079 
   1080     if (Table->Revision > 2)
   1081     {
   1082         SubtableLength = sizeof (ACPI_GTDT_EL2);
   1083         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1084             SubtableLength, AcpiDmTableInfoGtdtEl2);
   1085         if (ACPI_FAILURE (Status))
   1086         {
   1087             return;
   1088         }
   1089         Offset += SubtableLength;
   1090     }
   1091 
   1092     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
   1093 
   1094     /* Subtables */
   1095 
   1096     while (Offset < Table->Length)
   1097     {
   1098         /* Common subtable header */
   1099 
   1100         AcpiOsPrintf ("\n");
   1101         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1102             Subtable->Length, AcpiDmTableInfoGtdtHdr);
   1103         if (ACPI_FAILURE (Status))
   1104         {
   1105             return;
   1106         }
   1107 
   1108         GtCount = 0;
   1109         switch (Subtable->Type)
   1110         {
   1111         case ACPI_GTDT_TYPE_TIMER_BLOCK:
   1112 
   1113             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
   1114             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
   1115                 Subtable))->TimerCount;
   1116 
   1117             InfoTable = AcpiDmTableInfoGtdt0;
   1118             break;
   1119 
   1120         case ACPI_GTDT_TYPE_WATCHDOG:
   1121 
   1122             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
   1123 
   1124             InfoTable = AcpiDmTableInfoGtdt1;
   1125             break;
   1126 
   1127         default:
   1128 
   1129             /* Cannot continue on unknown type - no length */
   1130 
   1131             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
   1132                 Subtable->Type);
   1133             return;
   1134         }
   1135 
   1136         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1137             Subtable->Length, InfoTable);
   1138         if (ACPI_FAILURE (Status))
   1139         {
   1140             return;
   1141         }
   1142 
   1143         /* Point to end of current subtable (each subtable above is of fixed length) */
   1144 
   1145         Offset += SubtableLength;
   1146 
   1147         /* If there are any Gt Timer Blocks from above, dump them now */
   1148 
   1149         if (GtCount)
   1150         {
   1151             GtxTable = ACPI_ADD_PTR (
   1152                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
   1153             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
   1154 
   1155             while (GtCount)
   1156             {
   1157                 AcpiOsPrintf ("\n");
   1158                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
   1159                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
   1160                 if (ACPI_FAILURE (Status))
   1161                 {
   1162                     return;
   1163                 }
   1164                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
   1165                 GtxTable++;
   1166                 GtCount--;
   1167             }
   1168         }
   1169 
   1170         /* Point to next subtable */
   1171 
   1172         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
   1173     }
   1174 }
   1175 
   1176 
   1177 /*******************************************************************************
   1178  *
   1179  * FUNCTION:    AcpiDmDumpHest
   1180  *
   1181  * PARAMETERS:  Table               - A HEST table
   1182  *
   1183  * RETURN:      None
   1184  *
   1185  * DESCRIPTION: Format the contents of a HEST. This table type consists
   1186  *              of an open-ended number of subtables.
   1187  *
   1188  ******************************************************************************/
   1189 
   1190 void
   1191 AcpiDmDumpHest (
   1192     ACPI_TABLE_HEADER       *Table)
   1193 {
   1194     ACPI_STATUS             Status;
   1195     ACPI_HEST_HEADER        *Subtable;
   1196     UINT32                  Length = Table->Length;
   1197     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
   1198     ACPI_DMTABLE_INFO       *InfoTable;
   1199     UINT32                  SubtableLength;
   1200     UINT32                  BankCount;
   1201     ACPI_HEST_IA_ERROR_BANK *BankTable;
   1202 
   1203 
   1204     /* Main table */
   1205 
   1206     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
   1207     if (ACPI_FAILURE (Status))
   1208     {
   1209         return;
   1210     }
   1211 
   1212     /* Subtables */
   1213 
   1214     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
   1215     while (Offset < Table->Length)
   1216     {
   1217         BankCount = 0;
   1218         switch (Subtable->Type)
   1219         {
   1220         case ACPI_HEST_TYPE_IA32_CHECK:
   1221 
   1222             InfoTable = AcpiDmTableInfoHest0;
   1223             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
   1224             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
   1225                 Subtable))->NumHardwareBanks;
   1226             break;
   1227 
   1228         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
   1229 
   1230             InfoTable = AcpiDmTableInfoHest1;
   1231             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
   1232             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
   1233                 Subtable))->NumHardwareBanks;
   1234             break;
   1235 
   1236         case ACPI_HEST_TYPE_IA32_NMI:
   1237 
   1238             InfoTable = AcpiDmTableInfoHest2;
   1239             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
   1240             break;
   1241 
   1242         case ACPI_HEST_TYPE_AER_ROOT_PORT:
   1243 
   1244             InfoTable = AcpiDmTableInfoHest6;
   1245             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
   1246             break;
   1247 
   1248         case ACPI_HEST_TYPE_AER_ENDPOINT:
   1249 
   1250             InfoTable = AcpiDmTableInfoHest7;
   1251             SubtableLength = sizeof (ACPI_HEST_AER);
   1252             break;
   1253 
   1254         case ACPI_HEST_TYPE_AER_BRIDGE:
   1255 
   1256             InfoTable = AcpiDmTableInfoHest8;
   1257             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
   1258             break;
   1259 
   1260         case ACPI_HEST_TYPE_GENERIC_ERROR:
   1261 
   1262             InfoTable = AcpiDmTableInfoHest9;
   1263             SubtableLength = sizeof (ACPI_HEST_GENERIC);
   1264             break;
   1265 
   1266         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
   1267 
   1268             InfoTable = AcpiDmTableInfoHest10;
   1269             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
   1270             break;
   1271 
   1272         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
   1273 
   1274             InfoTable = AcpiDmTableInfoHest11;
   1275             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
   1276             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
   1277                 Subtable))->NumHardwareBanks;
   1278             break;
   1279 
   1280         default:
   1281 
   1282             /* Cannot continue on unknown type - no length */
   1283 
   1284             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
   1285                 Subtable->Type);
   1286             return;
   1287         }
   1288 
   1289         AcpiOsPrintf ("\n");
   1290         Status = AcpiDmDumpTable (Length, Offset, Subtable,
   1291             SubtableLength, InfoTable);
   1292         if (ACPI_FAILURE (Status))
   1293         {
   1294             return;
   1295         }
   1296 
   1297         /* Point to end of current subtable (each subtable above is of fixed length) */
   1298 
   1299         Offset += SubtableLength;
   1300 
   1301         /* If there are any (fixed-length) Error Banks from above, dump them now */
   1302 
   1303         if (BankCount)
   1304         {
   1305             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
   1306                 SubtableLength);
   1307             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
   1308 
   1309             while (BankCount)
   1310             {
   1311                 AcpiOsPrintf ("\n");
   1312                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
   1313                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
   1314                 if (ACPI_FAILURE (Status))
   1315                 {
   1316                     return;
   1317                 }
   1318 
   1319                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
   1320                 BankTable++;
   1321                 BankCount--;
   1322             }
   1323         }
   1324 
   1325         /* Point to next subtable */
   1326 
   1327         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
   1328     }
   1329 }
   1330 
   1331 
   1332 /*******************************************************************************
   1333  *
   1334  * FUNCTION:    AcpiDmDumpHmat
   1335  *
   1336  * PARAMETERS:  Table               - A HMAT table
   1337  *
   1338  * RETURN:      None
   1339  *
   1340  * DESCRIPTION: Format the contents of a HMAT.
   1341  *
   1342  ******************************************************************************/
   1343 
   1344 void
   1345 AcpiDmDumpHmat (
   1346     ACPI_TABLE_HEADER       *Table)
   1347 {
   1348     ACPI_STATUS             Status;
   1349     ACPI_HMAT_STRUCTURE     *HmatStruct;
   1350     ACPI_HMAT_LOCALITY      *HmatLocality;
   1351     ACPI_HMAT_CACHE         *HmatCache;
   1352     UINT32                  Offset;
   1353     UINT32                  SubtableOffset;
   1354     UINT32                  Length;
   1355     ACPI_DMTABLE_INFO       *InfoTable;
   1356     UINT32                  i, j;
   1357 
   1358 
   1359     /* Main table */
   1360 
   1361     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
   1362     if (ACPI_FAILURE (Status))
   1363     {
   1364         return;
   1365     }
   1366     Offset = sizeof (ACPI_TABLE_HMAT);
   1367 
   1368     while (Offset < Table->Length)
   1369     {
   1370         AcpiOsPrintf ("\n");
   1371 
   1372         /* Dump HMAT structure header */
   1373 
   1374         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
   1375         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
   1376         {
   1377             AcpiOsPrintf ("Invalid HMAT structure length\n");
   1378             return;
   1379         }
   1380         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   1381             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
   1382         if (ACPI_FAILURE (Status))
   1383         {
   1384             return;
   1385         }
   1386 
   1387         switch (HmatStruct->Type)
   1388         {
   1389         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
   1390 
   1391             InfoTable = AcpiDmTableInfoHmat0;
   1392             Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
   1393             break;
   1394 
   1395         case ACPI_HMAT_TYPE_LOCALITY:
   1396 
   1397             InfoTable = AcpiDmTableInfoHmat1;
   1398             Length = sizeof (ACPI_HMAT_LOCALITY);
   1399             break;
   1400 
   1401         case ACPI_HMAT_TYPE_CACHE:
   1402 
   1403             InfoTable = AcpiDmTableInfoHmat2;
   1404             Length = sizeof (ACPI_HMAT_CACHE);
   1405             break;
   1406 
   1407         default:
   1408 
   1409             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
   1410                 HmatStruct->Type);
   1411 
   1412             /* Attempt to continue */
   1413 
   1414             goto NextSubtable;
   1415         }
   1416 
   1417         /* Dump HMAT structure body */
   1418 
   1419         if (HmatStruct->Length < Length)
   1420         {
   1421             AcpiOsPrintf ("Invalid HMAT structure length\n");
   1422             return;
   1423         }
   1424         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
   1425             HmatStruct->Length, InfoTable);
   1426         if (ACPI_FAILURE (Status))
   1427         {
   1428             return;
   1429         }
   1430 
   1431         /* Dump HMAT structure additionals */
   1432 
   1433         switch (HmatStruct->Type)
   1434         {
   1435         case ACPI_HMAT_TYPE_LOCALITY:
   1436 
   1437             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
   1438             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
   1439 
   1440             /* Dump initiator proximity domains */
   1441 
   1442             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1443                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
   1444             {
   1445                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
   1446                 return;
   1447             }
   1448             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   1449             {
   1450                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1451                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1452                     4, AcpiDmTableInfoHmat1a);
   1453                 if (ACPI_FAILURE (Status))
   1454                 {
   1455                     return;
   1456                 }
   1457 
   1458                 SubtableOffset += 4;
   1459             }
   1460 
   1461             /* Dump target proximity domains */
   1462 
   1463             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1464                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
   1465             {
   1466                 AcpiOsPrintf ("Invalid target proximity domain number\n");
   1467                 return;
   1468             }
   1469             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
   1470             {
   1471                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1472                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1473                     4, AcpiDmTableInfoHmat1b);
   1474                 if (ACPI_FAILURE (Status))
   1475                 {
   1476                     return;
   1477                 }
   1478 
   1479                 SubtableOffset += 4;
   1480             }
   1481 
   1482             /* Dump latency/bandwidth entris */
   1483 
   1484             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1485                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
   1486                          HmatLocality->NumberOfTargetPDs * 2))
   1487             {
   1488                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
   1489                 return;
   1490             }
   1491             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
   1492             {
   1493                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
   1494                 {
   1495                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1496                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1497                         2, AcpiDmTableInfoHmat1c);
   1498                     if (ACPI_FAILURE(Status))
   1499                     {
   1500                         return;
   1501                     }
   1502 
   1503                     SubtableOffset += 2;
   1504                 }
   1505             }
   1506             break;
   1507 
   1508         case ACPI_HMAT_TYPE_CACHE:
   1509 
   1510             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
   1511             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
   1512 
   1513             /* Dump SMBIOS handles */
   1514 
   1515             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
   1516                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
   1517             {
   1518                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
   1519                 return;
   1520             }
   1521             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
   1522             {
   1523                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
   1524                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
   1525                     2, AcpiDmTableInfoHmat2a);
   1526                 if (ACPI_FAILURE (Status))
   1527                 {
   1528                     return;
   1529                 }
   1530 
   1531                 SubtableOffset += 2;
   1532             }
   1533             break;
   1534 
   1535         default:
   1536 
   1537             break;
   1538         }
   1539 
   1540 NextSubtable:
   1541         /* Point to next HMAT structure subtable */
   1542 
   1543         Offset += (HmatStruct->Length);
   1544     }
   1545 }
   1546