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 - 2026, 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     "FIFO over I2C",
    464     "Command Response Buffer with AMD Mailbox",
    465     "Reserved",
    466     "Command Response Buffer with ARM Framework-A",
    467     "Unknown Subtable Type"         /* Reserved */
    468 };
    469 
    470 static const char           *AcpiDmIovtSubnames[] =
    471 {
    472     "IOMMUv1",
    473     "Unknown Subtable Type"         /* Reserved */
    474 };
    475 
    476 static const char           *AcpiDmIovtdevSubnames[] =
    477 {
    478     "A single PCI device",
    479     "Start of range",
    480     "End of range",
    481     "Unknown Subtable Type"         /* Reserved */
    482 };
    483 
    484 static const char           *AcpiDmIvrsSubnames[] =
    485 {
    486     "Hardware Definition Block (IVHD)",
    487     "Hardware Definition Block - Mixed Format (IVHD)",
    488     "Memory Definition Block (IVMD)",
    489     "Unknown/Reserved Subtable Type"            /* Reserved */
    490 };
    491 
    492 static const char           *AcpiDmIvrsDevEntryNames[] =
    493 {
    494     "Unknown/Reserved Device Entry Type",       /* 0- Reserved */
    495     "Device Entry: Select All Devices",         /* 1 */
    496     "Device Entry: Select One Device",          /* 2 */
    497     "Device Entry: Start of Range",             /* 3 */
    498     "Device Entry: End of Range",               /* 4 */
    499     "Device Entry: Alias Select",               /* 66 */
    500     "Device Entry: Alias Start of Range",       /* 67 */
    501     "Unknown/Reserved Device Entry Type",       /* 68- Reserved */
    502     "Unknown/Reserved Device Entry Type",       /* 69- Reserved */
    503     "Device Entry: Extended Select",            /* 70 */
    504     "Device Entry: Extended Start of Range",    /* 71 */
    505     "Device Entry: Special Device",             /* 72 */
    506     "Device Entry: ACPI HID Named Device",      /* 240 */
    507     "Unknown/Reserved Device Entry Type"        /* Reserved */
    508 };
    509 
    510 static const char           *AcpiDmLpitSubnames[] =
    511 {
    512     "Native C-state Idle Structure",
    513     "Unknown Subtable Type"         /* Reserved */
    514 };
    515 
    516 static const char           *AcpiDmViotSubnames[] =
    517 {
    518     "Unknown Subtable Type",        /* 0 -Reserved */
    519     "PCI Range",
    520     "MMIO Endpoint",
    521     "VirtIO-PCI IOMMU",
    522     "VirtIO-MMIO IOMMU",
    523     "Unknown Subtable Type"         /* Reserved */
    524 };
    525 
    526 #define ACPI_FADT_PM_RESERVED       9
    527 
    528 static const char           *AcpiDmFadtProfiles[] =
    529 {
    530     "Unspecified",
    531     "Desktop",
    532     "Mobile",
    533     "Workstation",
    534     "Enterprise Server",
    535     "SOHO Server",
    536     "Appliance PC",
    537     "Performance Server",
    538     "Tablet",
    539     "Unknown Profile Type"
    540 };
    541 
    542 #define ACPI_GAS_WIDTH_RESERVED     5
    543 
    544 static const char           *AcpiDmGasAccessWidth[] =
    545 {
    546     "Undefined/Legacy",
    547     "Byte Access:8",
    548     "Word Access:16",
    549     "DWord Access:32",
    550     "QWord Access:64",
    551     "Unknown Width Encoding"
    552 };
    553 
    554 static const char           *AcpiDmRhctSubnames[] =
    555 {
    556     "RISC-V ISA string structure",  /* ACPI_RHCT_ISA_STRING */
    557     "RISC-V CMO node structure",    /* ACPI_RHCT_CMO_NODE */
    558     "RISC-V MMU node structure",    /* ACPI_RHCT_MMU_NODE */
    559     "RISC-V Hart Info structure",   /* ACPI_RHCT_HART_INFO */
    560 };
    561 
    562 
    563 /*******************************************************************************
    564  *
    565  * ACPI Table Data, indexed by signature.
    566  *
    567  * Each entry contains: Signature, Table Info, Handler, DtHandler,
    568  *  Template, Description
    569  *
    570  * Simple tables have only a TableInfo structure, complex tables have a
    571  * handler. This table must be NULL terminated. RSDP and FACS are
    572  * special-cased elsewhere.
    573  *
    574  * Note: Any tables added here should be duplicated within
    575  * AcpiGbl_SupportedTables in the file common/ahtable.c
    576  *
    577  ******************************************************************************/
    578 
    579 const ACPI_DMTABLE_DATA     AcpiDmTableData[] =
    580 {
    581     {ACPI_SIG_AEST, NULL,                   AcpiDmDumpAest, DtCompileAest,  TemplateAest},
    582     {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi,    NULL,           NULL,           TemplateAgdi},
    583     {ACPI_SIG_APMT, NULL,                   AcpiDmDumpApmt, DtCompileApmt,  TemplateApmt},
    584     {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf},
    585     {ACPI_SIG_ASPT, NULL,                   AcpiDmDumpAspt, DtCompileAspt,  TemplateAspt},
    586     {ACPI_SIG_BDAT, AcpiDmTableInfoBdat,    NULL,           NULL,           TemplateBdat},
    587     {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert},
    588     {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt},
    589     {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot},
    590     {ACPI_SIG_CCEL, AcpiDmTableInfoCcel,    NULL,           NULL,           TemplateCcel},
    591     {ACPI_SIG_CDAT, NULL,                   AcpiDmDumpCdat, NULL,           TemplateCdat},
    592     {ACPI_SIG_CEDT, NULL,                   AcpiDmDumpCedt, DtCompileCedt,  TemplateCedt},
    593     {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep},
    594     {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt},
    595     {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2,    AcpiDmDumpDbg2, DtCompileDbg2,  TemplateDbg2},
    596     {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp},
    597     {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar},
    598     {ACPI_SIG_DRTM, NULL,                   AcpiDmDumpDrtm, DtCompileDrtm,  TemplateDrtm},
    599     {ACPI_SIG_DTPR, NULL,                   AcpiDmDumpDtpr, DtCompileDtpr,  TemplateDtpr},
    600     {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt},
    601     {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj},
    602     {ACPI_SIG_ERDT, NULL,                   AcpiDmDumpErdt, DtCompileErdt,  TemplateErdt},
    603     {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst},
    604     {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt},
    605     {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt},
    606     {ACPI_SIG_GTDT, NULL,                   AcpiDmDumpGtdt, DtCompileGtdt,  TemplateGtdt},
    607     {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest},
    608     {ACPI_SIG_HMAT, NULL,                   AcpiDmDumpHmat, DtCompileHmat,  TemplateHmat},
    609     {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet},
    610     {ACPI_SIG_IORT, NULL,                   AcpiDmDumpIort, DtCompileIort,  TemplateIort},
    611     {ACPI_SIG_IOVT, AcpiDmTableInfoIovt,    AcpiDmDumpIovt, DtCompileIovt,  TemplateIovt},
    612     {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs},
    613     {ACPI_SIG_LPIT, NULL,                   AcpiDmDumpLpit, DtCompileLpit,  TemplateLpit},
    614     {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt},
    615     {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg},
    616     {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi},
    617     {ACPI_SIG_MPAM, NULL,                   AcpiDmDumpMpam, DtCompileMpam,  TemplateMpam},
    618     {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst},
    619     {ACPI_SIG_MRRM, NULL,                   AcpiDmDumpMrrm, DtCompileMrrm,  TemplateMrrm},
    620     {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct},
    621     {ACPI_SIG_MSDM, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateMsdm},
    622     {ACPI_SIG_NFIT, AcpiDmTableInfoNfit,    AcpiDmDumpNfit, DtCompileNfit,  TemplateNfit},
    623     {ACPI_SIG_NHLT, NULL,                   NULL,           NULL,           NULL},
    624     {ACPI_SIG_PCCT, AcpiDmTableInfoPcct,    AcpiDmDumpPcct, DtCompilePcct,  TemplatePcct},
    625     {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt,    AcpiDmDumpPdtt, DtCompilePdtt,  TemplatePdtt},
    626     {ACPI_SIG_PHAT, NULL,                   AcpiDmDumpPhat, DtCompilePhat,  TemplatePhat},
    627     {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt},
    628     {ACPI_SIG_PPTT, NULL,                   AcpiDmDumpPptt, DtCompilePptt,  TemplatePptt},
    629     {ACPI_SIG_PRMT, NULL,                   AcpiDmDumpPrmt, DtCompilePrmt,  TemplatePrmt},
    630     {ACPI_SIG_RASF, AcpiDmTableInfoRasf,    NULL,           NULL,           TemplateRasf},
    631     {ACPI_SIG_RAS2, AcpiDmTableInfoRas2,    AcpiDmDumpRas2, DtCompileRas2,  TemplateRas2},
    632     {ACPI_SIG_RGRT, NULL,                   AcpiDmDumpRgrt, DtCompileRgrt,  TemplateRgrt},
    633     {ACPI_SIG_RHCT, NULL,                   AcpiDmDumpRhct, DtCompileRhct,  TemplateRhct},
    634     {ACPI_SIG_RIMT, NULL,                   AcpiDmDumpRimt, DtCompileRimt,  TemplateRimt},
    635     {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt},
    636     {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt},
    637     {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst},
    638     {ACPI_SIG_SDEI, AcpiDmTableInfoSdei,    NULL,           NULL,           TemplateSdei},
    639     {ACPI_SIG_SDEV, AcpiDmTableInfoSdev,    AcpiDmDumpSdev, DtCompileSdev,  TemplateSdev},
    640     {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic},
    641     {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit},
    642     {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr},
    643     {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi},
    644     {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat},
    645     {ACPI_SIG_STAO, NULL,                   AcpiDmDumpStao, DtCompileStao,  TemplateStao},
    646     {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl,    AcpiDmDumpSvkl, DtCompileSvkl,  TemplateSvkl},
    647     {ACPI_SIG_SWFT, AcpiDmTableInfoSwft,    AcpiDmDumpSwft, DtCompileSwft,  TemplateSwft},
    648     {ACPI_SIG_TCPA, NULL,                   AcpiDmDumpTcpa, DtCompileTcpa,  TemplateTcpa},
    649     {ACPI_SIG_TDEL, AcpiDmTableInfoTdel,    NULL,           NULL,           TemplateTdel},
    650     {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    AcpiDmDumpTpm2, DtCompileTpm2,  TemplateTpm2},
    651     {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi},
    652     {ACPI_SIG_VIOT, AcpiDmTableInfoViot,    AcpiDmDumpViot, DtCompileViot,  TemplateViot},
    653     {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet},
    654     {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat},
    655     {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt},
    656     {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt},
    657     {ACPI_SIG_WPBT, NULL,                   AcpiDmDumpWpbt, DtCompileWpbt,  TemplateWpbt},
    658     {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt,    NULL,           NULL,           TemplateWsmt},
    659     {ACPI_SIG_XENV, AcpiDmTableInfoXenv,    NULL,           NULL,           TemplateXenv},
    660     {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt},
    661     {NULL,          NULL,                   NULL,           NULL,           NULL}
    662 };
    663 
    664 
    665 /*******************************************************************************
    666  *
    667  * FUNCTION:    AcpiDmGetTableData
    668  *
    669  * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
    670  *
    671  * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
    672  *
    673  * DESCRIPTION: Find a match in the global table of supported ACPI tables
    674  *
    675  ******************************************************************************/
    676 
    677 const ACPI_DMTABLE_DATA *
    678 AcpiDmGetTableData (
    679     char                    *Signature)
    680 {
    681     const ACPI_DMTABLE_DATA *Info;
    682 
    683 
    684     for (Info = AcpiDmTableData; Info->Signature; Info++)
    685     {
    686         if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
    687         {
    688             return (Info);
    689         }
    690     }
    691 
    692     return (NULL);
    693 }
    694 
    695 
    696 /*******************************************************************************
    697  *
    698  * FUNCTION:    AcpiDmDumpDataTable
    699  *
    700  * PARAMETERS:  Table               - An ACPI table
    701  *
    702  * RETURN:      None.
    703  *
    704  * DESCRIPTION: Format the contents of an ACPI data table (any table other
    705  *              than an SSDT or DSDT that does not contain executable AML code)
    706  *
    707  ******************************************************************************/
    708 
    709 void
    710 AcpiDmDumpDataTable (
    711     ACPI_TABLE_HEADER       *Table)
    712 {
    713     ACPI_STATUS             Status;
    714     const ACPI_DMTABLE_DATA *TableData;
    715     UINT32                  Length;
    716 
    717 
    718     /* Ignore tables that contain AML */
    719 
    720     if (AcpiUtIsAmlTable (Table))
    721     {
    722         if (AslGbl_VerboseTemplates)
    723         {
    724             /* Dump the raw table data */
    725 
    726             Length = Table->Length;
    727 
    728             AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
    729                 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
    730             AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
    731                 Length, DB_BYTE_DISPLAY, 0);
    732             AcpiOsPrintf (" */\n");
    733         }
    734         return;
    735     }
    736 
    737     /*
    738      * Handle tables that don't use the common ACPI table header structure.
    739      * Currently, these are the FACS, RSDP, S3PT and CDAT.
    740      */
    741     if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
    742     {
    743         Length = Table->Length;
    744         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
    745         if (ACPI_FAILURE (Status))
    746         {
    747             return;
    748         }
    749     }
    750     else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP,
    751         Table)->Signature))
    752     {
    753         Length = AcpiDmDumpRsdp (Table);
    754     }
    755     else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
    756     {
    757         Length = AcpiDmDumpS3pt (Table);
    758     }
    759     else if (!AcpiUtValidNameseg (Table->Signature))
    760     {
    761         /*
    762          * For CDAT we are assuming that there should be at least one non-ASCII
    763          * byte in the (normally) 4-character Signature field (at least the
    764          * high-order byte should be zero).
    765          */
    766         if (AcpiGbl_CDAT)
    767         {
    768             /*
    769              * Invalid signature and <-ds CDAT> was specified on the command line.
    770              * Therefore, we have a CDAT table.
    771              */
    772             AcpiDmDumpCdat (Table);
    773         }
    774         else
    775         {
    776             fprintf (stderr, "Table has an invalid signature\n");
    777         }
    778 
    779         return;
    780     }
    781     else
    782     {
    783         /*
    784          * All other tables must use the common ACPI table header, dump it now
    785          */
    786         Length = Table->Length;
    787         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
    788         if (ACPI_FAILURE (Status))
    789         {
    790             return;
    791         }
    792         AcpiOsPrintf ("\n");
    793 
    794         /* Match signature and dispatch appropriately */
    795 
    796         TableData = AcpiDmGetTableData (Table->Signature);
    797         if (!TableData)
    798         {
    799             if (!strncmp (Table->Signature, "OEM", 3))
    800             {
    801                 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
    802                     Table->Signature);
    803             }
    804             else
    805             {
    806                 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
    807                     Table->Signature);
    808 
    809                 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
    810                     Table->Signature);
    811 
    812                 if (!AcpiGbl_ForceAmlDisassembly)
    813                 {
    814                     fprintf (stderr, "decoding ACPI table header only\n");
    815                 }
    816                 else
    817                 {
    818                     fprintf (stderr, "assuming table contains valid AML code\n");
    819                 }
    820             }
    821         }
    822         else if (TableData->TableHandler)
    823         {
    824             /* Complex table, has a handler */
    825 
    826             TableData->TableHandler (Table);
    827         }
    828         else if (TableData->TableInfo)
    829         {
    830             /* Simple table, just walk the info table */
    831 
    832             Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
    833             if (ACPI_FAILURE (Status))
    834             {
    835                 return;
    836             }
    837         }
    838     }
    839 
    840     if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
    841     {
    842         /* Dump the raw table data */
    843 
    844         AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
    845             ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
    846         AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
    847             Length, DB_BYTE_DISPLAY, 0);
    848     }
    849 }
    850 
    851 
    852 /*******************************************************************************
    853  *
    854  * FUNCTION:    AcpiDmLineHeader
    855  *
    856  * PARAMETERS:  Offset              - Current byte offset, from table start
    857  *              ByteLength          - Length of the field in bytes, 0 for flags
    858  *              Name                - Name of this field
    859  *
    860  * RETURN:      None
    861  *
    862  * DESCRIPTION: Utility routines for formatting output lines. Displays the
    863  *              current table offset in hex and decimal, the field length,
    864  *              and the field name.
    865  *
    866  ******************************************************************************/
    867 
    868 void
    869 AcpiDmLineHeader (
    870     UINT32                  Offset,
    871     UINT32                  ByteLength,
    872     char                    *Name)
    873 {
    874 
    875     /* Allow a null name for fields that span multiple lines (large buffers) */
    876 
    877     if (!Name)
    878     {
    879         Name = "";
    880     }
    881 
    882     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
    883     {
    884         if (ByteLength)
    885         {
    886             AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
    887         }
    888         else
    889         {
    890             if (*Name)
    891             {
    892                 AcpiOsPrintf ("%41s : ", Name);
    893             }
    894             else
    895             {
    896                 AcpiOsPrintf ("%41s   ", Name);
    897             }
    898         }
    899     }
    900     else /* Normal disassembler or verbose template */
    901     {
    902         if (ByteLength)
    903         {
    904             AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ",
    905                 Offset, Offset, ByteLength, Name);
    906         }
    907         else
    908         {
    909             if (*Name)
    910             {
    911                 AcpiOsPrintf ("%44s : ", Name);
    912             }
    913             else
    914             {
    915                 AcpiOsPrintf ("%44s   ", Name);
    916             }
    917         }
    918     }
    919 }
    920 
    921 void
    922 AcpiDmLineHeader2 (
    923     UINT32                  Offset,
    924     UINT32                  ByteLength,
    925     char                    *Name,
    926     UINT32                  Value)
    927 {
    928 
    929     if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
    930     {
    931         if (ByteLength)
    932         {
    933             AcpiOsPrintf ("[%.4d] %30s %3d : ",
    934                 ByteLength, Name, Value);
    935         }
    936         else
    937         {
    938             AcpiOsPrintf ("%36s % 3d : ",
    939                 Name, Value);
    940         }
    941     }
    942     else /* Normal disassembler or verbose template */
    943     {
    944         if (ByteLength)
    945         {
    946             AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ",
    947                 Offset, Offset, ByteLength, Name, Value);
    948         }
    949         else
    950         {
    951             AcpiOsPrintf ("[%3.3Xh %4.4u   ] %24s %3d : ",
    952                 Offset, Offset, Name, Value);
    953         }
    954     }
    955 }
    956 
    957 
    958 /*******************************************************************************
    959  *
    960  * FUNCTION:    AcpiDmDumpTable
    961  *
    962  * PARAMETERS:  TableLength         - Length of the entire ACPI table
    963  *              TableOffset         - Starting offset within the table for this
    964  *                                    sub-descriptor (0 if main table)
    965  *              Table               - The ACPI table
    966  *              SubtableLength      - Length of this sub-descriptor
    967  *              Info                - Info table for this ACPI table
    968  *
    969  * RETURN:      Status
    970  *
    971  * DESCRIPTION: Display ACPI table contents by walking the Info table.
    972  *
    973  * Note: This function must remain in sync with DtGetFieldLength.
    974  *
    975  ******************************************************************************/
    976 
    977 ACPI_STATUS
    978 AcpiDmDumpTable (
    979     UINT32                  TableLength,
    980     UINT32                  TableOffset,
    981     void                    *Table,
    982     UINT32                  SubtableLength,
    983     ACPI_DMTABLE_INFO       *Info)
    984 {
    985     UINT8                   *Target;
    986     UINT32                  CurrentOffset;
    987     UINT32                  ByteLength;
    988     UINT8                   Temp8;
    989     UINT16                  Temp16;
    990     UINT32                  Temp32;
    991     UINT64                  Value;
    992     const AH_TABLE          *TableData;
    993     const char              *Name;
    994     BOOLEAN                 LastOutputBlankLine = FALSE;
    995     ACPI_STATUS             Status;
    996     char                    RepairedName[8];
    997 
    998 
    999     if (!Info)
   1000     {
   1001         AcpiOsPrintf ("Display not implemented\n");
   1002         return (AE_NOT_IMPLEMENTED);
   1003     }
   1004 
   1005     /* Walk entire Info table; Null name terminates */
   1006 
   1007     for (; Info->Name; Info++)
   1008     {
   1009         /*
   1010          * Target points to the field within the ACPI Table. CurrentOffset is
   1011          * the offset of the field from the start of the main table.
   1012          */
   1013         Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
   1014         CurrentOffset = TableOffset + Info->Offset;
   1015 
   1016         /* Check for beyond subtable end or (worse) beyond EOT */
   1017 
   1018         if (SubtableLength && (Info->Offset > SubtableLength))
   1019         {
   1020             AcpiOsPrintf (
   1021                 "/**** ACPI subtable terminates early (Len %u) - "
   1022                 "may be older version (dump table) */\n", SubtableLength);
   1023 
   1024             /* Move on to next subtable */
   1025 
   1026             return (AE_OK);
   1027         }
   1028 
   1029         if (CurrentOffset >= TableLength)
   1030         {
   1031             AcpiOsPrintf (
   1032                 "/**** ACPI table terminates "
   1033                 "in the middle of a data structure! (dump table)\n"
   1034                 "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength);
   1035             return (AE_BAD_DATA);
   1036         }
   1037 
   1038         /* Generate the byte length for this field */
   1039 
   1040         switch (Info->Opcode)
   1041         {
   1042         case ACPI_DMT_UINT8:
   1043         case ACPI_DMT_CHKSUM:
   1044         case ACPI_DMT_SPACEID:
   1045         case ACPI_DMT_ACCWIDTH:
   1046         case ACPI_DMT_CEDT:
   1047         case ACPI_DMT_IVRS:
   1048         case ACPI_DMT_IVRS_DE:
   1049         case ACPI_DMT_GTDT:
   1050         case ACPI_DMT_MADT:
   1051         case ACPI_DMT_MPAM_LOCATOR:
   1052         case ACPI_DMT_PCCT:
   1053         case ACPI_DMT_PMTT:
   1054         case ACPI_DMT_PPTT:
   1055         case ACPI_DMT_RGRT:
   1056         case ACPI_DMT_SDEV:
   1057         case ACPI_DMT_SRAT:
   1058         case ACPI_DMT_AEST:
   1059         case ACPI_DMT_AEST_RES:
   1060         case ACPI_DMT_AEST_XFACE:
   1061         case ACPI_DMT_AEST_XRUPT:
   1062         case ACPI_DMT_ASF:
   1063         case ACPI_DMT_CDAT:
   1064         case ACPI_DMT_HESTNTYP:
   1065         case ACPI_DMT_FADTPM:
   1066         case ACPI_DMT_EINJACT:
   1067         case ACPI_DMT_EINJINST:
   1068         case ACPI_DMT_ERSTACT:
   1069         case ACPI_DMT_ERSTINST:
   1070         case ACPI_DMT_DMAR_SCOPE:
   1071         case ACPI_DMT_IOVTDEV:
   1072         case ACPI_DMT_VIOT:
   1073 
   1074             ByteLength = 1;
   1075             break;
   1076 
   1077         case ACPI_DMT_ASPT:
   1078         case ACPI_DMT_UINT16:
   1079         case ACPI_DMT_DMAR:
   1080         case ACPI_DMT_ERDT:
   1081         case ACPI_DMT_HEST:
   1082         case ACPI_DMT_HMAT:
   1083         case ACPI_DMT_IOVT:
   1084         case ACPI_DMT_NFIT:
   1085         case ACPI_DMT_PHAT:
   1086         case ACPI_DMT_RHCT:
   1087 
   1088             ByteLength = 2;
   1089             break;
   1090 
   1091         case ACPI_DMT_UINT24:
   1092 
   1093             ByteLength = 3;
   1094             break;
   1095 
   1096         case ACPI_DMT_UINT32:
   1097         case ACPI_DMT_AEST_CACHE:
   1098         case ACPI_DMT_AEST_GIC:
   1099         case ACPI_DMT_NAME4:
   1100         case ACPI_DMT_SIG:
   1101         case ACPI_DMT_LPIT:
   1102         case ACPI_DMT_TPM2:
   1103 
   1104             ByteLength = 4;
   1105             break;
   1106 
   1107         case ACPI_DMT_UINT40:
   1108 
   1109             ByteLength = 5;
   1110             break;
   1111 
   1112         case ACPI_DMT_UINT48:
   1113         case ACPI_DMT_NAME6:
   1114 
   1115             ByteLength = 6;
   1116             break;
   1117 
   1118         case ACPI_DMT_UINT56:
   1119         case ACPI_DMT_BUF7:
   1120 
   1121             ByteLength = 7;
   1122             break;
   1123 
   1124         case ACPI_DMT_UINT64:
   1125         case ACPI_DMT_NAME8:
   1126 
   1127             ByteLength = 8;
   1128             break;
   1129 
   1130         case ACPI_DMT_BUF10:
   1131 
   1132             ByteLength = 10;
   1133             break;
   1134 
   1135         case ACPI_DMT_BUF11:
   1136 
   1137             ByteLength = 11;
   1138             break;
   1139 
   1140         case ACPI_DMT_BUF12:
   1141 
   1142             ByteLength = 12;
   1143             break;
   1144 
   1145         case ACPI_DMT_BUF16:
   1146         case ACPI_DMT_UUID:
   1147 
   1148             ByteLength = 16;
   1149             break;
   1150 
   1151         case ACPI_DMT_BUF18:
   1152 
   1153             ByteLength = 18;
   1154             break;
   1155 
   1156         case ACPI_DMT_BUF24:
   1157 
   1158             ByteLength = 24;
   1159             break;
   1160 
   1161         case ACPI_DMT_BUF26:
   1162 
   1163             ByteLength = 26;
   1164             break;
   1165 
   1166         case ACPI_DMT_BUF32:
   1167 
   1168             ByteLength = 32;
   1169             break;
   1170 
   1171         case ACPI_DMT_BUF112:
   1172 
   1173             ByteLength = 112;
   1174             break;
   1175 
   1176         case ACPI_DMT_BUF128:
   1177 
   1178             ByteLength = 128;
   1179             break;
   1180 
   1181         case ACPI_DMT_WPBT_UNICODE:
   1182 
   1183             ByteLength = SubtableLength;
   1184             CurrentOffset = sizeof (ACPI_TABLE_WPBT);
   1185             break;
   1186 
   1187         case ACPI_DMT_UNICODE:
   1188         case ACPI_DMT_BUFFER:
   1189         case ACPI_DMT_RAW_BUFFER:
   1190 
   1191             ByteLength = SubtableLength;
   1192             break;
   1193 
   1194         case ACPI_DMT_PMTT_VENDOR:
   1195             /*
   1196              * Calculate the length of the vendor data for the PMTT table:
   1197              * Length = (Current Subtable ptr + Subtable length) -
   1198              *          Start of the vendor data (Target)
   1199              */
   1200             ByteLength = ((ACPI_CAST_PTR (char, Table) +
   1201                             (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
   1202                             ACPI_CAST_PTR (char, Target));
   1203             break;
   1204 
   1205         case ACPI_DMT_STRING:
   1206 
   1207             ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
   1208             break;
   1209 
   1210         case ACPI_DMT_IVRS_UNTERMINATED_STRING:
   1211 
   1212             ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength);
   1213             break;
   1214 
   1215         case ACPI_DMT_GAS:
   1216 
   1217             if (!LastOutputBlankLine)
   1218             {
   1219                 AcpiOsPrintf ("\n");
   1220                 LastOutputBlankLine = TRUE;
   1221             }
   1222 
   1223             ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
   1224             break;
   1225 
   1226         case ACPI_DMT_HESTNTFY:
   1227 
   1228             if (!LastOutputBlankLine)
   1229             {
   1230                 AcpiOsPrintf ("\n");
   1231                 LastOutputBlankLine = TRUE;
   1232             }
   1233 
   1234             ByteLength = sizeof (ACPI_HEST_NOTIFY);
   1235             break;
   1236 
   1237         case ACPI_DMT_IORTMEM:
   1238 
   1239             if (!LastOutputBlankLine)
   1240             {
   1241                 LastOutputBlankLine = FALSE;
   1242             }
   1243 
   1244             ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
   1245             break;
   1246 
   1247         default:
   1248 
   1249             ByteLength = 0;
   1250             break;
   1251         }
   1252 
   1253         /* Check if we are beyond a subtable, or (worse) beyond EOT */
   1254 
   1255         if (CurrentOffset + ByteLength > TableLength)
   1256         {
   1257             if (SubtableLength)
   1258             {
   1259                 AcpiOsPrintf (
   1260                     "/**** ACPI subtable terminates early - "
   1261                     "may be older version (dump table) */\n");
   1262 
   1263                 /* Move on to next subtable */
   1264 
   1265                 return (AE_OK);
   1266             }
   1267 
   1268             AcpiOsPrintf (
   1269                 "/**** ACPI table terminates "
   1270                 "in the middle of a data structure! */\n");
   1271             return (AE_BAD_DATA);
   1272         }
   1273 
   1274         if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
   1275         {
   1276             AcpiOsPrintf ("%s", Info->Name);
   1277             continue;
   1278         }
   1279 
   1280         /* Start a new line and decode the opcode */
   1281 
   1282         AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
   1283 
   1284         switch (Info->Opcode)
   1285         {
   1286         /* Single-bit Flag fields. Note: Opcode is the bit position */
   1287 
   1288         case ACPI_DMT_FLAG0:
   1289         case ACPI_DMT_FLAG1:
   1290         case ACPI_DMT_FLAG2:
   1291         case ACPI_DMT_FLAG3:
   1292         case ACPI_DMT_FLAG4:
   1293         case ACPI_DMT_FLAG5:
   1294         case ACPI_DMT_FLAG6:
   1295         case ACPI_DMT_FLAG7:
   1296 
   1297             AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
   1298             break;
   1299 
   1300         /* 2-bit Flag fields */
   1301 
   1302         case ACPI_DMT_FLAGS0:
   1303 
   1304             AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
   1305             break;
   1306 
   1307         case ACPI_DMT_FLAGS1:
   1308 
   1309             AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
   1310             break;
   1311 
   1312         case ACPI_DMT_FLAGS2:
   1313 
   1314             AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
   1315             break;
   1316 
   1317         case ACPI_DMT_FLAGS8_2:
   1318 
   1319             AcpiOsPrintf ("%2.2X\n", (*Target >> 2) & 0xFF);
   1320             break;
   1321 
   1322         case ACPI_DMT_FLAGS4:
   1323 
   1324             AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
   1325             break;
   1326 
   1327         case ACPI_DMT_FLAGS4_0:
   1328 
   1329             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
   1330             break;
   1331 
   1332         case ACPI_DMT_FLAGS4_4:
   1333 
   1334             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
   1335             break;
   1336 
   1337         case ACPI_DMT_FLAGS4_8:
   1338 
   1339             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
   1340             break;
   1341 
   1342         case ACPI_DMT_FLAGS4_12:
   1343 
   1344             AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
   1345             break;
   1346 
   1347         case ACPI_DMT_FLAGS16_16:
   1348 
   1349             AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
   1350             break;
   1351 
   1352         /* Integer Data Types */
   1353 
   1354         case ACPI_DMT_UINT8:
   1355         case ACPI_DMT_UINT16:
   1356         case ACPI_DMT_UINT24:
   1357         case ACPI_DMT_UINT32:
   1358         case ACPI_DMT_UINT40:
   1359         case ACPI_DMT_UINT48:
   1360         case ACPI_DMT_UINT56:
   1361         case ACPI_DMT_UINT64:
   1362             /*
   1363              * Dump bytes - high byte first, low byte last.
   1364              * Note: All ACPI tables are little-endian.
   1365              */
   1366             Value = 0;
   1367             for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
   1368             {
   1369                 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
   1370                 Value |= Target[Temp8 - 1];
   1371                 Value <<= 8;
   1372             }
   1373 
   1374             if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
   1375             {
   1376                 AcpiOsPrintf (" [Optional field not present]");
   1377             }
   1378 
   1379             AcpiOsPrintf ("\n");
   1380             break;
   1381 
   1382         case ACPI_DMT_BUF7:
   1383         case ACPI_DMT_BUF10:
   1384         case ACPI_DMT_BUF11:
   1385         case ACPI_DMT_BUF12:
   1386         case ACPI_DMT_BUF16:
   1387         case ACPI_DMT_BUF18:
   1388         case ACPI_DMT_BUF24:
   1389         case ACPI_DMT_BUF26:
   1390         case ACPI_DMT_BUF32:
   1391         case ACPI_DMT_BUF112:
   1392         case ACPI_DMT_BUF128:
   1393             /*
   1394              * Buffer: Size depends on the opcode and was set above.
   1395              * Each hex byte is separated with a space.
   1396              * Multiple lines are separated by line continuation char.
   1397              */
   1398             for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
   1399             {
   1400                 AcpiOsPrintf ("%2.2X", Target[Temp16]);
   1401                 if ((UINT32) (Temp16 + 1) < ByteLength)
   1402                 {
   1403                     if ((Temp16 > 0) && (!((Temp16+1) % 16)))
   1404                     {
   1405                         AcpiOsPrintf (" \\\n"); /* Line continuation */
   1406                         AcpiDmLineHeader (0, 0, NULL);
   1407                     }
   1408                     else
   1409                     {
   1410                         AcpiOsPrintf (" ");
   1411                     }
   1412                 }
   1413             }
   1414 
   1415             AcpiOsPrintf ("\n");
   1416             break;
   1417 
   1418         case ACPI_DMT_UUID:
   1419 
   1420             /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
   1421 
   1422             (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
   1423 
   1424             AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
   1425             break;
   1426 
   1427         case ACPI_DMT_STRING:
   1428 
   1429             AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
   1430             break;
   1431 
   1432         case ACPI_DMT_IVRS_UNTERMINATED_STRING:
   1433 
   1434             AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target));
   1435             break;
   1436 
   1437         /* Fixed length ASCII name fields */
   1438 
   1439         case ACPI_DMT_SIG:
   1440 
   1441             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
   1442             AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
   1443 
   1444             TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
   1445             if (TableData)
   1446             {
   1447                 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
   1448             }
   1449             else
   1450             {
   1451                 AcpiOsPrintf ("\n");
   1452             }
   1453             break;
   1454 
   1455         case ACPI_DMT_NAME4:
   1456 
   1457             AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
   1458             AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
   1459             break;
   1460 
   1461         case ACPI_DMT_NAME6:
   1462 
   1463             AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
   1464             AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
   1465             break;
   1466 
   1467         case ACPI_DMT_NAME8:
   1468 
   1469             AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
   1470             AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
   1471             break;
   1472 
   1473         /* Special Data Types */
   1474 
   1475         case ACPI_DMT_CHKSUM:
   1476 
   1477             /* Checksum, display and validate */
   1478 
   1479             AcpiOsPrintf ("%2.2X", *Target);
   1480             Temp8 = AcpiUtGenerateChecksum (Table,
   1481                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
   1482                 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
   1483 
   1484             if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
   1485             {
   1486                 AcpiOsPrintf (
   1487                     "     /* Incorrect checksum, should be %2.2X */", Temp8);
   1488             }
   1489 
   1490             AcpiOsPrintf ("\n");
   1491             break;
   1492 
   1493         case ACPI_DMT_SPACEID:
   1494 
   1495             /* Address Space ID */
   1496 
   1497             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
   1498             break;
   1499 
   1500         case ACPI_DMT_ACCWIDTH:
   1501 
   1502             /* Encoded Access Width */
   1503 
   1504             Temp8 = *Target;
   1505             if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
   1506             {
   1507                 Temp8 = ACPI_GAS_WIDTH_RESERVED;
   1508             }
   1509 
   1510             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
   1511             break;
   1512 
   1513         case ACPI_DMT_GAS:
   1514 
   1515             /* Generic Address Structure */
   1516 
   1517             AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
   1518             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
   1519                 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
   1520             if (ACPI_FAILURE (Status))
   1521             {
   1522                 return (Status);
   1523             }
   1524 
   1525             AcpiOsPrintf ("\n");
   1526             LastOutputBlankLine = TRUE;
   1527             break;
   1528 
   1529         case ACPI_DMT_AEST:
   1530 
   1531             /* AEST subtable types */
   1532 
   1533             Temp8 = *Target;
   1534             if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED)
   1535             {
   1536                 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED;
   1537             }
   1538 
   1539             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1540                 AcpiDmAestSubnames[Temp8]);
   1541             break;
   1542 
   1543         case ACPI_DMT_AEST_CACHE:
   1544 
   1545             /* AEST cache resource subtable */
   1546 
   1547             Temp32 = *Target;
   1548             if (Temp32 > ACPI_AEST_CACHE_RESERVED)
   1549             {
   1550                 Temp32 = ACPI_AEST_CACHE_RESERVED;
   1551             }
   1552 
   1553             AcpiOsPrintf (UINT32_FORMAT, *Target,
   1554                 AcpiDmAestCacheNames[Temp32]);
   1555             break;
   1556 
   1557         case ACPI_DMT_AEST_GIC:
   1558 
   1559             /* AEST GIC error subtable */
   1560 
   1561             Temp32 = *Target;
   1562             if (Temp32 > ACPI_AEST_GIC_RESERVED)
   1563             {
   1564                 Temp32 = ACPI_AEST_GIC_RESERVED;
   1565             }
   1566 
   1567             AcpiOsPrintf (UINT32_FORMAT, *Target,
   1568                 AcpiDmAestGicNames[Temp32]);
   1569             break;
   1570 
   1571         case ACPI_DMT_AEST_RES:
   1572 
   1573             /* AEST resource type subtable */
   1574 
   1575             Temp8 = *Target;
   1576             if (Temp8 > ACPI_AEST_RESOURCE_RESERVED)
   1577             {
   1578                 Temp8 = ACPI_AEST_RESOURCE_RESERVED;
   1579             }
   1580 
   1581             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1582                 AcpiDmAestResourceNames[Temp8]);
   1583             break;
   1584 
   1585         case ACPI_DMT_AEST_XFACE:
   1586 
   1587             /* AEST interface structure types */
   1588 
   1589             Temp8 = *Target;
   1590             if (Temp8 > ACPI_AEST_XFACE_RESERVED)
   1591             {
   1592                 Temp8 = ACPI_AEST_XFACE_RESERVED;
   1593             }
   1594 
   1595             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1596                 AcpiDmAestXfaceNames[Temp8]);
   1597             break;
   1598 
   1599         case ACPI_DMT_AEST_XRUPT:
   1600 
   1601             /* AEST interrupt structure types */
   1602 
   1603             Temp8 = *Target;
   1604             if (Temp8 > ACPI_AEST_XRUPT_RESERVED)
   1605             {
   1606                 Temp8 = ACPI_AEST_XRUPT_RESERVED;
   1607             }
   1608 
   1609             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1610                 AcpiDmAestXruptNames[Temp8]);
   1611             break;
   1612 
   1613         case ACPI_DMT_ASPT:
   1614             /* ASPT subtable types */
   1615             Temp16 = ACPI_GET16(Target);
   1616             if (Temp16 > ACPI_ASPT_TYPE_UNKNOWN)
   1617             {
   1618                 Temp16 = ACPI_ASPT_TYPE_UNKNOWN;
   1619             }
   1620 
   1621             AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmAsptSubnames[Temp16]);
   1622             break;
   1623 
   1624         case ACPI_DMT_ASF:
   1625 
   1626             /* ASF subtable types */
   1627 
   1628             Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
   1629             if (Temp16 > ACPI_ASF_TYPE_RESERVED)
   1630             {
   1631                 Temp16 = ACPI_ASF_TYPE_RESERVED;
   1632             }
   1633 
   1634             AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
   1635             break;
   1636 
   1637         case ACPI_DMT_CDAT:
   1638 
   1639             /* CDAT subtable types */
   1640 
   1641             Temp8 = *Target;
   1642             if (Temp8 > ACPI_CDAT_TYPE_RESERVED)
   1643             {
   1644                 Temp8 = ACPI_CDAT_TYPE_RESERVED;
   1645             }
   1646 
   1647             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1648                 AcpiDmCdatSubnames[Temp8]);
   1649             break;
   1650 
   1651         case ACPI_DMT_CEDT:
   1652 
   1653             /* CEDT subtable types */
   1654 
   1655             Temp8 = *Target;
   1656             if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
   1657             {
   1658                 Temp8 = ACPI_CEDT_TYPE_RESERVED;
   1659             }
   1660 
   1661             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1662                 AcpiDmCedtSubnames[Temp8]);
   1663             break;
   1664 
   1665         case ACPI_DMT_DMAR:
   1666 
   1667             /* DMAR subtable types */
   1668 
   1669             Temp16 = ACPI_GET16 (Target);
   1670             if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
   1671             {
   1672                 Temp16 = ACPI_DMAR_TYPE_RESERVED;
   1673             }
   1674 
   1675             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1676                 AcpiDmDmarSubnames[Temp16]);
   1677             break;
   1678 
   1679         case ACPI_DMT_DMAR_SCOPE:
   1680 
   1681             /* DMAR device scope types */
   1682 
   1683             Temp8 = *Target;
   1684             if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
   1685             {
   1686                 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
   1687             }
   1688 
   1689             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1690                 AcpiDmDmarScope[Temp8]);
   1691             break;
   1692 
   1693         case ACPI_DMT_EINJACT:
   1694 
   1695             /* EINJ Action types */
   1696 
   1697             Temp8 = *Target;
   1698             if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
   1699             {
   1700                 Temp8 = ACPI_EINJ_ACTION_RESERVED;
   1701             }
   1702 
   1703             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1704                 AcpiDmEinjActions[Temp8]);
   1705             break;
   1706 
   1707         case ACPI_DMT_EINJINST:
   1708 
   1709             /* EINJ Instruction types */
   1710 
   1711             Temp8 = *Target;
   1712             if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
   1713             {
   1714                 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
   1715             }
   1716 
   1717             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1718                 AcpiDmEinjInstructions[Temp8]);
   1719             break;
   1720 
   1721         case ACPI_DMT_ERSTACT:
   1722 
   1723             /* ERST Action types */
   1724 
   1725             Temp8 = *Target;
   1726             if (Temp8 > ACPI_ERST_ACTION_RESERVED)
   1727             {
   1728                 Temp8 = ACPI_ERST_ACTION_RESERVED;
   1729             }
   1730 
   1731             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1732                 AcpiDmErstActions[Temp8]);
   1733             break;
   1734 
   1735         case ACPI_DMT_ERDT:
   1736 
   1737             /* ERDT subtable types */
   1738 
   1739             Temp16 = *Target;
   1740             if (Temp16 > ACPI_ERDT_TYPE_RESERVED)
   1741             {
   1742                 Temp16 = ACPI_ERDT_TYPE_RESERVED;
   1743             }
   1744 
   1745             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1746                 AcpiDmErdtSubnames[Temp16]);
   1747             break;
   1748 
   1749         case ACPI_DMT_ERSTINST:
   1750 
   1751             /* ERST Instruction types */
   1752 
   1753             Temp8 = *Target;
   1754             if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
   1755             {
   1756                 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
   1757             }
   1758 
   1759             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1760                 AcpiDmErstInstructions[Temp8]);
   1761             break;
   1762 
   1763         case ACPI_DMT_GTDT:
   1764 
   1765             /* GTDT subtable types */
   1766 
   1767             Temp8 = *Target;
   1768             if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
   1769             {
   1770                 Temp8 = ACPI_GTDT_TYPE_RESERVED;
   1771             }
   1772 
   1773             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1774                 AcpiDmGtdtSubnames[Temp8]);
   1775             break;
   1776 
   1777         case ACPI_DMT_HEST:
   1778 
   1779             /* HEST subtable types */
   1780 
   1781             Temp16 = ACPI_GET16 (Target);
   1782             if (Temp16 > ACPI_HEST_TYPE_RESERVED)
   1783             {
   1784                 Temp16 = ACPI_HEST_TYPE_RESERVED;
   1785             }
   1786 
   1787             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1788                 AcpiDmHestSubnames[Temp16]);
   1789             break;
   1790 
   1791         case ACPI_DMT_HESTNTFY:
   1792 
   1793             AcpiOsPrintf (STRING_FORMAT,
   1794                 "Hardware Error Notification Structure");
   1795 
   1796             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
   1797                 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
   1798             if (ACPI_FAILURE (Status))
   1799             {
   1800                 return (Status);
   1801             }
   1802 
   1803             AcpiOsPrintf ("\n");
   1804             LastOutputBlankLine = TRUE;
   1805             break;
   1806 
   1807         case ACPI_DMT_HESTNTYP:
   1808 
   1809             /* HEST Notify types */
   1810 
   1811             Temp8 = *Target;
   1812             if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
   1813             {
   1814                 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
   1815             }
   1816 
   1817             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1818                 AcpiDmHestNotifySubnames[Temp8]);
   1819             break;
   1820 
   1821         case ACPI_DMT_HMAT:
   1822 
   1823             /* HMAT subtable types */
   1824 
   1825             Temp16 = *Target;
   1826             if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
   1827             {
   1828                 Temp16 = ACPI_HMAT_TYPE_RESERVED;
   1829             }
   1830 
   1831             AcpiOsPrintf (UINT16_FORMAT, *Target,
   1832                 AcpiDmHmatSubnames[Temp16]);
   1833             break;
   1834 
   1835         case ACPI_DMT_IORTMEM:
   1836 
   1837             AcpiOsPrintf (STRING_FORMAT,
   1838                 "IORT Memory Access Properties");
   1839 
   1840             Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
   1841                 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
   1842             if (ACPI_FAILURE (Status))
   1843             {
   1844                 return (Status);
   1845             }
   1846 
   1847             LastOutputBlankLine = TRUE;
   1848             break;
   1849 
   1850         case ACPI_DMT_MADT:
   1851 
   1852             /* MADT subtable types */
   1853 
   1854             Temp8 = *Target;
   1855             if ((Temp8 >= ACPI_MADT_TYPE_RESERVED) && (Temp8 < ACPI_MADT_TYPE_OEM_RESERVED))
   1856             {
   1857                 Temp8 = ACPI_MADT_TYPE_RESERVED;
   1858             }
   1859             else if (Temp8 >= ACPI_MADT_TYPE_OEM_RESERVED)
   1860             {
   1861                 Temp8 = ACPI_MADT_TYPE_RESERVED + 1;
   1862             }
   1863             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1864                 AcpiDmMadtSubnames[Temp8]);
   1865             break;
   1866 
   1867         case ACPI_DMT_MPAM_LOCATOR:
   1868 
   1869             /* MPAM subtable locator types */
   1870 
   1871             Temp8 = *Target;
   1872             if (Temp8 > ACPI_MPAM_LOCATION_TYPE_INTERCONNECT)
   1873             {
   1874                 Temp8 = ACPI_MPAM_LOCATION_TYPE_INTERCONNECT + 1;
   1875             }
   1876 
   1877             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1878                 AcpiDmMpamSubnames[Temp8]);
   1879             break;
   1880 
   1881         case ACPI_DMT_NFIT:
   1882 
   1883             /* NFIT subtable types */
   1884 
   1885             Temp16 = ACPI_GET16 (Target);
   1886             if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
   1887             {
   1888                 Temp16 = ACPI_NFIT_TYPE_RESERVED;
   1889             }
   1890 
   1891             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1892                 AcpiDmNfitSubnames[Temp16]);
   1893             break;
   1894 
   1895         case ACPI_DMT_PCCT:
   1896 
   1897             /* PCCT subtable types */
   1898 
   1899             Temp8 = *Target;
   1900             if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
   1901             {
   1902                 Temp8 = ACPI_PCCT_TYPE_RESERVED;
   1903             }
   1904 
   1905             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1906                 AcpiDmPcctSubnames[Temp8]);
   1907             break;
   1908 
   1909         case ACPI_DMT_PHAT:
   1910 
   1911             /* PHAT subtable types */
   1912 
   1913             Temp16 = ACPI_GET16 (Target);
   1914             if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
   1915             {
   1916                 Temp16 = ACPI_PHAT_TYPE_RESERVED;
   1917             }
   1918 
   1919             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   1920                 AcpiDmPhatSubnames[Temp16]);
   1921             break;
   1922 
   1923         case ACPI_DMT_PMTT:
   1924 
   1925             /* PMTT subtable types */
   1926 
   1927             Temp8 = *Target;
   1928             if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
   1929             {
   1930                 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
   1931             }
   1932             else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
   1933             {
   1934                 Temp8 = ACPI_PMTT_TYPE_RESERVED;
   1935             }
   1936             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1937                 AcpiDmPmttSubnames[Temp8]);
   1938             break;
   1939 
   1940         case ACPI_DMT_PPTT:
   1941 
   1942             /* PPTT subtable types */
   1943 
   1944             Temp8 = *Target;
   1945             if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
   1946             {
   1947                 Temp8 = ACPI_PPTT_TYPE_RESERVED;
   1948             }
   1949 
   1950             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1951                 AcpiDmPpttSubnames[Temp8]);
   1952             break;
   1953 
   1954         case ACPI_DMT_UNICODE:
   1955         case ACPI_DMT_WPBT_UNICODE:
   1956 
   1957             if (ByteLength == 0)
   1958             {
   1959                 AcpiOsPrintf ("/* Zero-length Data */\n");
   1960                 break;
   1961             }
   1962 
   1963             AcpiDmDumpUnicode (Table, 0, ByteLength);
   1964             break;
   1965 
   1966         case ACPI_DMT_RAW_BUFFER:
   1967         case ACPI_DMT_BUFFER:
   1968         case ACPI_DMT_PMTT_VENDOR:
   1969 
   1970             if (ByteLength == 0)
   1971             {
   1972                 AcpiOsPrintf ("/* Zero-length Data */\n");
   1973                 break;
   1974             }
   1975 
   1976             AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL);
   1977             break;
   1978 
   1979         case ACPI_DMT_RGRT:
   1980 
   1981             /* RGRT subtable types */
   1982 
   1983             Temp8 = *Target;
   1984             if (Temp8 >= ACPI_RGRT_TYPE_RESERVED)
   1985             {
   1986                 Temp8 = ACPI_RGRT_TYPE_RESERVED0;
   1987             }
   1988 
   1989             AcpiOsPrintf (UINT8_FORMAT, *Target,
   1990                 AcpiDmRgrtSubnames[Temp8]);
   1991             break;
   1992 
   1993         case ACPI_DMT_RHCT:
   1994 
   1995             /* RHCT subtable types */
   1996 
   1997             Temp16 = ACPI_GET16 (Target);
   1998             if (Temp16 == ACPI_RHCT_NODE_TYPE_HART_INFO)
   1999             {
   2000                 Temp16 = ACPI_RHCT_NODE_TYPE_RESERVED;
   2001             }
   2002 
   2003             AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
   2004                 AcpiDmRhctSubnames[Temp16]);
   2005             break;
   2006 
   2007         case ACPI_DMT_SDEV:
   2008 
   2009             /* SDEV subtable types */
   2010 
   2011             Temp8 = *Target;
   2012             if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
   2013             {
   2014                 Temp8 = ACPI_SDEV_TYPE_RESERVED;
   2015             }
   2016 
   2017             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2018                 AcpiDmSdevSubnames[Temp8]);
   2019             break;
   2020 
   2021         case ACPI_DMT_SRAT:
   2022 
   2023             /* SRAT subtable types */
   2024 
   2025             Temp8 = *Target;
   2026             if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
   2027             {
   2028                 Temp8 = ACPI_SRAT_TYPE_RESERVED;
   2029             }
   2030 
   2031             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2032                 AcpiDmSratSubnames[Temp8]);
   2033             break;
   2034 
   2035         case ACPI_DMT_TPM2:
   2036 
   2037             /* TPM2 Start Method types */
   2038 
   2039             Temp8 = *Target;
   2040             if (Temp8 > ACPI_TPM2_RESERVED)
   2041             {
   2042                 Temp8 = ACPI_TPM2_RESERVED;
   2043             }
   2044 
   2045             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2046                 AcpiDmTpm2Subnames[Temp8]);
   2047             break;
   2048 
   2049 
   2050         case ACPI_DMT_FADTPM:
   2051 
   2052             /* FADT Preferred PM Profile names */
   2053 
   2054             Temp8 = *Target;
   2055             if (Temp8 > ACPI_FADT_PM_RESERVED)
   2056             {
   2057                 Temp8 = ACPI_FADT_PM_RESERVED;
   2058             }
   2059 
   2060             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2061                 AcpiDmFadtProfiles[Temp8]);
   2062             break;
   2063 
   2064         case ACPI_DMT_IOVT:
   2065 
   2066             /* IOVT subtable types */
   2067 
   2068             Temp16 = ACPI_GET16(Target);
   2069             if (Temp16 > ACPI_IOVT_IOMMU_RESERVED)
   2070             {
   2071                 Temp16 = ACPI_IOVT_IOMMU_RESERVED;
   2072             }
   2073 
   2074             AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmIovtSubnames[Temp16]);
   2075             break;
   2076 
   2077         case ACPI_DMT_IOVTDEV:
   2078 
   2079             /* IOVT subtable types */
   2080 
   2081             Temp8 = *Target;
   2082             if (Temp8 > ACPI_IOVT_DEVICE_ENTRY_RESERVED)
   2083             {
   2084                 Temp8 = ACPI_IOVT_DEVICE_ENTRY_RESERVED;
   2085             }
   2086 
   2087             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2088                 AcpiDmIovtdevSubnames[Temp8]);
   2089             break;
   2090 
   2091         case ACPI_DMT_IVRS:
   2092 
   2093             /* IVRS subtable types */
   2094 
   2095             Temp8 = *Target;
   2096             switch (Temp8)
   2097             {
   2098             case ACPI_IVRS_TYPE_HARDWARE1:
   2099             case ACPI_IVRS_TYPE_HARDWARE2:
   2100 
   2101                 Name = AcpiDmIvrsSubnames[0];
   2102                 break;
   2103 
   2104             case ACPI_IVRS_TYPE_HARDWARE3:
   2105 
   2106                 Name = AcpiDmIvrsSubnames[1];
   2107                 break;
   2108 
   2109             case ACPI_IVRS_TYPE_MEMORY1:
   2110             case ACPI_IVRS_TYPE_MEMORY2:
   2111             case ACPI_IVRS_TYPE_MEMORY3:
   2112 
   2113                 Name = AcpiDmIvrsSubnames[2];
   2114                 break;
   2115 
   2116             default:
   2117 
   2118                 Name = AcpiDmIvrsSubnames[3];
   2119                 break;
   2120             }
   2121 
   2122             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
   2123             break;
   2124 
   2125         case ACPI_DMT_IVRS_DE:
   2126 
   2127             /* IVRS device entry types */
   2128 
   2129             Temp8 = *Target;
   2130             switch (Temp8)
   2131             {
   2132             case ACPI_IVRS_TYPE_ALL:
   2133             case ACPI_IVRS_TYPE_SELECT:
   2134             case ACPI_IVRS_TYPE_START:
   2135             case ACPI_IVRS_TYPE_END:
   2136 
   2137                 Name = AcpiDmIvrsDevEntryNames[Temp8];
   2138                 break;
   2139 
   2140             case ACPI_IVRS_TYPE_ALIAS_SELECT:
   2141             case ACPI_IVRS_TYPE_ALIAS_START:
   2142             case ACPI_IVRS_TYPE_EXT_SELECT:
   2143             case ACPI_IVRS_TYPE_EXT_START:
   2144             case ACPI_IVRS_TYPE_SPECIAL:
   2145 
   2146                 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61];
   2147                 break;
   2148 
   2149             case ACPI_IVRS_TYPE_HID:
   2150 
   2151                 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228];
   2152                 break;
   2153 
   2154             default:
   2155                 Name = AcpiDmIvrsDevEntryNames[0];  /* Unknown/Reserved */
   2156                 break;
   2157             }
   2158 
   2159             AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
   2160             break;
   2161 
   2162         case ACPI_DMT_LPIT:
   2163 
   2164             /* LPIT subtable types */
   2165 
   2166             Temp32 = ACPI_GET32 (Target);
   2167             if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
   2168             {
   2169                 Temp32 = ACPI_LPIT_TYPE_RESERVED;
   2170             }
   2171 
   2172             AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
   2173                 AcpiDmLpitSubnames[Temp32]);
   2174             break;
   2175 
   2176         case ACPI_DMT_VIOT:
   2177 
   2178             /* VIOT subtable types */
   2179 
   2180             Temp8 = *Target;
   2181             if (Temp8 > ACPI_VIOT_RESERVED)
   2182             {
   2183                 Temp8 = ACPI_VIOT_RESERVED;
   2184             }
   2185 
   2186             AcpiOsPrintf (UINT8_FORMAT, *Target,
   2187                 AcpiDmViotSubnames[Temp8]);
   2188             break;
   2189 
   2190         case ACPI_DMT_EXIT:
   2191 
   2192             return (AE_OK);
   2193 
   2194         default:
   2195 
   2196             ACPI_ERROR ((AE_INFO,
   2197                 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
   2198             return (AE_SUPPORT);
   2199         }
   2200     }
   2201 
   2202     if (TableOffset && !SubtableLength)
   2203     {
   2204         /*
   2205          * If this table is not the main table, the subtable must have a
   2206          * valid length
   2207          */
   2208         AcpiOsPrintf ("Invalid zero length subtable\n");
   2209         return (AE_BAD_DATA);
   2210     }
   2211 
   2212     return (AE_OK);
   2213 }
   2214