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