dmtable.c revision 218590
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 9167802Sjkim * All rights reserved. 10167802Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25167802Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29167802Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43167802Sjkim 44193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 47193529Sjkim#include <contrib/dev/acpica/include/actables.h> 48209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 49209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h> 50167802Sjkim 51167802Sjkim/* This module used for application-level code only */ 52167802Sjkim 53167802Sjkim#define _COMPONENT ACPI_CA_DISASSEMBLER 54167802Sjkim ACPI_MODULE_NAME ("dmtable") 55167802Sjkim 56167802Sjkim/* Local Prototypes */ 57167802Sjkim 58167802Sjkimstatic void 59167802SjkimAcpiDmCheckAscii ( 60167802Sjkim UINT8 *Target, 61197104Sjkim char *RepairedName, 62167802Sjkim UINT32 Count); 63167802Sjkim 64167802Sjkim 65167802Sjkim/* These tables map a subtable type to a description string */ 66167802Sjkim 67193529Sjkimstatic const char *AcpiDmAsfSubnames[] = 68193529Sjkim{ 69193529Sjkim "ASF Information", 70193529Sjkim "ASF Alerts", 71193529Sjkim "ASF Remote Control", 72193529Sjkim "ASF RMCP Boot Options", 73193529Sjkim "ASF Address", 74193529Sjkim "Unknown SubTable Type" /* Reserved */ 75193529Sjkim}; 76193529Sjkim 77167802Sjkimstatic const char *AcpiDmDmarSubnames[] = 78167802Sjkim{ 79167802Sjkim "Hardware Unit Definition", 80167802Sjkim "Reserved Memory Region", 81193529Sjkim "Root Port ATS Capability", 82197104Sjkim "Remapping Hardware Static Affinity", 83167802Sjkim "Unknown SubTable Type" /* Reserved */ 84167802Sjkim}; 85167802Sjkim 86209746Sjkimstatic const char *AcpiDmEinjActions[] = 87209746Sjkim{ 88209746Sjkim "Begin Operation", 89209746Sjkim "Get Trigger Table", 90209746Sjkim "Set Error Type", 91209746Sjkim "Get Error Type", 92209746Sjkim "End Operation", 93209746Sjkim "Execute Operation", 94209746Sjkim "Check Busy Status", 95209746Sjkim "Get Command Status", 96209746Sjkim "Unknown Action" 97209746Sjkim}; 98209746Sjkim 99209746Sjkimstatic const char *AcpiDmEinjInstructions[] = 100209746Sjkim{ 101209746Sjkim "Read Register", 102209746Sjkim "Read Register Value", 103209746Sjkim "Write Register", 104209746Sjkim "Write Register Value", 105209746Sjkim "Noop", 106209746Sjkim "Unknown Instruction" 107209746Sjkim}; 108209746Sjkim 109209746Sjkimstatic const char *AcpiDmErstActions[] = 110209746Sjkim{ 111209746Sjkim "Begin Write Operation", 112209746Sjkim "Begin Read Operation", 113209746Sjkim "Begin Clear Operation", 114209746Sjkim "End Operation", 115209746Sjkim "Set Record Offset", 116209746Sjkim "Execute Operation", 117209746Sjkim "Check Busy Status", 118209746Sjkim "Get Command Status", 119209746Sjkim "Get Record Identifier", 120209746Sjkim "Set Record Identifier", 121209746Sjkim "Get Record Count", 122209746Sjkim "Begin Dummy Write", 123209746Sjkim "Unused/Unknown Action", 124209746Sjkim "Get Error Address Range", 125209746Sjkim "Get Error Address Length", 126209746Sjkim "Get Error Attributes", 127209746Sjkim "Unknown Action" 128209746Sjkim}; 129209746Sjkim 130209746Sjkimstatic const char *AcpiDmErstInstructions[] = 131209746Sjkim{ 132209746Sjkim "Read Register", 133209746Sjkim "Read Register Value", 134209746Sjkim "Write Register", 135209746Sjkim "Write Register Value", 136209746Sjkim "Noop", 137209746Sjkim "Load Var1", 138209746Sjkim "Load Var2", 139209746Sjkim "Store Var1", 140209746Sjkim "Add", 141209746Sjkim "Subtract", 142209746Sjkim "Add Value", 143209746Sjkim "Subtract Value", 144209746Sjkim "Stall", 145209746Sjkim "Stall While True", 146209746Sjkim "Skip Next If True", 147209746Sjkim "GoTo", 148209746Sjkim "Set Source Address", 149209746Sjkim "Set Destination Address", 150209746Sjkim "Move Data", 151209746Sjkim "Unknown Instruction" 152209746Sjkim}; 153209746Sjkim 154193529Sjkimstatic const char *AcpiDmHestSubnames[] = 155193529Sjkim{ 156197104Sjkim "IA-32 Machine Check Exception", 157197104Sjkim "IA-32 Corrected Machine Check", 158197104Sjkim "IA-32 Non-Maskable Interrupt", 159197104Sjkim "Unknown SubTable Type", /* 3 - Reserved */ 160197104Sjkim "Unknown SubTable Type", /* 4 - Reserved */ 161197104Sjkim "Unknown SubTable Type", /* 5 - Reserved */ 162193529Sjkim "PCI Express Root Port AER", 163193529Sjkim "PCI Express AER (AER Endpoint)", 164193529Sjkim "PCI Express/PCI-X Bridge AER", 165193529Sjkim "Generic Hardware Error Source", 166193529Sjkim "Unknown SubTable Type" /* Reserved */ 167193529Sjkim}; 168193529Sjkim 169193529Sjkimstatic const char *AcpiDmHestNotifySubnames[] = 170193529Sjkim{ 171193529Sjkim "Polled", 172193529Sjkim "External Interrupt", 173193529Sjkim "Local Interrupt", 174193529Sjkim "SCI", 175193529Sjkim "NMI", 176193529Sjkim "Unknown Notify Type" /* Reserved */ 177193529Sjkim}; 178193529Sjkim 179167802Sjkimstatic const char *AcpiDmMadtSubnames[] = 180167802Sjkim{ 181167802Sjkim "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ 182167802Sjkim "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */ 183167802Sjkim "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */ 184167802Sjkim "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */ 185167802Sjkim "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */ 186167802Sjkim "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */ 187167802Sjkim "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ 188167802Sjkim "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ 189167802Sjkim "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ 190193529Sjkim "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ 191193529Sjkim "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ 192167802Sjkim "Unknown SubTable Type" /* Reserved */ 193167802Sjkim}; 194167802Sjkim 195167802Sjkimstatic const char *AcpiDmSratSubnames[] = 196167802Sjkim{ 197167802Sjkim "Processor Local APIC/SAPIC Affinity", 198167802Sjkim "Memory Affinity", 199193529Sjkim "Processor Local x2APIC Affinity", 200167802Sjkim "Unknown SubTable Type" /* Reserved */ 201167802Sjkim}; 202167802Sjkim 203197104Sjkimstatic const char *AcpiDmIvrsSubnames[] = 204197104Sjkim{ 205197104Sjkim "Hardware Definition Block", 206197104Sjkim "Memory Definition Block", 207197104Sjkim "Unknown SubTable Type" /* Reserved */ 208197104Sjkim}; 209167802Sjkim 210197104Sjkim 211193529Sjkim#define ACPI_FADT_PM_RESERVED 8 212193529Sjkim 213193529Sjkimstatic const char *AcpiDmFadtProfiles[] = 214193529Sjkim{ 215193529Sjkim "Unspecified", 216193529Sjkim "Desktop", 217193529Sjkim "Mobile", 218193529Sjkim "Workstation", 219193529Sjkim "Enterprise Server", 220193529Sjkim "SOHO Server", 221193529Sjkim "Appliance PC", 222193529Sjkim "Performance Server", 223193529Sjkim "Unknown Profile Type" 224193529Sjkim}; 225193529Sjkim 226216471Sjkim#define ACPI_GAS_WIDTH_RESERVED 5 227216471Sjkim 228216471Sjkimstatic const char *AcpiDmGasAccessWidth[] = 229216471Sjkim{ 230216471Sjkim "Undefined/Legacy", 231216471Sjkim "Byte Access:8", 232216471Sjkim "Word Access:16", 233216471Sjkim "DWord Access:32", 234216471Sjkim "QWord Access:64", 235216471Sjkim "Unknown Width Encoding" 236216471Sjkim}; 237216471Sjkim 238216471Sjkim 239167802Sjkim/******************************************************************************* 240167802Sjkim * 241167802Sjkim * ACPI Table Data, indexed by signature. 242167802Sjkim * 243209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler, 244209746Sjkim * Template, Description 245197104Sjkim * 246209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a 247209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are 248209746Sjkim * special-cased elsewhere. 249167802Sjkim * 250167802Sjkim ******************************************************************************/ 251167802Sjkim 252209746SjkimACPI_DMTABLE_DATA AcpiDmTableData[] = 253167802Sjkim{ 254209746Sjkim {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf, "Alert Standard Format table"}, 255209746Sjkim {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot, "Simple Boot Flag Table"}, 256209746Sjkim {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert, "Boot Error Record Table"}, 257209746Sjkim {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep, "Corrected Platform Error Polling table"}, 258209746Sjkim {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp, "Debug Port table"}, 259209746Sjkim {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar, "DMA Remapping table"}, 260209746Sjkim {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt, "Embedded Controller Boot Resources Table"}, 261209746Sjkim {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj, "Error Injection table"}, 262209746Sjkim {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst, "Error Record Serialization Table"}, 263209746Sjkim {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt, "Fixed ACPI Description Table"}, 264209746Sjkim {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest, "Hardware Error Source Table"}, 265209746Sjkim {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet, "High Precision Event Timer table"}, 266209746Sjkim {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs, "I/O Virtualization Reporting Structure"}, 267209746Sjkim {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt, "Multiple APIC Description Table"}, 268209746Sjkim {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg, "Memory Mapped Configuration table"}, 269209746Sjkim {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"}, 270209746Sjkim {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"}, 271209746Sjkim {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"}, 272209746Sjkim {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"}, 273209746Sjkim {ACPI_SIG_SLIC, AcpiDmTableInfoSlic, NULL, NULL, NULL, "Software Licensing Description Table"}, 274209746Sjkim {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"}, 275209746Sjkim {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"}, 276209746Sjkim {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"}, 277209746Sjkim {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat, "System Resource Affinity Table"}, 278209746Sjkim {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, NULL, TemplateTcpa, "Trusted Computing Platform Alliance table"}, 279217365Sjkim {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi, "UEFI Boot Optimization Table"}, 280209746Sjkim {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet, "Windows ACPI Emulated Devices Table"}, 281209746Sjkim {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat, "Watchdog Action Table"}, 282209746Sjkim {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt, "Watchdog Description Table"}, 283209746Sjkim {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt, "Watchdog Resource Table"}, 284209746Sjkim {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt, "Extended System Description Table"}, 285209746Sjkim {NULL, NULL, NULL, NULL, NULL, NULL} 286167802Sjkim}; 287167802Sjkim 288167802Sjkim 289167802Sjkim/******************************************************************************* 290167802Sjkim * 291209746Sjkim * FUNCTION: AcpiDmGenerateChecksum 292167802Sjkim * 293209746Sjkim * PARAMETERS: Table - Pointer to table to be checksummed 294209746Sjkim * Length - Length of the table 295209746Sjkim * OriginalChecksum - Value of the checksum field 296167802Sjkim * 297167802Sjkim * RETURN: 8 bit checksum of buffer 298167802Sjkim * 299167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table. 300167802Sjkim * 301167802Sjkim ******************************************************************************/ 302167802Sjkim 303167802SjkimUINT8 304209746SjkimAcpiDmGenerateChecksum ( 305209746Sjkim void *Table, 306209746Sjkim UINT32 Length, 307209746Sjkim UINT8 OriginalChecksum) 308167802Sjkim{ 309167802Sjkim UINT8 Checksum; 310167802Sjkim 311167802Sjkim 312167802Sjkim /* Sum the entire table as-is */ 313167802Sjkim 314209746Sjkim Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); 315167802Sjkim 316167802Sjkim /* Subtract off the existing checksum value in the table */ 317167802Sjkim 318209746Sjkim Checksum = (UINT8) (Checksum - OriginalChecksum); 319167802Sjkim 320167802Sjkim /* Compute the final checksum */ 321167802Sjkim 322167802Sjkim Checksum = (UINT8) (0 - Checksum); 323167802Sjkim return (Checksum); 324167802Sjkim} 325167802Sjkim 326167802Sjkim 327167802Sjkim/******************************************************************************* 328167802Sjkim * 329167802Sjkim * FUNCTION: AcpiDmGetTableData 330167802Sjkim * 331167802Sjkim * PARAMETERS: Signature - ACPI signature (4 chars) to match 332167802Sjkim * 333167802Sjkim * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 334167802Sjkim * 335167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables 336167802Sjkim * 337167802Sjkim ******************************************************************************/ 338167802Sjkim 339209746SjkimACPI_DMTABLE_DATA * 340167802SjkimAcpiDmGetTableData ( 341167802Sjkim char *Signature) 342167802Sjkim{ 343167802Sjkim ACPI_DMTABLE_DATA *TableData; 344167802Sjkim 345167802Sjkim 346167802Sjkim for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 347167802Sjkim { 348167802Sjkim if (ACPI_COMPARE_NAME (Signature, TableData->Signature)) 349167802Sjkim { 350167802Sjkim return (TableData); 351167802Sjkim } 352167802Sjkim } 353167802Sjkim 354167802Sjkim return (NULL); 355167802Sjkim} 356167802Sjkim 357167802Sjkim 358167802Sjkim/******************************************************************************* 359167802Sjkim * 360167802Sjkim * FUNCTION: AcpiDmDumpDataTable 361167802Sjkim * 362167802Sjkim * PARAMETERS: Table - An ACPI table 363167802Sjkim * 364167802Sjkim * RETURN: None. 365167802Sjkim * 366167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other 367167802Sjkim * than an SSDT or DSDT that does not contain executable AML code) 368167802Sjkim * 369167802Sjkim ******************************************************************************/ 370167802Sjkim 371167802Sjkimvoid 372167802SjkimAcpiDmDumpDataTable ( 373167802Sjkim ACPI_TABLE_HEADER *Table) 374167802Sjkim{ 375193529Sjkim ACPI_STATUS Status; 376167802Sjkim ACPI_DMTABLE_DATA *TableData; 377167802Sjkim UINT32 Length; 378167802Sjkim 379167802Sjkim 380167802Sjkim /* Ignore tables that contain AML */ 381167802Sjkim 382167802Sjkim if (AcpiUtIsAmlTable (Table)) 383167802Sjkim { 384167802Sjkim return; 385167802Sjkim } 386167802Sjkim 387167802Sjkim /* 388167802Sjkim * Handle tables that don't use the common ACPI table header structure. 389167802Sjkim * Currently, these are the FACS and RSDP. 390167802Sjkim */ 391167802Sjkim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) 392167802Sjkim { 393167802Sjkim Length = Table->Length; 394167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 395167802Sjkim } 396167802Sjkim else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP)) 397167802Sjkim { 398167802Sjkim Length = AcpiDmDumpRsdp (Table); 399167802Sjkim } 400167802Sjkim else 401167802Sjkim { 402167802Sjkim /* 403167802Sjkim * All other tables must use the common ACPI table header, dump it now 404167802Sjkim */ 405167802Sjkim Length = Table->Length; 406193529Sjkim Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 407193529Sjkim if (ACPI_FAILURE (Status)) 408193529Sjkim { 409193529Sjkim return; 410193529Sjkim } 411167802Sjkim AcpiOsPrintf ("\n"); 412167802Sjkim 413167802Sjkim /* Match signature and dispatch appropriately */ 414167802Sjkim 415167802Sjkim TableData = AcpiDmGetTableData (Table->Signature); 416167802Sjkim if (!TableData) 417167802Sjkim { 418167802Sjkim if (!ACPI_STRNCMP (Table->Signature, "OEM", 3)) 419167802Sjkim { 420167802Sjkim AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 421167802Sjkim Table->Signature); 422167802Sjkim } 423167802Sjkim else 424167802Sjkim { 425167802Sjkim AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n", 426167802Sjkim Table->Signature); 427167802Sjkim } 428167802Sjkim } 429167802Sjkim else if (TableData->TableHandler) 430167802Sjkim { 431167802Sjkim /* Complex table, has a handler */ 432167802Sjkim 433167802Sjkim TableData->TableHandler (Table); 434167802Sjkim } 435167802Sjkim else if (TableData->TableInfo) 436167802Sjkim { 437167802Sjkim /* Simple table, just walk the info table */ 438167802Sjkim 439167802Sjkim AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 440167802Sjkim } 441167802Sjkim } 442167802Sjkim 443209746Sjkim if (!Gbl_DoTemplates || Gbl_VerboseTemplates) 444209746Sjkim { 445209746Sjkim /* Dump the raw table data */ 446167802Sjkim 447217365Sjkim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 448217365Sjkim ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 449209746Sjkim AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY); 450209746Sjkim } 451167802Sjkim} 452167802Sjkim 453167802Sjkim 454167802Sjkim/******************************************************************************* 455167802Sjkim * 456167802Sjkim * FUNCTION: AcpiDmLineHeader 457167802Sjkim * 458167802Sjkim * PARAMETERS: Offset - Current byte offset, from table start 459167802Sjkim * ByteLength - Length of the field in bytes, 0 for flags 460167802Sjkim * Name - Name of this field 461167802Sjkim * Value - Optional value, displayed on left of ':' 462167802Sjkim * 463167802Sjkim * RETURN: None 464167802Sjkim * 465167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the 466167802Sjkim * current table offset in hex and decimal, the field length, 467167802Sjkim * and the field name. 468167802Sjkim * 469167802Sjkim ******************************************************************************/ 470167802Sjkim 471167802Sjkimvoid 472167802SjkimAcpiDmLineHeader ( 473167802Sjkim UINT32 Offset, 474167802Sjkim UINT32 ByteLength, 475167802Sjkim char *Name) 476167802Sjkim{ 477167802Sjkim 478209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 479167802Sjkim { 480209746Sjkim if (ByteLength) 481209746Sjkim { 482209746Sjkim AcpiOsPrintf ("[%.3d] %34s : ", 483209746Sjkim ByteLength, Name); 484209746Sjkim } 485209746Sjkim else 486209746Sjkim { 487209746Sjkim AcpiOsPrintf ("%40s : ", 488209746Sjkim Name); 489209746Sjkim } 490167802Sjkim } 491209746Sjkim else /* Normal disassembler or verbose template */ 492167802Sjkim { 493209746Sjkim if (ByteLength) 494209746Sjkim { 495209746Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ", 496209746Sjkim Offset, Offset, ByteLength, Name); 497209746Sjkim } 498209746Sjkim else 499209746Sjkim { 500209746Sjkim AcpiOsPrintf ("%43s : ", 501209746Sjkim Name); 502209746Sjkim } 503167802Sjkim } 504167802Sjkim} 505167802Sjkim 506167802Sjkimvoid 507167802SjkimAcpiDmLineHeader2 ( 508167802Sjkim UINT32 Offset, 509167802Sjkim UINT32 ByteLength, 510167802Sjkim char *Name, 511167802Sjkim UINT32 Value) 512167802Sjkim{ 513167802Sjkim 514209746Sjkim if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */ 515167802Sjkim { 516209746Sjkim if (ByteLength) 517209746Sjkim { 518209746Sjkim AcpiOsPrintf ("[%.3d] %30s % 3d : ", 519209746Sjkim ByteLength, Name, Value); 520209746Sjkim } 521209746Sjkim else 522209746Sjkim { 523209746Sjkim AcpiOsPrintf ("%36s % 3d : ", 524209746Sjkim Name, Value); 525209746Sjkim } 526167802Sjkim } 527209746Sjkim else /* Normal disassembler or verbose template */ 528167802Sjkim { 529209746Sjkim if (ByteLength) 530209746Sjkim { 531209746Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %24s % 3d : ", 532209746Sjkim Offset, Offset, ByteLength, Name, Value); 533209746Sjkim } 534209746Sjkim else 535209746Sjkim { 536209746Sjkim AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s % 3d : ", 537209746Sjkim Offset, Offset, Name, Value); 538209746Sjkim } 539167802Sjkim } 540167802Sjkim} 541167802Sjkim 542167802Sjkim 543167802Sjkim/******************************************************************************* 544167802Sjkim * 545167802Sjkim * FUNCTION: AcpiDmDumpTable 546167802Sjkim * 547167802Sjkim * PARAMETERS: TableLength - Length of the entire ACPI table 548167802Sjkim * TableOffset - Starting offset within the table for this 549167802Sjkim * sub-descriptor (0 if main table) 550167802Sjkim * Table - The ACPI table 551193529Sjkim * SubtableLength - Length of this sub-descriptor 552167802Sjkim * Info - Info table for this ACPI table 553167802Sjkim * 554167802Sjkim * RETURN: None 555167802Sjkim * 556167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table. 557167802Sjkim * 558209746Sjkim * Note: This function must remain in sync with DtGetFieldLength. 559209746Sjkim * 560167802Sjkim ******************************************************************************/ 561167802Sjkim 562193529SjkimACPI_STATUS 563167802SjkimAcpiDmDumpTable ( 564167802Sjkim UINT32 TableLength, 565167802Sjkim UINT32 TableOffset, 566167802Sjkim void *Table, 567167802Sjkim UINT32 SubtableLength, 568167802Sjkim ACPI_DMTABLE_INFO *Info) 569167802Sjkim{ 570167802Sjkim UINT8 *Target; 571167802Sjkim UINT32 CurrentOffset; 572167802Sjkim UINT32 ByteLength; 573167802Sjkim UINT8 Temp8; 574167802Sjkim UINT16 Temp16; 575167802Sjkim ACPI_DMTABLE_DATA *TableData; 576197104Sjkim const char *Name; 577193529Sjkim BOOLEAN LastOutputBlankLine = FALSE; 578197104Sjkim char RepairedName[8]; 579167802Sjkim 580167802Sjkim 581167802Sjkim if (!Info) 582167802Sjkim { 583167802Sjkim AcpiOsPrintf ("Display not implemented\n"); 584193529Sjkim return (AE_NOT_IMPLEMENTED); 585167802Sjkim } 586167802Sjkim 587167802Sjkim /* Walk entire Info table; Null name terminates */ 588167802Sjkim 589167802Sjkim for (; Info->Name; Info++) 590167802Sjkim { 591167802Sjkim /* 592167802Sjkim * Target points to the field within the ACPI Table. CurrentOffset is 593167802Sjkim * the offset of the field from the start of the main table. 594167802Sjkim */ 595167802Sjkim Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 596167802Sjkim CurrentOffset = TableOffset + Info->Offset; 597167802Sjkim 598167802Sjkim /* Check for beyond EOT or beyond subtable end */ 599167802Sjkim 600167802Sjkim if ((CurrentOffset >= TableLength) || 601167802Sjkim (SubtableLength && (Info->Offset >= SubtableLength))) 602167802Sjkim { 603193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 604193529Sjkim return (AE_BAD_DATA); 605167802Sjkim } 606167802Sjkim 607167802Sjkim /* Generate the byte length for this field */ 608167802Sjkim 609167802Sjkim switch (Info->Opcode) 610167802Sjkim { 611167802Sjkim case ACPI_DMT_UINT8: 612167802Sjkim case ACPI_DMT_CHKSUM: 613167802Sjkim case ACPI_DMT_SPACEID: 614216471Sjkim case ACPI_DMT_ACCWIDTH: 615197104Sjkim case ACPI_DMT_IVRS: 616167802Sjkim case ACPI_DMT_MADT: 617167802Sjkim case ACPI_DMT_SRAT: 618193529Sjkim case ACPI_DMT_ASF: 619193529Sjkim case ACPI_DMT_HESTNTYP: 620193529Sjkim case ACPI_DMT_FADTPM: 621209746Sjkim case ACPI_DMT_EINJACT: 622209746Sjkim case ACPI_DMT_EINJINST: 623209746Sjkim case ACPI_DMT_ERSTACT: 624209746Sjkim case ACPI_DMT_ERSTINST: 625167802Sjkim ByteLength = 1; 626167802Sjkim break; 627167802Sjkim case ACPI_DMT_UINT16: 628167802Sjkim case ACPI_DMT_DMAR: 629193529Sjkim case ACPI_DMT_HEST: 630167802Sjkim ByteLength = 2; 631167802Sjkim break; 632167802Sjkim case ACPI_DMT_UINT24: 633167802Sjkim ByteLength = 3; 634167802Sjkim break; 635167802Sjkim case ACPI_DMT_UINT32: 636167802Sjkim case ACPI_DMT_NAME4: 637167802Sjkim case ACPI_DMT_SIG: 638167802Sjkim ByteLength = 4; 639167802Sjkim break; 640167802Sjkim case ACPI_DMT_NAME6: 641167802Sjkim ByteLength = 6; 642167802Sjkim break; 643167802Sjkim case ACPI_DMT_UINT56: 644218590Sjkim case ACPI_DMT_BUF7: 645167802Sjkim ByteLength = 7; 646167802Sjkim break; 647167802Sjkim case ACPI_DMT_UINT64: 648167802Sjkim case ACPI_DMT_NAME8: 649167802Sjkim ByteLength = 8; 650167802Sjkim break; 651197104Sjkim case ACPI_DMT_BUF16: 652217365Sjkim case ACPI_DMT_UUID: 653197104Sjkim ByteLength = 16; 654197104Sjkim break; 655167802Sjkim case ACPI_DMT_STRING: 656167802Sjkim ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; 657167802Sjkim break; 658167802Sjkim case ACPI_DMT_GAS: 659193529Sjkim if (!LastOutputBlankLine) 660193529Sjkim { 661193529Sjkim AcpiOsPrintf ("\n"); 662193529Sjkim LastOutputBlankLine = TRUE; 663193529Sjkim } 664167802Sjkim ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 665167802Sjkim break; 666193529Sjkim case ACPI_DMT_HESTNTFY: 667193529Sjkim if (!LastOutputBlankLine) 668193529Sjkim { 669193529Sjkim AcpiOsPrintf ("\n"); 670193529Sjkim LastOutputBlankLine = TRUE; 671193529Sjkim } 672193529Sjkim ByteLength = sizeof (ACPI_HEST_NOTIFY); 673193529Sjkim break; 674167802Sjkim default: 675167802Sjkim ByteLength = 0; 676167802Sjkim break; 677167802Sjkim } 678167802Sjkim 679193529Sjkim if (CurrentOffset + ByteLength > TableLength) 680193529Sjkim { 681193529Sjkim AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 682193529Sjkim return (AE_BAD_DATA); 683193529Sjkim } 684193529Sjkim 685167802Sjkim /* Start a new line and decode the opcode */ 686167802Sjkim 687167802Sjkim AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 688167802Sjkim 689167802Sjkim switch (Info->Opcode) 690167802Sjkim { 691167802Sjkim /* Single-bit Flag fields. Note: Opcode is the bit position */ 692167802Sjkim 693167802Sjkim case ACPI_DMT_FLAG0: 694167802Sjkim case ACPI_DMT_FLAG1: 695167802Sjkim case ACPI_DMT_FLAG2: 696167802Sjkim case ACPI_DMT_FLAG3: 697167802Sjkim case ACPI_DMT_FLAG4: 698167802Sjkim case ACPI_DMT_FLAG5: 699167802Sjkim case ACPI_DMT_FLAG6: 700167802Sjkim case ACPI_DMT_FLAG7: 701167802Sjkim 702167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 703167802Sjkim break; 704167802Sjkim 705167802Sjkim /* 2-bit Flag fields */ 706167802Sjkim 707167802Sjkim case ACPI_DMT_FLAGS0: 708167802Sjkim 709167802Sjkim AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 710167802Sjkim break; 711167802Sjkim 712167802Sjkim case ACPI_DMT_FLAGS2: 713167802Sjkim 714167802Sjkim AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 715167802Sjkim break; 716167802Sjkim 717167802Sjkim /* Standard Data Types */ 718167802Sjkim 719167802Sjkim case ACPI_DMT_UINT8: 720167802Sjkim 721167802Sjkim AcpiOsPrintf ("%2.2X\n", *Target); 722167802Sjkim break; 723167802Sjkim 724167802Sjkim case ACPI_DMT_UINT16: 725167802Sjkim 726167802Sjkim AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target)); 727167802Sjkim break; 728167802Sjkim 729167802Sjkim case ACPI_DMT_UINT24: 730167802Sjkim 731167802Sjkim AcpiOsPrintf ("%2.2X%2.2X%2.2X\n", 732167802Sjkim *Target, *(Target + 1), *(Target + 2)); 733167802Sjkim break; 734167802Sjkim 735167802Sjkim case ACPI_DMT_UINT32: 736167802Sjkim 737167802Sjkim AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target)); 738167802Sjkim break; 739167802Sjkim 740167802Sjkim case ACPI_DMT_UINT56: 741167802Sjkim 742193529Sjkim for (Temp8 = 0; Temp8 < 7; Temp8++) 743193529Sjkim { 744193529Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8]); 745193529Sjkim } 746193529Sjkim AcpiOsPrintf ("\n"); 747167802Sjkim break; 748167802Sjkim 749167802Sjkim case ACPI_DMT_UINT64: 750167802Sjkim 751167802Sjkim AcpiOsPrintf ("%8.8X%8.8X\n", 752167802Sjkim ACPI_FORMAT_UINT64 (ACPI_GET64 (Target))); 753167802Sjkim break; 754167802Sjkim 755218590Sjkim case ACPI_DMT_BUF7: 756197104Sjkim case ACPI_DMT_BUF16: 757197104Sjkim 758218590Sjkim /* 759218590Sjkim * Buffer: Size depends on the opcode and was set above. 760218590Sjkim * Each hex byte is separated with a space. 761218590Sjkim */ 762218590Sjkim for (Temp8 = 0; Temp8 < ByteLength; Temp8++) 763197104Sjkim { 764209746Sjkim AcpiOsPrintf ("%2.2X", Target[Temp8]); 765218590Sjkim if ((UINT32) (Temp8 + 1) < ByteLength) 766209746Sjkim { 767218590Sjkim AcpiOsPrintf (" "); 768209746Sjkim } 769197104Sjkim } 770197104Sjkim AcpiOsPrintf ("\n"); 771197104Sjkim break; 772197104Sjkim 773217365Sjkim case ACPI_DMT_UUID: 774217365Sjkim 775217365Sjkim /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 776217365Sjkim 777217365Sjkim (void) AuConvertUuidToString ((char *) Target, MsgBuffer); 778217365Sjkim 779217365Sjkim AcpiOsPrintf ("%s\n", MsgBuffer); 780217365Sjkim break; 781217365Sjkim 782167802Sjkim case ACPI_DMT_STRING: 783167802Sjkim 784197104Sjkim AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 785167802Sjkim break; 786167802Sjkim 787167802Sjkim /* Fixed length ASCII name fields */ 788167802Sjkim 789167802Sjkim case ACPI_DMT_SIG: 790167802Sjkim 791197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 792197104Sjkim AcpiOsPrintf ("\"%.4s\" ", RepairedName); 793167802Sjkim TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target)); 794167802Sjkim if (TableData) 795167802Sjkim { 796167802Sjkim AcpiOsPrintf ("/* %s */", TableData->Name); 797167802Sjkim } 798167802Sjkim AcpiOsPrintf ("\n"); 799167802Sjkim break; 800167802Sjkim 801167802Sjkim case ACPI_DMT_NAME4: 802167802Sjkim 803197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 4); 804197104Sjkim AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 805167802Sjkim break; 806167802Sjkim 807167802Sjkim case ACPI_DMT_NAME6: 808167802Sjkim 809197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 6); 810197104Sjkim AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 811167802Sjkim break; 812167802Sjkim 813167802Sjkim case ACPI_DMT_NAME8: 814167802Sjkim 815197104Sjkim AcpiDmCheckAscii (Target, RepairedName, 8); 816197104Sjkim AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 817167802Sjkim break; 818167802Sjkim 819167802Sjkim /* Special Data Types */ 820167802Sjkim 821167802Sjkim case ACPI_DMT_CHKSUM: 822167802Sjkim 823167802Sjkim /* Checksum, display and validate */ 824167802Sjkim 825167802Sjkim AcpiOsPrintf ("%2.2X", *Target); 826209746Sjkim Temp8 = AcpiDmGenerateChecksum (Table, 827209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 828209746Sjkim ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 829167802Sjkim if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 830167802Sjkim { 831167802Sjkim AcpiOsPrintf ( 832167802Sjkim " /* Incorrect checksum, should be %2.2X */", Temp8); 833167802Sjkim } 834167802Sjkim AcpiOsPrintf ("\n"); 835167802Sjkim break; 836167802Sjkim 837167802Sjkim case ACPI_DMT_SPACEID: 838167802Sjkim 839167802Sjkim /* Address Space ID */ 840167802Sjkim 841167802Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target)); 842167802Sjkim break; 843167802Sjkim 844216471Sjkim case ACPI_DMT_ACCWIDTH: 845216471Sjkim 846216471Sjkim /* Encoded Access Width */ 847216471Sjkim 848216471Sjkim Temp8 = *Target; 849216471Sjkim if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 850216471Sjkim { 851216471Sjkim Temp8 = ACPI_GAS_WIDTH_RESERVED; 852216471Sjkim } 853216471Sjkim 854216471Sjkim AcpiOsPrintf ("%2.2X (%s)\n", Temp8, AcpiDmGasAccessWidth[Temp8]); 855216471Sjkim break; 856216471Sjkim 857167802Sjkim case ACPI_DMT_GAS: 858167802Sjkim 859167802Sjkim /* Generic Address Structure */ 860167802Sjkim 861167802Sjkim AcpiOsPrintf ("<Generic Address Structure>\n"); 862197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 863197104Sjkim sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 864193529Sjkim AcpiOsPrintf ("\n"); 865193529Sjkim LastOutputBlankLine = TRUE; 866167802Sjkim break; 867167802Sjkim 868193529Sjkim case ACPI_DMT_ASF: 869193529Sjkim 870193529Sjkim /* ASF subtable types */ 871193529Sjkim 872193529Sjkim Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 873193529Sjkim if (Temp16 > ACPI_ASF_TYPE_RESERVED) 874193529Sjkim { 875193529Sjkim Temp16 = ACPI_ASF_TYPE_RESERVED; 876193529Sjkim } 877193529Sjkim 878193529Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]); 879193529Sjkim break; 880193529Sjkim 881167802Sjkim case ACPI_DMT_DMAR: 882167802Sjkim 883167802Sjkim /* DMAR subtable types */ 884167802Sjkim 885193529Sjkim Temp16 = ACPI_GET16 (Target); 886167802Sjkim if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 887167802Sjkim { 888167802Sjkim Temp16 = ACPI_DMAR_TYPE_RESERVED; 889167802Sjkim } 890167802Sjkim 891193529Sjkim AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]); 892167802Sjkim break; 893167802Sjkim 894209746Sjkim case ACPI_DMT_EINJACT: 895209746Sjkim 896209746Sjkim /* EINJ Action types */ 897209746Sjkim 898209746Sjkim Temp8 = *Target; 899209746Sjkim if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 900209746Sjkim { 901209746Sjkim Temp8 = ACPI_EINJ_ACTION_RESERVED; 902209746Sjkim } 903209746Sjkim 904209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjActions[Temp8]); 905209746Sjkim break; 906209746Sjkim 907209746Sjkim case ACPI_DMT_EINJINST: 908209746Sjkim 909209746Sjkim /* EINJ Instruction types */ 910209746Sjkim 911209746Sjkim Temp8 = *Target; 912209746Sjkim if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 913209746Sjkim { 914209746Sjkim Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 915209746Sjkim } 916209746Sjkim 917209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjInstructions[Temp8]); 918209746Sjkim break; 919209746Sjkim 920209746Sjkim case ACPI_DMT_ERSTACT: 921209746Sjkim 922209746Sjkim /* ERST Action types */ 923209746Sjkim 924209746Sjkim Temp8 = *Target; 925209746Sjkim if (Temp8 > ACPI_ERST_ACTION_RESERVED) 926209746Sjkim { 927209746Sjkim Temp8 = ACPI_ERST_ACTION_RESERVED; 928209746Sjkim } 929209746Sjkim 930209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstActions[Temp8]); 931209746Sjkim break; 932209746Sjkim 933209746Sjkim case ACPI_DMT_ERSTINST: 934209746Sjkim 935209746Sjkim /* ERST Instruction types */ 936209746Sjkim 937209746Sjkim Temp8 = *Target; 938209746Sjkim if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 939209746Sjkim { 940209746Sjkim Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 941209746Sjkim } 942209746Sjkim 943209746Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstInstructions[Temp8]); 944209746Sjkim break; 945209746Sjkim 946193529Sjkim case ACPI_DMT_HEST: 947193529Sjkim 948193529Sjkim /* HEST subtable types */ 949193529Sjkim 950193529Sjkim Temp16 = ACPI_GET16 (Target); 951193529Sjkim if (Temp16 > ACPI_HEST_TYPE_RESERVED) 952193529Sjkim { 953193529Sjkim Temp16 = ACPI_HEST_TYPE_RESERVED; 954193529Sjkim } 955193529Sjkim 956193529Sjkim AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]); 957193529Sjkim break; 958193529Sjkim 959193529Sjkim case ACPI_DMT_HESTNTFY: 960193529Sjkim 961193529Sjkim AcpiOsPrintf ("<Hardware Error Notification Structure>\n"); 962197104Sjkim AcpiDmDumpTable (TableLength, CurrentOffset, Target, 963197104Sjkim sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 964193529Sjkim AcpiOsPrintf ("\n"); 965193529Sjkim LastOutputBlankLine = TRUE; 966193529Sjkim break; 967193529Sjkim 968193529Sjkim case ACPI_DMT_HESTNTYP: 969193529Sjkim 970193529Sjkim /* HEST Notify types */ 971193529Sjkim 972193529Sjkim Temp8 = *Target; 973193529Sjkim if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 974193529Sjkim { 975193529Sjkim Temp8 = ACPI_HEST_NOTIFY_RESERVED; 976193529Sjkim } 977193529Sjkim 978193529Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]); 979193529Sjkim break; 980193529Sjkim 981167802Sjkim case ACPI_DMT_MADT: 982167802Sjkim 983167802Sjkim /* MADT subtable types */ 984167802Sjkim 985167802Sjkim Temp8 = *Target; 986167802Sjkim if (Temp8 > ACPI_MADT_TYPE_RESERVED) 987167802Sjkim { 988167802Sjkim Temp8 = ACPI_MADT_TYPE_RESERVED; 989167802Sjkim } 990167802Sjkim 991167802Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]); 992167802Sjkim break; 993167802Sjkim 994167802Sjkim case ACPI_DMT_SRAT: 995167802Sjkim 996167802Sjkim /* SRAT subtable types */ 997167802Sjkim 998167802Sjkim Temp8 = *Target; 999167802Sjkim if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 1000167802Sjkim { 1001167802Sjkim Temp8 = ACPI_SRAT_TYPE_RESERVED; 1002167802Sjkim } 1003167802Sjkim 1004167802Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]); 1005167802Sjkim break; 1006167802Sjkim 1007193529Sjkim case ACPI_DMT_FADTPM: 1008193529Sjkim 1009193529Sjkim /* FADT Preferred PM Profile names */ 1010193529Sjkim 1011193529Sjkim Temp8 = *Target; 1012193529Sjkim if (Temp8 > ACPI_FADT_PM_RESERVED) 1013193529Sjkim { 1014193529Sjkim Temp8 = ACPI_FADT_PM_RESERVED; 1015193529Sjkim } 1016193529Sjkim 1017193529Sjkim AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmFadtProfiles[Temp8]); 1018193529Sjkim break; 1019193529Sjkim 1020197104Sjkim case ACPI_DMT_IVRS: 1021197104Sjkim 1022197104Sjkim /* IVRS subtable types */ 1023197104Sjkim 1024197104Sjkim Temp8 = *Target; 1025197104Sjkim switch (Temp8) 1026197104Sjkim { 1027197104Sjkim case ACPI_IVRS_TYPE_HARDWARE: 1028197104Sjkim Name = AcpiDmIvrsSubnames[0]; 1029197104Sjkim break; 1030197104Sjkim 1031197104Sjkim case ACPI_IVRS_TYPE_MEMORY1: 1032197104Sjkim case ACPI_IVRS_TYPE_MEMORY2: 1033197104Sjkim case ACPI_IVRS_TYPE_MEMORY3: 1034197104Sjkim Name = AcpiDmIvrsSubnames[1]; 1035197104Sjkim break; 1036197104Sjkim 1037197104Sjkim default: 1038197104Sjkim Name = AcpiDmIvrsSubnames[2]; 1039197104Sjkim break; 1040197104Sjkim } 1041197104Sjkim 1042197104Sjkim AcpiOsPrintf ("%2.2X <%s>\n", *Target, Name); 1043197104Sjkim break; 1044197104Sjkim 1045167802Sjkim case ACPI_DMT_EXIT: 1046193529Sjkim return (AE_OK); 1047167802Sjkim 1048167802Sjkim default: 1049167802Sjkim ACPI_ERROR ((AE_INFO, 1050204773Sjkim "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 1051193529Sjkim return (AE_SUPPORT); 1052167802Sjkim } 1053167802Sjkim } 1054193529Sjkim 1055193529Sjkim if (TableOffset && !SubtableLength) 1056193529Sjkim { 1057193529Sjkim /* If this table is not the main table, subtable must have valid length */ 1058193529Sjkim 1059193529Sjkim AcpiOsPrintf ("Invalid zero length subtable\n"); 1060193529Sjkim return (AE_BAD_DATA); 1061193529Sjkim } 1062193529Sjkim 1063193529Sjkim return (AE_OK); 1064167802Sjkim} 1065167802Sjkim 1066167802Sjkim 1067167802Sjkim/******************************************************************************* 1068167802Sjkim * 1069167802Sjkim * FUNCTION: AcpiDmCheckAscii 1070167802Sjkim * 1071167802Sjkim * PARAMETERS: Name - Ascii string 1072167802Sjkim * Count - Number of characters to check 1073167802Sjkim * 1074167802Sjkim * RETURN: None 1075167802Sjkim * 1076167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable 1077167802Sjkim * Ascii characters. Sets non-printable and null chars to <space>. 1078167802Sjkim * 1079167802Sjkim ******************************************************************************/ 1080167802Sjkim 1081167802Sjkimstatic void 1082167802SjkimAcpiDmCheckAscii ( 1083167802Sjkim UINT8 *Name, 1084197104Sjkim char *RepairedName, 1085167802Sjkim UINT32 Count) 1086167802Sjkim{ 1087167802Sjkim UINT32 i; 1088167802Sjkim 1089167802Sjkim 1090167802Sjkim for (i = 0; i < Count; i++) 1091167802Sjkim { 1092198237Sjkim RepairedName[i] = (char) Name[i]; 1093197104Sjkim 1094197104Sjkim if (!Name[i]) 1095167802Sjkim { 1096197104Sjkim return; 1097167802Sjkim } 1098197104Sjkim if (!isprint (Name[i])) 1099197104Sjkim { 1100197104Sjkim RepairedName[i] = ' '; 1101197104Sjkim } 1102167802Sjkim } 1103167802Sjkim} 1104