1 /****************************************************************************** 2 * 3 * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2012, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <contrib/dev/acpica/include/acpi.h> 45 #include <contrib/dev/acpica/include/accommon.h> 46 #include <contrib/dev/acpica/include/acdisasm.h> 47 #include <contrib/dev/acpica/include/actables.h> 48 49 /* This module used for application-level code only */ 50 51 #define _COMPONENT ACPI_CA_DISASSEMBLER 52 ACPI_MODULE_NAME ("dmtbdump") 53 54 55 static void 56 AcpiDmValidateFadtLength ( 57 UINT32 Revision, 58 UINT32 Length); 59 60 61 /******************************************************************************* 62 * 63 * FUNCTION: AcpiDmDumpRsdp 64 * 65 * PARAMETERS: Table - A RSDP 66 * 67 * RETURN: Length of the table (there is not always a length field, 68 * use revision or length if available (ACPI 2.0+)) 69 * 70 * DESCRIPTION: Format the contents of a RSDP 71 * 72 ******************************************************************************/ 73 74 UINT32 75 AcpiDmDumpRsdp ( 76 ACPI_TABLE_HEADER *Table) 77 { 78 ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table); 79 UINT32 Length = sizeof (ACPI_RSDP_COMMON); 80 UINT8 Checksum; 81 82 83 /* Dump the common ACPI 1.0 portion */ 84 85 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1); 86 87 /* Validate the first checksum */ 88 89 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), 90 Rsdp->Checksum); 91 if (Checksum != Rsdp->Checksum) 92 { 93 AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n", 94 Checksum); 95 } 96 97 /* The RSDP for ACPI 2.0+ contains more data and has a Length field */ 98 99 if (Rsdp->Revision > 0) 100 { 101 Length = Rsdp->Length; 102 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2); 103 104 /* Validate the extended checksum over entire RSDP */ 105 106 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), 107 Rsdp->ExtendedChecksum); 108 if (Checksum != Rsdp->ExtendedChecksum) 109 { 110 AcpiOsPrintf ( 111 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n", 112 Checksum); 113 } 114 } 115 116 return (Length); 117 } 118 119 120 /******************************************************************************* 121 * 122 * FUNCTION: AcpiDmDumpRsdt 123 * 124 * PARAMETERS: Table - A RSDT 125 * 126 * RETURN: None 127 * 128 * DESCRIPTION: Format the contents of a RSDT 129 * 130 ******************************************************************************/ 131 132 void 133 AcpiDmDumpRsdt ( 134 ACPI_TABLE_HEADER *Table) 135 { 136 UINT32 *Array; 137 UINT32 Entries; 138 UINT32 Offset; 139 UINT32 i; 140 141 142 /* Point to start of table pointer array */ 143 144 Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry; 145 Offset = sizeof (ACPI_TABLE_HEADER); 146 147 /* RSDT uses 32-bit pointers */ 148 149 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); 150 151 for (i = 0; i < Entries; i++) 152 { 153 AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); 154 AcpiOsPrintf ("%8.8X\n", Array[i]); 155 Offset += sizeof (UINT32); 156 } 157 } 158 159 160 /******************************************************************************* 161 * 162 * FUNCTION: AcpiDmDumpXsdt 163 * 164 * PARAMETERS: Table - A XSDT 165 * 166 * RETURN: None 167 * 168 * DESCRIPTION: Format the contents of a XSDT 169 * 170 ******************************************************************************/ 171 172 void 173 AcpiDmDumpXsdt ( 174 ACPI_TABLE_HEADER *Table) 175 { 176 UINT64 *Array; 177 UINT32 Entries; 178 UINT32 Offset; 179 UINT32 i; 180 181 182 /* Point to start of table pointer array */ 183 184 Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry; 185 Offset = sizeof (ACPI_TABLE_HEADER); 186 187 /* XSDT uses 64-bit pointers */ 188 189 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); 190 191 for (i = 0; i < Entries; i++) 192 { 193 AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); 194 AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); 195 Offset += sizeof (UINT64); 196 } 197 } 198 199 200 /******************************************************************************* 201 * 202 * FUNCTION: AcpiDmDumpFadt 203 * 204 * PARAMETERS: Table - A FADT 205 * 206 * RETURN: None 207 * 208 * DESCRIPTION: Format the contents of a FADT 209 * 210 * NOTE: We cannot depend on the FADT version to indicate the actual 211 * contents of the FADT because of BIOS bugs. The table length 212 * is the only reliable indicator. 213 * 214 ******************************************************************************/ 215 216 void 217 AcpiDmDumpFadt ( 218 ACPI_TABLE_HEADER *Table) 219 { 220 221 /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ 222 223 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1); 224 225 /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ 226 227 if ((Table->Length > ACPI_FADT_V1_SIZE) && 228 (Table->Length <= ACPI_FADT_V2_SIZE)) 229 { 230 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2); 231 } 232 233 /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ 234 235 else if (Table->Length > ACPI_FADT_V2_SIZE) 236 { 237 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3); 238 239 /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ 240 241 if (Table->Length > ACPI_FADT_V3_SIZE) 242 { 243 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5); 244 } 245 } 246 247 /* Validate various fields in the FADT, including length */ 248 249 AcpiTbCreateLocalFadt (Table, Table->Length); 250 251 /* Validate FADT length against the revision */ 252 253 AcpiDmValidateFadtLength (Table->Revision, Table->Length); 254 } 255 256 257 /******************************************************************************* 258 * 259 * FUNCTION: AcpiDmValidateFadtLength 260 * 261 * PARAMETERS: Revision - FADT revision (Header->Revision) 262 * Length - FADT length (Header->Length 263 * 264 * RETURN: None 265 * 266 * DESCRIPTION: Check the FADT revision against the expected table length for 267 * that revision. Issue a warning if the length is not what was 268 * expected. This seems to be such a common BIOS bug that the 269 * FADT revision has been rendered virtually meaningless. 270 * 271 ******************************************************************************/ 272 273 static void 274 AcpiDmValidateFadtLength ( 275 UINT32 Revision, 276 UINT32 Length) 277 { 278 UINT32 ExpectedLength; 279 280 281 switch (Revision) 282 { 283 case 0: 284 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); 285 return; 286 287 case 1: 288 ExpectedLength = ACPI_FADT_V1_SIZE; 289 break; 290 291 case 2: 292 ExpectedLength = ACPI_FADT_V2_SIZE; 293 break; 294 295 case 3: 296 case 4: 297 ExpectedLength = ACPI_FADT_V3_SIZE; 298 break; 299 300 case 5: 301 ExpectedLength = ACPI_FADT_V5_SIZE; 302 break; 303 304 default: 305 return; 306 } 307 308 if (Length == ExpectedLength) 309 { 310 return; 311 } 312 313 AcpiOsPrintf ( 314 "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n", 315 Revision, Length, ExpectedLength); 316 } 317 318 319 /******************************************************************************* 320 * 321 * FUNCTION: AcpiDmDumpAsf 322 * 323 * PARAMETERS: Table - A ASF table 324 * 325 * RETURN: None 326 * 327 * DESCRIPTION: Format the contents of a ASF table 328 * 329 ******************************************************************************/ 330 331 void 332 AcpiDmDumpAsf ( 333 ACPI_TABLE_HEADER *Table) 334 { 335 ACPI_STATUS Status; 336 UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 337 ACPI_ASF_INFO *SubTable; 338 ACPI_DMTABLE_INFO *InfoTable; 339 ACPI_DMTABLE_INFO *DataInfoTable = NULL; 340 UINT8 *DataTable = NULL; 341 UINT32 DataCount = 0; 342 UINT32 DataLength = 0; 343 UINT32 DataOffset = 0; 344 UINT32 i; 345 UINT8 Type; 346 347 348 /* No main table, only sub-tables */ 349 350 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); 351 while (Offset < Table->Length) 352 { 353 /* Common sub-table header */ 354 355 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 356 SubTable->Header.Length, AcpiDmTableInfoAsfHdr); 357 if (ACPI_FAILURE (Status)) 358 { 359 return; 360 } 361 362 /* The actual type is the lower 7 bits of Type */ 363 364 Type = (UINT8) (SubTable->Header.Type & 0x7F); 365 366 switch (Type) 367 { 368 case ACPI_ASF_TYPE_INFO: 369 InfoTable = AcpiDmTableInfoAsf0; 370 break; 371 372 case ACPI_ASF_TYPE_ALERT: 373 InfoTable = AcpiDmTableInfoAsf1; 374 DataInfoTable = AcpiDmTableInfoAsf1a; 375 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); 376 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts; 377 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength; 378 DataOffset = Offset + sizeof (ACPI_ASF_ALERT); 379 break; 380 381 case ACPI_ASF_TYPE_CONTROL: 382 InfoTable = AcpiDmTableInfoAsf2; 383 DataInfoTable = AcpiDmTableInfoAsf2a; 384 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); 385 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls; 386 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength; 387 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); 388 break; 389 390 case ACPI_ASF_TYPE_BOOT: 391 InfoTable = AcpiDmTableInfoAsf3; 392 break; 393 394 case ACPI_ASF_TYPE_ADDRESS: 395 InfoTable = AcpiDmTableInfoAsf4; 396 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); 397 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; 398 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); 399 break; 400 401 default: 402 AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type); 403 return; 404 } 405 406 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 407 SubTable->Header.Length, InfoTable); 408 if (ACPI_FAILURE (Status)) 409 { 410 return; 411 } 412 413 /* Dump variable-length extra data */ 414 415 switch (Type) 416 { 417 case ACPI_ASF_TYPE_ALERT: 418 case ACPI_ASF_TYPE_CONTROL: 419 420 for (i = 0; i < DataCount; i++) 421 { 422 AcpiOsPrintf ("\n"); 423 Status = AcpiDmDumpTable (Table->Length, DataOffset, 424 DataTable, DataLength, DataInfoTable); 425 if (ACPI_FAILURE (Status)) 426 { 427 return; 428 } 429 430 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength); 431 DataOffset += DataLength; 432 } 433 break; 434 435 case ACPI_ASF_TYPE_ADDRESS: 436 437 for (i = 0; i < DataLength; i++) 438 { 439 if (!(i % 16)) 440 { 441 AcpiDmLineHeader (DataOffset, 1, "Addresses"); 442 } 443 444 AcpiOsPrintf ("%2.2X ", *DataTable); 445 DataTable++; 446 DataOffset++; 447 if (DataOffset > Table->Length) 448 { 449 AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n"); 450 return; 451 } 452 } 453 454 AcpiOsPrintf ("\n"); 455 break; 456 457 default: 458 break; 459 } 460 461 AcpiOsPrintf ("\n"); 462 463 /* Point to next sub-table */ 464 465 if (!SubTable->Header.Length) 466 { 467 AcpiOsPrintf ("Invalid zero subtable header length\n"); 468 return; 469 } 470 471 Offset += SubTable->Header.Length; 472 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length); 473 } 474 } 475 476 477 /******************************************************************************* 478 * 479 * FUNCTION: AcpiDmDumpCpep 480 * 481 * PARAMETERS: Table - A CPEP table 482 * 483 * RETURN: None 484 * 485 * DESCRIPTION: Format the contents of a CPEP. This table type consists 486 * of an open-ended number of subtables. 487 * 488 ******************************************************************************/ 489 490 void 491 AcpiDmDumpCpep ( 492 ACPI_TABLE_HEADER *Table) 493 { 494 ACPI_STATUS Status; 495 ACPI_CPEP_POLLING *SubTable; 496 UINT32 Length = Table->Length; 497 UINT32 Offset = sizeof (ACPI_TABLE_CPEP); 498 499 500 /* Main table */ 501 502 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep); 503 if (ACPI_FAILURE (Status)) 504 { 505 return; 506 } 507 508 /* Sub-tables */ 509 510 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); 511 while (Offset < Table->Length) 512 { 513 AcpiOsPrintf ("\n"); 514 Status = AcpiDmDumpTable (Length, Offset, SubTable, 515 SubTable->Header.Length, AcpiDmTableInfoCpep0); 516 if (ACPI_FAILURE (Status)) 517 { 518 return; 519 } 520 521 /* Point to next sub-table */ 522 523 Offset += SubTable->Header.Length; 524 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, 525 SubTable->Header.Length); 526 } 527 } 528 529 530 /******************************************************************************* 531 * 532 * FUNCTION: AcpiDmDumpDmar 533 * 534 * PARAMETERS: Table - A DMAR table 535 * 536 * RETURN: None 537 * 538 * DESCRIPTION: Format the contents of a DMAR. This table type consists 539 * of an open-ended number of subtables. 540 * 541 ******************************************************************************/ 542 543 void 544 AcpiDmDumpDmar ( 545 ACPI_TABLE_HEADER *Table) 546 { 547 ACPI_STATUS Status; 548 ACPI_DMAR_HEADER *SubTable; 549 UINT32 Length = Table->Length; 550 UINT32 Offset = sizeof (ACPI_TABLE_DMAR); 551 ACPI_DMTABLE_INFO *InfoTable; 552 ACPI_DMAR_DEVICE_SCOPE *ScopeTable; 553 UINT32 ScopeOffset; 554 UINT8 *PciPath; 555 UINT32 PathOffset; 556 557 558 /* Main table */ 559 560 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar); 561 if (ACPI_FAILURE (Status)) 562 { 563 return; 564 } 565 566 /* Sub-tables */ 567 568 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); 569 while (Offset < Table->Length) 570 { 571 /* Common sub-table header */ 572 573 AcpiOsPrintf ("\n"); 574 Status = AcpiDmDumpTable (Length, Offset, SubTable, 575 SubTable->Length, AcpiDmTableInfoDmarHdr); 576 if (ACPI_FAILURE (Status)) 577 { 578 return; 579 } 580 581 switch (SubTable->Type) 582 { 583 case ACPI_DMAR_TYPE_HARDWARE_UNIT: 584 InfoTable = AcpiDmTableInfoDmar0; 585 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); 586 break; 587 case ACPI_DMAR_TYPE_RESERVED_MEMORY: 588 InfoTable = AcpiDmTableInfoDmar1; 589 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); 590 break; 591 case ACPI_DMAR_TYPE_ATSR: 592 InfoTable = AcpiDmTableInfoDmar2; 593 ScopeOffset = sizeof (ACPI_DMAR_ATSR); 594 break; 595 case ACPI_DMAR_HARDWARE_AFFINITY: 596 InfoTable = AcpiDmTableInfoDmar3; 597 ScopeOffset = sizeof (ACPI_DMAR_RHSA); 598 break; 599 default: 600 AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type); 601 return; 602 } 603 604 Status = AcpiDmDumpTable (Length, Offset, SubTable, 605 SubTable->Length, InfoTable); 606 if (ACPI_FAILURE (Status)) 607 { 608 return; 609 } 610 611 /* Dump the device scope entries (if any) */ 612 613 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset); 614 while (ScopeOffset < SubTable->Length) 615 { 616 AcpiOsPrintf ("\n"); 617 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, 618 ScopeTable->Length, AcpiDmTableInfoDmarScope); 619 if (ACPI_FAILURE (Status)) 620 { 621 return; 622 } 623 624 /* Dump the PCI Path entries for this device scope */ 625 626 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */ 627 628 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable, 629 sizeof (ACPI_DMAR_DEVICE_SCOPE)); 630 631 while (PathOffset < ScopeTable->Length) 632 { 633 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path"); 634 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]); 635 636 /* Point to next PCI Path entry */ 637 638 PathOffset += 2; 639 PciPath += 2; 640 } 641 642 /* Point to next device scope entry */ 643 644 ScopeOffset += ScopeTable->Length; 645 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, 646 ScopeTable, ScopeTable->Length); 647 } 648 649 /* Point to next sub-table */ 650 651 Offset += SubTable->Length; 652 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length); 653 } 654 } 655 656 657 /******************************************************************************* 658 * 659 * FUNCTION: AcpiDmDumpEinj 660 * 661 * PARAMETERS: Table - A EINJ table 662 * 663 * RETURN: None 664 * 665 * DESCRIPTION: Format the contents of a EINJ. This table type consists 666 * of an open-ended number of subtables. 667 * 668 ******************************************************************************/ 669 670 void 671 AcpiDmDumpEinj ( 672 ACPI_TABLE_HEADER *Table) 673 { 674 ACPI_STATUS Status; 675 ACPI_WHEA_HEADER *SubTable; 676 UINT32 Length = Table->Length; 677 UINT32 Offset = sizeof (ACPI_TABLE_EINJ); 678 679 680 /* Main table */ 681 682 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj); 683 if (ACPI_FAILURE (Status)) 684 { 685 return; 686 } 687 688 /* Sub-tables */ 689 690 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 691 while (Offset < Table->Length) 692 { 693 AcpiOsPrintf ("\n"); 694 Status = AcpiDmDumpTable (Length, Offset, SubTable, 695 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); 696 if (ACPI_FAILURE (Status)) 697 { 698 return; 699 } 700 701 /* Point to next sub-table (each subtable is of fixed length) */ 702 703 Offset += sizeof (ACPI_WHEA_HEADER); 704 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 705 sizeof (ACPI_WHEA_HEADER)); 706 } 707 } 708 709 710 /******************************************************************************* 711 * 712 * FUNCTION: AcpiDmDumpErst 713 * 714 * PARAMETERS: Table - A ERST table 715 * 716 * RETURN: None 717 * 718 * DESCRIPTION: Format the contents of a ERST. This table type consists 719 * of an open-ended number of subtables. 720 * 721 ******************************************************************************/ 722 723 void 724 AcpiDmDumpErst ( 725 ACPI_TABLE_HEADER *Table) 726 { 727 ACPI_STATUS Status; 728 ACPI_WHEA_HEADER *SubTable; 729 UINT32 Length = Table->Length; 730 UINT32 Offset = sizeof (ACPI_TABLE_ERST); 731 732 733 /* Main table */ 734 735 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst); 736 if (ACPI_FAILURE (Status)) 737 { 738 return; 739 } 740 741 /* Sub-tables */ 742 743 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 744 while (Offset < Table->Length) 745 { 746 AcpiOsPrintf ("\n"); 747 Status = AcpiDmDumpTable (Length, Offset, SubTable, 748 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); 749 if (ACPI_FAILURE (Status)) 750 { 751 return; 752 } 753 754 /* Point to next sub-table (each subtable is of fixed length) */ 755 756 Offset += sizeof (ACPI_WHEA_HEADER); 757 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 758 sizeof (ACPI_WHEA_HEADER)); 759 } 760 } 761 762 763 /******************************************************************************* 764 * 765 * FUNCTION: AcpiDmDumpFpdt 766 * 767 * PARAMETERS: Table - A FPDT table 768 * 769 * RETURN: None 770 * 771 * DESCRIPTION: Format the contents of a FPDT. This table type consists 772 * of an open-ended number of subtables. 773 * 774 ******************************************************************************/ 775 776 void 777 AcpiDmDumpFpdt ( 778 ACPI_TABLE_HEADER *Table) 779 { 780 ACPI_STATUS Status; 781 ACPI_FPDT_HEADER *SubTable; 782 UINT32 Length = Table->Length; 783 UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 784 ACPI_DMTABLE_INFO *InfoTable; 785 786 787 /* There is no main table (other than the standard ACPI header) */ 788 789 /* Sub-tables */ 790 791 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); 792 while (Offset < Table->Length) 793 { 794 /* Common sub-table header */ 795 796 AcpiOsPrintf ("\n"); 797 Status = AcpiDmDumpTable (Length, Offset, SubTable, 798 SubTable->Length, AcpiDmTableInfoFpdtHdr); 799 if (ACPI_FAILURE (Status)) 800 { 801 return; 802 } 803 804 switch (SubTable->Type) 805 { 806 case ACPI_FPDT_TYPE_BOOT: 807 InfoTable = AcpiDmTableInfoFpdt0; 808 break; 809 case ACPI_FPDT_TYPE_S3PERF: 810 InfoTable = AcpiDmTableInfoFpdt1; 811 break; 812 default: 813 AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type); 814 815 /* Attempt to continue */ 816 817 if (!SubTable->Length) 818 { 819 AcpiOsPrintf ("Invalid zero length subtable\n"); 820 return; 821 } 822 goto NextSubTable; 823 } 824 825 Status = AcpiDmDumpTable (Length, Offset, SubTable, 826 SubTable->Length, InfoTable); 827 if (ACPI_FAILURE (Status)) 828 { 829 return; 830 } 831 832 NextSubTable: 833 /* Point to next sub-table */ 834 835 Offset += SubTable->Length; 836 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length); 837 } 838 } 839 840 841 /******************************************************************************* 842 * 843 * FUNCTION: AcpiDmDumpHest 844 * 845 * PARAMETERS: Table - A HEST table 846 * 847 * RETURN: None 848 * 849 * DESCRIPTION: Format the contents of a HEST. This table type consists 850 * of an open-ended number of subtables. 851 * 852 ******************************************************************************/ 853 854 void 855 AcpiDmDumpHest ( 856 ACPI_TABLE_HEADER *Table) 857 { 858 ACPI_STATUS Status; 859 ACPI_HEST_HEADER *SubTable; 860 UINT32 Length = Table->Length; 861 UINT32 Offset = sizeof (ACPI_TABLE_HEST); 862 ACPI_DMTABLE_INFO *InfoTable; 863 UINT32 SubTableLength; 864 UINT32 BankCount; 865 ACPI_HEST_IA_ERROR_BANK *BankTable; 866 867 868 /* Main table */ 869 870 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest); 871 if (ACPI_FAILURE (Status)) 872 { 873 return; 874 } 875 876 /* Sub-tables */ 877 878 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); 879 while (Offset < Table->Length) 880 { 881 BankCount = 0; 882 switch (SubTable->Type) 883 { 884 case ACPI_HEST_TYPE_IA32_CHECK: 885 InfoTable = AcpiDmTableInfoHest0; 886 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); 887 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 888 SubTable))->NumHardwareBanks; 889 break; 890 891 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 892 InfoTable = AcpiDmTableInfoHest1; 893 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); 894 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 895 SubTable))->NumHardwareBanks; 896 break; 897 898 case ACPI_HEST_TYPE_IA32_NMI: 899 InfoTable = AcpiDmTableInfoHest2; 900 SubTableLength = sizeof (ACPI_HEST_IA_NMI); 901 break; 902 903 case ACPI_HEST_TYPE_AER_ROOT_PORT: 904 InfoTable = AcpiDmTableInfoHest6; 905 SubTableLength = sizeof (ACPI_HEST_AER_ROOT); 906 break; 907 908 case ACPI_HEST_TYPE_AER_ENDPOINT: 909 InfoTable = AcpiDmTableInfoHest7; 910 SubTableLength = sizeof (ACPI_HEST_AER); 911 break; 912 913 case ACPI_HEST_TYPE_AER_BRIDGE: 914 InfoTable = AcpiDmTableInfoHest8; 915 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); 916 break; 917 918 case ACPI_HEST_TYPE_GENERIC_ERROR: 919 InfoTable = AcpiDmTableInfoHest9; 920 SubTableLength = sizeof (ACPI_HEST_GENERIC); 921 break; 922 923 default: 924 /* Cannot continue on unknown type - no length */ 925 926 AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type); 927 return; 928 } 929 930 AcpiOsPrintf ("\n"); 931 Status = AcpiDmDumpTable (Length, Offset, SubTable, 932 SubTableLength, InfoTable); 933 if (ACPI_FAILURE (Status)) 934 { 935 return; 936 } 937 938 /* Point to end of current subtable (each subtable above is of fixed length) */ 939 940 Offset += SubTableLength; 941 942 /* If there are any (fixed-length) Error Banks from above, dump them now */ 943 944 if (BankCount) 945 { 946 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength); 947 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); 948 949 while (BankCount) 950 { 951 AcpiOsPrintf ("\n"); 952 Status = AcpiDmDumpTable (Length, Offset, BankTable, 953 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank); 954 if (ACPI_FAILURE (Status)) 955 { 956 return; 957 } 958 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK); 959 BankTable++; 960 BankCount--; 961 } 962 } 963 964 /* Point to next sub-table */ 965 966 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength); 967 } 968 } 969 970 971 /******************************************************************************* 972 * 973 * FUNCTION: AcpiDmDumpIvrs 974 * 975 * PARAMETERS: Table - A IVRS table 976 * 977 * RETURN: None 978 * 979 * DESCRIPTION: Format the contents of a IVRS 980 * 981 ******************************************************************************/ 982 983 static UINT8 EntrySizes[] = {4,8,16,32}; 984 985 void 986 AcpiDmDumpIvrs ( 987 ACPI_TABLE_HEADER *Table) 988 { 989 ACPI_STATUS Status; 990 UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 991 UINT32 EntryOffset; 992 UINT32 EntryLength; 993 UINT32 EntryType; 994 ACPI_IVRS_DE_HEADER *DeviceEntry; 995 ACPI_IVRS_HEADER *SubTable; 996 ACPI_DMTABLE_INFO *InfoTable; 997 998 999 /* Main table */ 1000 1001 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 1002 if (ACPI_FAILURE (Status)) 1003 { 1004 return; 1005 } 1006 1007 /* Sub-tables */ 1008 1009 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 1010 while (Offset < Table->Length) 1011 { 1012 /* Common sub-table header */ 1013 1014 AcpiOsPrintf ("\n"); 1015 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1016 SubTable->Length, AcpiDmTableInfoIvrsHdr); 1017 if (ACPI_FAILURE (Status)) 1018 { 1019 return; 1020 } 1021 1022 switch (SubTable->Type) 1023 { 1024 case ACPI_IVRS_TYPE_HARDWARE: 1025 InfoTable = AcpiDmTableInfoIvrs0; 1026 break; 1027 case ACPI_IVRS_TYPE_MEMORY1: 1028 case ACPI_IVRS_TYPE_MEMORY2: 1029 case ACPI_IVRS_TYPE_MEMORY3: 1030 InfoTable = AcpiDmTableInfoIvrs1; 1031 break; 1032 default: 1033 AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n", 1034 SubTable->Type); 1035 1036 /* Attempt to continue */ 1037 1038 if (!SubTable->Length) 1039 { 1040 AcpiOsPrintf ("Invalid zero length subtable\n"); 1041 return; 1042 } 1043 goto NextSubTable; 1044 } 1045 1046 /* Dump the subtable */ 1047 1048 AcpiOsPrintf ("\n"); 1049 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1050 SubTable->Length, InfoTable); 1051 if (ACPI_FAILURE (Status)) 1052 { 1053 return; 1054 } 1055 1056 /* The hardware subtable can contain multiple device entries */ 1057 1058 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE) 1059 { 1060 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); 1061 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable, 1062 sizeof (ACPI_IVRS_HARDWARE)); 1063 1064 while (EntryOffset < (Offset + SubTable->Length)) 1065 { 1066 AcpiOsPrintf ("\n"); 1067 /* 1068 * Upper 2 bits of Type encode the length of the device entry 1069 * 1070 * 00 = 4 byte 1071 * 01 = 8 byte 1072 * 10 = 16 byte - currently no entries defined 1073 * 11 = 32 byte - currently no entries defined 1074 */ 1075 EntryType = DeviceEntry->Type; 1076 EntryLength = EntrySizes [EntryType >> 6]; 1077 1078 switch (EntryType) 1079 { 1080 /* 4-byte device entries */ 1081 1082 case ACPI_IVRS_TYPE_PAD4: 1083 case ACPI_IVRS_TYPE_ALL: 1084 case ACPI_IVRS_TYPE_SELECT: 1085 case ACPI_IVRS_TYPE_START: 1086 case ACPI_IVRS_TYPE_END: 1087 1088 InfoTable = AcpiDmTableInfoIvrs4; 1089 break; 1090 1091 /* 8-byte entries, type A */ 1092 1093 case ACPI_IVRS_TYPE_ALIAS_SELECT: 1094 case ACPI_IVRS_TYPE_ALIAS_START: 1095 1096 InfoTable = AcpiDmTableInfoIvrs8a; 1097 break; 1098 1099 /* 8-byte entries, type B */ 1100 1101 case ACPI_IVRS_TYPE_PAD8: 1102 case ACPI_IVRS_TYPE_EXT_SELECT: 1103 case ACPI_IVRS_TYPE_EXT_START: 1104 1105 InfoTable = AcpiDmTableInfoIvrs8b; 1106 break; 1107 1108 /* 8-byte entries, type C */ 1109 1110 case ACPI_IVRS_TYPE_SPECIAL: 1111 1112 InfoTable = AcpiDmTableInfoIvrs8c; 1113 break; 1114 1115 default: 1116 InfoTable = AcpiDmTableInfoIvrs4; 1117 AcpiOsPrintf ( 1118 "\n**** Unknown IVRS device entry type/length: " 1119 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 1120 EntryType, EntryLength, EntryOffset); 1121 break; 1122 } 1123 1124 /* Dump the Device Entry */ 1125 1126 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 1127 DeviceEntry, EntryLength, InfoTable); 1128 1129 EntryOffset += EntryLength; 1130 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry, 1131 EntryLength); 1132 } 1133 } 1134 1135 NextSubTable: 1136 /* Point to next sub-table */ 1137 1138 Offset += SubTable->Length; 1139 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length); 1140 } 1141 } 1142 1143 1144 /******************************************************************************* 1145 * 1146 * FUNCTION: AcpiDmDumpMadt 1147 * 1148 * PARAMETERS: Table - A MADT table 1149 * 1150 * RETURN: None 1151 * 1152 * DESCRIPTION: Format the contents of a MADT. This table type consists 1153 * of an open-ended number of subtables. 1154 * 1155 ******************************************************************************/ 1156 1157 void 1158 AcpiDmDumpMadt ( 1159 ACPI_TABLE_HEADER *Table) 1160 { 1161 ACPI_STATUS Status; 1162 ACPI_SUBTABLE_HEADER *SubTable; 1163 UINT32 Length = Table->Length; 1164 UINT32 Offset = sizeof (ACPI_TABLE_MADT); 1165 ACPI_DMTABLE_INFO *InfoTable; 1166 1167 1168 /* Main table */ 1169 1170 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 1171 if (ACPI_FAILURE (Status)) 1172 { 1173 return; 1174 } 1175 1176 /* Sub-tables */ 1177 1178 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 1179 while (Offset < Table->Length) 1180 { 1181 /* Common sub-table header */ 1182 1183 AcpiOsPrintf ("\n"); 1184 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1185 SubTable->Length, AcpiDmTableInfoMadtHdr); 1186 if (ACPI_FAILURE (Status)) 1187 { 1188 return; 1189 } 1190 1191 switch (SubTable->Type) 1192 { 1193 case ACPI_MADT_TYPE_LOCAL_APIC: 1194 InfoTable = AcpiDmTableInfoMadt0; 1195 break; 1196 case ACPI_MADT_TYPE_IO_APIC: 1197 InfoTable = AcpiDmTableInfoMadt1; 1198 break; 1199 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 1200 InfoTable = AcpiDmTableInfoMadt2; 1201 break; 1202 case ACPI_MADT_TYPE_NMI_SOURCE: 1203 InfoTable = AcpiDmTableInfoMadt3; 1204 break; 1205 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 1206 InfoTable = AcpiDmTableInfoMadt4; 1207 break; 1208 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 1209 InfoTable = AcpiDmTableInfoMadt5; 1210 break; 1211 case ACPI_MADT_TYPE_IO_SAPIC: 1212 InfoTable = AcpiDmTableInfoMadt6; 1213 break; 1214 case ACPI_MADT_TYPE_LOCAL_SAPIC: 1215 InfoTable = AcpiDmTableInfoMadt7; 1216 break; 1217 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 1218 InfoTable = AcpiDmTableInfoMadt8; 1219 break; 1220 case ACPI_MADT_TYPE_LOCAL_X2APIC: 1221 InfoTable = AcpiDmTableInfoMadt9; 1222 break; 1223 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 1224 InfoTable = AcpiDmTableInfoMadt10; 1225 break; 1226 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 1227 InfoTable = AcpiDmTableInfoMadt11; 1228 break; 1229 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 1230 InfoTable = AcpiDmTableInfoMadt12; 1231 break; 1232 default: 1233 AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type); 1234 1235 /* Attempt to continue */ 1236 1237 if (!SubTable->Length) 1238 { 1239 AcpiOsPrintf ("Invalid zero length subtable\n"); 1240 return; 1241 } 1242 goto NextSubTable; 1243 } 1244 1245 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1246 SubTable->Length, InfoTable); 1247 if (ACPI_FAILURE (Status)) 1248 { 1249 return; 1250 } 1251 1252 NextSubTable: 1253 /* Point to next sub-table */ 1254 1255 Offset += SubTable->Length; 1256 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length); 1257 } 1258 } 1259 1260 1261 /******************************************************************************* 1262 * 1263 * FUNCTION: AcpiDmDumpMcfg 1264 * 1265 * PARAMETERS: Table - A MCFG Table 1266 * 1267 * RETURN: None 1268 * 1269 * DESCRIPTION: Format the contents of a MCFG table 1270 * 1271 ******************************************************************************/ 1272 1273 void 1274 AcpiDmDumpMcfg ( 1275 ACPI_TABLE_HEADER *Table) 1276 { 1277 ACPI_STATUS Status; 1278 UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 1279 ACPI_MCFG_ALLOCATION *SubTable; 1280 1281 1282 /* Main table */ 1283 1284 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 1285 if (ACPI_FAILURE (Status)) 1286 { 1287 return; 1288 } 1289 1290 /* Sub-tables */ 1291 1292 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 1293 while (Offset < Table->Length) 1294 { 1295 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 1296 { 1297 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 1298 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 1299 return; 1300 } 1301 1302 AcpiOsPrintf ("\n"); 1303 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1304 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 1305 if (ACPI_FAILURE (Status)) 1306 { 1307 return; 1308 } 1309 1310 /* Point to next sub-table (each subtable is of fixed length) */ 1311 1312 Offset += sizeof (ACPI_MCFG_ALLOCATION); 1313 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable, 1314 sizeof (ACPI_MCFG_ALLOCATION)); 1315 } 1316 } 1317 1318 1319 /******************************************************************************* 1320 * 1321 * FUNCTION: AcpiDmDumpMpst 1322 * 1323 * PARAMETERS: Table - A MPST Table 1324 * 1325 * RETURN: None 1326 * 1327 * DESCRIPTION: Format the contents of a MPST table 1328 * 1329 ******************************************************************************/ 1330 1331 void 1332 AcpiDmDumpMpst ( 1333 ACPI_TABLE_HEADER *Table) 1334 { 1335 ACPI_STATUS Status; 1336 UINT32 Offset = sizeof (ACPI_TABLE_MPST); 1337 ACPI_MPST_POWER_NODE *SubTable0; 1338 ACPI_MPST_POWER_STATE *SubTable0A; 1339 ACPI_MPST_COMPONENT *SubTable0B; 1340 ACPI_MPST_DATA_HDR *SubTable1; 1341 ACPI_MPST_POWER_DATA *SubTable2; 1342 UINT16 SubtableCount; 1343 UINT8 PowerStateCount; 1344 UINT8 ComponentCount; 1345 1346 1347 /* Main table */ 1348 1349 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 1350 if (ACPI_FAILURE (Status)) 1351 { 1352 return; 1353 } 1354 1355 /* Subtable: Memory Power Node(s) */ 1356 1357 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 1358 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 1359 1360 while ((Offset < Table->Length) && SubtableCount) 1361 { 1362 AcpiOsPrintf ("\n"); 1363 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0, 1364 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 1365 if (ACPI_FAILURE (Status)) 1366 { 1367 return; 1368 } 1369 1370 /* Extract the sub-subtable counts */ 1371 1372 PowerStateCount = SubTable0->NumPowerStates; 1373 ComponentCount = SubTable0->NumPhysicalComponents; 1374 Offset += sizeof (ACPI_MPST_POWER_NODE); 1375 1376 /* Sub-subtables - Memory Power State Structure(s) */ 1377 1378 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0, 1379 sizeof (ACPI_MPST_POWER_NODE)); 1380 1381 while (PowerStateCount) 1382 { 1383 AcpiOsPrintf ("\n"); 1384 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A, 1385 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 1386 if (ACPI_FAILURE (Status)) 1387 { 1388 return; 1389 } 1390 1391 SubTable0A++; 1392 PowerStateCount--; 1393 Offset += sizeof (ACPI_MPST_POWER_STATE); 1394 } 1395 1396 /* Sub-subtables - Physical Component ID Structure(s) */ 1397 1398 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A); 1399 1400 if (ComponentCount) 1401 { 1402 AcpiOsPrintf ("\n"); 1403 } 1404 1405 while (ComponentCount) 1406 { 1407 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B, 1408 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 1409 if (ACPI_FAILURE (Status)) 1410 { 1411 return; 1412 } 1413 1414 SubTable0B++; 1415 ComponentCount--; 1416 Offset += sizeof (ACPI_MPST_COMPONENT); 1417 } 1418 1419 /* Point to next Memory Power Node subtable */ 1420 1421 SubtableCount--; 1422 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0, 1423 sizeof (ACPI_MPST_POWER_NODE) + 1424 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) + 1425 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents)); 1426 } 1427 1428 /* Subtable: Count of Memory Power State Characteristic structures */ 1429 1430 AcpiOsPrintf ("\n"); 1431 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0); 1432 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1, 1433 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 1434 if (ACPI_FAILURE (Status)) 1435 { 1436 return; 1437 } 1438 1439 SubtableCount = SubTable1->CharacteristicsCount; 1440 Offset += sizeof (ACPI_MPST_DATA_HDR); 1441 1442 /* Subtable: Memory Power State Characteristics structure(s) */ 1443 1444 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR)); 1445 1446 while ((Offset < Table->Length) && SubtableCount) 1447 { 1448 AcpiOsPrintf ("\n"); 1449 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2, 1450 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 1451 if (ACPI_FAILURE (Status)) 1452 { 1453 return; 1454 } 1455 1456 SubTable2++; 1457 SubtableCount--; 1458 Offset += sizeof (ACPI_MPST_POWER_DATA); 1459 } 1460 } 1461 1462 1463 /******************************************************************************* 1464 * 1465 * FUNCTION: AcpiDmDumpMsct 1466 * 1467 * PARAMETERS: Table - A MSCT table 1468 * 1469 * RETURN: None 1470 * 1471 * DESCRIPTION: Format the contents of a MSCT 1472 * 1473 ******************************************************************************/ 1474 1475 void 1476 AcpiDmDumpMsct ( 1477 ACPI_TABLE_HEADER *Table) 1478 { 1479 ACPI_STATUS Status; 1480 UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 1481 ACPI_MSCT_PROXIMITY *SubTable; 1482 1483 1484 /* Main table */ 1485 1486 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 1487 if (ACPI_FAILURE (Status)) 1488 { 1489 return; 1490 } 1491 1492 /* Sub-tables */ 1493 1494 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 1495 while (Offset < Table->Length) 1496 { 1497 /* Common sub-table header */ 1498 1499 AcpiOsPrintf ("\n"); 1500 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1501 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 1502 if (ACPI_FAILURE (Status)) 1503 { 1504 return; 1505 } 1506 1507 /* Point to next sub-table */ 1508 1509 Offset += sizeof (ACPI_MSCT_PROXIMITY); 1510 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY)); 1511 } 1512 } 1513 1514 1515 /******************************************************************************* 1516 * 1517 * FUNCTION: AcpiDmDumpPcct 1518 * 1519 * PARAMETERS: Table - A PCCT table 1520 * 1521 * RETURN: None 1522 * 1523 * DESCRIPTION: Format the contents of a PCCT. This table type consists 1524 * of an open-ended number of subtables. 1525 * 1526 ******************************************************************************/ 1527 1528 void 1529 AcpiDmDumpPcct ( 1530 ACPI_TABLE_HEADER *Table) 1531 { 1532 ACPI_STATUS Status; 1533 ACPI_PCCT_SUBSPACE *SubTable; 1534 UINT32 Length = Table->Length; 1535 UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 1536 1537 1538 /* Main table */ 1539 1540 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 1541 if (ACPI_FAILURE (Status)) 1542 { 1543 return; 1544 } 1545 1546 /* Sub-tables */ 1547 1548 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 1549 while (Offset < Table->Length) 1550 { 1551 AcpiOsPrintf ("\n"); 1552 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1553 SubTable->Header.Length, AcpiDmTableInfoPcct0); 1554 if (ACPI_FAILURE (Status)) 1555 { 1556 return; 1557 } 1558 1559 /* Point to next sub-table */ 1560 1561 Offset += SubTable->Header.Length; 1562 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable, 1563 SubTable->Header.Length); 1564 } 1565 } 1566 1567 1568 /******************************************************************************* 1569 * 1570 * FUNCTION: AcpiDmDumpPmtt 1571 * 1572 * PARAMETERS: Table - A PMTT table 1573 * 1574 * RETURN: None 1575 * 1576 * DESCRIPTION: Format the contents of a PMTT. This table type consists 1577 * of an open-ended number of subtables. 1578 * 1579 ******************************************************************************/ 1580 1581 void 1582 AcpiDmDumpPmtt ( 1583 ACPI_TABLE_HEADER *Table) 1584 { 1585 ACPI_STATUS Status; 1586 ACPI_PMTT_HEADER *SubTable; 1587 ACPI_PMTT_HEADER *MemSubTable; 1588 ACPI_PMTT_HEADER *DimmSubTable; 1589 ACPI_PMTT_DOMAIN *DomainArray; 1590 UINT32 Length = Table->Length; 1591 UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 1592 UINT32 MemOffset; 1593 UINT32 DimmOffset; 1594 UINT32 DomainOffset; 1595 UINT32 DomainCount; 1596 1597 1598 /* Main table */ 1599 1600 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 1601 if (ACPI_FAILURE (Status)) 1602 { 1603 return; 1604 } 1605 1606 /* Subtables */ 1607 1608 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 1609 while (Offset < Table->Length) 1610 { 1611 /* Common subtable header */ 1612 1613 AcpiOsPrintf ("\n"); 1614 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1615 SubTable->Length, AcpiDmTableInfoPmttHdr); 1616 if (ACPI_FAILURE (Status)) 1617 { 1618 return; 1619 } 1620 1621 /* Only Socket subtables are expected at this level */ 1622 1623 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET) 1624 { 1625 AcpiOsPrintf ( 1626 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1627 SubTable->Type); 1628 return; 1629 } 1630 1631 /* Dump the fixed-length portion of the subtable */ 1632 1633 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1634 SubTable->Length, AcpiDmTableInfoPmtt0); 1635 if (ACPI_FAILURE (Status)) 1636 { 1637 return; 1638 } 1639 1640 /* Walk the memory controller subtables */ 1641 1642 MemOffset = sizeof (ACPI_PMTT_SOCKET); 1643 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable, 1644 sizeof (ACPI_PMTT_SOCKET)); 1645 1646 while (((Offset + MemOffset) < Table->Length) && 1647 (MemOffset < SubTable->Length)) 1648 { 1649 /* Common subtable header */ 1650 1651 AcpiOsPrintf ("\n"); 1652 Status = AcpiDmDumpTable (Length, 1653 Offset + MemOffset, MemSubTable, 1654 MemSubTable->Length, AcpiDmTableInfoPmttHdr); 1655 if (ACPI_FAILURE (Status)) 1656 { 1657 return; 1658 } 1659 1660 /* Only memory controller subtables are expected at this level */ 1661 1662 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER) 1663 { 1664 AcpiOsPrintf ( 1665 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1666 MemSubTable->Type); 1667 return; 1668 } 1669 1670 /* Dump the fixed-length portion of the controller subtable */ 1671 1672 Status = AcpiDmDumpTable (Length, 1673 Offset + MemOffset, MemSubTable, 1674 MemSubTable->Length, AcpiDmTableInfoPmtt1); 1675 if (ACPI_FAILURE (Status)) 1676 { 1677 return; 1678 } 1679 1680 /* Walk the variable count of proximity domains */ 1681 1682 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount; 1683 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); 1684 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable, 1685 sizeof (ACPI_PMTT_CONTROLLER)); 1686 1687 while (((Offset + MemOffset + DomainOffset) < Table->Length) && 1688 ((MemOffset + DomainOffset) < SubTable->Length) && 1689 DomainCount) 1690 { 1691 Status = AcpiDmDumpTable (Length, 1692 Offset + MemOffset + DomainOffset, DomainArray, 1693 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a); 1694 if (ACPI_FAILURE (Status)) 1695 { 1696 return; 1697 } 1698 1699 DomainOffset += sizeof (ACPI_PMTT_DOMAIN); 1700 DomainArray++; 1701 DomainCount--; 1702 } 1703 1704 if (DomainCount) 1705 { 1706 AcpiOsPrintf ( 1707 "\n**** DomainCount exceeds subtable length\n\n", 1708 MemSubTable->Type); 1709 } 1710 1711 /* Walk the physical component (DIMM) subtables */ 1712 1713 DimmOffset = DomainOffset; 1714 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable, 1715 DomainOffset); 1716 1717 while (((Offset + MemOffset + DimmOffset) < Table->Length) && 1718 (DimmOffset < MemSubTable->Length)) 1719 { 1720 /* Common subtable header */ 1721 1722 AcpiOsPrintf ("\n"); 1723 Status = AcpiDmDumpTable (Length, 1724 Offset + MemOffset + DimmOffset, DimmSubTable, 1725 DimmSubTable->Length, AcpiDmTableInfoPmttHdr); 1726 if (ACPI_FAILURE (Status)) 1727 { 1728 return; 1729 } 1730 1731 /* Only DIMM subtables are expected at this level */ 1732 1733 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM) 1734 { 1735 AcpiOsPrintf ( 1736 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 1737 DimmSubTable->Type); 1738 return; 1739 } 1740 1741 /* Dump the fixed-length DIMM subtable */ 1742 1743 Status = AcpiDmDumpTable (Length, 1744 Offset + MemOffset + DimmOffset, DimmSubTable, 1745 DimmSubTable->Length, AcpiDmTableInfoPmtt2); 1746 if (ACPI_FAILURE (Status)) 1747 { 1748 return; 1749 } 1750 1751 /* Point to next DIMM subtable */ 1752 1753 DimmOffset += DimmSubTable->Length; 1754 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 1755 DimmSubTable, DimmSubTable->Length); 1756 } 1757 1758 /* Point to next Controller subtable */ 1759 1760 MemOffset += MemSubTable->Length; 1761 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 1762 MemSubTable, MemSubTable->Length); 1763 } 1764 1765 /* Point to next Socket subtable */ 1766 1767 Offset += SubTable->Length; 1768 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 1769 SubTable, SubTable->Length); 1770 } 1771 } 1772 1773 1774 /******************************************************************************* 1775 * 1776 * FUNCTION: AcpiDmDumpS3pt 1777 * 1778 * PARAMETERS: Table - A S3PT table 1779 * 1780 * RETURN: Length of the table 1781 * 1782 * DESCRIPTION: Format the contents of a S3PT 1783 * 1784 ******************************************************************************/ 1785 1786 UINT32 1787 AcpiDmDumpS3pt ( 1788 ACPI_TABLE_HEADER *Tables) 1789 { 1790 ACPI_STATUS Status; 1791 UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 1792 ACPI_S3PT_HEADER *SubTable; 1793 ACPI_DMTABLE_INFO *InfoTable; 1794 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 1795 1796 1797 /* Main table */ 1798 1799 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 1800 if (ACPI_FAILURE (Status)) 1801 { 1802 return 0; 1803 } 1804 1805 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset); 1806 while (Offset < S3ptTable->Length) 1807 { 1808 /* Common sub-table header */ 1809 1810 AcpiOsPrintf ("\n"); 1811 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 1812 SubTable->Length, AcpiDmTableInfoS3ptHdr); 1813 if (ACPI_FAILURE (Status)) 1814 { 1815 return 0; 1816 } 1817 1818 switch (SubTable->Type) 1819 { 1820 case ACPI_S3PT_TYPE_RESUME: 1821 InfoTable = AcpiDmTableInfoS3pt0; 1822 break; 1823 case ACPI_S3PT_TYPE_SUSPEND: 1824 InfoTable = AcpiDmTableInfoS3pt1; 1825 break; 1826 default: 1827 AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type); 1828 1829 /* Attempt to continue */ 1830 1831 if (!SubTable->Length) 1832 { 1833 AcpiOsPrintf ("Invalid zero length subtable\n"); 1834 return 0; 1835 } 1836 goto NextSubTable; 1837 } 1838 1839 AcpiOsPrintf ("\n"); 1840 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 1841 SubTable->Length, InfoTable); 1842 if (ACPI_FAILURE (Status)) 1843 { 1844 return 0; 1845 } 1846 1847 NextSubTable: 1848 /* Point to next sub-table */ 1849 1850 Offset += SubTable->Length; 1851 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length); 1852 } 1853 1854 return (S3ptTable->Length); 1855 } 1856 1857 1858 /******************************************************************************* 1859 * 1860 * FUNCTION: AcpiDmDumpSlic 1861 * 1862 * PARAMETERS: Table - A SLIC table 1863 * 1864 * RETURN: None 1865 * 1866 * DESCRIPTION: Format the contents of a SLIC 1867 * 1868 ******************************************************************************/ 1869 1870 void 1871 AcpiDmDumpSlic ( 1872 ACPI_TABLE_HEADER *Table) 1873 { 1874 ACPI_STATUS Status; 1875 UINT32 Offset = sizeof (ACPI_TABLE_SLIC); 1876 ACPI_SLIC_HEADER *SubTable; 1877 ACPI_DMTABLE_INFO *InfoTable; 1878 1879 1880 /* There is no main SLIC table, only subtables */ 1881 1882 SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset); 1883 while (Offset < Table->Length) 1884 { 1885 /* Common sub-table header */ 1886 1887 AcpiOsPrintf ("\n"); 1888 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1889 SubTable->Length, AcpiDmTableInfoSlicHdr); 1890 if (ACPI_FAILURE (Status)) 1891 { 1892 return; 1893 } 1894 1895 switch (SubTable->Type) 1896 { 1897 case ACPI_SLIC_TYPE_PUBLIC_KEY: 1898 InfoTable = AcpiDmTableInfoSlic0; 1899 break; 1900 case ACPI_SLIC_TYPE_WINDOWS_MARKER: 1901 InfoTable = AcpiDmTableInfoSlic1; 1902 break; 1903 default: 1904 AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type); 1905 1906 /* Attempt to continue */ 1907 1908 if (!SubTable->Length) 1909 { 1910 AcpiOsPrintf ("Invalid zero length subtable\n"); 1911 return; 1912 } 1913 goto NextSubTable; 1914 } 1915 1916 AcpiOsPrintf ("\n"); 1917 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1918 SubTable->Length, InfoTable); 1919 if (ACPI_FAILURE (Status)) 1920 { 1921 return; 1922 } 1923 1924 NextSubTable: 1925 /* Point to next sub-table */ 1926 1927 Offset += SubTable->Length; 1928 SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length); 1929 } 1930 } 1931 1932 1933 /******************************************************************************* 1934 * 1935 * FUNCTION: AcpiDmDumpSlit 1936 * 1937 * PARAMETERS: Table - An SLIT 1938 * 1939 * RETURN: None 1940 * 1941 * DESCRIPTION: Format the contents of a SLIT 1942 * 1943 ******************************************************************************/ 1944 1945 void 1946 AcpiDmDumpSlit ( 1947 ACPI_TABLE_HEADER *Table) 1948 { 1949 ACPI_STATUS Status; 1950 UINT32 Offset; 1951 UINT8 *Row; 1952 UINT32 Localities; 1953 UINT32 i; 1954 UINT32 j; 1955 1956 1957 /* Main table */ 1958 1959 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); 1960 if (ACPI_FAILURE (Status)) 1961 { 1962 return; 1963 } 1964 1965 /* Display the Locality NxN Matrix */ 1966 1967 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; 1968 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); 1969 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; 1970 1971 for (i = 0; i < Localities; i++) 1972 { 1973 /* Display one row of the matrix */ 1974 1975 AcpiDmLineHeader2 (Offset, Localities, "Locality", i); 1976 for (j = 0; j < Localities; j++) 1977 { 1978 /* Check for beyond EOT */ 1979 1980 if (Offset >= Table->Length) 1981 { 1982 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n"); 1983 return; 1984 } 1985 1986 AcpiOsPrintf ("%2.2X", Row[j]); 1987 Offset++; 1988 1989 /* Display up to 16 bytes per output row */ 1990 1991 if ((j+1) < Localities) 1992 { 1993 AcpiOsPrintf (" "); 1994 1995 if (j && (((j+1) % 16) == 0)) 1996 { 1997 AcpiOsPrintf ("\\\n"); /* With line continuation char */ 1998 AcpiDmLineHeader (Offset, 0, NULL); 1999 } 2000 } 2001 } 2002 2003 /* Point to next row */ 2004 2005 AcpiOsPrintf ("\n"); 2006 Row += Localities; 2007 } 2008 } 2009 2010 2011 /******************************************************************************* 2012 * 2013 * FUNCTION: AcpiDmDumpSrat 2014 * 2015 * PARAMETERS: Table - A SRAT table 2016 * 2017 * RETURN: None 2018 * 2019 * DESCRIPTION: Format the contents of a SRAT 2020 * 2021 ******************************************************************************/ 2022 2023 void 2024 AcpiDmDumpSrat ( 2025 ACPI_TABLE_HEADER *Table) 2026 { 2027 ACPI_STATUS Status; 2028 UINT32 Offset = sizeof (ACPI_TABLE_SRAT); 2029 ACPI_SUBTABLE_HEADER *SubTable; 2030 ACPI_DMTABLE_INFO *InfoTable; 2031 2032 2033 /* Main table */ 2034 2035 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); 2036 if (ACPI_FAILURE (Status)) 2037 { 2038 return; 2039 } 2040 2041 /* Sub-tables */ 2042 2043 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 2044 while (Offset < Table->Length) 2045 { 2046 /* Common sub-table header */ 2047 2048 AcpiOsPrintf ("\n"); 2049 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2050 SubTable->Length, AcpiDmTableInfoSratHdr); 2051 if (ACPI_FAILURE (Status)) 2052 { 2053 return; 2054 } 2055 2056 switch (SubTable->Type) 2057 { 2058 case ACPI_SRAT_TYPE_CPU_AFFINITY: 2059 InfoTable = AcpiDmTableInfoSrat0; 2060 break; 2061 case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 2062 InfoTable = AcpiDmTableInfoSrat1; 2063 break; 2064 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 2065 InfoTable = AcpiDmTableInfoSrat2; 2066 break; 2067 default: 2068 AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type); 2069 2070 /* Attempt to continue */ 2071 2072 if (!SubTable->Length) 2073 { 2074 AcpiOsPrintf ("Invalid zero length subtable\n"); 2075 return; 2076 } 2077 goto NextSubTable; 2078 } 2079 2080 AcpiOsPrintf ("\n"); 2081 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2082 SubTable->Length, InfoTable); 2083 if (ACPI_FAILURE (Status)) 2084 { 2085 return; 2086 } 2087 2088 NextSubTable: 2089 /* Point to next sub-table */ 2090 2091 Offset += SubTable->Length; 2092 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length); 2093 } 2094 } 2095 2096 2097 /******************************************************************************* 2098 * 2099 * FUNCTION: AcpiDmDumpWdat 2100 * 2101 * PARAMETERS: Table - A WDAT table 2102 * 2103 * RETURN: None 2104 * 2105 * DESCRIPTION: Format the contents of a WDAT 2106 * 2107 ******************************************************************************/ 2108 2109 void 2110 AcpiDmDumpWdat ( 2111 ACPI_TABLE_HEADER *Table) 2112 { 2113 ACPI_STATUS Status; 2114 UINT32 Offset = sizeof (ACPI_TABLE_WDAT); 2115 ACPI_WDAT_ENTRY *SubTable; 2116 2117 2118 /* Main table */ 2119 2120 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); 2121 if (ACPI_FAILURE (Status)) 2122 { 2123 return; 2124 } 2125 2126 /* Sub-tables */ 2127 2128 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); 2129 while (Offset < Table->Length) 2130 { 2131 /* Common sub-table header */ 2132 2133 AcpiOsPrintf ("\n"); 2134 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2135 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); 2136 if (ACPI_FAILURE (Status)) 2137 { 2138 return; 2139 } 2140 2141 /* Point to next sub-table */ 2142 2143 Offset += sizeof (ACPI_WDAT_ENTRY); 2144 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY)); 2145 } 2146 } 2147