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