Home | History | Annotate | Line # | Download | only in common
dmtable.c revision 1.1.1.25
      1 /******************************************************************************
      2  *
      3  * Module Name: dmtable - Support for ACPI tables that contain no AML code
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2023, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "acpi.h"
     45 #include "accommon.h"
     46 #include "acdisasm.h"
     47 #include "actables.h"
     48 #include "aslcompiler.h"
     49 
     50 /* This module used for application-level code only */
     51 
     52 #define _COMPONENT          ACPI_CA_DISASSEMBLER
     53         ACPI_MODULE_NAME    ("dmtable")
     54 
     55 const AH_TABLE *
     56 AcpiAhGetTableInfo (
     57     char                    *Signature);
     58 
     59 
     60 /* Common format strings for commented values */
     61 
     62 #define UINT8_FORMAT            "%2.2X [%s]\n"
     63 #define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]"
     64 #define UINT16_FORMAT           "%4.4X [%s]\n"
     65 #define UINT32_FORMAT           "%8.8X [%s]\n"
     66 #define STRING_FORMAT           "[%s]\n"
     67 
     68 /* These tables map a subtable type to a description string */
     69 
     70 static const char           *AcpiDmAestResourceNames[] =
     71 {
     72     "Cache Resource",
     73     "TLB Resource",
     74     "Generic Resource",
     75     "Unknown Resource Type"         /* Reserved */
     76 };
     77 
     78 static const char           *AcpiDmAestSubnames[] =
     79 {
     80     "Processor Error Node",
     81     "Memory Error Node",
     82     "SMMU Error Node",
     83     "Vendor-defined Error Node",
     84     "GIC Error Node",
     85     "PCIE Error Node",
     86     "PROXY Error Node",
     87     "Unknown Subtable Type"         /* Reserved */
     88 };
     89 
     90 static const char           *AcpiDmAestCacheNames[] =
     91 {
     92     "Data Cache",
     93     "Instruction Cache",
     94     "Unified Cache",
     95     "Unknown Cache Type"            /* Reserved */
     96 };
     97 
     98 static const char           *AcpiDmAestGicNames[] =
     99 {
    100     "GIC CPU",
    101     "GIC Distributor",
    102     "GIC Redistributor",
    103     "GIC ITS",
    104     "Unknown GIC Interface Type"    /* Reserved */
    105 };
    106 
    107 static const char           *AcpiDmAestXfaceNames[] =
    108 {
    109     "System Register Interface",
    110     "Memory Mapped Interface",
    111     "Single Record Memory Mapped Interface",
    112     "Unknown Interface Type"        /* Reserved */
    113 };
    114 
    115 static const char           *AcpiDmAestXruptNames[] =
    116 {
    117     "Fault Handling Interrupt",
    118     "Error Recovery Interrupt",
    119     "Unknown Interrupt Type"        /* Reserved */
    120 };
    121 
    122 static const char           *AcpiDmAsfSubnames[] =
    123 {
    124     "ASF Information",
    125     "ASF Alerts",
    126     "ASF Remote Control",
    127     "ASF RMCP Boot Options",
    128     "ASF Address",
    129     "Unknown Subtable Type"         /* Reserved */
    130 };
    131 
    132 static const char           *AcpiDmAsptSubnames[] =
    133 {
    134     "ASPT Global Registers",
    135     "ASPT SEV Mailbox Registers",
    136     "ASPT ACPI Mailbox Registers",
    137     "Unknown Subtable Type"         /* Reserved */
    138 };
    139 
    140 static const char           *AcpiDmCdatSubnames[] =
    141 {
    142     "Device Scoped Memory Affinity Structure (DSMAS)",
    143     "Device scoped Latency and Bandwidth Information Structure (DSLBIS)",
    144     "Device Scoped Memory Side Cache Information Structure (DSMSCIS)",
    145     "Device Scoped Initiator Structure (DSIS)",
    146     "Device Scoped EFI Memory Type Structure (DSEMTS)",
    147     "Switch Scoped Latency and Bandwidth Information Structure (SSLBIS)",
    148     "Unknown Subtable Type"         /* Reserved */
    149 };
    150 
    151 static const char           *AcpiDmCedtSubnames[] =
    152 {
    153     "CXL Host Bridge Structure",
    154     "CXL Fixed Memory Window Structure",
    155     "CXL XOR Interleave Math Structure",
    156     "Unknown Subtable Type"         /* Reserved */
    157 };
    158 
    159 static const char           *AcpiDmDmarSubnames[] =
    160 {
    161     "Hardware Unit Definition",
    162     "Reserved Memory Region",
    163     "Root Port ATS Capability",
    164     "Remapping Hardware Static Affinity",
    165     "ACPI Namespace Device Declaration",
    166     "SoC Integrated Address Translation Cache",
    167     "Unknown Subtable Type"         /* Reserved */
    168 };
    169 
    170 static const char           *AcpiDmDmarScope[] =
    171 {
    172     "Reserved value",
    173     "PCI Endpoint Device",
    174     "PCI Bridge Device",
    175     "IOAPIC Device",
    176     "Message-capable HPET Device",
    177     "Namespace Device",
    178     "Unknown Scope Type"            /* Reserved */
    179 };
    180 
    181 static const char           *AcpiDmEinjActions[] =
    182 {
    183     "Begin Operation",
    184     "Get Trigger Table",
    185     "Set Error Type",
    186     "Get Error Type",
    187     "End Operation",
    188     "Execute Operation",
    189     "Check Busy Status",
    190     "Get Command Status",
    191     "Set Error Type With Address",
    192     "Get Execute Timings",
    193     "Unknown Action"
    194 };
    195 
    196 static const char           *AcpiDmEinjInstructions[] =
    197 {
    198     "Read Register",
    199     "Read Register Value",
    200     "Write Register",
    201     "Write Register Value",
    202     "Noop",
    203     "Flush Cacheline",
    204     "Unknown Instruction"
    205 };
    206 
    207 static const char           *AcpiDmErstActions[] =
    208 {
    209     "Begin Write Operation",
    210     "Begin Read Operation",
    211     "Begin Clear Operation",
    212     "End Operation",
    213     "Set Record Offset",
    214     "Execute Operation",
    215     "Check Busy Status",
    216     "Get Command Status",
    217     "Get Record Identifier",
    218     "Set Record Identifier",
    219     "Get Record Count",
    220     "Begin Dummy Write",
    221     "Unused/Unknown Action",
    222     "Get Error Address Range",
    223     "Get Error Address Length",
    224     "Get Error Attributes",
    225     "Execute Timings",
    226     "Unknown Action"
    227 };
    228 
    229 static const char           *AcpiDmErstInstructions[] =
    230 {
    231     "Read Register",
    232     "Read Register Value",
    233     "Write Register",
    234     "Write Register Value",
    235     "Noop",
    236     "Load Var1",
    237     "Load Var2",
    238     "Store Var1",
    239     "Add",
    240     "Subtract",
    241     "Add Value",
    242     "Subtract Value",
    243     "Stall",
    244     "Stall While True",
    245     "Skip Next If True",
    246     "GoTo",
    247     "Set Source Address",
    248     "Set Destination Address",
    249     "Move Data",
    250     "Unknown Instruction"
    251 };
    252 
    253 static const char           *AcpiDmGtdtSubnames[] =
    254 {
    255     "Generic Timer Block",
    256     "Generic Watchdog Timer",
    257     "Unknown Subtable Type"         /* Reserved */
    258 };
    259 
    260 static const char           *AcpiDmHestSubnames[] =
    261 {
    262     "IA-32 Machine Check Exception",
    263     "IA-32 Corrected Machine Check",
    264     "IA-32 Non-Maskable Interrupt",
    265     "Unknown Subtable Type",        /* 3 - Reserved */
    266     "Unknown Subtable Type",        /* 4 - Reserved */
    267     "Unknown Subtable Type",        /* 5 - Reserved */
    268     "PCI Express Root Port AER",
    269     "PCI Express AER (AER Endpoint)",
    270     "PCI Express/PCI-X Bridge AER",
    271     "Generic Hardware Error Source",
    272     "Generic Hardware Error Source V2",
    273     "IA-32 Deferred Machine Check",
    274     "Unknown Subtable Type"         /* Reserved */
    275 };
    276 
    277 static const char           *AcpiDmHestNotifySubnames[] =
    278 {
    279     "Polled",
    280     "External Interrupt",
    281     "Local Interrupt",
    282     "SCI",
    283     "NMI",
    284     "CMCI",                         /* ACPI 5.0 */
    285     "MCE",                          /* ACPI 5.0 */
    286     "GPIO",                         /* ACPI 6.0 */
    287     "SEA",                          /* ACPI 6.1 */
    288     "SEI",                          /* ACPI 6.1 */
    289     "GSIV",                         /* ACPI 6.1 */
    290     "Software Delegated Exception", /* ACPI 6.2 */
    291     "Unknown Notify Type"           /* Reserved */
    292 };
    293 
    294 static const char           *AcpiDmHmatSubnames[] =
    295 {
    296     "Memory Proximity Domain Attributes",
    297     "System Locality Latency and Bandwidth Information",
    298     "Memory Side Cache Information",
    299     "Unknown Structure Type"         /* Reserved */
    300 };
    301 
    302 static const char           *AcpiDmMadtSubnames[] =
    303 {
    304     "Processor Local APIC",             /* ACPI_MADT_TYPE_LOCAL_APIC */
    305     "I/O APIC",                         /* ACPI_MADT_TYPE_IO_APIC */
    306     "Interrupt Source Override",        /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
    307     "NMI Source",                       /* ACPI_MADT_TYPE_NMI_SOURCE */
    308     "Local APIC NMI",                   /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
    309     "Local APIC Address Override",      /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
    310     "I/O SAPIC",                        /* ACPI_MADT_TYPE_IO_SAPIC */
    311     "Local SAPIC",                      /* ACPI_MADT_TYPE_LOCAL_SAPIC */
    312     "Platform Interrupt Sources",       /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
    313     "Processor Local x2APIC",           /* ACPI_MADT_TYPE_LOCAL_X2APIC */
    314     "Local x2APIC NMI",                 /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
    315     "Generic Interrupt Controller",     /* ACPI_MADT_GENERIC_INTERRUPT */
    316     "Generic Interrupt Distributor",    /* ACPI_MADT_GENERIC_DISTRIBUTOR */
    317     "Generic MSI Frame",                /* ACPI_MADT_GENERIC_MSI_FRAME */
    318     "Generic Interrupt Redistributor",  /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
    319     "Generic Interrupt Translator",     /* ACPI_MADT_GENERIC_TRANSLATOR */
    320     "Mutiprocessor Wakeup",             /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */
    321     "CPU Core Interrupt Controller",    /* ACPI_MADT_TYPE_CORE_PIC */
    322     "Legacy I/O Interrupt Controller",  /* ACPI_MADT_TYPE_LIO_PIC */
    323     "HT Interrupt Controller",          /* ACPI_MADT_TYPE_HT_PIC */
    324     "Extend I/O Interrupt Controller",  /* ACPI_MADT_TYPE_EIO_PIC */
    325     "MSI Interrupt Controller",         /* ACPI_MADT_TYPE_MSI_PIC */
    326     "Bridge I/O Interrupt Controller",  /* ACPI_MADT_TYPE_BIO_PIC */
    327     "LPC Interrupt Controller",         /* ACPI_MADT_TYPE_LPC_PIC */
    328     "RISC-V Interrupt Controller",      /* ACPI_MADT_TYPE_RINTC */
    329     "RISC-V Incoming MSI Controller",   /* ACPI_MADT_TYPE_IMSIC */
    330     "RISC-V APLIC Controller",          /* ACPI_MADT_TYPE_APLIC */
    331     "RISC-V PLIC Controller",           /* ACPI_MADT_TYPE_PLIC */
    332     "Unknown Subtable Type",            /* Reserved */
    333     "Types 80-FF are used for OEM data" /* Reserved for OEM data */
    334 };
    335 
    336 static const char           *AcpiDmMpamSubnames[] =
    337 {
    338     "Processor cache",      /* ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE */
    339     "Memory",               /* ACPI_MPAM_LOCATION_TYPE_MEMORY */
    340     "SMMU",                 /* ACPI_MPAM_LOCATION_TYPE_SMMU */
    341     "Memory-side cache",    /* ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE */
    342     "ACPI device",          /* ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE */
    343     "Interconnect",         /* ACPI_MPAM_LOCATION_TYPE_INTERCONNECT */
    344     "Unknown"               /* ACPI_MPAM_LOCATION_TYPE_UNKNOWN */
    345 };
    346 
    347 static const char           *AcpiDmNfitSubnames[] =
    348 {
    349     "System Physical Address Range",    /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
    350     "Memory Range Map",                 /* ACPI_NFIT_TYPE_MEMORY_MAP */
    351     "Interleave Info",                  /* ACPI_NFIT_TYPE_INTERLEAVE */
    352     "SMBIOS Information",               /* ACPI_NFIT_TYPE_SMBIOS */
    353     "NVDIMM Control Region",            /* ACPI_NFIT_TYPE_CONTROL_REGION */
    354     "NVDIMM Block Data Window Region",  /* ACPI_NFIT_TYPE_DATA_REGION */
    355     "Flush Hint Address",               /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
    356     "Platform Capabilities",            /* ACPI_NFIT_TYPE_CAPABILITIES */
    357     "Unknown Subtable Type"             /* Reserved */
    358 };
    359 
    360 static const char           *AcpiDmPcctSubnames[] =
    361 {
    362     "Generic Communications Subspace",  /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
    363     "HW-Reduced Comm Subspace",         /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
    364     "HW-Reduced Comm Subspace Type2",   /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
    365     "Extended PCC Master Subspace",     /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
    366     "Extended PCC Slave Subspace",      /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
    367     "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
    368     "Unknown Subtable Type"             /* Reserved */
    369 };
    370 
    371 static const char           *AcpiDmPhatSubnames[] =
    372 {
    373     "Firmware Version Data",        /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
    374     "Firmware Health Data",         /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
    375     "Unknown Subtable Type"         /* Reserved */
    376 };
    377 
    378 static const char           *AcpiDmPmttSubnames[] =
    379 {
    380     "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
    381     "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
    382     "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM */
    383     "Unknown Subtable Type",        /* Reserved */
    384     "Vendor Specific"               /* ACPI_PMTT_TYPE_VENDOR */
    385 };
    386 
    387 static const char           *AcpiDmPpttSubnames[] =
    388 {
    389     "Processor Hierarchy Node",     /* ACPI_PPTT_TYPE_PROCESSOR */
    390     "Cache Type",                   /* ACPI_PPTT_TYPE_CACHE */
    391     "ID",                           /* ACPI_PPTT_TYPE_ID */
    392     "Unknown Subtable Type"         /* Reserved */
    393 };
    394 
    395 static const char           *AcpiDmRgrtSubnames[] =
    396 {
    397     "Unknown/Reserved Image Type",  /* ACPI_RGRT_TYPE_RESERVED0 */
    398     "Type PNG"                      /* ACPI_RGRT_IMAGE_TYPE_PNG */
    399 };
    400 
    401 static const char           *AcpiDmSdevSubnames[] =
    402 {
    403     "Namespace Device",             /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
    404     "PCIe Endpoint Device",         /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
    405     "Unknown Subtable Type"         /* Reserved */
    406 };
    407 
    408 static const char           *AcpiDmSratSubnames[] =
    409 {
    410     "Processor Local APIC/SAPIC Affinity",
    411     "Memory Affinity",
    412     "Processor Local x2APIC Affinity",
    413     "GICC Affinity",
    414     "GIC ITS Affinity",             /* Acpi 6.2 */
    415     "Generic Initiator Affinity",   /* Acpi 6.3 */
    416     "Generic Port Affinity",        /* Acpi 6.4 */
    417     "RINTC Affinity",               /* Acpi 6.6 */
    418     "Unknown Subtable Type"         /* Reserved */
    419 };
    420 
    421 static const char           *AcpiDmTpm2Subnames[] =
    422 {
    423     "Illegal Start Method value",
    424     "Reserved",
    425     "ACPI Start Method",
    426     "Reserved",
    427     "Reserved",
    428     "Reserved",
    429     "Memory Mapped I/O",
    430     "Command Response Buffer",
    431     "Command Response Buffer with ACPI Start Method",
    432     "Reserved",
    433     "Reserved",
    434     "Command Response Buffer with ARM SMC",
    435     "Unknown Subtable Type"         /* Reserved */
    436 };
    437 
    438 static const char           *AcpiDmIvrsSubnames[] =
    439 {
    440     "Hardware Definition Block (IVHD)",
    441     "Hardware Definition Block - Mixed Format (IVHD)",
    442     "Memory Definition Block (IVMD)",
    443     "Unknown/Reserved Subtable Type"            /* Reserved */
    444 };
    445 
    446 static const char           *AcpiDmIvrsDevEntryNames[] =
    447 {
    448     "Unknown/Reserved Device Entry Type",       /* 0- Reserved */
    449     "Device Entry: Select All Devices",         /* 1 */
    450     "Device Entry: Select One Device",          /* 2 */
    451     "Device Entry: Start of Range",             /* 3 */
    452     "Device Entry: End of Range",               /* 4 */
    453     "Device Entry: Alias Select",               /* 66 */
    454     "Device Entry: Alias Start of Range",       /* 67 */
    455     "Unknown/Reserved Device Entry Type",       /* 68- Reserved */
    456     "Unknown/Reserved Device Entry Type",       /* 69- Reserved */
    457     "Device Entry: Extended Select",            /* 70 */
    458     "Device Entry: Extended Start of Range",    /* 71 */
    459     "Device Entry: Special Device",             /* 72 */
    460     "Device Entry: ACPI HID Named Device",      /* 240 */
    461     "Unknown/Reserved Device Entry Type"        /* Reserved */
    462 };
    463 
    464 static const char           *AcpiDmLpitSubnames[] =
    465 {
    466     "Native C-state Idle Structure",
    467     "Unknown Subtable Type"         /* Reserved */
    468 };
    469 
    470 static const char           *AcpiDmViotSubnames[] =
    471 {
    472     "Unknown Subtable Type",        /* 0 -Reserved */
    473     "PCI Range",
    474     "MMIO Endpoint",
    475     "VirtIO-PCI IOMMU",
    476     "VirtIO-MMIO IOMMU",
    477     "Unknown Subtable Type"         /* Reserved */
    478 };
    479 
    480 #define ACPI_FADT_PM_RESERVED       9
    481 
    482 static const char           *AcpiDmFadtProfiles[] =
    483 {
    484     "Unspecified",
    485     "Desktop",
    486     "Mobile",
    487     "Workstation",
    488     "Enterprise Server",
    489     "SOHO Server",
    490     "Appliance PC",
    491     "Performance Server",
    492     "Tablet",
    493     "Unknown Profile Type"
    494 };
    495 
    496 #define ACPI_GAS_WIDTH_RESERVED     5
    497 
    498 static const char           *AcpiDmGasAccessWidth[] =
    499 {
    500     "Undefined/Legacy",
    501     "Byte Access:8",
    502     "Word Access:16",
    503     "DWord Access:32",
    504     "QWord Access:64",
    505     "Unknown Width Encoding"
    506 };
    507 
    508 static const char           *AcpiDmRhctSubnames[] =
    509 {
    510     "RISC-V ISA string structure",  /* ACPI_RHCT_ISA_STRING */
    511     "RISC-V CMO node structure",    /* ACPI_RHCT_CMO_NODE */
    512     "RISC-V MMU node structure",    /* ACPI_RHCT_MMU_NODE */
    513     "RISC-V Hart Info structure",   /* ACPI_RHCT_HART_INFO */
    514 };
    515 
    516 
    517 /*******************************************************************************
    518  *
    519  * ACPI Table Data, indexed by signature.
    520  *
    521  * Each entry contains: Signature, Table Info, Handler, DtHandler,
    522  *  Template, Description
    523  *
    524  * Simple tables have only a TableInfo structure, complex tables have a
    525  * handler. This table must be NULL terminated. RSDP and FACS are
    526  * special-cased elsewhere.
    527  *
    528  * Note: Any tables added here should be duplicated within
    529  * AcpiGbl_SupportedTables in the file common/ahtable.c
    530  *
    531  ******************************************************************************/
    532 
    533 const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
    534 {
    535     {ACPI_SIG_AEST, NULL,                   AcpiDmDumpAest, DtCompileAest,  TemplateAest},
    536     {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi,    NULL,           NULL,           TemplateAgdi},
    537     {ACPI_SIG_APMT, NULL,                   AcpiDmDumpApmt, DtCompileApmt,  TemplateApmt},
    538     {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf},
    539     {ACPI_SIG_ASPT, NULL,                   AcpiDmDumpAspt, DtCompileAspt,  TemplateAspt},
    540     {ACPI_SIG_BDAT, AcpiDmTableInfoBdat,    NULL,           NULL,           TemplateBdat},
    541     {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
    542     {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
    543     {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
    544     {ACPI_SIG_CCEL, AcpiDmTableInfoCcel,    NULL,           NULL,           TemplateCcel},
    545     {ACPI_SIG_CDAT, NULL,                   AcpiDmDumpCdat, NULL,           TemplateCdat},
    546     {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
    547     {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
    548     {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
    549     {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
    550     {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp},
    551     {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar},
    552     {ACPI_SIG_DRTM, NULL,                   AcpiDmDumpDrtm, DtCompileDrtm,  TemplateDrtm},
    553     {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt},
    554     {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj},
    555     {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst},
    556     {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt},
    557     {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
    558     {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
    559     {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
    560     {ACPI_SIG_HMAT, NULL,                   AcpiDmDumpHmat, DtCompileHmat,  TemplateHmat},
    561     {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
    562     {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
    563     {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
    564     {ACPI_SIG_LPIT, NULL,                   AcpiDmDumpLpit, DtCompileLpit,  TemplateLpit},
    565     {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt},
    566     {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg},
    567     {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi},
    568     {ACPI_SIG_MPAM, NULL,                   AcpiDmDumpMpam, DtCompileMpam,  TemplateMpam},
    569     {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst},
    570     {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct},
    571     {ACPI_SIG_MSDM, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateMsdm},
    572     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
    573     {ACPI_SIG_NHLT, NULL,                   NULL,           NULL,           NULL},
    574     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
    575     {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
    576     {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
    577     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
    578     {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
    579     {ACPI_SIG_PRMT, NULL,                   AcpiDmDumpPrmt, DtCompilePrmt,  TemplatePrmt},
    580     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
    581     {ACPI_SIG_RAS2, AcpiDmTableInfoRas2,    AcpiDmDumpRas2, DtCompileRas2,  TemplateRas2},
    582     {ACPI_SIG_RGRT, NULL,                   AcpiDmDumpRgrt, DtCompileRgrt,  TemplateRgrt},
    583     {ACPI_SIG_RHCT, NULL,                   AcpiDmDumpRhct, DtCompileRhct,  TemplateRhct},
    584     {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
    585     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
    586     {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
    587     {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
    588     {ACPI_SIG_SDEV, AcpiDmTableInfoSdev,    AcpiDmDumpSdev, DtCompileSdev,  TemplateSdev},
    589     {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
    590     {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
    591     {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
    592     {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi},
    593     {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat},
    594     {ACPI_SIG_STAO, NULL,                   AcpiDmDumpStao, DtCompileStao,  TemplateStao},
    595     {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl,    AcpiDmDumpSvkl, DtCompileSvkl,  TemplateSvkl},
    596     {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
    597     {ACPI_SIG_TDEL, AcpiDmTableInfoTdel,    NULL,           NULL,           TemplateTdel},
    598     {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
    599     {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
    600     {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
    601     {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
    602     {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
    603     {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
    604     {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
    605     {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
    606     {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt,    NULL,           NULL,           TemplateWsmt},
    607     {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
    608     {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
    609     {NULL,          NULL,                   NULL,           NULL,           NULL}
    610 };
    611 
    612 
    613 /*******************************************************************************
    614  *
    615  * FUNCTION:    AcpiDmGetTableData
    616  *
    617  * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
    618  *
    619  * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
    620  *
    621  * DESCRIPTION: Find a match in the global table of supported ACPI tables
    622  *
    623  ******************************************************************************/
    624 
    625 const ACPI_DMTABLE_DATA *
    626 AcpiDmGetTableData (
    627     char                    *Signature)
    628 {
    629     const ACPI_DMTABLE_DATA *Info;
    630 
    631 
    632     for (Info = AcpiDmTableData; Info->Signature; Info++)
    633     {
    634         if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
    635         {
    636             return (Info);
    637         }
    638     }
    639 
    640     return (NULL);
    641 }
    642 
    643 
    644 /*******************************************************************************
    645  *
    646  * FUNCTION:    AcpiDmDumpDataTable
    647  *
    648  * PARAMETERS:  Table               - An ACPI table
    649  *
    650  * RETURN:      None.
    651  *
    652  * DESCRIPTION: Format the contents of an ACPI data table (any table other
    653  *              than an SSDT or DSDT that does not contain executable AML code)
    654  *
    655  ******************************************************************************/
    656 
    657 void
    658 AcpiDmDumpDataTable (
    659     ACPI_TABLE_HEADER       *Table)
    660 {
    661     ACPI_STATUS             Status;
    662     const ACPI_DMTABLE_DATA *TableData;
    663     UINT32                  Length;
    664 
    665 
    666     /* Ignore tables that contain AML */
    667 
    668     if (AcpiUtIsAmlTable (Table))
    669     {
    670         if (AslGbl_VerboseTemplates)
    671         {
    672             /* Dump the raw table data */
    673 
    674             Length = Table->Length;
    675 
    676             AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
    677                 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
    678             AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
    679                 Length, DB_BYTE_DISPLAY, 0);
    680             AcpiOsPrintf (" */\n");
    681         }
    682         return;
    683     }
    684 
    685     /*
    686      * Handle tables that don't use the common ACPI table header structure.
    687      * Currently, these are the FACS, RSDP, S3PT and CDAT.
    688      */
    689     if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
    690     {
    691         Length = Table->Length;
    692         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
    693         if (ACPI_FAILURE (Status))
    694         {
    695             return;
    696         }
    697     }
    698     else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP,
    699         Table)->Signature))
    700     {
    701         Length = AcpiDmDumpRsdp (Table);
    702     }
    703     else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
    704     {
    705         Length = AcpiDmDumpS3pt (Table);
    706     }
    707     else if (!AcpiUtValidNameseg (Table->Signature))
    708     {
    709         /*
    710          * For CDAT we are assuming that there should be at least one non-ASCII
    711          * byte in the (normally) 4-character Signature field (at least the
    712          * high-order byte should be zero).
    713          */
    714         if (AcpiGbl_CDAT)
    715         {
    716             /*
    717              * Invalid signature and <-ds CDAT> was specified on the command line.
    718              * Therefore, we have a CDAT table.
    719              */
    720             AcpiDmDumpCdat (Table);
    721         }
    722         else
    723         {
    724             fprintf (stderr, "Table has an invalid signature\n");
    725         }
    726 
    727         return;
    728     }
    729     else
    730     {
    731         /*
    732          * All other tables must use the common ACPI table header, dump it now
    733          */
    734         Length = Table->Length;
    735         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
    736         if (ACPI_FAILURE (Status))
    737         {
    738             return;
    739         }
    740         AcpiOsPrintf ("\n");
    741 
    742         /* Match signature and dispatch appropriately */
    743 
    744         TableData = AcpiDmGetTableData (Table->Signature);
    745         if (!TableData)
    746         {
    747             if (!strncmp (Table->Signature, "OEM", 3))
    748             {
    749                 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
    750                     Table->Signature);
    751             }
    752             else
    753             {
    754                 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
    755                     Table->Signature);
    756 
    757                 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
    758                     Table->Signature);
    759 
    760                 if (!AcpiGbl_ForceAmlDisassembly)
    761                 {
    762                     fprintf (stderr, "decoding ACPI table header only\n");
    763                 }
    764                 else
    765                 {
    766                     fprintf (stderr, "assuming table contains valid AML code\n");
    767                 }
    768             }
    769         }
    770         else if (TableData->TableHandler)
    771         {
    772             /* Complex table, has a handler */
    773 
    774             TableData->TableHandler (Table);
    775         }
    776         else if (TableData->TableInfo)
    777         {
    778             /* Simple table, just walk the info table */
    779 
    780             Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
    781             if (ACPI_FAILURE (Status))
    782             {
    783                 return;
    784             }
    785         }
    786     }
    787 
    788     if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
    789     {
    790         /* Dump the raw table data */
    791 
    792         AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
    793             ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
    794         AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
    795             Length, DB_BYTE_DISPLAY, 0);
    796     }
    797 }
    798 
    799 
    800 /*******************************************************************************
    801  *
    802  * FUNCTION:    AcpiDmLineHeader
    803  *
    804  * PARAMETERS:  Offset              - Current byte offset, from table start
    805  *              ByteLength          - Length of the field in bytes, 0 for flags
    806  *              Name                - Name of this field
    807  *
    808  * RETURN:      None
    809  *
    810  * DESCRIPTION: Utility routines for formatting output lines. Displays the
    811  *              current table offset in hex and decimal, the field length,
    812  *              and the field name.
    813  *
    814  ******************************************************************************/
    815 
    816 void
    817 AcpiDmLineHeader (
    818     UINT32                  Offset,
    819     UINT32                  ByteLength,
    820     char                    *Name)
    821 {
    822 
    823     /* Allow a null name for fields that span multiple lines (large buffers) */
    824 
    825     if (!Name)
    826     {
    827         Name = "";
    828     }
    829 
    830     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
    831     {
    832         if (ByteLength)
    833         {
    834             AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
    835         }
    836         else
    837         {
    838             if (*Name)
    839             {
    840                 AcpiOsPrintf ("%41s : ", Name);
    841             }
    842             else
    843             {
    844                 AcpiOsPrintf ("%41s   ", Name);
    845             }
    846         }
    847     }
    848     else /* Normal disassembler or verbose template */
    849     {
    850         if (ByteLength)
    851         {
    852             AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ",
    853                 Offset, Offset, ByteLength, Name);
    854         }
    855         else
    856         {
    857             if (*Name)
    858             {
    859                 AcpiOsPrintf ("%44s : ", Name);
    860             }
    861             else
    862             {
    863                 AcpiOsPrintf ("%44s   ", Name);
    864             }
    865         }
    866     }
    867 }
    868 
    869 void
    870 AcpiDmLineHeader2 (
    871     UINT32                  Offset,
    872     UINT32                  ByteLength,
    873     char                    *Name,
    874     UINT32                  Value)
    875 {
    876 
    877     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
    878     {
    879         if (ByteLength)
    880         {
    881             AcpiOsPrintf ("[%.4d] %30s %3d : ",
    882                 ByteLength, Name, Value);
    883         }
    884         else
    885         {
    886             AcpiOsPrintf ("%36s % 3d : ",
    887                 Name, Value);
    888         }
    889     }
    890     else /* Normal disassembler or verbose template */
    891     {
    892         if (ByteLength)
    893         {
    894             AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ",
    895                 Offset, Offset, ByteLength, Name, Value);
    896         }
    897         else
    898         {
    899             AcpiOsPrintf ("[%3.3Xh %4.4u   ] %24s %3d : ",
    900                 Offset, Offset, Name, Value);
    901         }
    902     }
    903 }
    904 
    905 
    906 /*******************************************************************************
    907  *
    908  * FUNCTION:    AcpiDmDumpTable
    909  *
    910  * PARAMETERS:  TableLength         - Length of the entire ACPI table
    911  *              TableOffset         - Starting offset within the table for this
    912  *                                    sub-descriptor (0 if main table)
    913  *              Table               - The ACPI table
    914  *              SubtableLength      - Length of this sub-descriptor
    915  *              Info                - Info table for this ACPI table
    916  *
    917  * RETURN:      Status
    918  *
    919  * DESCRIPTION: Display ACPI table contents by walking the Info table.
    920  *
    921  * Note: This function must remain in sync with DtGetFieldLength.
    922  *
    923  ******************************************************************************/
    924 
    925 ACPI_STATUS
    926 AcpiDmDumpTable (
    927     UINT32                  TableLength,
    928     UINT32                  TableOffset,
    929     void                    *Table,
    930     UINT32                  SubtableLength,
    931     ACPI_DMTABLE_INFO       *Info)
    932 {
    933     UINT8                   *Target;
    934     UINT32                  CurrentOffset;
    935     UINT32                  ByteLength;
    936     UINT8                   Temp8;
    937     UINT16                  Temp16;
    938     UINT32                  Temp32;
    939     UINT64                  Value;
    940     const AH_TABLE          *TableData;
    941     const char              *Name;
    942     BOOLEAN                 LastOutputBlankLine = FALSE;
    943     ACPI_STATUS             Status;
    944     char                    RepairedName[8];
    945 
    946 
    947     if (!Info)
    948     {
    949         AcpiOsPrintf ("Display not implemented\n");
    950         return (AE_NOT_IMPLEMENTED);
    951     }
    952 
    953     /* Walk entire Info table; Null name terminates */
    954 
    955     for (; Info->Name; Info++)
    956     {
    957         /*
    958          * Target points to the field within the ACPI Table. CurrentOffset is
    959          * the offset of the field from the start of the main table.
    960          */
    961         Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
    962         CurrentOffset = TableOffset + Info->Offset;
    963 
    964         /* Check for beyond subtable end or (worse) beyond EOT */
    965 
    966         if (SubtableLength && (Info->Offset > SubtableLength))
    967         {
    968             AcpiOsPrintf (
    969                 "/**** ACPI subtable terminates early (Len %u) - "
    970                 "may be older version (dump table) */\n", SubtableLength);
    971 
    972             /* Move on to next subtable */
    973 
    974             return (AE_OK);
    975         }
    976 
    977         if (CurrentOffset >= TableLength)
    978         {
    979             AcpiOsPrintf (
    980                 "/**** ACPI table terminates "
    981                 "in the middle of a data structure! (dump table)\n"
    982                 "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength);
    983             return (AE_BAD_DATA);
    984         }
    985 
    986         /* Generate the byte length for this field */
    987 
    988         switch (Info->Opcode)
    989         {
    990         case ACPI_DMT_UINT8:
    991         case ACPI_DMT_CHKSUM:
    992         case ACPI_DMT_SPACEID:
    993         case ACPI_DMT_ACCWIDTH:
    994         case ACPI_DMT_CEDT:
    995         case ACPI_DMT_IVRS:
    996         case ACPI_DMT_IVRS_DE:
    997         case ACPI_DMT_GTDT:
    998         case ACPI_DMT_MADT:
    999         case ACPI_DMT_MPAM_LOCATOR:
   1000         case ACPI_DMT_PCCT:
   1001         case ACPI_DMT_PMTT:
   1002         case ACPI_DMT_PPTT:
   1003         case ACPI_DMT_RGRT:
   1004         case ACPI_DMT_SDEV:
   1005         case ACPI_DMT_SRAT:
   1006         case ACPI_DMT_AEST:
   1007         case ACPI_DMT_AEST_RES:
   1008         case ACPI_DMT_AEST_XFACE:
   1009         case ACPI_DMT_AEST_XRUPT:
   1010         case ACPI_DMT_ASF:
   1011         case ACPI_DMT_CDAT:
   1012         case ACPI_DMT_HESTNTYP:
   1013         case ACPI_DMT_FADTPM:
   1014         case ACPI_DMT_EINJACT:
   1015         case ACPI_DMT_EINJINST:
   1016         case ACPI_DMT_ERSTACT:
   1017         case ACPI_DMT_ERSTINST:
   1018         case ACPI_DMT_DMAR_SCOPE:
   1019         case ACPI_DMT_VIOT:
   1020 
   1021             ByteLength = 1;
   1022             break;
   1023 
   1024         case ACPI_DMT_ASPT:
   1025         case ACPI_DMT_UINT16:
   1026         case ACPI_DMT_DMAR:
   1027         case ACPI_DMT_HEST:
   1028         case ACPI_DMT_HMAT:
   1029         case ACPI_DMT_NFIT:
   1030         case ACPI_DMT_PHAT:
   1031         case ACPI_DMT_RHCT:
   1032 
   1033             ByteLength = 2;
   1034             break;
   1035 
   1036         case ACPI_DMT_UINT24:
   1037 
   1038             ByteLength = 3;
   1039             break;
   1040 
   1041         case ACPI_DMT_UINT32:
   1042         case ACPI_DMT_AEST_CACHE:
   1043         case ACPI_DMT_AEST_GIC:
   1044         case ACPI_DMT_NAME4:
   1045         case ACPI_DMT_SIG:
   1046         case ACPI_DMT_LPIT:
   1047         case ACPI_DMT_TPM2:
   1048 
   1049             ByteLength = 4;
   1050             break;
   1051 
   1052         case ACPI_DMT_UINT40:
   1053 
   1054             ByteLength = 5;
   1055             break;
   1056 
   1057         case ACPI_DMT_UINT48:
   1058         case ACPI_DMT_NAME6:
   1059 
   1060             ByteLength = 6;
   1061             break;
   1062 
   1063         case ACPI_DMT_UINT56:
   1064         case ACPI_DMT_BUF7:
   1065 
   1066             ByteLength = 7;
   1067             break;
   1068 
   1069         case ACPI_DMT_UINT64:
   1070         case ACPI_DMT_NAME8:
   1071 
   1072             ByteLength = 8;
   1073             break;
   1074 
   1075         case ACPI_DMT_BUF10:
   1076 
   1077             ByteLength = 10;
   1078             break;
   1079 
   1080         case ACPI_DMT_BUF12:
   1081 
   1082             ByteLength = 12;
   1083             break;
   1084 
   1085         case ACPI_DMT_BUF16:
   1086         case ACPI_DMT_UUID:
   1087 
   1088             ByteLength = 16;
   1089             break;
   1090 
   1091         case ACPI_DMT_BUF18:
   1092 
   1093             ByteLength = 18;
   1094             break;
   1095 
   1096         case ACPI_DMT_BUF32:
   1097 
   1098             ByteLength = 32;
   1099             break;
   1100 
   1101         case ACPI_DMT_BUF112:
   1102 
   1103             ByteLength = 112;
   1104             break;
   1105 
   1106         case ACPI_DMT_BUF128:
   1107 
   1108             ByteLength = 128;
   1109             break;
   1110 
   1111         case ACPI_DMT_WPBT_UNICODE:
   1112 
   1113             ByteLength = SubtableLength;
   1114             CurrentOffset = sizeof (ACPI_TABLE_WPBT);
   1115             break;
   1116 
   1117         case ACPI_DMT_UNICODE:
   1118         case ACPI_DMT_BUFFER:
   1119         case ACPI_DMT_RAW_BUFFER:
   1120 
   1121             ByteLength = SubtableLength;
   1122             break;
   1123 
   1124         case ACPI_DMT_PMTT_VENDOR:
   1125             /*
   1126              * Calculate the length of the vendor data for the PMTT table:
   1127              * Length = (Current Subtable ptr + Subtable length) -
   1128              *          Start of the vendor data (Target)
   1129              */
   1130             ByteLength = ((ACPI_CAST_PTR (char, Table) +
   1131                             (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
   1132                             ACPI_CAST_PTR (char, Target));
   1133             break;
   1134 
   1135         case ACPI_DMT_STRING:
   1136 
   1137             ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
   1138             break;
   1139 
   1140         case ACPI_DMT_IVRS_UNTERMINATED_STRING:
   1141 
   1142             ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength);
   1143             break;
   1144 
   1145         case ACPI_DMT_GAS:
   1146 
   1147             if (!LastOutputBlankLine)
   1148             {
   1149                 AcpiOsPrintf ("\n");
   1150                 LastOutputBlankLine = TRUE;
   1151             }
   1152 
   1153             ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
   1154             break;
   1155 
   1156         case ACPI_DMT_HESTNTFY:
   1157 
   1158             if (!LastOutputBlankLine)
   1159             {
   1160                 AcpiOsPrintf ("\n");
   1161                 LastOutputBlankLine = TRUE;
   1162             }
   1163 
   1164             ByteLength = sizeof (ACPI_HEST_NOTIFY);
   1165             break;
   1166 
   1167         case ACPI_DMT_IORTMEM:
   1168 
   1169             if (!LastOutputBlankLine)
   1170             {
   1171                 LastOutputBlankLine = FALSE;
   1172             }
   1173 
   1174             ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
   1175             break;
   1176 
   1177         default:
   1178 
   1179             ByteLength = 0;
   1180             break;
   1181         }
   1182 
   1183         /* Check if we are beyond a subtable, or (worse) beyond EOT */
   1184 
   1185         if (CurrentOffset + ByteLength > TableLength)
   1186         {
   1187             if (SubtableLength)
   1188             {
   1189                 AcpiOsPrintf (
   1190                     "/**** ACPI subtable terminates early - "
   1191                     "may be older version (dump table) */\n");
   1192 
   1193                 /* Move on to next subtable */
   1194 
   1195                 return (AE_OK);
   1196             }
   1197 
   1198             AcpiOsPrintf (
   1199                 "/**** ACPI table terminates "
   1200                 "in the middle of a data structure! */\n");
   1201             return (AE_BAD_DATA);
   1202         }
   1203 
   1204         if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
   1205         {
   1206             AcpiOsPrintf ("%s", Info->Name);
   1207             continue;
   1208         }
   1209 
   1210         /* Start a new line and decode the opcode */
   1211 
   1212         AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
   1213 
   1214         switch (Info->Opcode)
   1215         {
   1216         /* Single-bit Flag fields. Note: Opcode is the bit position */
   1217 
   1218         case ACPI_DMT_FLAG0:
   1219         case ACPI_DMT_FLAG1:
   1220         case ACPI_DMT_FLAG2:
   1221         case ACPI_DMT_FLAG3:
   1222         case ACPI_DMT_FLAG4:
   1223         case ACPI_DMT_FLAG5:
   1224         case ACPI_DMT_FLAG6:
   1225         case ACPI_DMT_FLAG7:
   1226 
   1227             AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
   1228             break;
   1229 
   1230         /* 2-bit Flag fields */
   1231 
   1232         case ACPI_DMT_FLAGS0:
   1233 
   1234             AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
   1235             break;
   1236 
   1237         case ACPI_DMT_FLAGS1:
   1238 
   1239             AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
   1240             break;
   1241 
   1242         case ACPI_DMT_FLAGS2:
   1243 
   1244             AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
   1245             break;
   1246 
   1247         case ACPI_DMT_FLAGS8_2:
   1248 
   1249             AcpiOsPrintf ("%2.2X\n", (*Target >> 2) & 0xFF);
   1250             break;
   1251 
   1252         case ACPI_DMT_FLAGS4:
   1253 
   1254             AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
   1255             break;
   1256 
   1257         case ACPI_DMT_FLAGS4_0:
   1258 
   1259             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
   1260             break;
   1261 
   1262         case ACPI_DMT_FLAGS4_4:
   1263 
   1264             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
   1265             break;
   1266 
   1267         case ACPI_DMT_FLAGS4_8:
   1268 
   1269             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
   1270             break;
   1271 
   1272         case ACPI_DMT_FLAGS4_12:
   1273 
   1274             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
   1275             break;
   1276 
   1277         case ACPI_DMT_FLAGS16_16:
   1278 
   1279             AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
   1280             break;
   1281 
   1282         /* Integer Data Types */
   1283 
   1284         case ACPI_DMT_UINT8:
   1285         case ACPI_DMT_UINT16:
   1286         case ACPI_DMT_UINT24:
   1287         case ACPI_DMT_UINT32:
   1288         case ACPI_DMT_UINT40:
   1289         case ACPI_DMT_UINT48:
   1290         case ACPI_DMT_UINT56:
   1291         case ACPI_DMT_UINT64:
   1292             /*
   1293              * Dump bytes - high byte first, low byte last.
   1294              * Note: All ACPI tables are little-endian.
   1295              */
   1296             Value = 0;
   1297             for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
   1298             {
   1299                 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
   1300                 Value |= Target[Temp8 - 1];
   1301                 Value <<= 8;
   1302             }
   1303 
   1304             if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
   1305             {
   1306                 AcpiOsPrintf (" [Optional field not present]");
   1307             }
   1308 
   1309             AcpiOsPrintf ("\n");
   1310             break;
   1311 
   1312         case ACPI_DMT_BUF7:
   1313         case ACPI_DMT_BUF10:
   1314         case ACPI_DMT_BUF12:
   1315         case ACPI_DMT_BUF16:
   1316         case ACPI_DMT_BUF18:
   1317         case ACPI_DMT_BUF32:
   1318         case ACPI_DMT_BUF112:
   1319         case ACPI_DMT_BUF128:
   1320             /*
   1321              * Buffer: Size depends on the opcode and was set above.
   1322              * Each hex byte is separated with a space.
   1323              * Multiple lines are separated by line continuation char.
   1324              */
   1325             for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
   1326             {
   1327                 AcpiOsPrintf ("%2.2X", Target[Temp16]);
   1328                 if ((UINT32) (Temp16 + 1) < ByteLength)
   1329                 {
   1330                     if ((Temp16 > 0) && (!((Temp16+1) % 16)))
   1331                     {
   1332                         AcpiOsPrintf (" \\\n"); /* Line continuation */
   1333                         AcpiDmLineHeader (0, 0, NULL);
   1334                     }
   1335                     else
   1336                     {
   1337                         AcpiOsPrintf (" ");
   1338                     }
   1339                 }
   1340             }
   1341 
   1342             AcpiOsPrintf ("\n");
   1343             break;
   1344 
   1345         case ACPI_DMT_UUID:
   1346 
   1347             /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
   1348 
   1349             (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
   1350 
   1351             AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
   1352             break;
   1353 
   1354         case ACPI_DMT_STRING:
   1355 
   1356             AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
   1357             break;
   1358 
   1359         case ACPI_DMT_IVRS_UNTERMINATED_STRING:
   1360 
   1361             AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target));
   1362             break;
   1363 
   1364         /* Fixed length ASCII name fields */
   1365 
   1366         case ACPI_DMT_SIG:
   1367 
   1368             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
   1369             AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
   1370 
   1371             TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
   1372             if (TableData)
   1373             {
   1374                 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
   1375             }
   1376             else
   1377             {
   1378                 AcpiOsPrintf ("\n");
   1379             }
   1380             break;
   1381 
   1382         case ACPI_DMT_NAME4:
   1383 
   1384             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
   1385             AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
   1386             break;
   1387 
   1388         case ACPI_DMT_NAME6:
   1389 
   1390             AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
   1391             AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
   1392             break;
   1393 
   1394         case ACPI_DMT_NAME8:
   1395 
   1396             AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
   1397             AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
   1398             break;
   1399 
   1400         /* Special Data Types */
   1401 
   1402         case ACPI_DMT_CHKSUM:
   1403 
   1404             /* Checksum, display and validate */
   1405 
   1406             AcpiOsPrintf ("%2.2X", *Target);
   1407             Temp8 = AcpiUtGenerateChecksum (Table,
   1408                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
   1409                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
   1410 
   1411             if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
   1412             {
   1413                 AcpiOsPrintf (
   1414                     "     /* Incorrect checksum, should be %2.2X */", Temp8);
   1415             }
   1416 
   1417             AcpiOsPrintf ("\n");
   1418             break;
   1419 
   1420         case ACPI_DMT_SPACEID:
   1421 
   1422             /* Address Space ID */
   1423 
   1424             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
   1425             break;
   1426 
   1427         case ACPI_DMT_ACCWIDTH:
   1428 
   1429             /* Encoded Access Width */
   1430 
   1431             Temp8 = *Target;
   1432             if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
   1433             {
   1434                 Temp8 = ACPI_GAS_WIDTH_RESERVED;
   1435             }
   1436 
   1437             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
   1438             break;
   1439 
   1440         case ACPI_DMT_GAS:
   1441 
   1442             /* Generic Address Structure */
   1443 
   1444             AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
   1445             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
   1446                 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
   1447             if (ACPI_FAILURE (Status))
   1448             {
   1449                 return (Status);
   1450             }
   1451 
   1452             AcpiOsPrintf ("\n");
   1453             LastOutputBlankLine = TRUE;
   1454             break;
   1455 
   1456         case ACPI_DMT_AEST:
   1457 
   1458             /* AEST subtable types */
   1459 
   1460             Temp8 = *Target;
   1461             if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED)
   1462             {
   1463                 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED;
   1464             }
   1465 
   1466             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1467                 AcpiDmAestSubnames[Temp8]);
   1468             break;
   1469 
   1470         case ACPI_DMT_AEST_CACHE:
   1471 
   1472             /* AEST cache resource subtable */
   1473 
   1474             Temp32 = *Target;
   1475             if (Temp32 > ACPI_AEST_CACHE_RESERVED)
   1476             {
   1477                 Temp32 = ACPI_AEST_CACHE_RESERVED;
   1478             }
   1479 
   1480             AcpiOsPrintf (UINT32_FORMAT, *Target,
   1481                 AcpiDmAestCacheNames[Temp32]);
   1482             break;
   1483 
   1484         case ACPI_DMT_AEST_GIC:
   1485 
   1486             /* AEST GIC error subtable */
   1487 
   1488             Temp32 = *Target;
   1489             if (Temp32 > ACPI_AEST_GIC_RESERVED)
   1490             {
   1491                 Temp32 = ACPI_AEST_GIC_RESERVED;
   1492             }
   1493 
   1494             AcpiOsPrintf (UINT32_FORMAT, *Target,
   1495                 AcpiDmAestGicNames[Temp32]);
   1496             break;
   1497 
   1498         case ACPI_DMT_AEST_RES:
   1499 
   1500             /* AEST resource type subtable */
   1501 
   1502             Temp8 = *Target;
   1503             if (Temp8 > ACPI_AEST_RESOURCE_RESERVED)
   1504             {
   1505                 Temp8 = ACPI_AEST_RESOURCE_RESERVED;
   1506             }
   1507 
   1508             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1509                 AcpiDmAestResourceNames[Temp8]);
   1510             break;
   1511 
   1512         case ACPI_DMT_AEST_XFACE:
   1513 
   1514             /* AEST interface structure types */
   1515 
   1516             Temp8 = *Target;
   1517             if (Temp8 > ACPI_AEST_XFACE_RESERVED)
   1518             {
   1519                 Temp8 = ACPI_AEST_XFACE_RESERVED;
   1520             }
   1521 
   1522             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1523                 AcpiDmAestXfaceNames[Temp8]);
   1524             break;
   1525 
   1526         case ACPI_DMT_AEST_XRUPT:
   1527 
   1528             /* AEST interrupt structure types */
   1529 
   1530             Temp8 = *Target;
   1531             if (Temp8 > ACPI_AEST_XRUPT_RESERVED)
   1532             {
   1533                 Temp8 = ACPI_AEST_XRUPT_RESERVED;
   1534             }
   1535 
   1536             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1537                 AcpiDmAestXruptNames[Temp8]);
   1538             break;
   1539 
   1540         case ACPI_DMT_ASPT:
   1541             /* ASPT subtable types */
   1542             Temp16 = ACPI_GET16(Target);
   1543             if (Temp16 > ACPI_ASPT_TYPE_UNKNOWN)
   1544             {
   1545                 Temp16 = ACPI_ASPT_TYPE_UNKNOWN;
   1546             }
   1547 
   1548             AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmAsptSubnames[Temp16]);
   1549             break;
   1550 
   1551         case ACPI_DMT_ASF:
   1552 
   1553             /* ASF subtable types */
   1554 
   1555             Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
   1556             if (Temp16 > ACPI_ASF_TYPE_RESERVED)
   1557             {
   1558                 Temp16 = ACPI_ASF_TYPE_RESERVED;
   1559             }
   1560 
   1561             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
   1562             break;
   1563 
   1564         case ACPI_DMT_CDAT:
   1565 
   1566             /* CDAT subtable types */
   1567 
   1568             Temp8 = *Target;
   1569             if (Temp8 > ACPI_CDAT_TYPE_RESERVED)
   1570             {
   1571                 Temp8 = ACPI_CDAT_TYPE_RESERVED;
   1572             }
   1573 
   1574             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1575                 AcpiDmCdatSubnames[Temp8]);
   1576             break;
   1577 
   1578         case ACPI_DMT_CEDT:
   1579 
   1580             /* CEDT subtable types */
   1581 
   1582             Temp8 = *Target;
   1583             if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
   1584             {
   1585                 Temp8 = ACPI_CEDT_TYPE_RESERVED;
   1586             }
   1587 
   1588             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1589                 AcpiDmCedtSubnames[Temp8]);
   1590             break;
   1591 
   1592         case ACPI_DMT_DMAR:
   1593 
   1594             /* DMAR subtable types */
   1595 
   1596             Temp16 = ACPI_GET16 (Target);
   1597             if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
   1598             {
   1599                 Temp16 = ACPI_DMAR_TYPE_RESERVED;
   1600             }
   1601 
   1602             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1603                 AcpiDmDmarSubnames[Temp16]);
   1604             break;
   1605 
   1606         case ACPI_DMT_DMAR_SCOPE:
   1607 
   1608             /* DMAR device scope types */
   1609 
   1610             Temp8 = *Target;
   1611             if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
   1612             {
   1613                 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
   1614             }
   1615 
   1616             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1617                 AcpiDmDmarScope[Temp8]);
   1618             break;
   1619 
   1620         case ACPI_DMT_EINJACT:
   1621 
   1622             /* EINJ Action types */
   1623 
   1624             Temp8 = *Target;
   1625             if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
   1626             {
   1627                 Temp8 = ACPI_EINJ_ACTION_RESERVED;
   1628             }
   1629 
   1630             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1631                 AcpiDmEinjActions[Temp8]);
   1632             break;
   1633 
   1634         case ACPI_DMT_EINJINST:
   1635 
   1636             /* EINJ Instruction types */
   1637 
   1638             Temp8 = *Target;
   1639             if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
   1640             {
   1641                 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
   1642             }
   1643 
   1644             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1645                 AcpiDmEinjInstructions[Temp8]);
   1646             break;
   1647 
   1648         case ACPI_DMT_ERSTACT:
   1649 
   1650             /* ERST Action types */
   1651 
   1652             Temp8 = *Target;
   1653             if (Temp8 > ACPI_ERST_ACTION_RESERVED)
   1654             {
   1655                 Temp8 = ACPI_ERST_ACTION_RESERVED;
   1656             }
   1657 
   1658             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1659                 AcpiDmErstActions[Temp8]);
   1660             break;
   1661 
   1662         case ACPI_DMT_ERSTINST:
   1663 
   1664             /* ERST Instruction types */
   1665 
   1666             Temp8 = *Target;
   1667             if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
   1668             {
   1669                 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
   1670             }
   1671 
   1672             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1673                 AcpiDmErstInstructions[Temp8]);
   1674             break;
   1675 
   1676         case ACPI_DMT_GTDT:
   1677 
   1678             /* GTDT subtable types */
   1679 
   1680             Temp8 = *Target;
   1681             if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
   1682             {
   1683                 Temp8 = ACPI_GTDT_TYPE_RESERVED;
   1684             }
   1685 
   1686             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1687                 AcpiDmGtdtSubnames[Temp8]);
   1688             break;
   1689 
   1690         case ACPI_DMT_HEST:
   1691 
   1692             /* HEST subtable types */
   1693 
   1694             Temp16 = ACPI_GET16 (Target);
   1695             if (Temp16 > ACPI_HEST_TYPE_RESERVED)
   1696             {
   1697                 Temp16 = ACPI_HEST_TYPE_RESERVED;
   1698             }
   1699 
   1700             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1701                 AcpiDmHestSubnames[Temp16]);
   1702             break;
   1703 
   1704         case ACPI_DMT_HESTNTFY:
   1705 
   1706             AcpiOsPrintf (STRING_FORMAT,
   1707                 "Hardware Error Notification Structure");
   1708 
   1709             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
   1710                 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
   1711             if (ACPI_FAILURE (Status))
   1712             {
   1713                 return (Status);
   1714             }
   1715 
   1716             AcpiOsPrintf ("\n");
   1717             LastOutputBlankLine = TRUE;
   1718             break;
   1719 
   1720         case ACPI_DMT_HESTNTYP:
   1721 
   1722             /* HEST Notify types */
   1723 
   1724             Temp8 = *Target;
   1725             if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
   1726             {
   1727                 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
   1728             }
   1729 
   1730             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1731                 AcpiDmHestNotifySubnames[Temp8]);
   1732             break;
   1733 
   1734         case ACPI_DMT_HMAT:
   1735 
   1736             /* HMAT subtable types */
   1737 
   1738             Temp16 = *Target;
   1739             if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
   1740             {
   1741                 Temp16 = ACPI_HMAT_TYPE_RESERVED;
   1742             }
   1743 
   1744             AcpiOsPrintf (UINT16_FORMAT, *Target,
   1745                 AcpiDmHmatSubnames[Temp16]);
   1746             break;
   1747 
   1748         case ACPI_DMT_IORTMEM:
   1749 
   1750             AcpiOsPrintf (STRING_FORMAT,
   1751                 "IORT Memory Access Properties");
   1752 
   1753             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
   1754                 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
   1755             if (ACPI_FAILURE (Status))
   1756             {
   1757                 return (Status);
   1758             }
   1759 
   1760             LastOutputBlankLine = TRUE;
   1761             break;
   1762 
   1763         case ACPI_DMT_MADT:
   1764 
   1765             /* MADT subtable types */
   1766 
   1767             Temp8 = *Target;
   1768             if ((Temp8 >= ACPI_MADT_TYPE_RESERVED) && (Temp8 < ACPI_MADT_TYPE_OEM_RESERVED))
   1769             {
   1770                 Temp8 = ACPI_MADT_TYPE_RESERVED;
   1771             }
   1772             else if (Temp8 >= ACPI_MADT_TYPE_OEM_RESERVED)
   1773             {
   1774                 Temp8 = ACPI_MADT_TYPE_RESERVED + 1;
   1775             }
   1776             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1777                 AcpiDmMadtSubnames[Temp8]);
   1778             break;
   1779 
   1780         case ACPI_DMT_MPAM_LOCATOR:
   1781 
   1782             /* MPAM subtable locator types */
   1783 
   1784             Temp8 = *Target;
   1785             if (Temp8 > ACPI_MPAM_LOCATION_TYPE_INTERCONNECT)
   1786             {
   1787                 Temp8 = ACPI_MPAM_LOCATION_TYPE_INTERCONNECT + 1;
   1788             }
   1789 
   1790             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1791                 AcpiDmMpamSubnames[Temp8]);
   1792             break;
   1793 
   1794         case ACPI_DMT_NFIT:
   1795 
   1796             /* NFIT subtable types */
   1797 
   1798             Temp16 = ACPI_GET16 (Target);
   1799             if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
   1800             {
   1801                 Temp16 = ACPI_NFIT_TYPE_RESERVED;
   1802             }
   1803 
   1804             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1805                 AcpiDmNfitSubnames[Temp16]);
   1806             break;
   1807 
   1808         case ACPI_DMT_PCCT:
   1809 
   1810             /* PCCT subtable types */
   1811 
   1812             Temp8 = *Target;
   1813             if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
   1814             {
   1815                 Temp8 = ACPI_PCCT_TYPE_RESERVED;
   1816             }
   1817 
   1818             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1819                 AcpiDmPcctSubnames[Temp8]);
   1820             break;
   1821 
   1822         case ACPI_DMT_PHAT:
   1823 
   1824             /* PHAT subtable types */
   1825 
   1826             Temp16 = ACPI_GET16 (Target);
   1827             if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
   1828             {
   1829                 Temp16 = ACPI_PHAT_TYPE_RESERVED;
   1830             }
   1831 
   1832             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1833                 AcpiDmPhatSubnames[Temp16]);
   1834             break;
   1835 
   1836         case ACPI_DMT_PMTT:
   1837 
   1838             /* PMTT subtable types */
   1839 
   1840             Temp8 = *Target;
   1841             if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
   1842             {
   1843                 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
   1844             }
   1845             else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
   1846             {
   1847                 Temp8 = ACPI_PMTT_TYPE_RESERVED;
   1848             }
   1849             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1850                 AcpiDmPmttSubnames[Temp8]);
   1851             break;
   1852 
   1853         case ACPI_DMT_PPTT:
   1854 
   1855             /* PPTT subtable types */
   1856 
   1857             Temp8 = *Target;
   1858             if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
   1859             {
   1860                 Temp8 = ACPI_PPTT_TYPE_RESERVED;
   1861             }
   1862 
   1863             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1864                 AcpiDmPpttSubnames[Temp8]);
   1865             break;
   1866 
   1867         case ACPI_DMT_UNICODE:
   1868         case ACPI_DMT_WPBT_UNICODE:
   1869 
   1870             if (ByteLength == 0)
   1871             {
   1872                 AcpiOsPrintf ("/* Zero-length Data */\n");
   1873                 break;
   1874             }
   1875 
   1876             AcpiDmDumpUnicode (Table, 0, ByteLength);
   1877             break;
   1878 
   1879         case ACPI_DMT_RAW_BUFFER:
   1880         case ACPI_DMT_BUFFER:
   1881         case ACPI_DMT_PMTT_VENDOR:
   1882 
   1883             if (ByteLength == 0)
   1884             {
   1885                 AcpiOsPrintf ("/* Zero-length Data */\n");
   1886                 break;
   1887             }
   1888 
   1889             AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL);
   1890             break;
   1891 
   1892         case ACPI_DMT_RGRT:
   1893 
   1894             /* RGRT subtable types */
   1895 
   1896             Temp8 = *Target;
   1897             if (Temp8 >= ACPI_RGRT_TYPE_RESERVED)
   1898             {
   1899                 Temp8 = ACPI_RGRT_TYPE_RESERVED0;
   1900             }
   1901 
   1902             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1903                 AcpiDmRgrtSubnames[Temp8]);
   1904             break;
   1905 
   1906         case ACPI_DMT_RHCT:
   1907 
   1908             /* RHCT subtable types */
   1909 
   1910             Temp16 = ACPI_GET16 (Target);
   1911             if (Temp16 == ACPI_RHCT_NODE_TYPE_HART_INFO)
   1912             {
   1913                 Temp16 = ACPI_RHCT_NODE_TYPE_RESERVED;
   1914             }
   1915 
   1916             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1917                 AcpiDmRhctSubnames[Temp16]);
   1918             break;
   1919 
   1920         case ACPI_DMT_SDEV:
   1921 
   1922             /* SDEV subtable types */
   1923 
   1924             Temp8 = *Target;
   1925             if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
   1926             {
   1927                 Temp8 = ACPI_SDEV_TYPE_RESERVED;
   1928             }
   1929 
   1930             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1931                 AcpiDmSdevSubnames[Temp8]);
   1932             break;
   1933 
   1934         case ACPI_DMT_SRAT:
   1935 
   1936             /* SRAT subtable types */
   1937 
   1938             Temp8 = *Target;
   1939             if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
   1940             {
   1941                 Temp8 = ACPI_SRAT_TYPE_RESERVED;
   1942             }
   1943 
   1944             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1945                 AcpiDmSratSubnames[Temp8]);
   1946             break;
   1947 
   1948         case ACPI_DMT_TPM2:
   1949 
   1950             /* TPM2 Start Method types */
   1951 
   1952             Temp8 = *Target;
   1953             if (Temp8 > ACPI_TPM2_RESERVED)
   1954             {
   1955                 Temp8 = ACPI_TPM2_RESERVED;
   1956             }
   1957 
   1958             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1959                 AcpiDmTpm2Subnames[Temp8]);
   1960             break;
   1961 
   1962 
   1963         case ACPI_DMT_FADTPM:
   1964 
   1965             /* FADT Preferred PM Profile names */
   1966 
   1967             Temp8 = *Target;
   1968             if (Temp8 > ACPI_FADT_PM_RESERVED)
   1969             {
   1970                 Temp8 = ACPI_FADT_PM_RESERVED;
   1971             }
   1972 
   1973             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1974                 AcpiDmFadtProfiles[Temp8]);
   1975             break;
   1976 
   1977         case ACPI_DMT_IVRS:
   1978 
   1979             /* IVRS subtable types */
   1980 
   1981             Temp8 = *Target;
   1982             switch (Temp8)
   1983             {
   1984             case ACPI_IVRS_TYPE_HARDWARE1:
   1985             case ACPI_IVRS_TYPE_HARDWARE2:
   1986 
   1987                 Name = AcpiDmIvrsSubnames[0];
   1988                 break;
   1989 
   1990             case ACPI_IVRS_TYPE_HARDWARE3:
   1991 
   1992                 Name = AcpiDmIvrsSubnames[1];
   1993                 break;
   1994 
   1995             case ACPI_IVRS_TYPE_MEMORY1:
   1996             case ACPI_IVRS_TYPE_MEMORY2:
   1997             case ACPI_IVRS_TYPE_MEMORY3:
   1998 
   1999                 Name = AcpiDmIvrsSubnames[2];
   2000                 break;
   2001 
   2002             default:
   2003 
   2004                 Name = AcpiDmIvrsSubnames[3];
   2005                 break;
   2006             }
   2007 
   2008             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
   2009             break;
   2010 
   2011         case ACPI_DMT_IVRS_DE:
   2012 
   2013             /* IVRS device entry types */
   2014 
   2015             Temp8 = *Target;
   2016             switch (Temp8)
   2017             {
   2018             case ACPI_IVRS_TYPE_ALL:
   2019             case ACPI_IVRS_TYPE_SELECT:
   2020             case ACPI_IVRS_TYPE_START:
   2021             case ACPI_IVRS_TYPE_END:
   2022 
   2023                 Name = AcpiDmIvrsDevEntryNames[Temp8];
   2024                 break;
   2025 
   2026             case ACPI_IVRS_TYPE_ALIAS_SELECT:
   2027             case ACPI_IVRS_TYPE_ALIAS_START:
   2028             case ACPI_IVRS_TYPE_EXT_SELECT:
   2029             case ACPI_IVRS_TYPE_EXT_START:
   2030             case ACPI_IVRS_TYPE_SPECIAL:
   2031 
   2032                 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61];
   2033                 break;
   2034 
   2035             case ACPI_IVRS_TYPE_HID:
   2036 
   2037                 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228];
   2038                 break;
   2039 
   2040             default:
   2041                 Name = AcpiDmIvrsDevEntryNames[0];  /* Unknown/Reserved */
   2042                 break;
   2043             }
   2044 
   2045             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
   2046             break;
   2047 
   2048         case ACPI_DMT_LPIT:
   2049 
   2050             /* LPIT subtable types */
   2051 
   2052             Temp32 = ACPI_GET32 (Target);
   2053             if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
   2054             {
   2055                 Temp32 = ACPI_LPIT_TYPE_RESERVED;
   2056             }
   2057 
   2058             AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
   2059                 AcpiDmLpitSubnames[Temp32]);
   2060             break;
   2061 
   2062         case ACPI_DMT_VIOT:
   2063 
   2064             /* VIOT subtable types */
   2065 
   2066             Temp8 = *Target;
   2067             if (Temp8 > ACPI_VIOT_RESERVED)
   2068             {
   2069                 Temp8 = ACPI_VIOT_RESERVED;
   2070             }
   2071 
   2072             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2073                 AcpiDmViotSubnames[Temp8]);
   2074             break;
   2075 
   2076         case ACPI_DMT_EXIT:
   2077 
   2078             return (AE_OK);
   2079 
   2080         default:
   2081 
   2082             ACPI_ERROR ((AE_INFO,
   2083                 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
   2084             return (AE_SUPPORT);
   2085         }
   2086     }
   2087 
   2088     if (TableOffset && !SubtableLength)
   2089     {
   2090         /*
   2091          * If this table is not the main table, the subtable must have a
   2092          * valid length
   2093          */
   2094         AcpiOsPrintf ("Invalid zero length subtable\n");
   2095         return (AE_BAD_DATA);
   2096     }
   2097 
   2098     return (AE_OK);
   2099 }
   2100