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