dmtable.c revision 216471
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7167802Sjkim/****************************************************************************** 8167802Sjkim * 9167802Sjkim * 1. Copyright Notice 10167802Sjkim * 11202771Sjkim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12167802Sjkim * All rights reserved. 13167802Sjkim * 14167802Sjkim * 2. License 15167802Sjkim * 16167802Sjkim * 2.1. This is your license from Intel Corp. under its intellectual property 17167802Sjkim * rights. You may have additional license terms from the party that provided 18167802Sjkim * you this software, covering your right to use that party's intellectual 19167802Sjkim * property rights. 20167802Sjkim * 21167802Sjkim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22167802Sjkim * copy of the source code appearing in this file ("Covered Code") an 23167802Sjkim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24167802Sjkim * base code distributed originally by Intel ("Original Intel Code") to copy, 25167802Sjkim * make derivatives, distribute, use and display any portion of the Covered 26167802Sjkim * Code in any form, with the right to sublicense such rights; and 27167802Sjkim * 28167802Sjkim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29167802Sjkim * license (with the right to sublicense), under only those claims of Intel 30167802Sjkim * patents that are infringed by the Original Intel Code, to make, use, sell, 31167802Sjkim * offer to sell, and import the Covered Code and derivative works thereof 32167802Sjkim * solely to the minimum extent necessary to exercise the above copyright 33167802Sjkim * license, and in no event shall the patent license extend to any additions 34167802Sjkim * to or modifications of the Original Intel Code. No other license or right 35167802Sjkim * is granted directly or by implication, estoppel or otherwise; 36167802Sjkim * 37167802Sjkim * The above copyright and patent license is granted only if the following 38167802Sjkim * conditions are met: 39167802Sjkim * 40167802Sjkim * 3. Conditions 41167802Sjkim * 42167802Sjkim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43167802Sjkim * Redistribution of source code of any substantial portion of the Covered 44167802Sjkim * Code or modification with rights to further distribute source must include 45167802Sjkim * the above Copyright Notice, the above License, this list of Conditions, 46167802Sjkim * and the following Disclaimer and Export Compliance provision. In addition, 47167802Sjkim * Licensee must cause all Covered Code to which Licensee contributes to 48167802Sjkim * contain a file documenting the changes Licensee made to create that Covered 49167802Sjkim * Code and the date of any change. Licensee must include in that file the 50167802Sjkim * documentation of any changes made by any predecessor Licensee. Licensee 51167802Sjkim * must include a prominent statement that the modification is derived, 52167802Sjkim * directly or indirectly, from Original Intel Code. 53167802Sjkim * 54167802Sjkim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55167802Sjkim * Redistribution of source code of any substantial portion of the Covered 56167802Sjkim * Code or modification without rights to further distribute source must 57167802Sjkim * include the following Disclaimer and Export Compliance provision in the 58167802Sjkim * documentation and/or other materials provided with distribution. In 59167802Sjkim * addition, Licensee may not authorize further sublicense of source of any 60167802Sjkim * portion of the Covered Code, and must include terms to the effect that the 61167802Sjkim * license from Licensee to its licensee is limited to the intellectual 62167802Sjkim * property embodied in the software Licensee provides to its licensee, and 63167802Sjkim * not to intellectual property embodied in modifications its licensee may 64167802Sjkim * make. 65167802Sjkim * 66167802Sjkim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67167802Sjkim * substantial portion of the Covered Code or modification must reproduce the 68167802Sjkim * above Copyright Notice, and the following Disclaimer and Export Compliance 69167802Sjkim * provision in the documentation and/or other materials provided with the 70167802Sjkim * distribution. 71167802Sjkim * 72167802Sjkim * 3.4. Intel retains all right, title, and interest in and to the Original 73167802Sjkim * Intel Code. 74167802Sjkim * 75167802Sjkim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76167802Sjkim * Intel shall be used in advertising or otherwise to promote the sale, use or 77167802Sjkim * other dealings in products derived from or relating to the Covered Code 78167802Sjkim * without prior written authorization from Intel. 79167802Sjkim * 80167802Sjkim * 4. Disclaimer and Export Compliance 81167802Sjkim * 82167802Sjkim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83167802Sjkim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84167802Sjkim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85167802Sjkim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86167802Sjkim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87167802Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88167802Sjkim * PARTICULAR PURPOSE. 89167802Sjkim * 90167802Sjkim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91167802Sjkim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92167802Sjkim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93167802Sjkim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94167802Sjkim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95167802Sjkim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96167802Sjkim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97167802Sjkim * LIMITED REMEDY. 98167802Sjkim * 99167802Sjkim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100167802Sjkim * software or system incorporating such software without first obtaining any 101167802Sjkim * required license or other approval from the U. S. Department of Commerce or 102167802Sjkim * any other agency or department of the United States Government. In the 103167802Sjkim * event Licensee exports any such software from the United States or 104167802Sjkim * re-exports any such software from a foreign destination, Licensee shall 105167802Sjkim * ensure that the distribution and export/re-export of the software is in 106167802Sjkim * compliance with all laws, regulations, orders, or other restrictions of the 107167802Sjkim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108167802Sjkim * any of its subsidiaries will export/re-export any technical data, process, 109167802Sjkim * software, or service, directly or indirectly, to any country for which the 110167802Sjkim * United States government or any agency thereof requires an export license, 111167802Sjkim * other governmental approval, or letter of assurance, without first obtaining 112167802Sjkim * such license, approval or letter. 113167802Sjkim * 114167802Sjkim *****************************************************************************/ 115167802Sjkim 116193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 117193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 118193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 119193529Sjkim#include <contrib/dev/acpica/include/actables.h> 120209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 121209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h> 122167802Sjkim 123167802Sjkim/* This module used for application-level code only */ 124167802Sjkim 125167802Sjkim#define _COMPONENT ACPI_CA_DISASSEMBLER 126167802Sjkim ACPI_MODULE_NAME ("dmtable") 127167802Sjkim 128167802Sjkim/* Local Prototypes */ 129167802Sjkim 130167802Sjkimstatic void 131167802SjkimAcpiDmCheckAscii ( 132167802Sjkim UINT8 *Target, 133197104Sjkim char *RepairedName, 134167802Sjkim UINT32 Count); 135167802Sjkim 136167802Sjkim 137167802Sjkim/* These tables map a subtable type to a description string */ 138167802Sjkim 139193529Sjkimstatic const char *AcpiDmAsfSubnames[] = 140193529Sjkim{ 141193529Sjkim "ASF Information", 142193529Sjkim "ASF Alerts", 143193529Sjkim "ASF Remote Control", 144193529Sjkim "ASF RMCP Boot Options", 145193529Sjkim "ASF Address", 146193529Sjkim "Unknown SubTable Type" /* Reserved */ 147193529Sjkim}; 148193529Sjkim 149167802Sjkimstatic const char *AcpiDmDmarSubnames[] = 150167802Sjkim{ 151167802Sjkim "Hardware Unit Definition", 152167802Sjkim "Reserved Memory Region", 153193529Sjkim "Root Port ATS Capability", 154197104Sjkim "Remapping Hardware Static Affinity", 155167802Sjkim "Unknown SubTable Type" /* Reserved */ 156167802Sjkim}; 157167802Sjkim 158209746Sjkimstatic const char *AcpiDmEinjActions[] = 159209746Sjkim{ 160209746Sjkim "Begin Operation", 161209746Sjkim "Get Trigger Table", 162209746Sjkim "Set Error Type", 163209746Sjkim "Get Error Type", 164209746Sjkim "End Operation", 165209746Sjkim "Execute Operation", 166209746Sjkim "Check Busy Status", 167209746Sjkim "Get Command Status", 168209746Sjkim "Unknown Action" 169209746Sjkim}; 170209746Sjkim 171209746Sjkimstatic const char *AcpiDmEinjInstructions[] = 172209746Sjkim{ 173209746Sjkim "Read Register", 174209746Sjkim "Read Register Value", 175209746Sjkim "Write Register", 176209746Sjkim "Write Register Value", 177209746Sjkim "Noop", 178209746Sjkim "Unknown Instruction" 179209746Sjkim}; 180209746Sjkim 181209746Sjkimstatic const char *AcpiDmErstActions[] = 182209746Sjkim{ 183209746Sjkim "Begin Write Operation", 184209746Sjkim "Begin Read Operation", 185209746Sjkim "Begin Clear Operation", 186209746Sjkim "End Operation", 187209746Sjkim "Set Record Offset", 188209746Sjkim "Execute Operation", 189209746Sjkim "Check Busy Status", 190209746Sjkim "Get Command Status", 191209746Sjkim "Get Record Identifier", 192209746Sjkim "Set Record Identifier", 193209746Sjkim "Get Record Count", 194209746Sjkim "Begin Dummy Write", 195209746Sjkim "Unused/Unknown Action", 196209746Sjkim "Get Error Address Range", 197209746Sjkim "Get Error Address Length", 198209746Sjkim "Get Error Attributes", 199209746Sjkim "Unknown Action" 200209746Sjkim}; 201209746Sjkim 202209746Sjkimstatic const char *AcpiDmErstInstructions[] = 203209746Sjkim{ 204209746Sjkim "Read Register", 205209746Sjkim "Read Register Value", 206209746Sjkim "Write Register", 207209746Sjkim "Write Register Value", 208209746Sjkim "Noop", 209209746Sjkim "Load Var1", 210209746Sjkim "Load Var2", 211209746Sjkim "Store Var1", 212209746Sjkim "Add", 213209746Sjkim "Subtract", 214209746Sjkim "Add Value", 215209746Sjkim "Subtract Value", 216209746Sjkim "Stall", 217209746Sjkim "Stall While True", 218209746Sjkim "Skip Next If True", 219209746Sjkim "GoTo", 220209746Sjkim "Set Source Address", 221209746Sjkim "Set Destination Address", 222209746Sjkim "Move Data", 223209746Sjkim "Unknown Instruction" 224209746Sjkim}; 225209746Sjkim 226193529Sjkimstatic const char *AcpiDmHestSubnames[] = 227193529Sjkim{ 228197104Sjkim "IA-32 Machine Check Exception", 229197104Sjkim "IA-32 Corrected Machine Check", 230197104Sjkim "IA-32 Non-Maskable Interrupt", 231197104Sjkim "Unknown SubTable Type", /* 3 - Reserved */ 232197104Sjkim "Unknown SubTable Type", /* 4 - Reserved */ 233197104Sjkim "Unknown SubTable Type", /* 5 - Reserved */ 234193529Sjkim "PCI Express Root Port AER", 235193529Sjkim "PCI Express AER (AER Endpoint)", 236193529Sjkim "PCI Express/PCI-X Bridge AER", 237193529Sjkim "Generic Hardware Error Source", 238193529Sjkim "Unknown SubTable Type" /* Reserved */ 239193529Sjkim}; 240193529Sjkim 241193529Sjkimstatic const char *AcpiDmHestNotifySubnames[] = 242193529Sjkim{ 243193529Sjkim "Polled", 244193529Sjkim "External Interrupt", 245193529Sjkim "Local Interrupt", 246193529Sjkim "SCI", 247193529Sjkim "NMI", 248193529Sjkim "Unknown Notify Type" /* Reserved */ 249193529Sjkim}; 250193529Sjkim 251167802Sjkimstatic const char *AcpiDmMadtSubnames[] = 252167802Sjkim{ 253167802Sjkim "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ 254167802Sjkim "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */ 255167802Sjkim "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */ 256167802Sjkim "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */ 257167802Sjkim "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */ 258167802Sjkim "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */ 259167802Sjkim "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ 260167802Sjkim "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ 261167802Sjkim "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ 262193529Sjkim "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ 263193529Sjkim "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ 264167802Sjkim "Unknown SubTable Type" /* Reserved */ 265167802Sjkim}; 266167802Sjkim 267167802Sjkimstatic const char *AcpiDmSratSubnames[] = 268167802Sjkim{ 269167802Sjkim "Processor Local APIC/SAPIC Affinity", 270167802Sjkim "Memory Affinity", 271193529Sjkim "Processor Local x2APIC Affinity", 272167802Sjkim "Unknown SubTable Type" /* Reserved */ 273167802Sjkim}; 274167802Sjkim 275197104Sjkimstatic const char *AcpiDmIvrsSubnames[] = 276197104Sjkim{ 277197104Sjkim "Hardware Definition Block", 278197104Sjkim "Memory Definition Block", 279197104Sjkim "Unknown SubTable Type" /* Reserved */ 280197104Sjkim}; 281167802Sjkim 282197104Sjkim 283193529Sjkim#define ACPI_FADT_PM_RESERVED 8 284193529Sjkim 285193529Sjkimstatic const char *AcpiDmFadtProfiles[] = 286193529Sjkim{ 287193529Sjkim "Unspecified", 288193529Sjkim "Desktop", 289193529Sjkim "Mobile", 290193529Sjkim "Workstation", 291193529Sjkim "Enterprise Server", 292193529Sjkim "SOHO Server", 293193529Sjkim "Appliance PC", 294193529Sjkim "Performance Server", 295193529Sjkim "Unknown Profile Type" 296193529Sjkim}; 297193529Sjkim 298216471Sjkim#define ACPI_GAS_WIDTH_RESERVED 5 299216471Sjkim 300216471Sjkimstatic const char *AcpiDmGasAccessWidth[] = 301216471Sjkim{ 302216471Sjkim "Undefined/Legacy", 303216471Sjkim "Byte Access:8", 304216471Sjkim "Word Access:16", 305216471Sjkim "DWord Access:32", 306216471Sjkim "QWord Access:64", 307216471Sjkim "Unknown Width Encoding" 308216471Sjkim}; 309216471Sjkim 310216471Sjkim 311167802Sjkim/******************************************************************************* 312167802Sjkim * 313167802Sjkim * ACPI Table Data, indexed by signature. 314167802Sjkim * 315209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler, 316209746Sjkim * Template, Description 317197104Sjkim * 318209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a 319209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are 320209746Sjkim * special-cased elsewhere. 321167802Sjkim * 322167802Sjkim ******************************************************************************/ 323167802Sjkim 324209746SjkimACPI_DMTABLE_DATA AcpiDmTableData[] = 325167802Sjkim{ 326209746Sjkim {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf, "Alert Standard Format table"}, 327209746Sjkim {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot, "Simple Boot Flag Table"}, 328209746Sjkim {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert, "Boot Error Record Table"}, 329209746Sjkim {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep, "Corrected Platform Error Polling table"}, 330209746Sjkim {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp, "Debug Port table"}, 331209746Sjkim {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar, "DMA Remapping table"}, 332209746Sjkim {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt, "Embedded Controller Boot Resources Table"}, 333209746Sjkim {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj, "Error Injection table"}, 334209746Sjkim {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst, "Error Record Serialization Table"}, 335209746Sjkim {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt, "Fixed ACPI Description Table"}, 336209746Sjkim {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest, "Hardware Error Source Table"}, 337209746Sjkim {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet, "High Precision Event Timer table"}, 338209746Sjkim {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs, "I/O Virtualization Reporting Structure"}, 339209746Sjkim {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt, "Multiple APIC Description Table"}, 340209746Sjkim {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg, "Memory Mapped Configuration table"}, 341209746Sjkim {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"}, 342209746Sjkim {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"}, 343209746Sjkim {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"}, 344209746Sjkim {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"}, 345209746Sjkim {ACPI_SIG_SLIC, AcpiDmTableInfoSlic, NULL, NULL, NULL, "Software Licensing Description Table"}, 346209746Sjkim {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"}, 347209746Sjkim {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"}, 348209746Sjkim {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"}, 349209746Sjkim {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat, "System Resource Affinity Table"}, 350209746Sjkim {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, NULL, TemplateTcpa, "Trusted Computing Platform Alliance table"}, 351209746Sjkim {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, NULL, TemplateUefi, "UEFI Boot Optimization Table"}, 352209746Sjkim {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet, "Windows ACPI Emulated Devices Table"}, 353209746Sjkim {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat, "Watchdog Action Table"}, 354209746Sjkim {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt, "Watchdog Description Table"}, 355209746Sjkim {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt, "Watchdog Resource Table"}, 356209746Sjkim {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt, "Extended System Description Table"}, 357209746Sjkim {NULL, NULL, NULL, NULL, NULL, NULL} 358167802Sjkim}; 359167802Sjkim 360167802Sjkim 361167802Sjkim/******************************************************************************* 362167802Sjkim * 363209746Sjkim * FUNCTION: AcpiDmGenerateChecksum 364167802Sjkim * 365209746Sjkim * PARAMETERS: Table - Pointer to table to be checksummed 366209746Sjkim * Length - Length of the table 367209746Sjkim * OriginalChecksum - Value of the checksum field 368167802Sjkim * 369167802Sjkim * RETURN: 8 bit checksum of buffer 370167802Sjkim * 371167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table. 372167802Sjkim * 373167802Sjkim ******************************************************************************/ 374167802Sjkim 375167802SjkimUINT8 376209746SjkimAcpiDmGenerateChecksum ( 377209746Sjkim void *Table, 378209746Sjkim UINT32 Length, 379209746Sjkim UINT8 OriginalChecksum) 380167802Sjkim{ 381167802Sjkim UINT8 Checksum; 382167802Sjkim 383167802Sjkim 384167802Sjkim /* Sum the entire table as-is */ 385167802Sjkim 386209746Sjkim Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); 387167802Sjkim 388167802Sjkim /* Subtract off the existing checksum value in the table */ 389167802Sjkim 390209746Sjkim Checksum = (UINT8) (Checksum - OriginalChecksum); 391167802Sjkim 392167802Sjkim /* Compute the final checksum */ 393167802Sjkim 394167802Sjkim Checksum = (UINT8) (0 - Checksum); 395167802Sjkim return (Checksum); 396167802Sjkim} 397167802Sjkim 398167802Sjkim 399167802Sjkim/******************************************************************************* 400167802Sjkim * 401167802Sjkim * FUNCTION: AcpiDmGetTableData 402167802Sjkim * 403167802Sjkim * PARAMETERS: Signature - ACPI signature (4 chars) to match 404167802Sjkim * 405167802Sjkim * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 406167802Sjkim * 407167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables 408167802Sjkim * 409167802Sjkim ******************************************************************************/ 410167802Sjkim 411209746SjkimACPI_DMTABLE_DATA * 412167802SjkimAcpiDmGetTableData ( 413167802Sjkim char *Signature) 414167802Sjkim{ 415167802Sjkim ACPI_DMTABLE_DATA *TableData; 416167802Sjkim 417167802Sjkim 418167802Sjkim for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 419167802Sjkim { 420167802Sjkim if (ACPI_COMPARE_NAME (Signature, TableData->Signature)) 421167802Sjkim { 422167802Sjkim return (TableData); 423167802Sjkim } 424167802Sjkim } 425167802Sjkim 426167802Sjkim return (NULL); 427167802Sjkim} 428167802Sjkim 429167802Sjkim 430167802Sjkim/******************************************************************************* 431167802Sjkim * 432167802Sjkim * FUNCTION: AcpiDmDumpDataTable 433167802Sjkim * 434167802Sjkim * PARAMETERS: Table - An ACPI table 435167802Sjkim * 436167802Sjkim * RETURN: None. 437167802Sjkim * 438167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other 439167802Sjkim * than an SSDT or DSDT that does not contain executable AML code) 440167802Sjkim * 441167802Sjkim ******************************************************************************/ 442167802Sjkim 443167802Sjkimvoid 444167802SjkimAcpiDmDumpDataTable ( 445167802Sjkim ACPI_TABLE_HEADER *Table) 446167802Sjkim{ 447193529Sjkim ACPI_STATUS Status; 448167802Sjkim ACPI_DMTABLE_DATA *TableData; 449167802Sjkim UINT32 Length; 450167802Sjkim 451167802Sjkim 452167802Sjkim /* Ignore tables that contain AML */ 453167802Sjkim 454167802Sjkim if (AcpiUtIsAmlTable (Table)) 455167802Sjkim { 456167802Sjkim return; 457167802Sjkim } 458167802Sjkim 459167802Sjkim /* 460167802Sjkim * Handle tables that don't use the common ACPI table header structure. 461167802Sjkim * Currently, these are the FACS and RSDP. 462167802Sjkim */ 463167802Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 464167802Sjkim { 465167802Sjkim Length = Table->Length; 466167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 467167802Sjkim } 468167802Sjkim else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP)) 469167802Sjkim { 470167802Sjkim Length = AcpiDmDumpRsdp (Table); 471167802Sjkim } 472167802Sjkim else 473167802Sjkim { 474167802Sjkim /* 475167802Sjkim * All other tables must use the common ACPI table header, dump it now 476167802Sjkim */ 477167802Sjkim Length = Table->Length; 478193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 479193529Sjkim if (ACPI_FAILURE (Status)) 480193529Sjkim { 481193529Sjkim return; 482193529Sjkim } 483167802Sjkim AcpiOsPrintf ("\n"); 484167802Sjkim 485167802Sjkim /* Match signature and dispatch appropriately */ 486167802Sjkim 487167802Sjkim TableData = AcpiDmGetTableData (Table->Signature); 488167802Sjkim if (!TableData) 489167802Sjkim { 490167802Sjkim if (!ACPI_STRNCMP (Table->Signature, "OEM", 3)) 491167802Sjkim { 492167802Sjkim AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 493167802Sjkim Table->Signature); 494167802Sjkim } 495167802Sjkim else 496167802Sjkim { 497167802Sjkim AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n", 498167802Sjkim Table->Signature); 499167802Sjkim } 500167802Sjkim } 501167802Sjkim else if (TableData->TableHandler) 502167802Sjkim { 503167802Sjkim /* Complex table, has a handler */ 504167802Sjkim 505167802Sjkim TableData->TableHandler (Table); 506167802Sjkim } 507167802Sjkim else if (TableData->TableInfo) 508167802Sjkim { 509167802Sjkim /* Simple table, just walk the info table */ 510167802Sjkim 511167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 512167802Sjkim } 513167802Sjkim } 514167802Sjkim 515209746Sjkim if (!Gbl_DoTemplates || Gbl_VerboseTemplates) 516209746Sjkim { 517209746Sjkim /* Dump the raw table data */ 518167802Sjkim 519209746Sjkim AcpiOsPrintf ("\nRaw Table Data\n\n"); 520209746Sjkim AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY); 521209746Sjkim } 522167802Sjkim} 523167802Sjkim 524167802Sjkim 525167802Sjkim/******************************************************************************* 526167802Sjkim * 527167802Sjkim * FUNCTION: AcpiDmLineHeader 528167802Sjkim * 529167802Sjkim * PARAMETERS: Offset - Current byte offset, from table start 530167802Sjkim * ByteLength - Length of the field in bytes, 0 for flags 531167802Sjkim * Name - Name of this field 532167802Sjkim * Value - Optional value, displayed on left of ':' 533167802Sjkim * 534167802Sjkim * RETURN: None 535167802Sjkim * 536167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the 537167802Sjkim * current table offset in hex and decimal, the field length, 538167802Sjkim * and the field name. 539167802Sjkim * 540167802Sjkim ******************************************************************************/ 541167802Sjkim 542167802Sjkimvoid 543167802SjkimAcpiDmLineHeader ( 544167802Sjkim UINT32 Offset, 545167802Sjkim UINT32 ByteLength, 546167802Sjkim char *Name) 547167802Sjkim{ 548167802Sjkim 549209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 550167802Sjkim { 551209746Sjkim if (ByteLength) 552209746Sjkim { 553209746Sjkim AcpiOsPrintf ("[%.3d] %34s : ", 554209746Sjkim ByteLength, Name); 555209746Sjkim } 556209746Sjkim else 557209746Sjkim { 558209746Sjkim AcpiOsPrintf ("%40s : ", 559209746Sjkim Name); 560209746Sjkim } 561167802Sjkim } 562209746Sjkim else /* Normal disassembler or verbose template */ 563167802Sjkim { 564209746Sjkim if (ByteLength) 565209746Sjkim { 566209746Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ", 567209746Sjkim Offset, Offset, ByteLength, Name); 568209746Sjkim } 569209746Sjkim else 570209746Sjkim { 571209746Sjkim AcpiOsPrintf ("%43s : ", 572209746Sjkim Name); 573209746Sjkim } 574167802Sjkim } 575167802Sjkim} 576167802Sjkim 577167802Sjkimvoid 578167802SjkimAcpiDmLineHeader2 ( 579167802Sjkim UINT32 Offset, 580167802Sjkim UINT32 ByteLength, 581167802Sjkim char *Name, 582167802Sjkim UINT32 Value) 583167802Sjkim{ 584167802Sjkim 585209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 586167802Sjkim { 587209746Sjkim if (ByteLength) 588209746Sjkim { 589209746Sjkim AcpiOsPrintf ("[%.3d] %30s % 3d : ", 590209746Sjkim ByteLength, Name, Value); 591209746Sjkim } 592209746Sjkim else 593209746Sjkim { 594209746Sjkim AcpiOsPrintf ("%36s % 3d : ", 595209746Sjkim Name, Value); 596209746Sjkim } 597167802Sjkim } 598209746Sjkim else /* Normal disassembler or verbose template */ 599167802Sjkim { 600209746Sjkim if (ByteLength) 601209746Sjkim { 602209746Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %24s % 3d : ", 603209746Sjkim Offset, Offset, ByteLength, Name, Value); 604209746Sjkim } 605209746Sjkim else 606209746Sjkim { 607209746Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s % 3d : ", 608209746Sjkim Offset, Offset, Name, Value); 609209746Sjkim } 610167802Sjkim } 611167802Sjkim} 612167802Sjkim 613167802Sjkim 614167802Sjkim/******************************************************************************* 615167802Sjkim * 616167802Sjkim * FUNCTION: AcpiDmDumpTable 617167802Sjkim * 618167802Sjkim * PARAMETERS: TableLength - Length of the entire ACPI table 619167802Sjkim * TableOffset - Starting offset within the table for this 620167802Sjkim * sub-descriptor (0 if main table) 621167802Sjkim * Table - The ACPI table 622193529Sjkim * SubtableLength - Length of this sub-descriptor 623167802Sjkim * Info - Info table for this ACPI table 624167802Sjkim * 625167802Sjkim * RETURN: None 626167802Sjkim * 627167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table. 628167802Sjkim * 629209746Sjkim * Note: This function must remain in sync with DtGetFieldLength. 630209746Sjkim * 631167802Sjkim ******************************************************************************/ 632167802Sjkim 633193529SjkimACPI_STATUS 634167802SjkimAcpiDmDumpTable ( 635167802Sjkim UINT32 TableLength, 636167802Sjkim UINT32 TableOffset, 637167802Sjkim void *Table, 638167802Sjkim UINT32 SubtableLength, 639167802Sjkim ACPI_DMTABLE_INFO *Info) 640167802Sjkim{ 641167802Sjkim UINT8 *Target; 642167802Sjkim UINT32 CurrentOffset; 643167802Sjkim UINT32 ByteLength; 644167802Sjkim UINT8 Temp8; 645167802Sjkim UINT16 Temp16; 646167802Sjkim ACPI_DMTABLE_DATA *TableData; 647197104Sjkim const char *Name; 648193529Sjkim BOOLEAN LastOutputBlankLine = FALSE; 649197104Sjkim char RepairedName[8]; 650167802Sjkim 651167802Sjkim 652167802Sjkim if (!Info) 653167802Sjkim { 654167802Sjkim AcpiOsPrintf ("Display not implemented\n"); 655193529Sjkim return (AE_NOT_IMPLEMENTED); 656167802Sjkim } 657167802Sjkim 658167802Sjkim /* Walk entire Info table; Null name terminates */ 659167802Sjkim 660167802Sjkim for (; Info->Name; Info++) 661167802Sjkim { 662167802Sjkim /* 663167802Sjkim * Target points to the field within the ACPI Table. CurrentOffset is 664167802Sjkim * the offset of the field from the start of the main table. 665167802Sjkim */ 666167802Sjkim Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 667167802Sjkim CurrentOffset = TableOffset + Info->Offset; 668167802Sjkim 669167802Sjkim /* Check for beyond EOT or beyond subtable end */ 670167802Sjkim 671167802Sjkim if ((CurrentOffset >= TableLength) || 672167802Sjkim (SubtableLength && (Info->Offset >= SubtableLength))) 673167802Sjkim { 674193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 675193529Sjkim return (AE_BAD_DATA); 676167802Sjkim } 677167802Sjkim 678167802Sjkim /* Generate the byte length for this field */ 679167802Sjkim 680167802Sjkim switch (Info->Opcode) 681167802Sjkim { 682167802Sjkim case ACPI_DMT_UINT8: 683167802Sjkim case ACPI_DMT_CHKSUM: 684167802Sjkim case ACPI_DMT_SPACEID: 685216471Sjkim case ACPI_DMT_ACCWIDTH: 686197104Sjkim case ACPI_DMT_IVRS: 687167802Sjkim case ACPI_DMT_MADT: 688167802Sjkim case ACPI_DMT_SRAT: 689193529Sjkim case ACPI_DMT_ASF: 690193529Sjkim case ACPI_DMT_HESTNTYP: 691193529Sjkim case ACPI_DMT_FADTPM: 692209746Sjkim case ACPI_DMT_EINJACT: 693209746Sjkim case ACPI_DMT_EINJINST: 694209746Sjkim case ACPI_DMT_ERSTACT: 695209746Sjkim case ACPI_DMT_ERSTINST: 696167802Sjkim ByteLength = 1; 697167802Sjkim break; 698167802Sjkim case ACPI_DMT_UINT16: 699167802Sjkim case ACPI_DMT_DMAR: 700193529Sjkim case ACPI_DMT_HEST: 701167802Sjkim ByteLength = 2; 702167802Sjkim break; 703167802Sjkim case ACPI_DMT_UINT24: 704167802Sjkim ByteLength = 3; 705167802Sjkim break; 706167802Sjkim case ACPI_DMT_UINT32: 707167802Sjkim case ACPI_DMT_NAME4: 708167802Sjkim case ACPI_DMT_SIG: 709167802Sjkim ByteLength = 4; 710167802Sjkim break; 711167802Sjkim case ACPI_DMT_NAME6: 712167802Sjkim ByteLength = 6; 713167802Sjkim break; 714167802Sjkim case ACPI_DMT_UINT56: 715167802Sjkim ByteLength = 7; 716167802Sjkim break; 717167802Sjkim case ACPI_DMT_UINT64: 718167802Sjkim case ACPI_DMT_NAME8: 719167802Sjkim ByteLength = 8; 720167802Sjkim break; 721197104Sjkim case ACPI_DMT_BUF16: 722197104Sjkim ByteLength = 16; 723197104Sjkim break; 724167802Sjkim case ACPI_DMT_STRING: 725167802Sjkim ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; 726167802Sjkim break; 727167802Sjkim case ACPI_DMT_GAS: 728193529Sjkim if (!LastOutputBlankLine) 729193529Sjkim { 730193529Sjkim AcpiOsPrintf ("\n"); 731193529Sjkim LastOutputBlankLine = TRUE; 732193529Sjkim } 733167802Sjkim ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 734167802Sjkim break; 735193529Sjkim case ACPI_DMT_HESTNTFY: 736193529Sjkim if (!LastOutputBlankLine) 737193529Sjkim { 738193529Sjkim AcpiOsPrintf ("\n"); 739193529Sjkim LastOutputBlankLine = TRUE; 740193529Sjkim } 741193529Sjkim ByteLength = sizeof (ACPI_HEST_NOTIFY); 742193529Sjkim break; 743167802Sjkim default: 744167802Sjkim ByteLength = 0; 745167802Sjkim break; 746167802Sjkim } 747167802Sjkim 748193529Sjkim if (CurrentOffset + ByteLength > TableLength) 749193529Sjkim { 750193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 751193529Sjkim return (AE_BAD_DATA); 752193529Sjkim } 753193529Sjkim 754167802Sjkim /* Start a new line and decode the opcode */ 755167802Sjkim 756167802Sjkim AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 757167802Sjkim 758167802Sjkim switch (Info->Opcode) 759167802Sjkim { 760167802Sjkim /* Single-bit Flag fields. Note: Opcode is the bit position */ 761167802Sjkim 762167802Sjkim case ACPI_DMT_FLAG0: 763167802Sjkim case ACPI_DMT_FLAG1: 764167802Sjkim case ACPI_DMT_FLAG2: 765167802Sjkim case ACPI_DMT_FLAG3: 766167802Sjkim case ACPI_DMT_FLAG4: 767167802Sjkim case ACPI_DMT_FLAG5: 768167802Sjkim case ACPI_DMT_FLAG6: 769167802Sjkim case ACPI_DMT_FLAG7: 770167802Sjkim 771167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 772167802Sjkim break; 773167802Sjkim 774167802Sjkim /* 2-bit Flag fields */ 775167802Sjkim 776167802Sjkim case ACPI_DMT_FLAGS0: 777167802Sjkim 778167802Sjkim AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 779167802Sjkim break; 780167802Sjkim 781167802Sjkim case ACPI_DMT_FLAGS2: 782167802Sjkim 783167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 784167802Sjkim break; 785167802Sjkim 786167802Sjkim /* Standard Data Types */ 787167802Sjkim 788167802Sjkim case ACPI_DMT_UINT8: 789167802Sjkim 790167802Sjkim AcpiOsPrintf ("%2.2X\n", *Target); 791167802Sjkim break; 792167802Sjkim 793167802Sjkim case ACPI_DMT_UINT16: 794167802Sjkim 795167802Sjkim AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target)); 796167802Sjkim break; 797167802Sjkim 798167802Sjkim case ACPI_DMT_UINT24: 799167802Sjkim 800167802Sjkim AcpiOsPrintf ("%2.2X%2.2X%2.2X\n", 801167802Sjkim *Target, *(Target + 1), *(Target + 2)); 802167802Sjkim break; 803167802Sjkim 804167802Sjkim case ACPI_DMT_UINT32: 805167802Sjkim 806167802Sjkim AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target)); 807167802Sjkim break; 808167802Sjkim 809167802Sjkim case ACPI_DMT_UINT56: 810167802Sjkim 811193529Sjkim for (Temp8 = 0; Temp8 < 7; Temp8++) 812193529Sjkim { 813193529Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8]); 814193529Sjkim } 815193529Sjkim AcpiOsPrintf ("\n"); 816167802Sjkim break; 817167802Sjkim 818167802Sjkim case ACPI_DMT_UINT64: 819167802Sjkim 820167802Sjkim AcpiOsPrintf ("%8.8X%8.8X\n", 821167802Sjkim ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 822167802Sjkim break; 823167802Sjkim 824197104Sjkim case ACPI_DMT_BUF16: 825197104Sjkim 826197104Sjkim /* Buffer of length 16 */ 827197104Sjkim 828197104Sjkim for (Temp8 = 0; Temp8 < 16; Temp8++) 829197104Sjkim { 830209746Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8]); 831209746Sjkim if ((Temp8 + 1) < 16) 832209746Sjkim { 833209746Sjkim AcpiOsPrintf (","); 834209746Sjkim } 835197104Sjkim } 836197104Sjkim AcpiOsPrintf ("\n"); 837197104Sjkim break; 838197104Sjkim 839167802Sjkim case ACPI_DMT_STRING: 840167802Sjkim 841197104Sjkim AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 842167802Sjkim break; 843167802Sjkim 844167802Sjkim /* Fixed length ASCII name fields */ 845167802Sjkim 846167802Sjkim case ACPI_DMT_SIG: 847167802Sjkim 848197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 849197104Sjkim AcpiOsPrintf ("\"%.4s\" ", RepairedName); 850167802Sjkim TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); 851167802Sjkim if (TableData) 852167802Sjkim { 853167802Sjkim AcpiOsPrintf ("/* %s */", TableData->Name); 854167802Sjkim } 855167802Sjkim AcpiOsPrintf ("\n"); 856167802Sjkim break; 857167802Sjkim 858167802Sjkim case ACPI_DMT_NAME4: 859167802Sjkim 860197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 861197104Sjkim AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 862167802Sjkim break; 863167802Sjkim 864167802Sjkim case ACPI_DMT_NAME6: 865167802Sjkim 866197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 6); 867197104Sjkim AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 868167802Sjkim break; 869167802Sjkim 870167802Sjkim case ACPI_DMT_NAME8: 871167802Sjkim 872197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 8); 873197104Sjkim AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 874167802Sjkim break; 875167802Sjkim 876167802Sjkim /* Special Data Types */ 877167802Sjkim 878167802Sjkim case ACPI_DMT_CHKSUM: 879167802Sjkim 880167802Sjkim /* Checksum, display and validate */ 881167802Sjkim 882167802Sjkim AcpiOsPrintf ("%2.2X", *Target); 883209746Sjkim Temp8 = AcpiDmGenerateChecksum (Table, 884209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 885209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 886167802Sjkim if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 887167802Sjkim { 888167802Sjkim AcpiOsPrintf ( 889167802Sjkim " /* Incorrect checksum, should be %2.2X */", Temp8); 890167802Sjkim } 891167802Sjkim AcpiOsPrintf ("\n"); 892167802Sjkim break; 893167802Sjkim 894167802Sjkim case ACPI_DMT_SPACEID: 895167802Sjkim 896167802Sjkim /* Address Space ID */ 897167802Sjkim 898167802Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target)); 899167802Sjkim break; 900167802Sjkim 901216471Sjkim case ACPI_DMT_ACCWIDTH: 902216471Sjkim 903216471Sjkim /* Encoded Access Width */ 904216471Sjkim 905216471Sjkim Temp8 = *Target; 906216471Sjkim if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 907216471Sjkim { 908216471Sjkim Temp8 = ACPI_GAS_WIDTH_RESERVED; 909216471Sjkim } 910216471Sjkim 911216471Sjkim AcpiOsPrintf ("%2.2X (%s)\n", Temp8, AcpiDmGasAccessWidth[Temp8]); 912216471Sjkim break; 913216471Sjkim 914167802Sjkim case ACPI_DMT_GAS: 915167802Sjkim 916167802Sjkim /* Generic Address Structure */ 917167802Sjkim 918167802Sjkim AcpiOsPrintf ("<Generic Address Structure>\n"); 919197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 920197104Sjkim sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 921193529Sjkim AcpiOsPrintf ("\n"); 922193529Sjkim LastOutputBlankLine = TRUE; 923167802Sjkim break; 924167802Sjkim 925193529Sjkim case ACPI_DMT_ASF: 926193529Sjkim 927193529Sjkim /* ASF subtable types */ 928193529Sjkim 929193529Sjkim Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 930193529Sjkim if (Temp16 > ACPI_ASF_TYPE_RESERVED) 931193529Sjkim { 932193529Sjkim Temp16 = ACPI_ASF_TYPE_RESERVED; 933193529Sjkim } 934193529Sjkim 935193529Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]); 936193529Sjkim break; 937193529Sjkim 938167802Sjkim case ACPI_DMT_DMAR: 939167802Sjkim 940167802Sjkim /* DMAR subtable types */ 941167802Sjkim 942193529Sjkim Temp16 = ACPI_GET16 (Target); 943167802Sjkim if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 944167802Sjkim { 945167802Sjkim Temp16 = ACPI_DMAR_TYPE_RESERVED; 946167802Sjkim } 947167802Sjkim 948193529Sjkim AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); 949167802Sjkim break; 950167802Sjkim 951209746Sjkim case ACPI_DMT_EINJACT: 952209746Sjkim 953209746Sjkim /* EINJ Action types */ 954209746Sjkim 955209746Sjkim Temp8 = *Target; 956209746Sjkim if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 957209746Sjkim { 958209746Sjkim Temp8 = ACPI_EINJ_ACTION_RESERVED; 959209746Sjkim } 960209746Sjkim 961209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjActions[Temp8]); 962209746Sjkim break; 963209746Sjkim 964209746Sjkim case ACPI_DMT_EINJINST: 965209746Sjkim 966209746Sjkim /* EINJ Instruction types */ 967209746Sjkim 968209746Sjkim Temp8 = *Target; 969209746Sjkim if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 970209746Sjkim { 971209746Sjkim Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 972209746Sjkim } 973209746Sjkim 974209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjInstructions[Temp8]); 975209746Sjkim break; 976209746Sjkim 977209746Sjkim case ACPI_DMT_ERSTACT: 978209746Sjkim 979209746Sjkim /* ERST Action types */ 980209746Sjkim 981209746Sjkim Temp8 = *Target; 982209746Sjkim if (Temp8 > ACPI_ERST_ACTION_RESERVED) 983209746Sjkim { 984209746Sjkim Temp8 = ACPI_ERST_ACTION_RESERVED; 985209746Sjkim } 986209746Sjkim 987209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstActions[Temp8]); 988209746Sjkim break; 989209746Sjkim 990209746Sjkim case ACPI_DMT_ERSTINST: 991209746Sjkim 992209746Sjkim /* ERST Instruction types */ 993209746Sjkim 994209746Sjkim Temp8 = *Target; 995209746Sjkim if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 996209746Sjkim { 997209746Sjkim Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 998209746Sjkim } 999209746Sjkim 1000209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstInstructions[Temp8]); 1001209746Sjkim break; 1002209746Sjkim 1003193529Sjkim case ACPI_DMT_HEST: 1004193529Sjkim 1005193529Sjkim /* HEST subtable types */ 1006193529Sjkim 1007193529Sjkim Temp16 = ACPI_GET16 (Target); 1008193529Sjkim if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1009193529Sjkim { 1010193529Sjkim Temp16 = ACPI_HEST_TYPE_RESERVED; 1011193529Sjkim } 1012193529Sjkim 1013193529Sjkim AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); 1014193529Sjkim break; 1015193529Sjkim 1016193529Sjkim case ACPI_DMT_HESTNTFY: 1017193529Sjkim 1018193529Sjkim AcpiOsPrintf ("<Hardware Error Notification Structure>\n"); 1019197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1020197104Sjkim sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1021193529Sjkim AcpiOsPrintf ("\n"); 1022193529Sjkim LastOutputBlankLine = TRUE; 1023193529Sjkim break; 1024193529Sjkim 1025193529Sjkim case ACPI_DMT_HESTNTYP: 1026193529Sjkim 1027193529Sjkim /* HEST Notify types */ 1028193529Sjkim 1029193529Sjkim Temp8 = *Target; 1030193529Sjkim if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1031193529Sjkim { 1032193529Sjkim Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1033193529Sjkim } 1034193529Sjkim 1035193529Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]); 1036193529Sjkim break; 1037193529Sjkim 1038167802Sjkim case ACPI_DMT_MADT: 1039167802Sjkim 1040167802Sjkim /* MADT subtable types */ 1041167802Sjkim 1042167802Sjkim Temp8 = *Target; 1043167802Sjkim if (Temp8 > ACPI_MADT_TYPE_RESERVED) 1044167802Sjkim { 1045167802Sjkim Temp8 = ACPI_MADT_TYPE_RESERVED; 1046167802Sjkim } 1047167802Sjkim 1048167802Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]); 1049167802Sjkim break; 1050167802Sjkim 1051167802Sjkim case ACPI_DMT_SRAT: 1052167802Sjkim 1053167802Sjkim /* SRAT subtable types */ 1054167802Sjkim 1055167802Sjkim Temp8 = *Target; 1056167802Sjkim if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 1057167802Sjkim { 1058167802Sjkim Temp8 = ACPI_SRAT_TYPE_RESERVED; 1059167802Sjkim } 1060167802Sjkim 1061167802Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]); 1062167802Sjkim break; 1063167802Sjkim 1064193529Sjkim case ACPI_DMT_FADTPM: 1065193529Sjkim 1066193529Sjkim /* FADT Preferred PM Profile names */ 1067193529Sjkim 1068193529Sjkim Temp8 = *Target; 1069193529Sjkim if (Temp8 > ACPI_FADT_PM_RESERVED) 1070193529Sjkim { 1071193529Sjkim Temp8 = ACPI_FADT_PM_RESERVED; 1072193529Sjkim } 1073193529Sjkim 1074193529Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmFadtProfiles[Temp8]); 1075193529Sjkim break; 1076193529Sjkim 1077197104Sjkim case ACPI_DMT_IVRS: 1078197104Sjkim 1079197104Sjkim /* IVRS subtable types */ 1080197104Sjkim 1081197104Sjkim Temp8 = *Target; 1082197104Sjkim switch (Temp8) 1083197104Sjkim { 1084197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1085197104Sjkim Name = AcpiDmIvrsSubnames[0]; 1086197104Sjkim break; 1087197104Sjkim 1088197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1089197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1090197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1091197104Sjkim Name = AcpiDmIvrsSubnames[1]; 1092197104Sjkim break; 1093197104Sjkim 1094197104Sjkim default: 1095197104Sjkim Name = AcpiDmIvrsSubnames[2]; 1096197104Sjkim break; 1097197104Sjkim } 1098197104Sjkim 1099197104Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, Name); 1100197104Sjkim break; 1101197104Sjkim 1102167802Sjkim case ACPI_DMT_EXIT: 1103193529Sjkim return (AE_OK); 1104167802Sjkim 1105167802Sjkim default: 1106167802Sjkim ACPI_ERROR ((AE_INFO, 1107204773Sjkim "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 1108193529Sjkim return (AE_SUPPORT); 1109167802Sjkim } 1110167802Sjkim } 1111193529Sjkim 1112193529Sjkim if (TableOffset && !SubtableLength) 1113193529Sjkim { 1114193529Sjkim /* If this table is not the main table, subtable must have valid length */ 1115193529Sjkim 1116193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1117193529Sjkim return (AE_BAD_DATA); 1118193529Sjkim } 1119193529Sjkim 1120193529Sjkim return (AE_OK); 1121167802Sjkim} 1122167802Sjkim 1123167802Sjkim 1124167802Sjkim/******************************************************************************* 1125167802Sjkim * 1126167802Sjkim * FUNCTION: AcpiDmCheckAscii 1127167802Sjkim * 1128167802Sjkim * PARAMETERS: Name - Ascii string 1129167802Sjkim * Count - Number of characters to check 1130167802Sjkim * 1131167802Sjkim * RETURN: None 1132167802Sjkim * 1133167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable 1134167802Sjkim * Ascii characters. Sets non-printable and null chars to <space>. 1135167802Sjkim * 1136167802Sjkim ******************************************************************************/ 1137167802Sjkim 1138167802Sjkimstatic void 1139167802SjkimAcpiDmCheckAscii ( 1140167802Sjkim UINT8 *Name, 1141197104Sjkim char *RepairedName, 1142167802Sjkim UINT32 Count) 1143167802Sjkim{ 1144167802Sjkim UINT32 i; 1145167802Sjkim 1146167802Sjkim 1147167802Sjkim for (i = 0; i < Count; i++) 1148167802Sjkim { 1149198237Sjkim RepairedName[i] = (char) Name[i]; 1150197104Sjkim 1151197104Sjkim if (!Name[i]) 1152167802Sjkim { 1153197104Sjkim return; 1154167802Sjkim } 1155197104Sjkim if (!isprint (Name[i])) 1156197104Sjkim { 1157197104Sjkim RepairedName[i] = ' '; 1158197104Sjkim } 1159167802Sjkim } 1160167802Sjkim} 1161