1 /****************************************************************************** 2 * 3 * Module Name: dmtable - Support for ACPI tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2026, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "acpi.h" 45 #include "accommon.h" 46 #include "acdisasm.h" 47 #include "actables.h" 48 #include "aslcompiler.h" 49 50 /* This module used for application-level code only */ 51 52 #define _COMPONENT ACPI_CA_DISASSEMBLER 53 ACPI_MODULE_NAME ("dmtable") 54 55 const AH_TABLE * 56 AcpiAhGetTableInfo ( 57 char *Signature); 58 59 60 /* Common format strings for commented values */ 61 62 #define UINT8_FORMAT "%2.2X [%s]\n" 63 #define UINT8_FORMAT_NO_NEWLINE "%2.2X [%s]" 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 70 static const char *AcpiDmAestResourceNames[] = 71 { 72 "Cache Resource", 73 "TLB Resource", 74 "Generic Resource", 75 "Unknown Resource Type" /* Reserved */ 76 }; 77 78 static const char *AcpiDmAestSubnames[] = 79 { 80 "Processor Error Node", 81 "Memory Error Node", 82 "SMMU Error Node", 83 "Vendor-defined Error Node", 84 "GIC Error Node", 85 "PCIE Error Node", 86 "PROXY Error Node", 87 "Unknown Subtable Type" /* Reserved */ 88 }; 89 90 static const char *AcpiDmAestCacheNames[] = 91 { 92 "Data Cache", 93 "Instruction Cache", 94 "Unified Cache", 95 "Unknown Cache Type" /* Reserved */ 96 }; 97 98 static const char *AcpiDmAestGicNames[] = 99 { 100 "GIC CPU", 101 "GIC Distributor", 102 "GIC Redistributor", 103 "GIC ITS", 104 "Unknown GIC Interface Type" /* Reserved */ 105 }; 106 107 static const char *AcpiDmAestXfaceNames[] = 108 { 109 "System Register Interface", 110 "Memory Mapped Interface", 111 "Single Record Memory Mapped Interface", 112 "Unknown Interface Type" /* Reserved */ 113 }; 114 115 static const char *AcpiDmAestXruptNames[] = 116 { 117 "Fault Handling Interrupt", 118 "Error Recovery Interrupt", 119 "Unknown Interrupt Type" /* Reserved */ 120 }; 121 122 static const char *AcpiDmAsfSubnames[] = 123 { 124 "ASF Information", 125 "ASF Alerts", 126 "ASF Remote Control", 127 "ASF RMCP Boot Options", 128 "ASF Address", 129 "Unknown Subtable Type" /* Reserved */ 130 }; 131 132 static const char *AcpiDmAsptSubnames[] = 133 { 134 "ASPT Global Registers", 135 "ASPT SEV Mailbox Registers", 136 "ASPT ACPI Mailbox Registers", 137 "Unknown Subtable Type" /* Reserved */ 138 }; 139 140 static const char *AcpiDmCdatSubnames[] = 141 { 142 "Device Scoped Memory Affinity Structure (DSMAS)", 143 "Device scoped Latency and Bandwidth Information Structure (DSLBIS)", 144 "Device Scoped Memory Side Cache Information Structure (DSMSCIS)", 145 "Device Scoped Initiator Structure (DSIS)", 146 "Device Scoped EFI Memory Type Structure (DSEMTS)", 147 "Switch Scoped Latency and Bandwidth Information Structure (SSLBIS)", 148 "Unknown Subtable Type" /* Reserved */ 149 }; 150 151 static const char *AcpiDmCedtSubnames[] = 152 { 153 "CXL Host Bridge Structure", 154 "CXL Fixed Memory Window Structure", 155 "CXL XOR Interleave Math Structure", 156 "Unknown Subtable Type" /* Reserved */ 157 }; 158 159 static const char *AcpiDmDmarSubnames[] = 160 { 161 "Hardware Unit Definition", 162 "Reserved Memory Region", 163 "Root Port ATS Capability", 164 "Remapping Hardware Static Affinity", 165 "ACPI Namespace Device Declaration", 166 "SoC Integrated Address Translation Cache", 167 "SoC Integrated Device Property", 168 "Unknown Subtable Type" /* Reserved */ 169 }; 170 171 static const char *AcpiDmDmarScope[] = 172 { 173 "Reserved value", 174 "PCI Endpoint Device", 175 "PCI Bridge Device", 176 "IOAPIC Device", 177 "Message-capable HPET Device", 178 "Namespace Device", 179 "Unknown Scope Type" /* Reserved */ 180 }; 181 182 static const char *AcpiDmEinjActions[] = 183 { 184 "Begin Operation", 185 "Get Trigger Table", 186 "Set Error Type", 187 "Get Error Type", 188 "End Operation", 189 "Execute Operation", 190 "Check Busy Status", 191 "Get Command Status", 192 "Set Error Type With Address", 193 "Get Execute Timings", 194 "Unassigned", 195 "Unassigned", 196 "Unassigned", 197 "Unassigned", 198 "Unassigned", 199 "Unassigned", 200 "EinjV2 Set Error Type(deprecated)", 201 "EinjV2 Get Error Type", 202 "Unknown Action" 203 }; 204 205 static const char *AcpiDmEinjInstructions[] = 206 { 207 "Read Register", 208 "Read Register Value", 209 "Write Register", 210 "Write Register Value", 211 "Noop", 212 "Flush Cacheline", 213 "Unknown Instruction" 214 }; 215 216 static const char *AcpiDmErdtSubnames[] = 217 { 218 "RMDD", 219 "CACD", 220 "DACD", 221 "CMRC", 222 "MMRC", 223 "MARC", 224 "CARC", 225 "CMRD", 226 "IBRD", 227 "IBAD", 228 "CARD", 229 "RESERVED" 230 }; 231 232 static const char *AcpiDmErstActions[] = 233 { 234 "Begin Write Operation", 235 "Begin Read Operation", 236 "Begin Clear Operation", 237 "End Operation", 238 "Set Record Offset", 239 "Execute Operation", 240 "Check Busy Status", 241 "Get Command Status", 242 "Get Record Identifier", 243 "Set Record Identifier", 244 "Get Record Count", 245 "Begin Dummy Write", 246 "Unused/Unknown Action", 247 "Get Error Address Range", 248 "Get Error Address Length", 249 "Get Error Attributes", 250 "Execute Timings", 251 "Unknown Action" 252 }; 253 254 static const char *AcpiDmErstInstructions[] = 255 { 256 "Read Register", 257 "Read Register Value", 258 "Write Register", 259 "Write Register Value", 260 "Noop", 261 "Load Var1", 262 "Load Var2", 263 "Store Var1", 264 "Add", 265 "Subtract", 266 "Add Value", 267 "Subtract Value", 268 "Stall", 269 "Stall While True", 270 "Skip Next If True", 271 "GoTo", 272 "Set Source Address", 273 "Set Destination Address", 274 "Move Data", 275 "Unknown Instruction" 276 }; 277 278 static const char *AcpiDmGtdtSubnames[] = 279 { 280 "Generic Timer Block", 281 "Generic Watchdog Timer", 282 "Unknown Subtable Type" /* Reserved */ 283 }; 284 285 static const char *AcpiDmHestSubnames[] = 286 { 287 "IA-32 Machine Check Exception", 288 "IA-32 Corrected Machine Check", 289 "IA-32 Non-Maskable Interrupt", 290 "Unknown Subtable Type", /* 3 - Reserved */ 291 "Unknown Subtable Type", /* 4 - Reserved */ 292 "Unknown Subtable Type", /* 5 - Reserved */ 293 "PCI Express Root Port AER", 294 "PCI Express AER (AER Endpoint)", 295 "PCI Express/PCI-X Bridge AER", 296 "Generic Hardware Error Source", 297 "Generic Hardware Error Source V2", 298 "IA-32 Deferred Machine Check", 299 "Unknown Subtable Type" /* Reserved */ 300 }; 301 302 static const char *AcpiDmHestNotifySubnames[] = 303 { 304 "Polled", 305 "External Interrupt", 306 "Local Interrupt", 307 "SCI", 308 "NMI", 309 "CMCI", /* ACPI 5.0 */ 310 "MCE", /* ACPI 5.0 */ 311 "GPIO", /* ACPI 6.0 */ 312 "SEA", /* ACPI 6.1 */ 313 "SEI", /* ACPI 6.1 */ 314 "GSIV", /* ACPI 6.1 */ 315 "Software Delegated Exception", /* ACPI 6.2 */ 316 "Unknown Notify Type" /* Reserved */ 317 }; 318 319 static const char *AcpiDmHmatSubnames[] = 320 { 321 "Memory Proximity Domain Attributes", 322 "System Locality Latency and Bandwidth Information", 323 "Memory Side Cache Information", 324 "Unknown Structure Type" /* Reserved */ 325 }; 326 327 static const char *AcpiDmMadtSubnames[] = 328 { 329 "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */ 330 "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */ 331 "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */ 332 "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */ 333 "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */ 334 "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */ 335 "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */ 336 "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */ 337 "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */ 338 "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */ 339 "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */ 340 "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */ 341 "Generic Interrupt Distributor", /* ACPI_MADT_GENERIC_DISTRIBUTOR */ 342 "Generic MSI Frame", /* ACPI_MADT_GENERIC_MSI_FRAME */ 343 "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */ 344 "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */ 345 "Mutiprocessor Wakeup", /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */ 346 "CPU Core Interrupt Controller", /* ACPI_MADT_TYPE_CORE_PIC */ 347 "Legacy I/O Interrupt Controller", /* ACPI_MADT_TYPE_LIO_PIC */ 348 "HT Interrupt Controller", /* ACPI_MADT_TYPE_HT_PIC */ 349 "Extend I/O Interrupt Controller", /* ACPI_MADT_TYPE_EIO_PIC */ 350 "MSI Interrupt Controller", /* ACPI_MADT_TYPE_MSI_PIC */ 351 "Bridge I/O Interrupt Controller", /* ACPI_MADT_TYPE_BIO_PIC */ 352 "LPC Interrupt Controller", /* ACPI_MADT_TYPE_LPC_PIC */ 353 "RISC-V Interrupt Controller", /* ACPI_MADT_TYPE_RINTC */ 354 "RISC-V Incoming MSI Controller", /* ACPI_MADT_TYPE_IMSIC */ 355 "RISC-V APLIC Controller", /* ACPI_MADT_TYPE_APLIC */ 356 "RISC-V PLIC Controller", /* ACPI_MADT_TYPE_PLIC */ 357 "Generic Interrupt v5 Router", /* ACPI_MADT_TYPE_GICV5_IRS */ 358 "Generic Interrupt v5 Translator Config", /* ACPI_MADT_TYPE_GICV5_ITS */ 359 "Generic Interrupt v5 Translator Entry", /* ACPI_MADT_TYPE_GICV5_ITS_TRANSLATE */ 360 "Unknown Subtable Type", /* Reserved */ 361 "Types 80-FF are used for OEM data" /* Reserved for OEM data */ 362 }; 363 364 static const char *AcpiDmMpamSubnames[] = 365 { 366 "Processor cache", /* ACPI_MPAM_LOCATION_TYPE_PROCESSOR_CACHE */ 367 "Memory", /* ACPI_MPAM_LOCATION_TYPE_MEMORY */ 368 "SMMU", /* ACPI_MPAM_LOCATION_TYPE_SMMU */ 369 "Memory-side cache", /* ACPI_MPAM_LOCATION_TYPE_MEMORY_CACHE */ 370 "ACPI device", /* ACPI_MPAM_LOCATION_TYPE_ACPI_DEVICE */ 371 "Interconnect", /* ACPI_MPAM_LOCATION_TYPE_INTERCONNECT */ 372 "Unknown" /* ACPI_MPAM_LOCATION_TYPE_UNKNOWN */ 373 }; 374 375 static const char *AcpiDmNfitSubnames[] = 376 { 377 "System Physical Address Range", /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */ 378 "Memory Range Map", /* ACPI_NFIT_TYPE_MEMORY_MAP */ 379 "Interleave Info", /* ACPI_NFIT_TYPE_INTERLEAVE */ 380 "SMBIOS Information", /* ACPI_NFIT_TYPE_SMBIOS */ 381 "NVDIMM Control Region", /* ACPI_NFIT_TYPE_CONTROL_REGION */ 382 "NVDIMM Block Data Window Region", /* ACPI_NFIT_TYPE_DATA_REGION */ 383 "Flush Hint Address", /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */ 384 "Platform Capabilities", /* ACPI_NFIT_TYPE_CAPABILITIES */ 385 "Unknown Subtable Type" /* Reserved */ 386 }; 387 388 static const char *AcpiDmPcctSubnames[] = 389 { 390 "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */ 391 "HW-Reduced Comm Subspace", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */ 392 "HW-Reduced Comm Subspace Type2", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */ 393 "Extended PCC Master Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */ 394 "Extended PCC Slave Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */ 395 "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */ 396 "Unknown Subtable Type" /* Reserved */ 397 }; 398 399 static const char *AcpiDmPhatSubnames[] = 400 { 401 "Firmware Version Data", /* ACPI_PHAT_TYPE_FW_VERSION_DATA */ 402 "Firmware Health Data", /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */ 403 "Unknown Subtable Type" /* Reserved */ 404 }; 405 406 static const char *AcpiDmPmttSubnames[] = 407 { 408 "Socket", /* ACPI_PMTT_TYPE_SOCKET */ 409 "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */ 410 "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */ 411 "Unknown Subtable Type", /* Reserved */ 412 "Vendor Specific" /* ACPI_PMTT_TYPE_VENDOR */ 413 }; 414 415 static const char *AcpiDmPpttSubnames[] = 416 { 417 "Processor Hierarchy Node", /* ACPI_PPTT_TYPE_PROCESSOR */ 418 "Cache Type", /* ACPI_PPTT_TYPE_CACHE */ 419 "ID", /* ACPI_PPTT_TYPE_ID */ 420 "Unknown Subtable Type" /* Reserved */ 421 }; 422 423 static const char *AcpiDmRgrtSubnames[] = 424 { 425 "Unknown/Reserved Image Type", /* ACPI_RGRT_TYPE_RESERVED0 */ 426 "Type PNG" /* ACPI_RGRT_IMAGE_TYPE_PNG */ 427 }; 428 429 static const char *AcpiDmSdevSubnames[] = 430 { 431 "Namespace Device", /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */ 432 "PCIe Endpoint Device", /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */ 433 "Unknown Subtable Type" /* Reserved */ 434 }; 435 436 static const char *AcpiDmSratSubnames[] = 437 { 438 "Processor Local APIC/SAPIC Affinity", 439 "Memory Affinity", 440 "Processor Local x2APIC Affinity", 441 "GICC Affinity", 442 "GIC ITS Affinity", /* Acpi 6.2 */ 443 "Generic Initiator Affinity", /* Acpi 6.3 */ 444 "Generic Port Affinity", /* Acpi 6.4 */ 445 "RINTC Affinity", /* Acpi 6.6 */ 446 "Unknown Subtable Type" /* Reserved */ 447 }; 448 449 static const char *AcpiDmTpm2Subnames[] = 450 { 451 "Illegal Start Method value", 452 "Reserved", 453 "ACPI Start Method", 454 "Reserved", 455 "Reserved", 456 "Reserved", 457 "Memory Mapped I/O", 458 "Command Response Buffer", 459 "Command Response Buffer with ACPI Start Method", 460 "Reserved", 461 "Reserved", 462 "Command Response Buffer with ARM SMC", 463 "FIFO over I2C", 464 "Command Response Buffer with AMD Mailbox", 465 "Reserved", 466 "Command Response Buffer with ARM Framework-A", 467 "Unknown Subtable Type" /* Reserved */ 468 }; 469 470 static const char *AcpiDmIovtSubnames[] = 471 { 472 "IOMMUv1", 473 "Unknown Subtable Type" /* Reserved */ 474 }; 475 476 static const char *AcpiDmIovtdevSubnames[] = 477 { 478 "A single PCI device", 479 "Start of range", 480 "End of range", 481 "Unknown Subtable Type" /* Reserved */ 482 }; 483 484 static const char *AcpiDmIvrsSubnames[] = 485 { 486 "Hardware Definition Block (IVHD)", 487 "Hardware Definition Block - Mixed Format (IVHD)", 488 "Memory Definition Block (IVMD)", 489 "Unknown/Reserved Subtable Type" /* Reserved */ 490 }; 491 492 static const char *AcpiDmIvrsDevEntryNames[] = 493 { 494 "Unknown/Reserved Device Entry Type", /* 0- Reserved */ 495 "Device Entry: Select All Devices", /* 1 */ 496 "Device Entry: Select One Device", /* 2 */ 497 "Device Entry: Start of Range", /* 3 */ 498 "Device Entry: End of Range", /* 4 */ 499 "Device Entry: Alias Select", /* 66 */ 500 "Device Entry: Alias Start of Range", /* 67 */ 501 "Unknown/Reserved Device Entry Type", /* 68- Reserved */ 502 "Unknown/Reserved Device Entry Type", /* 69- Reserved */ 503 "Device Entry: Extended Select", /* 70 */ 504 "Device Entry: Extended Start of Range", /* 71 */ 505 "Device Entry: Special Device", /* 72 */ 506 "Device Entry: ACPI HID Named Device", /* 240 */ 507 "Unknown/Reserved Device Entry Type" /* Reserved */ 508 }; 509 510 static const char *AcpiDmLpitSubnames[] = 511 { 512 "Native C-state Idle Structure", 513 "Unknown Subtable Type" /* Reserved */ 514 }; 515 516 static const char *AcpiDmViotSubnames[] = 517 { 518 "Unknown Subtable Type", /* 0 -Reserved */ 519 "PCI Range", 520 "MMIO Endpoint", 521 "VirtIO-PCI IOMMU", 522 "VirtIO-MMIO IOMMU", 523 "Unknown Subtable Type" /* Reserved */ 524 }; 525 526 #define ACPI_FADT_PM_RESERVED 9 527 528 static const char *AcpiDmFadtProfiles[] = 529 { 530 "Unspecified", 531 "Desktop", 532 "Mobile", 533 "Workstation", 534 "Enterprise Server", 535 "SOHO Server", 536 "Appliance PC", 537 "Performance Server", 538 "Tablet", 539 "Unknown Profile Type" 540 }; 541 542 #define ACPI_GAS_WIDTH_RESERVED 5 543 544 static const char *AcpiDmGasAccessWidth[] = 545 { 546 "Undefined/Legacy", 547 "Byte Access:8", 548 "Word Access:16", 549 "DWord Access:32", 550 "QWord Access:64", 551 "Unknown Width Encoding" 552 }; 553 554 static const char *AcpiDmRhctSubnames[] = 555 { 556 "RISC-V ISA string structure", /* ACPI_RHCT_ISA_STRING */ 557 "RISC-V CMO node structure", /* ACPI_RHCT_CMO_NODE */ 558 "RISC-V MMU node structure", /* ACPI_RHCT_MMU_NODE */ 559 "RISC-V Hart Info structure", /* ACPI_RHCT_HART_INFO */ 560 }; 561 562 563 /******************************************************************************* 564 * 565 * ACPI Table Data, indexed by signature. 566 * 567 * Each entry contains: Signature, Table Info, Handler, DtHandler, 568 * Template, Description 569 * 570 * Simple tables have only a TableInfo structure, complex tables have a 571 * handler. This table must be NULL terminated. RSDP and FACS are 572 * special-cased elsewhere. 573 * 574 * Note: Any tables added here should be duplicated within 575 * AcpiGbl_SupportedTables in the file common/ahtable.c 576 * 577 ******************************************************************************/ 578 579 const ACPI_DMTABLE_DATA AcpiDmTableData[] = 580 { 581 {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest}, 582 {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi}, 583 {ACPI_SIG_APMT, NULL, AcpiDmDumpApmt, DtCompileApmt, TemplateApmt}, 584 {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf}, 585 {ACPI_SIG_ASPT, NULL, AcpiDmDumpAspt, DtCompileAspt, TemplateAspt}, 586 {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat}, 587 {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, 588 {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt}, 589 {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot}, 590 {ACPI_SIG_CCEL, AcpiDmTableInfoCcel, NULL, NULL, TemplateCcel}, 591 {ACPI_SIG_CDAT, NULL, AcpiDmDumpCdat, NULL, TemplateCdat}, 592 {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt}, 593 {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep}, 594 {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt}, 595 {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2, AcpiDmDumpDbg2, DtCompileDbg2, TemplateDbg2}, 596 {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp}, 597 {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar}, 598 {ACPI_SIG_DRTM, NULL, AcpiDmDumpDrtm, DtCompileDrtm, TemplateDrtm}, 599 {ACPI_SIG_DTPR, NULL, AcpiDmDumpDtpr, DtCompileDtpr, TemplateDtpr}, 600 {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt}, 601 {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj}, 602 {ACPI_SIG_ERDT, NULL, AcpiDmDumpErdt, DtCompileErdt, TemplateErdt}, 603 {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst}, 604 {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt}, 605 {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt}, 606 {ACPI_SIG_GTDT, NULL, AcpiDmDumpGtdt, DtCompileGtdt, TemplateGtdt}, 607 {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest}, 608 {ACPI_SIG_HMAT, NULL, AcpiDmDumpHmat, DtCompileHmat, TemplateHmat}, 609 {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet}, 610 {ACPI_SIG_IORT, NULL, AcpiDmDumpIort, DtCompileIort, TemplateIort}, 611 {ACPI_SIG_IOVT, AcpiDmTableInfoIovt, AcpiDmDumpIovt, DtCompileIovt, TemplateIovt}, 612 {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs}, 613 {ACPI_SIG_LPIT, NULL, AcpiDmDumpLpit, DtCompileLpit, TemplateLpit}, 614 {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt}, 615 {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg}, 616 {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi}, 617 {ACPI_SIG_MPAM, NULL, AcpiDmDumpMpam, DtCompileMpam, TemplateMpam}, 618 {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst}, 619 {ACPI_SIG_MRRM, NULL, AcpiDmDumpMrrm, DtCompileMrrm, TemplateMrrm}, 620 {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct}, 621 {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm}, 622 {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, 623 {ACPI_SIG_NHLT, NULL, NULL, NULL, NULL}, 624 {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, 625 {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, 626 {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat}, 627 {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt}, 628 {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt}, 629 {ACPI_SIG_PRMT, NULL, AcpiDmDumpPrmt, DtCompilePrmt, TemplatePrmt}, 630 {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf}, 631 {ACPI_SIG_RAS2, AcpiDmTableInfoRas2, AcpiDmDumpRas2, DtCompileRas2, TemplateRas2}, 632 {ACPI_SIG_RGRT, NULL, AcpiDmDumpRgrt, DtCompileRgrt, TemplateRgrt}, 633 {ACPI_SIG_RHCT, NULL, AcpiDmDumpRhct, DtCompileRhct, TemplateRhct}, 634 {ACPI_SIG_RIMT, NULL, AcpiDmDumpRimt, DtCompileRimt, TemplateRimt}, 635 {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt}, 636 {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt}, 637 {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst}, 638 {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei}, 639 {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev}, 640 {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic}, 641 {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit}, 642 {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr}, 643 {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi}, 644 {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat}, 645 {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, 646 {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl}, 647 {ACPI_SIG_SWFT, AcpiDmTableInfoSwft, AcpiDmDumpSwft, DtCompileSwft, TemplateSwft}, 648 {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, 649 {ACPI_SIG_TDEL, AcpiDmTableInfoTdel, NULL, NULL, TemplateTdel}, 650 {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, 651 {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, 652 {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot}, 653 {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet}, 654 {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat}, 655 {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt}, 656 {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt}, 657 {ACPI_SIG_WPBT, NULL, AcpiDmDumpWpbt, DtCompileWpbt, TemplateWpbt}, 658 {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt, NULL, NULL, TemplateWsmt}, 659 {ACPI_SIG_XENV, AcpiDmTableInfoXenv, NULL, NULL, TemplateXenv}, 660 {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt}, 661 {NULL, NULL, NULL, NULL, NULL} 662 }; 663 664 665 /******************************************************************************* 666 * 667 * FUNCTION: AcpiDmGetTableData 668 * 669 * PARAMETERS: Signature - ACPI signature (4 chars) to match 670 * 671 * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 672 * 673 * DESCRIPTION: Find a match in the global table of supported ACPI tables 674 * 675 ******************************************************************************/ 676 677 const ACPI_DMTABLE_DATA * 678 AcpiDmGetTableData ( 679 char *Signature) 680 { 681 const ACPI_DMTABLE_DATA *Info; 682 683 684 for (Info = AcpiDmTableData; Info->Signature; Info++) 685 { 686 if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature)) 687 { 688 return (Info); 689 } 690 } 691 692 return (NULL); 693 } 694 695 696 /******************************************************************************* 697 * 698 * FUNCTION: AcpiDmDumpDataTable 699 * 700 * PARAMETERS: Table - An ACPI table 701 * 702 * RETURN: None. 703 * 704 * DESCRIPTION: Format the contents of an ACPI data table (any table other 705 * than an SSDT or DSDT that does not contain executable AML code) 706 * 707 ******************************************************************************/ 708 709 void 710 AcpiDmDumpDataTable ( 711 ACPI_TABLE_HEADER *Table) 712 { 713 ACPI_STATUS Status; 714 const ACPI_DMTABLE_DATA *TableData; 715 UINT32 Length; 716 717 718 /* Ignore tables that contain AML */ 719 720 if (AcpiUtIsAmlTable (Table)) 721 { 722 if (AslGbl_VerboseTemplates) 723 { 724 /* Dump the raw table data */ 725 726 Length = Table->Length; 727 728 AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n", 729 ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 730 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 731 Length, DB_BYTE_DISPLAY, 0); 732 AcpiOsPrintf (" */\n"); 733 } 734 return; 735 } 736 737 /* 738 * Handle tables that don't use the common ACPI table header structure. 739 * Currently, these are the FACS, RSDP, S3PT and CDAT. 740 */ 741 if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) 742 { 743 Length = Table->Length; 744 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 745 if (ACPI_FAILURE (Status)) 746 { 747 return; 748 } 749 } 750 else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, 751 Table)->Signature)) 752 { 753 Length = AcpiDmDumpRsdp (Table); 754 } 755 else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT)) 756 { 757 Length = AcpiDmDumpS3pt (Table); 758 } 759 else if (!AcpiUtValidNameseg (Table->Signature)) 760 { 761 /* 762 * For CDAT we are assuming that there should be at least one non-ASCII 763 * byte in the (normally) 4-character Signature field (at least the 764 * high-order byte should be zero). 765 */ 766 if (AcpiGbl_CDAT) 767 { 768 /* 769 * Invalid signature and <-ds CDAT> was specified on the command line. 770 * Therefore, we have a CDAT table. 771 */ 772 AcpiDmDumpCdat (Table); 773 } 774 else 775 { 776 fprintf (stderr, "Table has an invalid signature\n"); 777 } 778 779 return; 780 } 781 else 782 { 783 /* 784 * All other tables must use the common ACPI table header, dump it now 785 */ 786 Length = Table->Length; 787 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 788 if (ACPI_FAILURE (Status)) 789 { 790 return; 791 } 792 AcpiOsPrintf ("\n"); 793 794 /* Match signature and dispatch appropriately */ 795 796 TableData = AcpiDmGetTableData (Table->Signature); 797 if (!TableData) 798 { 799 if (!strncmp (Table->Signature, "OEM", 3)) 800 { 801 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 802 Table->Signature); 803 } 804 else 805 { 806 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n", 807 Table->Signature); 808 809 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ", 810 Table->Signature); 811 812 if (!AcpiGbl_ForceAmlDisassembly) 813 { 814 fprintf (stderr, "decoding ACPI table header only\n"); 815 } 816 else 817 { 818 fprintf (stderr, "assuming table contains valid AML code\n"); 819 } 820 } 821 } 822 else if (TableData->TableHandler) 823 { 824 /* Complex table, has a handler */ 825 826 TableData->TableHandler (Table); 827 } 828 else if (TableData->TableInfo) 829 { 830 /* Simple table, just walk the info table */ 831 832 Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 833 if (ACPI_FAILURE (Status)) 834 { 835 return; 836 } 837 } 838 } 839 840 if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates) 841 { 842 /* Dump the raw table data */ 843 844 AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 845 ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 846 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 847 Length, DB_BYTE_DISPLAY, 0); 848 } 849 } 850 851 852 /******************************************************************************* 853 * 854 * FUNCTION: AcpiDmLineHeader 855 * 856 * PARAMETERS: Offset - Current byte offset, from table start 857 * ByteLength - Length of the field in bytes, 0 for flags 858 * Name - Name of this field 859 * 860 * RETURN: None 861 * 862 * DESCRIPTION: Utility routines for formatting output lines. Displays the 863 * current table offset in hex and decimal, the field length, 864 * and the field name. 865 * 866 ******************************************************************************/ 867 868 void 869 AcpiDmLineHeader ( 870 UINT32 Offset, 871 UINT32 ByteLength, 872 char *Name) 873 { 874 875 /* Allow a null name for fields that span multiple lines (large buffers) */ 876 877 if (!Name) 878 { 879 Name = ""; 880 } 881 882 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */ 883 { 884 if (ByteLength) 885 { 886 AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); 887 } 888 else 889 { 890 if (*Name) 891 { 892 AcpiOsPrintf ("%41s : ", Name); 893 } 894 else 895 { 896 AcpiOsPrintf ("%41s ", Name); 897 } 898 } 899 } 900 else /* Normal disassembler or verbose template */ 901 { 902 if (ByteLength) 903 { 904 AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ", 905 Offset, Offset, ByteLength, Name); 906 } 907 else 908 { 909 if (*Name) 910 { 911 AcpiOsPrintf ("%44s : ", Name); 912 } 913 else 914 { 915 AcpiOsPrintf ("%44s ", Name); 916 } 917 } 918 } 919 } 920 921 void 922 AcpiDmLineHeader2 ( 923 UINT32 Offset, 924 UINT32 ByteLength, 925 char *Name, 926 UINT32 Value) 927 { 928 929 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */ 930 { 931 if (ByteLength) 932 { 933 AcpiOsPrintf ("[%.4d] %30s %3d : ", 934 ByteLength, Name, Value); 935 } 936 else 937 { 938 AcpiOsPrintf ("%36s % 3d : ", 939 Name, Value); 940 } 941 } 942 else /* Normal disassembler or verbose template */ 943 { 944 if (ByteLength) 945 { 946 AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ", 947 Offset, Offset, ByteLength, Name, Value); 948 } 949 else 950 { 951 AcpiOsPrintf ("[%3.3Xh %4.4u ] %24s %3d : ", 952 Offset, Offset, Name, Value); 953 } 954 } 955 } 956 957 958 /******************************************************************************* 959 * 960 * FUNCTION: AcpiDmDumpTable 961 * 962 * PARAMETERS: TableLength - Length of the entire ACPI table 963 * TableOffset - Starting offset within the table for this 964 * sub-descriptor (0 if main table) 965 * Table - The ACPI table 966 * SubtableLength - Length of this sub-descriptor 967 * Info - Info table for this ACPI table 968 * 969 * RETURN: Status 970 * 971 * DESCRIPTION: Display ACPI table contents by walking the Info table. 972 * 973 * Note: This function must remain in sync with DtGetFieldLength. 974 * 975 ******************************************************************************/ 976 977 ACPI_STATUS 978 AcpiDmDumpTable ( 979 UINT32 TableLength, 980 UINT32 TableOffset, 981 void *Table, 982 UINT32 SubtableLength, 983 ACPI_DMTABLE_INFO *Info) 984 { 985 UINT8 *Target; 986 UINT32 CurrentOffset; 987 UINT32 ByteLength; 988 UINT8 Temp8; 989 UINT16 Temp16; 990 UINT32 Temp32; 991 UINT64 Value; 992 const AH_TABLE *TableData; 993 const char *Name; 994 BOOLEAN LastOutputBlankLine = FALSE; 995 ACPI_STATUS Status; 996 char RepairedName[8]; 997 998 999 if (!Info) 1000 { 1001 AcpiOsPrintf ("Display not implemented\n"); 1002 return (AE_NOT_IMPLEMENTED); 1003 } 1004 1005 /* Walk entire Info table; Null name terminates */ 1006 1007 for (; Info->Name; Info++) 1008 { 1009 /* 1010 * Target points to the field within the ACPI Table. CurrentOffset is 1011 * the offset of the field from the start of the main table. 1012 */ 1013 Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 1014 CurrentOffset = TableOffset + Info->Offset; 1015 1016 /* Check for beyond subtable end or (worse) beyond EOT */ 1017 1018 if (SubtableLength && (Info->Offset > SubtableLength)) 1019 { 1020 AcpiOsPrintf ( 1021 "/**** ACPI subtable terminates early (Len %u) - " 1022 "may be older version (dump table) */\n", SubtableLength); 1023 1024 /* Move on to next subtable */ 1025 1026 return (AE_OK); 1027 } 1028 1029 if (CurrentOffset >= TableLength) 1030 { 1031 AcpiOsPrintf ( 1032 "/**** ACPI table terminates " 1033 "in the middle of a data structure! (dump table)\n" 1034 "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength); 1035 return (AE_BAD_DATA); 1036 } 1037 1038 /* Generate the byte length for this field */ 1039 1040 switch (Info->Opcode) 1041 { 1042 case ACPI_DMT_UINT8: 1043 case ACPI_DMT_CHKSUM: 1044 case ACPI_DMT_SPACEID: 1045 case ACPI_DMT_ACCWIDTH: 1046 case ACPI_DMT_CEDT: 1047 case ACPI_DMT_IVRS: 1048 case ACPI_DMT_IVRS_DE: 1049 case ACPI_DMT_GTDT: 1050 case ACPI_DMT_MADT: 1051 case ACPI_DMT_MPAM_LOCATOR: 1052 case ACPI_DMT_PCCT: 1053 case ACPI_DMT_PMTT: 1054 case ACPI_DMT_PPTT: 1055 case ACPI_DMT_RGRT: 1056 case ACPI_DMT_SDEV: 1057 case ACPI_DMT_SRAT: 1058 case ACPI_DMT_AEST: 1059 case ACPI_DMT_AEST_RES: 1060 case ACPI_DMT_AEST_XFACE: 1061 case ACPI_DMT_AEST_XRUPT: 1062 case ACPI_DMT_ASF: 1063 case ACPI_DMT_CDAT: 1064 case ACPI_DMT_HESTNTYP: 1065 case ACPI_DMT_FADTPM: 1066 case ACPI_DMT_EINJACT: 1067 case ACPI_DMT_EINJINST: 1068 case ACPI_DMT_ERSTACT: 1069 case ACPI_DMT_ERSTINST: 1070 case ACPI_DMT_DMAR_SCOPE: 1071 case ACPI_DMT_IOVTDEV: 1072 case ACPI_DMT_VIOT: 1073 1074 ByteLength = 1; 1075 break; 1076 1077 case ACPI_DMT_ASPT: 1078 case ACPI_DMT_UINT16: 1079 case ACPI_DMT_DMAR: 1080 case ACPI_DMT_ERDT: 1081 case ACPI_DMT_HEST: 1082 case ACPI_DMT_HMAT: 1083 case ACPI_DMT_IOVT: 1084 case ACPI_DMT_NFIT: 1085 case ACPI_DMT_PHAT: 1086 case ACPI_DMT_RHCT: 1087 1088 ByteLength = 2; 1089 break; 1090 1091 case ACPI_DMT_UINT24: 1092 1093 ByteLength = 3; 1094 break; 1095 1096 case ACPI_DMT_UINT32: 1097 case ACPI_DMT_AEST_CACHE: 1098 case ACPI_DMT_AEST_GIC: 1099 case ACPI_DMT_NAME4: 1100 case ACPI_DMT_SIG: 1101 case ACPI_DMT_LPIT: 1102 case ACPI_DMT_TPM2: 1103 1104 ByteLength = 4; 1105 break; 1106 1107 case ACPI_DMT_UINT40: 1108 1109 ByteLength = 5; 1110 break; 1111 1112 case ACPI_DMT_UINT48: 1113 case ACPI_DMT_NAME6: 1114 1115 ByteLength = 6; 1116 break; 1117 1118 case ACPI_DMT_UINT56: 1119 case ACPI_DMT_BUF7: 1120 1121 ByteLength = 7; 1122 break; 1123 1124 case ACPI_DMT_UINT64: 1125 case ACPI_DMT_NAME8: 1126 1127 ByteLength = 8; 1128 break; 1129 1130 case ACPI_DMT_BUF10: 1131 1132 ByteLength = 10; 1133 break; 1134 1135 case ACPI_DMT_BUF11: 1136 1137 ByteLength = 11; 1138 break; 1139 1140 case ACPI_DMT_BUF12: 1141 1142 ByteLength = 12; 1143 break; 1144 1145 case ACPI_DMT_BUF16: 1146 case ACPI_DMT_UUID: 1147 1148 ByteLength = 16; 1149 break; 1150 1151 case ACPI_DMT_BUF18: 1152 1153 ByteLength = 18; 1154 break; 1155 1156 case ACPI_DMT_BUF24: 1157 1158 ByteLength = 24; 1159 break; 1160 1161 case ACPI_DMT_BUF26: 1162 1163 ByteLength = 26; 1164 break; 1165 1166 case ACPI_DMT_BUF32: 1167 1168 ByteLength = 32; 1169 break; 1170 1171 case ACPI_DMT_BUF112: 1172 1173 ByteLength = 112; 1174 break; 1175 1176 case ACPI_DMT_BUF128: 1177 1178 ByteLength = 128; 1179 break; 1180 1181 case ACPI_DMT_WPBT_UNICODE: 1182 1183 ByteLength = SubtableLength; 1184 CurrentOffset = sizeof (ACPI_TABLE_WPBT); 1185 break; 1186 1187 case ACPI_DMT_UNICODE: 1188 case ACPI_DMT_BUFFER: 1189 case ACPI_DMT_RAW_BUFFER: 1190 1191 ByteLength = SubtableLength; 1192 break; 1193 1194 case ACPI_DMT_PMTT_VENDOR: 1195 /* 1196 * Calculate the length of the vendor data for the PMTT table: 1197 * Length = (Current Subtable ptr + Subtable length) - 1198 * Start of the vendor data (Target) 1199 */ 1200 ByteLength = ((ACPI_CAST_PTR (char, Table) + 1201 (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) - 1202 ACPI_CAST_PTR (char, Target)); 1203 break; 1204 1205 case ACPI_DMT_STRING: 1206 1207 ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1; 1208 break; 1209 1210 case ACPI_DMT_IVRS_UNTERMINATED_STRING: 1211 1212 ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength); 1213 break; 1214 1215 case ACPI_DMT_GAS: 1216 1217 if (!LastOutputBlankLine) 1218 { 1219 AcpiOsPrintf ("\n"); 1220 LastOutputBlankLine = TRUE; 1221 } 1222 1223 ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 1224 break; 1225 1226 case ACPI_DMT_HESTNTFY: 1227 1228 if (!LastOutputBlankLine) 1229 { 1230 AcpiOsPrintf ("\n"); 1231 LastOutputBlankLine = TRUE; 1232 } 1233 1234 ByteLength = sizeof (ACPI_HEST_NOTIFY); 1235 break; 1236 1237 case ACPI_DMT_IORTMEM: 1238 1239 if (!LastOutputBlankLine) 1240 { 1241 LastOutputBlankLine = FALSE; 1242 } 1243 1244 ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS); 1245 break; 1246 1247 default: 1248 1249 ByteLength = 0; 1250 break; 1251 } 1252 1253 /* Check if we are beyond a subtable, or (worse) beyond EOT */ 1254 1255 if (CurrentOffset + ByteLength > TableLength) 1256 { 1257 if (SubtableLength) 1258 { 1259 AcpiOsPrintf ( 1260 "/**** ACPI subtable terminates early - " 1261 "may be older version (dump table) */\n"); 1262 1263 /* Move on to next subtable */ 1264 1265 return (AE_OK); 1266 } 1267 1268 AcpiOsPrintf ( 1269 "/**** ACPI table terminates " 1270 "in the middle of a data structure! */\n"); 1271 return (AE_BAD_DATA); 1272 } 1273 1274 if (Info->Opcode == ACPI_DMT_EXTRA_TEXT) 1275 { 1276 AcpiOsPrintf ("%s", Info->Name); 1277 continue; 1278 } 1279 1280 /* Start a new line and decode the opcode */ 1281 1282 AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 1283 1284 switch (Info->Opcode) 1285 { 1286 /* Single-bit Flag fields. Note: Opcode is the bit position */ 1287 1288 case ACPI_DMT_FLAG0: 1289 case ACPI_DMT_FLAG1: 1290 case ACPI_DMT_FLAG2: 1291 case ACPI_DMT_FLAG3: 1292 case ACPI_DMT_FLAG4: 1293 case ACPI_DMT_FLAG5: 1294 case ACPI_DMT_FLAG6: 1295 case ACPI_DMT_FLAG7: 1296 1297 AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 1298 break; 1299 1300 /* 2-bit Flag fields */ 1301 1302 case ACPI_DMT_FLAGS0: 1303 1304 AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 1305 break; 1306 1307 case ACPI_DMT_FLAGS1: 1308 1309 AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03); 1310 break; 1311 1312 case ACPI_DMT_FLAGS2: 1313 1314 AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 1315 break; 1316 1317 case ACPI_DMT_FLAGS8_2: 1318 1319 AcpiOsPrintf ("%2.2X\n", (*Target >> 2) & 0xFF); 1320 break; 1321 1322 case ACPI_DMT_FLAGS4: 1323 1324 AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03); 1325 break; 1326 1327 case ACPI_DMT_FLAGS4_0: 1328 1329 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F); 1330 break; 1331 1332 case ACPI_DMT_FLAGS4_4: 1333 1334 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F); 1335 break; 1336 1337 case ACPI_DMT_FLAGS4_8: 1338 1339 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F); 1340 break; 1341 1342 case ACPI_DMT_FLAGS4_12: 1343 1344 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F); 1345 break; 1346 1347 case ACPI_DMT_FLAGS16_16: 1348 1349 AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF); 1350 break; 1351 1352 /* Integer Data Types */ 1353 1354 case ACPI_DMT_UINT8: 1355 case ACPI_DMT_UINT16: 1356 case ACPI_DMT_UINT24: 1357 case ACPI_DMT_UINT32: 1358 case ACPI_DMT_UINT40: 1359 case ACPI_DMT_UINT48: 1360 case ACPI_DMT_UINT56: 1361 case ACPI_DMT_UINT64: 1362 /* 1363 * Dump bytes - high byte first, low byte last. 1364 * Note: All ACPI tables are little-endian. 1365 */ 1366 Value = 0; 1367 for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--) 1368 { 1369 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]); 1370 Value |= Target[Temp8 - 1]; 1371 Value <<= 8; 1372 } 1373 1374 if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL)) 1375 { 1376 AcpiOsPrintf (" [Optional field not present]"); 1377 } 1378 1379 AcpiOsPrintf ("\n"); 1380 break; 1381 1382 case ACPI_DMT_BUF7: 1383 case ACPI_DMT_BUF10: 1384 case ACPI_DMT_BUF11: 1385 case ACPI_DMT_BUF12: 1386 case ACPI_DMT_BUF16: 1387 case ACPI_DMT_BUF18: 1388 case ACPI_DMT_BUF24: 1389 case ACPI_DMT_BUF26: 1390 case ACPI_DMT_BUF32: 1391 case ACPI_DMT_BUF112: 1392 case ACPI_DMT_BUF128: 1393 /* 1394 * Buffer: Size depends on the opcode and was set above. 1395 * Each hex byte is separated with a space. 1396 * Multiple lines are separated by line continuation char. 1397 */ 1398 for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 1399 { 1400 AcpiOsPrintf ("%2.2X", Target[Temp16]); 1401 if ((UINT32) (Temp16 + 1) < ByteLength) 1402 { 1403 if ((Temp16 > 0) && (!((Temp16+1) % 16))) 1404 { 1405 AcpiOsPrintf (" \\\n"); /* Line continuation */ 1406 AcpiDmLineHeader (0, 0, NULL); 1407 } 1408 else 1409 { 1410 AcpiOsPrintf (" "); 1411 } 1412 } 1413 } 1414 1415 AcpiOsPrintf ("\n"); 1416 break; 1417 1418 case ACPI_DMT_UUID: 1419 1420 /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 1421 1422 (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer); 1423 1424 AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer); 1425 break; 1426 1427 case ACPI_DMT_STRING: 1428 1429 AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 1430 break; 1431 1432 case ACPI_DMT_IVRS_UNTERMINATED_STRING: 1433 1434 AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target)); 1435 break; 1436 1437 /* Fixed length ASCII name fields */ 1438 1439 case ACPI_DMT_SIG: 1440 1441 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4); 1442 AcpiOsPrintf ("\"%.4s\" ", RepairedName); 1443 1444 TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target)); 1445 if (TableData) 1446 { 1447 AcpiOsPrintf (STRING_FORMAT, TableData->Description); 1448 } 1449 else 1450 { 1451 AcpiOsPrintf ("\n"); 1452 } 1453 break; 1454 1455 case ACPI_DMT_NAME4: 1456 1457 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4); 1458 AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 1459 break; 1460 1461 case ACPI_DMT_NAME6: 1462 1463 AcpiUtCheckAndRepairAscii (Target, RepairedName, 6); 1464 AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 1465 break; 1466 1467 case ACPI_DMT_NAME8: 1468 1469 AcpiUtCheckAndRepairAscii (Target, RepairedName, 8); 1470 AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 1471 break; 1472 1473 /* Special Data Types */ 1474 1475 case ACPI_DMT_CHKSUM: 1476 1477 /* Checksum, display and validate */ 1478 1479 AcpiOsPrintf ("%2.2X", *Target); 1480 Temp8 = AcpiUtGenerateChecksum (Table, 1481 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 1482 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 1483 1484 if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 1485 { 1486 AcpiOsPrintf ( 1487 " /* Incorrect checksum, should be %2.2X */", Temp8); 1488 } 1489 1490 AcpiOsPrintf ("\n"); 1491 break; 1492 1493 case ACPI_DMT_SPACEID: 1494 1495 /* Address Space ID */ 1496 1497 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 1498 break; 1499 1500 case ACPI_DMT_ACCWIDTH: 1501 1502 /* Encoded Access Width */ 1503 1504 Temp8 = *Target; 1505 if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 1506 { 1507 Temp8 = ACPI_GAS_WIDTH_RESERVED; 1508 } 1509 1510 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]); 1511 break; 1512 1513 case ACPI_DMT_GAS: 1514 1515 /* Generic Address Structure */ 1516 1517 AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 1518 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1519 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 1520 if (ACPI_FAILURE (Status)) 1521 { 1522 return (Status); 1523 } 1524 1525 AcpiOsPrintf ("\n"); 1526 LastOutputBlankLine = TRUE; 1527 break; 1528 1529 case ACPI_DMT_AEST: 1530 1531 /* AEST subtable types */ 1532 1533 Temp8 = *Target; 1534 if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED) 1535 { 1536 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED; 1537 } 1538 1539 AcpiOsPrintf (UINT8_FORMAT, *Target, 1540 AcpiDmAestSubnames[Temp8]); 1541 break; 1542 1543 case ACPI_DMT_AEST_CACHE: 1544 1545 /* AEST cache resource subtable */ 1546 1547 Temp32 = *Target; 1548 if (Temp32 > ACPI_AEST_CACHE_RESERVED) 1549 { 1550 Temp32 = ACPI_AEST_CACHE_RESERVED; 1551 } 1552 1553 AcpiOsPrintf (UINT32_FORMAT, *Target, 1554 AcpiDmAestCacheNames[Temp32]); 1555 break; 1556 1557 case ACPI_DMT_AEST_GIC: 1558 1559 /* AEST GIC error subtable */ 1560 1561 Temp32 = *Target; 1562 if (Temp32 > ACPI_AEST_GIC_RESERVED) 1563 { 1564 Temp32 = ACPI_AEST_GIC_RESERVED; 1565 } 1566 1567 AcpiOsPrintf (UINT32_FORMAT, *Target, 1568 AcpiDmAestGicNames[Temp32]); 1569 break; 1570 1571 case ACPI_DMT_AEST_RES: 1572 1573 /* AEST resource type subtable */ 1574 1575 Temp8 = *Target; 1576 if (Temp8 > ACPI_AEST_RESOURCE_RESERVED) 1577 { 1578 Temp8 = ACPI_AEST_RESOURCE_RESERVED; 1579 } 1580 1581 AcpiOsPrintf (UINT8_FORMAT, *Target, 1582 AcpiDmAestResourceNames[Temp8]); 1583 break; 1584 1585 case ACPI_DMT_AEST_XFACE: 1586 1587 /* AEST interface structure types */ 1588 1589 Temp8 = *Target; 1590 if (Temp8 > ACPI_AEST_XFACE_RESERVED) 1591 { 1592 Temp8 = ACPI_AEST_XFACE_RESERVED; 1593 } 1594 1595 AcpiOsPrintf (UINT8_FORMAT, *Target, 1596 AcpiDmAestXfaceNames[Temp8]); 1597 break; 1598 1599 case ACPI_DMT_AEST_XRUPT: 1600 1601 /* AEST interrupt structure types */ 1602 1603 Temp8 = *Target; 1604 if (Temp8 > ACPI_AEST_XRUPT_RESERVED) 1605 { 1606 Temp8 = ACPI_AEST_XRUPT_RESERVED; 1607 } 1608 1609 AcpiOsPrintf (UINT8_FORMAT, *Target, 1610 AcpiDmAestXruptNames[Temp8]); 1611 break; 1612 1613 case ACPI_DMT_ASPT: 1614 /* ASPT subtable types */ 1615 Temp16 = ACPI_GET16(Target); 1616 if (Temp16 > ACPI_ASPT_TYPE_UNKNOWN) 1617 { 1618 Temp16 = ACPI_ASPT_TYPE_UNKNOWN; 1619 } 1620 1621 AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmAsptSubnames[Temp16]); 1622 break; 1623 1624 case ACPI_DMT_ASF: 1625 1626 /* ASF subtable types */ 1627 1628 Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 1629 if (Temp16 > ACPI_ASF_TYPE_RESERVED) 1630 { 1631 Temp16 = ACPI_ASF_TYPE_RESERVED; 1632 } 1633 1634 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 1635 break; 1636 1637 case ACPI_DMT_CDAT: 1638 1639 /* CDAT subtable types */ 1640 1641 Temp8 = *Target; 1642 if (Temp8 > ACPI_CDAT_TYPE_RESERVED) 1643 { 1644 Temp8 = ACPI_CDAT_TYPE_RESERVED; 1645 } 1646 1647 AcpiOsPrintf (UINT8_FORMAT, *Target, 1648 AcpiDmCdatSubnames[Temp8]); 1649 break; 1650 1651 case ACPI_DMT_CEDT: 1652 1653 /* CEDT subtable types */ 1654 1655 Temp8 = *Target; 1656 if (Temp8 > ACPI_CEDT_TYPE_RESERVED) 1657 { 1658 Temp8 = ACPI_CEDT_TYPE_RESERVED; 1659 } 1660 1661 AcpiOsPrintf (UINT8_FORMAT, *Target, 1662 AcpiDmCedtSubnames[Temp8]); 1663 break; 1664 1665 case ACPI_DMT_DMAR: 1666 1667 /* DMAR subtable types */ 1668 1669 Temp16 = ACPI_GET16 (Target); 1670 if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 1671 { 1672 Temp16 = ACPI_DMAR_TYPE_RESERVED; 1673 } 1674 1675 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1676 AcpiDmDmarSubnames[Temp16]); 1677 break; 1678 1679 case ACPI_DMT_DMAR_SCOPE: 1680 1681 /* DMAR device scope types */ 1682 1683 Temp8 = *Target; 1684 if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED) 1685 { 1686 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED; 1687 } 1688 1689 AcpiOsPrintf (UINT8_FORMAT, *Target, 1690 AcpiDmDmarScope[Temp8]); 1691 break; 1692 1693 case ACPI_DMT_EINJACT: 1694 1695 /* EINJ Action types */ 1696 1697 Temp8 = *Target; 1698 if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 1699 { 1700 Temp8 = ACPI_EINJ_ACTION_RESERVED; 1701 } 1702 1703 AcpiOsPrintf (UINT8_FORMAT, *Target, 1704 AcpiDmEinjActions[Temp8]); 1705 break; 1706 1707 case ACPI_DMT_EINJINST: 1708 1709 /* EINJ Instruction types */ 1710 1711 Temp8 = *Target; 1712 if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 1713 { 1714 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 1715 } 1716 1717 AcpiOsPrintf (UINT8_FORMAT, *Target, 1718 AcpiDmEinjInstructions[Temp8]); 1719 break; 1720 1721 case ACPI_DMT_ERSTACT: 1722 1723 /* ERST Action types */ 1724 1725 Temp8 = *Target; 1726 if (Temp8 > ACPI_ERST_ACTION_RESERVED) 1727 { 1728 Temp8 = ACPI_ERST_ACTION_RESERVED; 1729 } 1730 1731 AcpiOsPrintf (UINT8_FORMAT, *Target, 1732 AcpiDmErstActions[Temp8]); 1733 break; 1734 1735 case ACPI_DMT_ERDT: 1736 1737 /* ERDT subtable types */ 1738 1739 Temp16 = *Target; 1740 if (Temp16 > ACPI_ERDT_TYPE_RESERVED) 1741 { 1742 Temp16 = ACPI_ERDT_TYPE_RESERVED; 1743 } 1744 1745 AcpiOsPrintf (UINT8_FORMAT, *Target, 1746 AcpiDmErdtSubnames[Temp16]); 1747 break; 1748 1749 case ACPI_DMT_ERSTINST: 1750 1751 /* ERST Instruction types */ 1752 1753 Temp8 = *Target; 1754 if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 1755 { 1756 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 1757 } 1758 1759 AcpiOsPrintf (UINT8_FORMAT, *Target, 1760 AcpiDmErstInstructions[Temp8]); 1761 break; 1762 1763 case ACPI_DMT_GTDT: 1764 1765 /* GTDT subtable types */ 1766 1767 Temp8 = *Target; 1768 if (Temp8 > ACPI_GTDT_TYPE_RESERVED) 1769 { 1770 Temp8 = ACPI_GTDT_TYPE_RESERVED; 1771 } 1772 1773 AcpiOsPrintf (UINT8_FORMAT, *Target, 1774 AcpiDmGtdtSubnames[Temp8]); 1775 break; 1776 1777 case ACPI_DMT_HEST: 1778 1779 /* HEST subtable types */ 1780 1781 Temp16 = ACPI_GET16 (Target); 1782 if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1783 { 1784 Temp16 = ACPI_HEST_TYPE_RESERVED; 1785 } 1786 1787 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1788 AcpiDmHestSubnames[Temp16]); 1789 break; 1790 1791 case ACPI_DMT_HESTNTFY: 1792 1793 AcpiOsPrintf (STRING_FORMAT, 1794 "Hardware Error Notification Structure"); 1795 1796 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1797 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1798 if (ACPI_FAILURE (Status)) 1799 { 1800 return (Status); 1801 } 1802 1803 AcpiOsPrintf ("\n"); 1804 LastOutputBlankLine = TRUE; 1805 break; 1806 1807 case ACPI_DMT_HESTNTYP: 1808 1809 /* HEST Notify types */ 1810 1811 Temp8 = *Target; 1812 if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1813 { 1814 Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1815 } 1816 1817 AcpiOsPrintf (UINT8_FORMAT, *Target, 1818 AcpiDmHestNotifySubnames[Temp8]); 1819 break; 1820 1821 case ACPI_DMT_HMAT: 1822 1823 /* HMAT subtable types */ 1824 1825 Temp16 = *Target; 1826 if (Temp16 > ACPI_HMAT_TYPE_RESERVED) 1827 { 1828 Temp16 = ACPI_HMAT_TYPE_RESERVED; 1829 } 1830 1831 AcpiOsPrintf (UINT16_FORMAT, *Target, 1832 AcpiDmHmatSubnames[Temp16]); 1833 break; 1834 1835 case ACPI_DMT_IORTMEM: 1836 1837 AcpiOsPrintf (STRING_FORMAT, 1838 "IORT Memory Access Properties"); 1839 1840 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1841 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc); 1842 if (ACPI_FAILURE (Status)) 1843 { 1844 return (Status); 1845 } 1846 1847 LastOutputBlankLine = TRUE; 1848 break; 1849 1850 case ACPI_DMT_MADT: 1851 1852 /* MADT subtable types */ 1853 1854 Temp8 = *Target; 1855 if ((Temp8 >= ACPI_MADT_TYPE_RESERVED) && (Temp8 < ACPI_MADT_TYPE_OEM_RESERVED)) 1856 { 1857 Temp8 = ACPI_MADT_TYPE_RESERVED; 1858 } 1859 else if (Temp8 >= ACPI_MADT_TYPE_OEM_RESERVED) 1860 { 1861 Temp8 = ACPI_MADT_TYPE_RESERVED + 1; 1862 } 1863 AcpiOsPrintf (UINT8_FORMAT, *Target, 1864 AcpiDmMadtSubnames[Temp8]); 1865 break; 1866 1867 case ACPI_DMT_MPAM_LOCATOR: 1868 1869 /* MPAM subtable locator types */ 1870 1871 Temp8 = *Target; 1872 if (Temp8 > ACPI_MPAM_LOCATION_TYPE_INTERCONNECT) 1873 { 1874 Temp8 = ACPI_MPAM_LOCATION_TYPE_INTERCONNECT + 1; 1875 } 1876 1877 AcpiOsPrintf (UINT8_FORMAT, *Target, 1878 AcpiDmMpamSubnames[Temp8]); 1879 break; 1880 1881 case ACPI_DMT_NFIT: 1882 1883 /* NFIT subtable types */ 1884 1885 Temp16 = ACPI_GET16 (Target); 1886 if (Temp16 > ACPI_NFIT_TYPE_RESERVED) 1887 { 1888 Temp16 = ACPI_NFIT_TYPE_RESERVED; 1889 } 1890 1891 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1892 AcpiDmNfitSubnames[Temp16]); 1893 break; 1894 1895 case ACPI_DMT_PCCT: 1896 1897 /* PCCT subtable types */ 1898 1899 Temp8 = *Target; 1900 if (Temp8 > ACPI_PCCT_TYPE_RESERVED) 1901 { 1902 Temp8 = ACPI_PCCT_TYPE_RESERVED; 1903 } 1904 1905 AcpiOsPrintf (UINT8_FORMAT, *Target, 1906 AcpiDmPcctSubnames[Temp8]); 1907 break; 1908 1909 case ACPI_DMT_PHAT: 1910 1911 /* PHAT subtable types */ 1912 1913 Temp16 = ACPI_GET16 (Target); 1914 if (Temp16 > ACPI_PHAT_TYPE_RESERVED) 1915 { 1916 Temp16 = ACPI_PHAT_TYPE_RESERVED; 1917 } 1918 1919 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1920 AcpiDmPhatSubnames[Temp16]); 1921 break; 1922 1923 case ACPI_DMT_PMTT: 1924 1925 /* PMTT subtable types */ 1926 1927 Temp8 = *Target; 1928 if (Temp8 == ACPI_PMTT_TYPE_VENDOR) 1929 { 1930 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1; 1931 } 1932 else if (Temp8 > ACPI_PMTT_TYPE_RESERVED) 1933 { 1934 Temp8 = ACPI_PMTT_TYPE_RESERVED; 1935 } 1936 AcpiOsPrintf (UINT8_FORMAT, *Target, 1937 AcpiDmPmttSubnames[Temp8]); 1938 break; 1939 1940 case ACPI_DMT_PPTT: 1941 1942 /* PPTT subtable types */ 1943 1944 Temp8 = *Target; 1945 if (Temp8 > ACPI_PPTT_TYPE_RESERVED) 1946 { 1947 Temp8 = ACPI_PPTT_TYPE_RESERVED; 1948 } 1949 1950 AcpiOsPrintf (UINT8_FORMAT, *Target, 1951 AcpiDmPpttSubnames[Temp8]); 1952 break; 1953 1954 case ACPI_DMT_UNICODE: 1955 case ACPI_DMT_WPBT_UNICODE: 1956 1957 if (ByteLength == 0) 1958 { 1959 AcpiOsPrintf ("/* Zero-length Data */\n"); 1960 break; 1961 } 1962 1963 AcpiDmDumpUnicode (Table, 0, ByteLength); 1964 break; 1965 1966 case ACPI_DMT_RAW_BUFFER: 1967 case ACPI_DMT_BUFFER: 1968 case ACPI_DMT_PMTT_VENDOR: 1969 1970 if (ByteLength == 0) 1971 { 1972 AcpiOsPrintf ("/* Zero-length Data */\n"); 1973 break; 1974 } 1975 1976 AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL); 1977 break; 1978 1979 case ACPI_DMT_RGRT: 1980 1981 /* RGRT subtable types */ 1982 1983 Temp8 = *Target; 1984 if (Temp8 >= ACPI_RGRT_TYPE_RESERVED) 1985 { 1986 Temp8 = ACPI_RGRT_TYPE_RESERVED0; 1987 } 1988 1989 AcpiOsPrintf (UINT8_FORMAT, *Target, 1990 AcpiDmRgrtSubnames[Temp8]); 1991 break; 1992 1993 case ACPI_DMT_RHCT: 1994 1995 /* RHCT subtable types */ 1996 1997 Temp16 = ACPI_GET16 (Target); 1998 if (Temp16 == ACPI_RHCT_NODE_TYPE_HART_INFO) 1999 { 2000 Temp16 = ACPI_RHCT_NODE_TYPE_RESERVED; 2001 } 2002 2003 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 2004 AcpiDmRhctSubnames[Temp16]); 2005 break; 2006 2007 case ACPI_DMT_SDEV: 2008 2009 /* SDEV subtable types */ 2010 2011 Temp8 = *Target; 2012 if (Temp8 > ACPI_SDEV_TYPE_RESERVED) 2013 { 2014 Temp8 = ACPI_SDEV_TYPE_RESERVED; 2015 } 2016 2017 AcpiOsPrintf (UINT8_FORMAT, *Target, 2018 AcpiDmSdevSubnames[Temp8]); 2019 break; 2020 2021 case ACPI_DMT_SRAT: 2022 2023 /* SRAT subtable types */ 2024 2025 Temp8 = *Target; 2026 if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 2027 { 2028 Temp8 = ACPI_SRAT_TYPE_RESERVED; 2029 } 2030 2031 AcpiOsPrintf (UINT8_FORMAT, *Target, 2032 AcpiDmSratSubnames[Temp8]); 2033 break; 2034 2035 case ACPI_DMT_TPM2: 2036 2037 /* TPM2 Start Method types */ 2038 2039 Temp8 = *Target; 2040 if (Temp8 > ACPI_TPM2_RESERVED) 2041 { 2042 Temp8 = ACPI_TPM2_RESERVED; 2043 } 2044 2045 AcpiOsPrintf (UINT8_FORMAT, *Target, 2046 AcpiDmTpm2Subnames[Temp8]); 2047 break; 2048 2049 2050 case ACPI_DMT_FADTPM: 2051 2052 /* FADT Preferred PM Profile names */ 2053 2054 Temp8 = *Target; 2055 if (Temp8 > ACPI_FADT_PM_RESERVED) 2056 { 2057 Temp8 = ACPI_FADT_PM_RESERVED; 2058 } 2059 2060 AcpiOsPrintf (UINT8_FORMAT, *Target, 2061 AcpiDmFadtProfiles[Temp8]); 2062 break; 2063 2064 case ACPI_DMT_IOVT: 2065 2066 /* IOVT subtable types */ 2067 2068 Temp16 = ACPI_GET16(Target); 2069 if (Temp16 > ACPI_IOVT_IOMMU_RESERVED) 2070 { 2071 Temp16 = ACPI_IOVT_IOMMU_RESERVED; 2072 } 2073 2074 AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmIovtSubnames[Temp16]); 2075 break; 2076 2077 case ACPI_DMT_IOVTDEV: 2078 2079 /* IOVT subtable types */ 2080 2081 Temp8 = *Target; 2082 if (Temp8 > ACPI_IOVT_DEVICE_ENTRY_RESERVED) 2083 { 2084 Temp8 = ACPI_IOVT_DEVICE_ENTRY_RESERVED; 2085 } 2086 2087 AcpiOsPrintf (UINT8_FORMAT, *Target, 2088 AcpiDmIovtdevSubnames[Temp8]); 2089 break; 2090 2091 case ACPI_DMT_IVRS: 2092 2093 /* IVRS subtable types */ 2094 2095 Temp8 = *Target; 2096 switch (Temp8) 2097 { 2098 case ACPI_IVRS_TYPE_HARDWARE1: 2099 case ACPI_IVRS_TYPE_HARDWARE2: 2100 2101 Name = AcpiDmIvrsSubnames[0]; 2102 break; 2103 2104 case ACPI_IVRS_TYPE_HARDWARE3: 2105 2106 Name = AcpiDmIvrsSubnames[1]; 2107 break; 2108 2109 case ACPI_IVRS_TYPE_MEMORY1: 2110 case ACPI_IVRS_TYPE_MEMORY2: 2111 case ACPI_IVRS_TYPE_MEMORY3: 2112 2113 Name = AcpiDmIvrsSubnames[2]; 2114 break; 2115 2116 default: 2117 2118 Name = AcpiDmIvrsSubnames[3]; 2119 break; 2120 } 2121 2122 AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 2123 break; 2124 2125 case ACPI_DMT_IVRS_DE: 2126 2127 /* IVRS device entry types */ 2128 2129 Temp8 = *Target; 2130 switch (Temp8) 2131 { 2132 case ACPI_IVRS_TYPE_ALL: 2133 case ACPI_IVRS_TYPE_SELECT: 2134 case ACPI_IVRS_TYPE_START: 2135 case ACPI_IVRS_TYPE_END: 2136 2137 Name = AcpiDmIvrsDevEntryNames[Temp8]; 2138 break; 2139 2140 case ACPI_IVRS_TYPE_ALIAS_SELECT: 2141 case ACPI_IVRS_TYPE_ALIAS_START: 2142 case ACPI_IVRS_TYPE_EXT_SELECT: 2143 case ACPI_IVRS_TYPE_EXT_START: 2144 case ACPI_IVRS_TYPE_SPECIAL: 2145 2146 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61]; 2147 break; 2148 2149 case ACPI_IVRS_TYPE_HID: 2150 2151 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228]; 2152 break; 2153 2154 default: 2155 Name = AcpiDmIvrsDevEntryNames[0]; /* Unknown/Reserved */ 2156 break; 2157 } 2158 2159 AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 2160 break; 2161 2162 case ACPI_DMT_LPIT: 2163 2164 /* LPIT subtable types */ 2165 2166 Temp32 = ACPI_GET32 (Target); 2167 if (Temp32 > ACPI_LPIT_TYPE_RESERVED) 2168 { 2169 Temp32 = ACPI_LPIT_TYPE_RESERVED; 2170 } 2171 2172 AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target), 2173 AcpiDmLpitSubnames[Temp32]); 2174 break; 2175 2176 case ACPI_DMT_VIOT: 2177 2178 /* VIOT subtable types */ 2179 2180 Temp8 = *Target; 2181 if (Temp8 > ACPI_VIOT_RESERVED) 2182 { 2183 Temp8 = ACPI_VIOT_RESERVED; 2184 } 2185 2186 AcpiOsPrintf (UINT8_FORMAT, *Target, 2187 AcpiDmViotSubnames[Temp8]); 2188 break; 2189 2190 case ACPI_DMT_EXIT: 2191 2192 return (AE_OK); 2193 2194 default: 2195 2196 ACPI_ERROR ((AE_INFO, 2197 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 2198 return (AE_SUPPORT); 2199 } 2200 } 2201 2202 if (TableOffset && !SubtableLength) 2203 { 2204 /* 2205 * If this table is not the main table, the subtable must have a 2206 * valid length 2207 */ 2208 AcpiOsPrintf ("Invalid zero length subtable\n"); 2209 return (AE_BAD_DATA); 2210 } 2211 2212 return (AE_OK); 2213 } 2214