1 /****************************************************************************** 2 * 3 * Module Name: dmtable - Support for ACPI tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2025, 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 "Unknown Subtable Type" /* Reserved */ 464 }; 465 466 static const char *AcpiDmIovtSubnames[] = 467 { 468 "IOMMUv1", 469 "Unknown Subtable Type" /* Reserved */ 470 }; 471 472 static const char *AcpiDmIovtdevSubnames[] = 473 { 474 "A single PCI device", 475 "Start of range", 476 "End of range", 477 "Unknown Subtable Type" /* Reserved */ 478 }; 479 480 static const char *AcpiDmIvrsSubnames[] = 481 { 482 "Hardware Definition Block (IVHD)", 483 "Hardware Definition Block - Mixed Format (IVHD)", 484 "Memory Definition Block (IVMD)", 485 "Unknown/Reserved Subtable Type" /* Reserved */ 486 }; 487 488 static const char *AcpiDmIvrsDevEntryNames[] = 489 { 490 "Unknown/Reserved Device Entry Type", /* 0- Reserved */ 491 "Device Entry: Select All Devices", /* 1 */ 492 "Device Entry: Select One Device", /* 2 */ 493 "Device Entry: Start of Range", /* 3 */ 494 "Device Entry: End of Range", /* 4 */ 495 "Device Entry: Alias Select", /* 66 */ 496 "Device Entry: Alias Start of Range", /* 67 */ 497 "Unknown/Reserved Device Entry Type", /* 68- Reserved */ 498 "Unknown/Reserved Device Entry Type", /* 69- Reserved */ 499 "Device Entry: Extended Select", /* 70 */ 500 "Device Entry: Extended Start of Range", /* 71 */ 501 "Device Entry: Special Device", /* 72 */ 502 "Device Entry: ACPI HID Named Device", /* 240 */ 503 "Unknown/Reserved Device Entry Type" /* Reserved */ 504 }; 505 506 static const char *AcpiDmLpitSubnames[] = 507 { 508 "Native C-state Idle Structure", 509 "Unknown Subtable Type" /* Reserved */ 510 }; 511 512 static const char *AcpiDmViotSubnames[] = 513 { 514 "Unknown Subtable Type", /* 0 -Reserved */ 515 "PCI Range", 516 "MMIO Endpoint", 517 "VirtIO-PCI IOMMU", 518 "VirtIO-MMIO IOMMU", 519 "Unknown Subtable Type" /* Reserved */ 520 }; 521 522 #define ACPI_FADT_PM_RESERVED 9 523 524 static const char *AcpiDmFadtProfiles[] = 525 { 526 "Unspecified", 527 "Desktop", 528 "Mobile", 529 "Workstation", 530 "Enterprise Server", 531 "SOHO Server", 532 "Appliance PC", 533 "Performance Server", 534 "Tablet", 535 "Unknown Profile Type" 536 }; 537 538 #define ACPI_GAS_WIDTH_RESERVED 5 539 540 static const char *AcpiDmGasAccessWidth[] = 541 { 542 "Undefined/Legacy", 543 "Byte Access:8", 544 "Word Access:16", 545 "DWord Access:32", 546 "QWord Access:64", 547 "Unknown Width Encoding" 548 }; 549 550 static const char *AcpiDmRhctSubnames[] = 551 { 552 "RISC-V ISA string structure", /* ACPI_RHCT_ISA_STRING */ 553 "RISC-V CMO node structure", /* ACPI_RHCT_CMO_NODE */ 554 "RISC-V MMU node structure", /* ACPI_RHCT_MMU_NODE */ 555 "RISC-V Hart Info structure", /* ACPI_RHCT_HART_INFO */ 556 }; 557 558 559 /******************************************************************************* 560 * 561 * ACPI Table Data, indexed by signature. 562 * 563 * Each entry contains: Signature, Table Info, Handler, DtHandler, 564 * Template, Description 565 * 566 * Simple tables have only a TableInfo structure, complex tables have a 567 * handler. This table must be NULL terminated. RSDP and FACS are 568 * special-cased elsewhere. 569 * 570 * Note: Any tables added here should be duplicated within 571 * AcpiGbl_SupportedTables in the file common/ahtable.c 572 * 573 ******************************************************************************/ 574 575 const ACPI_DMTABLE_DATA AcpiDmTableData[] = 576 { 577 {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest}, 578 {ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi}, 579 {ACPI_SIG_APMT, NULL, AcpiDmDumpApmt, DtCompileApmt, TemplateApmt}, 580 {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf}, 581 {ACPI_SIG_ASPT, NULL, AcpiDmDumpAspt, DtCompileAspt, TemplateAspt}, 582 {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat}, 583 {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, 584 {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt}, 585 {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot}, 586 {ACPI_SIG_CCEL, AcpiDmTableInfoCcel, NULL, NULL, TemplateCcel}, 587 {ACPI_SIG_CDAT, NULL, AcpiDmDumpCdat, NULL, TemplateCdat}, 588 {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt}, 589 {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep}, 590 {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt}, 591 {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2, AcpiDmDumpDbg2, DtCompileDbg2, TemplateDbg2}, 592 {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp}, 593 {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar}, 594 {ACPI_SIG_DRTM, NULL, AcpiDmDumpDrtm, DtCompileDrtm, TemplateDrtm}, 595 {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt}, 596 {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj}, 597 {ACPI_SIG_ERDT, NULL, AcpiDmDumpErdt, DtCompileErdt, TemplateErdt}, 598 {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst}, 599 {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt}, 600 {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt}, 601 {ACPI_SIG_GTDT, NULL, AcpiDmDumpGtdt, DtCompileGtdt, TemplateGtdt}, 602 {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest}, 603 {ACPI_SIG_HMAT, NULL, AcpiDmDumpHmat, DtCompileHmat, TemplateHmat}, 604 {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet}, 605 {ACPI_SIG_IORT, NULL, AcpiDmDumpIort, DtCompileIort, TemplateIort}, 606 {ACPI_SIG_IOVT, AcpiDmTableInfoIovt, AcpiDmDumpIovt, DtCompileIovt, TemplateIovt}, 607 {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs}, 608 {ACPI_SIG_LPIT, NULL, AcpiDmDumpLpit, DtCompileLpit, TemplateLpit}, 609 {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt}, 610 {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg}, 611 {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi}, 612 {ACPI_SIG_MPAM, NULL, AcpiDmDumpMpam, DtCompileMpam, TemplateMpam}, 613 {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst}, 614 {ACPI_SIG_MRRM, NULL, AcpiDmDumpMrrm, DtCompileMrrm, TemplateMrrm}, 615 {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct}, 616 {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm}, 617 {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, 618 {ACPI_SIG_NHLT, NULL, NULL, NULL, NULL}, 619 {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, 620 {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, 621 {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat}, 622 {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt}, 623 {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt}, 624 {ACPI_SIG_PRMT, NULL, AcpiDmDumpPrmt, DtCompilePrmt, TemplatePrmt}, 625 {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf}, 626 {ACPI_SIG_RAS2, AcpiDmTableInfoRas2, AcpiDmDumpRas2, DtCompileRas2, TemplateRas2}, 627 {ACPI_SIG_RGRT, NULL, AcpiDmDumpRgrt, DtCompileRgrt, TemplateRgrt}, 628 {ACPI_SIG_RHCT, NULL, AcpiDmDumpRhct, DtCompileRhct, TemplateRhct}, 629 {ACPI_SIG_RIMT, NULL, AcpiDmDumpRimt, DtCompileRimt, TemplateRimt}, 630 {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt}, 631 {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt}, 632 {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst}, 633 {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei}, 634 {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev}, 635 {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic}, 636 {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit}, 637 {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr}, 638 {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi}, 639 {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat}, 640 {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, 641 {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl}, 642 {ACPI_SIG_SWFT, AcpiDmTableInfoSwft, AcpiDmDumpSwft, DtCompileSwft, TemplateSwft}, 643 {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, 644 {ACPI_SIG_TDEL, AcpiDmTableInfoTdel, NULL, NULL, TemplateTdel}, 645 {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, 646 {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, 647 {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot}, 648 {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet}, 649 {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat}, 650 {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt}, 651 {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt}, 652 {ACPI_SIG_WPBT, NULL, AcpiDmDumpWpbt, DtCompileWpbt, TemplateWpbt}, 653 {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt, NULL, NULL, TemplateWsmt}, 654 {ACPI_SIG_XENV, AcpiDmTableInfoXenv, NULL, NULL, TemplateXenv}, 655 {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt}, 656 {NULL, NULL, NULL, NULL, NULL} 657 }; 658 659 660 /******************************************************************************* 661 * 662 * FUNCTION: AcpiDmGetTableData 663 * 664 * PARAMETERS: Signature - ACPI signature (4 chars) to match 665 * 666 * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found. 667 * 668 * DESCRIPTION: Find a match in the global table of supported ACPI tables 669 * 670 ******************************************************************************/ 671 672 const ACPI_DMTABLE_DATA * 673 AcpiDmGetTableData ( 674 char *Signature) 675 { 676 const ACPI_DMTABLE_DATA *Info; 677 678 679 for (Info = AcpiDmTableData; Info->Signature; Info++) 680 { 681 if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature)) 682 { 683 return (Info); 684 } 685 } 686 687 return (NULL); 688 } 689 690 691 /******************************************************************************* 692 * 693 * FUNCTION: AcpiDmDumpDataTable 694 * 695 * PARAMETERS: Table - An ACPI table 696 * 697 * RETURN: None. 698 * 699 * DESCRIPTION: Format the contents of an ACPI data table (any table other 700 * than an SSDT or DSDT that does not contain executable AML code) 701 * 702 ******************************************************************************/ 703 704 void 705 AcpiDmDumpDataTable ( 706 ACPI_TABLE_HEADER *Table) 707 { 708 ACPI_STATUS Status; 709 const ACPI_DMTABLE_DATA *TableData; 710 UINT32 Length; 711 712 713 /* Ignore tables that contain AML */ 714 715 if (AcpiUtIsAmlTable (Table)) 716 { 717 if (AslGbl_VerboseTemplates) 718 { 719 /* Dump the raw table data */ 720 721 Length = Table->Length; 722 723 AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n", 724 ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 725 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 726 Length, DB_BYTE_DISPLAY, 0); 727 AcpiOsPrintf (" */\n"); 728 } 729 return; 730 } 731 732 /* 733 * Handle tables that don't use the common ACPI table header structure. 734 * Currently, these are the FACS, RSDP, S3PT and CDAT. 735 */ 736 if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) 737 { 738 Length = Table->Length; 739 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs); 740 if (ACPI_FAILURE (Status)) 741 { 742 return; 743 } 744 } 745 else if (ACPI_VALIDATE_RSDP_SIG (ACPI_CAST_PTR (ACPI_TABLE_RSDP, 746 Table)->Signature)) 747 { 748 Length = AcpiDmDumpRsdp (Table); 749 } 750 else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT)) 751 { 752 Length = AcpiDmDumpS3pt (Table); 753 } 754 else if (!AcpiUtValidNameseg (Table->Signature)) 755 { 756 /* 757 * For CDAT we are assuming that there should be at least one non-ASCII 758 * byte in the (normally) 4-character Signature field (at least the 759 * high-order byte should be zero). 760 */ 761 if (AcpiGbl_CDAT) 762 { 763 /* 764 * Invalid signature and <-ds CDAT> was specified on the command line. 765 * Therefore, we have a CDAT table. 766 */ 767 AcpiDmDumpCdat (Table); 768 } 769 else 770 { 771 fprintf (stderr, "Table has an invalid signature\n"); 772 } 773 774 return; 775 } 776 else 777 { 778 /* 779 * All other tables must use the common ACPI table header, dump it now 780 */ 781 Length = Table->Length; 782 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader); 783 if (ACPI_FAILURE (Status)) 784 { 785 return; 786 } 787 AcpiOsPrintf ("\n"); 788 789 /* Match signature and dispatch appropriately */ 790 791 TableData = AcpiDmGetTableData (Table->Signature); 792 if (!TableData) 793 { 794 if (!strncmp (Table->Signature, "OEM", 3)) 795 { 796 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n", 797 Table->Signature); 798 } 799 else 800 { 801 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n", 802 Table->Signature); 803 804 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ", 805 Table->Signature); 806 807 if (!AcpiGbl_ForceAmlDisassembly) 808 { 809 fprintf (stderr, "decoding ACPI table header only\n"); 810 } 811 else 812 { 813 fprintf (stderr, "assuming table contains valid AML code\n"); 814 } 815 } 816 } 817 else if (TableData->TableHandler) 818 { 819 /* Complex table, has a handler */ 820 821 TableData->TableHandler (Table); 822 } 823 else if (TableData->TableInfo) 824 { 825 /* Simple table, just walk the info table */ 826 827 Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo); 828 if (ACPI_FAILURE (Status)) 829 { 830 return; 831 } 832 } 833 } 834 835 if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates) 836 { 837 /* Dump the raw table data */ 838 839 AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 840 ACPI_RAW_TABLE_DATA_HEADER, Length, Length); 841 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), 842 Length, DB_BYTE_DISPLAY, 0); 843 } 844 } 845 846 847 /******************************************************************************* 848 * 849 * FUNCTION: AcpiDmLineHeader 850 * 851 * PARAMETERS: Offset - Current byte offset, from table start 852 * ByteLength - Length of the field in bytes, 0 for flags 853 * Name - Name of this field 854 * 855 * RETURN: None 856 * 857 * DESCRIPTION: Utility routines for formatting output lines. Displays the 858 * current table offset in hex and decimal, the field length, 859 * and the field name. 860 * 861 ******************************************************************************/ 862 863 void 864 AcpiDmLineHeader ( 865 UINT32 Offset, 866 UINT32 ByteLength, 867 char *Name) 868 { 869 870 /* Allow a null name for fields that span multiple lines (large buffers) */ 871 872 if (!Name) 873 { 874 Name = ""; 875 } 876 877 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */ 878 { 879 if (ByteLength) 880 { 881 AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name); 882 } 883 else 884 { 885 if (*Name) 886 { 887 AcpiOsPrintf ("%41s : ", Name); 888 } 889 else 890 { 891 AcpiOsPrintf ("%41s ", Name); 892 } 893 } 894 } 895 else /* Normal disassembler or verbose template */ 896 { 897 if (ByteLength) 898 { 899 AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ", 900 Offset, Offset, ByteLength, Name); 901 } 902 else 903 { 904 if (*Name) 905 { 906 AcpiOsPrintf ("%44s : ", Name); 907 } 908 else 909 { 910 AcpiOsPrintf ("%44s ", Name); 911 } 912 } 913 } 914 } 915 916 void 917 AcpiDmLineHeader2 ( 918 UINT32 Offset, 919 UINT32 ByteLength, 920 char *Name, 921 UINT32 Value) 922 { 923 924 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */ 925 { 926 if (ByteLength) 927 { 928 AcpiOsPrintf ("[%.4d] %30s %3d : ", 929 ByteLength, Name, Value); 930 } 931 else 932 { 933 AcpiOsPrintf ("%36s % 3d : ", 934 Name, Value); 935 } 936 } 937 else /* Normal disassembler or verbose template */ 938 { 939 if (ByteLength) 940 { 941 AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ", 942 Offset, Offset, ByteLength, Name, Value); 943 } 944 else 945 { 946 AcpiOsPrintf ("[%3.3Xh %4.4u ] %24s %3d : ", 947 Offset, Offset, Name, Value); 948 } 949 } 950 } 951 952 953 /******************************************************************************* 954 * 955 * FUNCTION: AcpiDmDumpTable 956 * 957 * PARAMETERS: TableLength - Length of the entire ACPI table 958 * TableOffset - Starting offset within the table for this 959 * sub-descriptor (0 if main table) 960 * Table - The ACPI table 961 * SubtableLength - Length of this sub-descriptor 962 * Info - Info table for this ACPI table 963 * 964 * RETURN: Status 965 * 966 * DESCRIPTION: Display ACPI table contents by walking the Info table. 967 * 968 * Note: This function must remain in sync with DtGetFieldLength. 969 * 970 ******************************************************************************/ 971 972 ACPI_STATUS 973 AcpiDmDumpTable ( 974 UINT32 TableLength, 975 UINT32 TableOffset, 976 void *Table, 977 UINT32 SubtableLength, 978 ACPI_DMTABLE_INFO *Info) 979 { 980 UINT8 *Target; 981 UINT32 CurrentOffset; 982 UINT32 ByteLength; 983 UINT8 Temp8; 984 UINT16 Temp16; 985 UINT32 Temp32; 986 UINT64 Value; 987 const AH_TABLE *TableData; 988 const char *Name; 989 BOOLEAN LastOutputBlankLine = FALSE; 990 ACPI_STATUS Status; 991 char RepairedName[8]; 992 993 994 if (!Info) 995 { 996 AcpiOsPrintf ("Display not implemented\n"); 997 return (AE_NOT_IMPLEMENTED); 998 } 999 1000 /* Walk entire Info table; Null name terminates */ 1001 1002 for (; Info->Name; Info++) 1003 { 1004 /* 1005 * Target points to the field within the ACPI Table. CurrentOffset is 1006 * the offset of the field from the start of the main table. 1007 */ 1008 Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset); 1009 CurrentOffset = TableOffset + Info->Offset; 1010 1011 /* Check for beyond subtable end or (worse) beyond EOT */ 1012 1013 if (SubtableLength && (Info->Offset > SubtableLength)) 1014 { 1015 AcpiOsPrintf ( 1016 "/**** ACPI subtable terminates early (Len %u) - " 1017 "may be older version (dump table) */\n", SubtableLength); 1018 1019 /* Move on to next subtable */ 1020 1021 return (AE_OK); 1022 } 1023 1024 if (CurrentOffset >= TableLength) 1025 { 1026 AcpiOsPrintf ( 1027 "/**** ACPI table terminates " 1028 "in the middle of a data structure! (dump table)\n" 1029 "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength); 1030 return (AE_BAD_DATA); 1031 } 1032 1033 /* Generate the byte length for this field */ 1034 1035 switch (Info->Opcode) 1036 { 1037 case ACPI_DMT_UINT8: 1038 case ACPI_DMT_CHKSUM: 1039 case ACPI_DMT_SPACEID: 1040 case ACPI_DMT_ACCWIDTH: 1041 case ACPI_DMT_CEDT: 1042 case ACPI_DMT_IVRS: 1043 case ACPI_DMT_IVRS_DE: 1044 case ACPI_DMT_GTDT: 1045 case ACPI_DMT_MADT: 1046 case ACPI_DMT_MPAM_LOCATOR: 1047 case ACPI_DMT_PCCT: 1048 case ACPI_DMT_PMTT: 1049 case ACPI_DMT_PPTT: 1050 case ACPI_DMT_RGRT: 1051 case ACPI_DMT_SDEV: 1052 case ACPI_DMT_SRAT: 1053 case ACPI_DMT_AEST: 1054 case ACPI_DMT_AEST_RES: 1055 case ACPI_DMT_AEST_XFACE: 1056 case ACPI_DMT_AEST_XRUPT: 1057 case ACPI_DMT_ASF: 1058 case ACPI_DMT_CDAT: 1059 case ACPI_DMT_HESTNTYP: 1060 case ACPI_DMT_FADTPM: 1061 case ACPI_DMT_EINJACT: 1062 case ACPI_DMT_EINJINST: 1063 case ACPI_DMT_ERSTACT: 1064 case ACPI_DMT_ERSTINST: 1065 case ACPI_DMT_DMAR_SCOPE: 1066 case ACPI_DMT_IOVTDEV: 1067 case ACPI_DMT_VIOT: 1068 1069 ByteLength = 1; 1070 break; 1071 1072 case ACPI_DMT_ASPT: 1073 case ACPI_DMT_UINT16: 1074 case ACPI_DMT_DMAR: 1075 case ACPI_DMT_ERDT: 1076 case ACPI_DMT_HEST: 1077 case ACPI_DMT_HMAT: 1078 case ACPI_DMT_IOVT: 1079 case ACPI_DMT_NFIT: 1080 case ACPI_DMT_PHAT: 1081 case ACPI_DMT_RHCT: 1082 1083 ByteLength = 2; 1084 break; 1085 1086 case ACPI_DMT_UINT24: 1087 1088 ByteLength = 3; 1089 break; 1090 1091 case ACPI_DMT_UINT32: 1092 case ACPI_DMT_AEST_CACHE: 1093 case ACPI_DMT_AEST_GIC: 1094 case ACPI_DMT_NAME4: 1095 case ACPI_DMT_SIG: 1096 case ACPI_DMT_LPIT: 1097 case ACPI_DMT_TPM2: 1098 1099 ByteLength = 4; 1100 break; 1101 1102 case ACPI_DMT_UINT40: 1103 1104 ByteLength = 5; 1105 break; 1106 1107 case ACPI_DMT_UINT48: 1108 case ACPI_DMT_NAME6: 1109 1110 ByteLength = 6; 1111 break; 1112 1113 case ACPI_DMT_UINT56: 1114 case ACPI_DMT_BUF7: 1115 1116 ByteLength = 7; 1117 break; 1118 1119 case ACPI_DMT_UINT64: 1120 case ACPI_DMT_NAME8: 1121 1122 ByteLength = 8; 1123 break; 1124 1125 case ACPI_DMT_BUF10: 1126 1127 ByteLength = 10; 1128 break; 1129 1130 case ACPI_DMT_BUF11: 1131 1132 ByteLength = 11; 1133 break; 1134 1135 case ACPI_DMT_BUF12: 1136 1137 ByteLength = 12; 1138 break; 1139 1140 case ACPI_DMT_BUF16: 1141 case ACPI_DMT_UUID: 1142 1143 ByteLength = 16; 1144 break; 1145 1146 case ACPI_DMT_BUF18: 1147 1148 ByteLength = 18; 1149 break; 1150 1151 case ACPI_DMT_BUF24: 1152 1153 ByteLength = 24; 1154 break; 1155 1156 case ACPI_DMT_BUF26: 1157 1158 ByteLength = 26; 1159 break; 1160 1161 case ACPI_DMT_BUF32: 1162 1163 ByteLength = 32; 1164 break; 1165 1166 case ACPI_DMT_BUF112: 1167 1168 ByteLength = 112; 1169 break; 1170 1171 case ACPI_DMT_BUF128: 1172 1173 ByteLength = 128; 1174 break; 1175 1176 case ACPI_DMT_WPBT_UNICODE: 1177 1178 ByteLength = SubtableLength; 1179 CurrentOffset = sizeof (ACPI_TABLE_WPBT); 1180 break; 1181 1182 case ACPI_DMT_UNICODE: 1183 case ACPI_DMT_BUFFER: 1184 case ACPI_DMT_RAW_BUFFER: 1185 1186 ByteLength = SubtableLength; 1187 break; 1188 1189 case ACPI_DMT_PMTT_VENDOR: 1190 /* 1191 * Calculate the length of the vendor data for the PMTT table: 1192 * Length = (Current Subtable ptr + Subtable length) - 1193 * Start of the vendor data (Target) 1194 */ 1195 ByteLength = ((ACPI_CAST_PTR (char, Table) + 1196 (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) - 1197 ACPI_CAST_PTR (char, Target)); 1198 break; 1199 1200 case ACPI_DMT_STRING: 1201 1202 ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1; 1203 break; 1204 1205 case ACPI_DMT_IVRS_UNTERMINATED_STRING: 1206 1207 ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength); 1208 break; 1209 1210 case ACPI_DMT_GAS: 1211 1212 if (!LastOutputBlankLine) 1213 { 1214 AcpiOsPrintf ("\n"); 1215 LastOutputBlankLine = TRUE; 1216 } 1217 1218 ByteLength = sizeof (ACPI_GENERIC_ADDRESS); 1219 break; 1220 1221 case ACPI_DMT_HESTNTFY: 1222 1223 if (!LastOutputBlankLine) 1224 { 1225 AcpiOsPrintf ("\n"); 1226 LastOutputBlankLine = TRUE; 1227 } 1228 1229 ByteLength = sizeof (ACPI_HEST_NOTIFY); 1230 break; 1231 1232 case ACPI_DMT_IORTMEM: 1233 1234 if (!LastOutputBlankLine) 1235 { 1236 LastOutputBlankLine = FALSE; 1237 } 1238 1239 ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS); 1240 break; 1241 1242 default: 1243 1244 ByteLength = 0; 1245 break; 1246 } 1247 1248 /* Check if we are beyond a subtable, or (worse) beyond EOT */ 1249 1250 if (CurrentOffset + ByteLength > TableLength) 1251 { 1252 if (SubtableLength) 1253 { 1254 AcpiOsPrintf ( 1255 "/**** ACPI subtable terminates early - " 1256 "may be older version (dump table) */\n"); 1257 1258 /* Move on to next subtable */ 1259 1260 return (AE_OK); 1261 } 1262 1263 AcpiOsPrintf ( 1264 "/**** ACPI table terminates " 1265 "in the middle of a data structure! */\n"); 1266 return (AE_BAD_DATA); 1267 } 1268 1269 if (Info->Opcode == ACPI_DMT_EXTRA_TEXT) 1270 { 1271 AcpiOsPrintf ("%s", Info->Name); 1272 continue; 1273 } 1274 1275 /* Start a new line and decode the opcode */ 1276 1277 AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name); 1278 1279 switch (Info->Opcode) 1280 { 1281 /* Single-bit Flag fields. Note: Opcode is the bit position */ 1282 1283 case ACPI_DMT_FLAG0: 1284 case ACPI_DMT_FLAG1: 1285 case ACPI_DMT_FLAG2: 1286 case ACPI_DMT_FLAG3: 1287 case ACPI_DMT_FLAG4: 1288 case ACPI_DMT_FLAG5: 1289 case ACPI_DMT_FLAG6: 1290 case ACPI_DMT_FLAG7: 1291 1292 AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01); 1293 break; 1294 1295 /* 2-bit Flag fields */ 1296 1297 case ACPI_DMT_FLAGS0: 1298 1299 AcpiOsPrintf ("%1.1X\n", *Target & 0x03); 1300 break; 1301 1302 case ACPI_DMT_FLAGS1: 1303 1304 AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03); 1305 break; 1306 1307 case ACPI_DMT_FLAGS2: 1308 1309 AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03); 1310 break; 1311 1312 case ACPI_DMT_FLAGS8_2: 1313 1314 AcpiOsPrintf ("%2.2X\n", (*Target >> 2) & 0xFF); 1315 break; 1316 1317 case ACPI_DMT_FLAGS4: 1318 1319 AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03); 1320 break; 1321 1322 case ACPI_DMT_FLAGS4_0: 1323 1324 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F); 1325 break; 1326 1327 case ACPI_DMT_FLAGS4_4: 1328 1329 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F); 1330 break; 1331 1332 case ACPI_DMT_FLAGS4_8: 1333 1334 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F); 1335 break; 1336 1337 case ACPI_DMT_FLAGS4_12: 1338 1339 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F); 1340 break; 1341 1342 case ACPI_DMT_FLAGS16_16: 1343 1344 AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF); 1345 break; 1346 1347 /* Integer Data Types */ 1348 1349 case ACPI_DMT_UINT8: 1350 case ACPI_DMT_UINT16: 1351 case ACPI_DMT_UINT24: 1352 case ACPI_DMT_UINT32: 1353 case ACPI_DMT_UINT40: 1354 case ACPI_DMT_UINT48: 1355 case ACPI_DMT_UINT56: 1356 case ACPI_DMT_UINT64: 1357 /* 1358 * Dump bytes - high byte first, low byte last. 1359 * Note: All ACPI tables are little-endian. 1360 */ 1361 Value = 0; 1362 for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--) 1363 { 1364 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]); 1365 Value |= Target[Temp8 - 1]; 1366 Value <<= 8; 1367 } 1368 1369 if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL)) 1370 { 1371 AcpiOsPrintf (" [Optional field not present]"); 1372 } 1373 1374 AcpiOsPrintf ("\n"); 1375 break; 1376 1377 case ACPI_DMT_BUF7: 1378 case ACPI_DMT_BUF10: 1379 case ACPI_DMT_BUF11: 1380 case ACPI_DMT_BUF12: 1381 case ACPI_DMT_BUF16: 1382 case ACPI_DMT_BUF18: 1383 case ACPI_DMT_BUF24: 1384 case ACPI_DMT_BUF26: 1385 case ACPI_DMT_BUF32: 1386 case ACPI_DMT_BUF112: 1387 case ACPI_DMT_BUF128: 1388 /* 1389 * Buffer: Size depends on the opcode and was set above. 1390 * Each hex byte is separated with a space. 1391 * Multiple lines are separated by line continuation char. 1392 */ 1393 for (Temp16 = 0; Temp16 < ByteLength; Temp16++) 1394 { 1395 AcpiOsPrintf ("%2.2X", Target[Temp16]); 1396 if ((UINT32) (Temp16 + 1) < ByteLength) 1397 { 1398 if ((Temp16 > 0) && (!((Temp16+1) % 16))) 1399 { 1400 AcpiOsPrintf (" \\\n"); /* Line continuation */ 1401 AcpiDmLineHeader (0, 0, NULL); 1402 } 1403 else 1404 { 1405 AcpiOsPrintf (" "); 1406 } 1407 } 1408 } 1409 1410 AcpiOsPrintf ("\n"); 1411 break; 1412 1413 case ACPI_DMT_UUID: 1414 1415 /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ 1416 1417 (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer); 1418 1419 AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer); 1420 break; 1421 1422 case ACPI_DMT_STRING: 1423 1424 AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target)); 1425 break; 1426 1427 case ACPI_DMT_IVRS_UNTERMINATED_STRING: 1428 1429 AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target)); 1430 break; 1431 1432 /* Fixed length ASCII name fields */ 1433 1434 case ACPI_DMT_SIG: 1435 1436 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4); 1437 AcpiOsPrintf ("\"%.4s\" ", RepairedName); 1438 1439 TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target)); 1440 if (TableData) 1441 { 1442 AcpiOsPrintf (STRING_FORMAT, TableData->Description); 1443 } 1444 else 1445 { 1446 AcpiOsPrintf ("\n"); 1447 } 1448 break; 1449 1450 case ACPI_DMT_NAME4: 1451 1452 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4); 1453 AcpiOsPrintf ("\"%.4s\"\n", RepairedName); 1454 break; 1455 1456 case ACPI_DMT_NAME6: 1457 1458 AcpiUtCheckAndRepairAscii (Target, RepairedName, 6); 1459 AcpiOsPrintf ("\"%.6s\"\n", RepairedName); 1460 break; 1461 1462 case ACPI_DMT_NAME8: 1463 1464 AcpiUtCheckAndRepairAscii (Target, RepairedName, 8); 1465 AcpiOsPrintf ("\"%.8s\"\n", RepairedName); 1466 break; 1467 1468 /* Special Data Types */ 1469 1470 case ACPI_DMT_CHKSUM: 1471 1472 /* Checksum, display and validate */ 1473 1474 AcpiOsPrintf ("%2.2X", *Target); 1475 Temp8 = AcpiUtGenerateChecksum (Table, 1476 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, 1477 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); 1478 1479 if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum) 1480 { 1481 AcpiOsPrintf ( 1482 " /* Incorrect checksum, should be %2.2X */", Temp8); 1483 } 1484 1485 AcpiOsPrintf ("\n"); 1486 break; 1487 1488 case ACPI_DMT_SPACEID: 1489 1490 /* Address Space ID */ 1491 1492 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target)); 1493 break; 1494 1495 case ACPI_DMT_ACCWIDTH: 1496 1497 /* Encoded Access Width */ 1498 1499 Temp8 = *Target; 1500 if (Temp8 > ACPI_GAS_WIDTH_RESERVED) 1501 { 1502 Temp8 = ACPI_GAS_WIDTH_RESERVED; 1503 } 1504 1505 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]); 1506 break; 1507 1508 case ACPI_DMT_GAS: 1509 1510 /* Generic Address Structure */ 1511 1512 AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure"); 1513 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1514 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas); 1515 if (ACPI_FAILURE (Status)) 1516 { 1517 return (Status); 1518 } 1519 1520 AcpiOsPrintf ("\n"); 1521 LastOutputBlankLine = TRUE; 1522 break; 1523 1524 case ACPI_DMT_AEST: 1525 1526 /* AEST subtable types */ 1527 1528 Temp8 = *Target; 1529 if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED) 1530 { 1531 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED; 1532 } 1533 1534 AcpiOsPrintf (UINT8_FORMAT, *Target, 1535 AcpiDmAestSubnames[Temp8]); 1536 break; 1537 1538 case ACPI_DMT_AEST_CACHE: 1539 1540 /* AEST cache resource subtable */ 1541 1542 Temp32 = *Target; 1543 if (Temp32 > ACPI_AEST_CACHE_RESERVED) 1544 { 1545 Temp32 = ACPI_AEST_CACHE_RESERVED; 1546 } 1547 1548 AcpiOsPrintf (UINT32_FORMAT, *Target, 1549 AcpiDmAestCacheNames[Temp32]); 1550 break; 1551 1552 case ACPI_DMT_AEST_GIC: 1553 1554 /* AEST GIC error subtable */ 1555 1556 Temp32 = *Target; 1557 if (Temp32 > ACPI_AEST_GIC_RESERVED) 1558 { 1559 Temp32 = ACPI_AEST_GIC_RESERVED; 1560 } 1561 1562 AcpiOsPrintf (UINT32_FORMAT, *Target, 1563 AcpiDmAestGicNames[Temp32]); 1564 break; 1565 1566 case ACPI_DMT_AEST_RES: 1567 1568 /* AEST resource type subtable */ 1569 1570 Temp8 = *Target; 1571 if (Temp8 > ACPI_AEST_RESOURCE_RESERVED) 1572 { 1573 Temp8 = ACPI_AEST_RESOURCE_RESERVED; 1574 } 1575 1576 AcpiOsPrintf (UINT8_FORMAT, *Target, 1577 AcpiDmAestResourceNames[Temp8]); 1578 break; 1579 1580 case ACPI_DMT_AEST_XFACE: 1581 1582 /* AEST interface structure types */ 1583 1584 Temp8 = *Target; 1585 if (Temp8 > ACPI_AEST_XFACE_RESERVED) 1586 { 1587 Temp8 = ACPI_AEST_XFACE_RESERVED; 1588 } 1589 1590 AcpiOsPrintf (UINT8_FORMAT, *Target, 1591 AcpiDmAestXfaceNames[Temp8]); 1592 break; 1593 1594 case ACPI_DMT_AEST_XRUPT: 1595 1596 /* AEST interrupt structure types */ 1597 1598 Temp8 = *Target; 1599 if (Temp8 > ACPI_AEST_XRUPT_RESERVED) 1600 { 1601 Temp8 = ACPI_AEST_XRUPT_RESERVED; 1602 } 1603 1604 AcpiOsPrintf (UINT8_FORMAT, *Target, 1605 AcpiDmAestXruptNames[Temp8]); 1606 break; 1607 1608 case ACPI_DMT_ASPT: 1609 /* ASPT subtable types */ 1610 Temp16 = ACPI_GET16(Target); 1611 if (Temp16 > ACPI_ASPT_TYPE_UNKNOWN) 1612 { 1613 Temp16 = ACPI_ASPT_TYPE_UNKNOWN; 1614 } 1615 1616 AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmAsptSubnames[Temp16]); 1617 break; 1618 1619 case ACPI_DMT_ASF: 1620 1621 /* ASF subtable types */ 1622 1623 Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */ 1624 if (Temp16 > ACPI_ASF_TYPE_RESERVED) 1625 { 1626 Temp16 = ACPI_ASF_TYPE_RESERVED; 1627 } 1628 1629 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); 1630 break; 1631 1632 case ACPI_DMT_CDAT: 1633 1634 /* CDAT subtable types */ 1635 1636 Temp8 = *Target; 1637 if (Temp8 > ACPI_CDAT_TYPE_RESERVED) 1638 { 1639 Temp8 = ACPI_CDAT_TYPE_RESERVED; 1640 } 1641 1642 AcpiOsPrintf (UINT8_FORMAT, *Target, 1643 AcpiDmCdatSubnames[Temp8]); 1644 break; 1645 1646 case ACPI_DMT_CEDT: 1647 1648 /* CEDT subtable types */ 1649 1650 Temp8 = *Target; 1651 if (Temp8 > ACPI_CEDT_TYPE_RESERVED) 1652 { 1653 Temp8 = ACPI_CEDT_TYPE_RESERVED; 1654 } 1655 1656 AcpiOsPrintf (UINT8_FORMAT, *Target, 1657 AcpiDmCedtSubnames[Temp8]); 1658 break; 1659 1660 case ACPI_DMT_DMAR: 1661 1662 /* DMAR subtable types */ 1663 1664 Temp16 = ACPI_GET16 (Target); 1665 if (Temp16 > ACPI_DMAR_TYPE_RESERVED) 1666 { 1667 Temp16 = ACPI_DMAR_TYPE_RESERVED; 1668 } 1669 1670 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1671 AcpiDmDmarSubnames[Temp16]); 1672 break; 1673 1674 case ACPI_DMT_DMAR_SCOPE: 1675 1676 /* DMAR device scope types */ 1677 1678 Temp8 = *Target; 1679 if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED) 1680 { 1681 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED; 1682 } 1683 1684 AcpiOsPrintf (UINT8_FORMAT, *Target, 1685 AcpiDmDmarScope[Temp8]); 1686 break; 1687 1688 case ACPI_DMT_EINJACT: 1689 1690 /* EINJ Action types */ 1691 1692 Temp8 = *Target; 1693 if (Temp8 > ACPI_EINJ_ACTION_RESERVED) 1694 { 1695 Temp8 = ACPI_EINJ_ACTION_RESERVED; 1696 } 1697 1698 AcpiOsPrintf (UINT8_FORMAT, *Target, 1699 AcpiDmEinjActions[Temp8]); 1700 break; 1701 1702 case ACPI_DMT_EINJINST: 1703 1704 /* EINJ Instruction types */ 1705 1706 Temp8 = *Target; 1707 if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED) 1708 { 1709 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED; 1710 } 1711 1712 AcpiOsPrintf (UINT8_FORMAT, *Target, 1713 AcpiDmEinjInstructions[Temp8]); 1714 break; 1715 1716 case ACPI_DMT_ERSTACT: 1717 1718 /* ERST Action types */ 1719 1720 Temp8 = *Target; 1721 if (Temp8 > ACPI_ERST_ACTION_RESERVED) 1722 { 1723 Temp8 = ACPI_ERST_ACTION_RESERVED; 1724 } 1725 1726 AcpiOsPrintf (UINT8_FORMAT, *Target, 1727 AcpiDmErstActions[Temp8]); 1728 break; 1729 1730 case ACPI_DMT_ERDT: 1731 1732 /* ERDT subtable types */ 1733 1734 Temp16 = *Target; 1735 if (Temp16 > ACPI_ERDT_TYPE_RESERVED) 1736 { 1737 Temp16 = ACPI_ERDT_TYPE_RESERVED; 1738 } 1739 1740 AcpiOsPrintf (UINT8_FORMAT, *Target, 1741 AcpiDmErdtSubnames[Temp16]); 1742 break; 1743 1744 case ACPI_DMT_ERSTINST: 1745 1746 /* ERST Instruction types */ 1747 1748 Temp8 = *Target; 1749 if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED) 1750 { 1751 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED; 1752 } 1753 1754 AcpiOsPrintf (UINT8_FORMAT, *Target, 1755 AcpiDmErstInstructions[Temp8]); 1756 break; 1757 1758 case ACPI_DMT_GTDT: 1759 1760 /* GTDT subtable types */ 1761 1762 Temp8 = *Target; 1763 if (Temp8 > ACPI_GTDT_TYPE_RESERVED) 1764 { 1765 Temp8 = ACPI_GTDT_TYPE_RESERVED; 1766 } 1767 1768 AcpiOsPrintf (UINT8_FORMAT, *Target, 1769 AcpiDmGtdtSubnames[Temp8]); 1770 break; 1771 1772 case ACPI_DMT_HEST: 1773 1774 /* HEST subtable types */ 1775 1776 Temp16 = ACPI_GET16 (Target); 1777 if (Temp16 > ACPI_HEST_TYPE_RESERVED) 1778 { 1779 Temp16 = ACPI_HEST_TYPE_RESERVED; 1780 } 1781 1782 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1783 AcpiDmHestSubnames[Temp16]); 1784 break; 1785 1786 case ACPI_DMT_HESTNTFY: 1787 1788 AcpiOsPrintf (STRING_FORMAT, 1789 "Hardware Error Notification Structure"); 1790 1791 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1792 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify); 1793 if (ACPI_FAILURE (Status)) 1794 { 1795 return (Status); 1796 } 1797 1798 AcpiOsPrintf ("\n"); 1799 LastOutputBlankLine = TRUE; 1800 break; 1801 1802 case ACPI_DMT_HESTNTYP: 1803 1804 /* HEST Notify types */ 1805 1806 Temp8 = *Target; 1807 if (Temp8 > ACPI_HEST_NOTIFY_RESERVED) 1808 { 1809 Temp8 = ACPI_HEST_NOTIFY_RESERVED; 1810 } 1811 1812 AcpiOsPrintf (UINT8_FORMAT, *Target, 1813 AcpiDmHestNotifySubnames[Temp8]); 1814 break; 1815 1816 case ACPI_DMT_HMAT: 1817 1818 /* HMAT subtable types */ 1819 1820 Temp16 = *Target; 1821 if (Temp16 > ACPI_HMAT_TYPE_RESERVED) 1822 { 1823 Temp16 = ACPI_HMAT_TYPE_RESERVED; 1824 } 1825 1826 AcpiOsPrintf (UINT16_FORMAT, *Target, 1827 AcpiDmHmatSubnames[Temp16]); 1828 break; 1829 1830 case ACPI_DMT_IORTMEM: 1831 1832 AcpiOsPrintf (STRING_FORMAT, 1833 "IORT Memory Access Properties"); 1834 1835 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target, 1836 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc); 1837 if (ACPI_FAILURE (Status)) 1838 { 1839 return (Status); 1840 } 1841 1842 LastOutputBlankLine = TRUE; 1843 break; 1844 1845 case ACPI_DMT_MADT: 1846 1847 /* MADT subtable types */ 1848 1849 Temp8 = *Target; 1850 if ((Temp8 >= ACPI_MADT_TYPE_RESERVED) && (Temp8 < ACPI_MADT_TYPE_OEM_RESERVED)) 1851 { 1852 Temp8 = ACPI_MADT_TYPE_RESERVED; 1853 } 1854 else if (Temp8 >= ACPI_MADT_TYPE_OEM_RESERVED) 1855 { 1856 Temp8 = ACPI_MADT_TYPE_RESERVED + 1; 1857 } 1858 AcpiOsPrintf (UINT8_FORMAT, *Target, 1859 AcpiDmMadtSubnames[Temp8]); 1860 break; 1861 1862 case ACPI_DMT_MPAM_LOCATOR: 1863 1864 /* MPAM subtable locator types */ 1865 1866 Temp8 = *Target; 1867 if (Temp8 > ACPI_MPAM_LOCATION_TYPE_INTERCONNECT) 1868 { 1869 Temp8 = ACPI_MPAM_LOCATION_TYPE_INTERCONNECT + 1; 1870 } 1871 1872 AcpiOsPrintf (UINT8_FORMAT, *Target, 1873 AcpiDmMpamSubnames[Temp8]); 1874 break; 1875 1876 case ACPI_DMT_NFIT: 1877 1878 /* NFIT subtable types */ 1879 1880 Temp16 = ACPI_GET16 (Target); 1881 if (Temp16 > ACPI_NFIT_TYPE_RESERVED) 1882 { 1883 Temp16 = ACPI_NFIT_TYPE_RESERVED; 1884 } 1885 1886 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1887 AcpiDmNfitSubnames[Temp16]); 1888 break; 1889 1890 case ACPI_DMT_PCCT: 1891 1892 /* PCCT subtable types */ 1893 1894 Temp8 = *Target; 1895 if (Temp8 > ACPI_PCCT_TYPE_RESERVED) 1896 { 1897 Temp8 = ACPI_PCCT_TYPE_RESERVED; 1898 } 1899 1900 AcpiOsPrintf (UINT8_FORMAT, *Target, 1901 AcpiDmPcctSubnames[Temp8]); 1902 break; 1903 1904 case ACPI_DMT_PHAT: 1905 1906 /* PHAT subtable types */ 1907 1908 Temp16 = ACPI_GET16 (Target); 1909 if (Temp16 > ACPI_PHAT_TYPE_RESERVED) 1910 { 1911 Temp16 = ACPI_PHAT_TYPE_RESERVED; 1912 } 1913 1914 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1915 AcpiDmPhatSubnames[Temp16]); 1916 break; 1917 1918 case ACPI_DMT_PMTT: 1919 1920 /* PMTT subtable types */ 1921 1922 Temp8 = *Target; 1923 if (Temp8 == ACPI_PMTT_TYPE_VENDOR) 1924 { 1925 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1; 1926 } 1927 else if (Temp8 > ACPI_PMTT_TYPE_RESERVED) 1928 { 1929 Temp8 = ACPI_PMTT_TYPE_RESERVED; 1930 } 1931 AcpiOsPrintf (UINT8_FORMAT, *Target, 1932 AcpiDmPmttSubnames[Temp8]); 1933 break; 1934 1935 case ACPI_DMT_PPTT: 1936 1937 /* PPTT subtable types */ 1938 1939 Temp8 = *Target; 1940 if (Temp8 > ACPI_PPTT_TYPE_RESERVED) 1941 { 1942 Temp8 = ACPI_PPTT_TYPE_RESERVED; 1943 } 1944 1945 AcpiOsPrintf (UINT8_FORMAT, *Target, 1946 AcpiDmPpttSubnames[Temp8]); 1947 break; 1948 1949 case ACPI_DMT_UNICODE: 1950 case ACPI_DMT_WPBT_UNICODE: 1951 1952 if (ByteLength == 0) 1953 { 1954 AcpiOsPrintf ("/* Zero-length Data */\n"); 1955 break; 1956 } 1957 1958 AcpiDmDumpUnicode (Table, 0, ByteLength); 1959 break; 1960 1961 case ACPI_DMT_RAW_BUFFER: 1962 case ACPI_DMT_BUFFER: 1963 case ACPI_DMT_PMTT_VENDOR: 1964 1965 if (ByteLength == 0) 1966 { 1967 AcpiOsPrintf ("/* Zero-length Data */\n"); 1968 break; 1969 } 1970 1971 AcpiDmDumpBuffer (Target, 0, ByteLength, CurrentOffset, NULL); 1972 break; 1973 1974 case ACPI_DMT_RGRT: 1975 1976 /* RGRT subtable types */ 1977 1978 Temp8 = *Target; 1979 if (Temp8 >= ACPI_RGRT_TYPE_RESERVED) 1980 { 1981 Temp8 = ACPI_RGRT_TYPE_RESERVED0; 1982 } 1983 1984 AcpiOsPrintf (UINT8_FORMAT, *Target, 1985 AcpiDmRgrtSubnames[Temp8]); 1986 break; 1987 1988 case ACPI_DMT_RHCT: 1989 1990 /* RHCT subtable types */ 1991 1992 Temp16 = ACPI_GET16 (Target); 1993 if (Temp16 == ACPI_RHCT_NODE_TYPE_HART_INFO) 1994 { 1995 Temp16 = ACPI_RHCT_NODE_TYPE_RESERVED; 1996 } 1997 1998 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), 1999 AcpiDmRhctSubnames[Temp16]); 2000 break; 2001 2002 case ACPI_DMT_SDEV: 2003 2004 /* SDEV subtable types */ 2005 2006 Temp8 = *Target; 2007 if (Temp8 > ACPI_SDEV_TYPE_RESERVED) 2008 { 2009 Temp8 = ACPI_SDEV_TYPE_RESERVED; 2010 } 2011 2012 AcpiOsPrintf (UINT8_FORMAT, *Target, 2013 AcpiDmSdevSubnames[Temp8]); 2014 break; 2015 2016 case ACPI_DMT_SRAT: 2017 2018 /* SRAT subtable types */ 2019 2020 Temp8 = *Target; 2021 if (Temp8 > ACPI_SRAT_TYPE_RESERVED) 2022 { 2023 Temp8 = ACPI_SRAT_TYPE_RESERVED; 2024 } 2025 2026 AcpiOsPrintf (UINT8_FORMAT, *Target, 2027 AcpiDmSratSubnames[Temp8]); 2028 break; 2029 2030 case ACPI_DMT_TPM2: 2031 2032 /* TPM2 Start Method types */ 2033 2034 Temp8 = *Target; 2035 if (Temp8 > ACPI_TPM2_RESERVED) 2036 { 2037 Temp8 = ACPI_TPM2_RESERVED; 2038 } 2039 2040 AcpiOsPrintf (UINT8_FORMAT, *Target, 2041 AcpiDmTpm2Subnames[Temp8]); 2042 break; 2043 2044 2045 case ACPI_DMT_FADTPM: 2046 2047 /* FADT Preferred PM Profile names */ 2048 2049 Temp8 = *Target; 2050 if (Temp8 > ACPI_FADT_PM_RESERVED) 2051 { 2052 Temp8 = ACPI_FADT_PM_RESERVED; 2053 } 2054 2055 AcpiOsPrintf (UINT8_FORMAT, *Target, 2056 AcpiDmFadtProfiles[Temp8]); 2057 break; 2058 2059 case ACPI_DMT_IOVT: 2060 2061 /* IOVT subtable types */ 2062 2063 Temp16 = ACPI_GET16(Target); 2064 if (Temp16 > ACPI_IOVT_IOMMU_RESERVED) 2065 { 2066 Temp16 = ACPI_IOVT_IOMMU_RESERVED; 2067 } 2068 2069 AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmIovtSubnames[Temp16]); 2070 break; 2071 2072 case ACPI_DMT_IOVTDEV: 2073 2074 /* IOVT subtable types */ 2075 2076 Temp8 = *Target; 2077 if (Temp8 > ACPI_IOVT_DEVICE_ENTRY_RESERVED) 2078 { 2079 Temp8 = ACPI_IOVT_DEVICE_ENTRY_RESERVED; 2080 } 2081 2082 AcpiOsPrintf (UINT8_FORMAT, *Target, 2083 AcpiDmIovtdevSubnames[Temp8]); 2084 break; 2085 2086 case ACPI_DMT_IVRS: 2087 2088 /* IVRS subtable types */ 2089 2090 Temp8 = *Target; 2091 switch (Temp8) 2092 { 2093 case ACPI_IVRS_TYPE_HARDWARE1: 2094 case ACPI_IVRS_TYPE_HARDWARE2: 2095 2096 Name = AcpiDmIvrsSubnames[0]; 2097 break; 2098 2099 case ACPI_IVRS_TYPE_HARDWARE3: 2100 2101 Name = AcpiDmIvrsSubnames[1]; 2102 break; 2103 2104 case ACPI_IVRS_TYPE_MEMORY1: 2105 case ACPI_IVRS_TYPE_MEMORY2: 2106 case ACPI_IVRS_TYPE_MEMORY3: 2107 2108 Name = AcpiDmIvrsSubnames[2]; 2109 break; 2110 2111 default: 2112 2113 Name = AcpiDmIvrsSubnames[3]; 2114 break; 2115 } 2116 2117 AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 2118 break; 2119 2120 case ACPI_DMT_IVRS_DE: 2121 2122 /* IVRS device entry types */ 2123 2124 Temp8 = *Target; 2125 switch (Temp8) 2126 { 2127 case ACPI_IVRS_TYPE_ALL: 2128 case ACPI_IVRS_TYPE_SELECT: 2129 case ACPI_IVRS_TYPE_START: 2130 case ACPI_IVRS_TYPE_END: 2131 2132 Name = AcpiDmIvrsDevEntryNames[Temp8]; 2133 break; 2134 2135 case ACPI_IVRS_TYPE_ALIAS_SELECT: 2136 case ACPI_IVRS_TYPE_ALIAS_START: 2137 case ACPI_IVRS_TYPE_EXT_SELECT: 2138 case ACPI_IVRS_TYPE_EXT_START: 2139 case ACPI_IVRS_TYPE_SPECIAL: 2140 2141 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61]; 2142 break; 2143 2144 case ACPI_IVRS_TYPE_HID: 2145 2146 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228]; 2147 break; 2148 2149 default: 2150 Name = AcpiDmIvrsDevEntryNames[0]; /* Unknown/Reserved */ 2151 break; 2152 } 2153 2154 AcpiOsPrintf (UINT8_FORMAT, *Target, Name); 2155 break; 2156 2157 case ACPI_DMT_LPIT: 2158 2159 /* LPIT subtable types */ 2160 2161 Temp32 = ACPI_GET32 (Target); 2162 if (Temp32 > ACPI_LPIT_TYPE_RESERVED) 2163 { 2164 Temp32 = ACPI_LPIT_TYPE_RESERVED; 2165 } 2166 2167 AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target), 2168 AcpiDmLpitSubnames[Temp32]); 2169 break; 2170 2171 case ACPI_DMT_VIOT: 2172 2173 /* VIOT subtable types */ 2174 2175 Temp8 = *Target; 2176 if (Temp8 > ACPI_VIOT_RESERVED) 2177 { 2178 Temp8 = ACPI_VIOT_RESERVED; 2179 } 2180 2181 AcpiOsPrintf (UINT8_FORMAT, *Target, 2182 AcpiDmViotSubnames[Temp8]); 2183 break; 2184 2185 case ACPI_DMT_EXIT: 2186 2187 return (AE_OK); 2188 2189 default: 2190 2191 ACPI_ERROR ((AE_INFO, 2192 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); 2193 return (AE_SUPPORT); 2194 } 2195 } 2196 2197 if (TableOffset && !SubtableLength) 2198 { 2199 /* 2200 * If this table is not the main table, the subtable must have a 2201 * valid length 2202 */ 2203 AcpiOsPrintf ("Invalid zero length subtable\n"); 2204 return (AE_BAD_DATA); 2205 } 2206 2207 return (AE_OK); 2208 } 2209