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