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