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