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